Конференция и устройства
Подключение к конференции и публикация устройств разделены. Сначала клиент входит в конференцию, затем создаёт локальные устройства через device_params, а сервер рассылает device_connect.
sequenceDiagram
participant Client
participant Control as CommandLoop
participant Processor
participant Conference
participant Other as Other clients
Client->>Control: connect_to_conference_request(tag, has_camera, has_microphone)
Control->>Processor: request
Processor->>Conference: add member / update state
Processor-->>Client: connect_to_conference_response
Processor-->>Client: existing device_connect events
Processor-->>Other: member/device updates
Client->>Client: start local capture
Client->>Control: device_params(type, resolution, ssrc, metadata)
Control->>Processor: create device
Processor-->>Client: device_connect(my=1, author_ssrc, port, secure_key)
Processor-->>Other: device_connect(my=0, receiver_ssrc, port, secure_key)
Local publish flow
flowchart TB
Toggle[User toggles mic/cam/screen on]
Capture[Start local capture]
Params[Send device_params]
Created[Receive device_connect my=1]
Attach[Register author_ssrc in media transport]
Encode[Encode Opus/VP8]
Send[Send WSM media frames]
Toggle --> Capture --> Params --> Created --> Attach --> Encode --> Send
Remote receive flow
flowchart TB
Event[device_connect my=0]
Session[Create MediaChannel]
Register[Register receiver_ssrc in mux]
Init[Send RTP init]
Keyframe[Video: send ForceKeyFrame RTCP]
Receive[Receive RTP frames by SSRC]
Decode[Decode and render/play]
Event --> Session --> Register --> Init --> Keyframe --> Receive --> Decode
Init --> Receive
Device disconnect
sequenceDiagram
participant Client
participant Control
participant Processor
participant MediaMux
Client->>Control: disconnect_device(device_id)
Client->>MediaMux: unregister ssrc
Control->>Processor: delete device
Processor-->>Client: device_disconnect
Processor-->>OtherClients: device_disconnect
Note over MediaMux: shared media transport remains open
Практические правила
device_idнужен для control lifecycle и UI.author_ssrcиспользуется для локальной отправки.receiver_ssrcиспользуется для remote receive и demux.portуказывает внутренний media endpoint на сервере/translator.secure_keyприменяется на RTP payload level, а не на WebSocket session level.