gst_plugin_webrtc_signalling_protocol/
lib.rs1use serde::{Deserialize, Serialize};
5
6#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
7#[serde(rename_all = "camelCase")]
8pub struct Peer {
9 pub id: String,
10 #[serde(default)]
11 pub meta: Option<serde_json::Value>,
12}
13
14#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
15#[serde(tag = "type")]
16#[serde(rename_all = "camelCase")]
17pub enum OutgoingMessage {
19 #[serde(rename_all = "camelCase")]
21 Welcome { peer_id: String },
22 PeerStatusChanged(PeerStatus),
24 #[serde(rename_all = "camelCase")]
26 StartSession {
27 peer_id: String,
28 session_id: String,
29 offer: Option<String>,
30 },
31 #[serde(rename_all = "camelCase")]
33 SessionStarted { peer_id: String, session_id: String },
34 EndSession(EndSessionMessage),
36 Peer(PeerMessage),
38 #[serde(rename_all = "camelCase")]
40 List { producers: Vec<Peer> },
41 #[serde(rename_all = "camelCase")]
43 ListConsumers { consumers: Vec<Peer> },
44 #[serde(rename_all = "camelCase")]
46 Error { details: String },
47}
48
49#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
50#[serde(rename_all = "camelCase")]
51pub enum PeerRole {
53 Producer,
55 Listener,
57 Consumer,
59}
60
61#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Default, Clone)]
62#[serde(rename_all = "camelCase")]
63pub struct PeerStatus {
64 pub roles: Vec<PeerRole>,
65 pub meta: Option<serde_json::Value>,
66 #[serde(skip_serializing_if = "Option::is_none")]
67 #[serde(default)]
68 pub peer_id: Option<String>,
69}
70
71impl PeerStatus {
72 pub fn producing(&self) -> bool {
73 self.roles.iter().any(|t| matches!(t, PeerRole::Producer))
74 }
75
76 pub fn listening(&self) -> bool {
77 self.roles.iter().any(|t| matches!(t, PeerRole::Listener))
78 }
79
80 pub fn consuming(&self) -> bool {
81 self.roles.iter().any(|t| matches!(t, PeerRole::Consumer))
82 }
83}
84
85#[derive(Serialize, Deserialize, Debug)]
86#[serde(rename_all = "camelCase")]
87pub struct StartSessionMessage {
89 pub peer_id: String,
91 pub offer: Option<String>,
93}
94
95#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
96#[serde(tag = "type")]
97#[serde(rename_all = "camelCase")]
98pub enum SdpMessage {
100 #[serde(rename_all = "camelCase")]
102 Offer {
103 sdp: String,
105 },
106 #[serde(rename_all = "camelCase")]
108 Answer {
109 sdp: String,
111 },
112}
113
114#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
115#[serde(rename_all = "camelCase")]
116pub enum PeerMessageInner {
118 #[serde(rename_all = "camelCase")]
120 Ice {
121 candidate: String,
123 sdp_m_line_index: u32,
125 },
126 Sdp(SdpMessage),
127}
128
129#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
130#[serde(rename_all = "camelCase")]
131pub struct PeerMessage {
133 pub session_id: String,
134 #[serde(flatten)]
135 pub peer_message: PeerMessageInner,
136}
137
138#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
139#[serde(rename_all = "camelCase")]
140pub struct EndSessionMessage {
142 pub session_id: String,
144}
145
146#[derive(Serialize, Deserialize, Debug)]
147#[serde(tag = "type")]
148#[serde(rename_all = "camelCase")]
149pub enum IncomingMessage {
151 NewPeer,
153 SetPeerStatus(PeerStatus),
155 StartSession(StartSessionMessage),
157 EndSession(EndSessionMessage),
159 Peer(PeerMessage),
161 List,
163 ListConsumers,
165}