async-smux

A lightweight asynchronous smux (Simple MUltipleXing) library for smol / async-std.

Benchmark

| Implementation | Throughput (TCP) | Handshake | | ----------------- | ---------------- | ---------- | | smux (go) | 0.4854 GiB/s | 17.070 K/s | | async-smux (rust) | 1.1603 GiB/s | 30.502 K/s |

Check out /benches directory for more details.

Example

```rust use async_smux::MuxDispatcher; use smol::net::{TcpListener, TcpStream}; use smol::prelude::*;

async fn echoserver() { let listener = TcpListener::bind("0.0.0.0:12345").await.unwrap(); let (stream, _) = listener.accept().await.unwrap(); let mut mux = MuxDispatcher::new(stream); loop { let mut muxstream = mux.accept().await.unwrap(); let mut buf = [0u8; 1024]; let size = muxstream.read(&mut buf).await.unwrap(); muxstream.write(&buf[..size]).await.unwrap(); } }

fn main() { smol::spawn(echoserver()).detach(); smol::blockon(async { smol::Timer::after(std::time::Duration::fromsecs(1)).await; let stream = TcpStream::connect("127.0.0.1:12345").await.unwrap(); let mut mux = MuxDispatcher::new(stream); for i in 0..100 { let mut muxstream = mux.connect().await.unwrap(); let mut buf = [0u8; 1024]; muxstream.write(b"hello").await.unwrap(); let size = muxstream.read(&mut buf).await.unwrap(); let reply = String::fromutf8(buf[..size].tovec()).unwrap(); println!("{}: {}", i, reply); } }); }

```