From a1632ae402d11fdd7ffc360de97c55e0b4fad677 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 28 Feb 2026 14:14:30 -0800 Subject: migrate to hono --- lib/sockets.ts | 139 ++++++++++++++++++++++++++------------------------------- 1 file changed, 64 insertions(+), 75 deletions(-) (limited to 'lib/sockets.ts') diff --git a/lib/sockets.ts b/lib/sockets.ts index 88817728..51ba15fa 100644 --- a/lib/sockets.ts +++ b/lib/sockets.ts @@ -81,88 +81,77 @@ const track = async (ws, token) => { ws.user = user; }; -Bun.serve({ - hostname: "0.0.0.0", - port: 3120, - fetch(req, server) { - // upgrade the request to a WebSocket - if (server.upgrade(req)) { - return; // do not return a Response +export const websocket = { + async message(ws: any, message: string) { + let type; + let data; + + try { + ({ type, data } = JSON.parse(message)); + } catch (e) { + err("coudn't parse socket message"); } - return new Response("Upgrade failed", { status: 500 }); - }, - websocket: { - async message(ws: any, message: string) { - let type; - let data; - - try { - ({ type, data } = JSON.parse(message)); - } catch (e) { - err("coudn't parse socket message"); - } - switch (type) { - case "heartbeat": - ws.beats = 0; - try { - if (data) await track(ws, data); - ws.send(JSON.stringify({ type: "id", data: ws.id })); - } catch (e) { - // err("Failed to send heartbeat", e.message); - } - break; - - case "login": - try { - if (!data || data === "null" || !jwt.decode(data)) - return ws.close(code, `bad token ${data}`); - - await track(ws, data); - } catch (e) { - if (e.message.includes("not found")) ws.send(JSON.stringify({ type: "logout" })); - setTimeout(() => ws?.close(code, `closing due to error ${e.message}`), 1000); - } - break; - case "token": - if (!ws.user) return; - ws.token = data; - break; - case "lnurl": - store.sessions[data] = ws; - break; - case "subscribe": - subscriptions.push({ invoice: data, ws }); - break; - default: - // warn("received socket message of unknown type", type, data); - } - }, - open(ws: any) { - const id = v4(); - ws.id = id; - ws.beats = 0; - ws.send(JSON.stringify({ type: "connected", data: id })); - all[id] = ws; - }, - close(ws: any) { - const { id } = ws; - try { - const uid = users[id]; - if (store.sockets[uid]?.[id]) { - delete store.sockets[uid][id]; + switch (type) { + case "heartbeat": + ws.beats = 0; + try { + if (data) await track(ws, data); + ws.send(JSON.stringify({ type: "id", data: ws.id })); + } catch (e) { + // err("Failed to send heartbeat", e.message); } + break; - let i; - ~(i = subscriptions.findIndex((s) => s.ws.id === id)) && subscriptions.splice(i, 1); + case "login": + try { + if (!data || data === "null" || !jwt.decode(data)) + return ws.close(code, `bad token ${data}`); - if (all[id]) delete all[id]; - } catch (e) { - err("problem closing socket", e.message); + await track(ws, data); + } catch (e) { + if (e.message.includes("not found")) ws.send(JSON.stringify({ type: "logout" })); + setTimeout(() => ws?.close(code, `closing due to error ${e.message}`), 1000); + } + break; + case "token": + if (!ws.user) return; + ws.token = data; + break; + case "lnurl": + store.sessions[data] = ws; + break; + case "subscribe": + subscriptions.push({ invoice: data, ws }); + break; + default: + // warn("received socket message of unknown type", type, data); + } + }, + open(ws: any) { + const id = v4(); + ws.id = id; + ws.beats = 0; + ws.send(JSON.stringify({ type: "connected", data: id })); + all[id] = ws; + }, + close(ws: any) { + const { id } = ws; + try { + const uid = users[id]; + if (store.sockets[uid]?.[id]) { + delete store.sockets[uid][id]; } - }, + + let i; + ~(i = subscriptions.findIndex((s) => s.ws.id === id)) && subscriptions.splice(i, 1); + + if (all[id]) delete all[id]; + } catch (e) { + err("problem closing socket", e.message); + } }, -}); +}; export const sendHeartbeat = () => { for (const uid in store.sockets) { -- cgit v1.2.3