async_smux 0.3.4

Asynchronous smux multiplexing library
Documentation
use std::time::Duration;

use async_smux::MuxBuilder;
use tokio::{
    io::{AsyncReadExt, AsyncWriteExt},
    net::{TcpListener, TcpStream},
};

async fn echo_server() {
    let listener = TcpListener::bind("127.0.0.1:12345").await.unwrap();
    let (stream, _) = listener.accept().await.unwrap();

    let (_, mut acceptor, worker) = MuxBuilder::server().with_connection(stream).build();
    tokio::spawn(worker);

    println!("server launched");
    while let Some(mut mux_stream) = acceptor.accept().await {
        println!("accepted mux stream {}", mux_stream.get_stream_id());

        let mut buf = [0u8; 100];
        let size = mux_stream.read(&mut buf).await.unwrap();
        mux_stream.write_all(&buf[..size]).await.unwrap();
        mux_stream.flush().await.unwrap();
        mux_stream.shutdown().await.unwrap();
    }
}

#[tokio::main]
async fn main() {
    tokio::spawn(echo_server());
    tokio::time::sleep(Duration::from_secs(3)).await;

    let stream = TcpStream::connect("127.0.0.1:12345").await.unwrap();
    let (connector, _, worker) = MuxBuilder::client().with_connection(stream).build();
    tokio::spawn(worker);

    for i in 0..10 {
        let mut mux_stream = connector.connect().unwrap();
        let mut buf = [0u8; 5];
        mux_stream.write_all(b"hello").await.unwrap();
        mux_stream.read_exact(&mut buf).await.unwrap();
        let reply = String::from_utf8(buf[..].to_vec()).unwrap();
        println!("{}: reply = {}", i, reply);
        mux_stream.shutdown().await.unwrap();
    }
}