use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Clone, Copy)]
pub enum BackendModule {
#[cfg(feature = "backend-libdatachannel")]
LibDataChannel,
#[cfg(feature = "backend-go-pion")]
GoPion,
}
impl Default for BackendModule {
#[allow(unreachable_code)]
fn default() -> Self {
#[cfg(feature = "backend-libdatachannel")]
return Self::LibDataChannel;
#[cfg(feature = "backend-go-pion")]
Self::GoPion
}
}
#[derive(Default)]
pub struct HubConfig {
pub backend_module: BackendModule,
pub signal_config: Arc<tx5_signal::SignalConfig>,
pub webrtc_connect_timeout: std::time::Duration,
pub danger_force_signal_relay: bool,
pub danger_deny_signal_relay: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub enum CredentialType {
#[default]
Password,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "camelCase")]
pub struct IceServers {
pub urls: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub credential: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub credential_type: Option<CredentialType>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "camelCase")]
pub enum TransportPolicy {
#[default]
All,
Relay,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "camelCase")]
pub struct WebRtcConfig {
pub ice_servers: Vec<IceServers>,
#[serde(default)]
pub ice_transport_policy: TransportPolicy,
}
#[cfg(feature = "backend-go-pion")]
impl WebRtcConfig {
pub fn to_go_buf(&self) -> std::io::Result<tx5_go_pion::GoBuf> {
serde_json::to_vec(self)
.map_err(|e| {
std::io::Error::other(format!(
"failed to serialize WebRtcConfig: {}",
e
))
})?
.try_into()
}
}