Skip to content

Сценарии протокола

Сценарии ниже используют текущий формат 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.