24 个版本 (13 个破坏性更新)
0.14.1 | 2024 年 8 月 14 日 |
---|---|
0.14.0 | 2024 年 6 月 26 日 |
0.13.1 | 2024 年 5 月 8 日 |
0.12.0 | 2024 年 3 月 20 日 |
0.3.0 | 2023 年 6 月 17 日 |
#100 in WebSocket
12,229 每月下载量
在 5 个 Crates 中使用 (通过 socketioxide)
165KB
3.5K SLoC
Engineioxide 为 socketioxide 承担了繁重的工作,它是一个 Rust 的 socket.io 服务器实现,可与 tower 堆栈集成。
您仍然可以将 engineioxide 作为独立的 crate 与 engine.io 客户端通信。
支持的协议
您可以通过功能标志启用对其他 engine.io 协议实现的支持。默认情况下启用最新协议版本(v4)。
要添加对 v3
协议版本的支持,请相应地调整您的依赖配置
[dependencies]
# Enables the `v3` protocol (`v4` is always enabled, as it's the default).
engineioxide = { version = "0.3.0", features = ["v3"] }
功能标志
v3
: 启用 engine.io v3 协议tracing
: 使用tracing
crate 启用跟踪日志
使用 axum 的基本示例
use bytes::Bytes;
use engineioxide::layer::EngineIoLayer;
use engineioxide::handler::EngineIoHandler;
use engineioxide::{Socket, DisconnectReason, Str};
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::{Arc, Mutex};
use axum::routing::get;
// Global state, with axum it must be clonable
#[derive(Debug, Default, Clone)]
struct MyHandler {
user_cnt: Arc<AtomicUsize>,
}
// Socket state
#[derive(Debug, Default)]
struct SocketState {
id: Mutex<String>,
}
impl EngineIoHandler for MyHandler {
type Data = SocketState;
fn on_connect(self: Arc<Self>, socket: Arc<Socket<SocketState>>) {
let cnt = self.user_cnt.fetch_add(1, Ordering::Relaxed) + 1;
socket.emit(cnt.to_string()).ok();
}
fn on_disconnect(&self,
socket: Arc<Socket<SocketState>>,
reason: DisconnectReason
) {
let cnt = self.user_cnt.fetch_sub(1, Ordering::Relaxed) - 1;
socket.emit(cnt.to_string()).ok();
}
fn on_message(&self, msg: Str, socket: Arc<Socket<SocketState>>) {
*socket.data.id.lock().unwrap() = msg.into(); // bind a provided user id to a socket
}
fn on_binary(&self, data: Bytes, socket: Arc<Socket<SocketState>>) { }
}
// Create a new engineio layer
let layer = EngineIoLayer::new(Arc::new(MyHandler::default()));
let app = axum::Router::<()>::new()
.route("/", get(|| async { "Hello, World!" }))
.layer(layer);
// Spawn the axum server
依赖项
~6–16MB
~200K SLoC