Spaces:
Sleeping
Sleeping
File size: 4,868 Bytes
ceb3821 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | 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;
}
} |