use axum::{ extract::{ws::WebSocketUpgrade, Path}, routing::get, response::Response, Router, Extension, }; use tokio::sync::oneshot; use tower_http::services::ServeDir; use super::rooms; pub fn routes() -> Router { let room_server: rooms::RoomService = rooms::start_room_server(); Router::new() .route("/api/check", get(|| async {"ok"})) .route("/api/exists/:code", get(game_exists)) .route("/api/join/:code", get(game_join)) .nest_service("/", ServeDir::new("client")) .layer(Extension(room_server)) } // check if a given room code exists already async fn game_exists( Path(code): Path, Extension(room_server): Extension ) -> &'static str { let (tx, rx) = oneshot::channel(); room_server.send(rooms::RoomServiceRequest::Exists(code, tx)).await.ok(); if let Ok(res) = rx.await { if res { "true" } else { "false" } } else { return "error"; } } // start a websocket connection and join it to the room async fn game_join( Path(code): Path, ws: WebSocketUpgrade, Extension(room_server): Extension ) -> Response { ws.on_upgrade(|s| async move { room_server.send(rooms::RoomServiceRequest::Join(code, s)).await.ok(); }) }