smux_rust 0.2.1

A simple multiplexing library for Rust, inspired by xtaci/smux
//! smux_rust - 一个简单的多路复用库(异步版本)
//!
//! 这个库提供了在单个底层连接上创建多个流的能力。
//! 它依赖于底层连接提供可靠性和顺序保证,如 TCP 或 KCP。
//!
//! # 使用示例
//!
//! ```no_run
//! use smux_rust::{client, server};
//! use tokio::net::TcpStream;
//! use futures::AsyncReadExt;
//!
//! #[tokio::main]
//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
//!     // 客户端
//!     let tcp_conn = TcpStream::connect("127.0.0.1:8080").await?;
//!     let session = client(Box::new(tcp_conn), None).await?;
//!     let mut stream = session.open_stream().await?;
//!     stream.write_all(b"Hello").await?;
//!
//!     // 服务器端
//!     let listener = tokio::net::TcpListener::bind("127.0.0.1:8080").await?;
//!     loop {
//!         let (tcp_conn, _) = listener.accept().await?;
//!         let session = server(Box::new(tcp_conn), None).await?;
//!         let mut stream = session.accept_stream().await?;
//!         let mut buf = [0u8; 1024];
//!         let n = stream.read(&mut buf).await?;
//!     }
//! }
//! ```

pub mod alloc;
pub mod config;
pub mod error;
pub mod frame;
pub mod session;
pub mod shaper;
pub mod stream;

pub use config::Config;
pub use error::SmuxError;
pub use session::Session;
pub use stream::Stream;

use session::AsyncReadWrite;
use std::sync::Arc;

/// 创建服务器端会话
pub async fn server(
    conn: Box<dyn AsyncReadWrite + Send + Unpin>,
    config: Option<Config>,
) -> Result<Arc<Session>, SmuxError> {
    let config = config.unwrap_or_else(Config::default);
    Session::new(config, conn, false).await
}

/// 创建客户端会话
pub async fn client(
    conn: Box<dyn AsyncReadWrite + Send + Unpin>,
    config: Option<Config>,
) -> Result<Arc<Session>, SmuxError> {
    let config = config.unwrap_or_else(Config::default);
    Session::new(config, conn, true).await
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_config_default() {
        let config = Config::default();
        assert_eq!(config.version, 1);
        assert!(!config.keep_alive_disabled);
    }

    #[test]
    fn test_config_verify() {
        let mut config = Config::default();
        config.version = 3;
        assert!(config.verify().is_err());
    }
}