use serde::{Deserialize, Serialize};
const DEFAULT_WEBRTC_MTU: u16 = 1200;
const DEFAULT_WEBRTC_CONNECT_TIMEOUT_MS: u64 = 30_000;
const DEFAULT_WEBRTC_ICE_GATHER_TIMEOUT_MS: u64 = 2_000;
const DEFAULT_WEBRTC_MAX_CONNECTIONS: usize = 6;
const DEFAULT_WEBRTC_DATA_CHANNEL_LABEL: &str = "fips";
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct WebRtcConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub advertise_on_nostr: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auto_connect: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub accept_connections: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mtu: Option<u16>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_connections: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub connect_timeout_ms: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ice_gather_timeout_ms: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub data_channel_label: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ordered: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_retransmits: Option<u16>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub stun_servers: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resolve_mdns_candidates: Option<bool>,
}
impl WebRtcConfig {
pub fn advertise_on_nostr(&self) -> bool {
self.advertise_on_nostr.unwrap_or(false)
}
pub fn auto_connect(&self) -> bool {
self.auto_connect.unwrap_or(false)
}
pub fn accept_connections(&self) -> bool {
self.accept_connections
.unwrap_or_else(|| self.advertise_on_nostr())
}
pub fn mtu(&self) -> u16 {
self.mtu.unwrap_or(DEFAULT_WEBRTC_MTU)
}
pub fn max_connections(&self) -> usize {
self.max_connections
.unwrap_or(DEFAULT_WEBRTC_MAX_CONNECTIONS)
}
pub fn connect_timeout_ms(&self) -> u64 {
self.connect_timeout_ms
.unwrap_or(DEFAULT_WEBRTC_CONNECT_TIMEOUT_MS)
}
pub fn ice_gather_timeout_ms(&self) -> u64 {
self.ice_gather_timeout_ms
.unwrap_or(DEFAULT_WEBRTC_ICE_GATHER_TIMEOUT_MS)
}
pub fn data_channel_label(&self) -> &str {
self.data_channel_label
.as_deref()
.unwrap_or(DEFAULT_WEBRTC_DATA_CHANNEL_LABEL)
}
pub fn ordered(&self) -> bool {
self.ordered.unwrap_or(true)
}
pub fn max_retransmits(&self) -> Option<u16> {
self.max_retransmits
}
pub fn resolve_mdns_candidates(&self) -> bool {
self.resolve_mdns_candidates.unwrap_or(true)
}
pub fn stun_servers<'a>(&'a self, fallback: &'a [String]) -> Vec<String> {
self.stun_servers
.as_ref()
.cloned()
.unwrap_or_else(|| fallback.to_vec())
}
}