---
name: WSHub
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
  type WSHub struct {
      Clients    map[*WSClient]bool
      Broadcast  chan []byte
      Register   chan *WSClient
      Unregister chan *WSClient
  }
description: "Hub que gestiona el ciclo de vida de conexiones WebSocket. Mantiene un mapa de clientes activos y canales para registro, desregistro y broadcast. Se ejecuta como goroutine via Run() y se compone con ws_handler para servir conexiones."
tags: [websocket, hub, server, broadcast, infra, realtime]
uses_types: [WSClient_go_infra]
file_path: "functions/infra/ws_hub.go"
---

## Ejemplo

```go
hub := NewWSHub()
go hub.Run()
defer hub.Stop()

routes := []Route{
    {Method: "GET", Path: "/ws", Handler: WSHandler(hub, []string{"*"})},
}
```

## Notas

Tipo producto. El campo `done` interno (no exportado) controla el cierre limpio. `Broadcast` es buffereado (256) para no bloquear emisores. Cada cliente lento se desconecta automaticamente si su canal `Send` se llena durante un broadcast — esta es la garantia anti-backpressure: un cliente que no consume no afecta a los demas.

El loop `Run()` es de un solo thread escribiendo al mapa, asi que no hace falta mutex. Para parar limpiamente: `hub.Stop()` cierra `done`, libera todos los `client.Send` y termina el loop.
