返回

文章详情

WASI 0.3.0 发布

Hacker News2026年6月12日 13:51

WASI 0.3.0 已正式发布,异步现在是 WebAssembly 组件的原生支持。WASI 小组投票批准了 WASI 0.3.0,并将 WASI 基于 WebAssembly 组件模型的异步原语进行重构。0.3 接口中的大多数更改完全是机械性的。WASI 0.2 为了使异步能够工作进行了各种操作,但现在因为异步是组件模型的原生支持,我们可以像之前一样编写相同的内容,只是更加人性化。这是我们在 WASI 0.2 中使用 wasi:io 包编码的模式概览,以及这些模式在 0.3 中的样子,结合了组件模型的异步: WASI 0.2 (wasi:io) 资源 pollable future<T> 输入流 resource input-stream stream<u8> 输出流 resource output-stream stream<u8> (写入方向) poll(list<pollable>) 等待 future 上 (运行时处理) subscribe() 在资源上 从调用返回 future<...> start-foo / finish-foo foo: 异步函数(...) wasi:cli 结构上,这些文件是相同的 (stdin.wit, stdout.wit, stderr.wit, run.wit, exit.wit, terminal.wit, environment.wit)。有趣的变化是 stdio。 // WASI 0.2 接口 interface stdin { use wasi: io / streams. { input-stream }; get-stdin: func () -> input-stream; } interface stdout { use wasi: io / streams. { output-stream }; get-stdout: func () -> output-stream; } // WASI 0.3 接口 interface stdin { use types. { error-code }; read-via-stream: func () -> tuple < stream < u8 >, future < result < _, error-code >>>; } interface stdout { use types. { error-code }; write-via-stream: func ( data : stream < u8 >) -> future < result < _, error-code >>; } 注意 stdout 的方向翻转。在 WASI 0.2 中,你将获得一个输出流,可以以命令式的方式将数据写入。但在 WASI 0.3 中,你需要传入一个 stream<u8>,并在写入完成时返回一个 future。一个小的新 wasi:cli/types 接口包含一个共享的 error-code 变体 (io, illegal-byte-sequence, pipe)。 wasi:sockets 网络资源已消失。WASI 0.2 将网络访问建模为一个能力资源,通过每个 bind/connect/lookup 调用线程化。WASI 0.3 完全移除了它;网络访问通过世界导入授予。每对开始/结束变成了一个异步函数。在进行中的中间状态 (bind-in-progress, connect-in-progress, listen-in-progress) 和驱动它们的 subscribe() -> pollable 已被清除: // WASI 0.2 start-bind: func(network: borrow<network>, local: ip-socket-address) -> result<_, error-code>; finish-bind: func() -> result<_, error-code>; start-connect: func(network: borrow<network>, remote: ip-socket-address) -> result<_, error-code>; finish-connect: func() -> result<tuple<input-stream, output-stream>, error-code>; // WASI 0.3 bind: async func(local-address: ip-socket-address) -> result<_, error-code>; connect: async func(remote-address: ip-socket-address) -> result<_, error-code>; listen: async func() -> result<_, error-code>; accept: async func() -> result<tuple<tcp-socket, ip-socket-address>, error-code>; 注意 WASI 0.2 的 finish-connect 在线返回 TCP 流对。在 WASI 0.3 中,connect 不返回什么特别的内容;字节 I/O 依托于套接字资源自己的流方法。UDP 也得到了相同的处理。传入/传出的数据报流资源已消失,取而代之的是普通的异步发送和异步接收。跨 TCP、UDP 和名称查找的错误代码被统一为单一的 error-code 变体,新增一个连接中断的案例和一个开放式的其他(option<string>)尾部。 wasi:http — 统一请求/响应和处理程序 这是发布中最明显的重组。资源从 8 个压缩到 2 个。WASI 0.2 为传入/传出的 × 请求/响应/主体空间建立了一个完整的资源矩阵,加上两个异步特定的:incoming-request, outgoing-request incoming-response, outgoing-response incoming-body, outgoing-body future-trailers, future-incoming-response WASI 0.3 仅拥有请求和响应,主体直接表示为 stream<u8>,而尾部则表示为 future<result<option<trailers>, error-code>>。future-incoming-response 消失了,因为现在一个普通的 future<result<response, error-code>> 完成了这个工作。处理程序是一个异步函数。WASI 0.2 的 incoming-handler 使用 response-outparam 参数来解决缺乏原生异步返回问题: // WASI 0.2 interface incoming-handler { handle : func ( request : incoming-request , response-out : response-outparam ); } // WASI 0.3 interface handler { handle : async func ( request : request ) -> result < response , error-code >; } 发出的部分与之镜像: interface client { send : async func ( request : request ) -> result < response , error-code >; } 为中间件开辟了新天地。旧的代理世界由服务取而代之,加上一个导入和导出 handler 的中间件世界。这使得请求路径中的组件获得了优先支持: world service { include wasi : clocks / imports @ 0.3.0 ; include wasi : random / imports @ 0.3.0 ; import wasi : cli /

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡