A WebSocket server typically needs to store some identifying information or context for each connected client.With Bun.serve(), set this “contextual data” by passing a data parameter to server.upgrade() when upgrading the connection.
server.ts
Bun.serve({ fetch(req, server) { const success = server.upgrade(req, { data: { socketId: Math.random(), }, }); if (success) return undefined; // handle HTTP request normally // ... }, websocket: { // TypeScript: specify the type of ws.data like this data: {} as { socketId: number }, // define websocket handlers async message(ws, message) { // the contextual data is available as the `data` property // on the WebSocket instance console.log(`Received ${message} from ${ws.data.socketId}}`); }, },});
It’s common to read cookies/headers from the incoming request to identify the connecting client.
server.ts
type WebSocketData = { createdAt: number; token: string; userId: string;};Bun.serve({ async fetch(req, server) { // use a library to parse 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: specify the type of ws.data like this data: {} as WebSocketData, async message(ws, message) { // save the message to a database await saveMessageToDatabase({ message: String(message), userId: ws.data.userId, }); }, },});