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

Download history 140/week @ 2024-05-17 2/week @ 2024-05-24 91/week @ 2024-06-28 411/week @ 2024-07-05 174/week @ 2024-07-12 19/week @ 2024-07-19 169/week @ 2024-07-26 113/week @ 2024-08-02 84/week @ 2024-08-09 295/week @ 2024-08-16

每月 669 次下载

Apache-2.0 WITH LLVM-exception

645KB
9K SLoC

Rust 8K SLoC // 0.0% comments Go 1.5K SLoC // 0.0% comments

wRPC

组件原生 传输无关的 RPC 协议和框架,基于 WebAssembly 接口类型 (WIT)

Bytecode Alliance 托管的计划

build status Documentation Status

关于

wRPC 促进了在网络上或其他通信方式中执行定义在 WIT 中的任意功能。

wRPC 的主要用例包括

  • 树外 WebAssembly 运行时插件
  • 分布式 WebAssembly 组件通信

尽管 wRPC 首先是为 Wasm 组件设计的,但它可以在 WebAssembly 上下文之外完全使用,并可作为通用 RPC 框架。

wRPC 在线路上使用 组件模型值定义编码

wRPC 支持动态(基于例如运行时 WebAssembly 组件类型内省)和静态用例。

对于静态用例,wRPC 为

  • Rust
  • Go

wRPC 完全支持尚未发布的原生 WIT streamfuture 数据类型以及所有当前发布的 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>;
}
  1. 由于foo参数0是一个包含作为第一个字段的async类型(stream)的record,wRPC将向传输通信告知,除了“根”参数通道外,它可能需要在索引路径0(第一个返回值)接收结果。
  2. wRPC将以非阻塞方式将参数编码为单元素元组。如果编码时rec.a的完整内容不可用,则流将编码为option::none
  3. (同时,如果2.流中的内容不完整)wRPC将在内容可用时,以参数字节流在索引0(记录的第一个字段,也是第一个参数)中传输stream<u8>的内容。
  4. wRPC将尝试从“根”结果字节流解码stream<u8>
  5. (如果4.解码了对stream值的option::none)wRPC将尝试从结果字节流在索引0解码stream<u8>

注意,foohandler(服务器)可能在

  • rec.a发送或甚至可用之前收到rec.b的值
  • 在它收到rec.a之前,向fooinvoker(客户端)发送一个结果

仓库结构

该仓库包含(针对所有支持的语言)

  • 核心库和抽象
  • 绑定生成器
  • WebAssembly运行时集成
  • wRPC传输实现

wit-bindgen-wrpc旨在与wit-bindgen的用户体验紧密匹配,因此包括项目子树合并,该合并偶尔合并到这个树中。

  • 除了其他测试外,wRPC 绑定生成器等测试使用 wit-bindgen 测试套件进行测试
  • 在适用的地方,重新使用了 wit-bindgen 文档

贡献

GitHub repo Good Issues for newbies GitHub Help Wanted issues GitHub Help Wanted PRs GitHub repo Issues

👋 欢迎,新贡献者!

无论您是经验丰富的开发者还是刚开始,您的贡献对我们来说都很有价值。不要犹豫,加入进来,探索项目,并产生影响。要开始贡献,请查看我们的贡献指南

依赖

~6–28MB
~443K SLoC