Bun.serve provides a high-performance HTTP server with built-in routing support. It enables both function-based and object-based route handlers with type-safe parameters and method-specific handling.
Symbol
serve
Server configuration options
Bun.serve({
port: 3000,
fetch(req) {
return new Response("Hello World");
}
});
Referenced types
The type of options that can be passed to serve, with support for routes
and a safer requirement for fetch
interface Server
HTTP & HTTPS Server
To start the server, see serve
For performance, Bun pre-allocates most of the data for 2048 concurrent requests. That means starting a new server allocates about 500 KB of memory. Try to avoid starting and stopping the server often (unless it's a new instance of bun).
Powered by a fork of uWebSockets. Thank you @alexhultman.
- readonly development: boolean
Is the server running in development mode?
In development mode,
Bun.serve()
returns rendered error messages with stack traces instead of a generic 500 error. This makes debugging easier, but development mode shouldn't be used in production or you will risk leaking sensitive information. - readonly hostname: undefined | string
The hostname the server is listening on. Does not include the port.
This will be
undefined
when the server is listening on a unix socket."localhost"
- readonly id: string
An identifier of the server instance
When bun is started with the
--hot
flag, this ID is used to hot reload the server without interrupting pending requests or websockets.When bun is not started with the
--hot
flag, this ID is currently unused. - readonly port: undefined | number
The port the server is listening on.
This will be undefined when the server is listening on a unix socket.
3000
- publish(topic: string, data: string | ArrayBuffer | SharedArrayBuffer | ArrayBufferView<ArrayBufferLike>, compress?: boolean): number
Send a message to all connected ServerWebSocket subscribed to a topic
@param topicThe topic to publish to
@param dataThe data to send
@param compressShould the data be compressed? Ignored if the client does not support compression.
@returns0 if the message was dropped, -1 if backpressure was applied, or the number of bytes sent.
server.publish("chat", "Hello World");
Undo a call to Server.unref
If the Server has already been stopped, this does nothing.
If Server.ref is called multiple times, this does nothing. Think of it as a boolean toggle.
- reload<T, R extends { [K in string | number | symbol]: RouteValue<K & string> }>(options: ServeFunctionOptions<T, R> & { static: R }): Server
Update the
fetch
anderror
handlers without restarting the server.This is useful if you want to change the behavior of your server without restarting it or for hot reloading.
// create the server const server = Bun.serve({ fetch(request) { return new Response("Hello World v1") } }); // Update the server to return a different response server.reload({ fetch(request) { return new Response("Hello World v2") } });
Passing other options such as
port
orhostname
won't do anything. Returns the client IP address and port of the given Request. If the request was closed or is a unix socket, returns null.
export default { async fetch(request, server) { return new Response(server.requestIP(request)); } }
Stop listening to prevent new connections from being accepted.
By default, it does not cancel in-flight requests or websockets. That means it may take some time before all network activity stops.
@param closeActiveConnectionsImmediately terminate in-flight requests, websockets, and stop accepting new connections.
A count of connections subscribed to a given topic
This operation will loop through each topic internally to get the count.
@param topicthe websocket topic to check how many subscribers are connected to
@returnsthe number of subscribers
Don't keep the process alive if this server is the only thing left. Active connections may continue to keep the process alive.
By default, the server is ref'd.
To prevent new connections from being accepted, use Server.stop
Upgrade a Request to a ServerWebSocket
@param requestThe Request to upgrade
@param optionsPass headers or attach data to the ServerWebSocket
@returnstrue
if the upgrade was successful andfalse
if it failedimport { serve } from "bun"; serve({ websocket: { open: (ws) => { console.log("Client connected"); }, message: (ws, message) => { console.log("Client sent message", message); }, close: (ws) => { console.log("Client disconnected"); }, }, fetch(req, server) { const url = new URL(req.url); if (url.pathname === "/chat") { const upgraded = server.upgrade(req); if (!upgraded) { return new Response("Upgrade failed", { status: 400 }); } } return new Response("Hello World"); }, });
What you pass to
data
is available on the ServerWebSocket.data property