Skip to main content

o_sfu_protocol/signaling/
catalog.rs

1use std::num::NonZeroU16;
2
3use o_sfu_rfc::webrtc::MediaKind;
4use serde::{Deserialize, Serialize};
5
6use crate::shared::{
7    AvailableFeatures, DownloadStates, JsonPayload, PeerSnapshot, RecordingState, StreamType,
8    UserId, UserInfo,
9};
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
12pub struct AuthPayload {
13    pub jwt: String,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub channel: Option<String>,
16}
17
18#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
19pub struct WelcomePayload {
20    pub features: AvailableFeatures,
21    pub recording: RecordingState,
22    pub peers: Vec<PeerSnapshot>,
23}
24
25#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
26pub struct SessionDescriptionPayload {
27    pub sdp: String,
28    #[serde(default, rename = "uploadSlots", skip_serializing_if = "Vec::is_empty")]
29    pub upload_slots: Vec<NegotiationUploadSlot>,
30}
31
32#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
33#[serde(rename_all = "camelCase")]
34pub struct NegotiationUploadSlot {
35    pub mid: String,
36    pub kind: MediaKind,
37    #[serde(default, skip_serializing_if = "Vec::is_empty")]
38    pub codecs: Vec<String>,
39    #[serde(default, skip_serializing_if = "Vec::is_empty")]
40    pub simulcast_encodings: Vec<NegotiationUploadEncoding>,
41}
42
43#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
44#[serde(rename_all = "camelCase")]
45pub struct NegotiationUploadEncoding {
46    pub rid: String,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub max_bitrate: Option<u64>,
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub resolution_scale: Option<u16>,
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub max_framerate: Option<u16>,
53}
54
55#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
56#[serde(rename_all = "camelCase")]
57pub enum UploadLayerPolicyRole {
58    Featured,
59    Thumbnail,
60    DegradedThumbnail,
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
64pub struct StreamIntentPayload {
65    #[serde(rename = "type")]
66    pub stream_type: StreamType,
67}
68
69#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
70#[serde(rename_all = "camelCase")]
71pub struct SubscribePayload {
72    /// Wire shape is flat: `{ sessionId, audio?, camera?, screen? }`.
73    /// Adding fields to `DownloadStates` implicitly changes the subscribe payload shape.
74    #[serde(rename = "sessionId")]
75    pub user_id: UserId,
76    #[serde(flatten)]
77    pub states: DownloadStates,
78}
79
80#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
81#[serde(rename_all = "camelCase")]
82pub struct TrackBinding {
83    pub mid: String,
84    #[serde(rename = "sessionId")]
85    pub user_id: UserId,
86    #[serde(rename = "type")]
87    pub stream_type: StreamType,
88    pub active: bool,
89}
90
91#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
92#[serde(rename_all = "camelCase")]
93pub struct SourceDescriptor {
94    pub source_id: String,
95    #[serde(rename = "sessionId")]
96    pub user_id: UserId,
97    #[serde(rename = "type")]
98    pub stream_type: StreamType,
99    pub active: bool,
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub mid: Option<String>,
102    pub encodings: Vec<SourceEncodingDescriptor>,
103}
104
105#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
106#[serde(rename_all = "camelCase")]
107pub struct SourceEncodingDescriptor {
108    pub encoding_id: String,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub rid: Option<String>,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub max_bitrate: Option<u64>,
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub resolution_scale: Option<NonZeroU16>,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub max_framerate: Option<u16>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub policy_role: Option<UploadLayerPolicyRole>,
119}
120
121#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
122#[serde(rename_all = "camelCase")]
123pub struct PeerInfoPayload {
124    #[serde(rename = "sessionId")]
125    pub user_id: UserId,
126    pub info: UserInfo,
127}
128
129#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
130#[serde(rename_all = "camelCase")]
131pub struct PeerLeftPayload {
132    #[serde(rename = "sessionId")]
133    pub user_id: UserId,
134}
135
136#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
137pub struct ClientBroadcastPayload {
138    pub message: JsonPayload,
139}
140
141#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
142#[serde(rename_all = "camelCase")]
143pub struct ServerBroadcastPayload {
144    pub sender_id: UserId,
145    pub message: JsonPayload,
146}
147
148#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
149pub struct RecordingActionResult {
150    pub ok: bool,
151}