From 5b37cefcc88a9d9c799619534f37c1d3dbca6ce6 Mon Sep 17 00:00:00 2001 From: Unheard0840 Date: Sat, 8 Aug 2026 14:32:35 +0000 Subject: [PATCH] Update server/status.js Add live Fulcrum connectivity check --- server/status.js | 134 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 123 insertions(+), 11 deletions(-) diff --git a/server/status.js b/server/status.js index 5e1ce79..5d92d1a 100644 --- a/server/status.js +++ b/server/status.js @@ -1,17 +1,111 @@ const http = require('http'); +const net = require('net'); const port = 8080; +const fulcrumTimeoutMs = 3000; -function getStatus() { +function checkFulcrum(fulcrumUrl) { + return new Promise((resolve) => { + if (!fulcrumUrl) { + resolve({ + configured: false, + connected: false, + url: null, + }); + return; + } + + let parsed; + + try { + parsed = new URL(fulcrumUrl); + } catch { + resolve({ + configured: true, + connected: false, + url: fulcrumUrl, + }); + return; + } + + if (parsed.protocol !== 'tcp:') { + resolve({ + configured: true, + connected: false, + url: fulcrumUrl, + }); + return; + } + + const host = parsed.hostname; + const port = Number(parsed.port); + + if (!host || !port) { + resolve({ + configured: true, + connected: false, + url: fulcrumUrl, + }); + return; + } + + const socket = net.createConnection({ + host, + port, + }); + + let response = ''; + let settled = false; + + const finish = (connected) => { + if (settled) return; + settled = true; + + socket.destroy(); + + resolve({ + configured: true, + connected, + url: fulcrumUrl, + }); + }; + + socket.setTimeout(fulcrumTimeoutMs); + + socket.on('connect', () => { + socket.write( + `${JSON.stringify({ + jsonrpc: '2.0', + id: 1, + method: 'server.version', + params: ['Munin Bitcoin', '1.4'], + })}\n`, + ); + }); + + socket.on('data', (data) => { + response += data.toString(); + + if (response.includes('"result"')) { + finish(true); + } else if (response.includes('"error"')) { + finish(false); + } + }); + + socket.on('timeout', () => finish(false)); + socket.on('error', () => finish(false)); + socket.on('close', () => finish(false)); + }); +} + +async function getStatus() { const fulcrumUrl = process.env.MUNIN_FULCRUM_URL || null; + const fulcrum = await checkFulcrum(fulcrumUrl); return { service: 'running', - fulcrum: { - configured: Boolean(fulcrumUrl), - url: fulcrumUrl, - }, - bitcoinNode: 'not connected', + fulcrum, wallet: 'not configured', labels: 0, transactions: 0, @@ -19,13 +113,31 @@ function getStatus() { }; } -const server = http.createServer((req, res) => { +const server = http.createServer(async (req, res) => { if (req.url === '/api/status') { - res.writeHead(200, { - 'Content-Type': 'application/json', - }); + try { + const status = await getStatus(); + + res.writeHead(200, { + 'Content-Type': 'application/json', + }); + + res.end(JSON.stringify(status)); + } catch (error) { + console.error('Failed to get service status:', error); + + res.writeHead(500, { + 'Content-Type': 'application/json', + }); + + res.end( + JSON.stringify({ + service: 'running', + error: 'Failed to determine service status', + }), + ); + } - res.end(JSON.stringify(getStatus())); return; }