diff --git a/Cargo.lock b/Cargo.lock index 9b98c4bf..262722b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4265,6 +4265,7 @@ dependencies = [ "tokio", "tokio-stream", "tokio-util", + "tower 0.5.2", "tracing", "tracing-subscriber", "utoipa", diff --git a/PMOMusic/src/main.rs b/PMOMusic/src/main.rs index 4f554335..4b55a57a 100644 --- a/PMOMusic/src/main.rs +++ b/PMOMusic/src/main.rs @@ -137,8 +137,13 @@ async fn main() -> Result<(), Box> { info!("✅ PMOMusic is ready!"); info!("Press Ctrl+C to stop..."); - // Attendre le signal Ctrl+C et l'arrêt du serveur HTTP - server.write().await.wait().await; + // Extraire le join_handle AVANT de libérer le write lock, + // pour pouvoir l'awaiter sans tenir le write lock du serveur global. + // (Tenir le write lock pendant wait() bloquerait register_device() dynamique) + let join_handle = server.write().await.take_join_handle(); + if let Some(h) = join_handle { + let _ = h.await; + } // Le serveur HTTP est arrêté, mais des threads (ControlPoint, etc.) peuvent encore tourner // Attendre 2 secondes pour laisser le temps aux threads de se terminer diff --git a/pmoapp/webapp/src/composables/useWebRenderer.ts b/pmoapp/webapp/src/composables/useWebRenderer.ts new file mode 100644 index 00000000..68f52ee2 --- /dev/null +++ b/pmoapp/webapp/src/composables/useWebRenderer.ts @@ -0,0 +1,332 @@ +/** + * Composable pour gérer le WebRenderer navigateur. + * + * Se connecte automatiquement au WebSocket /api/webrenderer/ws au montage + * et se déconnecte proprement au démontage ou à la fermeture de la page. + * + * Le navigateur est ainsi vu comme un renderer UPnP par le ControlPoint. + * Un élément