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 { peer_id: String, session_id: String },
27 #[serde(rename_all = "camelCase")]
29 SessionStarted { peer_id: String, session_id: String },
30 EndSession(EndSessionMessage),
32 Peer(PeerMessage),
34 #[serde(rename_all = "camelCase")]
36 List { producers: Vec<Peer> },
37 #[serde(rename_all = "camelCase")]
39 Error { details: String },
40}
41
42#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
43#[serde(rename_all = "camelCase")]
44pub enum PeerRole {
46 Producer,
48 Listener,
50}
51
52#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Default, Clone)]
53#[serde(rename_all = "camelCase")]
54pub struct PeerStatus {
55 pub roles: Vec<PeerRole>,
56 pub meta: Option<serde_json::Value>,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 #[serde(default)]
59 pub peer_id: Option<String>,
60}
61
62impl PeerStatus {
63 pub fn producing(&self) -> bool {
64 self.roles.iter().any(|t| matches!(t, PeerRole::Producer))
65 }
66
67 pub fn listening(&self) -> bool {
68 self.roles.iter().any(|t| matches!(t, PeerRole::Listener))
69 }
70}
71
72#[derive(Serialize, Deserialize, Debug)]
73#[serde(rename_all = "camelCase")]
74pub struct StartSessionMessage {
76 pub peer_id: String,
78}
79
80#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
81#[serde(tag = "type")]
82#[serde(rename_all = "camelCase")]
83pub enum SdpMessage {
85 #[serde(rename_all = "camelCase")]
87 Offer {
88 sdp: String,
90 },
91 #[serde(rename_all = "camelCase")]
93 Answer {
94 sdp: String,
96 },
97}
98
99#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
100#[serde(rename_all = "camelCase")]
101pub enum PeerMessageInner {
103 #[serde(rename_all = "camelCase")]
105 Ice {
106 candidate: String,
108 sdp_m_line_index: u32,
110 },
111 Sdp(SdpMessage),
112}
113
114#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
115#[serde(rename_all = "camelCase")]
116pub struct PeerMessage {
118 pub session_id: String,
119 #[serde(flatten)]
120 pub peer_message: PeerMessageInner,
121}
122
123#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
124#[serde(rename_all = "camelCase")]
125pub struct EndSessionMessage {
127 pub session_id: String,
129}
130
131#[derive(Serialize, Deserialize, Debug)]
132#[serde(tag = "type")]
133#[serde(rename_all = "camelCase")]
134pub enum IncomingMessage {
136 NewPeer,
138 SetPeerStatus(PeerStatus),
140 StartSession(StartSessionMessage),
142 EndSession(EndSessionMessage),
144 Peer(PeerMessage),
146 List,
148}