Cap'n Web - JavaScript 原生 RPC 系统
Cap'n Web 是 Cap'n Proto 的精神兄弟(由同一位作者创作),但专为在 Web 技术栈中顺畅运行而设计。这意味着:
- 与 Cap'n Proto 类似,它是一个对象能力协议。(“Cap'n” 是“capabilities and” 的缩写。)
- 与 Cap'n Proto 不同,Cap'n Web 没有架构。事实上,它几乎没有任何样板代码。这意味着它的工作方式更像Cloudflare Workers 中的 JavaScript 原生 RPC 系统。
- 也就是说,它与 TypeScript 很好地集成了。
- 与 Cap'n Proto 不同的是,Cap'n Web 的底层序列化是人类可读的。实际上,它只是 JSON,经过了一些预处理/后处理。
- 它可以通过 HTTP、WebSocket 和 postMessage() 开箱即用,并能够轻松扩展到其他传输。
- 它适用于所有主流浏览器、Cloudflare Workers、Node.js 和其他现代 JavaScript 运行时。整个程序可压缩(minify+gzip)至 10kB 以下,且无任何依赖项。
Cap'n Web 比几乎所有其他 RPC 系统都更具表现力,因为它实现了一个对象能力 RPC 模型。这意味着它:
- 支持双向调用,客户端可以调用服务端,服务端也可以调用客户端。
- 支持通过引用传递函数:如果你通过 RPC 传递函数,接收者会收到一个“stub”。当他们调用该 stub 时,实际上是在向你发起一个 RPC,并在创建该函数的位置调用该函数。这就是双向调用的原理:客户端将回调传递给服务器,然后服务器稍后可以调用它。
- 类似地,支持通过引用传递对象:如果一个类扩展了特殊标记类型
RpcTarget,那么该类的实例将通过引用传递,方法调用将回调到创建对象的位置。 - 支持 Promise 流水线。启动 RPC 时,会返回一个 Promise。无需等待,您可以立即在依赖的 RPC 中使用该 Promise,从而在一次网络往返中执行一系列调用。
- 支持基于能力的安全模式。