Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 35 additions & 6 deletions apps/@sparrow-desktop/src-tauri/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ use std::sync::Arc;
use tokio::sync::mpsc::{self, UnboundedSender};
use tokio::sync::Mutex;
use tokio_tungstenite::tungstenite::protocol::Message;
use tokio::time::{interval, Duration as TokioDuration};

// --- Connect WebSocket with invalid certs allowed ---
use tokio_tungstenite::tungstenite::client::IntoClientRequest;
Expand Down Expand Up @@ -796,13 +797,41 @@ async fn connect_websocket(
}
});


// Create a channel for ping messages
let (ping_tx, mut ping_rx) = mpsc::unbounded_channel::<()>();

// Spawn ping task
let ping_tx_clone = ping_tx.clone();
tokio::spawn(async move {
while let Some(msg) = rx.recv().await {
write
.send(Message::Text(msg))
.await
.map_err(|e| format!("Failed to send message: {}", e))
.unwrap();
let mut ping_interval = interval(Duration::from_secs(30)); // Send ping every 30 seconds
loop {
ping_interval.tick().await;
if ping_tx_clone.send(()).is_err() {
// Channel closed, exit
break;
}
}
});

tokio::spawn(async move {
loop {
tokio::select! {
Some(msg) = rx.recv() => {
if let Err(e) = write.send(Message::Text(msg)).await {
eprintln!("Failed to send message: {}", e);
break;
}
}
Some(_) = ping_rx.recv() => {
// Send ping message
if let Err(e) = write.send(Message::Ping(vec![])).await {
eprintln!("Failed to send ping: {}", e);
break;
}
}
else => break,
}
}
});

Expand Down
Loading