aboutsummaryrefslogtreecommitdiff
path: root/docs/guides/websocket/context.md
blob: 9e387d685b8c3a16000b8d0ac86eef4f1bd8a6a6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
---
name: Set per-socket contextual data on a WebSocket
---

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/api/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
Bun.serve<{ socketId: number }>({
  fetch(req, server) {
    const success = server.upgrade(req, {
      data: {
        socketId: Math.random(),
      },
    });
    if (success) return undefined;

    // handle HTTP request normally
    // ...
  },
  websocket: {
    // define websocket handlers
    async message(ws, message) {
      // the contextual dta 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
type WebSocketData = {
  createdAt: number;
  token: string;
  userId: string;
};

// TypeScript: specify the type of `data`
Bun.serve<WebSocketData>({
  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(ws.data.authToken);

    const upgraded = server.upgrade(req, {
      data: {
        createdAt: Date.now(),
        token: cookies["X-Token"],
        userId: user.id,
      },
    });

    if (upgraded) return undefined;
  },
  websocket: {
    async message(ws, message) {
      // save the message to a database
      await saveMessageToDatabase({
        message: String(message),
        userId: ws.data.userId,
      });
    },
  },
});
```
>/+124 2023-03-05consider current working directory when resolving relative paths (#2313)Gravatar Alex Lam S.L 4-34/+65 2023-03-05Update out of date docGravatar Jarred Sumner 1-1/+1 2023-03-05[install] fix connection error detection (#2307)Gravatar Alex Lam S.L 7-82/+146 2023-03-05Test action comment (#2310)Gravatar Jarred Sumner 4-53/+76 2023-03-04Run testsGravatar Jarred Sumner 2-19/+88 2023-03-04Artifact versionGravatar Jarred Sumner 1-2/+21 2023-03-04dump failing tests to diskGravatar Jarred Sumner 3-3/+18 2023-03-04Update runner.node.mjsGravatar Jarred Sumner 1-7/+15 2023-03-04Update runner.node.mjsGravatar Jarred Sumner 1-1/+4 2023-03-04Update runner.node.mjsGravatar Jarred Sumner 1-3/+17 2023-03-04Update runner.node.mjsGravatar Jarred Sumner 1-28/+3 2023-03-04Update runner.node.mjsGravatar Jarred Sumner 1-3/+28 2023-03-04Update run-test-manually.ymlGravatar Jarred Sumner 1-2/+2 2023-03-04Update run-test-manually.ymlGravatar Jarred Sumner 1-2/+2 2023-03-04Add node runnerGravatar Jarred Sumner 2-0/+96 2023-03-04Update runner.tsGravatar Jarred Sumner 1-3/+6 2023-03-04chdirGravatar Jarred Sumner 1-1/+2 2023-03-04oopsGravatar Jarred Sumner 1-64/+30 2023-03-04Update run-test-manually.ymlGravatar Jarred Sumner 1-3/+8 2023-03-04fixupGravatar Jarred Sumner 1-7/+5 2023-03-04Update run-test-manually.ymlGravatar Jarred Sumner 1-0/+1 2023-03-04Update run-test-manually.ymlGravatar Jarred Sumner 1-1/+1 2023-03-04Update run-test-manually.ymlGravatar Jarred Sumner 1-1/+3 2023-03-04Update run-test-manually.ymlGravatar Jarred Sumner 1-2/+2 2023-03-04Rename packages/bun-test to packages/bun-internal-testGravatar Jarred Sumner 6-0/+0 2023-03-04Update run-test-manually.ymlGravatar Jarred Sumner 1-0/+1 2023-03-04Update run-test-manually.ymlGravatar Jarred Sumner 1-1/+1 2023-03-04Update run-test-manually.ymlGravatar Jarred Sumner 1-1/+1 2023-03-04Update run-test-manually.ymlGravatar Jarred Sumner 1-1/+0