114个版本 (65个稳定版)
| 新 24.0.0 | 2024年8月20日 |
|---|---|
| 23.0.2 | 2024年8月12日 |
| 23.0.1 | 2024年7月22日 |
| 22.0.0 | 2024年6月20日 |
| 0.8.0 | 2019年11月20日 |
827 在 WebAssembly
75,144 每月下载量
在 154 个Crate中(70个直接) 使用
3MB
50K SLoC
Crate定义了Wasmtime中的Wasi类型,代表可以添加到链接器的WASI实例。
lib.rs:
Wasmtime的WASI实现
此Crate提供Wasmtime对WASI 0.2(即WASIp2,即预览2)和WASI 0.1(即WASIp1,即预览1)的主机实现。WASI主要由Rust crates tokio 和 cap-std 实现,这意味着默认情况下操作以它们的本地平台等效物实现。
有关组件和WASIp2,请继续阅读以下内容。有关WASIp1和核心模块,请参阅preview1模块文档。
WASIp2接口
此Crate包含以下接口的实现
wasi:cli/环境wasi:cli/退出wasi:cli/stderrwasi:cli/stdinwasi:cli/stdoutwasi:cli/终端-输入wasi:cli/终端-输出wasi:cli/终端-stderrwasi:cli/终端-stdinwasi:cli/终端-stdoutwasi:时钟/单调-时钟wasi:时钟/墙-时钟wasi:文件系统/预打开wasi:文件系统/类型wasi:io/错误wasi:io/轮询wasi:io/流wasi:随机/不安全-种子wasi:随机/不安全wasi:随机/随机wasi:套接字/实例-网络wasi:套接字/ip-名称-查找wasi:套接字/网络wasi:套接字/tcp-创建-套接字wasi:套接字/tcpwasi:套接字/udp-创建-套接字wasi:套接字/udp
所有特性都是通过一个WasiView trait实现的,该trait提供了对WasiCtx、WASI配置和ResourceTable(所有主机定义组件模型资源的状态)的基本访问。
生成的绑定
此crate使用wasmtime::component::bindgen!来生成所有WASI接口的绑定。原始绑定可以在该crate的bindings模块中找到。下游用户可以自行实现这些特性,或者可以使用该crate内置的WasiImpl<T: WasiView>实现。
WasiView trait
此crate对WASI的实现是通过实现WasiView来完成的。此trait提供了对包含在Store<T>中的WASI相关状态的“视图”。所有特性的实现看起来都像
impl<T: WasiView> bindings::wasi::Host for WasiImpl<T> {
// ...
}
add_to_linker_sync和add_to_linker_async函数要求T: WasiView与Linker<T>。
要实现WasiView trait,您首先需要选择一个T放入Store<T>中。接下来,您将为T实现WasiView trait。在T中,您将存储
WasiCtx- 通过WasiCtxBuilder创建。ResourceTable- 通过默认构造函数创建。
这两个字段将通过WasiView的方法进行访问。
异步和同步
许多WASI函数从WebAssembly的角度来看不是阻塞的,但对于那些是阻塞的,它们提供了两种版本:异步和同步。您将使用哪个版本取决于如何设置Config::async_support。
- 对于非异步用户(
Config的默认值),请使用add_to_linker_sync。 - 对于异步用户,请使用
add_to_linker_async。
请注意,绑定会分别为异步和同步生成一次。大多数接口不会改变,因此只有带有阻塞函数的接口会生成两次绑定。绑定组织如下
bindings- 所有绑定默认位置,阻塞函数为asyncbindings::sync- 阻塞接口在此处有同步版本。
特定于Crate的特质
该Crate为针对编译的平台提供的WASI绑定到本地原语的默认实现。例如,打开TCP套接字使用本地平台打开TCP套接字(只要WasiCtxBuilder允许这样做)。然而,有几个重要的特质是针对该Crate的。
-
HostInputStream和HostOutputStream- 这些是WASIinput-stream和output-stream类型背后的宿主特质,在wasi:io/streams接口中。这些使嵌入器能够构建自己的自定义流并将其插入ResourceTable以从wasm中使用。 -
Subscribe- 此特质使您能够构建任意逻辑,以便从wasi:io/poll中钩入一个pollable资源。一个可轮询的资源是通过subscribe函数创建的。 -
HostWallClock和HostMonotonicClock与WasiCtxBuilder::wall_clock和WasiCtxBuilder::monotonic_clock一起使用,如果默认宿主时钟不应该使用。 -
StdinStream和StdoutStream用于提供自定义stdin/stdout流,如果它们没有被继承(或默认为null)。
这些特质使嵌入器能够自定义提供的WASI接口的小部分,同时仍然提供所有其他接口。
示例
通过以下步骤使用此Crate将一切连接起来
- 首先为您的类型实现
WasiView,这是T在Store<T>中的。 - 将WASI接口添加到
wasmtime::component::Linker<T>。这是通过顶级函数如add_to_linker_sync或通过此Crate中生成的绑定中的单个add_to_linker函数完成的。 - 通过
WasiCtxBuilder为每个Store<T>创建一个WasiCtx。每个WASI上下文默认是“null”或“empty”,因此必须显式添加项目以便通过wasm访问(例如环境变量或程序参数)。 - 使用之前的
Linker<T>在Store<T>中实例化一个Component。
有关示例,请参阅WasiView、WasiCtx、WasiCtxBuilder、add_to_linker_sync和bindings::Command。
依赖项
~25–40MB
~765K SLoC