Подсистемы сервера
Сервер 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.