From f5a7f9ba9a782f9c1bcab367f8d03859e13be4ca Mon Sep 17 00:00:00 2001 From: Rusty Striker Date: Mon, 14 Jul 2025 22:00:32 +0300 Subject: [PATCH] exit axum server when game server quits and vice versa --- src/main.rs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1fff156..d02a96c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,8 @@ async fn main() { let (bsend, _) = broadcast::channel(10); let (msend, mrecv) = mpsc::channel(50); let bsend2 = bsend.clone(); + + let listener = tokio::net::TcpListener::bind("0.0.0.0:3001").await.unwrap(); let app = Router::new() .route("/", routing::get(root)) .route("/tavern.js", routing::get(socket)) @@ -28,20 +30,25 @@ async fn main() { "/ws", routing::get(move |w| ws_handler(w, msend, bsend2.clone().subscribe())), ); - - let listener = tokio::net::TcpListener::bind("0.0.0.0:3001").await.unwrap(); let game = tokio::fs::read_to_string(open_tavern::GAME_SAVE_FILE) .await .map(|s| serde_json::from_str(&s).ok()) .ok() .flatten() .unwrap_or(open_tavern::GameServer::new()); - tokio::spawn(game.server_loop(mrecv, bsend)); - + let game_server = tokio::spawn(game.server_loop(mrecv, bsend)); println!("Server is running at http://localhost:3001"); - axum::serve(listener, app) - .await - .expect("axum server crashed, yaaaaay (unless i crashed him that yay)"); + let axum_server = tokio::spawn(run_web_server(listener, app)); + + // wait for one of the bunch to finish, then quit + tokio::select! { + _ = game_server => {}, + _ = axum_server => {}, + }; +} +/// Runs the axum server so i would get a JoinHandle<()> instead of whatever axum::serve returns +async fn run_web_server(listener: tokio::net::TcpListener, app: Router) { + axum::serve(listener, app).await.expect("Axum server crashed???"); } /// Executes on a new WebSocket request, set update to [handle_socket]