pub mod config;
pub mod security;
pub mod transport;
pub use config::{ClientConfig, ClientConfigBuilder};
pub use security::{ClientSecurityConfig, ClientSecurityContext};
pub use transport::MediaTransportClient;
pub use security::DefaultClientSecurityContext;
pub use transport::default::DefaultMediaTransportClient;
use crate::api::common::error::MediaTransportError;
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)
}
}