rvoip_rtp_core/api/server/
mod.rs

1//! Server API for media transport
2//!
3//! This module provides server-side API components for media transport.
4
5pub mod transport;
6pub mod security;
7pub mod config;
8
9// Re-export public API
10pub use transport::{MediaTransportServer, ClientInfo};
11pub use security::{ServerSecurityContext, ServerSecurityConfig};
12pub use config::{ServerConfig, ServerConfigBuilder};
13
14// Re-export implementation files
15pub use transport::DefaultMediaTransportServer;
16pub use security::DefaultServerSecurityContext;
17
18// Import errors
19use crate::api::common::error::MediaTransportError;
20
21use std::sync::Arc;
22
23/// Factory for creating media transport servers
24pub struct ServerFactory;
25
26impl ServerFactory {
27    /// Create a new media transport server
28    pub async fn create_server(config: ServerConfig) -> Result<DefaultMediaTransportServer, MediaTransportError> {
29        // Create the server
30        let server = DefaultMediaTransportServer::new(config).await?;
31        Ok(server)
32    }
33    
34    /// Create a server for WebRTC
35    pub async fn create_webrtc_server(
36        local_addr: std::net::SocketAddr
37    ) -> Result<DefaultMediaTransportServer, MediaTransportError> {
38        // Create WebRTC-optimized config
39        let config = ServerConfigBuilder::webrtc()
40            .local_address(local_addr)
41            .build()?;
42            
43        Self::create_server(config).await
44    }
45    
46    /// Create a server for SIP
47    pub async fn create_sip_server(
48        local_addr: std::net::SocketAddr
49    ) -> Result<DefaultMediaTransportServer, MediaTransportError> {
50        // Create SIP-optimized config
51        let config = ServerConfigBuilder::sip()
52            .local_address(local_addr)
53            .build()?;
54            
55        Self::create_server(config).await
56    }
57    
58    /// Create a high-capacity server
59    pub async fn create_high_capacity_server(
60        local_addr: std::net::SocketAddr,
61        max_clients: usize
62    ) -> Result<DefaultMediaTransportServer, MediaTransportError> {
63        // Create high-capacity config
64        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
73// Update the ServerConfigBuilder to add a method for the unified security config
74impl ServerConfigBuilder {
75    /// Set the security configuration using the unified SecurityConfig
76    /// This provides an easier way to configure security with predefined profiles
77    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                // No security - use plain RTP
81                // Don't set any security config
82            },
83            crate::api::common::config::SecurityMode::Srtp => {
84                // Basic SRTP with pre-shared key
85                // Convert to security config format expected by server
86                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, // Not used for SRTP mode
91                    private_key_path: None, // Not used for SRTP mode
92                    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 a key was provided, set it up for SRTP
99                if let Some(key) = security_config.srtp_key {
100                    // Here you would set up the pre-shared key
101                    // This might require additional implementation in your SRTP code
102                }
103            },
104            crate::api::common::config::SecurityMode::DtlsSrtp => {
105                // DTLS-SRTP mode
106                // Convert to security config format expected by server
107                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, // Not used for DTLS-SRTP
115                };
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                // SIP-derived SRTP methods use the unified security context instead
123                // For now, these are handled through SecurityContextManager
124                // TODO: Implement direct server config support for these methods
125            }
126        }
127        
128        self
129    }
130    
131    /// Set up WebRTC-compatible security (DTLS-SRTP with self-signed certs)
132    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    /// Set up SRTP with a pre-shared key
138    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    /// Set up plain RTP (no security)
144    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    /// Set up DTLS-SRTP with provided certificate files
150    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}