rustwave 0.1.0

A lightweight async event-driven WebSocket framework for Rust
Documentation
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!("==========================================");
}