Skip to main content

o_sfu_protocol/core/
server_events.rs

1use super::{Command, Commands, ProtocolCore, ProtocolEvent};
2use crate::signaling::{ServerMessage, TrackBinding};
3
4pub(super) fn handle_server_message(core: &mut ProtocolCore, message: ServerMessage) -> Commands {
5    match message {
6        ServerMessage::Welcome(payload) => core.accept_welcome(payload),
7        ServerMessage::Tracks(bindings) => replace_track_snapshot(core, bindings),
8        ServerMessage::Sources(_) => Vec::new(),
9        ServerMessage::PeerInfo(payload) | ServerMessage::PeerJoined(payload) => {
10            vec![Command::EmitEvent {
11                event: ProtocolEvent::PeerInfo {
12                    user_id: payload.user_id,
13                    info: payload.info,
14                },
15            }]
16        }
17        ServerMessage::PeerLeft(payload) => {
18            core.track_bindings
19                .retain(|_, binding| binding.user_id != payload.user_id);
20            vec![Command::EmitEvent {
21                event: ProtocolEvent::PeerLeft {
22                    user_id: payload.user_id,
23                },
24            }]
25        }
26        ServerMessage::Broadcast(payload) => vec![Command::EmitEvent {
27            event: ProtocolEvent::Broadcast {
28                sender_id: payload.sender_id,
29                message: payload.message,
30            },
31        }],
32        ServerMessage::RecordingChange(payload) => vec![
33            Command::SetRecordingState {
34                state: payload.state.clone(),
35            },
36            Command::EmitEvent {
37                event: ProtocolEvent::RecordingStateChanged { state: payload },
38            },
39        ],
40    }
41}
42
43fn replace_track_snapshot(core: &mut ProtocolCore, bindings: Vec<TrackBinding>) -> Commands {
44    core.track_bindings = bindings
45        .iter()
46        .cloned()
47        .map(|binding| (binding.mid.clone(), binding))
48        .collect();
49    vec![Command::EmitEvent {
50        event: ProtocolEvent::TrackSnapshot { bindings },
51    }]
52}