import { existsSync, readFileSync } from 'fs'; import path from 'path'; import { getCpuUsagePercent } from './system-monitor.js'; /** * 获取系统信息 */ export async function handleGetSystem(req, res) { const memUsage = process.memoryUsage(); // 读取版本号 let appVersion = 'unknown'; try { const versionFilePath = path.join(process.cwd(), 'VERSION'); if (existsSync(versionFilePath)) { appVersion = readFileSync(versionFilePath, 'utf8').trim(); } } catch (error) { console.warn('[UI API] Failed to read VERSION file:', error.message); } // 计算 CPU 使用率 let cpuUsage = '0.0%'; const IS_WORKER_PROCESS = process.env.IS_WORKER_PROCESS === 'true'; if (IS_WORKER_PROCESS) { // 如果是子进程,尝试从主进程获取状态来确定 PID,或者使用当前 PID (如果要求统计子进程自己的话) // 根据任务描述 "CPU 使用率应该是统计子进程的PID的使用率" // 这里的 system-api.js 可能运行在子进程中,直接统计 process.pid 即可 cpuUsage = getCpuUsagePercent(process.pid); } else { // 独立运行模式下统计系统整体 CPU cpuUsage = getCpuUsagePercent(); } res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ appVersion: appVersion, nodeVersion: process.version, serverTime: new Date().toLocaleString(), memoryUsage: `${Math.round(memUsage.heapUsed / 1024 / 1024)} MB / ${Math.round(memUsage.heapTotal / 1024 / 1024)} MB`, cpuUsage: cpuUsage, uptime: process.uptime() })); return true; } /** * 健康检查接口(用于前端token验证) */ export async function handleHealthCheck(req, res) { res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ status: 'ok', timestamp: Date.now() })); return true; } /** * 获取服务模式信息 */ export async function handleGetServiceMode(req, res) { const IS_WORKER_PROCESS = process.env.IS_WORKER_PROCESS === 'true'; const masterPort = process.env.MASTER_PORT || 3100; res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ mode: IS_WORKER_PROCESS ? 'worker' : 'standalone', pid: process.pid, ppid: process.ppid, uptime: process.uptime(), canAutoRestart: IS_WORKER_PROCESS && !!process.send, masterPort: IS_WORKER_PROCESS ? masterPort : null, nodeVersion: process.version, platform: process.platform })); return true; } /** * 重启服务端点 - 支持主进程-子进程架构 */ export async function handleRestartService(req, res) { try { const IS_WORKER_PROCESS = process.env.IS_WORKER_PROCESS === 'true'; if (IS_WORKER_PROCESS && process.send) { // 作为子进程运行,通知主进程重启 console.log('[UI API] Requesting restart from master process...'); process.send({ type: 'restart_request' }); // 广播重启事件 const { broadcastEvent } = await import('./event-broadcast.js'); broadcastEvent('service_restart', { action: 'restart_requested', timestamp: new Date().toISOString(), message: 'Service restart requested, worker will be restarted by master process' }); res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ success: true, message: 'Restart request sent to master process', mode: 'worker', details: { workerPid: process.pid, restartMethod: 'master_controlled' } })); } else { // 独立运行模式,无法自动重启 console.log('[UI API] Service is running in standalone mode, cannot auto-restart'); res.writeHead(400, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ success: false, message: 'Service is running in standalone mode. Please use master.js to enable auto-restart feature.', mode: 'standalone', hint: 'Start the service with: node src/core/master.js [args]' })); } return true; } catch (error) { console.error('[UI API] Failed to restart service:', error); res.writeHead(500, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ error: { message: 'Failed to restart service: ' + error.message } })); return true; } }