Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Cloudflare Realtime と Workers でつくるサーバーレス WebRTC
Search
Taiyu Yoshizawa
June 03, 2025
Programming
2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cloudflare Realtime と Workers でつくるサーバーレス WebRTC
Taiyu Yoshizawa
June 03, 2025
More Decks by Taiyu Yoshizawa
See All by Taiyu Yoshizawa
MapLibre の CJK レンダリング / CJK Rendering in MapLibre
nekoya3
0
150
The Present and Future of CJK Rendering in MapLibre
nekoya3
0
13
Kartore: A Style Editor and Toolkit for MapLibre
nekoya3
0
20
Kartore: Maplibre のための Style Editor とその Toolkit
nekoya3
0
140
Flagship という素晴らしいもの / This awesome thing called Flagship
nekoya3
0
6
10分で完全に理解出来る Cloudflare Workers + HyperDrive / Cloudflare Workers + HyperDrive: You Might Understand It in Just 10 Minutes
nekoya3
0
26
WorkersでCMSを作ってみないか / Wanna build a CMS with Workers?
nekoya3
0
12
北海道新型コロナウイルスまとめサイトでのいろいろなこと
nekoya3
0
480
Other Decks in Programming
See All in Programming
Python Lambdaにおけるテストしやすい設計とAI支援の活用 / Designing Testable Python Lambda Functions with AI
kitano_yuichi
1
300
GraphQL の onError と Nullability のこれから
quramy
0
210
ChromeでローカルLLM
ryu1013
0
200
AI時代のFlutter品質設計 — アプリ品質を守るQuality Layers
omatty198
0
360
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
210
複数ドメインを一つのアプリに統合するFlutterの設計と運用_FlutterKaigi2026登壇資料(須永高弘)
takahirosunaga
0
160
Engineering Biometric UX Across Android Versions | DroidKnights 2026
ryunen344
1
190
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
290
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
260
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
5
800
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
4
3.5k
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
330
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
77
5.6k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
530
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Building Applications with DynamoDB
mza
96
7.3k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
550
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
30 Presentation Tips
portentint
PRO
1
460
How Software Deployment tools have changed in the past 20 years
geshan
3
35k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
890
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
3
1.2k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.9k
Transcript
Cloudflare Workers + Realtime ɴᴇᴋᴏʏᴀsᴀɴ
Who are you? g ɴᴇᴋᴏʏᴀsᴀ g Software Engineer @MIERUNE Inc1
g Co-founder & Software Engineer @ ReMotivI g GitHub: @NEKOYASA2 g Web: nekoyasan.me
What is MIERUNE 位置情報技術に特化したプロフェッショナル集 9年前に北海道のOSSコミュニティ (FOSS4G) から創業し て、現在も本社は札幌市、社員数38
OSSを中心に柔軟な技術選定を実D Hono / Svelte / Maplibre / QGIS などな" HP: https://www.mierune.co.jp/
れきちず | MapLibre | 地理院タイル | 『日本歴史地名大系』地名項目データセット れきちず:https://rekichizu.jp/
おことわり V 今回は Cloudflare Realtime について様々な用語の説明をし ながらお話しまy V 用語の中には仕様上はかなり複雑なものもあり、とっつきやす いように端折っている箇所も多くありまy
V 私自身も専門家というわけではない一利用者に過ぎないため、 誤った箇所などあればお教えください
Cloudflare Realtime とは
Cloudflare Realtime とは Cloudflare が提供する WebRTC に関連するサービスの総Q 以前は
Cloudflare Calls という名称でサービス提供がされて いたが、2025年4月に名称変s 名称変更と同タイミングで正式リリース & Realtime Kit の Private Beta が開始
Cloudflare Realtime とは Cloudflare が提供する WebRTC に関連するサービスの総Q 以前は
Cloudflare Calls という名称でサービス提供がされて いたが、2025年4月に名称変s 名称変更と同タイミングで正式リリース & Realtime Kit の Private Beta が開始
WebRTCとは x Web RealTime Communication → Web RT7 x 双方向リアルタイム通信を実現するためのAPIやプロトコルのこ
とを指すb x RFC8825 ~ 8839 あたりを中心に定義されているが、関連す る仕様なども合わせると非常に多岐にわたv x 現在ではブラウザに標準機能として基本的には搭載されており、 双方向リアルタイム通信の手法としては比較的利用しやすい
WebRTCとは Discord や Google Meet 、 Twitter Spaces など、音声通
話やビデオ通話等に多く利用されているT 最近では WHIP や WHEP という規格によってOBSなどソフ トウェアを使った配信にも活用できるような基盤が整い始めてい WebRTCの詳しいことは専門の会社さんが記事などでまとめて くれているのでそちらへ...
WebRTCとは STU TUR SFU
STUNとは u Session Traversal Utilities for NATs = STU% u
NAT環境下に自身が居る場合にデバイスはプライベートIPしか わからず、そのままでは自身のグローバルIPがわからない → STUNに問い合わせることで知ることができる
STUNとは クライアント N A T 私は...どこのだれ...? ...
STUNとは クライアント STUN サーバー N A T Binding Request Binding
Response 私は...どこのだれ...? あなたはこのIP / Port
TURNとは n Traversal Using Relays around NAT = TURb n
P2P による直接通信が出来ない(STUNだけではP2Pでの接続 が確立できない)or UDPによる接続が確立できない場合に利用 する中継サーバ・プロトコルのこi n サーバを経由するがただのバイパスしか役目がなく、バイパスし ているデータを読み取ることも、変化させることもなf n サーバを経由するため、P2Pに比べて遅延は大きくなってしまう
TURNとは クライアント クライアント
TURNとは クライアント クライアント TURN サーバー
SFUとは m Selective Forwarding Unit = SFv m P2P による通信ではメッシュ接続をする必要があるため参加者
が増えるにつれて、1人が接続する接続数が増大する問題があf m SFUサーバとの接続のみを行い、SFUサーバーが必要に応じて 他のクライアントに転送すf m 転送しか出来ず加工をすることは出来な' m 対照的に合成・再エンコードを行うMCUも存在する
SFUとは やばい
SFUとは SFU サーバー
WebRTCとは STU TUR SFU
Cloudflare Realtime では 2 Realtime Ki0 2 TURN Serve 2
Serverless SFU
Cloudflare Realtime では 5 Realtime Ki2 5 TURN Serve 5
Serverless SF# 5 (STUN Server)
Cloudflare Realtime では F Realtime KiD F TURN Serve' F
Serverless SF3 F (STUN Server) で提供はされている stun.cloudflare.com:3478
Cloudflare Realtime では F Realtime KiD F TURN Serve' F
Serverless SF3 F (STUN Server) で提供はされている stun.cloudflare.com:3478
Cloudflare Realtime では F Realtime KiD F TURN Serve' F
Serverless SF3 F (STUN Server) で提供はされている stun.cloudflare.com:3478
TURN Server f TURN サーバーの Cloudflare フルマネージドなもb f TURN Key
IDと Token から TURN Username と Credentialを作り、それらとurlsをiceServersで設定すQ f GraphQL の Analytics API が用意されていて、どれだけ利用 されているか、不正利用の検知が出来Q f EdgeからのEgress のみが課金対u f 0.05 USD / GB で 初回1000GBまでは無 f カスタムドメインを割り当てることも出来る
Serverless SFU l SFU の Cloudflare フルマネージドなもs l PeerConnection で
Session を作り、MediaStreamTrack (Audio / Video) をトラックとして持y l ルームという概念はなく、トラックそれぞれに一意のIDが付いて いて、それをグローバルなどこからでも取得することができ# l 取得していなければ課金もされないので、メディアストリームを 動的につなぎ替えることができるスイッチャーのような役目を 担っているとも言える
Realtime Kit j まだPrivate Betaで全容がよくわからないものの.. j クライアントのSDK・UIが用意されていたV j RecordingやAnalytics、Workers AI
との連) j Realtime AIと称し て Transcription や Agent、Voice AI、 ノイズキャンセルなどの連携が用意されているよ j ベース技術とし てはServerless SFU / TURN Serverなのは変 化がなく、ユーザー認証やルーム機能などが含まれていて、即使 える!みたいなもの?
ここからは Serverless SFU 使ったデモ
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20 const new const await const return peerConnection RTCPeerConnection({ iceServers [ { urls , }, ], bundlePolicy , }); localStream navigator.mediaDevices. ({ video , audio , }); transceivers localStream. (). ((track) { peerConnection. (track, { direction , }); }); = : : : = : : = => : "stun:stun.cloudflare.com:3478" "max-bundle" "sendonly" getUserMedia getTracks map addTransceiver true true
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20 await await const await const await peerConnection. ( peerConnection. ()); response ( , { method , headers { , Authorization ${appSecret} , }, body . ({ sessionDescription { type , sdp peerConnection.localDescription.sdp, }, }), }, ); newSessionResult response. (); setLocalDescription createOffer fetch stringify json = : : : : : : : : = "https://rtc.live.cloudflare.com/v1/apps/${appId}/sessions/new" "POST" "application/json" `Bearer ` "offer" "Content-Type" JSON
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 trackObjects transceivers. ((transceiver) { { location , mid transceiver.mid , trackName transceiver.sender.track.id, }; }); peerConnection. ( peerConnection. ()); newLocalTrackResult app. ( trackObjects, peerConnection.localDescription.sdp, ); peerConnection. ( RTCSessionDescription(newLocalTrackResult.sessionDescription), ); = => : : ?? : = map setLocalDescription createOffer newTracks setRemoteDescription return await await const await await new "local" "1" // POST /session/sessionid/tracks/new
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 if switch case await new await await await break case throw new (newRemoteTracksResult.sessionDescription) { (newRemoteTracksResult.sessionDescription.type) { . ( ${sessionId} ); peerConnection. ( RTCSessionDescription(newRemoteTracksResult.sessionDescription), ); peerConnection. ( peerConnection. (), ); app. (peerConnection.localDescription.sdp); ; Error( ); } } "offer" `Renegotiating for session ` "answer" "An offer SDP was expected" : console : log setRemoteDescription setLocalDescription createAnswer sendAnswerSDP
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 const new let if const await const new return remoteTrackPromise ((resolve) { tracks []; peerConnection. (event) { tracks. (event.track); . ( ${event.track.id} ${event.track.mid} ); (tracks.length ) { (tracks); } }; }); remoteTracks remoteTrackPromise; remoteStream MediaStream(); remoteTracks. ((track) { remoteStream. (track); }); remoteStream; = Promise => = = => console >= = = => ontrack push debug resolve forEach addTrack `Got track mid= ` 2
まとめ 現状だとまだある程度 WebRTC の初期知識が必要で、すぐに 簡単に使える!というものではなD ある意味無限スケーリングするSFU・TURN Serverというもの がほぼ初めて存在しているので、何か面白いことが出来そうなも
のではあi DataChannelとかも使える & WHIPの参考実装などもあi Realtime Kitたのしみ!
Cloudflare Realtime ぜひ遊んでみてね!