# TODO: Звонки и межсерверность ## Текущее ограничение - Текущая реализация звонков фактически работает в одном сигнальном контуре (один сервер/единый кластер, где обе стороны уже присутствуют). - Если пользователь A подключён к серверу A, а пользователь B к серверу B (и между ними нет общего сигнального слоя), `CallInviteBroadcast`/`CallSignalToSession` не смогут полноценно провести звонок между ними. ## Почему так сейчас - Сигналинг звонка привязан к активным сессиям и событиям на конкретном сервере. - Выбор целевой сессии (`sessionId`) и обмен `OFFER/ANSWER/ICE` происходит в рамках текущего сигнального контура. - Push решает только «разбудить/уведомить», но не заменяет межсерверный сигнальный канал. ## Что можно сделать дальше - Добавить временное межсерверное подключение именно для старта и ведения звонка: - инициатор получает short-lived access на сервер callee (или через доверенный межсерверный gateway), - в рамках короткой сессии отправляет invite/signal для конкретного `callId`, - после завершения звонка временная сессия закрывается автоматически. ## Что нужно доработать для этого 1. Межсерверная доверенная модель: - подпись/верификация межсерверных вызовов, - allowlist доверенных серверов и ротация ключей. 2. Короткоживущая «call-only» авторизация: - отдельный тип токена/сессии с TTL (например 1–3 минуты), - минимальные права только на `CallInviteBroadcast/CallSignalToSession`. 3. Маршрутизация сессий пользователя между серверами: - где находится активная сессия callee, - как доставлять `stop_call` и terminal-сигналы на все устройства callee. 4. Идемпотентность и дедупликация: - защита от повторов межсерверных сигналов по `callId + eventId`, - корректная обработка out-of-order событий. 5. Наблюдаемость: - метрики межсерверной доставки сигналов, - диагностика по стадиям звонка и причинам срыва. ## Временный рабочий подход (до межсерверности) - Держать звонки в одном сигнальном контуре. - Использовать WebPush как fallback-уведомление (`incoming_call`/`stop_call`) для офлайн-сессий.