From dda5302931671c66fe692acec7b05cd61f260e35 Mon Sep 17 00:00:00 2001 From: CoolElectronics Date: Wed, 16 Aug 2023 18:27:31 -0400 Subject: [PATCH] fix tracker tracking disconnected servers --- frontend/src/App.svelte | 17 +++++++++++------ pnpm-lock.yaml | 6 ++++++ tracker/package.json | 4 +++- tracker/src/main.ts | 21 +++++++++++++++------ 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index 437597d..b2e8f4f 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -119,14 +119,19 @@ let offer = await rtctransport.createOffer(); connectionState = "Routing you to an available node..."; + try { + let answer = await SignalFirebase.signalSwarm(JSON.stringify(offer)); - let answer = await SignalFirebase.signalSwarm(JSON.stringify(offer)); - connectionState = "Linking to node..."; - await new Promise((r) => { - setTimeout(r, 500); - }); + connectionState = "Linking to node..."; + await new Promise((r) => { + setTimeout(r, 500); + }); - rtctransport.answer(answer.answer, answer.candidates); + rtctransport.answer(answer.answer, answer.candidates); + } catch (e) { + console.error(e); + connectionState = e; + } } async function connectDevHttp() { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c9b1a8d..5cd72e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -453,6 +453,9 @@ importers: tracker: dependencies: + '@types/uuid': + specifier: ^9.0.2 + version: 9.0.2 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -474,6 +477,9 @@ importers: typescript: specifier: ^5.1.6 version: 5.1.6 + uuid: + specifier: ^9.0.0 + version: 9.0.0 devDependencies: '@types/express': specifier: ^4.17.17 diff --git a/tracker/package.json b/tracker/package.json index 0c7ac7e..763310e 100644 --- a/tracker/package.json +++ b/tracker/package.json @@ -11,13 +11,15 @@ "author": "", "license": "ISC", "dependencies": { + "@types/uuid": "^9.0.2", "dotenv": "^16.3.1", "express-ws": "^5.0.2", "firebase": "^10.1.0", "firebase-admin": "^11.10.1", "tracker-list": "workspace:*", "ts-node": "^10.9.1", - "typescript": "^5.1.6" + "typescript": "^5.1.6", + "uuid": "^9.0.0" }, "devDependencies": { "@types/express": "^4.17.17", diff --git a/tracker/src/main.ts b/tracker/src/main.ts index 0a0b5b9..8e3b186 100644 --- a/tracker/src/main.ts +++ b/tracker/src/main.ts @@ -8,9 +8,11 @@ import serviceAccount from "./admin-creds.json"; import admin, { ServiceAccount } from "firebase-admin"; import { WebSocket } from "ws"; +import { v4 as uuid } from "uuid"; + dotenv.config(); -let members: WebSocket[] = []; +let members: Record = {}; const app = express() as unknown as expressWs.Application; @@ -47,14 +49,15 @@ reff.on("value", snapshot => { let offer = val[key]; console.log("new offer:" + offer); - if (members.length < 1) { + if (Object.keys(members).length < 1) { db.ref(`/swarm/${key}`).set(JSON.stringify({ error: "no swarm members found" })); console.error("no swarm members!"); return; } - let selectedmember = members[Math.floor(Math.random() * members.length)]; + let selectedid = Object.keys(members)[Math.floor(Math.random() * Object.keys(members).length)]; + let selectedmember = members[selectedid]; selectedmember.once("message", (answer) => { console.log("setting answer" + answer); db.ref(`/swarm/${key}`).set(answer); @@ -69,13 +72,19 @@ reff.on("value", snapshot => { app.ws("/join", (ws, _req) => { - console.log("ws connect"); - members.push(ws); + let id = uuid(); + console.log(_req.ip); + console.log(`ws connect of id ${id}`); + + members[id] = ws; ws.onclose = () => { - members.filter(member => member != ws); + delete members[id]; }; }); +setInterval(() => { + console.log(`${Object.keys(members).length} members`); +}, 5000); app.listen(17776, () => console.log("listening"));