From 0af3def21fd223810a2b3f080ad8aa780f4b7c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=BCller?= Date: Wed, 11 Feb 2026 11:21:56 +0100 Subject: [PATCH] Regularly send pings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcel Müller --- lanshare/src/main.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) 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