atm0s_media_server_cluster/define/rpc/
webrtc.rs1use std::fmt::Debug;
2
3use crate::{ClusterEndpointPublishScope, ClusterEndpointSubscribeScope, MediaSessionToken, VerifyObject};
4
5use super::{
6 super::media::{BitrateControlMode, MixMinusAudioMode, PayloadType},
7 general::RemoteAddr,
8};
9use poem_openapi::Object;
10use proc_macro::{IntoVecU8, TryFromSliceU8};
11use serde::{Deserialize, Serialize};
12use transport::MediaKind;
13
14#[derive(Serialize, Deserialize, Debug, Object, PartialEq, Eq, Clone)]
15pub struct WebrtcConnectRequestReceivers {
16 pub audio: u8,
17 pub video: u8,
18}
19
20#[derive(Serialize, Deserialize, Debug, Object, PartialEq, Eq, Clone)]
21pub struct WebrtcConnectRequestSender {
22 pub kind: MediaKind,
23 pub name: String,
24 pub uuid: String,
25 pub label: String,
26 pub screen: Option<bool>,
27}
28
29#[derive(Debug, Serialize, Deserialize, Object, PartialEq, Eq, IntoVecU8, TryFromSliceU8, Clone)]
30pub struct WebrtcConnectRequest {
31 #[oai(skip)]
32 pub session_uuid: u64,
33 #[oai(skip)]
34 pub ip_addr: RemoteAddr,
35 #[oai(skip)]
36 pub user_agent: String,
37 pub version: Option<String>,
38 pub room: String,
39 pub peer: String,
40 #[oai(default = "ClusterEndpointSubscribeScope::default")]
41 pub sub_scope: ClusterEndpointSubscribeScope,
42 #[oai(default = "ClusterEndpointPublishScope::default")]
43 pub pub_scope: ClusterEndpointPublishScope,
44 pub token: String,
45 #[oai(default = "MixMinusAudioMode::default")]
46 pub mix_minus_audio: MixMinusAudioMode,
47 pub join_now: Option<bool>,
48 pub codecs: Option<Vec<PayloadType>>,
49 pub receivers: WebrtcConnectRequestReceivers,
50 pub sdp: Option<String>,
51 pub compressed_sdp: Option<Vec<u8>>,
52 pub senders: Vec<WebrtcConnectRequestSender>,
53 #[oai(default = "BitrateControlMode::default")]
54 pub remote_bitrate_control_mode: BitrateControlMode,
55}
56
57impl VerifyObject for WebrtcConnectRequest {
58 fn verify(&self, verifier: &dyn crate::SessionTokenVerifier) -> Option<MediaSessionToken> {
59 let token = verifier.verify_media_session(&self.token)?;
60 if token.protocol != crate::rpc::general::MediaSessionProtocol::Webrtc {
61 return None;
62 }
63 if let Some(room) = &token.room {
64 if !room.eq(&self.room) {
65 return None;
66 }
67 }
68 if let Some(peer) = &token.peer {
69 if !peer.eq(&self.peer) {
70 return None;
71 }
72 }
73 Some(token)
74 }
75}
76
77#[derive(Debug, Serialize, Deserialize, Object, PartialEq, Eq, IntoVecU8, TryFromSliceU8)]
78pub struct WebrtcConnectResponse {
79 pub sdp: Option<String>,
80 pub compressed_sdp: Option<Vec<u8>>,
81 pub conn_id: String,
82}
83
84#[derive(Debug, Serialize, Deserialize, Object, PartialEq, Eq, IntoVecU8, TryFromSliceU8, Clone)]
85pub struct WebrtcRemoteIceRequest {
86 pub conn_id: String,
87 pub candidate: String,
88}
89
90#[derive(Debug, Serialize, Deserialize, Object, PartialEq, Eq, IntoVecU8, TryFromSliceU8)]
91pub struct WebrtcRemoteIceResponse {
92 pub success: bool,
93}
94
95#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, IntoVecU8, TryFromSliceU8, Clone)]
96pub struct WebrtcPatchRequest {
97 pub conn_id: String,
98 pub sdp: String,
99}
100
101#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, IntoVecU8, TryFromSliceU8)]
102pub struct WebrtcPatchResponse {
103 pub ice_restart_sdp: Option<String>,
104}