WS Multi-Canal — Referencia de conexion

Documenta los tres canales WebSocket disponibles y el formato de mensajes de cada uno.

CHAT

Canal de mensajeria en tiempo real

URL de conexion
ws://<host>/ws/chat?token=<token>&room=<sala>&username=<nombre>
token opcional — token de sesion previo para reconectarse. Si se omite, el servidor genera uno nuevo.
room opcional — nombre de la sala. Default: general.
username opcional — nombre visible en el chat.

Mensajes enviados por el cliente

↑ SEND — Enviar mensaje
{
  "type": "message",
  "content": "Hola a todos"
}
↑ SEND — Lista de miembros
{
  "type": "members"
}
↑ SEND — Ping
{
  "type": "ping"
}

Mensajes recibidos del servidor

↓ RECV — Inicio de sesion
{
  "type": "init",
  "channel": "chat",
  "token": "uuid-del-cliente",
  "room": "general",
  "username": "User1",
  "members": ["uuid1", "uuid2"]
}
↓ RECV — Mensaje en sala
{
  "type": "message",
  "channel": "chat",
  "room": "general",
  "from": "uuid-del-emisor",
  "username": "User1",
  "content": "Hola a todos",
  "ts": "2024-01-01T12:00:00"
}
↓ RECV — Usuario entro / salio
{
  "type": "user_joined",  // o user_left
  "channel": "chat",
  "room": "general",
  "token": "uuid",
  "username": "User1",
  "ts": "2024-01-01T12:00:00"
}
↓ RECV — Pong / Miembros
{ "type": "pong", "ts": "..." }

{ "type": "members",
  "room": "general",
  "members": ["uuid1"] }
Salas: cada valor distinto de room crea un canal aislado. Los mensajes solo se difunden dentro de la misma sala.
MONITOR

Canal de metricas y alertas

URL de conexion
ws://<host>/ws/monitor?token=<token>&role=<rol>
token opcional — token de sesion para reconectarse.
role opcional subscriber (recibe datos) o publisher (envia datos). Default: subscriber.

Mensajes enviados por el cliente

↑ SEND — Publicar metrica
{
  "type": "metric",
  "data": {
    "cpu": 72.5,
    "ram": 4096,
    "disco": 88.1
  }
}
↑ SEND — Publicar alerta
{
  "type": "alert",
  "level": "warning",
  "message": "CPU al 90%",
  "data": {
    "cpu": 90.2
  }
}
↑ SEND — Estado / Ping
{ "type": "status" }

{ "type": "ping" }

Mensajes recibidos del servidor

↓ RECV — Inicio de sesion
{
  "type": "init",
  "channel": "monitor",
  "token": "uuid",
  "role": "subscriber",
  "subscribers": 3
}
↓ RECV — Metrica recibida
{
  "type": "metric",
  "channel": "monitor",
  "from": "uuid-del-publisher",
  "data": { "cpu": 72.5 },
  "ts": "2024-01-01T12:00:00"
}
↓ RECV — Alerta recibida
{
  "type": "alert",
  "channel": "monitor",
  "from": "uuid-del-publisher",
  "level": "warning",
  "message": "CPU al 90%",
  "data": { "cpu": 90.2 },
  "ts": "2024-01-01T12:00:00"
}
↓ RECV — Estado
{
  "type": "status",
  "channel": "monitor",
  "subscribers": 3,
  "session": {
    "token": "...",
    "connected": true
  }
}
Flujo: los publisher envian metricas/alertas → el servidor las difunde a todos los suscriptores activos (incluido el publisher mismo). Niveles validos: info, warning, critical.
LOCATION

Canal de ubicacion en tiempo real

URL de conexion
ws://<host>/ws/location?token=<token>&group=<grupo>
token opcional — token de sesion para reconectarse.
group opcional — nombre del grupo de seguimiento. Default: default. Ej: fleet-01, delivery.

Mensajes enviados por el cliente

↑ SEND — Publicar ubicacion
{
  "type": "location",
  "lat": 19.432608,
  "lng": -99.133209,

  // Opcionales:
  "accuracy": 5.0,
  "speed": 12.3,
  "heading": 270.0,
  "altitude": 2240.0
}
↑ SEND — Snapshot del grupo
{
  "type": "snapshot"
}
↑ SEND — Ping
{
  "type": "ping"
}

Mensajes recibidos del servidor

↓ RECV — Inicio de sesion
{
  "type": "init",
  "channel": "location",
  "token": "uuid",
  "group": "fleet-01",
  "snapshot": [
    {
      "token": "uuid2",
      "lat": 19.43,
      "lng": -99.13,
      "ts": "..."
    }
  ]
}
↓ RECV — Ubicacion de otro cliente
{
  "type": "location",
  "channel": "location",
  "group": "fleet-01",
  "token": "uuid-del-emisor",
  "lat": 19.432608,
  "lng": -99.133209,
  "speed": 12.3,
  "heading": 270.0,
  "ts": "2024-01-01T12:00:00"
}
↓ RECV — ACK al publicar
{
  "type": "ack",
  "ts": "2024-01-01T12:00:00"
}
↓ RECV — Cliente salio del grupo
{
  "type": "user_left",
  "channel": "location",
  "group": "fleet-01",
  "token": "uuid",
  "ts": "2024-01-01T12:00:00"
}
Broadcast selectivo: la ubicacion publicada se envia a todos los demas miembros del grupo, no al emisor. Al conectarse, el cliente recibe el snapshot con las ultimas posiciones conocidas de cada miembro activo del grupo.
SESION

Gestion de token y sesion

Primera conexion (sin token)
// El servidor devuelve un token nuevo
// en el mensaje "init" de cualquier canal.
// Guardarlo para reconexiones.

const ws = new WebSocket(
  "ws://host/ws/chat?room=general"
);

ws.onmessage = (e) => {
  const d = JSON.parse(e.data);
  if (d.type === "init") {
    localStorage.setItem("token", d.token);
  }
};
Reconexion (con token)
// Pasar el token guardado en la URL.
// El servidor restaura la sesion.

const token = localStorage.getItem("token");
const ws = new WebSocket(
  `ws://host/ws/chat?room=general&token=${token}`
);
TTL: una sesion sin cliente conectado expira despues de 30 minutos. Mientras el WebSocket este abierto, la sesion no expira. Usar type: "ping" para mantener activa la conexion en redes inestables.
Endpoints REST de utilidad
GET /status — estado global del servidor (salas, grupos, suscriptores activos)
GET /sessions — lista de sesiones activas