gst_plugin_webrtc_signalling_protocol/
lib.rs

1// SPDX-License-Identifier: MPL-2.0
2
3/// The default protocol used by the signalling server
4use 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")]
17/// Messages sent from the server to peers
18pub enum OutgoingMessage {
19    /// Welcoming message, sets the Peer ID linked to a new connection
20    #[serde(rename_all = "camelCase")]
21    Welcome { peer_id: String },
22    /// Notifies listeners that a peer status has changed
23    PeerStatusChanged(PeerStatus),
24    /// Instructs a peer to generate an offer and inform about the session ID
25    #[serde(rename_all = "camelCase")]
26    StartSession { peer_id: String, session_id: String },
27    /// Let consumer know that the requested session is starting with the specified identifier
28    #[serde(rename_all = "camelCase")]
29    SessionStarted { peer_id: String, session_id: String },
30    /// Signals that the session the peer was in was ended
31    EndSession(EndSessionMessage),
32    /// Messages directly forwarded from one peer to another
33    Peer(PeerMessage),
34    /// Provides the current list of consumer peers
35    #[serde(rename_all = "camelCase")]
36    List { producers: Vec<Peer> },
37    /// Notifies that an error occurred with the peer's current session
38    #[serde(rename_all = "camelCase")]
39    Error { details: String },
40}
41
42#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
43#[serde(rename_all = "camelCase")]
44/// Register with a peer type
45pub enum PeerRole {
46    /// Register as a producer
47    Producer,
48    /// Register as a listener
49    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")]
74/// Ask the server to start a session with a producer peer
75pub struct StartSessionMessage {
76    /// Identifies the peer
77    pub peer_id: String,
78}
79
80#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
81#[serde(tag = "type")]
82#[serde(rename_all = "camelCase")]
83/// Conveys a SDP
84pub enum SdpMessage {
85    /// Conveys an offer
86    #[serde(rename_all = "camelCase")]
87    Offer {
88        /// The SDP
89        sdp: String,
90    },
91    /// Conveys an answer
92    #[serde(rename_all = "camelCase")]
93    Answer {
94        /// The SDP
95        sdp: String,
96    },
97}
98
99#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
100#[serde(rename_all = "camelCase")]
101/// Contents of the peer message
102pub enum PeerMessageInner {
103    /// Conveys an ICE candidate
104    #[serde(rename_all = "camelCase")]
105    Ice {
106        /// The candidate string
107        candidate: String,
108        /// The mline index the candidate applies to
109        sdp_m_line_index: u32,
110    },
111    Sdp(SdpMessage),
112}
113
114#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
115#[serde(rename_all = "camelCase")]
116/// Messages directly forwarded from one peer to another
117pub 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")]
125/// End a session
126pub struct EndSessionMessage {
127    /// The identifier of the session to end
128    pub session_id: String,
129}
130
131#[derive(Serialize, Deserialize, Debug)]
132#[serde(tag = "type")]
133#[serde(rename_all = "camelCase")]
134/// Messages received by the server from peers
135pub enum IncomingMessage {
136    /// Internal message to let know about new peers
137    NewPeer,
138    /// Set current peer status
139    SetPeerStatus(PeerStatus),
140    /// Start a session with a producer peer
141    StartSession(StartSessionMessage),
142    /// End an existing session
143    EndSession(EndSessionMessage),
144    /// Send a message to a peer the sender is currently in session with
145    Peer(PeerMessage),
146    /// Retrieve the current list of producers
147    List,
148}