150 lines
2.9 KiB
JavaScript
150 lines
2.9 KiB
JavaScript
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}`);
|
|
}); |