Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Cap'n Webについて
Search
Yusuke Wada
December 09, 2025
Programming
0
220
Cap'n Webについて
2025-12-09
Yusuke Wada
Yusuke Wada
December 09, 2025
Tweet
Share
More Decks by Yusuke Wada
See All by Yusuke Wada
OSS開発者の憂鬱
yusukebe
16
17k
r2-image-worker
yusukebe
1
230
Introduce Hono CLI
yusukebe
6
3.9k
私はどうやって技術力を上げたのか
yusukebe
47
21k
Reactをクライアントで使わない
yusukebe
8
7k
AI時代のUIはどこへ行く?
yusukebe
23
12k
速いWebフレームワークを作る
yusukebe
5
2k
Honoアップデート 2025年夏
yusukebe
1
1.1k
パスタの技術
yusukebe
1
760
Other Decks in Programming
See All in Programming
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
220
「やめとこ」がなくなった — 1月にZennを始めて22本書いた AI共創開発のリアル
atani14
0
330
メタプログラミングで実現する「コードを仕様にする」仕組み/nikkei-tech-talk43
nikkei_engineer_recruiting
0
130
DSPy入門 Pythonで実現する自動プロンプト最適化 〜人手によるプロンプト調整からの卒業〜
seaturt1e
1
390
CSC307 Lecture 08
javiergs
PRO
0
690
TipKitTips
ktcryomm
0
130
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
2k
Rails Girls Tokyo 18th GMO Pepabo Sponsor Talk
yutokyokutyo
0
180
CDIの誤解しがちな仕様とその対処TIPS
futokiyo
0
140
AIによる高速開発をどう制御するか? ガードレール設置で開発速度と品質を両立させたチームの事例
tonkotsuboy_com
7
2.6k
今、アーキテクトとして 品質保証にどう関わるか
nealle
0
200
Go 1.26でのsliceのメモリアロケーション最適化 / Go 1.26 リリースパーティ #go126party
mazrean
1
310
Featured
See All Featured
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
80
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
Being A Developer After 40
akosma
91
590k
Docker and Python
trallard
47
3.7k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
140
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.4k
What's in a price? How to price your products and services
michaelherold
247
13k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
210
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
170
Unsuck your backbone
ammeep
671
58k
Transcript
Cap'n Webについて
Me Yusuke Wada Web Application Developer Developer Advocate at Cloudflare
A founder of Bokete The Creator of Hono
Cap’n Web
Cap'n Webとは? • JavaScriptネイティブな RPC • capnwebというnpmパッケージがある • 作者がKenton Varda
◦ Cloudflare Workersの作者 • https://github.com/cloudflare/capnweb https://blog.cloudflare.com/capnweb-javascript-rpc-library/
Cap'n Webの特徴 • サーバーとブラウザで動作 • JavaScriptのメソッド呼び出し、オブジェクト操作ができる • HTTP、WebSocket、postMessage() で動作 •
メジャーなブラウザ、 Cloudflare Workers、Node.js、Denoで動作 ◦ Hono Adapterを使うと Bunでも • 依存なし、 10KB(minify+gzip) • TypeScriptによる型サポート
インストール
RPCであること • RESTやGraphQLを置き換えるかも • サーバサイド・クライアントを JavaScript/TypeScriptに統一したい時
RPCのイメージ - APIの定義 src/api.ts RpcTargetをextendsしたクラスをつくって関数を定義
RPCのイメージ - クライアントの呼び出し src/client.ts api.hello()で関数呼び出し
src/client.ts src/api.ts
TypeScriptの型サポート APIから型を取ってきてジェネリクスに渡す
サーバーサイドの実装 src/server.ts MyApiServerのインストールをnewWorkersRpcResponse()に渡す
動かし方 サーバーサイド Cloudflare Workers / Wranglerで起動 クライアントサイド コマンドライン / tsxで起動
2種類の呼び出し • バッチとWebSocket • API、サーバーの実装は変えなくてよい
バッチの基本 src/client-batch.ts newHttpBatchRpcSessionを使う
まとめてリクエストする src/client-batch.ts Promise.all()した時に初めてリクエストが飛ぶ
クライアント出力
サーバーログ 1度だけ!
おさらい
パイプライン - API src/api.ts getMyName()を追加
パイプライン - クライアント src/client-batch.ts await batch.hello()した時に初めてリクエストが飛ぶ Promise
クライアント出力
サーバーログ 1度だけ!
パイプライン • APIを変えずに Promiseをメソッドに渡せる • batch.hello()の時にawaitして初めてリクエストが飛ぶ • Cap’n WebのPromiseは「通常の Promise」ではない!
◦ メソッドチェーンをよしなにしてくれる
Cap’n Webのバッチの面白いところ • JavaScriptのネイティブな関数呼び出し • パイプラインを作って 1度のラウンドトリップで実行
map() - API src/api.ts
map() - クライアント src/client-batch.ts リスト操作をmap()で行う
クライアント出力
サーバーログ 1度だけ!
map() を活用する • 友達のリストを処理する ◦ 1度だけのラウンドトリップ • RESTやGraphQLに大きなアドバンテージ • APIを変えずに
1つのリクエストにすることができる
WebSocket - クライアント src/client-websocket.ts 使い方はさほど変わらない
クライアント出力 1秒経って
サーバーログ WebSocketコネクション
WebSocket • コネクションをはりっぱなし • チャットなどリアルタイム共有系で便利
Durable Objectsと一緒に使う • ステート管理をしたい • Cloudflare Workersの場合Durable Objectsが使える • JSRPCで使うRpcTargetがCap’n
WebのAPIに使える • Cap’n WebのWeb Socketクライアントからステート付きのオブジェクトに アクセスできる
None
既存のRPCとの比較 • JavaScript/TypeScriptのRPCライブラリは他にもある • tRPC • Hono RPC
JSネイティブに書ける 独自の書き方 バリデーションしている
冗長 Honoのアプリをそのままクライアントで利用できる TypeScriptの型 + fetchラッパー
実例 • Workers SDK • TanStack AIのExample ◦ https://github.com/TanStack/ai/tree/main/examples/ts-group-chat
Hono Adapter - インストール
Hono Adapter - コード例 src/server.ts Cloudflare Workers用 他にも同じインターフェースで Node.js/Deno/Bunに対応
まとめ • Cap’n Webの紹介 • JavaScriptネイティブのパイプライン • 1ラウンドトリップで呼び出し • Hono
Adapterもある