UNPKG

@songm_d/standalone-toolbar-service

Version:

独立的Stagewise工具栏服务 - 支持SRPC通信和WebSocket广播,可与MCP反馈收集器集成

110 lines (109 loc) 4.35 kB
#!/usr/bin/env node 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); }); }