From 6d608b6f0edd2077d5a9c3f1f6c63f3686516fa0 Mon Sep 17 00:00:00 2001 From: Daniel Flanagan Date: Wed, 17 Nov 2021 08:52:25 -0600 Subject: [PATCH] Now we know --- gen.ts | 20 ---------------- readme.md | 4 +++- server.ts | 70 +++++++++++++++++++++++++++++++++++-------------------- types.ts | 9 ------- 4 files changed, 48 insertions(+), 55 deletions(-) delete mode 100644 gen.ts delete mode 100644 types.ts diff --git a/gen.ts b/gen.ts deleted file mode 100644 index 97a0c5e..0000000 --- a/gen.ts +++ /dev/null @@ -1,20 +0,0 @@ -const ALFNUM = "0123456789"; -const SECRET_LENGTH = 8; - -function randomInt(low: number, high: number) { - return Math.floor(Math.random() * (high - low + 1) + low); -} - -export function randomId() { - const arr = new Int32Array(1); - crypto.getRandomValues(arr); - return Math.abs(arr[0]); -} - -export function randomSecret() { - let out = ""; - for (let i = 0; i < SECRET_LENGTH; i++) { - out += ALFNUM[randomInt(0, ALFNUM.length - 1)]; - } - return out; -} diff --git a/readme.md b/readme.md index 2b4117c..5b0e4ea 100644 --- a/readme.md +++ b/readme.md @@ -4,7 +4,9 @@ # Signalling Server -The signaling server is written in TypeScript to run on Deno. It can run in the +Requires Deno >= 1.16.1 + +The signaling server is written in TypeScript to run on Deno (1.16.1). It can run in the cloud via Deno deploy. PORT=8888 deno run --allow-env --allow-net server.ts diff --git a/server.ts b/server.ts index 95cb0c3..93cbeba 100644 --- a/server.ts +++ b/server.ts @@ -21,32 +21,52 @@ const lobbies = new Set(); const clients = new Set(); console.log("Listening on port", PORT); -for await (const conn of Deno.listen({ port: PORT })) { +const listener = Deno.listen({ port: PORT }); +for await (const conn of listener) { + console.debug("Connection received:", conn); (async () => { - for await (const { respondWith, request } of Deno.serveHttp(conn)) { - const { socket, response } = Deno.upgradeWebSocket(request); - const client: Client = { socket }; - socket.onmessage = (ev) => { - console.log("Client Message Received", ev); - }; - socket.onopen = (ev) => { - console.log("New Client:", ev); - clients.add(client); - socket.send("lobbies_start"); - lobbies.forEach(({ name, clients }) => { - socket.send(JSON.stringify({ name, numClients: clients.length })); - }); - socket.send("lobbies_end"); - }; - socket.onclose = (ev) => { - console.log("Client Socket Close:", ev); - clients.delete(client); - }; - socket.onerror = (ev) => { - console.log("Client Socket Error:", ev); - clients.delete(client); - }; - respondWith(response); + const server = Deno.serveHttp(conn); + for await (const { respondWith, request } of server) { + console.debug("HTTP Request Received", request); + try { + const { socket, response } = Deno.upgradeWebSocket(request); + const client: Client = { socket }; + socket.onmessage = (ev) => { + console.log("Client Message Received", ev); + }; + socket.onopen = (ev) => { + console.log("New Client:", ev); + if (!clients.has(client)) clients.add(client); + socket.send("lobbies_start"); + lobbies.forEach(({ name, clients }) => { + socket.send(JSON.stringify({ name, numClients: clients.length })); + }); + socket.send("lobbies_end"); + }; + socket.onclose = (ev) => { + console.log("Client Socket Close:", ev); + if (clients.has(client)) clients.delete(client); + }; + socket.onerror = (ev) => { + console.log("Client Socket Error:", ev); + if (clients.has(client)) clients.delete(client); + }; + respondWith(response); + } catch (e) { + let body = "400 Bad Request"; + if (e instanceof TypeError) { + body += " - Expected to be able to upgrade to WebSocket connection"; + console.log("Could not add client:", e); + } else { + console.log("Could not add client for unhandled reason:", e); + } + respondWith( + new Response(body, { + status: 400, + headers: { "content-type": "text/html" }, + }), + ); + } } })(); } diff --git a/types.ts b/types.ts deleted file mode 100644 index ac899fb..0000000 --- a/types.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface Client { - socket: WebSocket; -} - -export interface Lobby { - name: string; - secret: string; - clients: Client[]; -}