En dotant les applications WebAssembly d’une solution cohérente pour interagir avec n'importe quel système d'exploitation sur lequel elles fonctionnent, Mozilla va plus loin dans la standardisation de son navigateur. Baptisé WASI pour WebAssembly System Interface, le projet, encore au stade expérimental, fournit aux applications WebAssembly un ensemble d'abstractions pour effectuer des tâches comme la lecture et l'écriture de fichiers et les entrées/sorties de réseau. Chaque hôte WebAssembly implémente WASI pour la plate-forme sur laquelle il tourne.

Selon Mozilla, une des caractéristiques-clés de WASI, c’est qu'il est indépendant de la plate-forme. Par exemple, des langages de développement comme C disposent d’une bibliothèque standard pour s'interfacer avec le système de fichiers et la mémoire. De même, WASI peut être considéré comme une bibliothèque standard pour les abstractions multiplateformes comme les fichiers ou les sockets réseau. Une autre caractéristique remarquable de WASI, c’est que ses comportements sont placés en bac à sable. Par exemple, dans le cas de l'accès aux fichiers, Mozilla explique qu’un appel WASI pour demander l’ouverture d’un fichier ne fonctionnera que pour les répertoires dans lesquels l'application dispose d’une autorisation explicite de lecture et d’écriture. Ces permissions pourraient également être limitées par module.

Rust et C/C++ supportent WASI

Pour utiliser WASI, il est nécessaire de recompiler les WebAssembly existants pour garantir un fonctionnement correct. Mais, WebAssembly étant encore à un stade de développement expérimental, une variation de ce genre ne devrait pas avoir de conséquence gênante. Actuellement, deux des principales chaînes d'outils pour écrire des applications WebAssembly, Rust et C/C++, supportent WASI. Elles s'appuient toutes deux sur la capacité de LLVM (Low Level Virtual Machine) à générer du code WebAssembly.

Actuellement, pour exécuter des applications compatibles WASI, le support de WebAssembly inclus dans le navigateur n’est pas suffisant. Une solution consiste à utiliser un shim ou polyfill basé sur un navigateur, à la manière dont on utilise les fonctionnalités expérimentales de JavaScript. Une autre solution consiste à passer par wasmtime, un runtime WebAssembly autonome qui n'utilise pas de navigateur. Une troisième solution consiste à utiliser un autre runtime autonome dénommé Lucet, construit à l'aide du système de génération de code Cranelift de Mozilla. Mozilla espère qu’un jour tous les navigateurs supporteront WASI nativement.