Add WebSocket ping->pong message ticker
This commit is contained in:
parent
f0b30e9526
commit
18d69a620c
2 changed files with 24 additions and 0 deletions
|
@ -1,4 +1,5 @@
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
pub const LOGO: &str = "
|
pub const LOGO: &str = "
|
||||||
.d8888b. 888 8888888b. 888888b.
|
.d8888b. 888 8888888b. 888888b.
|
||||||
|
@ -21,6 +22,9 @@ pub const APP_ENDPOINT: &str = "https://surrealdb.com/app";
|
||||||
/// How many concurrent tasks can be handled in a WebSocket
|
/// How many concurrent tasks can be handled in a WebSocket
|
||||||
pub const MAX_CONCURRENT_CALLS: usize = 24;
|
pub const MAX_CONCURRENT_CALLS: usize = 24;
|
||||||
|
|
||||||
|
/// Specifies the frequency with which ping messages should be sent to the client.
|
||||||
|
pub const WEBSOCKET_PING_FREQUENCY: Duration = Duration::from_secs(5);
|
||||||
|
|
||||||
/// The package identifier of this build
|
/// The package identifier of this build
|
||||||
pub const PKG_NAME: &str = env!("CARGO_PKG_NAME");
|
pub const PKG_NAME: &str = env!("CARGO_PKG_NAME");
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ use crate::cli::CF;
|
||||||
use crate::cnf::MAX_CONCURRENT_CALLS;
|
use crate::cnf::MAX_CONCURRENT_CALLS;
|
||||||
use crate::cnf::PKG_NAME;
|
use crate::cnf::PKG_NAME;
|
||||||
use crate::cnf::PKG_VERS;
|
use crate::cnf::PKG_VERS;
|
||||||
|
use crate::cnf::WEBSOCKET_PING_FREQUENCY;
|
||||||
use crate::dbs::DB;
|
use crate::dbs::DB;
|
||||||
use crate::err::Error;
|
use crate::err::Error;
|
||||||
use crate::net::session;
|
use crate::net::session;
|
||||||
|
@ -61,6 +62,25 @@ impl Rpc {
|
||||||
let (chn, mut rcv) = channel::new(MAX_CONCURRENT_CALLS);
|
let (chn, mut rcv) = channel::new(MAX_CONCURRENT_CALLS);
|
||||||
// Split the socket into send and recv
|
// Split the socket into send and recv
|
||||||
let (mut wtx, mut wrx) = ws.split();
|
let (mut wtx, mut wrx) = ws.split();
|
||||||
|
// Clone the channel for sending pings
|
||||||
|
let png = chn.clone();
|
||||||
|
// Send messages to the client
|
||||||
|
tokio::task::spawn(async move {
|
||||||
|
// Create the interval ticker
|
||||||
|
let mut interval = tokio::time::interval(WEBSOCKET_PING_FREQUENCY);
|
||||||
|
// Loop indefinitely
|
||||||
|
loop {
|
||||||
|
// Wait for the timer
|
||||||
|
interval.tick().await;
|
||||||
|
// Create the ping message
|
||||||
|
let msg = Message::ping(vec![]);
|
||||||
|
// Send the message to the client
|
||||||
|
if let Err(_) = png.send(msg).await {
|
||||||
|
// Exit out of the loop
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
// Send messages to the client
|
// Send messages to the client
|
||||||
tokio::task::spawn(async move {
|
tokio::task::spawn(async move {
|
||||||
// Wait for the next message to send
|
// Wait for the next message to send
|
||||||
|
|
Loading…
Reference in a new issue