diff --git a/server/src/broadcast_message.rs b/server/src/broadcast_message.rs new file mode 100644 index 0000000..0248aab --- /dev/null +++ b/server/src/broadcast_message.rs @@ -0,0 +1,19 @@ +use crate::ConnectionMap; +use futures_util::SinkExt; +use tokio_tungstenite::tungstenite::Message as WsMessage; + +pub async fn broadcast_message(connections: &ConnectionMap, msg: &WsMessage) { + let mut dead = vec![]; + let mut map = connections.lock().await; + + for (id, tx) in map.iter_mut() { + if let Err(e) = tx.send(msg.clone()).await { + eprintln!("Failed to send to {id}: {e}"); + dead.push(*id); + } + } + + for id in dead { + map.remove(&id); + } +} diff --git a/server/src/handle_connection.rs b/server/src/handle_connection.rs index 1c2a110..af7849b 100644 --- a/server/src/handle_connection.rs +++ b/server/src/handle_connection.rs @@ -1,10 +1,11 @@ -use futures_util::{SinkExt, StreamExt}; -use tokio_tungstenite::{accept_async, tungstenite::Message as WsMessage}; +use crate::ConnectionMap; +use futures_util::StreamExt; +use tokio_tungstenite::accept_async; use uuid::Uuid; -use crate::ConnectionMap; +use super::broadcast_message::broadcast_message; -async fn handle_connection(stream: tokio::net::TcpStream, connections: ConnectionMap) { +pub async fn handle_connection(stream: tokio::net::TcpStream, connections: ConnectionMap) { let ws_stream = accept_async(stream).await.unwrap(); let (write, mut read) = ws_stream.split(); diff --git a/server/src/main.rs b/server/src/main.rs index 7f3b6ad..ff5a706 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -7,8 +7,11 @@ use tokio::sync::Mutex; use tokio_tungstenite::accept_async; use uuid::Uuid; +mod broadcast_message; mod handle_connection; +use handle_connection::handle_connection; + #[derive(Serialize, Deserialize, Debug)] struct MessageData { username: String,