Przejdź do treści głównej

Sekcja

Technologia

Prawdziwy stos technologiczny Dueli w dwóch warstwach: wyjaśnienie prostym językiem i ujęcie inżynierskie.

Ta strona wyjaśnia technologie, których Dueli faktycznie używa, w dwóch warstwach: ujęciu prostym językiem dla wszystkich i ujęciu inżynierskim dla specjalistów. Nie wymieniamy żadnej technologii, jeśli obecny kod jej nie wykorzystuje.

Prostym językiem

Dueli działa w przeglądarce w globalnej sieci Cloudflare. Dwóch uczestników spotyka się podczas wideo rozmowy na żywo między swoimi urządzeniami (WebRTC peer-to-peer); gdy sieć blokuje bezpośrednią ścieżkę, przekaźnik TURN pomaga połączeniu się przebić.

Podczas konkursu przeglądarka łączy oba obrazy z kamer w jeden obraz i nagrywa go krótkimi fragmentami po 5 sekund. Fragmenty są wysyłane na bieżąco, można je odtwarzać w kolejności, a po zakończeniu pojedynku składają się w pełne powtórki.

Nagrane konkursy można pobrać jako plik MP4. Gdy nagranie wymaga konwersji, odbywa się ona w przeglądarce odwiedzającego z użyciem FFmpeg.wasm, więc plik nie jest wysyłany do zewnętrznej usługi konwersji.

Dane platformy przechowuje baza D1, strony i interfejsy API zbudowano w technologii Hono i TypeScript w chmurze Cloudflare, a interfejs korzysta z Tailwind CSS. Aktualizacje na żywo docierają przez SSE i polling.

Dla inżynierów

Środowisko uruchomieniowe: Cloudflare Pages/Workers z Hono 4 w oparciu o TypeScript. Bazą danych jest D1 (SQLite). Vite buduje pakiet workera, Tailwind CSS 4 stylizuje interfejs, a esbuild pakuje punkty wejścia przeglądarki.

Multimedia na żywo: połączenie RTCPeerConnection w przeglądarce przenosi WebRTC między prowadzącym a przeciwnikiem. Serwery ICE są przydzielane na każdą sesję z GET /api/signaling/ice-servers; przekazywaniem może zająć się Cloudflare Calls TURN (TURN_TOKEN_ID i TURN_API_TOKEN) albo samodzielnie hostowany coturn (TURN_URL i TURN_SECRET), a gdy żadne nie jest skonfigurowane, stosowany jest awaryjny tryb wyłącznie STUN.

Nagrywanie: kompozytor canvas rysuje oba obrazy, a MediaRecorder emituje fragment co 5 sekund. Prowadzący rejestruje każdy fragment przez POST /api/chunks/register (krótkotrwały jednorazowy klucz powiązany z konkursem, kolejnością i limitem bajtów), wysyła go, weryfikuje przez GET /verify i raportuje przez POST /receipt. Odtwarzanie czyta GET /api/chunks/playlist/:id, a istniejący krok finalizacji tworzy nagranie VOD.

Pobieranie: @ffmpeg/core 0.12.10 działa w samodzielnie hostowanym worku przeglądarkowym na potrzeby konwersji do MP4, ze strukturalną ścieżką remuxowania dla nagrań już zgodnych z MP4. Postęp i limity pamięci obsługuje usługa po stronie klienta.

Czas rzeczywisty: SSE przez GET /api/sse przenosi aktualizacje na żywo, a sygnalizacja korzysta z pollingu HTTP; ścieżka produkcyjna nie używa WebSocket.

Jakość: Vitest pokrywa testy jednostkowe i kontrakty interfejsu, a Playwright pokrywa przepływy przeglądarkowe end-to-end. Dokumenty Markdown są renderowane za pomocą marked, a PostCSS z Autoprefixer domyka potok CSS.

Stos technologiczny w tym repozytorium

  • Cloudflare Pages / Workers Hosting i środowisko uruchomieniowe serwera
  • Cloudflare D1 (SQLite) Baza danych aplikacji
  • Hono 4 Trasy HTTP, strony i API
  • TypeScript 5 Typowany kod źródłowy serwera i klienta
  • Tailwind CSS 4 + PostCSS + Autoprefixer Stylizacja interfejsu i potok CSS
  • Vite 7 + esbuild Pakiet workera i punkty wejścia przeglądarki
  • WebRTC (RTCPeerConnection) + TURN/STUN Dźwięk i wideo na żywo między uczestnikami
  • Canvas compositor + MediaRecorder Fragmenty nagrania po 5 sekund w przeglądarce
  • FFmpeg.wasm (@ffmpeg/core 0.12.10) Konwersja do MP4 i pobieranie w przeglądarce
  • marked 17 Renderowanie Markdown dla dokumentów zarządzanych
  • Vitest 5 Zestaw testów jednostkowych i interfejsu
  • Playwright Testy przeglądarkowe end-to-end
  • Wrangler 4 Narzędzia Cloudflare do tworzenia i wdrażania
  • SSE + HTTP polling Aktualizacje na żywo poza ścieżką multimedialną

Lista ogranicza się do tego, co faktycznie zawierają package.json i repozytorium. To opis techniczny, a nie deklaracja partnerstwa ani rekomendacji.

Powrót do centrum przewodnika