async_smux 0.1.3

Asynchronous smux library for smol / async-std
Documentation
use async_smux::{MuxDispatcher, MuxStream};
use smol::{channel, net::TcpListener, net::TcpStream, prelude::*};

async fn get_tcp_stream_pair() -> (TcpStream, TcpStream) {
    let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
    let local_addr = listener.local_addr().unwrap();
    let (tx, rx) = channel::bounded(8);
    smol::spawn(async move {
        let (stream, _) = listener.accept().await.unwrap();
        tx.send(stream).await.unwrap();
    })
    .detach();
    let client_stream = TcpStream::connect(local_addr).await.unwrap();
    let server_stream = rx.recv().await.unwrap();
    (client_stream, server_stream)
}

async fn get_mux_stream_pair() -> (MuxDispatcher, MuxDispatcher, MuxStream, MuxStream) {
    let (stream1, stream2) = get_tcp_stream_pair().await;
    let mut mux1 = MuxDispatcher::new(stream1);
    let mut mux2 = MuxDispatcher::new(stream2);
    let stream1 = mux1.connect().await.unwrap();
    let stream2 = mux2.accept().await.unwrap();
    (mux1, mux2, stream1, stream2)
}

const PAYLOAD_SIZE: usize = 0x40000;
const SEND_ROUND: usize = 1024 * 64;

fn init() {
    let _ = env_logger::builder()
        .filter_level(log::LevelFilter::Debug)
        .try_init();
    std::env::set_var("SMOL_THREADS", "4");
}

fn main() {
    init();
    smol::block_on(async {
        let (_mux1, _mux2, mut stream1, mut stream2) = get_mux_stream_pair().await;
        let _t1 = smol::spawn(async move {
            let mut payload = Vec::new();
            payload.resize(PAYLOAD_SIZE, 0);
            for i in 0..SEND_ROUND {
                stream1.write_all(&payload).await.unwrap();
                println!("sent: {}", i);
            }
            stream1.close().await.unwrap();
        });
        let mut payload = Vec::new();
        payload.resize(PAYLOAD_SIZE, 0);
        for i in 0..SEND_ROUND {
            stream2.read_exact(&mut payload).await.unwrap();
            println!("recv: {}", i);
        }
        _t1.await;
    });
}