summaryrefslogtreecommitdiff
path: root/src/routes.rs
blob: 1fa16c7cb02e6a1e7bd98a703516c3878ae54a9e (plain)
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();
	})
}