const http = require('http'); const net = require('net'); const port = 8080; const fulcrumTimeoutMs = 3000; 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, wallet: 'not configured', labels: 0, transactions: 0, lastScan: 'never', }; } const server = http.createServer(async (req, res) => { if (req.url === '/api/status') { 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', }), ); } return; } res.writeHead(404); res.end('Not found'); }); server.listen(port, () => { console.log(`Status API listening on port ${port}`); });