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,
});
},
},
});