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日

827WebAssembly

Download history 23623/week @ 2024-04-30 25520/week @ 2024-05-07 24211/week @ 2024-05-14 24365/week @ 2024-05-21 23701/week @ 2024-05-28 20715/week @ 2024-06-04 22546/week @ 2024-06-11 24397/week @ 2024-06-18 22745/week @ 2024-06-25 18177/week @ 2024-07-02 22206/week @ 2024-07-09 20364/week @ 2024-07-16 19118/week @ 2024-07-23 19928/week @ 2024-07-30 15435/week @ 2024-08-06 16241/week @ 2024-08-13

75,144 每月下载量
154 个Crate中(70个直接) 使用

Apache-2.0 WITH LLVM-exception

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 tokiocap-std 实现,这意味着默认情况下操作以它们的本地平台等效物实现。

有关组件和WASIp2,请继续阅读以下内容。有关WASIp1和核心模块,请参阅preview1模块文档。

WASIp2接口

此Crate包含以下接口的实现

所有特性都是通过一个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_syncadd_to_linker_async函数要求T: WasiViewLinker<T>

要实现WasiView trait,您首先需要选择一个T放入Store<T>中。接下来,您将为T实现WasiView trait。在T中,您将存储

这两个字段将通过WasiView的方法进行访问。

异步和同步

许多WASI函数从WebAssembly的角度来看不是阻塞的,但对于那些是阻塞的,它们提供了两种版本:异步和同步。您将使用哪个版本取决于如何设置Config::async_support

请注意,绑定会分别为异步和同步生成一次。大多数接口不会改变,因此只有带有阻塞函数的接口会生成两次绑定。绑定组织如下

  • bindings - 所有绑定默认位置,阻塞函数为 async
  • bindings::sync - 阻塞接口在此处有同步版本。

特定于Crate的特质

该Crate为针对编译的平台提供的WASI绑定到本地原语的默认实现。例如,打开TCP套接字使用本地平台打开TCP套接字(只要WasiCtxBuilder允许这样做)。然而,有几个重要的特质是针对该Crate的。

这些特质使嵌入器能够自定义提供的WASI接口的小部分,同时仍然提供所有其他接口。

示例

通过以下步骤使用此Crate将一切连接起来

  1. 首先为您的类型实现WasiView,这是TStore<T>中的。
  2. 将WASI接口添加到wasmtime::component::Linker<T>。这是通过顶级函数如add_to_linker_sync或通过此Crate中生成的绑定中的单个add_to_linker函数完成的。
  3. 通过WasiCtxBuilder为每个Store<T>创建一个WasiCtx。每个WASI上下文默认是“null”或“empty”,因此必须显式添加项目以便通过wasm访问(例如环境变量或程序参数)。
  4. 使用之前的Linker<T>Store<T>中实例化一个Component

有关示例,请参阅WasiViewWasiCtxWasiCtxBuilderadd_to_linker_syncbindings::Command

依赖项

~25–40MB
~765K SLoC