Розділ
Технології
Справжній стек Dueli у двох шарах: пояснення простою мовою та інженерний погляд.
Ця сторінка пояснює технології, які Dueli справді використовує, у двох шарах: погляд простою мовою для всіх та інженерний погляд для фахівців. Жодна технологія не перелічується, якщо чинний код її не використовує.
Простими словами
Dueli працює в браузері на глобальній мережі Cloudflare. Двоє учасників зустрічаються в живому відеозв'язку між своїми пристроями (WebRTC peer-to-peer); коли мережа блокує прямий шлях, ретранслятор TURN допомагає з'єднанню пройти.
Під час змагання браузер поєднує обидва відеопотоки з камер в одне зображення та записує його короткими 5-секундними фрагментами. Фрагменти завантажуються в міру створення, можуть відтворюватися по порядку, а після завершення поєдинку збираються в повний повтор.
Записані змагання можна завантажити як файл MP4. Коли запис потребує конвертації, вона відбувається в браузері відвідувача за допомогою FFmpeg.wasm, тож файл не надсилається до зовнішнього сервісу конвертації.
Дані платформи зберігаються в D1, сторінки та API побудовані з Hono і TypeScript на Cloudflare, а інтерфейс використовує Tailwind CSS. Живі оновлення надходять через SSE та опитування.
Для інженерів
Середовище виконання: 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 малює обидва потоки, а MediaRecorder випускає фрагмент кожні 5 секунд. Ведучий реєструє кожен фрагмент на POST /api/chunks/register (короткочасний одноразовий ключ, прив'язаний до змагання, послідовності та стелі байтів), завантажує його, перевіряє через GET /verify і повідомляє POST /receipt. Відтворення читає GET /api/chunks/playlist/:id, а наявний крок фіналізації створює VOD.
Завантаження: @ffmpeg/core 0.12.10 працює в самостійно розгорнутому браузерному воркері для конвертації в MP4, із шляхом структурного ремуксу для записів, уже сумісних із MP4. Прогрес і ліміти пам'яті опрацьовуються в клієнтському сервісі.
Реальний час: SSE через GET /api/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 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 і репозиторій справді містять. Це технічний опис, а не заява про партнерство чи підтримку.