use core::net::SocketAddr;
use stun_proto::types::AddressFamily;
use crate::candidate::TransportType;
pub use turn_client_proto::types::TurnCredentials;
#[derive(Debug, Clone)]
pub struct TurnConfig {
client_transport: TransportType,
turn_server: SocketAddr,
credentials: TurnCredentials,
families: smallvec::SmallVec<[AddressFamily; 2]>,
tls_config: Option<TurnTlsConfig>,
}
impl TurnConfig {
pub fn new(
client_transport: TransportType,
server_addr: SocketAddr,
credentials: TurnCredentials,
families: &[AddressFamily],
) -> Self {
Self {
client_transport,
turn_server: server_addr,
credentials,
families: families.into(),
tls_config: None,
}
}
pub fn with_tls_config(mut self, config: TurnTlsConfig) -> Self {
self.tls_config = Some(config);
self
}
pub fn tls_config(&self) -> Option<&TurnTlsConfig> {
self.tls_config.as_ref()
}
pub fn addr(&self) -> SocketAddr {
self.turn_server
}
pub fn client_transport(&self) -> TransportType {
self.client_transport
}
pub fn credentials(&self) -> &TurnCredentials {
&self.credentials
}
pub fn families(&self) -> &[AddressFamily] {
&self.families
}
}
#[derive(Debug, Clone)]
pub enum TurnTlsConfig {
#[cfg(feature = "rustls")]
Rustls(RustlsTurnConfig),
#[cfg(feature = "openssl")]
Openssl(OpensslTurnConfig),
}
#[cfg(feature = "rustls")]
use alloc::sync::Arc;
#[cfg(feature = "rustls")]
use rustls::{pki_types::ServerName, ClientConfig};
#[cfg(feature = "rustls")]
#[derive(Debug, Clone)]
pub struct RustlsTurnConfig {
config: Arc<ClientConfig>,
server_name: ServerName<'static>,
}
#[cfg(feature = "rustls")]
impl RustlsTurnConfig {
pub fn new(config: Arc<ClientConfig>, server_name: ServerName<'static>) -> Self {
Self {
config,
server_name,
}
}
pub fn client_config(&self) -> Arc<ClientConfig> {
self.config.clone()
}
pub fn server_name(&self) -> ServerName<'static> {
self.server_name.clone()
}
}
#[cfg(feature = "rustls")]
impl From<RustlsTurnConfig> for TurnTlsConfig {
fn from(value: RustlsTurnConfig) -> Self {
Self::Rustls(value)
}
}
#[cfg(feature = "openssl")]
#[derive(Debug, Clone)]
pub struct OpensslTurnConfig {
ssl: openssl::ssl::SslContext,
}
#[cfg(feature = "openssl")]
impl OpensslTurnConfig {
pub fn new(ssl: openssl::ssl::SslContext) -> Self {
Self { ssl }
}
pub fn ssl_context(&self) -> &openssl::ssl::SslContext {
&self.ssl
}
}
#[cfg(feature = "openssl")]
impl From<OpensslTurnConfig> for TurnTlsConfig {
fn from(value: OpensslTurnConfig) -> Self {
Self::Openssl(value)
}
}