ส่วน
เทคโนโลยี
สแตกจริงของ Dueli ในสองชั้น: คำอธิบายภาษาง่าย ๆ และมุมมองวิศวกรรม
หน้านี้อธิบายเทคโนโลยีที่ Dueli ใช้จริงในสองชั้น: มุมมองภาษาง่ายสำหรับทุกคน และมุมมองวิศวกรรมสำหรับผู้เชี่ยวชาญ ไม่มีการระบุเทคโนโลยีใดเว้นแต่โค้ดปัจจุบันใช้มัน
อธิบายแบบเข้าใจง่าย
Dueli ทำงานในเบราว์เซอร์บนเครือข่ายระดับโลกของ Cloudflare ผู้แข่งขันสองคนประจันหน้ากันในการเรียกวิดีโอสดระหว่างอุปกรณ์ของพวกเขา (WebRTC แบบ peer-to-peer) เมื่อเครือข่ายปิดกั้นเส้นทางตรง รีเลย์ TURN จะช่วยให้การเชื่อมต่อผ่านไปได้
ระหว่างการแข่งขัน เบราว์เซอร์รวมภาพจากกล้องทั้งสองเป็นภาพเดียวและบันทึกเป็นส่วนย่อยสั้น ๆ ชิ้นละ 5 วินาที ส่วนย่อยถูกอัปโหลดทันทีที่ผลิตได้ เล่นย้อนหลังตามลำดับได้ และถูกประกอบเป็นการเล่นซ้ำฉบับเต็มหลังการแข่งขันจบ
การแข่งขันที่บันทึกไว้ดาวน์โหลดเป็นไฟล์ MP4 ได้ เมื่อไฟล์บันทึกต้องแปลง การแปลงจะทำงานภายในเบราว์เซอร์ของผู้เยี่ยมชมด้วย FFmpeg.wasm ไฟล์จึงไม่ถูกส่งไปยังบริการแปลงภายนอก
ข้อมูลแพลตฟอร์มอยู่ใน D1 หน้าเว็บและ API สร้างด้วย Hono และ TypeScript บน Cloudflare และส่วนติดต่อใช้ Tailwind CSS การอัปเดตสดมาทาง SSE และ polling
สำหรับวิศวกร
รันไทม์: Cloudflare Pages/Workers พร้อม Hono 4 บน 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 compositor วาดภาพจากทั้งสองแหล่ง และ MediaRecorder ส่งออกส่วนย่อยทุก 5 วินาที ผู้จัดลงทะเบียนส่วนย่อยแต่ละชิ้นที่ POST /api/chunks/register (คีย์ครั้งเดียวอายุสั้นที่ผูกกับการแข่งขัน ลำดับ และเพดานไบต์) อัปโหลด ตรวจสอบด้วย GET /verify และรายงานที่ POST /receipt การเล่นย้อนหลังอ่านจาก GET /api/chunks/playlist/:id และขั้นตอนปิดกระบวนการที่มีอยู่จะผลิต VOD
การดาวน์โหลด: @ffmpeg/core 0.12.10 ทำงานในเวิร์กเกอร์เบราว์เซอร์ที่โฮสต์เองเพื่อแปลงเป็น MP4 พร้อมเส้นทาง remux เชิงโครงสร้างสำหรับไฟล์บันทึกที่รองรับ MP4 อยู่แล้ว ความคืบหน้าและขีดจำกัดหน่วยความจำจัดการในเซอร์วิสฝั่งไคลเอนต์
เรียลไทม์: SSE ผ่าน GET /api/sse ส่งการอัปเดตสด และการส่งสัญญาณใช้ HTTP polling เส้นทางในระบบผลิตจริงไม่ใช้ 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 compositor + MediaRecorder ส่วนย่อยบันทึกความยาว 5 วินาทีในเบราว์เซอร์
- FFmpeg.wasm (@ffmpeg/core 0.12.10) การแปลงเป็น MP4 และการดาวน์โหลดในเบราว์เซอร์
- marked 17 การเรนเดอร์ Markdown สำหรับเอกสารที่บริหารจัดการ
- Vitest 5 ชุดทดสอบยูนิตและ UI
- Playwright การทดสอบเบราว์เซอร์ตั้งแต่ต้นจนจบ
- Wrangler 4 เครื่องมือพัฒนาและดีพลอยของ Cloudflare
- SSE + HTTP polling การอัปเดตสดนอกเส้นทางสื่อ
รายการนี้จำกัดอยู่เฉพาะสิ่งที่ package.json และรีโพซิทอรีมีอยู่จริง เป็นคำอธิบายทางเทคนิค ไม่ใช่การอ้างหุ้นส่วนหรือการรับรอง