- core.status handler and coreStatusRequest; diagnoseInviteIssuesAsync clears stale failed-invite flags when peers report canProvideInvite - Admin invite diagnostics and Core stats UI: per-peer remote state, text status marks, recommendations aligned with invite.deliver RPC - Extract stats-collector; push stats/health/status via subscribe-stats WebSocket; HTTP only on first Stats tab load - Document core.status in PLUGIN_SDK; proxy registers onCoreStatus
59 lines
2.2 KiB
JavaScript
59 lines
2.2 KiB
JavaScript
const { trackRequestWithTiming, trackRequest } = require('../../../maintenance/metrics');
|
|
const { logError } = require('../../../infrastructure/logger');
|
|
const { createErrorResponse } = require('../../../infrastructure/error_handler');
|
|
const { collectAdminStats, collectHistoricalMinutes } = require('../stats-collector');
|
|
|
|
async function handleStatsRoutes(req, res) {
|
|
const urlPath = req.urlPath || new URL(req.url, `https://${req.headers.host}`).pathname;
|
|
const method = req.method;
|
|
|
|
if (method === 'GET' && urlPath === '/api/stats') {
|
|
try {
|
|
const startTime = Date.now();
|
|
const stats = await collectAdminStats();
|
|
const responseTime = Date.now() - startTime;
|
|
trackRequestWithTiming('/api/stats', true, responseTime);
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify(stats));
|
|
} catch (err) {
|
|
logError('Admin', `Error in /api/stats: ${err.message}`, err);
|
|
trackRequest('/api/stats', false);
|
|
const errorResponse = createErrorResponse(err, 500);
|
|
res.writeHead(errorResponse.statusCode, errorResponse.headers);
|
|
res.end(errorResponse.body);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
if (method === 'GET' && urlPath === '/api/stats/historical') {
|
|
try {
|
|
let minutes = 60;
|
|
if (req.url.includes('?')) {
|
|
const queryString = req.url.split('?')[1];
|
|
const params = new URLSearchParams(queryString);
|
|
const minutesParam = params.get('minutes');
|
|
if (minutesParam) {
|
|
minutes = parseInt(minutesParam, 10);
|
|
}
|
|
}
|
|
const startTime = Date.now();
|
|
const historical = collectHistoricalMinutes(minutes);
|
|
const responseTime = Date.now() - startTime;
|
|
trackRequestWithTiming('/api/stats/historical', true, responseTime);
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify(historical));
|
|
} catch (err) {
|
|
logError('Admin', `Error in /api/stats/historical: ${err.message}`, err);
|
|
trackRequest('/api/stats/historical', false);
|
|
const errorResponse = createErrorResponse(err, 500);
|
|
res.writeHead(errorResponse.statusCode, errorResponse.headers);
|
|
res.end(errorResponse.body);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
module.exports = { handleStatsRoutes };
|