#web-framework #framework #web #http

axum-typed-websockets

axum::extract::ws 使用类型安全的消息

6 个版本 (重大更改)

0.6.0 2023年12月31日
0.5.0 2023年4月15日
0.4.0 2022年5月8日
0.3.0 2021年12月2日
0.1.0 2021年10月30日

#2162 in 网页编程

Download history 106/week @ 2024-04-29 127/week @ 2024-05-06 234/week @ 2024-05-13 247/week @ 2024-05-20 177/week @ 2024-05-27 252/week @ 2024-06-03 143/week @ 2024-06-10 244/week @ 2024-06-17 141/week @ 2024-06-24 186/week @ 2024-07-01 142/week @ 2024-07-08 225/week @ 2024-07-15 220/week @ 2024-07-22 228/week @ 2024-07-29 129/week @ 2024-08-05 222/week @ 2024-08-12

每月下载量 838

MIT 许可协议

17KB
298

axum-typed-websockets

axum::extract::ws 使用类型安全的消息。

Build status Crates.io Documentation

有关此库的更多信息,请参阅 库文档


lib.rs:

axum::extract::ws 使用类型安全的消息。

示例

use axum::{
    Router,
    response::IntoResponse,
    routing::get,
};
use axum_typed_websockets::{Message, WebSocket, WebSocketUpgrade};
use serde::{Serialize, Deserialize};
use std::time::Instant;

// Make a regular axum router
let app = Router::new().route("/ws", get(handler));

// Run it!
axum::serve(
    tokio::net::TcpListener::bind("0.0.0.0:3000")
        .await
        .unwrap(),
    app.into_make_service()
)
.await
.unwrap();

async fn handler(
    // Upgrade the request to a WebSocket connection where the server sends
    // messages of type `ServerMsg` and the clients sends `ClientMsg`
    ws: WebSocketUpgrade<ServerMsg, ClientMsg>,
) -> impl IntoResponse {
    ws.on_upgrade(ping_pong_socket)
}

// Send a ping and measure how long time it takes to get a pong back
async fn ping_pong_socket(mut socket: WebSocket<ServerMsg, ClientMsg>) {
    let start = Instant::now();
    socket.send(Message::Item(ServerMsg::Ping)).await.ok();

    if let Some(msg) = socket.recv().await {
        match msg {
            Ok(Message::Item(ClientMsg::Pong)) => {
                println!("ping: {:?}", start.elapsed());
            },
            Ok(_) => {},
            Err(err) => {
                eprintln!("got error: {}", err);
            },
        }
    }
}

#[derive(Debug, Serialize)]
enum ServerMsg {
    Ping,
}

#[derive(Debug, Deserialize)]
enum ClientMsg {
    Pong,
}

特性标志

以下特性可用

  • json:启用 JsonCodec,使用 serde_json 将消息编码为 JSON。默认启用。

依赖关系

~6.5–9MB
~163K SLoC