概要
- Cap'n Web は、TypeScript製の新しい RPCプロトコル で、Web環境に特化した設計。
- スキーマ不要、 JSONベース のシリアライズで、シンプルかつ人間に読みやすい通信を実現。
- 双方向呼び出し や オブジェクト・関数の参照渡し、 Promiseパイプライン など高度な機能をサポート。
- HTTP/WS/postMessage に対応し、主要なJavaScript環境で動作。
- TypeScriptとの親和性 が高く、型安全なAPI設計が可能。
Cap'n Webとは
- Cap'n Web は、 Cap'n Proto の精神的後継であり、Webスタックに最適化された TypeScript製RPCプロトコル。
- スキーマレス設計 で、JavaScriptネイティブのRPCのように使える。
- シリアライズ形式はJSON を採用し、前処理・後処理のみを実施。
- HTTP/WS/postMessage に標準対応し、他のトランスポートも容易に拡張可能。
- 主要ブラウザ、Cloudflare Workers、Node.js などで動作。
- 10kB未満・依存なし の軽量実装。
- MITライセンス のオープンソース。
オブジェクト・キャパビリティモデルの特徴
- 双方向呼び出し をサポートし、クライアント・サーバー双方から呼び出し可能。
- 関数参照渡し により、コールバック関数をRPC経由で渡し、リモートで実行可能。
- オブジェクト参照渡し も可能で、 RpcTarget 継承クラスは参照としてリモートに渡せる。
- Promiseパイプライン により、複数の依存RPCを1ラウンドトリップで実行可能。
- キャパビリティベースのセキュリティ パターンに対応。
導入例
- クライアント側は 1行で初期化 し、サーバーのメソッドを直接呼び出し可能。
- サーバー側は RpcTarget継承クラス を用意し、HTTPハンドラでラップするだけのシンプル構成。
- TypeScriptインターフェース を使い、クライアント・サーバー双方で型安全な実装が可能。
なぜRPCか?
- RPC は、ネットワーク越しの関数呼び出しを、ローカルAPIのように扱える通信方式。
- HTTP/REST ではリクエスト・レスポンスのパースや設計が必要だが、RPCはAPI設計に集中できる。
- Promise/async/await の普及で、モダンな非同期RPCが実用的に。
- プログラマの思考モデル に合致し、開発効率向上。
Cap'n Webの利用シーン
- JavaScript同士のネットワーク通信 全般(クライアント・サーバー、マイクロサービス間など)。
- 特に リアルタイム協調Webアプリ や、 複雑なセキュリティ境界 を持つ用途に最適。
- 実験的・先進的なプロジェクト 向け。
主要機能詳細
- HTTPバッチモード で、WebSocketを使わず一括RPC呼び出しが可能。
- バッチ内で複数のRPCを一度に実行し、まとめてawait可能。
- Promiseパイプライン で、依存するRPCをawaitせずにチェーン実行。
- 返却オブジェクトのメソッドも即時呼び出し可能。
- オブジェクト・キャパビリティによるセキュリティ :
- 例:authenticate()で認証済みセッションオブジェクトを返し、以降の操作はこのオブジェクト経由でのみ可能。
- セッションの偽造が不可能で、認可漏れを防止。
TypeScriptとの連携
- TypeScriptインターフェース を1つ定義し、クライアント・サーバー双方で型安全に利用。
- 型補完・型検査 が効き、開発体験が向上。
- ランタイム型チェックは未対応だが、Zod等の導入で補完可能。
GraphQLとの比較(抜粋)
- GraphQLに類似した柔軟性 を持つが、 オブジェクト指向API設計 が可能。
- 型安全・高表現力 を両立。
Cap'n Webは、 Web時代の新しいRPC として、 シンプルさ・柔軟性・型安全性 を兼ね備えた革新的な選択肢。 リアルタイム・セキュア・型安全 なAPI設計を求める開発者に最適。