Match relay in the save/login service: WebSocket rooms, seats, ready, 100 ms turn confirmation and checksum relay

This commit is contained in:
Richard Zink committed 2026-11-04 11:48:09 +01:00
1 parent 42034b062b
commit 848ab0f677
6 files changed
+956 -6

No files matched your search

+13
View File
@@ -39,6 +39,9 @@ use std::{
};
use tokio::sync::Mutex;
mod netplay;
use netplay::Netplay;
const MAX_SAVE: usize = 1024 * 1024;
const MAX_TOTAL: u64 = 500 * 1024 * 1024;
const WRITES_PER_MINUTE: usize = 30;
@@ -59,6 +62,7 @@ struct AppState {
sessions: Arc<Mutex<HashMap<String, String>>>, // token -> user name
writes: Arc<Mutex<Vec<u64>>>,
logins: Arc<Mutex<Vec<u64>>>,
netplay: Arc<Mutex<Netplay>>,
}
#[derive(Serialize, Deserialize, Clone)]
@@ -193,6 +197,13 @@ impl AppState {
self.store_sessions().await;
token
}
// the user behind a WebSocket query token (login is optional in a match lobby)
pub async fn user_by_token(&self, token: &str) -> Option<String> {
let token = token.trim();
let name = self.sessions.lock().await.get(token).cloned()?;
self.users.lock().await.iter().find(|u| u.name == name).map(|u| u.name.clone())
}
}
async fn total_size(dir: &PathBuf) -> u64 {
@@ -506,6 +517,7 @@ async fn main() {
sessions: Arc::new(Mutex::new(sessions)),
writes: Arc::new(Mutex::new(Vec::new())),
logins: Arc::new(Mutex::new(Vec::new())),
netplay: Arc::new(Mutex::new(Netplay::new())),
};
let app = Router::new()
.route("/api/health", get(health))
@@ -516,6 +528,7 @@ async fn main() {
.route("/api/password", post(change_password))
.route("/api/users", get(list_users).post(create_user))
.route("/api/users/{name}", delete(delete_user))
.route("/api/netplay/ws", get(netplay::netplay_ws))
.route("/api/saves", get(list).post(create))
.route("/api/saves/{id}", get(get_save).put(overwrite).delete(delete_save))
.layer(DefaultBodyLimit::max(MAX_SAVE + 1024))