tokio-websockets 0.8.3

High performance, strict, tokio-util based WebSockets implementation
Documentation
use std::net::SocketAddr;

use futures_util::{SinkExt, StreamExt};
use tokio::net::{TcpListener, TcpStream};
use tokio_websockets::{Error, Limits, ServerBuilder};

#[cfg(feature = "simd")]
const PORT: u16 = 9004;
#[cfg(not(feature = "simd"))]
const PORT: u16 = 9006;

async fn accept_connection(stream: TcpStream) {
    if let Err(e) = handle_connection(stream).await {
        match e {
            Error::Protocol(_) => (),
            err => eprintln!("Error processing connection: {err:?}"),
        }
    }
}

async fn handle_connection(stream: TcpStream) -> Result<(), Error> {
    let mut ws_stream = ServerBuilder::new()
        .limits(Limits::unlimited())
        .accept(stream)
        .await?;

    while let Some(msg) = ws_stream.next().await {
        let msg = msg?;

        if msg.is_text() || msg.is_binary() {
            ws_stream.send(msg).await?;
        }
    }

    Ok(())
}

#[tokio::main(flavor = "current_thread")]
async fn main() {
    let addr: SocketAddr = ([127, 0, 0, 1], PORT).into();
    let listener = TcpListener::bind(&addr).await.expect("Can't listen");

    println!("Listening on: {addr}");

    while let Ok((stream, _)) = listener.accept().await {
        tokio::spawn(accept_connection(stream));
    }
}