summaryrefslogtreecommitdiff
path: root/src/routes.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/routes.rs51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/routes.rs b/src/routes.rs
new file mode 100644
index 0000000..1fa16c7
--- /dev/null
+++ b/src/routes.rs
@@ -0,0 +1,51 @@
+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<String>,
+ Extension(room_server): Extension<rooms::RoomService>
+) -> &'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<String>,
+ ws: WebSocketUpgrade,
+ Extension(room_server): Extension<rooms::RoomService>
+) -> Response {
+ ws.on_upgrade(|s| async move {
+ room_server.send(rooms::RoomServiceRequest::Join(code, s)).await.ok();
+ })
+}