fix: Rebind Iroh endpoint on room join to fix restart bug
This commit is contained in:
+16
-10
@@ -44,6 +44,7 @@ impl CoreController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct ActiveSession {
|
struct ActiveSession {
|
||||||
|
endpoint: Endpoint,
|
||||||
router: Router,
|
router: Router,
|
||||||
room_state: Arc<IrohGossipState>,
|
room_state: Arc<IrohGossipState>,
|
||||||
capture_thread: std::thread::JoinHandle<()>,
|
capture_thread: std::thread::JoinHandle<()>,
|
||||||
@@ -88,15 +89,6 @@ async fn run_core_loop(
|
|||||||
let memory_lookup = iroh::address_lookup::memory::MemoryLookup::new();
|
let memory_lookup = iroh::address_lookup::memory::MemoryLookup::new();
|
||||||
let secret_key = iroh::SecretKey::generate();
|
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 audio_backend = Arc::new(PipeWireBackend::new());
|
||||||
|
|
||||||
let is_muted = Arc::new(AtomicBool::new(false));
|
let is_muted = Arc::new(AtomicBool::new(false));
|
||||||
@@ -119,6 +111,19 @@ async fn run_core_loop(
|
|||||||
session.shutdown(audio_backend.clone()).await;
|
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
|
// Determine target ticket
|
||||||
let ticket_str = if ticket.trim().is_empty() || ticket == "create" {
|
let ticket_str = if ticket.trim().is_empty() || ticket == "create" {
|
||||||
let topic_id: [u8; 32] = rand::random();
|
let topic_id: [u8; 32] = rand::random();
|
||||||
@@ -370,6 +375,7 @@ async fn run_core_loop(
|
|||||||
});
|
});
|
||||||
|
|
||||||
let session = ActiveSession {
|
let session = ActiveSession {
|
||||||
|
endpoint: endpoint.clone(),
|
||||||
router,
|
router,
|
||||||
room_state: room_state.clone(),
|
room_state: room_state.clone(),
|
||||||
capture_thread,
|
capture_thread,
|
||||||
@@ -399,7 +405,7 @@ async fn run_core_loop(
|
|||||||
let self_state = PeerState {
|
let self_state = PeerState {
|
||||||
name: current_name.clone(),
|
name: current_name.clone(),
|
||||||
is_muted: new_state,
|
is_muted: new_state,
|
||||||
addr: endpoint.addr(),
|
addr: session.endpoint.addr(),
|
||||||
};
|
};
|
||||||
let _ = session.room_state.update_self_state(self_state).await;
|
let _ = session.room_state.update_self_state(self_state).await;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user