- assert断言
- async_hooks异步钩子
- async_hooks/context异步上下文
- buffer缓冲区
- C++插件
- C/C++插件(使用Node-API)
- C++嵌入器
- child_process子进程
- cluster集群
- CLI命令行
- console控制台
- Corepack核心包
- crypto加密
- crypto/webcrypto网络加密
- debugger调试器
- deprecation弃用
- dgram数据报
- diagnostics_channel诊断通道
- dns域名服务器
- domain域
- Error错误
- events事件触发器
- fs文件系统
- global全局变量
- http超文本传输协议
- http2超文本传输协议2.0
- https安全超文本传输协议
- inspector检查器
- Intl国际化
- module模块
- module/cjsCommonJS模块
- module/esmECMAScript模块
- module/package包模块
- net网络
- os操作系统
- path路径
- perf_hooks性能钩子
- policy安全策略
- process进程
- punycode域名代码
- querystring查询字符串
- readline逐行读取
- repl交互式解释器
- report诊断报告
- stream流
- stream/web网络流
- string_decoder字符串解码器
- test测试
- timers定时器
- tls安全传输层
- trace_events跟踪事件
- tty终端
- url网址
- util实用工具
- v8引擎
- vm虚拟机
- wasi网络汇编系统接口
- worker_threads工作线程
- zlib压缩
Node.js v18.6.0 文档
- Node.js 18.6.0
- ► 目录
-
►
索引
- assert 断言
- async_hooks 异步钩子
- async_hooks/context 异步上下文
- buffer 缓冲区
- C++插件
- C/C++插件(使用Node-API)
- C++嵌入器
- child_process 子进程
- cluster 集群
- CLI 命令行
- console 控制台
- Corepack 核心包
- crypto 加密
- crypto/webcrypto 网络加密
- debugger 调试器
- deprecation 弃用
- dgram 数据报
- diagnostics_channel 诊断通道
- dns 域名服务器
- domain 域
- Error 错误
- events 事件触发器
- fs 文件系统
- global 全局变量
- http 超文本传输协议
- http2 超文本传输协议2.0
- https 安全超文本传输协议
- inspector 检查器
- Intl 国际化
- module 模块
- module/cjs CommonJS模块
- module/esm ECMAScript模块
- module/package 包模块
- net 网络
- os 操作系统
- path 路径
- perf_hooks 性能钩子
- policy 安全策略
- process 进程
- punycode 域名代码
- querystring 查询字符串
- readline 逐行读取
- repl 交互式解释器
- report 诊断报告
- stream 流
- stream/web 网络流
- string_decoder 字符串解码器
- test 测试
- timers 定时器
- tls 安全传输层
- trace_events 跟踪事件
- tty 终端
- url 网址
- util 实用工具
- v8 引擎
- vm 虚拟机
- wasi 网络汇编系统接口
- worker_threads 工作线程
- zlib 压缩
- ► 其他版本
- 搜索
目录
wasi 网络汇编系统接口#
源代码: lib/wasi.js
WASI API 提供了 WebAssembly 系统接口规范的实现。 WASI 让沙盒化的 WebAssembly 应用程序通过一系列类似 POSIX 的函数访问底层操作系统。
import { readFile } from 'node:fs/promises';
import { WASI } from 'wasi';
import { argv, env } from 'node:process';
const wasi = new WASI({
args: argv,
env,
preopens: {
'/sandbox': '/some/real/path/that/wasm/can/access'
}
});
// 一些 WASI 二进制文件需要:
// const importObject = { wasi_unstable: wasi.wasiImport };
const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
const wasm = await WebAssembly.compile(
await readFile(new URL('./demo.wasm', import.meta.url))
);
const instance = await WebAssembly.instantiate(wasm, importObject);
wasi.start(instance);
'use strict';
const { readFile } = require('node:fs/promises');
const { WASI } = require('wasi');
const { argv, env } = require('node:process');
const { join } = require('node:path');
const wasi = new WASI({
args: argv,
env,
preopens: {
'/sandbox': '/some/real/path/that/wasm/can/access'
}
});
// 一些 WASI 二进制文件需要:
// const importObject = { wasi_unstable: wasi.wasiImport };
const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
(async () => {
const wasm = await WebAssembly.compile(
await readFile(join(__dirname, 'demo.wasm'))
);
const instance = await WebAssembly.instantiate(wasm, importObject);
wasi.start(instance);
})();
要运行上面的示例,则新建一个名为 demo.wat
的 WebAssembly 文本格式文件:
(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
CLI 参数。
WASI
类#
WASI
类提供了 WASI 系统调用 API 和其他方便的方法来使用基于 WASI 的应用程序。
每个 WASI
实例代表一个不同的沙箱环境。
出于安全考虑,每个 WASI
实例都必须显式地配置其命令行参数、环境变量、以及沙箱目录结构。
new WASI([options])
#
options
<Object>args
<Array> WebAssembly 应用程序将视为命令行参数的字符串数组。 第一个参数是 WASI 命令本身的虚拟路径。 默认值:[]
。env
<Object> 类似于process.env
的对象,WebAssembly 应用程序将其视为其环境。 默认值:{}
。preopens
<Object> 此对象表示 WebAssembly 应用程序的沙箱目录结构。preopens
的字符串键被视为沙箱中的目录。preopens
中对应的值是宿主机上这些目录的真实路径。returnOnExit
<boolean> 默认情况下,WASI 应用程序通过__wasi_proc_exit()
函数终止 Node.js 进程。 将此选项设置为true
会导致wasi.start()
返回退出代码而不是终止进程。 默认值:false
。stdin
<integer> 在 WebAssembly 应用程序中用作标准输入的文件描述符。 默认值:0
。stdout
<integer> 在 WebAssembly 应用程序中用作标准输出的文件描述符。 默认值:1
。stderr
<integer> 在 WebAssembly 应用程序中用作标准错误的文件描述符。 默认值:2
。
wasi.start(instance)
#
instance
<WebAssembly.Instance>
尝试通过调用 _start()
导出来开始执行 instance
作为 WASI 命令。
如果 instance
不包含 _start()
导出,或者 instance
包含 _initialize()
导出,则抛出异常。
start()
要求 instance
导出名为 memory
的 WebAssembly.Memory
。
如果 instance
没有 memory
导出,则抛出异常。
如果 start()
被多次调用,则抛出异常。
wasi.initialize(instance)
#
instance
<WebAssembly.Instance>
尝试通过调用 _initialize()
导出(如果存在)将 instance
初始化为 WASI 反应器。
如果 instance
包含 _start()
导出,则抛出异常。
initialize()
要求 instance
导出名为 memory
的 WebAssembly.Memory
。
如果 instance
没有 memory
导出,则抛出异常。
如果 initialize()
被多次调用,则抛出异常。
wasi.wasiImport
#
wasiImport
是实现 WASI 系统调用 API 的对象。
此对象应在 WebAssembly.Instance
实例化期间作为 wasi_snapshot_preview1
导入传入。