@songm_d/standalone-toolbar-service
Version:
独立的Stagewise工具栏服务 - 支持SRPC通信和WebSocket广播,可与MCP反馈收集器集成
88 lines (87 loc) • 3.17 kB
JavaScript
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广播服务'
}
}
};
}
}