Fix UI sync bugs and disconnect hang

- Add NeighborDown event handler in gossip network to reliably remove disconnected peers.
- Add 1-second timeout wrapper to router.shutdown() to prevent UI hanging on disconnect.
This commit is contained in:
2026-05-27 05:54:44 -04:00
parent 5ddb792f0f
commit ea5ffb861b
2 changed files with 16 additions and 6 deletions
+11 -6
View File
@@ -54,25 +54,30 @@ struct ActiveSession {
impl ActiveSession {
async fn shutdown(self, audio_backend: Arc<PipeWireBackend>) {
// Abort asynchronous tasks first
crate::log_msg("ActiveSession::shutdown started");
self.datagram_task.abort();
self.mixer_task.abort();
self.event_task.abort();
crate::log_msg("Aborted tasks");
// Stop the audio backend in a blocking thread to avoid blocking the async executor
let audio_backend_clone = audio_backend.clone();
let _ = tokio::task::spawn_blocking(move || {
crate::log_msg("Stopping audio backend...");
let _ = audio_backend_clone.stop();
crate::log_msg("Audio backend stopped");
}).await;
// Leave room
crate::log_msg("Leaving room...");
let _ = self.room_state.leave().await;
crate::log_msg("Room left");
// Shut down router
let _ = self.router.shutdown().await;
crate::log_msg("Shutting down router...");
let _ = tokio::time::timeout(std::time::Duration::from_secs(1), self.router.shutdown()).await;
crate::log_msg("Router shut down");
// Clean up capture thread
crate::log_msg("Joining capture thread...");
let _ = self.capture_thread.join();
crate::log_msg("ActiveSession::shutdown complete");
}
}
+5
View File
@@ -195,6 +195,11 @@ impl RoomState for IrohGossipState {
}
Ok(iroh_gossip::api::Event::NeighborDown(peer_id)) => {
crate::log_msg(&format!("Gossip event: NeighborDown={:?}", peer_id));
let removed = peers.lock().unwrap().remove(&peer_id).is_some();
if removed {
crate::log_msg(&format!("Removed peer due to NeighborDown: {:?}", peer_id));
let _ = event_tx.send(RoomEvent::PeerLeft(peer_id)).await;
}
}
Ok(other) => {
crate::log_msg(&format!("Gossip other event: {:?}", other));