From 3834b35de26c95c1acb9083404744a4efdc0e0f9 Mon Sep 17 00:00:00 2001 From: Mollusk Date: Wed, 27 May 2026 15:31:59 -0400 Subject: [PATCH] fix: Rebind Iroh endpoint on room join to fix restart bug --- src/core/mod.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/core/mod.rs b/src/core/mod.rs index 5a3ff97..f494b7c 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -44,6 +44,7 @@ impl CoreController { } struct ActiveSession { + endpoint: Endpoint, router: Router, room_state: Arc, capture_thread: std::thread::JoinHandle<()>, @@ -88,15 +89,6 @@ async fn run_core_loop( let memory_lookup = iroh::address_lookup::memory::MemoryLookup::new(); let secret_key = iroh::SecretKey::generate(); - // Bind local endpoint on a random port - let endpoint = Endpoint::builder(presets::N0) - .secret_key(secret_key) - .address_lookup(memory_lookup.clone()) - .bind() - .await?; - - endpoint.online().await; - let audio_backend = Arc::new(PipeWireBackend::new()); let is_muted = Arc::new(AtomicBool::new(false)); @@ -119,6 +111,19 @@ async fn run_core_loop( session.shutdown(audio_backend.clone()).await; } + let endpoint = match Endpoint::builder(presets::N0) + .secret_key(secret_key.clone()) + .address_lookup(memory_lookup.clone()) + .bind() + .await { + Ok(ep) => ep, + Err(e) => { + let _ = ui_tx.send(UiEvent::Error(format!("Failed to bind endpoint: {}", e))).await; + continue; + } + }; + endpoint.online().await; + // Determine target ticket let ticket_str = if ticket.trim().is_empty() || ticket == "create" { let topic_id: [u8; 32] = rand::random(); @@ -370,6 +375,7 @@ async fn run_core_loop( }); let session = ActiveSession { + endpoint: endpoint.clone(), router, room_state: room_state.clone(), capture_thread, @@ -399,7 +405,7 @@ async fn run_core_loop( let self_state = PeerState { name: current_name.clone(), is_muted: new_state, - addr: endpoint.addr(), + addr: session.endpoint.addr(), }; let _ = session.room_state.update_self_state(self_state).await; }