pub mod transport;
pub mod security;
pub mod config;
pub use transport::MediaTransportClient;
pub use security::{ClientSecurityContext, ClientSecurityConfig};
pub use config::{ClientConfig, ClientConfigBuilder};
pub use transport::default::DefaultMediaTransportClient;
pub use security::DefaultClientSecurityContext;
use crate::api::common::error::MediaTransportError;
use std::sync::Arc;
pub struct ClientFactory;
impl ClientFactory {
pub async fn create_client(config: ClientConfig) -> Result<DefaultMediaTransportClient, MediaTransportError> {
let client = DefaultMediaTransportClient::new(config).await
.map_err(|e| MediaTransportError::InitializationError(format!("Failed to create client: {}", e)))?;
Ok(client)
}
pub async fn create_webrtc_client(
remote_addr: std::net::SocketAddr
) -> Result<DefaultMediaTransportClient, MediaTransportError> {
let config = ClientConfigBuilder::webrtc()
.remote_address(remote_addr)
.build();
Self::create_client(config).await
}
pub async fn create_sip_client(
remote_addr: std::net::SocketAddr
) -> Result<DefaultMediaTransportClient, MediaTransportError> {
let config = ClientConfigBuilder::sip()
.remote_address(remote_addr)
.build();
Self::create_client(config).await
}
}
impl ClientConfigBuilder {
pub fn with_security(mut self, security_config: crate::api::common::config::SecurityConfig) -> Self {
match security_config.mode {
crate::api::common::config::SecurityMode::None => {
},
crate::api::common::config::SecurityMode::Srtp => {
let client_security_config = crate::api::client::security::ClientSecurityConfig {
security_mode: crate::api::common::config::SecurityMode::Srtp,
fingerprint_algorithm: security_config.fingerprint_algorithm,
remote_fingerprint: security_config.remote_fingerprint.clone(),
remote_fingerprint_algorithm: security_config.remote_fingerprint_algorithm.clone(),
validate_fingerprint: false, srtp_profiles: security_config.srtp_profiles,
certificate_path: None, private_key_path: None, srtp_key: security_config.srtp_key.clone(),
};
self = self.security_config(client_security_config);
if let Some(key) = security_config.srtp_key {
}
},
crate::api::common::config::SecurityMode::DtlsSrtp => {
let client_security_config = crate::api::client::security::ClientSecurityConfig {
security_mode: crate::api::common::config::SecurityMode::DtlsSrtp,
fingerprint_algorithm: security_config.fingerprint_algorithm,
remote_fingerprint: security_config.remote_fingerprint.clone(),
remote_fingerprint_algorithm: security_config.remote_fingerprint_algorithm.clone(),
validate_fingerprint: security_config.remote_fingerprint.is_some(),
srtp_profiles: security_config.srtp_profiles,
certificate_path: security_config.certificate_path,
private_key_path: security_config.private_key_path,
srtp_key: None, };
self = self.security_config(client_security_config);
},
crate::api::common::config::SecurityMode::SdesSrtp
| crate::api::common::config::SecurityMode::MikeySrtp
| crate::api::common::config::SecurityMode::ZrtpSrtp => {
}
}
self
}
pub fn with_webrtc_security(self) -> Self {
let security_config = crate::api::common::config::SecurityConfig::webrtc_compatible();
self.with_security(security_config)
}
pub fn with_srtp_key(self, key: Vec<u8>) -> Self {
let security_config = crate::api::common::config::SecurityConfig::srtp_with_key(key);
self.with_security(security_config)
}
pub fn with_no_security(self) -> Self {
let security_config = crate::api::common::config::SecurityConfig::unsecured();
self.with_security(security_config)
}
pub fn with_dtls_certificate(self, cert_path: String, key_path: String) -> Self {
let security_config = crate::api::common::config::SecurityConfig::dtls_with_certificate(cert_path, key_path);
self.with_security(security_config)
}
}