17 个版本 (8 个重大更新)
新版本 0.8.1 | 2024 年 8 月 23 日 |
---|---|
0.7.0 | 2024 年 8 月 21 日 |
0.4.0 | 2024 年 7 月 27 日 |
0.0.0 | 2024 年 1 月 23 日 |
#167 in WebAssembly
每月 669 次下载
645KB
9K SLoC
关于
wRPC 促进了在网络上或其他通信方式中执行定义在 WIT 中的任意功能。
wRPC 的主要用例包括
- 树外 WebAssembly 运行时插件
- 分布式 WebAssembly 组件通信
尽管 wRPC 首先是为 Wasm 组件设计的,但它可以在 WebAssembly 上下文之外完全使用,并可作为通用 RPC 框架。
wRPC 在线路上使用 组件模型值定义编码。
wRPC 支持动态(基于例如运行时 WebAssembly 组件类型内省)和静态用例。
对于静态用例,wRPC 为
- Rust
- Go
wRPC 完全支持尚未发布的原生 WIT stream
和 future
数据类型以及所有当前发布的 WIT 功能。
设计
传输
wRPC 传输是在其之上构建所有其他功能的核心理念。
传输表示一个多路复用双向通信通道,wRPC 调用通过该通道传输。
wRPC基于这样的假设:传输通信通道可以通过一系列无符号32位整数进行“索引”,这些整数代表一个反射性结构路径。
调用
作为每次wRPC调用的一个部分,所选传输将至少建立2个独立的方向字节流
- 参数(客户端 -> 服务器)
- 结果(服务器 -> 客户端)
wRPC传输实现可以(并且鼓励)提供两个额外的方向通信通道
- 客户端错误(客户端 -> 服务器)
- 服务器错误(服务器 -> 客户端)
错误通道是唯一具有类型的通道,特别是,这些通道上发送的值是字符串。
如果正在传输作为调用参数或结果的async
值,wRPC可以在索引路径上异步发送这些值。
考虑从实例wrpc-example:doc/example@0.1.0
调用WIT函数foo
。
package wrpc-example:doc@0.1.0;
interface example {
record rec {
a: stream<u8>,
b: u32,
}
foo: func(v: rec) -> stream<u8>;
}
- 由于
foo
参数0
是一个包含作为第一个字段的async
类型(stream
)的record
,wRPC将向传输通信告知,除了“根”参数通道外,它可能需要在索引路径0
(第一个返回值)接收结果。 - wRPC将以非阻塞方式将参数编码为单元素元组。如果编码时
rec.a
的完整内容不可用,则流将编码为option::none
。 - (同时,如果
2.
流中的内容不完整)wRPC将在内容可用时,以参数字节流在索引0
(记录的第一个字段,也是第一个参数)中传输stream<u8>
的内容。 - wRPC将尝试从“根”结果字节流解码
stream<u8>
。 - (如果
4.
解码了对stream
值的option::none
)wRPC将尝试从结果字节流在索引0
解码stream<u8>
。
注意,foo
的handler(服务器)可能在
rec.a
发送或甚至可用之前收到rec.b
的值- 在它收到
rec.a
之前,向foo
的invoker(客户端)发送一个结果
仓库结构
该仓库包含(针对所有支持的语言)
- 核心库和抽象
- 绑定生成器
- WebAssembly运行时集成
- wRPC传输实现
wit-bindgen-wrpc
旨在与wit-bindgen
的用户体验紧密匹配,因此包括项目子树合并,该合并偶尔合并到这个树中。
- 除了其他测试外,wRPC 绑定生成器等测试使用
wit-bindgen
测试套件进行测试 - 在适用的地方,重新使用了
wit-bindgen
文档
贡献
👋 欢迎,新贡献者!
无论您是经验丰富的开发者还是刚开始,您的贡献对我们来说都很有价值。不要犹豫,加入进来,探索项目,并产生影响。要开始贡献,请查看我们的贡献指南。
依赖
~6–28MB
~443K SLoC