hyper-websocket-lite 0.5.0

WebSocket server implementation on hyper and websocket-lite
Documentation
#![deny(rust_2018_idioms)]

use futures::{SinkExt, StreamExt};
use hyper::service::{make_service_fn, service_fn};
use hyper::Server;
use hyper_websocket_lite::{server_upgrade, AsyncClient};
use websocket_codec::{Message, Opcode, Result};

async fn on_client(mut stream_mut: AsyncClient) {
    let mut stream = loop {
        let (msg, mut stream) = stream_mut.into_future().await;

        let msg = match msg {
            Some(Ok(msg)) => msg,
            Some(Err(_err)) => {
                let _ = stream.send(Message::close(None)).await;
                break stream;
            }
            None => {
                break stream;
            }
        };

        let _ = match msg.opcode() {
            Opcode::Text | Opcode::Binary => stream.send(msg).await,
            Opcode::Ping => stream.send(Message::pong(msg.into_data())).await,
            Opcode::Close => {
                break stream;
            }
            Opcode::Pong => Ok(()),
        };

        stream_mut = stream;
    };

    let _ = stream.send(Message::close(None)).await;
}

#[tokio::main]
async fn main() -> Result<()> {
    let addr = ([0, 0, 0, 0], 9001).into();

    let make_service =
        make_service_fn(|_| async { Ok::<_, hyper::Error>(service_fn(|req| server_upgrade(req, on_client))) });

    Server::bind(&addr).serve(make_service).await?;
    Ok(())
}