@songm_d/standalone-toolbar-service
Version:
独立的Stagewise工具栏服务 - 支持SRPC通信和WebSocket广播,可与MCP反馈收集器集成
110 lines (109 loc) • 4.35 kB
JavaScript
import { ToolbarServer } from './server/toolbar-server.js';
import { logger } from './utils/logger.js';
class StandaloneToolbarService {
constructor() {
this.toolbarServer = new ToolbarServer();
this.setupProcessHandlers();
}
setupProcessHandlers() {
process.on('SIGINT', () => {
logger.info('[Main] 接收到 SIGINT 信号,开始优雅关闭...');
this.stop().then(() => {
process.exit(0);
}).catch((error) => {
logger.error('[Main] 优雅关闭失败:', error);
process.exit(1);
});
});
process.on('SIGTERM', () => {
logger.info('[Main] 接收到 SIGTERM 信号,开始优雅关闭...');
this.stop().then(() => {
process.exit(0);
}).catch((error) => {
logger.error('[Main] 优雅关闭失败:', error);
process.exit(1);
});
});
process.on('uncaughtException', (error) => {
logger.error('[Main] 未捕获的异常:', error);
this.stop().then(() => {
process.exit(1);
}).catch(() => {
process.exit(1);
});
});
process.on('unhandledRejection', (reason, promise) => {
logger.error('[Main] 未处理的Promise拒绝:', reason);
logger.error('[Main] Promise:', promise);
});
}
async start() {
try {
logger.info('[Main] 🚀 启动独立Toolbar服务...');
await this.toolbarServer.start();
const status = this.toolbarServer.getToolbarStatus();
logger.info('[Main] ✅ 独立Toolbar服务启动成功!');
logger.info(`[Main] 🔧 服务端口: ${status.port}`);
logger.info(`[Main] 📡 SRPC连接: ${status.connected ? '已连接' : '等待连接'}`);
logger.info(`[Main] 🔄 广播客户端: ${status.broadcastClients} 个`);
logger.info(`[Main] 📋 已注册RPC方法: ${status.registeredMethods.join(', ')}`);
logger.info('[Main] 🎯 Stagewise工具栏可以连接到 ws://localhost:5748');
logger.info('[Main] 🌐 WebService可以连接到 ws://localhost:5748/broadcast');
}
catch (error) {
logger.error('[Main] ❌ 启动独立Toolbar服务失败:', error);
throw error;
}
}
async stop() {
try {
logger.info('[Main] 🛑 停止独立Toolbar服务...');
if (this.toolbarServer.isRunning()) {
await this.toolbarServer.stop();
}
logger.info('[Main] ✅ 独立Toolbar服务已停止');
}
catch (error) {
logger.error('[Main] ❌ 停止独立Toolbar服务失败:', error);
throw error;
}
}
getStatus() {
return {
running: this.toolbarServer.isRunning(),
port: this.toolbarServer.getPort(),
toolbar: this.toolbarServer.getToolbarStatus(),
service: 'standalone-toolbar-service',
version: '1.0.0',
uptime: process.uptime(),
memory: process.memoryUsage(),
pid: process.pid
};
}
}
async function main() {
try {
logger.setLevel('info');
logger.info('[Main] 🎉 独立Toolbar服务 v1.0.0 启动中...');
logger.info('[Main] 📝 进程ID:', process.pid);
logger.info('[Main] 🌍 Node.js版本:', process.version);
const service = new StandaloneToolbarService();
await service.start();
logger.info('[Main] 🔄 服务正在运行,按 Ctrl+C 停止...');
setInterval(() => {
const status = service.getStatus();
logger.debug(`[Main] 📊 状态检查 - 运行: ${status.running}, 客户端: ${status.toolbar.broadcastClients}, 内存: ${Math.round(status.memory.heapUsed / 1024 / 1024)}MB`);
}, 60000);
}
catch (error) {
logger.error('[Main] ❌ 启动失败:', error);
process.exit(1);
}
}
if (import.meta.url === `file://${process.argv[1]}`) {
main().catch((error) => {
logger.error('[Main] ❌ 主函数执行失败:', error);
process.exit(1);
});
}