1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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();
})
}
|