UNPKG

bun-types

Version:

Type definitions and documentation for Bun, an incredibly fast JavaScript runtime

80 lines (67 loc) 2.07 kB
--- title: Set per-socket contextual data on a WebSocket sidebarTitle: Contextual data mode: center --- When building a WebSocket server, it's typically necessary to store some identifying information or context associated with each connected client. With [Bun.serve()](/docs/runtime/http/websockets#contextual-data), this "contextual data" is set when the connection is initially upgraded by passing a `data` parameter in the `server.upgrade()` call. ```ts server.ts icon="/icons/typescript.svg" 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. ```ts server.ts icon="/icons/typescript.svg" 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, }); }, }, }); ```