La API WebSocket del lado del servidor de Bun proporciona una API nativa de publicación-suscripción. Los sockets pueden suscribirse a un conjunto de canales con nombre usando socket.subscribe(<nombre>); los mensajes pueden publicarse en un canal usando socket.publish(<nombre>, <mensaje>).
Este fragmento de código implementa un servidor de chat simple de un solo canal.
ts
const server = Bun.serve({
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: {
// TypeScript: especificar el tipo de ws.data así
data: {} as { username: string },
open(ws) {
const msg = `${ws.data.username} ha entrado al chat`;
ws.subscribe("el-chat-grupal");
server.publish("el-chat-grupal", msg);
},
message(ws, message) {
// el servidor retransmite los mensajes entrantes a todos
server.publish("el-chat-grupal", `${ws.data.username}: ${message}`);
},
close(ws) {
const msg = `${ws.data.username} ha dejado el chat`;
server.publish("el-chat-grupal", msg);
ws.unsubscribe("el-chat-grupal");
},
},
});
console.log(`Escuchando en ${server.hostname}:${server.port}`);