rvoip_rtp_core/api/server/
mod.rs1pub mod transport;
6pub mod security;
7pub mod config;
8
9pub use transport::{MediaTransportServer, ClientInfo};
11pub use security::{ServerSecurityContext, ServerSecurityConfig};
12pub use config::{ServerConfig, ServerConfigBuilder};
13
14pub use transport::DefaultMediaTransportServer;
16pub use security::DefaultServerSecurityContext;
17
18use crate::api::common::error::MediaTransportError;
20
21use std::sync::Arc;
22
23pub struct ServerFactory;
25
26impl ServerFactory {
27 pub async fn create_server(config: ServerConfig) -> Result<DefaultMediaTransportServer, MediaTransportError> {
29 let server = DefaultMediaTransportServer::new(config).await?;
31 Ok(server)
32 }
33
34 pub async fn create_webrtc_server(
36 local_addr: std::net::SocketAddr
37 ) -> Result<DefaultMediaTransportServer, MediaTransportError> {
38 let config = ServerConfigBuilder::webrtc()
40 .local_address(local_addr)
41 .build()?;
42
43 Self::create_server(config).await
44 }
45
46 pub async fn create_sip_server(
48 local_addr: std::net::SocketAddr
49 ) -> Result<DefaultMediaTransportServer, MediaTransportError> {
50 let config = ServerConfigBuilder::sip()
52 .local_address(local_addr)
53 .build()?;
54
55 Self::create_server(config).await
56 }
57
58 pub async fn create_high_capacity_server(
60 local_addr: std::net::SocketAddr,
61 max_clients: usize
62 ) -> Result<DefaultMediaTransportServer, MediaTransportError> {
63 let config = ServerConfigBuilder::new()
65 .local_address(local_addr)
66 .max_clients(max_clients)
67 .build()?;
68
69 Self::create_server(config).await
70 }
71}
72
73impl ServerConfigBuilder {
75 pub fn with_security(mut self, security_config: crate::api::common::config::SecurityConfig) -> Self {
78 match security_config.mode {
79 crate::api::common::config::SecurityMode::None => {
80 },
83 crate::api::common::config::SecurityMode::Srtp => {
84 let server_security_config = crate::api::server::security::ServerSecurityConfig {
87 security_mode: crate::api::common::config::SecurityMode::Srtp,
88 fingerprint_algorithm: security_config.fingerprint_algorithm,
89 srtp_profiles: security_config.srtp_profiles,
90 certificate_path: None, private_key_path: None, require_client_certificate: false,
93 srtp_key: security_config.srtp_key.clone(),
94 };
95
96 self = self.security_config(server_security_config);
97
98 if let Some(key) = security_config.srtp_key {
100 }
103 },
104 crate::api::common::config::SecurityMode::DtlsSrtp => {
105 let server_security_config = crate::api::server::security::ServerSecurityConfig {
108 security_mode: crate::api::common::config::SecurityMode::DtlsSrtp,
109 fingerprint_algorithm: security_config.fingerprint_algorithm,
110 srtp_profiles: security_config.srtp_profiles,
111 certificate_path: security_config.certificate_path,
112 private_key_path: security_config.private_key_path,
113 require_client_certificate: security_config.require_client_certificate,
114 srtp_key: None, };
116
117 self = self.security_config(server_security_config);
118 },
119 crate::api::common::config::SecurityMode::SdesSrtp
120 | crate::api::common::config::SecurityMode::MikeySrtp
121 | crate::api::common::config::SecurityMode::ZrtpSrtp => {
122 }
126 }
127
128 self
129 }
130
131 pub fn with_webrtc_security(self) -> Self {
133 let security_config = crate::api::common::config::SecurityConfig::webrtc_compatible();
134 self.with_security(security_config)
135 }
136
137 pub fn with_srtp_key(self, key: Vec<u8>) -> Self {
139 let security_config = crate::api::common::config::SecurityConfig::srtp_with_key(key);
140 self.with_security(security_config)
141 }
142
143 pub fn with_no_security(self) -> Self {
145 let security_config = crate::api::common::config::SecurityConfig::unsecured();
146 self.with_security(security_config)
147 }
148
149 pub fn with_dtls_certificate(self, cert_path: String, key_path: String) -> Self {
151 let security_config = crate::api::common::config::SecurityConfig::dtls_with_certificate(cert_path, key_path);
152 self.with_security(security_config)
153 }
154}