WASI¶
Стабильность: 1 – Экспериментальная
Фича изменяется и не допускается флагом командной строки. Может быть изменена или удалена в последующих версиях.
API WASI предоставляет реализацию спецификации WebAssembly System Interface. WASI предоставляет изолированным приложениям WebAssembly доступ к базовой операционной системе через набор POSIX-подобных функций.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Чтобы выполнить описанный выше пример, создайте новый файл WebAssembly в текстовом формате с именем demo.wat
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
Используйте wabt для компиляции .wat
в .wasm
.
1 |
|
Для запуска этого примера необходим аргумент CLI --experimental-wasi-unstable-preview1
.
Класс: WASI
¶
Класс WASI
предоставляет API системных вызовов WASI и дополнительные удобные методы для работы с приложениями на базе WASI. Каждый экземпляр WASI
представляет собой отдельную среду "песочницы". В целях безопасности каждый экземпляр WASI
должен иметь свои аргументы командной строки, переменные среды и структуру каталога песочницы, настроенные явным образом.
новый WASI([опции])
¶
options
<Object>
args
<Array>
Массив строк, которые приложение WebAssembly будет воспринимать как аргументы командной строки. Первый аргумент - это виртуальный путь к самой команде WASI. По умолчанию:[]
.env
<Object>
Объект, подобныйprocess.env
, который приложение WebAssembly будет воспринимать как свое окружение. По умолчанию:{}
.preopens
<Object>
Этот объект представляет структуру каталогов "песочницы" приложения WebAssembly. Строковые ключиpreopens
рассматриваются как каталоги внутри песочницы. Соответствующие значения вpreopens
- это реальные пути к этим директориям на хост-машине.returnOnExit
<boolean>
По умолчанию приложения WASI завершают процесс Node.js с помощью функции__wasi_proc_exit()
. Установка этой опции вtrue
заставляетwasi.start()
возвращать код выхода, а не завершать процесс. По умолчанию:false
.stdin
<integer>
Дескриптор файла, используемый в качестве стандартного ввода в приложении WebAssembly. По умолчанию:0
.stdout
<integer>
Дескриптор файла, используемый в качестве стандартного вывода в приложении WebAssembly. По умолчанию:1
.stderr
<integer>
Дескриптор файла, используемый в качестве стандартной ошибки в приложении WebAssembly. По умолчанию:2
.version
<string>
Запрашиваемая версия WASI. В настоящее время поддерживаются только версииunstable
иpreview1
. По умолчанию:preview1
.
wasi.getImportObject()
¶
Возвращает объект импорта, который может быть передан в WebAssembly.instantiate()
, если не требуется никаких других импортов WASM, кроме тех, которые предоставляются WASI.
Если в конструктор была передана версия unstable
, он вернет:
1 |
|
Если в конструктор была передана версия preview1
или версия не была указана, он вернет:
1 |
|
wasi.start(instance)
¶
instance
{WebAssembly.Instance}
Попытка начать выполнение instance
как команды WASI, вызвав ее экспорт _start()
. Если instance
не содержит экспорта _start()
, или если instance
содержит экспорт _initialize()
, то возникает исключение.
start()
требует, чтобы instance
экспортировала WebAssembly.Memory
с именем memory
. Если instance
не экспортирует memory
, то возникает исключение.
Если start()
вызывается более одного раза, возникает исключение.
wasi.initialize(instance)
¶
instance
{WebAssembly.Instance}
Попытка инициализировать instance
как реактор WASI, вызывая его экспорт _initialize()
, если он присутствует. Если instance
содержит экспорт _start()
, то будет выброшено исключение.
initialize()
требует, чтобы instance
экспортировал WebAssembly.Memory
с именем memory
. Если instance
не экспортирует memory
, то возникает исключение.
Если initialize()
вызывается более одного раза, возникает исключение.
wasi.wasiImport
¶
wasiImport
- это объект, реализующий API системных вызовов WASI. Этот объект должен быть передан как импорт wasi_snapshot_preview1
во время инстанцирования WebAssembly.Instance
.