Jaasomn
Initial deployment
ceb3821
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;
}
}