Skip to content

Подсистемы сервера

Сервер VideoGrace состоит из HTTP/WebSocket входа, процессора бизнес-логики, хранилищ runtime-состояния и media bridge. Главный принцип: control plane принимает решения, media plane только переносит RTP/RTCP.

flowchart TB
    Http[Server/Http/HttpServer.h<br/>HTTP + WebSocket accept]
    Processor[Server/Processor/Processor.cpp<br/>business logic]
    Clients[ClientContainer<br/>sessions, tokens, devices]
    Conferences[ConferenceContainer<br/>members, grants, conference state]
    Devices[DeviceContainer<br/>device ids, SSRC, codecs]
    WSM[WSMServer<br/>WSS media to UDP bridge]
    Blob[BlobManager<br/>files, images, voice, speed-test]
    IM[IMManager<br/>messages]
    API[API<br/>HTTP API]
    Security[Fail2Ban<br/>access protection]
    License[LicenseManager<br/>license grants]
    SSO[SSPIManager<br/>SSO negotiation]
    Timer[WorkTimer<br/>periodic jobs]
    Translator[TranslatorPool<br/>RTP/RTCP media routing]

    Http --> Processor
    Processor --> Clients
    Processor --> Conferences
    Processor --> Devices
    Processor --> WSM
    Processor --> Blob
    Processor --> IM
    Processor --> API
    Processor --> Security
    Processor --> License
    Processor --> SSO
    Processor --> Timer
    WSM <-->|UDP RTP/RTCP| Translator

HTTP/WebSocket вход

Server/Http/HttpServer.h принимает HTTP-запросы, WebSocket upgrade и маршрутизирует сообщения в Processor.

Основные обязанности:

  • разобрать WebSocket text frames как JSON-команды из Engine/Proto;
  • передать binary frames в Processor::WSBinary;
  • держать write queue для исходящих сообщений;
  • выполнять все записи одного WebSocket через executor/strand сессии.

Критичный инвариант: в один websocket::stream нельзя запускать async_write параллельно из разных потоков. Для WSMedia mux это особенно важно, потому что много SSRC пишут в одну WSS-сессию.

Processor

Server/Processor/Processor.cpp — центральный orchestrator.

Он отвечает за:

  • connect_request и выдачу access_token;
  • привязку дополнительных WSMedia и BlobChannel сессий к пользователю по token;
  • подключение к конференциям;
  • рассылку change_member_state, device_connect, device_disconnect;
  • управление grants, call flow, временными конференциями;
  • передачу бинарных media/blob frames в нужный subsystem.
sequenceDiagram
    participant WS as HttpServer WebSocket
    participant P as Processor
    participant C as ClientContainer
    participant Conf as ConferenceContainer
    participant WSM as WSMServer

    WS->>P: connect_request
    P->>C: add command session
    P-->>WS: connect_response(access_token)
    WS->>P: connect_to_conference_request
    P->>Conf: add member
    P-->>WS: connect_to_conference_response
    WS->>P: device_params / device_connect
    P-->>WS: device_connect my=1
    P-->>Conf: broadcast remote device_connect
    WS->>P: binary WSM frame
    P->>WSM: route by ssrc

Runtime containers

Подсистема Назначение
ClientContainer Связывает session_t, client_id, connection_id, access_token, тип клиента и тип канала. Хранит устройства клиента.
ConferenceContainer Хранит участников конференций, grants, порядок, видимость камеры/микрофона/демонстрации.
DeviceContainer Выдает device ids и media-параметры. Используется через ClientContainer и Processor.
TranslatorPool Управляет внутренними RTP/RTCP портами. Клиент получает порты через device_connect или media_addresses_list.
BlobManager Обрабатывает binary blob frames и команды загрузки/доставки blobs.
IMManager Обрабатывает доставку и загрузку сообщений.
UserList Работает с пользователями, группами и справочными данными из БД.

Security, license, SSO, timers

Подсистема Назначение
LicenseManager Проверяет лицензию, доступные каналы, запись, crypto, типы конференций и автономную работу.
Fail2Ban Защищает admin/API/client interfaces от повторных неуспешных попыток, хранит bans/protected адреса.
SSPIManager Временно хранит SSPI/SSO negotiation contexts до завершения логина.
WorkTimer Периодические задачи: проверка лицензии, расписания, auto-connects, обновление admin/API tokens.
API HTTP API для server info, users, groups, conferences, messages, redirect. Проверяет API token grants.
Leash::Calc Низкоуровневые расчеты license/expiration/install id.
flowchart LR
    Timer[WorkTimer]
    License[LicenseManager]
    API[API tokens]
    Schedule[Scheduled conferences]
    F2B[Fail2Ban]
    SSPI[SSPIManager]

    Timer --> License
    Timer --> API
    Timer --> Schedule
    F2B -->|blocks repeated failures| Processor
    SSPI -->|temporary auth state| Processor

Типы подключений

flowchart LR
    User[User credentials] --> Control[CommandLoop]
    Control --> Token[access_token]
    Token --> Blob[BlobChannel]
    Token --> Media[WSMedia]

    Control -->|state owner| Processor
    Blob -->|binary blob frames| BlobManager
    Media -->|binary media frames| WSMServer

CommandLoop логинится логином/паролем. BlobChannel и WSMedia подключаются по access_token, выданному на CommandLoop.

Где добавлять новую серверную логику

Задача Место
Новая JSON-команда Engine/Proto/Cmd*.h/.cpp, Engine/Proto/CommandType.*, switch в HttpServer.h, метод в IProcessor/Processor.
Новое состояние конференции ConferenceContainer, Processor, соответствующие Proto-структуры.
Новый тип устройства Proto/DeviceType.h, client/server device lifecycle, media attach в клиентах.
Новый бинарный media формат Engine/Transport/WSM/WSMHeader.h, media encoder/decoder, WSM demux.
Новый blob тип WsBinaryBlobHeader, BlobManager, client BlobChannel.

Правила безопасности состояния

  • Проверять авторизацию session перед любым control действием.
  • Дополнительные каналы принимать только по валидному access_token.
  • Не смешивать CommandLoop, BlobChannel, WSMedia.
  • Не полагаться на количество WebSocket-сессий как на количество устройств.
  • Для media routing использовать ssrc, для control lifecycle использовать device_id.