diff --git a/lanshare/src/main.rs b/lanshare/src/main.rs index b2b2afa..65e6d48 100644 --- a/lanshare/src/main.rs +++ b/lanshare/src/main.rs @@ -12,7 +12,7 @@ use clap::Parser; use dashmap::DashMap; use futures::{SinkExt, StreamExt}; use serde::{Deserialize, Serialize}; -use std::{net::SocketAddr, path::PathBuf, sync::Arc}; +use std::{net::SocketAddr, path::PathBuf, sync::Arc, time::Duration}; use tokio::sync::broadcast; use tower_http::cors::CorsLayer; use tracing::{info, warn}; @@ -386,12 +386,27 @@ async fn handle_socket(socket: WebSocket, state: Arc, peer_ip: String) // Task to forward broadcast messages to this peer's websocket let mut send_task = tokio::spawn(async move { - while let Ok(msg) = rx.recv().await { - let text = serde_json::to_string(&msg).unwrap(); - if sender.send(Message::Text(text.into())).await.is_err() { - break; + loop { + let timer = tokio::time::sleep(Duration::from_secs(1)); + tokio::select! { + msg = rx.recv() => { + if let Ok(msg) = msg { + let text = serde_json::to_string(&msg).unwrap(); + if sender.send(Message::Text(text.into())).await.is_err() { + break; + } + } else { + break + } + } + _ = timer => { + if sender.send(Message::Ping(Default::default())).await.is_err() { + break; + } + } } } + }); // Task to handle incoming messages from this peer