Skip to content

Ao construir um servidor WebSocket, é tipicamente necessário armazenar algumas informações de identificação ou contexto associado a cada cliente conectado.

Com Bun.serve(), esses "dados contextuais" são definidos quando a conexão é inicialmente atualizada passando um parâmetro data na chamada server.upgrade().

ts
Bun.serve({
  fetch(req, server) {
    const success = server.upgrade(req, {
      data: {
        socketId: Math.random(),
      },
    });
    if (success) return undefined;

    // lida com a requisição HTTP normalmente
    // ...
  },
  websocket: {
    // TypeScript: especifique o tipo de ws.data assim
    data: {} as { socketId: number },

    // define handlers websocket
    async message(ws, message) {
      // os dados contextuais estão disponíveis como a propriedade `data`
      // na instância do WebSocket
      console.log(`Recebido ${message} de ${ws.data.socketId}`);
    },
  },
});

É comum ler cookies/cabeçalhos da requisição recebente para identificar o cliente que está se conectando.

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

Bun.serve({
  async fetch(req, server) {
    // usa uma biblioteca 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: especifique o tipo de ws.data assim data: {} as WebSocketData,

async message(ws, message) {
  // salva a mensagem em um banco de dados
  await saveMessageToDatabase({
    message: String(message),
    userId: ws.data.userId,
  });
},

}, });

Bun by www.bunjs.com.cn edit