Totodore/socketioxide
Totodore/socketioxide has 1,636 GitHub stars and 83 forks. GitHot measured +2 in 7 days. Last checked 2026-11-13 17:24 UTC. Last push 2026-11-01.
What you can do
- Axum: 🏓echo example
- Warp: 🏓echo example
- Hyper: 🏓echo example
- Salvo: 🏓echo example
Gemessener Sternzuwachs
- in 24h
- Aktualisierung verzögert
- in 7 days
- +2
- in 15 days
- Verlauf wird gesammelt
- in 1 month
- Verlauf wird gesammelt
Nettoänderungen in überlappenden Zeiträumen, keine Tagessummen. Fehlende Messwerte bleiben leer. Sterne zeigen Interesse, nicht Qualität.
Über uns
A socket.io server implementation in Rust that integrates with the Tower ecosystem and the Tokio stack.
EntwicklerwerkzeugeREADME.md
OriginalSocketioxide 🚀🦀
A socket.io server implementation in Rust that integrates with the Tower ecosystem and the Tokio stack. It integrates with any server framework based on tower like Axum, Warp, Salvo, Viz or Hyper. Add any other tower based middleware on top of socketioxide such as CORS, authorization, compression, etc with tower-http.

Features
- Integrates with:
- Out of the box support for any other middleware based on tower:
- Effortless horizontal scaling with plugable adapters:
- Remote cluster communication with Socketioxide-emitter
- Namespaces and Dynamic Namespaces
- Rooms
- Ack and emit with ack
- Binary packets
- Polling & Websocket transports
- Common (default) & Msgpack parsers
- Extensions to add custom data to sockets
- Memory efficient http payload parsing with streams
- Flexible axum-like API to handle events. With extractors to extract data from your handlers
- Well tested with the official end to end test-suite
- All Socket.io versions supported :
- 🔌protocol v5 : socket.io js from v3.0.0..latest, it is enabled by default
- 🔌protocol v4 : based on engine.io v3, under the feature flag
v4, (socket.io js from v1.0.3..latest)

Examples
Chat app 💬 (see full example here)
io.ns("/", |s: SocketRef| {
s.on("new message", |s: SocketRef, Data::<String>(msg)| {
let username = s.extensions.get::<Username>().unwrap().clone();
let msg = Res::Message {
username,
message: msg,
};
s.broadcast().emit("new message", msg).ok();
});
s.on(
"add user",
|s: SocketRef, Data::<String>(username), user_cnt: State<UserCnt>| {
if s.extensions.get::<Username>().is_some() {
return;
}
let num_users = user_cnt.add_user();
s.extensions.insert(Username(username.clone()));
s.emit("login", Res::Login { num_users }).ok();
let res = Res::UserEvent {
num_users,
username: Username(username),
};
s.broadcast().emit("user joined", res).ok();
},
);
s.on("typing", |s: SocketRef| {
let username = s.extensions.get::<Username>().unwrap().clone();
s.broadcast()
.emit("typing", Res::Username { username })
.ok();
});
s.on("stop typing", |s: SocketRef| {
let username = s.extensions.get::<Username>().unwrap().clone();
s.broadcast()
.emit("stop typing", Res::Username { username })
.ok();
});
s.on_disconnect(|s: SocketRef, user_cnt: State<UserCnt>| {
if let Some(username) = s.extensions.get::<Username>() {
let num_users = user_cnt.remove_user();
let res = Res::UserEvent {
num_users,
username: username.clone(),
};
s.broadcast().emit("user left", res).ok();
}
});
});
Echo implementation with Axum 🏓
use axum::routing::get;
use serde_json::Value;
use socketioxide::{
extract::{AckSender, Bin, Data, SocketRef},
SocketIo,
};
use tracing::info;
use tracing_subscriber::FmtSubscriber;
fn on_connect(socket: SocketRef, Data(data): Data<Value>) {
info!("Socket.IO connected: {:?} {:?}", socket.ns(), socket.id);
socket.emit("auth", data).ok();
socket.on(
"message",
|socket: SocketRef, Data::<Value>(data), Bin(bin)| {
info!("Received event: {:?} {:?}", data, bin);
socket.bin(bin).emit("message-back", data).ok();
},
);
socket.on(
"message-with-ack",
|Data::<Value>(data), ack: AckSender, Bin(bin)| {
info!("Received event: {:?} {:?}", data, bin);
ack.bin(bin).send(data).ok();
},
);
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing::subscriber::set_global_default(FmtSubscriber::default())?;
let (layer, io) = SocketIo::new_layer();
io.ns("/", on_connect);
io.ns("/custom", on_connect);
let app = axum::Router::new()
.route("/", get(|| async { "Hello, World!" }))
.layer(layer);
info!("Starting server");
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
Ok(())
}
Other examples are available in the example folder
Contributions and Feedback / Questions
Any contribution is welcome, feel free to open an issue or a PR. If you want to contribute but don't know where to start, you can check the issues.
If you have any question or feedback, please open a thread on the discussions page.
License 🔐
This project is licensed under the MIT license.
Ähnliche Projekte entdecken
codecrafters-io/build-your-own-x
Meistere das Programmieren, indem du deine Lieblingstechnologien von Grund auf neu erschaffst.
562,314 Sternepublic-apis/public-apis
Eine gemeinschaftliche Liste kostenloser APIs
498,749 Sternemorluto/rea
Mit Agenten alles per Reverse Engineering untersuchen, vom Verhalten der Anwendung bis hin zu nativen Binärdateien.
457,262 Sterneopenclaw/openclaw
Die KI, die wirklich Dinge erledigt. Jedes Betriebssystem, jede Plattform. Auf die Hummer-Art. 🦞
394,384 Sterne