diff options
Diffstat (limited to 'src/spectate/server.rs')
-rw-r--r-- | src/spectate/server.rs | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/src/spectate/server.rs b/src/spectate/server.rs index 3923bc1..da18a77 100644 --- a/src/spectate/server.rs +++ b/src/spectate/server.rs @@ -1,26 +1,24 @@ -use crate::game::protocol::Packet; -use crate::State; - use super::Config; -use anyhow::Result; -use axum::extract; -use axum::extract::connect_info::ConnectInfo; -use axum::extract::ws::Message; -use axum::http::HeaderMap; -use axum::response::Html; +use crate::{game::protocol::Packet, State}; +use anyhow::{anyhow, Result}; use axum::{ - extract::ws::{WebSocket, WebSocketUpgrade}, - response::IntoResponse, + extract::{ + self, + connect_info::ConnectInfo, + ws::{Message, WebSocket, WebSocketUpgrade}, + }, + http::HeaderMap, + response::{Html, IntoResponse}, routing::get, Router, }; use headers::ContentType; use log::{info, warn}; -use std::net::SocketAddr; -use std::str::FromStr; -use std::sync::Arc; -use tokio::spawn; -use tokio::sync::{broadcast, RwLock}; +use std::{net::SocketAddr, str::FromStr, sync::Arc}; +use tokio::{ + spawn, + sync::{broadcast, RwLock}, +}; struct SpectateState { past_events: RwLock<Vec<Packet>>, @@ -30,7 +28,7 @@ struct SpectateState { pub async fn spectate_server(config: Config, state: Arc<State>) -> Result<()> { let sstate = Arc::new(SpectateState { past_events: Default::default(), - events: broadcast::channel(16).0, + events: broadcast::channel(512).0, }); spawn(broadcaster(sstate.clone(), state)); let app = Router::new() @@ -166,10 +164,17 @@ async fn handle_socket( .await?; } let mut live = state.events.subscribe(); - while let Ok(p) = live.recv().await { - socket - .send(Message::Text(serde_json::to_string(&p)?)) - .await?; + + loop { + tokio::select! { + message = socket.recv() => { + message.ok_or(anyhow!("socket end"))??; + } + event = live.recv() => { + socket + .send(Message::Text(serde_json::to_string(&event?)?)) + .await?; + } + } } - Ok(()) } |