Skip to content

Beim Erstellen eines WebSocket-Servers ist es typischerweise notwendig, einige identifizierende Informationen oder Kontext zu speichern, die mit jedem verbundenen Client assoziiert sind.

Mit Bun.serve() werden diese "kontextuellen Daten" gesetzt, wenn die Verbindung initial aktualisiert wird, indem ein data-Parameter im server.upgrade()-Aufruf übergeben wird.

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

    // HTTP-Anfrage normal behandeln
    // ...
  },
  websocket: {
    // TypeScript: Geben Sie den Typ von ws.data so an
    data: {} as { socketId: number },

    // WebSocket-Handler definieren
    async message(ws, message) {
      // die kontextuellen Daten sind als `data`-Eigenschaft
      // auf der WebSocket-Instanz verfügbar
      console.log(`Empfangen ${message} von ${ws.data.socketId}}`);
    },
  },
});

Es ist üblich, Cookies/Header aus der eingehenden Anfrage zu lesen, um den verbindenden Client zu identifizieren.

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

Bun.serve({
  async fetch(req, server) {
    // eine Bibliothek zum Parsen von Cookies verwenden
    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: Geben Sie den Typ von ws.data so an
    data: {} as WebSocketData,

    async message(ws, message) {
      // die Nachricht in einer Datenbank speichern
      await saveMessageToDatabase({
        message: String(message),
        userId: ws.data.userId,
      });
    },
  },
});

Bun von www.bunjs.com.cn bearbeitet