Sekce
Technologie
Skutečný stack Dueli ve dvou vrstvách: vysvětlení obyčejnou řečí a inženýrský pohled.
Tahle stránka vysvětluje technologie, které Dueli skutečně používá, ve dvou vrstvách: pohled obyčejnou řečí pro každého a inženýrský pohled pro odborníky. Uvedeny jsou jen technologie, které aktuální kód opravdu používá.
Obyčejnou řečí
Dueli běží v prohlížeči na globální síti Cloudflare. Dva soutěžící se potkají v živém videohovoru mezi svými zařízeními (WebRTC peer-to-peer); když síť zablokuje přímou cestu, pomůže spojení TURN relé.
Během soutěže prohlížeč spojí oba obrazy z kamer do jednoho obrazu a nahrává ho v krátkých 5sekundových segmentech. Segmenty se odesílají, jakmile vzniknou, dají se přehrát v pořadí a po skončení zápasu se sestaví do kompletního přehrání.
Soutěže se záznamem si můžeš stáhnout jako soubor MP4. Když záznam potřebuje převod, běží převod přímo v prohlížeči návštěvníka pomocí FFmpeg.wasm, takže soubor se neposílá do žádné externí převodní služby.
Data platformy žijí v D1, stránky a API jsou postavené na Hono a TypeScriptu nad Cloudflare a rozhraní používá Tailwind CSS. Živé aktualizace přicházejí přes SSE a polling.
Pro inženýry
Běhové prostředí: Cloudflare Pages/Workers s Hono 4 na TypeScriptu. Databází je D1 (SQLite). Bundle Workera sestavuje Vite, rozhraní styluje Tailwind CSS 4 a vstupní body prohlížeče balí esbuild.
Živá média: RTCPeerConnection v prohlížeči přenáší WebRTC mezi hostitelem a soupeřem. ICE servery se vystavují na každou relaci z GET /api/signaling/ice-servers; reléovat může Cloudflare Calls TURN (TURN_TOKEN_ID a TURN_API_TOKEN) nebo vlastní coturn (TURN_URL a TURN_SECRET), a když není nakonfigurované ani jedno, zbývá náhrada jen se STUN.
Nahrávání: kompozitor na canvasu kreslí oba obrazy a MediaRecorder vydává segment každých 5 sekund. Hostitel každý segment zaregistruje na POST /api/chunks/register (krátkodobý jednorázový klíč vázaný na soutěž, pořadí a limit bajtů), odešle ho, ověří přes GET /verify a ohlásí POST /receipt. Přehrávání čte GET /api/chunks/playlist/:id a stávající krok finalize vytvoří VOD.
Stahování: @ffmpeg/core 0.12.10 běží ve vlastním workeru v prohlížeči a převádí do MP4, pro záznamy už kompatibilní s MP4 existuje cesta strukturálního remuxu. Průběh a limity paměti řeší služba na straně klienta.
Realtime: SSE přes GET /api/sse přenáší živé aktualizace a signalizace používá HTTP polling; produkční cesta WebSocket nepoužívá.
Kvalita: Vitest pokrývá jednotkové a UI kontrakty a Playwright pokrývá end-to-end toky v prohlížeči. Dokumenty v Markdownu se renderují přes marked a PostCSS s Autoprefixerem dokončuje CSS pipeline.
Stack v tomto repozitáři
- Cloudflare Pages / Workers Hosting a serverové běhové prostředí
- Cloudflare D1 (SQLite) Databáze aplikace
- Hono 4 HTTP trasy, stránky a API
- TypeScript 5 Typovaný zdrojový kód pro server i klienta
- Tailwind CSS 4 + PostCSS + Autoprefixer Stylování rozhraní a CSS pipeline
- Vite 7 + esbuild Bundle Workera a vstupní body prohlížeče
- WebRTC (RTCPeerConnection) + TURN/STUN Živý zvuk a video mezi účastníky
- Canvas compositor + MediaRecorder 5sekundové nahrané segmenty v prohlížeči
- FFmpeg.wasm (@ffmpeg/core 0.12.10) Převod do MP4 a stahování přímo v prohlížeči
- marked 17 Renderování Markdownu pro spravované dokumenty
- Vitest 5 Sada jednotkových a UI testů
- Playwright End-to-end testy prohlížeče
- Wrangler 4 Vývojové a nasazovací nástroje pro Cloudflare
- SSE + HTTP polling Živé aktualizace mimo cestu médií
Seznam je omezen na to, co package.json a repozitář skutečně obsahují. Je to technický popis, ne tvrzení o partnerství nebo doporučení.