Skip to content

Referencia: Controladores Socket

@socketController(config?)

Decorador de clase. Registra un controlador WebSocket (Socket.IO).

import { socketController } from '@wabot-dev/framework'
@socketController()
export class ChatSocketController { }
// Con namespace
@socketController('ventas')
export class VentasSocketController { }
// Con objeto de config
@socketController({ namespace: 'ventas' })
export class VentasSocketController { }

La clase se vuelve inyectable. Se crea un contenedor hijo por conexión Socket.IO, por lo que puede inyectar dependencias con estado aislado por cliente.


@onSocketEvent(config)

Decorador de método. Suscribe el método a un evento de Socket.IO.

import { onSocketEvent } from '@wabot-dev/framework'
FormaDescripción
@onSocketEvent('nombre-evento')String directo
@onSocketEvent({ event: 'nombre-evento' })Objeto de config
@socketController('chat')
export class ChatController {
@onSocketEvent('mensaje')
onMensaje(data: MensajeData, socket: Socket) {
socket.emit('respuesta', { texto: 'Hola!' })
}
@onSocketEvent('unirse-sala')
onUnirse(data: SalaData, socket: Socket) {
socket.join(data.salaId)
socket.to(data.salaId).emit('nuevo-miembro', { userId: socket.id })
}
}

El handler recibe los argumentos en el mismo orden que el cliente los emite, más la instancia Socket como último parámetro.


Validación de parámetros

El primer parámetro del handler puede ser una clase validada automáticamente:

import { isString, isNotEmpty } from '@wabot-dev/framework'
export class MensajeData {
@isString()
@isNotEmpty()
texto: string = ''
@isString()
@isNotEmpty()
salaId: string = ''
}

Middlewares de handshake

Los middlewares de handshake se ejecutan cuando un cliente se conecta, antes de aceptar la conexión. Se inyectan en el decorador @socket() del canal de chat, o directamente en @socketController() si aplica.

IHandshakeMiddleware:

import { IHandshakeMiddleware, injectable } from '@wabot-dev/framework'
import { Socket } from 'socket.io'
@injectable()
export class JwtHandshakeMiddleware implements IHandshakeMiddleware {
constructor(private jwtService: JwtService) {}
async handle(socket: Socket, next: (err?: Error) => void) {
const token = socket.handshake.auth?.token
if (!token) return next(new Error('Token requerido'))
const payload = this.jwtService.verify(token)
if (!payload) return next(new Error('Token inválido'))
// Adjuntar datos al socket para uso posterior
;(socket as any).userId = payload.sub
next()
}
}

runSocketControllers(controllers, container?)

Inicia el servidor Socket.IO y registra todos los controladores.

import { runSocketControllers } from '@wabot-dev/framework'
await runSocketControllers([ChatSocketController, NotificacionesController])

La variable de entorno SOCKET_CORS_ORIGIN controla el origen CORS aceptado (default: *).