UNPKG

@songm_d/standalone-toolbar-service

Version:

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

88 lines (87 loc) 3.17 kB
import { createServer } from 'net'; import { logger } from './logger.js'; export class SimplePortManager { constructor() { this.TOOLBAR_PORT = 5748; this.BROADCAST_PORT = 15749; } async isPortAvailable(port) { return new Promise((resolve) => { const server = createServer(); let resolved = false; const timeout = setTimeout(() => { if (!resolved) { resolved = true; server.close(() => { resolve(false); }); } }, 1000); server.listen(port, () => { if (!resolved) { resolved = true; clearTimeout(timeout); server.close(() => { resolve(true); }); } }); server.on('error', (err) => { if (!resolved) { resolved = true; clearTimeout(timeout); resolve(false); } }); }); } async checkAllPorts() { const toolbarAvailable = await this.isPortAvailable(this.TOOLBAR_PORT); const broadcastAvailable = await this.isPortAvailable(this.BROADCAST_PORT); return { toolbarPort: toolbarAvailable, broadcastPort: broadcastAvailable, allAvailable: toolbarAvailable && broadcastAvailable }; } async getToolbarPort() { logger.debug(`检查SRPC端口: ${this.TOOLBAR_PORT}`); const available = await this.isPortAvailable(this.TOOLBAR_PORT); if (!available) { const error = new Error(`SRPC端口 ${this.TOOLBAR_PORT} 不可用,请确保端口未被占用`); logger.error('SRPC端口检查失败:', error.message); throw error; } logger.debug(`SRPC端口 ${this.TOOLBAR_PORT} 可用`); return this.TOOLBAR_PORT; } async getBroadcastPort() { logger.debug(`检查广播端口: ${this.BROADCAST_PORT}`); const available = await this.isPortAvailable(this.BROADCAST_PORT); if (!available) { const error = new Error(`广播端口 ${this.BROADCAST_PORT} 不可用,请确保端口未被占用`); logger.error('广播端口检查失败:', error.message); throw error; } logger.debug(`广播端口 ${this.BROADCAST_PORT} 可用`); return this.BROADCAST_PORT; } getPortConfig() { return { toolbarPort: this.TOOLBAR_PORT, broadcastPort: this.BROADCAST_PORT, description: '独立Toolbar服务双端口配置', service: 'standalone-toolbar-service', services: { srpc: { port: this.TOOLBAR_PORT, description: 'SRPC WebSocket服务' }, broadcast: { port: this.BROADCAST_PORT, description: 'Prompt广播服务' } } }; } }