diff options
Diffstat (limited to 'docs/guides/websocket/pubsub.md')
-rw-r--r-- | docs/guides/websocket/pubsub.md | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/docs/guides/websocket/pubsub.md b/docs/guides/websocket/pubsub.md new file mode 100644 index 000000000..7403d4d2f --- /dev/null +++ b/docs/guides/websocket/pubsub.md @@ -0,0 +1,38 @@ +--- +name: Build a publish-subscribe WebSocket server +--- + +Bun's server-side `WebSocket` API provides a native pub-sub API. Sockets can be subscribed to a set of named channels using `socket.subscribe(<name>)`; messages can be published to a channel using `socket.publish(<name>, <message>)`. + +This code snippet implements a simple single-channel chat server. + +```ts +const server = Bun.serve<{ username: string }>({ + fetch(req, server) { + const cookies = req.headers.get("cookie"); + const username = getUsernameFromCookies(cookies); + const success = server.upgrade(req, { data: { username } }); + if (success) return undefined; + + return new Response("Hello world"); + }, + websocket: { + open(ws) { + const msg = `${ws.data.username} has entered the chat`; + ws.subscribe("the-group-chat"); + ws.publish("the-group-chat", msg); + }, + message(ws, message) { + // the server re-broadcasts incoming messages to everyone + ws.publish("the-group-chat", `${ws.data.username}: ${message}`); + }, + close(ws) { + const msg = `${ws.data.username} has left the chat`; + ws.publish("the-group-chat", msg); + ws.unsubscribe("the-group-chat"); + }, + }, +}); + +console.log(`Listening on ${server.hostname}:${server.port}`); +``` |