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/stderr
wasi:cli/stdin
wasi:cli/stdout
wasi:cli/终端-输入
wasi:cli/终端-输出
wasi:cli/终端-stderr
wasi:cli/终端-stdin
wasi:cli/终端-stdout
wasi:时钟/单调-时钟
wasi:时钟/墙-时钟
wasi:文件系统/预打开
wasi:文件系统/类型
wasi:io/错误
wasi:io/轮询
wasi:io/流
wasi:随机/不安全-种子
wasi:随机/不安全
wasi:随机/随机
wasi:套接字/实例-网络
wasi:套接字/ip-名称-查找
wasi:套接字/网络
wasi:套接字/tcp-创建-套接字
wasi:套接字/tcp
wasi:套接字/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
- 所有绑定默认位置,阻塞函数为async
bindings::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