#axum #websocket #后端 #tungstenite #替换 #驱动 #tokio-websockets

axum-tws

Axum 驱动的性能高效的 WebSocket 后端,由 tokio-websockets 提供

3 个版本 (重大更改)

0.3.0 2024 年 6 月 18 日
0.2.0 2024 年 3 月 1 日
0.1.0 2024 年 2 月 23 日

#1324Web 编程

Download history 157/week @ 2024-06-13 32/week @ 2024-06-20

每月 149 次下载

MIT/Apache

17KB
321

axum-tws


axum-tws 是一个替代 WebSocket 提取器,用于 axum,使用 tokio-websockets 作为底层 WebSocket 库,而不是 tungstenite

它不是一个完全的替代品,也没有这个意图。虽然您的升级处理器看起来相同,但在 tokio-websockets 中使用 Message 类型与 tungstenite 略有不同。请参阅 tokio-websockets 文档 以获取详细信息,或者查看下面的示例。

大部分代码直接从 axum::extract::ws 模块 转移而来 - 所有荣誉归原作者。

入门指南

运行 cargo add axum-tws 将库添加到您的项目中。

回声服务器示例

use axum::{response::Response, routing::get, Router};
use axum_tws::{Message, WebSocket, WebSocketUpgrade};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let listener = tokio::net::TcpListener::bind("127.0.0.1:3000").await?;

    axum::serve(listener, Router::new().route("/ws", get(handle_upgrade))).await?;

    Ok(())
}

async fn handle_upgrade(ws: WebSocketUpgrade) -> Response {
    ws.on_upgrade({
        move |socket| async {
            if let Err(e) = handle_ws(socket).await {
                println!("websocket error: {:?}", e);
            }
        }
    })
}

async fn handle_ws(mut socket: WebSocket) -> Result<(), Box<dyn std::error::Error>> {
    while let Some(Ok(msg)) = socket.recv().await {
        if msg.is_text() {
            socket.send(msg).await?;
        }
    }

    Ok(())
}

贡献

欢迎贡献!如果您有功能想法或发现错误,请告诉我。PR 受到欢迎,但如果不是小改动,请先打开一个问题,以便我们都在同一页面上!

许可证

axum-tws 可以选择以下任一许可证进行双许可

任选其一。

依赖关系

~13–22MB
~409K SLoC