o_sfu_protocol/signaling/
catalog.rs1use 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 #[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}