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 网页编程
每月下载量 838
17KB
298 行
axum-typed-websockets
axum::extract::ws
使用类型安全的消息。
有关此库的更多信息,请参阅 库文档。
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