SHiNE-server/TODO_Звонки_межсерверность.md

3.3 KiB
Raw Permalink Blame History

TODO: Звонки и межсерверность

Текущее ограничение

  • Текущая реализация звонков фактически работает в одном сигнальном контуре (один сервер/единый кластер, где обе стороны уже присутствуют).
  • Если пользователь A подключён к серверу A, а пользователь B к серверу B (и между ними нет общего сигнального слоя), CallInviteBroadcast/CallSignalToSession не смогут полноценно провести звонок между ними.

Почему так сейчас

  • Сигналинг звонка привязан к активным сессиям и событиям на конкретном сервере.
  • Выбор целевой сессии (sessionId) и обмен OFFER/ANSWER/ICE происходит в рамках текущего сигнального контура.
  • Push решает только «разбудить/уведомить», но не заменяет межсерверный сигнальный канал.

Что можно сделать дальше

  • Добавить временное межсерверное подключение именно для старта и ведения звонка:
  • инициатор получает short-lived access на сервер callee (или через доверенный межсерверный gateway),
  • в рамках короткой сессии отправляет invite/signal для конкретного callId,
  • после завершения звонка временная сессия закрывается автоматически.

Что нужно доработать для этого

  1. Межсерверная доверенная модель:
  • подпись/верификация межсерверных вызовов,
  • allowlist доверенных серверов и ротация ключей.
  1. Короткоживущая «call-only» авторизация:
  • отдельный тип токена/сессии с TTL (например 13 минуты),
  • минимальные права только на CallInviteBroadcast/CallSignalToSession.
  1. Маршрутизация сессий пользователя между серверами:
  • где находится активная сессия callee,
  • как доставлять stop_call и terminal-сигналы на все устройства callee.
  1. Идемпотентность и дедупликация:
  • защита от повторов межсерверных сигналов по callId + eventId,
  • корректная обработка out-of-order событий.
  1. Наблюдаемость:
  • метрики межсерверной доставки сигналов,
  • диагностика по стадиям звонка и причинам срыва.

Временный рабочий подход (до межсерверности)

  • Держать звонки в одном сигнальном контуре.
  • Использовать WebPush как fallback-уведомление (incoming_call/stop_call) для офлайн-сессий.