До изменения браузер ждал 10 секунд общего сбора, затем Core — ещё около 5 секунд. Полный Trickle ICE передаёт готовый SDP сразу и присылает каждый кандидат отдельно.
1. Браузер → Core
Готовый SDP отправляется сразу. Кандидаты передаются по защищённому WebSocket по мере появления.
2. Core ↔ браузер
Core параллельно собирает host/STUN/TURN и проверяет уже доступные пары. Медленный STUN на другом интерфейсе не задерживает рабочую пару.
3. TURN → PCM → чат
Установлены DTLS и Opus/RTP. Контрольная речь дала partial, final и ответ «2 плюс 2 будет 4!». История восстановилась после reload.
Пять последовательных подключений
Local SDP → connected: 1363 · 1229 · 1245 · 1287 · 1243 мс. Медиана — 1245 мс. Сервер ещё собирал кандидаты; RTP уже передавался.
Проверены legacy offer, несовпадающий NAT-порт, неверный токен, отказ без OAuth и сохранение аудио после потери ICE-канала. TCP host-кандидаты Chrome пропускаются без отмены UDP-пар.
Что именно подтверждено
Core a925c28 и Frontend 95595f2 подтверждены в Insight по OCI revision и Image ID, совпавшему с CI build. Checks и выборочные сборки успешны; полный DRS deploy не потребовался.
Изолированный тест на aiortc 1.14.0 / aioice 0.10.2 передаёт реальные Opus/RTP/PCM при зависшем STUN на обеих сторонах. Production WAV использовал синтетический ввод и продолжающуюся тишину после речи.
Физический микрофон, WER/DER и точное время до первого PCM до изменения не измерялись. STUN/TURN сохранены. ICE restart и автоматическое переподключение не добавлены.
Код и проверка
- Полный отчёт приёмкиТочные SHA, CI, Image ID, входные данные, замеры и ограничения.
- Протокол сигнализацииМаршруты, токен, очереди, таймауты, cleanup и legacy.
- Полный Trickle ICE · Совместимость кандидатов Chrome