Hopp til hovedinnhold

Seksjon

Teknologi

Den ekte Dueli-stakken i to lag: en forklaring i vanlig språk og et ingeniørperspektiv.

Denne siden forklarer teknologiene Dueli faktisk bruker, i to lag: et perspektiv i vanlig språk for alle og et ingeniørperspektiv for spesialister. Ingen teknologi er oppført med mindre den nåværende koden bruker den.

I klartekst

Dueli kjører i nettleseren på Cloudflares globale nettverk. To deltakere møtes i en direktevideosamtale mellom enhetene sine (WebRTC peer-to-peer); når et nettverk blokkerer den direkte veien, hjelper et TURN-relé tilkoblingen gjennom.

Under en konkurranse kombinerer nettleseren begge kamerastrømmene til ett bilde og tar det opp som korte 5-sekundersdeler. Delene lastes opp etter hvert som de produseres, kan spilles av i rekkefølge, og settes sammen til en full reprise etter at konkurransen er over.

Innspilte konkurranser kan lastes ned som en MP4-fil. Når et opptak trenger konvertering, kjører konverteringen i nettleseren til den besøkende med FFmpeg.wasm, slik at filen ikke sendes til en ekstern konverteringstjeneste.

Plattformdataene ligger i D1, sider og API-er er bygget med Hono og TypeScript på Cloudflare, og grensesnittet bruker Tailwind CSS. Live-oppdateringer kommer gjennom SSE og polling.

For ingeniører

Kjøretid: Cloudflare Pages/Workers med Hono 4 på TypeScript. D1 (SQLite) er databasen. Vite bygger Worker-bunten, Tailwind CSS 4 styler grensesnittet, og esbuild bunter nettleserinngangspunktene.

Live medier: en RTCPeerConnection i nettleseren bærer WebRTC mellom vert og motstander. ICE-servere utstedes per økt fra GET /api/signaling/ice-servers; Cloudflare Calls TURN (TURN_TOKEN_ID og TURN_API_TOKEN) eller selvhostet coturn (TURN_URL og TURN_SECRET) kan fungere som relé, med en reserve som kun bruker STUN når ingen av dem er konfigurert.

Opptak: en canvas-kompositor tegner begge strømmene, og MediaRecorder avgir en del hvert 5. sekund. Verten registrerer hver del på POST /api/chunks/register (en kortlivet engangsnøkkel bundet til konkurransen, rekkefølgen og taket i byte), laster den opp, verifiserer den med GET /verify og rapporterer POST /receipt. Avspilling leser GET /api/chunks/playlist/:id, og det eksisterende ferdigstillingstrinnet produserer VOD-en.

Nedlastinger: @ffmpeg/core 0.12.10 kjører i en selvhostet nettleserarbeider for MP4-konvertering, med en strukturell remux-rute for opptak som allerede er MP4-kompatible. Fremdrift og minnegrenser håndteres i klienttjenesten.

Sanntid: SSE gjennom GET /api/sse bærer live-oppdateringer, og signalisering bruker HTTP-polling; produksjonsruten bruker ikke WebSocket.

Kvalitet: Vitest dekker enhets- og UI-kontrakter, og Playwright dekker ende-til-ende-nettleserflyter. Markdown-dokumenter rendres med marked, og PostCSS med Autoprefixer fullfører CSS-rørledningen.

Stakken i dette repositoriet

  • Cloudflare Pages / Workers Hosting og serverkjøretid
  • Cloudflare D1 (SQLite) Applikasjonsdatabase
  • Hono 4 HTTP-ruter, sider og API
  • TypeScript 5 Typebeskrevet kildekode for server og klient
  • Tailwind CSS 4 + PostCSS + Autoprefixer Grensesnittstyling og CSS-rørledning
  • Vite 7 + esbuild Worker-bunt og nettleserinngangspunkter
  • WebRTC (RTCPeerConnection) + TURN/STUN Live lyd og video mellom deltakere
  • Canvas-kompositor + MediaRecorder 5-sekunders opptaksdeler i nettleseren
  • FFmpeg.wasm (@ffmpeg/core 0.12.10) MP4-konvertering og nedlasting i nettleseren
  • marked 17 Markdown-gjengivelse for administrerte dokumenter
  • Vitest 5 Enhets- og UI-testpakke
  • Playwright Ende-til-ende-nettlesertester
  • Wrangler 4 Utviklings- og utrullingsverktøy for Cloudflare
  • SSE + HTTP-polling Live-oppdateringer utenfor medieruten

Listen er begrenset til det package.json og repositoriet faktisk inneholder. Det er en teknisk beskrivelse, ikke et påstand om partnerskap eller anbefaling.

Tilbake til veiledningssenteret