rvoip_rtp_core/api/client/
mod.rs

1//! Client API for media transport
2//!
3//! This module provides client-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::MediaTransportClient;
11pub use security::{ClientSecurityContext, ClientSecurityConfig};
12pub use config::{ClientConfig, ClientConfigBuilder};
13
14// Re-export implementation files
15pub use transport::default::DefaultMediaTransportClient;
16pub use security::DefaultClientSecurityContext;
17
18// Import errors
19use crate::api::common::error::MediaTransportError;
20
21use std::sync::Arc;
22
23/// Factory for creating media transport clients
24pub struct ClientFactory;
25
26impl ClientFactory {
27    /// Create a new media transport client
28    pub async fn create_client(config: ClientConfig) -> Result<DefaultMediaTransportClient, MediaTransportError> {
29        // Create client transport
30        let client = DefaultMediaTransportClient::new(config).await
31            .map_err(|e| MediaTransportError::InitializationError(format!("Failed to create client: {}", e)))?;
32        
33        Ok(client)
34    }
35    
36    /// Create a client for WebRTC
37    pub async fn create_webrtc_client(
38        remote_addr: std::net::SocketAddr
39    ) -> Result<DefaultMediaTransportClient, MediaTransportError> {
40        // Create WebRTC-optimized config
41        let config = ClientConfigBuilder::webrtc()
42            .remote_address(remote_addr)
43            .build();
44            
45        Self::create_client(config).await
46    }
47    
48    /// Create a client for SIP
49    pub async fn create_sip_client(
50        remote_addr: std::net::SocketAddr
51    ) -> Result<DefaultMediaTransportClient, MediaTransportError> {
52        // Create SIP-optimized config
53        let config = ClientConfigBuilder::sip()
54            .remote_address(remote_addr)
55            .build();
56            
57        Self::create_client(config).await
58    }
59}
60
61// Update the ClientConfigBuilder to add a method for the unified security config
62impl ClientConfigBuilder {
63    /// Set the security configuration using the unified SecurityConfig
64    /// This provides an easier way to configure security with predefined profiles
65    pub fn with_security(mut self, security_config: crate::api::common::config::SecurityConfig) -> Self {
66        match security_config.mode {
67            crate::api::common::config::SecurityMode::None => {
68                // No security - use plain RTP
69                // Don't set any security config
70            },
71            crate::api::common::config::SecurityMode::Srtp => {
72                // Basic SRTP with pre-shared key
73                // Convert to security config format expected by client
74                let client_security_config = crate::api::client::security::ClientSecurityConfig {
75                    security_mode: crate::api::common::config::SecurityMode::Srtp,
76                    fingerprint_algorithm: security_config.fingerprint_algorithm,
77                    remote_fingerprint: security_config.remote_fingerprint.clone(),
78                    remote_fingerprint_algorithm: security_config.remote_fingerprint_algorithm.clone(),
79                    validate_fingerprint: false, // Not used for SRTP mode
80                    srtp_profiles: security_config.srtp_profiles,
81                    certificate_path: None, // Not used for SRTP mode
82                    private_key_path: None, // Not used for SRTP mode
83                    srtp_key: security_config.srtp_key.clone(),
84                };
85                
86                self = self.security_config(client_security_config);
87                
88                // If a key was provided, set it up for SRTP
89                if let Some(key) = security_config.srtp_key {
90                    // Here you would set up the pre-shared key
91                    // This might require additional implementation in your SRTP code
92                }
93            },
94            crate::api::common::config::SecurityMode::DtlsSrtp => {
95                // DTLS-SRTP mode
96                // Convert to security config format expected by client
97                let client_security_config = crate::api::client::security::ClientSecurityConfig {
98                    security_mode: crate::api::common::config::SecurityMode::DtlsSrtp,
99                    fingerprint_algorithm: security_config.fingerprint_algorithm,
100                    remote_fingerprint: security_config.remote_fingerprint.clone(),
101                    remote_fingerprint_algorithm: security_config.remote_fingerprint_algorithm.clone(),
102                    validate_fingerprint: security_config.remote_fingerprint.is_some(),
103                    srtp_profiles: security_config.srtp_profiles,
104                    certificate_path: security_config.certificate_path,
105                    private_key_path: security_config.private_key_path,
106                    srtp_key: None, // Not used for DTLS-SRTP
107                };
108                
109                self = self.security_config(client_security_config);
110            },
111            crate::api::common::config::SecurityMode::SdesSrtp 
112            | crate::api::common::config::SecurityMode::MikeySrtp 
113            | crate::api::common::config::SecurityMode::ZrtpSrtp => {
114                // SIP-derived SRTP methods use the unified security context instead
115                // For now, these are handled through SecurityContextManager
116                // TODO: Implement direct client config support for these methods
117            }
118        }
119        
120        self
121    }
122    
123    /// Set up WebRTC-compatible security (DTLS-SRTP with self-signed certs)
124    pub fn with_webrtc_security(self) -> Self {
125        let security_config = crate::api::common::config::SecurityConfig::webrtc_compatible();
126        self.with_security(security_config)
127    }
128    
129    /// Set up SRTP with a pre-shared key
130    pub fn with_srtp_key(self, key: Vec<u8>) -> Self {
131        let security_config = crate::api::common::config::SecurityConfig::srtp_with_key(key);
132        self.with_security(security_config)
133    }
134    
135    /// Set up plain RTP (no security)
136    pub fn with_no_security(self) -> Self {
137        let security_config = crate::api::common::config::SecurityConfig::unsecured();
138        self.with_security(security_config)
139    }
140    
141    /// Set up DTLS-SRTP with provided certificate files
142    pub fn with_dtls_certificate(self, cert_path: String, key_path: String) -> Self {
143        let security_config = crate::api::common::config::SecurityConfig::dtls_with_certificate(cert_path, key_path);
144        self.with_security(security_config)
145    }
146}