feat: federation media forwarding working — audio crosses between relays
Some checks failed
Mirror to GitHub / mirror (push) Failing after 33s
Build Release Binaries / build-amd64 (push) Failing after 3m57s

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) <noreply@anthropic.com>
This commit is contained in:
Siavash Sameni
2026-04-08 06:26:49 +04:00
parent da84ed332c
commit 7271942c6a

View File

@@ -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}");
}
}
}
}