42 lines
3.3 KiB
Markdown
42 lines
3.3 KiB
Markdown
# 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`) для офлайн-сессий.
|