セクション
技術
実際のDueliスタックを二つの層で: 平易な言語の説明とエンジニアリングの視点。
このページでは、Dueliが実際に使用する技術を、2つの層で説明します:すべての人のための平易な見解と、専門家のためのエンジニアリングの見解です。現在のコードで使用されていない技術はリストにありません。
平易に言うと
DueliはCloudflareのグローバルネットワーク上でブラウザで実行されます。2人の競技者が、それぞれのデバイス間でライブビデオコールで対戦します(WebRTCピアツーピア);ネットワークが直接の経路をブロックした場合、TURNリレーが接続を支援します。
競技中、ブラウザは両方のカメラ映像を1つの画像に組み合わせ、5秒の短いチャンクとして記録します。チャンクは生成され次第アップロードされ、順番に再生でき、試合終了後に完全なリプレイに組み立てられます。
記録された競技はMP4ファイルとしてダウンロードできます。変換が必要な場合、変換は訪問者のブラウザ内でFFmpeg.wasmで実行されるため、ファイルは外部の変換サービスに送信されません。
プラットフォームのデータはD1に保存され、ページとAPIはCloudflare上でHonoとTypeScriptで構築され、インターフェースはTailwind CSSを使用します。ライブ更新はSSEとポーリングで到着します。
エンジニア向け
ランタイム:Cloudflare Pages/Workers、Hono 4 on TypeScript。D1(SQLite)がデータベース。ViteがWorkerバンドルをビルド、Tailwind CSS 4がインターフェースをスタイルし、esbuildがブラウザのエントリーポイントをバンドルします。
ライブメディア:ブラウザのRTCPeerConnectionがホストと対戦者の間でWebRTCを伝送します。ICEサーバーはセッションごとにGET /api/signaling/ice-serversから発行されます。Cloudflare Calls TURN(TURN_TOKEN_IDとTURN_API_TOKEN)またはセルフホストのcoturn(TURN_URLとTURN_SECRET)がリレーでき、どちらも設定されていない場合はSTUNのみのフォールバックが使用されます。
録画:canvasコンポジターが両方の映像を描画し、MediaRecorderが5秒ごとにチャンクを出力します。ホストは各チャンクをPOST /api/chunks/registerに登録(競技、シーケンス、バイト上限にバインドされた短期間のワンタイムキー)、アップロードし、GET /verifyで検証し、POST /receiptで報告します。再生はGET /api/chunks/playlist/:idを読み取り、既存のfinalizeステップがVODを生成します。
ダウンロード:@ffmpeg/core 0.12.10がセルフホストのブラウザワーカー内でMP4変換を実行し、既にMP4互換の録画用には構造的なリmuxパスを使用します。進捗とメモリ制限はクライアントサービスで処理されます。
リアルタイム:GET /api/sse経由のSSEがライブ更新を伝え、シグナリングはHTTPポーリングを使用します。本番環境のパスではWebSocketは使用されません。
品質:VitestがユニットとUIコントラクトをカバーし、Playwrightがエンドツーエンドのブラウザフローをカバーします。Markdownドキュメントはmarkedでレンダリングされ、PostCSSとAutoprefixerがCSSパイプラインを完成させます。
このリポジトリのスタック
- Cloudflare Pages / Workers ホスティングとサーバーランタイム
- Cloudflare D1 (SQLite) アプリケーションデータベース
- Hono 4 HTTPルート、ページとAPI
- TypeScript 5 サーバーとクライアントのための型付きソース
- Tailwind CSS 4 + PostCSS + Autoprefixer インターフェースのスタイリングとCSSパイプライン
- Vite 7 + esbuild Workerバンドルとブラウザのエントリーポイント
- WebRTC (RTCPeerConnection) + TURN/STUN 参加者間のライブ音声と映像
- Canvasコンポジッター + MediaRecorder ブラウザ内での5秒録画チャンク
- FFmpeg.wasm (@ffmpeg/core 0.12.10) ブラウザ内でのMP4変換とダウンロード
- marked 17 管理されたドキュメント用のMarkdownレンダリング
- Vitest 5 ユニットテストとUIテストスイート
- Playwright エンドツーエンドのブラウザテスト
- Wrangler 4 Cloudflareの開発とデプロイメントツール
- SSE + HTTPポーリング メディアパス外でのライブ更新
このリストはpackage.jsonとリポジトリに実際に含まれるものに限定されています。これは技術的な説明であり、提携や承認を主張するものではありません。