Spec-Zone.ru › Deno 2

wasi

Совместимость с Deno

Все экспорты являются неработающими заглушками.

Модуль node:wasi в настоящее время не обеспечивает комплексные свойства безопасности файловой системы, предоставляемые некоторыми средами выполнения WASI. Полная поддержка безопасной изоляции файловой системы может быть реализована в будущем, а может и нет. А пока не полагайтесь на неё при выполнении недоверенного кода.

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

import { readFile } from 'node:fs/promises';
import { WASI } from 'node:wasi';
import { argv, env } from 'node:process';

const wasi = new WASI({
  version: 'preview1',
  args: argv,
  env,
  preopens: {
    '/local': '/some/real/path/that/wasm/can/access',
  },
});

const wasm = await WebAssembly.compile(
  await readFile(new URL('./demo.wasm', import.meta.url)),
);
const instance = await WebAssembly.instantiate(wasm, wasi.getImportObject());

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

Использование в Deno

import * as mod from "node:wasi";

класс WASI

Использование в Deno

import { WASI } from "node:wasi";
Совместимость с Deno

Этот символ является неработающей заглушкой.

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

Конструкторы

WASI(options?: WASIOptions)
new

Свойства

wasiImport: Dict<any>
только для чтения

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

Методы

getImportObject(): object

Возвращает объект импорта, который можно передать в WebAssembly.instantiate(), если помимо предоставляемых WASI импортов не требуется никаких других импортов WASM.

Если в конструктор была передана версия unstable, метод вернёт:

{ wasi_unstable: wasi.wasiImport }

Если в конструктор была передана версия preview1 или версия не была указана, метод вернёт:

{ wasi_snapshot_preview1: wasi.wasiImport }
initialize(instance: object): void

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

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

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

start(instance: object): number

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

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

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


интерфейс WASIOptions

Использование в Deno

import { type WASIOptions } from "node:wasi";
Совместимость с Deno

Этот символ является неработающей заглушкой.

Свойства

args: string[] | undefined
необязательный

Массив строк, которые приложение WebAssembly будет получать в качестве аргументов командной строки. Первый аргумент — виртуальный путь к самой команде WASI.

env: object | undefined
необязательный

Объект, подобный process.env, который приложение WebAssembly будет получать в качестве своего окружения.

preopens: Dict<string> | undefined
необязательный

Этот объект представляет структуру каталогов песочницы приложения WebAssembly. Строковые ключи preopens рассматриваются как каталоги внутри песочницы. Соответствующие значения в preopens — это реальные пути к этим каталогам на хост-компьютере.

returnOnExit: boolean | undefined
необязательный

По умолчанию при вызове приложениями WASI функции __wasi_proc_exit() wasi.start() возвращает указанный код завершения вместо завершения процесса. Если установить для этого параметра значение false, процесс Node.js завершится с указанным кодом завершения.

stdin: number | undefined
необязательный

Дескриптор файла, используемый в качестве стандартного ввода приложения WebAssembly.

stdout: number | undefined
необязательный

Дескриптор файла, используемый в качестве стандартного вывода приложения WebAssembly.

stderr: number | undefined
необязательный

Дескриптор файла, используемый в качестве стандартного вывода ошибок приложения WebAssembly.

version: "unstable" | "preview1"

Запрашиваемая версия WASI. В настоящее время поддерживаются только версии 'unstable' и 'preview1'. Этот параметр является обязательным.


© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/api/node/wasi

Spec-Zone.ru

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