Skip to content

Al construir un servidor WebSocket, normalmente es necesario almacenar alguna información de identificación o contexto asociado con cada cliente conectado.

Con Bun.serve(), estos "datos contextuales" se establecen cuando la conexión se actualiza inicialmente pasando un parámetro data en la llamada server.upgrade().

ts
Bun.serve({
  fetch(req, server) {
    const success = server.upgrade(req, {
      data: {
        socketId: Math.random(),
    },
  },
});
// manejar HTTP normalmente
// ...

}, websocket: { // TypeScript: especificar el tipo de ws.data así data: {} as { socketId: number },

// definir handlers websocket
async message(ws, message) {
  // los datos contextuales están disponibles como la propiedad `data`
  // en la instancia WebSocket
  console.log(`Recibido ${message} de ${ws.data.socketId}`);
},

}, });


---

Es común leer cookies/cabeceras de la solicitud entrante para identificar al cliente que se conecta.

```ts server.ts
type WebSocketData = {
  createdAt: number;
  token: string;
  userId: string;
};

Bun.serve({
  async fetch(req, server) {
    // usar una librería para parsear cookies
    const cookies = parseCookies(req.headers.get("Cookie"));
    const token = cookies["X-Token"];
    const user = await getUserFromToken(token);

    const upgraded = server.upgrade(req, {
      data: {
        createdAt: Date.now(),
        token: cookies["X-Token"],
        userId: user.id,
      },
    });

    if (upgraded) return undefined;
  },
  websocket: {
    // TypeScript: especificar el tipo de ws.data así
    data: {} as WebSocketData,

    async message(ws, message) {
      // guardar el mensaje en una base de datos
      await saveMessageToDatabase({
        message: String(message),
        userId: ws.data.userId,
      });
    },
  },
});

Bun por www.bunjs.com.cn editar