Al construir un servidor WebSocket, normalmente es necesario almacenar alguna información de identificación o contexto asociado con cada cliente conectado.
Con Bun.serve(), estos "datos contextuales" se establecen cuando la conexión se actualiza inicialmente pasando un parámetro data en la llamada server.upgrade().
ts
Bun.serve({
fetch(req, server) {
const success = server.upgrade(req, {
data: {
socketId: Math.random(),
},
},
});// manejar HTTP normalmente
// ...
}, websocket: { // TypeScript: especificar el tipo de ws.data así data: {} as { socketId: number },
// definir handlers websocket
async message(ws, message) {
// los datos contextuales están disponibles como la propiedad `data`
// en la instancia WebSocket
console.log(`Recibido ${message} de ${ws.data.socketId}`);
},
}, });
---
Es común leer cookies/cabeceras de la solicitud entrante para identificar al cliente que se conecta.
```ts server.ts
type WebSocketData = {
createdAt: number;
token: string;
userId: string;
};
Bun.serve({
async fetch(req, server) {
// usar una librería 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: especificar el tipo de ws.data así
data: {} as WebSocketData,
async message(ws, message) {
// guardar el mensaje en una base de datos
await saveMessageToDatabase({
message: String(message),
userId: ws.data.userId,
});
},
},
});