Раздел
Технологии
Реальный стек 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, а существующий шаг финализации produces VOD.
Скачивания: @ffmpeg/core 0.12.10 работает в самохостинговом браузерном воркере для конвертации в MP4, с путем структурного ремукса для записей, уже совместимых с MP4. Прогресс и пределы памяти обрабатываются в клиентском сервисе.
В реальном времени: SSE через GET /api/sse несет обновления в реальном времени, а сигнализация использует HTTP-опрос; в производственном пути WebSocket не используется.
Качество: Vitest покрывает юнит-тесты и UI-контракты, а Playwright покрывает end-to-end браузерные потоки. 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 Сборка воркеров и точек входа в браузере
- WebRTC (RTCPeerConnection) + TURN/STUN Прямое аудио и видео между участниками
- Компоновщик Canvas + MediaRecorder Фрагменты записи по 5 секунд в браузере
- FFmpeg.wasm (@ffmpeg/core 0.12.10) Конвертация MP4 и загрузка в браузере
- marked 17 Отрисовка Markdown для управляемых документов
- Vitest 5 Набор тестов единиц и UI
- Playwright Сквозные тесты браузера
- Wrangler 4 Инструменты разработки и развертывания на Cloudflare
- SSE + HTTP опросы Обновления в реальном времени вне медиапути
Список ограничен тем, что содержится в package.json и репозитории. Это техническое описание, а не заявление о партнерстве или поддержке.