use rustwave::Server;
use std::sync::Arc;
use std::sync::atomic::{AtomicU64, Ordering};
use tokio::signal;
#[tokio::main]
async fn main() {
let addr = "127.0.0.1:9500";
let server = Server::bind(addr);
let server_received = Arc::new(AtomicU64::new(0));
let server_replied = Arc::new(AtomicU64::new(0));
let server_reply_failed = Arc::new(AtomicU64::new(0));
{
let server_received = server_received.clone();
let server_replied = server_replied.clone();
let server_reply_failed = server_reply_failed.clone();
server.on("ping", move |data, ctx| {
let server_received = server_received.clone();
let server_replied = server_replied.clone();
let server_reply_failed = server_reply_failed.clone();
async move {
server_received.fetch_add(1, Ordering::Relaxed);
let text = data.parse::<String>().unwrap_or_default();
match ctx.emit("pong", text).await {
Ok(_) => {
server_replied.fetch_add(1, Ordering::Relaxed);
}
Err(_) => {
server_reply_failed.fetch_add(1, Ordering::Relaxed);
}
}
}
});
}
println!("Server listening on ws://{}", addr);
tokio::spawn(async move {
let _ = server.run().await;
});
signal::ctrl_c().await.expect("failed to listen for ctrl_c");
println!();
println!("========== SERVER-SIDE STATS ==========");
println!(
"Messages received: {}",
server_received.load(Ordering::Relaxed)
);
println!(
"Replies sent: {}",
server_replied.load(Ordering::Relaxed)
);
println!(
"Replies FAILED: {}",
server_reply_failed.load(Ordering::Relaxed)
);
println!("==========================================");
}