Socket fun

This commit is contained in:
Schluffe
2026-09-16 00:17:48 +02:00
parent b2e29eaa95
commit 1ceab2fd05
3 changed files with 104 additions and 80 deletions
+49 -35
View File
@@ -1,40 +1,54 @@
/// <reference lib="deno.ns" />
const clientsMap = new Map<number, WebSocket>();
let nextId = 1;
export function startServer(
hostname: string = "localhost",
port: number = 8042,
): () => Promise<void> {
let nextId = 1;
const clientsMap = new Map<number, WebSocket>();
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;
};
function broadcast(message: string): void {
for (const socket of clientsMap.values()) {
if (socket.readyState === WebSocket.OPEN) {
socket.send(message);
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;
};
}
Deno.serve({ port: 6969 }, (request) => {
if (request.headers.get("upgrade") !== "websocket") {
return new Response("Upgrade Required", { status: 426 });
}
const { socket, response } = Deno.upgradeWebSocket(request);
handleConnection(socket);
return response;
});