import {Server} from "@noear/socket.d/transport/server/Server"; import {SocketD} from "@noear/socket.d"; import { appConfigService } from './database/AppConfigService' import { logger } from 'ee-core/log' import {Event} from '../utils/Event' import {PrintEvent} from "../event/PrintEvent"; import { AppEvent } from '../event/AppEvent' import {getMainWindow} from "ee-core/electron"; import {Channel} from "../channel/Channel"; import { remove } from 'es-toolkit' import type {Session} from "@noear/socket.d/transport/core/Session"; class SocketDService { private static server: Server private static readonly DEFAULT_WS_PORT = 1765 private static SESSION_ARRAY: Session[] = [] public _init() { const $this = this Event.on(AppEvent.APP_START, () => { $this.createServer() }) } /** * 创建WebSocket服务 * @private */ private createServer() { if (!SocketDService.server) { // 获取配置端口, 实在获取不到则走默认端口 const $this = this appConfigService.getConfig().then(config => { // @ts-ignore const port = config.socketPort ? config.socketPort : SocketDService.DEFAULT_WS_PORT SocketDService.server = SocketD.createServer("sd:ws") .config(c => { c.port(port) }) .listen(this.buildListener()) .start(); logger.info(`[SocketD] Server Start in port: ${port}`) $this.loopSocketServerState(); }).catch((e: any) => { SocketDService.server = SocketD.createServer("sd:ws") .config(c => { c.port(SocketDService.DEFAULT_WS_PORT) }) .listen(this.buildListener()) .start(); logger.info(`[SocketD] Server Start [默认端口: 1765] 获取应用配置异常: ${e}`) }) } } private loopSocketServerState() { setInterval(() => { if (SocketDService.server && SocketDService.SESSION_ARRAY.length > 0) { const activeLen = SocketDService.SESSION_ARRAY.filter(s => s.isActive()).length if (activeLen == 0) { getMainWindow().webContents.send(Channel.SOCKET_D_STATE, {isActive: false, connNum: 0}) }else { getMainWindow().webContents.send(Channel.SOCKET_D_STATE, {isActive: true, connNum: activeLen}) } }else { // leaf getMainWindow().webContents.send(Channel.SOCKET_D_STATE, {isActive: false, connNum: 0}) } },1000) } /** * 消息监听 * @private */ private buildListener() { return SocketD.newEventListener().doOnOpen(s => { logger.info(`[SocketD] Client Open: ${s.sessionId()}`) SocketDService.SESSION_ARRAY.push(s) }).doOn('/printData', (s,m) => { logger.info(`[SocketD] Client Message: ${s.sessionId()} m: ${m.sid()}`) Event.emit(PrintEvent.PRINT_DATA, m.entity()) }).doOnClose(s => { remove(SocketDService.SESSION_ARRAY, ss => ss.sessionId() === s.sessionId()) }) } } SocketDService.toString = () => '[class SocketDService]' const socketDService = new SocketDService() export { SocketDService, socketDService }