diff --git a/src/core/server.rs b/src/core/server.rs index 0f2e61b0..45ba7420 100644 --- a/src/core/server.rs +++ b/src/core/server.rs @@ -112,7 +112,7 @@ impl Server { } #[inline] - pub async fn until_shutdown(self: Arc) { + pub async fn until_shutdown(self: &Arc) { while self.running() { self.signal.subscribe().recv().await.ok(); } diff --git a/src/router/run.rs b/src/router/run.rs index 95d12559..ea8a7666 100644 --- a/src/router/run.rs +++ b/src/router/run.rs @@ -9,6 +9,7 @@ use std::{ use axum_server::Handle as ServerHandle; use conduwuit::{debug, debug_error, debug_info, error, info, Error, Result, Server}; +use futures::FutureExt; use service::Services; use tokio::{ sync::broadcast::{self, Sender}, @@ -109,28 +110,14 @@ pub(crate) async fn stop(services: Arc) -> Result<()> { #[tracing::instrument(skip_all)] async fn signal(server: Arc, tx: Sender<()>, handle: axum_server::Handle) { - loop { - let sig: &'static str = server - .signal - .subscribe() - .recv() - .await - .expect("channel error"); - - if !server.running() { - handle_shutdown(&server, &tx, &handle, sig).await; - break; - } - } + server + .clone() + .until_shutdown() + .then(move |()| handle_shutdown(server, tx, handle)) + .await; } -async fn handle_shutdown( - server: &Arc, - tx: &Sender<()>, - handle: &axum_server::Handle, - sig: &str, -) { - debug!("Received signal {sig}"); +async fn handle_shutdown(server: Arc, tx: Sender<()>, handle: axum_server::Handle) { if let Err(e) = tx.send(()) { error!("failed sending shutdown transaction to channel: {e}"); } diff --git a/src/service/sync/watch.rs b/src/service/sync/watch.rs index 2b351c3a..0a9c5d15 100644 --- a/src/service/sync/watch.rs +++ b/src/service/sync/watch.rs @@ -97,8 +97,8 @@ pub async fn watch(&self, user_id: &UserId, device_id: &DeviceId) -> Result { ); // Server shutdown - let server_shutdown = self.services.server.clone().until_shutdown().boxed(); - futures.push(server_shutdown); + futures.push(self.services.server.until_shutdown().boxed()); + if !self.services.server.running() { return Ok(()); }