Сценарии протокола
Сценарии ниже используют текущий формат JSON-команд VideoGrace: один top-level key на команду.
1. Логин обычного клиента
sequenceDiagram
participant Client
participant Server
Client->>Server: connect_request(CommandLoop, login/password)
Server-->>Client: connect_response(OK, id, connection_id, access_token)
Server-->>Client: conferences_list / contact_list / group_list
Запрос:
{
"connect_request": {
"client_type": 0,
"channel_type": 0,
"client_version": 100,
"system": "Web",
"login": "john@example.com",
"password": "secret"
}
}
Ответ:
{
"connect_response": {
"result": 1,
"server_version": 100,
"id": 223900001,
"connection_id": 1,
"access_token": "opaque-token",
"name": "John",
"server_name": "VideoGrace",
"options": 0,
"grants": 0,
"max_output_bitrate": 4096
}
}
2. Открытие WSMedia после логина
sequenceDiagram
participant Client
participant WSMedia
participant Server
Client->>WSMedia: open ws/wss
Client->>Server: connect_request(channel_type=WSMedia, access_token)
Server-->>Client: connect_response(OK)
Client->>Server: binary WSM media frames
Server-->>Client: binary WSM media frames
{
"connect_request": {
"channel_type": 1,
"access_token": "opaque-token"
}
}
3. Вход в конференцию
{
"connect_to_conference_request": {
"tag": "default",
"connect_members": 1,
"has_camera": 1,
"has_microphone": 1
}
}
После успешного входа сервер отправляет:
change_member_stateсо списком/изменением участников;connect_to_conference_response;device_connectдля уже существующих устройств, видимых текущему клиенту.
4. Публикация камеры
sequenceDiagram
participant Client
participant Server
participant M as Media
participant Other
Client->>Client: start local camera capture
Client->>Server: device_params(Camera)
Server-->>Client: device_connect(my=1, author_ssrc, port)
Client->>M: send RTP by author_ssrc
Server-->>Other: device_connect(my=0, receiver_ssrc, port)
Other->>M: send RTP init + ForceKeyFrame
device_params:
{
"device_params": {
"id": 0,
"ssrc": 0,
"device_type": 1,
"ord": 0,
"name": "Camera",
"metadata": "",
"resolution": 31457920,
"color_space": 0
}
}
Локальный device_connect:
{
"device_connect": {
"connect_type": 1,
"device_type": 1,
"device_id": 1001,
"client_id": 223900001,
"receiver_ssrc": 0,
"author_ssrc": 1208,
"address": "",
"port": 5061,
"name": "Camera",
"resolution": 31457920,
"color_space": 0,
"video_codec": 0,
"audio_codec": 0,
"my": 1,
"secure_key": "..."
}
}
5. Прием удаленного микрофона
Удаленный device_connect:
{
"device_connect": {
"connect_type": 2,
"device_type": 4,
"device_id": 1040,
"client_id": 223900007,
"receiver_ssrc": 1137,
"author_ssrc": 1136,
"address": "",
"port": 5060,
"name": "Microphone",
"audio_codec": 0,
"my": 0,
"secure_key": "..."
}
}
Receiver должен:
- создать audio renderer/session;
- зарегистрировать
receiver_ssrcв media demux; - отправить RTP init через
WSMediaилиrenderer_connectв native UDP path; - декодировать Opus RTP frames.
6. Сообщение в чат
{
"delivery_messages": {
"messages": [
{
"guid": "msg-uuid",
"dt": 1777440000,
"type": 1,
"author_id": 223900001,
"author_name": "John",
"sender_id": 223900001,
"sender_name": "John",
"subscriber_id": 0,
"subscriber_name": "",
"conference_tag": "default",
"conference_name": "Default",
"status": 1,
"text": "Hello",
"call_duration": 0,
"call_result": 0,
"preview": "",
"data": "",
"url": ""
}
]
}
}
7. Корректный выход
sequenceDiagram
participant Client
participant Server
participant Media
Client->>Server: device_disconnect(local camera)
Client->>Server: device_disconnect(local mic)
Client->>Media: unregister local/remote SSRC handlers
Client->>Server: disconnect_from_conference
Client->>Server: disconnect
Client->>Media: close WSMedia / UDP sockets
Правило: не закрывать общий WSMedia socket на каждый device_disconnect; закрывать его только на logout/conference cleanup или при transport-level reconnect.