From 21c30393fcbe3f82653353f790407f76c81d6f50 Mon Sep 17 00:00:00 2001 From: Khairul Hidayat Date: Tue, 22 Sep 2026 14:14:13 +0800 Subject: [PATCH] feat: server update --- src/server/main.ts | 42 +++++++++++++++++++++++++++++++----------- src/server/types.d.ts | 3 ++- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/server/main.ts b/src/server/main.ts index 5704d2f..974c675 100644 --- a/src/server/main.ts +++ b/src/server/main.ts @@ -28,15 +28,37 @@ function requestId() { return crypto.randomUUID(); } +function getDevices() { + return [ + ...new Map( + [...bridgeSockets].reverse().map((ws) => [ + ws.deviceId, + { + id: ws.deviceId, + name: ws.deviceName, + lastAlive: ws.lastAlive, + lastSuccessfulCall: ws.lastSuccessfulCall, + }, + ]), + ).values(), + ]; +} + function getWhatsApp(deviceId?: string): WebSocket | null { - for (const ws of [...bridgeSockets].reverse()) { - if ( - ws.readyState === WebSocket.OPEN && - (!deviceId || ws.deviceId === deviceId) - ) { - return ws; + if (deviceId) { + for (const ws of [...bridgeSockets].reverse()) { + if (ws.readyState === WebSocket.OPEN && ws.deviceId === deviceId) { + return ws; + } } } + + // find the most recent active bridge + const sock = [...bridgeSockets] + .sort((a, b) => (b.lastSuccessfulCall || 0) - (a.lastSuccessfulCall || 0)) + .find((i) => i.readyState === WebSocket.OPEN); + if (sock) return sock; + return null; } @@ -223,11 +245,7 @@ wss.on("connection", (ws) => { switch (method) { case "listDevices": - result = [...bridgeSockets].map((ws) => ({ - id: ws.deviceId, - name: ws.deviceName, - lastAlive: ws.lastAlive, - })); + result = getDevices(); break; // cached @@ -259,6 +277,8 @@ wss.on("connection", (ws) => { throw new Error(`Unsupported method: ${(request as any).method}`); } + ws.lastSuccessfulCall = Date.now(); + ws.send( JSON.stringify({ type: "response", diff --git a/src/server/types.d.ts b/src/server/types.d.ts index 5df4021..9b35886 100644 --- a/src/server/types.d.ts +++ b/src/server/types.d.ts @@ -2,8 +2,9 @@ import "ws"; declare module "ws" { interface WebSocket { - lastAlive?: number; deviceId?: string; deviceName?: string; + lastAlive?: number; + lastSuccessfulCall?: number; } }