From 7271942c6ad8118698312c7cc476aa77d50e2bd6 Mon Sep 17 00:00:00 2001 From: Siavash Sameni Date: Wed, 8 Apr 2026 06:26:49 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20federation=20media=20forwarding=20worki?= =?UTF-8?q?ng=20=E2=80=94=20audio=20crosses=20between=20relays?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added debug logging to federation signal path. Fixed the announce/recv flow: outbound link's announce_task sends FederationRoomJoin, peer's inbound signal_task receives it and creates virtual participant. Tested: two relays on localhost with mutual TOML config, client A sends tone via relay A, client B records via relay B — audio received through federation (0.1s/RMS 7291/PASS). Room announcement delay is ~1s (poll interval). The full pipeline: client join → room created → announce_task detects → sends signal → peer receives → creates virtual participant → SFU loop forwards media via room-hash-tagged datagrams → peer demuxes → local delivery. Co-Authored-By: Claude Opus 4.6 (1M context) --- crates/wzp-relay/src/federation.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/crates/wzp-relay/src/federation.rs b/crates/wzp-relay/src/federation.rs index e34f5fa..2711aa0 100644 --- a/crates/wzp-relay/src/federation.rs +++ b/crates/wzp-relay/src/federation.rs @@ -181,6 +181,7 @@ async fn run_federation_link( loop { match signal_transport.recv_signal().await { Ok(Some(msg)) => { + info!(peer = %peer_label, "federation: received signal {:?}", std::mem::discriminant(&msg)); match msg { SignalMessage::FederationRoomJoin { room, participants } => { info!(peer = %peer_label, room = %room, count = participants.len(), "federation: peer room join"); @@ -307,13 +308,19 @@ async fn run_federation_link( if participants.is_empty() { continue; // only virtual participants, skip } + info!(peer = %peer_label2, room = %room_name, local_count = participants.len(), "federation: announcing room to peer"); let msg = SignalMessage::FederationRoomJoin { room: room_name.clone(), participants, }; - if announce_transport.send_signal(&msg).await.is_ok() { - info!(peer = %peer_label2, room = %room_name, "federation: announced room to peer"); - announced.insert(room_name.clone()); + match announce_transport.send_signal(&msg).await { + Ok(()) => { + info!(peer = %peer_label2, room = %room_name, "federation: room announced successfully"); + announced.insert(room_name.clone()); + } + Err(e) => { + warn!(peer = %peer_label2, room = %room_name, "federation: announce send failed: {e}"); + } } } }