A minimal WebSocket protocol template using TypeScript, Zod, and bun-ws-router.
# Install dependencies
bun install
# Run example server
bun run example.tsimport { messageSchema } from "bun-ws-router/zod";
import { z } from "zod";
// Simple message (no payload)
const PingSchema = messageSchema("PING");
// Message with payload
const GreetingSchema = messageSchema("GREETING", {
name: z.string(),
message: z.string(),
});import { createMessage } from "bun-ws-router/zod";
const ping = createMessage(PingSchema, undefined);
if (ping.success) {
ws.send(JSON.stringify(ping.data));
}
const greeting = createMessage(GreetingSchema, {
name: "Alice",
message: "Hello!",
});
if (greeting.success) {
ws.send(JSON.stringify(greeting.data));
}import { createWSRouter } from "@repo/ws-protocol";
const router = createWSRouter();
// Add custom handlers
router.onMessage(GreetingSchema, (c) => {
console.log(`${c.payload.name}: ${c.payload.message}`);
});
Bun.serve({
port: 3000,
fetch(req, server) {
if (req.url.endsWith("/ws")) {
return router.upgrade(req, { server });
}
return new Response("WebSocket server");
},
websocket: router.websocket,
});PING/PONG- Connection heartbeatECHO- Echo server (example request/response)NOTIFICATION- Server-to-client broadcast exampleERROR- Error reporting
- Add new messages to
messages.ts - Update
MessageSchemadiscriminated union - Add handlers in your router
ws-protocol/
├── messages.ts # Message definitions
├── router.ts # WebSocket router setup
├── example.ts # Example server
└── index.ts # Public exports