---
name: WSMessage
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
  type WSMessage struct {
      Type     string `json:"type"`
      Payload  []byte `json:"payload"`
      SenderID string `json:"sender_id"`
      Ts       int64  `json:"ts"`
  }
description: "Mensaje tipado que viaja por WebSocket entre cliente y servidor. El campo Type permite al receptor decidir como procesar el payload. Incluye SenderID y timestamp para trazabilidad."
tags: [websocket, message, protocol, infra, realtime]
uses_types: []
file_path: "functions/infra/ws_message.go"
---

## Ejemplo

```go
msg := WSMessage{
    Type:     "chat",
    Payload:  []byte(`{"text":"hola"}`),
    SenderID: "user-1",
    Ts:       time.Now().UnixMilli(),
}
data, _ := json.Marshal(msg)
WSBroadcast(hub, data)
```

## Notas

Tipo producto. Las tags `json:` permiten serializar directamente a JSON para enviar por el wire. `Payload` es `[]byte` para permitir tanto JSON anidado como datos binarios codificados en base64. `Ts` en milisegundos epoch para compatibilidad con `Date.now()` en el browser.

No es obligatorio usar este tipo — apps que necesiten un protocolo distinto pueden enviar bytes arbitrarios via `WSBroadcast` o `WSSend`. Es solo un convenio recomendado para protocolos chat-like.
