use std::time::Duration;
use crate::method::TraversalKind;
use dig_tls::BindingPolicy;
#[derive(Debug, Clone)]
pub struct NatConfig {
pub enabled_methods: Vec<TraversalKind>,
pub per_method_timeout: Duration,
pub relay_endpoint: String,
pub stun_server: Option<std::net::SocketAddr>,
pub binding_policy: BindingPolicy,
pub fast_connect_grace: Duration,
}
pub const DEFAULT_FAST_CONNECT_GRACE: Duration = Duration::from_secs(5);
pub const STUN_PORT: u16 = 3478;
impl Default for NatConfig {
fn default() -> Self {
NatConfig {
enabled_methods: vec![
TraversalKind::Direct,
TraversalKind::Upnp,
TraversalKind::NatPmp,
TraversalKind::Pcp,
TraversalKind::HolePunch,
TraversalKind::Relayed,
],
per_method_timeout: Duration::from_secs(5),
relay_endpoint: dig_constants::DIG_RELAY_URL.to_string(),
stun_server: None,
binding_policy: BindingPolicy::Opportunistic,
fast_connect_grace: DEFAULT_FAST_CONNECT_GRACE,
}
}
}
impl NatConfig {
pub fn builder() -> NatConfigBuilder {
NatConfigBuilder {
cfg: NatConfig::default(),
}
}
pub fn is_enabled(&self, kind: TraversalKind) -> bool {
self.enabled_methods.contains(&kind)
}
}
#[derive(Debug, Clone)]
pub struct NatConfigBuilder {
cfg: NatConfig,
}
impl NatConfigBuilder {
pub fn enabled_methods(mut self, methods: Vec<TraversalKind>) -> Self {
self.cfg.enabled_methods = methods;
self
}
pub fn disable(mut self, kind: TraversalKind) -> Self {
self.cfg.enabled_methods.retain(|k| *k != kind);
self
}
pub fn per_method_timeout(mut self, timeout: Duration) -> Self {
self.cfg.per_method_timeout = timeout;
self
}
pub fn relay_endpoint(mut self, endpoint: impl Into<String>) -> Self {
self.cfg.relay_endpoint = endpoint.into();
self
}
pub fn stun_server(mut self, addr: std::net::SocketAddr) -> Self {
self.cfg.stun_server = Some(addr);
self
}
pub fn binding_policy(mut self, policy: BindingPolicy) -> Self {
self.cfg.binding_policy = policy;
self
}
pub fn fast_connect_grace(mut self, grace: Duration) -> Self {
self.cfg.fast_connect_grace = grace;
self
}
pub fn build(self) -> NatConfig {
self.cfg
}
}