Enable compression for WebSocket messages

Set the perMessageDeflate parameter to enable the permessage-deflate WebSocket extension. Bun then negotiates compression with clients that support it. Messages sent with ws.send() and ws.publish() are still uncompressed unless you opt in per message (see below). Messages sent with server.publish() are compressed unless you opt out per message.

server.ts
Bun.serve({
  // ...
  websocket: {
    // enable compression
    perMessageDeflate: true,
  },
});

To enable compression for individual messages, pass true as the last parameter to ws.send() or ws.publish(). This requires perMessageDeflate to be enabled; otherwise Bun sends the message uncompressed.

server.ts
Bun.serve({
  // ...
  websocket: {
    perMessageDeflate: true,
    async message(ws, message) {
      // send a compressed message
      ws.send(message, true);
      // publish a compressed message to a topic
      ws.publish("chat", message, true);
    },
  },
});

server.publish() compresses by default. Pass false as the third parameter to publish a message uncompressed. Compression makes short messages larger, so pass false for those.

server.ts
const server = Bun.serve({
  // ...
  websocket: {
    perMessageDeflate: true,
    open(ws) {
      ws.subscribe("chat");
    },
  },
});

// compressed for subscribers that negotiated the extension
server.publish("chat", JSON.stringify({ type: "snapshot", users: ["alice", "bob", "carol"] }));

// uncompressed for every subscriber
server.publish("chat", "ping", false);