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