Event Handling and SocketContext Reference
Just like web controllers, Socket.IO controllers work with methods on the struct, and each of them can use a general context extractor.
This structure, called SocketContext, encapsulates relevant information about the connection, the event, and the socket state.
SocketContext reference
Method id()
pub fn id(&self) -> &SidReturns
- The socket identifier (
socketioxide::Sid).
When to use it
- Logging, traceability, associating events with a specific connection.
Method connected()
pub fn connected(&self) -> boolReturns
trueif the socket is connected to the namespace.
When to use it
- To check whether the socket is still active before performing operations.
Method ns()
pub fn ns(&self) -> &strReturns
- The current namespace path of this socket.
Method rooms()
pub fn rooms(&self) -> Vec<Room>Returns
- All room names this socket is connected to.
Method event()
pub fn event(&self) -> Option<&str>Returns
Some(event_name)in message handlers.
When to use it
- To route logic by event name or record per-event metrics.
INFO
Using this method in the connection or disconnection event returns None.
Method disconnect_reason()
pub fn disconnect_reason(&self) -> Option<&DisconnectReason>Returns
Some(reason)in disconnection handlers.Noneinconnect/message.
When to use it
- To audit why a connection is closed.
Method protocol_version()
pub fn protocol_version(&self) -> ProtocolVersionReturns
- The negotiated Socket.IO protocol version.
When to use it
- Diagnostics and client compatibility.
Method transport_type()
pub fn transport_type(&self) -> TransportTypeReturns
- The active transport (
websocketorpolling).
When to use it
- Telemetry, transport-based rules, handshake debugging.
Method try_data::<T>()
pub fn try_data<T: DeserializeOwned>(&self) -> Result<T, SocketError>Returns
Ok(T)if the payload could be deserialized.Err(SocketError)if no payload is available or parsing fails.
When to use it
- When you need to deserialize the payload without schema validation.
INFO
In the connection event, this method tries to read the handshake auth payload.
WARNING
This method consumes the internal payload. A second call in the same handler fails.
Method try_validated_data::<T>()
pub fn try_validated_data<T>(&self) -> Result<T, SocketError>
where
T: DeserializeOwned + ValidateReturns
Ok(T)if it deserializes and validates correctly.Err(SocketError)if parsing fails, there is no payload, or validation fails.
When to use it
- When the payload must comply with schema validation rules.
INFO
In the connection event, this method tries to read the handshake auth payload.
WARNING
This method consumes the internal payload. A second call in the same handler fails.
Method has_data()
pub fn has_data(&self) -> boolReturns
trueif the payload has not been consumed yet.
When to use it
- To avoid trying to parse twice.
Method query::<T>()
pub fn query<T: DeserializeOwned>(&self) -> Result<Option<T>, SocketError>Returns
Ok(Some(T))if the query string exists and is valid.Ok(None)if there is no query string.Err(SocketError)if the query exists but does not deserialize.
When to use it
- To read URL query parameters during the connection.
Method emit()
pub fn emit<T>(&self, event: impl AsRef<str>, data: &T) -> Result<(), SocketError>
where
T: Serialize + ?SizedReturns
Ok(())if the event is sent.Err(SocketError)if sending fails.
When to use it
- To send events to the connected client.
Method emit_with_ack()
pub fn emit_with_ack<T: ?Sized + Serialize, V>(
&self,
event: impl AsRef<str>,
data: &T,
) -> Result<AckStream<V>, SocketError>Returns
- An
AckStreamthat resolves when the client acknowledges the event.
When to use it
- When you need confirmation from the client that the event was received.
Method broadcast()
pub fn broadcast(&self) -> BroadcastOperators<A>Returns
- A broadcast operator that sends to all connected clients (except the sender).
When to use it
- To transmit a message to every connected client.
Method local()
pub fn local(&self) -> BroadcastOperators<A>Returns
- A broadcast operator that sends only to clients of this node.
When to use it
- Broadcast only to the current server instance (multi-node deployments).
Method to()
pub fn to(&self, rooms: impl RoomParam) -> BroadcastOperators<A>Returns
- A broadcast operator limited to the specified rooms.
When to use it
- To send to specific rooms the socket belongs to.
Method within()
pub fn within(&self, rooms: impl RoomParam) -> BroadcastOperators<A>Returns
- A broadcast operator limited to the specified rooms (alias of
to()).
Method except()
pub fn except(&self, rooms: impl RoomParam) -> BroadcastOperators<A>Returns
- A broadcast operator that excludes the specified rooms.
When to use it
- Broadcast to everyone except certain rooms.
Method timeout()
pub fn timeout(&self, timeout: Duration) -> ConfOperators<'_, A>Returns
- A configuration operator with a custom timeout for the acknowledgement.
When to use it
- To set a timeout when sending a message with acknowledgement.
Method join()
pub fn join(&self, rooms: impl RoomParam)When to use it
- To add the current socket to one or more rooms.
Method leave()
pub fn leave(&self, rooms: impl RoomParam)When to use it
- To remove the current socket from one or more rooms.
Method leave_all()
pub fn leave_all(&self)When to use it
- To remove the current socket from all its rooms.
Method has_ack()
pub fn has_ack(&self) -> boolReturns
trueif the current event includes an ACK callback.
When to use it
- Before calling
ack(...)in message handlers.
Method ack()
pub fn ack<D>(self, data: &D) -> Result<(), SendError>
where
D: Serialize + ?SizedReturns
Ok(())if the ACK is sent.Err(SendError)if no ACK is available or sending fails.
When to use it
- To respond to client callbacks when
has_ack()istrue.
When not to use it
- In handlers without an associated ACK.
WARNING
It consumes self, meaning you cannot reuse the context after calling it.
Method req_parts()
pub fn req_parts(&self) -> &PartsReturns
- The parts of the initial handshake HTTP request.
When to use it
- To access raw HTTP data (method, URI, etc.).
Method headers()
pub fn headers(&self) -> &HeaderMapReturns
- A reference to the socket request headers.
When to use it
- To read HTTP headers from the initial handshake.
Method authorization()
pub fn authorization(&self) -> Option<&str>Returns
- The value of the
Authorizationheader, if present.
When to use it
- To extract Bearer tokens or other authentication data from the handshake.
Method extensions()
pub fn extensions(&self) -> &ExtensionsReturns
- The extension store associated with the socket.
When to use it
- To share state for the lifetime of the connection.
Method http_extensions()
pub fn http_extensions(&self) -> &HttpExtensionsReturns
- The HTTP extensions of the initial handshake.
When to use it
- To reuse data written by HTTP interceptors/layers during the handshake.
Method disconnect()
pub fn disconnect(self) -> Result<(), SocketError>Returns
Ok(())if the disconnection is performed.Err(SocketError)if closing the connection fails.
When to use it
- When the server decides to actively terminate the connection.
WARNING
It consumes self, meaning you cannot reuse the context after calling it.
Base example
use sword::prelude::*;
use sword::socketio::*;
#[controller(kind = Controller::SocketIo, namespace = "/chat")]
pub struct ChatController;
impl ChatController {
#[on("connection")]
async fn on_connect(&self, socket: SocketContext) {
println!("connected: {}", socket.id());
let query: Option<MyQuery> = socket.query().unwrap();
}
#[on("message")]
async fn on_message(&self, socket: SocketContext) {
let Ok(message) = socket.try_data::<String>() else {
return;
};
if socket.has_ack() {
let _ = socket.ack(&"ok");
return;
}
socket.emit("message", &message).ok();
}
#[on("disconnection")]
async fn on_disconnect(&self, socket: SocketContext) {
println!("reason: {:?}", socket.disconnect_reason());
}
}
