atm0s_media_server_cluster/define/rpc/
webrtc.rs

1use 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}