Called when a connection was previously under backpressure, meaning it had too many queued messages, but is now ready to receive more data.
Symbol
WebSocketHandler.drain
The websocket that is ready for more data
Referenced types
interface ServerWebSocket<T = undefined>
A fast WebSocket designed for servers.
Features:
- Message compression - Messages can be compressed
- Backpressure - If the client is not ready to receive data, the server will tell you.
- Dropped messages - If the client cannot receive data, the server will tell you.
- Topics - Messages can be ServerWebSocket.published to a specific topic and the client can ServerWebSocket.subscribe to topics
This is slightly different than the browser WebSocket which Bun supports for clients.
Powered by uWebSockets.
Bun.serve({
websocket: {
open(ws) {
console.log("Connected", ws.remoteAddress);
},
message(ws, data) {
console.log("Received", data);
ws.send(data);
},
close(ws, code, reason) {
console.log("Disconnected", code, reason);
},
}
});
- binaryType?: 'arraybuffer' | 'uint8array' | 'nodebuffer'
Sets how binary data is returned in events.
- if
nodebuffer
, binary data is returned asBuffer
objects. (default) - if
arraybuffer
, binary data is returned asArrayBuffer
objects. - if
uint8array
, binary data is returned asUint8Array
objects.
let ws: WebSocket; ws.binaryType = "uint8array"; ws.addEventListener("message", ({ data }) => { console.log(data instanceof Uint8Array); // true });
- if
- data: T
Custom data that you can assign to a client, can be read and written at any time.
import { serve } from "bun"; serve({ fetch(request, server) { const data = { accessToken: request.headers.get("Authorization"), }; if (server.upgrade(request, { data })) { return; } return new Response(); }, websocket: { open(ws) { console.log(ws.data.accessToken); } } });
- readonly readyState: WebSocketReadyState
The ready state of the client.
- if
0
, the client is connecting. - if
1
, the client is connected. - if
2
, the client is closing. - if
3
, the client is closed.
console.log(socket.readyState); // 1
- if
- readonly remoteAddress: string
The IP address of the client.
console.log(socket.remoteAddress); // "127.0.0.1"
Closes the connection.
Here is a list of close codes:
1000
means "normal closure" (default)1009
means a message was too big and was rejected1011
means the server encountered an error1012
means the server is restarting1013
means the server is too busy or the client is rate-limited4000
through4999
are reserved for applications (you can use it!)
To close the connection abruptly, use
terminate()
.@param codeThe close code to send
@param reasonThe close reason to send
Batches
send()
andpublish()
operations, which makes it faster to send data.The
message
,open
, anddrain
callbacks are automatically corked, so you only need to call this if you are sending messages outside of those callbacks or in async functions.@param callbackThe callback to run.
ws.cork((ctx) => { ctx.send("These messages"); ctx.sendText("are sent"); ctx.sendBinary(new TextEncoder().encode("together!")); });
Is the client subscribed to a topic?
@param topicThe topic name.
ws.subscribe("chat"); console.log(ws.isSubscribed("chat")); // true
Sends a message to subscribers of the topic.
@param topicThe topic name.
@param dataThe data to send.
@param compressShould the data be compressed? If the client does not support compression, this is ignored.
ws.publish("chat", "Hello!"); ws.publish("chat", "Compress this.", true); ws.publish("chat", new Uint8Array([1, 2, 3, 4]));
Sends a binary message to subscribers of the topic.
@param topicThe topic name.
@param dataThe data to send.
@param compressShould the data be compressed? If the client does not support compression, this is ignored.
ws.publish("chat", new TextEncoder().encode("Hello!")); ws.publish("chat", new Uint8Array([1, 2, 3, 4]), true);
Sends a text message to subscribers of the topic.
@param topicThe topic name.
@param dataThe data to send.
@param compressShould the data be compressed? If the client does not support compression, this is ignored.
ws.publish("chat", "Hello!"); ws.publish("chat", "Compress this.", true);
Sends a message to the client.
@param dataThe data to send.
@param compressShould the data be compressed? If the client does not support compression, this is ignored.
ws.send("Hello!"); ws.send("Compress this.", true); ws.send(new Uint8Array([1, 2, 3, 4]));
Sends a binary message to the client.
@param dataThe data to send.
@param compressShould the data be compressed? If the client does not support compression, this is ignored.
ws.send(new TextEncoder().encode("Hello!")); ws.send(new Uint8Array([1, 2, 3, 4]), true);
Sends a text message to the client.
@param dataThe data to send.
@param compressShould the data be compressed? If the client does not support compression, this is ignored.
ws.send("Hello!"); ws.send("Compress this.", true);
Subscribes a client to the topic.
@param topicThe topic name.
ws.subscribe("chat");
Abruptly close the connection.
To gracefully close the connection, use
close()
.Unsubscribes a client to the topic.
@param topicThe topic name.
ws.unsubscribe("chat");