From a7bbe6180d46d04dc261ae601250c3a809e4e96a Mon Sep 17 00:00:00 2001 From: arne Date: Wed, 20 Mar 2024 23:55:41 +0100 Subject: [PATCH] switch to deno --- client/bun.lockb | Bin 19229 -> 0 bytes client/deno.json | 8 ++ client/deno.lock | 240 +++++++++++++++++++++++++++++++++++++++++++ client/tsconfig.json | 23 ----- flake.nix | 4 +- server/bun.lockb | Bin 3526 -> 0 bytes server/deno.json | 1 + server/index.ts | 105 ++++++++++--------- server/tsconfig.json | 22 ---- 9 files changed, 305 insertions(+), 98 deletions(-) delete mode 100755 client/bun.lockb create mode 100644 client/deno.json create mode 100644 client/deno.lock delete mode 100644 client/tsconfig.json delete mode 100755 server/bun.lockb create mode 100644 server/deno.json delete mode 100644 server/tsconfig.json diff --git a/client/bun.lockb b/client/bun.lockb deleted file mode 100755 index b7bf71afeb8e720d08b7ee8236c48d0ba6f7fb04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19229 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 = new Map() +const clients: Map = new Map() -const server = Bun.serve({ - fetch(req, server) { - // TODO Allow creating private ponds - server.upgrade(req, { - data: { - clientId: crypto.randomUUID() - } +const _server = Deno.serve((req) => { + if (req.headers.get("upgrade") !== "websocket") { + return new Response(null, { status: 501 }) + } + + const { socket, response } = Deno.upgradeWebSocket(req) + // TODO Allow creating private ponds + const clientId = crypto.randomUUID() + console.log('generated clientId', clientId) + + socket.addEventListener("open", () => { + // register newly connected client and tell them how many other people are there + console.log('Connection opened', clientId, clients) + socket.send(JSON.stringify({ + type: 'welcome', + id: clientId + })) + const enterNotice = JSON.stringify({ + type: 'presence-information', + others: clients.size, }) - }, - websocket: { - open(ws) { - // register newly connected client and tell them how many other people are there - console.log('Connection opened', ws.data.clientId) - const enterNotice = JSON.stringify({ - type: 'presence-information', - others: clients.size, - }) - clients.set(ws.data.clientId, ws) - for (const client of clients.values()) { - client.send(enterNotice, true) - } - }, - message(ws, message) { - // broadcast message to all other clients - // TODO: Validate message shape - const msg = JSON.parse(`${message}`) - console.log('Relaying message from', ws.data.clientId, msg) - for (const [uuid, client] of clients.entries()) { - if (uuid !== ws.data.clientId) { - client.send(message) - } - } - }, - close(ws, code, reason) { - // remove client from list of registered clients and tell other clients how many people are there - console.log('Connection closed', ws.data.clientId) - clients.delete(ws.data.clientId) - const leaveNotice = JSON.stringify({ - type: 'presence-information', - others: clients.size, - }) - for (const [uuid, client] of clients.entries()) { - if (uuid !== ws.data.clientId) { - client.send(leaveNotice, true) - } + clients.set(clientId, socket) + for (const client of clients.values()) { + client.send(enterNotice) + } + }) + + socket.addEventListener("message", (event) => { + const message = `${event.data}` + // broadcast message to all other clients + // TODO: Validate message shape + const msg = JSON.parse(`${message}`) + console.log('Relaying message from', clientId, msg) + for (const [uuid, client] of clients.entries()) { + if (uuid !== clientId) { + client.send(message) } } - }, -}) + }) -console.log(`Server running on ${server.hostname}:${server.port}`) + socket.addEventListener("close", () => { + // remove client from list of registered clients and tell other clients how many people are there + console.log('Connection closed', clientId, clients) + clients.delete(clientId) + const leaveNotice = JSON.stringify({ + type: 'presence-information', + others: clients.size - 1, + }) + for (const [uuid, client] of clients.entries()) { + if (uuid !== clientId) { + client.send(leaveNotice) + } + } + }) + + return response +}) diff --git a/server/tsconfig.json b/server/tsconfig.json deleted file mode 100644 index dcd8fc5..0000000 --- a/server/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "lib": ["ESNext"], - "target": "ESNext", - "module": "ESNext", - "moduleDetection": "force", - "jsx": "react-jsx", - "allowJs": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "noEmit": true, - - /* Linting */ - "skipLibCheck": true, - "strict": true, - "noFallthroughCasesInSwitch": true, - "forceConsistentCasingInFileNames": true - } -}