/// export function startServer( hostname: string = "localhost", port: number = 8042, ): () => Promise { let nextId = 1; const clientsMap = new Map(); const broadcast = (message: string): void => { for (const socket of clientsMap.values()) { if (socket.readyState === WebSocket.OPEN) { socket.send(message); } } }; const handleConnection = (socket: WebSocket): void => { const id = nextId++; socket.onopen = () => { clientsMap.set(id, socket); broadcast(`${id} has joined!`); }; socket.onclose = () => { clientsMap.delete(id); broadcast(`${id} has left!`); }; socket.onmessage = console.log; socket.onerror = console.error; }; const ac = new AbortController(); const server = Deno.serve( { hostname, port, signal: ac.signal }, (request) => { if (request.headers.get("upgrade") !== "websocket") { return new Response("Upgrade Required", { status: 426 }); } const { socket, response } = Deno.upgradeWebSocket(request); handleConnection(socket); return response; }, ); return () => { ac.abort(); return server.finished; }; }