SocketDService.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import {Server} from "@noear/socket.d/transport/server/Server";
  2. import {SocketD} from "@noear/socket.d";
  3. import { appConfigService } from './database/AppConfigService'
  4. import { logger } from 'ee-core/log'
  5. import {Event} from '../utils/Event'
  6. import {PrintEvent} from "../event/PrintEvent";
  7. import { AppEvent } from '../event/AppEvent'
  8. import {getMainWindow} from "ee-core/electron";
  9. import {Channel} from "../channel/Channel";
  10. import { remove } from 'es-toolkit'
  11. import type {Session} from "@noear/socket.d/transport/core/Session";
  12. class SocketDService {
  13. private static server: Server
  14. private static readonly DEFAULT_WS_PORT = 1765
  15. private static SESSION_ARRAY: Session[] = []
  16. public _init() {
  17. const $this = this
  18. Event.on(AppEvent.APP_START, () => {
  19. $this.createServer()
  20. })
  21. }
  22. /**
  23. * 创建WebSocket服务
  24. * @private
  25. */
  26. private createServer() {
  27. if (!SocketDService.server) {
  28. // 获取配置端口, 实在获取不到则走默认端口
  29. const $this = this
  30. appConfigService.getConfig().then(config => {
  31. // @ts-ignore
  32. const port = config.socketPort ? config.socketPort : SocketDService.DEFAULT_WS_PORT
  33. SocketDService.server = SocketD.createServer("sd:ws")
  34. .config(c => {
  35. c.port(port)
  36. })
  37. .listen(this.buildListener())
  38. .start();
  39. logger.info(`[SocketD] Server Start in port: ${port}`)
  40. $this.loopSocketServerState();
  41. }).catch((e: any) => {
  42. SocketDService.server = SocketD.createServer("sd:ws")
  43. .config(c => {
  44. c.port(SocketDService.DEFAULT_WS_PORT)
  45. })
  46. .listen(this.buildListener())
  47. .start();
  48. logger.info(`[SocketD] Server Start [默认端口: 1765] 获取应用配置异常: ${e}`)
  49. })
  50. }
  51. }
  52. private loopSocketServerState() {
  53. setInterval(() => {
  54. if (SocketDService.server && SocketDService.SESSION_ARRAY.length > 0) {
  55. const activeLen = SocketDService.SESSION_ARRAY.filter(s => s.isActive()).length
  56. if (activeLen == 0) {
  57. getMainWindow().webContents.send(Channel.SOCKET_D_STATE, {isActive: false, connNum: 0})
  58. }else {
  59. getMainWindow().webContents.send(Channel.SOCKET_D_STATE, {isActive: true, connNum: activeLen})
  60. }
  61. }else {
  62. // leaf
  63. getMainWindow().webContents.send(Channel.SOCKET_D_STATE, {isActive: false, connNum: 0})
  64. }
  65. },1000)
  66. }
  67. /**
  68. * 消息监听
  69. * @private
  70. */
  71. private buildListener() {
  72. return SocketD.newEventListener().doOnOpen(s => {
  73. logger.info(`[SocketD] Client Open: ${s.sessionId()}`)
  74. SocketDService.SESSION_ARRAY.push(s)
  75. }).doOn('/printData', (s,m) => {
  76. logger.info(`[SocketD] Client Message: ${s.sessionId()} m: ${m.sid()}`)
  77. Event.emit(PrintEvent.PRINT_DATA, m.entity())
  78. }).doOnClose(s => {
  79. remove(SocketDService.SESSION_ARRAY, ss => ss.sessionId() === s.sessionId())
  80. })
  81. }
  82. }
  83. SocketDService.toString = () => '[class SocketDService]'
  84. const socketDService = new SocketDService()
  85. export {
  86. SocketDService,
  87. socketDService
  88. }