Hacker News 中文摘要

RSS订阅

Cap'n Web:面向浏览器与网页服务器的新型RPC系统 -- Cap'n Web: a new RPC system for browsers and web servers

文章摘要

Cloudflare推出Cap'n Web,这是一款基于TypeScript的RPC系统,专为浏览器和服务器设计。它继承了Cap'n Proto的对象能力协议特性,但无需模式定义,直接使用JSON序列化,支持HTTP、WebSocket等多种传输方式,兼容主流浏览器和JavaScript运行环境,简化了开发流程。

文章总结

Cap'n Web:面向浏览器与Web服务器的新型RPC系统

Cloudflare近日开源了Cap'n Web,这是一款纯TypeScript实现的RPC协议。作为Cap'n Proto的"精神继承者",它专为现代Web生态设计,具有以下核心特性:

核心优势

  • 无模式设计:无需定义接口模板,可直接调用远程方法,类似Cloudflare Workers原生RPC系统
  • 双向调用能力:支持客户端与服务器相互调用,可传递函数和对象引用
  • 极简实现:基于JSON序列化,压缩后体积小于10KB,无第三方依赖
  • 多协议支持:原生兼容HTTP、WebSocket和postMessage(),可扩展其他传输方式
  • 类型安全:完美集成TypeScript,提供端到端类型检查

技术亮点

  1. 对象能力模型

    • 支持Promise级联调用,链式操作仅需单次网络往返
    • 内置安全模式:通过authenticate()等模式实现天然权限控制
    • 示例:服务器可返回包含方法的会话对象,客户端无法伪造
  2. 开发体验: ```typescript // 客户端示例 let api = newWebSocketRpcSession("wss://example.com/api"); let result = await api.hello("World");

// 服务端实现(Cloudflare Workers) class MyApiServer extends RpcTarget { hello(name) { return Hello, ${name}! } } ```

  1. 批处理模式typescript let batch = newHttpBatchRpcSession("https://example.com/api"); let [res1, res2] = await Promise.all([ batch.getUser(1), batch.getUser(2) ]);

与GraphQL对比

| 特性 | Cap'n Web | GraphQL | |---------------|-------------------------|-----------------------| | 协议层 | JavaScript原生 | 专用查询语言 | | 组合性 | 支持方法链式调用 | 声明式查询 | | 学习曲线 | 沿用JS开发习惯 | 需要学习新语法 | | 数组处理 | 支持服务端map操作 | 依赖片段(fragments) |

底层实现

  • 采用JSON扩展序列化,通过["type", params]格式处理特殊类型
  • 对称协议设计:通过导出表/导入表管理对象引用
  • 消息类型:
    • push:发起RPC调用
    • pull:请求返回结果
    • resolve/reject:返回执行结果

目前该项目已应用于Cloudflare Wrangler的远程绑定功能,开发者可通过MIT许可证自由使用。

提示:该技术特别适合需要实时协作的Web应用,以及需要复杂安全边界建模的场景。由于尚处实验阶段,建议对前沿技术有包容心的团队尝试。

评论总结

以下是评论内容的总结:

1. 对Cap'n Web的积极评价

  • 简化与兼容性:认为Cap'n Web作为Cap'n Proto RPC的简化版,希望其特性能够反向兼容到其他语言(如C++)。(评论1)
    • "it would be amazing if eventually the simplification traveled back to all the languages"
  • 实用性与模式认可:认为该模式实用,类似自己重复构建的解决方案,如浏览器中worker-page通信或Chrome扩展脚本间通信。(评论3)
    • "I’ve ended up building similar things over and over again"

2. 与OCapN的比较

  • 功能差异:指出Cap'n Web缺少OCapN的第三方交接(third-party handoffs)和离线能力(sturdyrefs),更适合传统客户端-服务器SaaS场景。(评论2)
    • "Cap'n web lacks out-of-band capabilities"
    • "Cap'n Web is more for traditional client-server SaaS"

3. 技术细节讨论

  • 双向通信与回调:支持通过引用传递函数和对象,实现双向调用,比JSON RPC更完善。(评论13, 14)
    • "Supports passing functions by reference... This is how bidirectional calling happens"
    • "The part that’s most exciting to me is actually the bidirectional calling"
  • 性能与RTT疑问:澄清“单次往返”指多个客户端消息对应一个服务器响应,而非单次请求-响应。(评论6)
    • "1 server message in response to potentially many client messages"

4. 对无模式(schemaless)的质疑

  • 模式必要性:质疑无模式设计的实际意义,认为协议仍需处理类型和演化问题。(评论11, 16)
    • "can’t fundamentally eschew schema/types"
    • "Having a well defined schema is one of the things I like about tRPC"

5. 安全性与实现疑问

  • 安全问题:担心无模式设计结合弱类型语言可能导致安全隐患,如客户端传递恶意回调对象。(评论18)
    • "are there security issues with no schemas + callback stubs"
  • 状态管理:质疑是否需要有状态服务器维护导入/导出表,或支持多服务器场景。(评论17)
    • "require a stateful server to hold on to the import and export tables"

6. 其他语言支持与生态

  • 多语言支持:询问是否支持其他语言后端(如Rust),以及实现难度。(评论9)
    • "would be neat if Rust could support this on the backend"
  • 与Cloudflare Workers的兼容性:关注Cap'n Web与Cloudflare Workers的功能对齐及未来同步计划。(评论10)
    • "do you think once the two reach parity, that that parity will remain"