aboutsummaryrefslogtreecommitdiff
path: root/src/spectate/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/spectate/server.rs')
-rw-r--r--src/spectate/server.rs49
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(())
}