Event Handling and SocketContext Reference
In Sword, Socket.IO controllers work with events (#[on("...")]) and receive a SocketContext. This page combines event flow guidance with a reference for the public SocketContext API.
Event types
The most common handlers are:
connectiondisconnection- custom events such as
message,chat-message, orroom:join
Behavior by handler type
- In
connection,event()returnsNone;try_data::<T>()tries to read handshakeauth. - In
message,event()returnsSome(event_name)andtry_data::<T>()reads event payload. - In
disconnection,disconnect_reason()can return the disconnect reason.
SocketContext reference
Method id()
pub fn id(&self) -> &SidReturns
- Socket identifier (
socketioxide::Sid).
When to use it
- Logging, traceability, and 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
- Checking if the socket is still active before performing operations.
Method ns()
pub fn ns(&self) -> &strReturns
- The current namespace path for 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.Noneinconnectionanddisconnection.
When to use it
- Routing logic by event name or tracking per-event metrics.
Method disconnect_reason()
pub fn disconnect_reason(&self) -> Option<&DisconnectReason>Returns
Some(reason)in disconnect handlers.Nonein connect/message handlers.
When to use it
- Auditing why a connection closed.
Method protocol_version()
pub fn protocol_version(&self) -> ProtocolVersionReturns
- Negotiated Socket.IO protocol version.
When to use it
- Client compatibility checks and diagnostics.
Method transport_type()
pub fn transport_type(&self) -> TransportTypeReturns
- Active transport (
websocketorpolling).
When to use it
- Telemetry, transport-specific behavior, and handshake debugging.
Method try_data::<T>()
pub fn try_data<T: DeserializeOwned>(&self) -> Result<T, SocketError>Returns
Ok(T)when payload deserialization succeeds.Err(SocketError)when payload is missing or parsing fails.
When to use it
- Deserializing payload (or connect
auth) without validator-based validation.
When not to use it
- When you need declarative validation rules. In that case, use
try_validated_data::<T>().
Notes
- This method consumes 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)when deserialization and validation both succeed.Err(SocketError)when parsing fails, payload is missing, or validation fails.
When to use it
- When payload must satisfy
validatorrules.
When not to use it
- If you have not enabled the
validation-validatorfeature.
Notes
- Internally, this method uses
try_data(), so it also consumes payload.
Method has_data()
pub fn has_data(&self) -> boolReturns
trueif payload has not been consumed yet.
When to use it
- To avoid parsing payload twice.
Method query::<T>()
pub fn query<T: DeserializeOwned>(&self) -> Result<Option<T>, SocketError>Returns
Ok(Some(T))if query string exists and is valid.Ok(None)if no query string is present.Err(SocketError)if query exists but cannot be deserialized.
When to use it
- Reading URL query parameters during connection.
Method emit()
pub fn emit<T>(&self, event: impl AsRef<str>, data: &T) -> Result<(), SocketError>
where
T: Serialize + ?SizedReturns
Ok(())when the event is sent.Err(SocketError)if sending fails.
When to use it
- Sending 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
- Broadcasting a message to every connected client.
Method local()
pub fn local(&self) -> BroadcastOperators<A>Returns
- A broadcast operator that sends only to clients connected to this node.
When to use it
- Broadcasting only to the current server instance (multi-node deployments).
Method to()
pub fn to(&self, rooms: impl RoomParam) -> BroadcastOperators<A>Returns
- A broadcast operator scoped to the specified rooms.
When to use it
- Sending to specific rooms that the socket belongs to.
Method within()
pub fn within(&self, rooms: impl RoomParam) -> BroadcastOperators<A>Returns
- A broadcast operator scoped to the specified rooms (alias for
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
- Broadcasting to all except certain rooms.
Method timeout()
pub fn timeout(&self, timeout: Duration) -> ConfOperators<'_, A>Returns
- A configuration operator with a custom timeout for acknowledgement.
When to use it
- Setting a custom timeout when sending a message with an acknowledgement.
Method join()
pub fn join(&self, rooms: impl RoomParam)When to use it
- Adding the current socket to one or more rooms.
Method leave()
pub fn leave(&self, rooms: impl RoomParam)When to use it
- Removing the current socket from one or more rooms.
Method leave_all()
pub fn leave_all(&self)When to use it
- Removing 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(())when ACK is sent.Err(SendError)if ACK is unavailable or sending fails.
When to use it
- To answer client callbacks when
has_ack()istrue.
When not to use it
- In handlers without ACK support.
Notes
- Consumes
self; you cannot keep using the sameSocketContextafter callingack(...).
Method req_parts()
pub fn req_parts(&self) -> &PartsReturns
- The HTTP request parts from the initial handshake.
When to use it
- Accessing raw HTTP request data (method, URI, etc.).
Method headers()
pub fn headers(&self) -> &HeaderMapReturns
- A reference to the socket's request headers.
When to use it
- Reading HTTP headers from the initial handshake request.
Method authorization()
pub fn authorization(&self) -> Option<&str>Returns
- The value of the
Authorizationheader, if present.
When to use it
- Extracting bearer tokens or other auth data from the handshake.
Method extensions()
pub fn extensions(&self) -> &ExtensionsReturns
- Socket extension storage.
When to use it
- Sharing state across the lifetime of a connection.
Method http_extensions()
pub fn http_extensions(&self) -> &HttpExtensionsReturns
- HTTP extensions from the initial handshake request.
When to use it
- Reusing values written by HTTP layers/interceptors during handshake.
Method disconnect()
pub fn disconnect(self) -> Result<(), SocketError>Returns
Ok(())when disconnect succeeds.Err(SocketError)if the connection cannot be closed cleanly.
When to use it
- When the server needs to close a connection explicitly.
Notes
- Consumes
self; after calling it, you cannot reuse the same context.
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());
}
}
