Skip to content

Lors de la construction d'un serveur WebSocket, il est généralement nécessaire de stocker des informations d'identification ou un contexte associé à chaque client connecté.

Avec Bun.serve(), ces "données contextuelles" sont définies lors de la mise à niveau initiale de la connexion en passant un paramètre data dans l'appel server.upgrade().

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

    // gérer la requête HTTP normalement
    // ...
  },
  websocket: {
    // TypeScript : spécifiez le type de ws.data comme ceci
    data: {} as { socketId: number },

    // définir les gestionnaires websocket
    async message(ws, message) {
      // les données contextuelles sont disponibles via la propriété `data`
      // sur l'instance WebSocket
      console.log(`Reçu ${message} de ${ws.data.socketId}`);
    },
  },
});

Il est courant de lire les cookies/en-têtes de la requête entrante pour identifier le client qui se connecte.

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

Bun.serve({
  async fetch(req, server) {
    // utiliser une bibliothèque pour analyser les 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 : spécifiez le type de ws.data comme ceci
    data: {} as WebSocketData,

    async message(ws, message) {
      // enregistrer le message dans une base de données
      await saveMessageToDatabase({
        message: String(message),
        userId: ws.data.userId,
      });
    },
  },
});

Bun édité par www.bunjs.com.cn