---
name: WSClient
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
  type WSClient struct {
      Hub  *WSHub
      Conn *websocket.Conn
      Send chan []byte
      ID   string
  }
description: "Conexion WebSocket individual gestionada por un WSHub. Cada cliente tiene su propio canal Send buffereado para entregar mensajes en orden y un ID para identificarlo en broadcasts y handlers."
tags: [websocket, client, connection, server, infra, realtime]
uses_types: [WSHub_go_infra]
file_path: "functions/infra/ws_client.go"
---

## Ejemplo

```go
client := &WSClient{
    Hub:  hub,
    Conn: wsConn,
    Send: make(chan []byte, 64),
    ID:   "user-42",
}
hub.Register <- client
```

## Notas

Tipo producto. El canal `Send` debe ser buffereado (tipico 64-256) para evitar que un cliente lento bloquee el broadcast del hub. `Conn` usa `nhooyr.io/websocket` que soporta `context.Context` nativamente. `ID` es texto libre — la app que monta el handler decide su semantica (UUID, username, session id, etc.).

Cada cliente tiene normalmente dos goroutines internas:
- readPump: lee del Conn y publica al hub.Broadcast (o procesa con callback)
- writePump: consume del Send y escribe al Conn
