Manejo de eventos y referencia de SocketContext
En Sword, los controladores Socket.IO trabajan con eventos (#[on("...")]) y reciben un SocketContext. Esta pagina unifica el flujo de eventos con la referencia de la API publica de SocketContext, basada en la implementacion real del crate sword-socketio.
Tipos de eventos
Los handlers mas comunes son:
connectiondisconnection- eventos personalizados como
message,chat-messageoroom:join
Comportamiento por tipo de handler
- En
connection,event()retornaNone;try_data::<T>()intenta leerauthdel handshake. - En
message,event()retornaSome(nombre_evento)ytry_data::<T>()lee el payload del evento. - En
disconnection,disconnect_reason()puede retornar el motivo de desconexion.
Referencia de SocketContext
Atributo socket
rust
pub socket: SocketRef<A>Retorna
- Acceso directo al socket de
socketioxide.
Cuando usarlo
- Para
emit,join,leave,broadcast,to(room), etc.
Cuando no usarlo
- Cuando solo necesitas informacion del contexto (
id,event,transport_type, etc.).
Método id()
rust
pub fn id(&self) -> &SidRetorna
- Identificador del socket (
socketioxide::Sid).
Cuando usarlo
- Logging, trazabilidad, asociar eventos a una conexion especifica.
Método event()
rust
pub fn event(&self) -> Option<&str>Retorna
Some(nombre_evento)en handlers de mensaje.Noneenconnectionydisconnection.
Cuando usarlo
- Para enrutar logica por nombre de evento o registrar metricas por evento.
Método protocol_version()
rust
pub fn protocol_version(&self) -> ProtocolVersionRetorna
- Version de protocolo Socket.IO negociada.
Cuando usarlo
- Diagnostico y compatibilidad de clientes.
Método transport_type()
rust
pub fn transport_type(&self) -> TransportTypeRetorna
- Transporte activo (
websocketopolling).
Cuando usarlo
- Telemetria, reglas por tipo de transporte, debugging de handshake.
Método disconnect_reason()
rust
pub fn disconnect_reason(&self) -> Option<&DisconnectReason>Retorna
Some(reason)en handlers de desconexion.Noneen connect/message.
Cuando usarlo
- Auditar porque se cierra una conexion.
Método try_data::<T>()
rust
pub fn try_data<T: DeserializeOwned>(&self) -> Result<T, SocketError>Retorna
Ok(T)si el payload pudo deserializarse.Err(SocketError)si no hay payload disponible o falla el parseo.
Cuando usarlo
- Cuando necesitas deserializar payload (o
authenconnection) sin validacion devalidator.
Cuando no usarlo
- Si necesitas reglas declarativas de validacion; en ese caso usa
try_validated_data::<T>().
Notas
- Este metodo consume el payload interno. Una segunda llamada en el mismo handler falla.
Método try_validated_data::<T>()
rust
pub fn try_validated_data<T>(&self) -> Result<T, SocketError>
where
T: DeserializeOwned + ValidateRetorna
Ok(T)si deserializa y valida correctamente.Err(SocketError)si falla parseo, no hay payload o falla validacion.
Cuando usarlo
- Cuando el payload debe cumplir reglas de
validator.
Cuando no usarlo
- Si no habilitaste la feature
validation-validator.
Notas
- Internamente usa
try_data(), por lo que tambien consume el payload.
Método has_data()
rust
pub fn has_data(&self) -> boolRetorna
truesi el payload aun no fue consumido.
Cuando usarlo
- Para evitar intentar parsear dos veces.
Método has_ack()
rust
pub fn has_ack(&self) -> boolRetorna
truesi el evento actual incluye callback ACK.
Cuando usarlo
- Antes de llamar
ack(...)en handlers de mensaje.
Método ack(&value)
rust
pub fn ack<D>(self, data: &D) -> Result<(), SendError>
where
D: Serialize + ?SizedRetorna
Ok(())si el ACK se envia.Err(SendError)si no hay ACK disponible o falla el envio.
Cuando usarlo
- Para responder callbacks del cliente cuando
has_ack()estrue.
Cuando no usarlo
- En handlers sin ACK asociado.
Notas
- Consume
self; despues deack(...)no puedes seguir usando eseSocketContext.
Método extensions()
rust
pub fn extensions(&self) -> &ExtensionsRetorna
- Almacen de extensiones asociado al socket.
Cuando usarlo
- Compartir estado durante la vida de la conexion.
Método http_extensions()
rust
pub fn http_extensions(&self) -> &HttpExtensionsRetorna
- Extensiones HTTP del handshake inicial.
Cuando usarlo
- Reutilizar datos escritos en interceptors/layers HTTP durante el handshake.
Método disconnect()
rust
pub fn disconnect(self) -> Result<(), SocketError>Retorna
Ok(())si la desconexion se ejecuta.Err(SocketError)si falla el cierre de conexion.
Cuando usarlo
- Cuando el servidor decide cortar la conexion activamente.
Notas
- Consume
self; despues de llamarlo no puedes reutilizar el contexto.
Ejemplo base
rust
use sword::prelude::*;
use sword::socketio::*;
#[controller(kind = Controller::SocketIo, namespace = "/chat")]
pub struct ChatController;
impl ChatController {
#[on("connection")]
async fn on_connect(&self, ctx: SocketContext) {
println!("connected: {}", ctx.id());
}
#[on("message")]
async fn on_message(&self, ctx: SocketContext) {
let Ok(message) = ctx.try_data::<String>() else {
return;
};
if ctx.has_ack() {
let _ = ctx.ack(&"ok");
return;
}
ctx.socket.emit("message", &message).ok();
}
#[on("disconnection")]
async fn on_disconnect(&self, ctx: SocketContext) {
println!("reason: {:?}", ctx.disconnect_reason());
}
}
