o_sfu_protocol/core/
server_events.rs1use 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}