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'| Forma | Descripció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: *).