From 9a40455448e9633b3aaf175a4d7678424b3a6378 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 28 Jul 2026 17:44:39 +0000 Subject: [PATCH] feat: collect ICE servers from all relays --- src/calls.rs | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/calls.rs b/src/calls.rs index fad239a5ab..290683caa7 100644 --- a/src/calls.rs +++ b/src/calls.rs @@ -617,7 +617,7 @@ pub async fn call_state(context: &Context, msg_id: MsgId) -> Result { /// ICE server for JSON serialization. #[derive(Serialize, Debug, Clone, PartialEq)] -struct IceServer { +pub(crate) struct IceServer { /// STUN or TURN URLs. pub urls: Vec, @@ -655,7 +655,7 @@ pub(crate) async fn create_ice_servers_from_metadata( } /// STUN or TURN server with unresolved DNS name. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] pub(crate) enum UnresolvedIceServer { /// STUN server. Stun { hostname: String, port: u16 }, @@ -676,7 +676,7 @@ pub(crate) enum UnresolvedIceServer { pub(crate) async fn resolve_ice_servers( context: &Context, unresolved_ice_servers: Vec, -) -> Result { +) -> Result> { let mut result: Vec = Vec::new(); // Do not use cache because there is no TLS. @@ -733,8 +733,7 @@ pub(crate) async fn resolve_ice_servers( }, } } - let json = serde_json::to_string(&result)?; - Ok(json) + Ok(result) } /// Creates JSON with ICE servers when no TURN servers are known. @@ -770,12 +769,19 @@ pub(crate) fn create_fallback_ice_servers() -> Vec { /// because it itself cannot utilize DNS. See /// . pub async fn ice_servers(context: &Context) -> Result { - if let Some(metadata) = context.metadata.read().await.values().next() { - let ice_servers = resolve_ice_servers(context, metadata.ice_servers.clone()).await?; - Ok(ice_servers) - } else { - Ok("[]".to_string()) - } + let mut unresolved_ice_servers: Vec = context + .metadata + .read() + .await + .values() + .flat_map(|metadata| metadata.ice_servers.clone()) + .collect(); + unresolved_ice_servers.sort(); + unresolved_ice_servers.dedup(); + + let ice_servers = resolve_ice_servers(context, unresolved_ice_servers).await?; + let json = serde_json::to_string(&ice_servers)?; + Ok(json) } /// "Who can call me" config options.