| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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
- }
|