Spec-Zone.ru › Node.js 14 LTS

Интерфейс системы WebAssembly (WASI)

Уровень стабильности: 1 - Экспериментальный

Исходный код: lib/wasi.js

API WASI предоставляет реализацию спецификации Интерфейса системы WebAssembly. WASI предоставляет доступ к операционной системе для изолированных приложений WebAssembly через набор функций, похожих на POSIX.

import fs from 'fs';
import { WASI } from 'wasi';

const wasi = new WASI({
  args: process.argv,
  env: process.env,
  preopens: {
    '/sandbox': '/some/real/path/that/wasm/can/access'
  }
});
const importObject = { wasi_snapshot_preview1: wasi.wasiImport };

const wasm = await WebAssembly.compile(fs.readFileSync('./demo.wasm'));
const instance = await WebAssembly.instantiate(wasm, importObject);

wasi.start(instance);

Для запуска приведенного выше примера создайте новый файл в формате текста WebAssembly с именем demo.wat:

(module
    ;; Import the required fd_write WASI function which will write the given io vectors to stdout
    ;; The function signature for fd_write is:
    ;; (File Descriptor, *iovs, iovs_len, nwritten) -> Returns number of bytes written
    (import "wasi_snapshot_preview1" "fd_write" (func $fd_write (param i32 i32 i32 i32) (result i32)))

    (memory 1)
    (export "memory" (memory 0))

    ;; Write 'hello world\n' to memory at an offset of 8 bytes
    ;; Note the trailing newline which is required for the text to appear
    (data (i32.const 8) "hello world\n")

    (func $main (export "_start")
        ;; Creating a new io vector within linear memory
        (i32.store (i32.const 0) (i32.const 8))  ;; iov.iov_base - This is a pointer to the start of the 'hello world\n' string
        (i32.store (i32.const 4) (i32.const 12))  ;; iov.iov_len - The length of the 'hello world\n' string

        (call $fd_write
            (i32.const 1) ;; file_descriptor - 1 for stdout
            (i32.const 0) ;; *iovs - The pointer to the iov array, which is stored at memory location 0
            (i32.const 1) ;; iovs_len - We're printing 1 string stored in an iov - so one.
            (i32.const 20) ;; nwritten - A place in memory to store the number of bytes written
        )
        drop ;; Discard the number of bytes written from the top of the stack
    )
)

Используйте wabt для компиляции .wat в .wasm

$ wat2wasm demo.wat

Для запуска этого примера необходимы параметры командной строки --experimental-wasi-unstable-preview1 и --experimental-wasm-bigint.

Класс: WASI

Добавлен в: v13.3.0, v12.16.0

Класс WASI предоставляет API вызовов системы WASI и дополнительные удобные методы для работы с приложениями на основе WASI. Каждый экземпляр WASI представляет собой отдельную среду изоляции. В целях безопасности каждый экземпляр WASI должен иметь явно сконфигурированные аргументы командной строки, переменные среды и структуру каталогов изоляции.

new WASI([options])

Добавлен в: v13.3.0, v12.16.0
  • options <Объект>
    • args <Массив> Массив строк, которые приложение WebAssembly будет видеть как аргументы командной строки. Первый аргумент — это виртуальный путь к самой команде WASI. По умолчанию: [].
    • env <Объект> Объект, аналогичный process.env, который приложение WebAssembly будет видеть как свою среду. По умолчанию: {}.
    • preopens <Объект> Этот объект представляет структуру каталогов изоляции приложения WebAssembly. Строковые ключи preopens рассматриваются как каталоги в изоляции. Соответствующие значения в preopens — это реальные пути к этим каталогам на машине-хосте.
    • returnOnExit <логическое значение> По умолчанию приложения WASI завершают процесс Node.js с помощью функции __wasi_proc_exit(). Установка этого параметра в true приводит к тому, что wasi.start() возвращает код завершения, а не завершает процесс. По умолчанию: false.
    • stdin <целое число> Дескриптор файла, используемый как стандартный ввод в приложении WebAssembly. По умолчанию: 0.
    • stdout <целое число> Дескриптор файла, используемый как стандартный вывод в приложении WebAssembly. По умолчанию: 1.
    • stderr <целое число> Дескриптор файла, используемый как стандартная ошибка в приложении WebAssembly. По умолчанию: 2.

wasi.start(instance)

Добавлен в: v13.3.0, v12.16.0
  • instance <WebAssembly.Instance>

Попытка начать выполнение instance в качестве команды WASI, вызвав его экспорт _start(). Если instance не содержит экспорт _start(), или если instance содержит экспорт _initialize(), то будет выброшено исключение.

Для start() необходимо, чтобы instance экспортировал WebAssembly.Memory с именем memory. Если instance не имеет экспорта memory, то будет выброшено исключение.

Если start() вызывается более одного раза, будет выброшено исключение.

wasi.initialize(instance)

Добавлен в: v14.6.0
  • instance <WebAssembly.Instance>

Попытка инициализировать instance как реактор WASI, вызвав его экспорт _initialize(), если он присутствует. Если instance содержит экспорт _start(), то будет выброшено исключение.

Для initialize() необходимо, чтобы instance экспортировал WebAssembly.Memory с именем memory. Если instance не имеет экспорта memory, то будет выброшено исключение.

Если initialize() вызывается более одного раза, будет выброшено исключение.

wasi.wasiImport

Добавлен в: v13.3.0, v12.16.0
  • <Объект>

wasiImport — это объект, реализующий API вызовов системы WASI. Этот объект должен быть передан как импорт wasi_snapshot_preview1 при создании экземпляра WebAssembly.Instance.

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v14.x/docs/api/wasi.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API