WebSocket router — route messages to handlers.
1const { WebSocketServer } = require("ws");23class WebSocketRouter {4 constructor() {5 this.routes = new Map();6 this.middleware = [];7 }89 use(middleware) {10 this.middleware.push(middleware);11 }1213 on(pattern, handler) {14 const regex = new RegExp("^" + pattern.replace(/:(\w+)/g, "(?<$1>[^/]+)") + "$");15 this.routes.set(regex, handler);16 }1718 async handle(ws, message) {19 const { type, data } = JSON.parse(message);2021 // Run middleware22 for (const mw of this.middleware) {23 const result = await mw(ws, { type, data });24 if (result === false) return;25 }2627 // Find matching route28 for (const [regex, handler] of this.routes) {29 const match = type.match(regex);30 if (match) {31 await handler(ws, data, match.groups || {});32 return;33 }34 }3536 ws.send(JSON.stringify({ error: "Unknown route" }));37 }38}3940// Usage41const router = new WebSocketRouter();4243// Middleware44router.use((ws, message) => {45 console.log("Received:", message.type);46 return true;47});4849// Routes50router.on("chat:message", async (ws, data) => {51 broadcast({ type: "chat:message", user: ws.user, text: data.text });52});5354router.on("user:\w+:profile", async (ws, data, params) => {55 const profile = await getProfile(params[0]);56 ws.send(JSON.stringify({ type: "profile", data: profile }));57});5859// Server60const wss = new WebSocketServer({ port: 8080 });61wss.on("connection", (ws) => {62 ws.on("message", (msg) => router.handle(ws, msg));63});