pub mod config;
pub mod security;
pub mod transport;
pub use config::{ServerConfig, ServerConfigBuilder};
pub use security::{ServerSecurityConfig, ServerSecurityContext};
pub use transport::{ClientInfo, MediaTransportServer};
pub use security::DefaultServerSecurityContext;
pub use transport::DefaultMediaTransportServer;
use crate::api::common::error::MediaTransportError;
pub struct ServerFactory;
impl ServerFactory {
pub async fn create_server(
config: ServerConfig,
) -> Result<DefaultMediaTransportServer, MediaTransportError> {
let server = DefaultMediaTransportServer::new(config).await?;
Ok(server)
}
pub async fn create_webrtc_server(
local_addr: std::net::SocketAddr,
) -> Result<DefaultMediaTransportServer, MediaTransportError> {
let config = ServerConfigBuilder::webrtc()
.local_address(local_addr)
.build()?;
Self::create_server(config).await
}
pub async fn create_sip_server(
local_addr: std::net::SocketAddr,
) -> Result<DefaultMediaTransportServer, MediaTransportError> {
let config = ServerConfigBuilder::sip()
.local_address(local_addr)
.build()?;
Self::create_server(config).await
}
pub async fn create_high_capacity_server(
local_addr: std::net::SocketAddr,
max_clients: usize,
) -> Result<DefaultMediaTransportServer, MediaTransportError> {
let config = ServerConfigBuilder::new()
.local_address(local_addr)
.max_clients(max_clients)
.build()?;
Self::create_server(config).await
}
}
impl ServerConfigBuilder {
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 server_security_config = crate::api::server::security::ServerSecurityConfig {
security_mode: crate::api::common::config::SecurityMode::Srtp,
fingerprint_algorithm: security_config.fingerprint_algorithm,
srtp_profiles: security_config.srtp_profiles,
certificate_path: None, private_key_path: None, require_client_certificate: false,
srtp_key: security_config.srtp_key.clone(),
};
self = self.security_config(server_security_config);
if let Some(_key) = security_config.srtp_key {
}
}
crate::api::common::config::SecurityMode::DtlsSrtp => {
let server_security_config = crate::api::server::security::ServerSecurityConfig {
security_mode: crate::api::common::config::SecurityMode::DtlsSrtp,
fingerprint_algorithm: security_config.fingerprint_algorithm,
srtp_profiles: security_config.srtp_profiles,
certificate_path: security_config.certificate_path,
private_key_path: security_config.private_key_path,
require_client_certificate: security_config.require_client_certificate,
srtp_key: None, };
self = self.security_config(server_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)
}
}