@scpxl/nodejs-framework 1.0.22 → 1.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/README.md +264 -26
  2. package/dist/api-requester/api-requester.d.ts +32 -0
  3. package/dist/api-requester/api-requester.d.ts.map +1 -0
  4. package/dist/api-requester/api-requester.js +2 -1
  5. package/dist/api-requester/api-requester.js.map +2 -2
  6. package/dist/api-requester/index.d.ts +3 -0
  7. package/dist/api-requester/index.d.ts.map +1 -0
  8. package/dist/application/base-application.d.ts +106 -0
  9. package/dist/application/base-application.d.ts.map +1 -0
  10. package/dist/application/base-application.interface.d.ts +162 -0
  11. package/dist/application/base-application.interface.d.ts.map +1 -0
  12. package/dist/application/base-application.js +7 -3
  13. package/dist/application/base-application.js.map +2 -2
  14. package/dist/application/command-application.d.ts +18 -0
  15. package/dist/application/command-application.d.ts.map +1 -0
  16. package/dist/application/command-application.interface.d.ts +26 -0
  17. package/dist/application/command-application.interface.d.ts.map +1 -0
  18. package/dist/application/index.d.ts +5 -0
  19. package/dist/application/index.d.ts.map +1 -0
  20. package/dist/application/web-application.d.ts +43 -0
  21. package/dist/application/web-application.d.ts.map +1 -0
  22. package/dist/application/web-application.interface.d.ts +21 -0
  23. package/dist/application/web-application.interface.d.ts.map +1 -0
  24. package/dist/application/web-application.js +1 -0
  25. package/dist/application/web-application.js.map +2 -2
  26. package/dist/auth/index.d.ts +2 -0
  27. package/dist/auth/index.d.ts.map +1 -0
  28. package/dist/auth/jwt.d.ts +25 -0
  29. package/dist/auth/jwt.d.ts.map +1 -0
  30. package/dist/cache/index.d.ts +2 -0
  31. package/dist/cache/index.d.ts.map +1 -0
  32. package/dist/cache/manager.d.ts +107 -0
  33. package/dist/cache/manager.d.ts.map +1 -0
  34. package/dist/cache/manager.js +2 -1
  35. package/dist/cache/manager.js.map +2 -2
  36. package/dist/cli/index.d.ts +2 -0
  37. package/dist/cli/index.d.ts.map +1 -0
  38. package/dist/cli/index.js +12591 -0
  39. package/dist/cli/index.js.map +7 -0
  40. package/dist/cluster/cluster-manager.d.ts +18 -0
  41. package/dist/cluster/cluster-manager.d.ts.map +1 -0
  42. package/dist/cluster/cluster-manager.interface.d.ts +23 -0
  43. package/dist/cluster/cluster-manager.interface.d.ts.map +1 -0
  44. package/dist/cluster/cluster-manager.js +45 -8
  45. package/dist/cluster/cluster-manager.js.map +2 -2
  46. package/dist/cluster/index.d.ts +2 -0
  47. package/dist/cluster/index.d.ts.map +1 -0
  48. package/dist/command/command-manager.d.ts +19 -0
  49. package/dist/command/command-manager.d.ts.map +1 -0
  50. package/dist/command/command.d.ts +27 -0
  51. package/dist/command/command.d.ts.map +1 -0
  52. package/dist/command/command.interface.d.ts +11 -0
  53. package/dist/command/command.interface.d.ts.map +1 -0
  54. package/dist/command/index.d.ts +3 -0
  55. package/dist/command/index.d.ts.map +1 -0
  56. package/dist/config/env.d.ts +11 -0
  57. package/dist/config/env.d.ts.map +1 -0
  58. package/dist/config/index.d.ts +3 -0
  59. package/dist/config/index.d.ts.map +1 -0
  60. package/dist/config/schema.d.ts +432 -0
  61. package/dist/config/schema.d.ts.map +1 -0
  62. package/dist/database/dynamic-entity-form-decorators.d.ts +31 -0
  63. package/dist/database/dynamic-entity-form-decorators.d.ts.map +1 -0
  64. package/dist/database/dynamic-entity-form-decorators.js.map +1 -1
  65. package/dist/database/dynamic-entity.d.ts +18 -0
  66. package/dist/database/dynamic-entity.d.ts.map +1 -0
  67. package/dist/database/dynamic-entity.js +11 -1
  68. package/dist/database/dynamic-entity.js.map +2 -2
  69. package/dist/database/index.d.ts +5 -0
  70. package/dist/database/index.d.ts.map +1 -0
  71. package/dist/database/instance.d.ts +36 -0
  72. package/dist/database/instance.d.ts.map +1 -0
  73. package/dist/database/instance.interface.d.ts +5 -0
  74. package/dist/database/instance.interface.d.ts.map +1 -0
  75. package/dist/database/manager.d.ts +27 -0
  76. package/dist/database/manager.d.ts.map +1 -0
  77. package/dist/database/manager.interface.d.ts +18 -0
  78. package/dist/database/manager.interface.d.ts.map +1 -0
  79. package/dist/database/manager.js +3 -2
  80. package/dist/database/manager.js.map +2 -2
  81. package/dist/error/error-reporter.d.ts +109 -0
  82. package/dist/error/error-reporter.d.ts.map +1 -0
  83. package/dist/error/error-reporter.js +32 -29
  84. package/dist/error/error-reporter.js.map +2 -2
  85. package/dist/error/error.interface.d.ts +126 -0
  86. package/dist/error/error.interface.d.ts.map +1 -0
  87. package/dist/error/framework-errors.d.ts +113 -0
  88. package/dist/error/framework-errors.d.ts.map +1 -0
  89. package/dist/error/index.d.ts +6 -0
  90. package/dist/error/index.d.ts.map +1 -0
  91. package/dist/error/index.js +3 -2
  92. package/dist/error/index.js.map +2 -2
  93. package/dist/event/controller/base.d.ts +23 -0
  94. package/dist/event/controller/base.d.ts.map +1 -0
  95. package/dist/event/controller/base.interface.d.ts +11 -0
  96. package/dist/event/controller/base.interface.d.ts.map +1 -0
  97. package/dist/event/controller/base.js +2 -1
  98. package/dist/event/controller/base.js.map +2 -2
  99. package/dist/event/index.d.ts +5 -0
  100. package/dist/event/index.d.ts.map +1 -0
  101. package/dist/event/manager.d.ts +21 -0
  102. package/dist/event/manager.d.ts.map +1 -0
  103. package/dist/event/manager.interface.d.ts +137 -0
  104. package/dist/event/manager.interface.d.ts.map +1 -0
  105. package/dist/event/manager.js +5 -4
  106. package/dist/event/manager.js.map +2 -2
  107. package/dist/index.d.ts +22 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/lifecycle/exit.d.ts +11 -0
  110. package/dist/lifecycle/exit.d.ts.map +1 -0
  111. package/dist/lifecycle/exit.js.map +2 -2
  112. package/dist/lifecycle/index.d.ts +7 -0
  113. package/dist/lifecycle/index.d.ts.map +1 -0
  114. package/dist/lifecycle/lifecycle-manager.d.ts +66 -0
  115. package/dist/lifecycle/lifecycle-manager.d.ts.map +1 -0
  116. package/dist/lifecycle/lifecycle-manager.js +6 -11
  117. package/dist/lifecycle/lifecycle-manager.js.map +2 -2
  118. package/dist/lifecycle/shutdown-controller.d.ts +15 -0
  119. package/dist/lifecycle/shutdown-controller.d.ts.map +1 -0
  120. package/dist/lifecycle/types.d.ts +28 -0
  121. package/dist/lifecycle/types.d.ts.map +1 -0
  122. package/dist/logger/index.d.ts +2 -0
  123. package/dist/logger/index.d.ts.map +1 -0
  124. package/dist/logger/logger.d.ts +59 -0
  125. package/dist/logger/logger.d.ts.map +1 -0
  126. package/dist/logger/logger.interface.d.ts +2 -0
  127. package/dist/logger/logger.interface.d.ts.map +1 -0
  128. package/dist/logger/logger.js +11 -3
  129. package/dist/logger/logger.js.map +2 -2
  130. package/dist/performance/cache-performance.d.ts +64 -0
  131. package/dist/performance/cache-performance.d.ts.map +1 -0
  132. package/dist/performance/database-performance.d.ts +40 -0
  133. package/dist/performance/database-performance.d.ts.map +1 -0
  134. package/dist/performance/index.d.ts +8 -0
  135. package/dist/performance/index.d.ts.map +1 -0
  136. package/dist/performance/performance-monitor.d.ts +68 -0
  137. package/dist/performance/performance-monitor.d.ts.map +1 -0
  138. package/dist/performance/performance-monitor.js +10 -3
  139. package/dist/performance/performance-monitor.js.map +2 -2
  140. package/dist/performance/performance-monitor.plugin.d.ts +24 -0
  141. package/dist/performance/performance-monitor.plugin.d.ts.map +1 -0
  142. package/dist/performance/queue-performance.d.ts +46 -0
  143. package/dist/performance/queue-performance.d.ts.map +1 -0
  144. package/dist/performance/webserver-performance.d.ts +69 -0
  145. package/dist/performance/webserver-performance.d.ts.map +1 -0
  146. package/dist/performance/websocket-performance.d.ts +44 -0
  147. package/dist/performance/websocket-performance.d.ts.map +1 -0
  148. package/dist/queue/index.d.ts +6 -0
  149. package/dist/queue/index.d.ts.map +1 -0
  150. package/dist/queue/index.interface.d.ts +10 -0
  151. package/dist/queue/index.interface.d.ts.map +1 -0
  152. package/dist/queue/job.interface.d.ts +43 -0
  153. package/dist/queue/job.interface.d.ts.map +1 -0
  154. package/dist/queue/manager.d.ts +44 -0
  155. package/dist/queue/manager.d.ts.map +1 -0
  156. package/dist/queue/manager.interface.d.ts +18 -0
  157. package/dist/queue/manager.interface.d.ts.map +1 -0
  158. package/dist/queue/processor/base.d.ts +29 -0
  159. package/dist/queue/processor/base.d.ts.map +1 -0
  160. package/dist/queue/processor/base.js +2 -1
  161. package/dist/queue/processor/base.js.map +2 -2
  162. package/dist/queue/processor/processor.interface.d.ts +16 -0
  163. package/dist/queue/processor/processor.interface.d.ts.map +1 -0
  164. package/dist/queue/worker.d.ts +14 -0
  165. package/dist/queue/worker.d.ts.map +1 -0
  166. package/dist/queue/worker.interface.d.ts +13 -0
  167. package/dist/queue/worker.interface.d.ts.map +1 -0
  168. package/dist/redis/index.d.ts +3 -0
  169. package/dist/redis/index.d.ts.map +1 -0
  170. package/dist/redis/instance.d.ts +32 -0
  171. package/dist/redis/instance.d.ts.map +1 -0
  172. package/dist/redis/instance.interface.d.ts +9 -0
  173. package/dist/redis/instance.interface.d.ts.map +1 -0
  174. package/dist/redis/manager.d.ts +15 -0
  175. package/dist/redis/manager.d.ts.map +1 -0
  176. package/dist/redis/manager.interface.d.ts +8 -0
  177. package/dist/redis/manager.interface.d.ts.map +1 -0
  178. package/dist/redis/manager.js +16 -16
  179. package/dist/redis/manager.js.map +2 -2
  180. package/dist/request-context/index.d.ts +3 -0
  181. package/dist/request-context/index.d.ts.map +1 -0
  182. package/dist/request-context/request-context.d.ts +108 -0
  183. package/dist/request-context/request-context.d.ts.map +1 -0
  184. package/dist/request-context/request-context.interface.d.ts +46 -0
  185. package/dist/request-context/request-context.interface.d.ts.map +1 -0
  186. package/dist/schemas/common.d.ts +197 -0
  187. package/dist/schemas/common.d.ts.map +1 -0
  188. package/dist/schemas/common.js +108 -0
  189. package/dist/schemas/common.js.map +7 -0
  190. package/dist/schemas/index.d.ts +6 -0
  191. package/dist/schemas/index.d.ts.map +1 -0
  192. package/dist/schemas/index.js +2 -0
  193. package/dist/schemas/index.js.map +7 -0
  194. package/dist/services/aws/index.d.ts +2 -0
  195. package/dist/services/aws/index.d.ts.map +1 -0
  196. package/dist/services/aws/s3.d.ts +54 -0
  197. package/dist/services/aws/s3.d.ts.map +1 -0
  198. package/dist/services/aws/s3.interface.d.ts +14 -0
  199. package/dist/services/aws/s3.interface.d.ts.map +1 -0
  200. package/dist/services/index.d.ts +2 -0
  201. package/dist/services/index.d.ts.map +1 -0
  202. package/dist/util/file.d.ts +58 -0
  203. package/dist/util/file.d.ts.map +1 -0
  204. package/dist/util/helper.d.ts +51 -0
  205. package/dist/util/helper.d.ts.map +1 -0
  206. package/dist/util/helper.js +72 -10
  207. package/dist/util/helper.js.map +2 -2
  208. package/dist/util/image.d.ts +12 -0
  209. package/dist/util/image.d.ts.map +1 -0
  210. package/dist/util/index.d.ts +11 -0
  211. package/dist/util/index.d.ts.map +1 -0
  212. package/dist/util/loader.d.ts +21 -0
  213. package/dist/util/loader.d.ts.map +1 -0
  214. package/dist/util/loader.js +5 -2
  215. package/dist/util/loader.js.map +2 -2
  216. package/dist/util/num.d.ts +13 -0
  217. package/dist/util/num.d.ts.map +1 -0
  218. package/dist/util/os.d.ts +6 -0
  219. package/dist/util/os.d.ts.map +1 -0
  220. package/dist/util/str.d.ts +39 -0
  221. package/dist/util/str.d.ts.map +1 -0
  222. package/dist/util/time.d.ts +19 -0
  223. package/dist/util/time.d.ts.map +1 -0
  224. package/dist/util/time.interface.d.ts +12 -0
  225. package/dist/util/time.interface.d.ts.map +1 -0
  226. package/dist/util/timing.d.ts +36 -0
  227. package/dist/util/timing.d.ts.map +1 -0
  228. package/dist/util/timing.interface.d.ts +47 -0
  229. package/dist/util/timing.interface.d.ts.map +1 -0
  230. package/dist/util/url.d.ts +7 -0
  231. package/dist/util/url.d.ts.map +1 -0
  232. package/dist/webserver/controller/auth-middleware.d.ts +21 -0
  233. package/dist/webserver/controller/auth-middleware.d.ts.map +1 -0
  234. package/dist/webserver/controller/base.d.ts +41 -0
  235. package/dist/webserver/controller/base.d.ts.map +1 -0
  236. package/dist/webserver/controller/base.interface.d.ts +50 -0
  237. package/dist/webserver/controller/base.interface.d.ts.map +1 -0
  238. package/dist/webserver/controller/base.js +4 -4
  239. package/dist/webserver/controller/base.js.map +2 -2
  240. package/dist/webserver/controller/entity.d.ts +94 -0
  241. package/dist/webserver/controller/entity.d.ts.map +1 -0
  242. package/dist/webserver/controller/entity.js.map +2 -2
  243. package/dist/webserver/controller/example-auth.d.ts +12 -0
  244. package/dist/webserver/controller/example-auth.d.ts.map +1 -0
  245. package/dist/webserver/controller/health.d.ts +13 -0
  246. package/dist/webserver/controller/health.d.ts.map +1 -0
  247. package/dist/webserver/controller/health.js +0 -14
  248. package/dist/webserver/controller/health.js.map +2 -2
  249. package/dist/webserver/define-action.d.ts +26 -0
  250. package/dist/webserver/define-action.d.ts.map +1 -0
  251. package/dist/webserver/define-action.js +16 -0
  252. package/dist/webserver/define-action.js.map +7 -0
  253. package/dist/webserver/define-route.d.ts +53 -0
  254. package/dist/webserver/define-route.d.ts.map +1 -0
  255. package/dist/webserver/define-route.js +11 -6
  256. package/dist/webserver/define-route.js.map +2 -2
  257. package/dist/webserver/index.d.ts +14 -0
  258. package/dist/webserver/index.d.ts.map +1 -0
  259. package/dist/webserver/index.js +2 -0
  260. package/dist/webserver/index.js.map +2 -2
  261. package/dist/webserver/util.d.ts +10 -0
  262. package/dist/webserver/util.d.ts.map +1 -0
  263. package/dist/webserver/util.js +5 -2
  264. package/dist/webserver/util.js.map +2 -2
  265. package/dist/webserver/webserver.d.ts +93 -0
  266. package/dist/webserver/webserver.d.ts.map +1 -0
  267. package/dist/webserver/webserver.interface.d.ts +181 -0
  268. package/dist/webserver/webserver.interface.d.ts.map +1 -0
  269. package/dist/webserver/webserver.interface.js.map +1 -1
  270. package/dist/webserver/webserver.js +30 -33
  271. package/dist/webserver/webserver.js.map +2 -2
  272. package/dist/websocket/controller/client/base.d.ts +12 -0
  273. package/dist/websocket/controller/client/base.d.ts.map +1 -0
  274. package/dist/websocket/controller/client/base.interface.d.ts +12 -0
  275. package/dist/websocket/controller/client/base.interface.d.ts.map +1 -0
  276. package/dist/websocket/controller/server/base.d.ts +13 -0
  277. package/dist/websocket/controller/server/base.d.ts.map +1 -0
  278. package/dist/websocket/controller/server/base.interface.d.ts +13 -0
  279. package/dist/websocket/controller/server/base.interface.d.ts.map +1 -0
  280. package/dist/websocket/controllers/client/system.d.ts +6 -0
  281. package/dist/websocket/controllers/client/system.d.ts.map +1 -0
  282. package/dist/websocket/controllers/server/system.d.ts +7 -0
  283. package/dist/websocket/controllers/server/system.d.ts.map +1 -0
  284. package/dist/websocket/index.d.ts +9 -0
  285. package/dist/websocket/index.d.ts.map +1 -0
  286. package/dist/websocket/index.js +2 -0
  287. package/dist/websocket/index.js.map +2 -2
  288. package/dist/websocket/routes/client/system.d.ts +3 -0
  289. package/dist/websocket/routes/client/system.d.ts.map +1 -0
  290. package/dist/websocket/routes/server/system.d.ts +3 -0
  291. package/dist/websocket/routes/server/system.d.ts.map +1 -0
  292. package/dist/websocket/utils.d.ts +9 -0
  293. package/dist/websocket/utils.d.ts.map +1 -0
  294. package/dist/websocket/websocket-auth.d.ts +17 -0
  295. package/dist/websocket/websocket-auth.d.ts.map +1 -0
  296. package/dist/websocket/websocket-auth.js +46 -0
  297. package/dist/websocket/websocket-auth.js.map +7 -0
  298. package/dist/websocket/websocket-base.d.ts +19 -0
  299. package/dist/websocket/websocket-base.d.ts.map +1 -0
  300. package/dist/websocket/websocket-client-manager.d.ts +53 -0
  301. package/dist/websocket/websocket-client-manager.d.ts.map +1 -0
  302. package/dist/websocket/websocket-client-manager.interface.d.ts +8 -0
  303. package/dist/websocket/websocket-client-manager.interface.d.ts.map +1 -0
  304. package/dist/websocket/websocket-client-manager.js +6 -5
  305. package/dist/websocket/websocket-client-manager.js.map +2 -2
  306. package/dist/websocket/websocket-client.d.ts +64 -0
  307. package/dist/websocket/websocket-client.d.ts.map +1 -0
  308. package/dist/websocket/websocket-client.interface.d.ts +14 -0
  309. package/dist/websocket/websocket-client.interface.d.ts.map +1 -0
  310. package/dist/websocket/websocket-client.js +97 -3
  311. package/dist/websocket/websocket-client.js.map +2 -2
  312. package/dist/websocket/websocket-room-manager.d.ts +32 -0
  313. package/dist/websocket/websocket-room-manager.d.ts.map +1 -0
  314. package/dist/websocket/websocket-server.d.ts +102 -0
  315. package/dist/websocket/websocket-server.d.ts.map +1 -0
  316. package/dist/websocket/websocket-server.interface.d.ts +16 -0
  317. package/dist/websocket/websocket-server.interface.d.ts.map +1 -0
  318. package/dist/websocket/websocket-server.js +62 -50
  319. package/dist/websocket/websocket-server.js.map +2 -2
  320. package/dist/websocket/websocket-service.d.ts +44 -0
  321. package/dist/websocket/websocket-service.d.ts.map +1 -0
  322. package/dist/websocket/websocket.interface.d.ts +137 -0
  323. package/dist/websocket/websocket.interface.d.ts.map +1 -0
  324. package/dist/websocket/websocket.interface.js.map +2 -2
  325. package/package.json +21 -24
  326. package/pxl.js +0 -4
@@ -0,0 +1,13 @@
1
+ import type DatabaseInstance from '../../../database/instance.js';
2
+ import type QueueManager from '../../../queue/manager.js';
3
+ import type { RedisInstance } from '../../../redis/index.js';
4
+ import type WebSocketServer from '../../websocket-server.js';
5
+ import type WebSocketBaseController from './base.js';
6
+ export interface WebSocketServerBaseControllerConstructorParams {
7
+ webSocketServer: WebSocketServer;
8
+ redisInstance: RedisInstance;
9
+ queueManager: QueueManager;
10
+ databaseInstance: DatabaseInstance;
11
+ }
12
+ export type WebSocketServerBaseControllerType = new (params: WebSocketServerBaseControllerConstructorParams) => WebSocketBaseController;
13
+ //# sourceMappingURL=base.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.interface.d.ts","sourceRoot":"","sources":["../../../../src/websocket/controller/server/base.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,gBAAgB,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,YAAY,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,eAAe,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,uBAAuB,MAAM,WAAW,CAAC;AAErD,MAAM,WAAW,8CAA8C;IAC7D,eAAe,EAAE,eAAe,CAAC;IAUjC,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,MAAM,MAAM,iCAAiC,GAAG,KAC9C,MAAM,EAAE,8CAA8C,KACnD,uBAAuB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { WebSocket } from 'ws';
2
+ import { WebSocketClientBaseController } from '../../index.js';
3
+ export default class SystemController extends WebSocketClientBaseController {
4
+ clientList: (_clientWebSocket: WebSocket, _webSocketClientId: string, _data: any) => any;
5
+ }
6
+ //# sourceMappingURL=system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../../src/websocket/controllers/client/system.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAE/D,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,6BAA6B;IAClE,UAAU,GAAI,kBAAkB,SAAS,EAAE,oBAAoB,MAAM,EAAE,OAAO,GAAG,KAAG,GAAG,CAE5F;CACH"}
@@ -0,0 +1,7 @@
1
+ import type { WebSocket } from 'ws';
2
+ import WebSocketServerBaseController from '../../controller/server/base.js';
3
+ export default class SystemController extends WebSocketServerBaseController {
4
+ joinRoom: (clientWebSocket: WebSocket, webSocketClientId: string, data: any) => any;
5
+ leaveRoom: (clientWebSocket: WebSocket, webSocketClientId: string, data: any) => any;
6
+ }
7
+ //# sourceMappingURL=system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../../src/websocket/controllers/server/system.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,6BAA6B,MAAM,iCAAiC,CAAC;AAG5E,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,6BAA6B;IAClE,QAAQ,GAAI,iBAAiB,SAAS,EAAE,mBAAmB,MAAM,EAAE,MAAM,GAAG,KAAG,GAAG,CA6CvF;IAEK,SAAS,GAAI,iBAAiB,SAAS,EAAE,mBAAmB,MAAM,EAAE,MAAM,GAAG,KAAG,GAAG,CAqCxF;CACH"}
@@ -0,0 +1,9 @@
1
+ export type { WebSocketRoute } from './websocket.interface.js';
2
+ export { WebSocketRedisSubscriberEvent } from './websocket.interface.js';
3
+ export { default as WebSocketServerBaseController } from './controller/server/base.js';
4
+ export { default as WebSocketClientBaseController } from './controller/client/base.js';
5
+ export { WebSocketService } from './websocket-service.js';
6
+ export type { WebSocketMessage, WebSocketServiceOptions } from './websocket-service.js';
7
+ export { WebSocketAuthService } from './websocket-auth.js';
8
+ export type { WebSocketAuthResult } from './websocket-auth.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/websocket/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -2,7 +2,9 @@ import { WebSocketRedisSubscriberEvent } from "./websocket.interface.js";
2
2
  import { default as default2 } from "./controller/server/base.js";
3
3
  import { default as default3 } from "./controller/client/base.js";
4
4
  import { WebSocketService } from "./websocket-service.js";
5
+ import { WebSocketAuthService } from "./websocket-auth.js";
5
6
  export {
7
+ WebSocketAuthService,
6
8
  default3 as WebSocketClientBaseController,
7
9
  WebSocketRedisSubscriberEvent,
8
10
  default2 as WebSocketServerBaseController,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/websocket/index.ts"],
4
- "sourcesContent": ["export type { WebSocketRoute } from './websocket.interface.js';\nexport { WebSocketRedisSubscriberEvent } from './websocket.interface.js';\nexport { default as WebSocketServerBaseController } from './controller/server/base.js';\nexport { default as WebSocketClientBaseController } from './controller/client/base.js';\nexport { WebSocketService } from './websocket-service.js';\nexport type { WebSocketMessage, WebSocketServiceOptions } from './websocket-service.js';\n"],
5
- "mappings": "AACA,SAAS,qCAAqC;AAC9C,SAAoB,WAAXA,gBAAgD;AACzD,SAAoB,WAAXA,gBAAgD;AACzD,SAAS,wBAAwB;",
4
+ "sourcesContent": ["export type { WebSocketRoute } from './websocket.interface.js';\nexport { WebSocketRedisSubscriberEvent } from './websocket.interface.js';\nexport { default as WebSocketServerBaseController } from './controller/server/base.js';\nexport { default as WebSocketClientBaseController } from './controller/client/base.js';\nexport { WebSocketService } from './websocket-service.js';\nexport type { WebSocketMessage, WebSocketServiceOptions } from './websocket-service.js';\nexport { WebSocketAuthService } from './websocket-auth.js';\nexport type { WebSocketAuthResult } from './websocket-auth.js';\n"],
5
+ "mappings": "AACA,SAAS,qCAAqC;AAC9C,SAAoB,WAAXA,gBAAgD;AACzD,SAAoB,WAAXA,gBAAgD;AACzD,SAAS,wBAAwB;AAEjC,SAAS,4BAA4B;",
6
6
  "names": ["default"]
7
7
  }
@@ -0,0 +1,3 @@
1
+ import type { WebSocketRoute } from '../../websocket.interface.js';
2
+ export declare const webSocketSystemClientRoutes: WebSocketRoute[];
3
+ //# sourceMappingURL=system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../../src/websocket/routes/client/system.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,eAAO,MAAM,2BAA2B,EAAE,cAAc,EAMvD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { WebSocketRoute } from '../../websocket.interface.js';
2
+ export declare const webSocketSystemClientRoutes: WebSocketRoute[];
3
+ //# sourceMappingURL=system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../../src/websocket/routes/server/system.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,eAAO,MAAM,2BAA2B,EAAE,cAAc,EAWvD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type WebSocket from 'ws';
2
+ export interface LogOptions {
3
+ muteWorker?: boolean;
4
+ }
5
+ export declare function generateClientId(): string;
6
+ export declare function log(message: string, meta?: Record<string, unknown>, options?: LogOptions): void;
7
+ export declare function parseServerMessage(message: WebSocket.Data): Record<string, unknown>;
8
+ export declare function getRouteKey(type: string, action: string): string;
9
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/websocket/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,IAAI,CAAC;AAGhC,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAE/F;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBnF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhE"}
@@ -0,0 +1,17 @@
1
+ import type { WebApplicationConfig } from '../application/web-application.interface.js';
2
+ export interface WebSocketAuthResult {
3
+ userId: number;
4
+ payload: Record<string, unknown>;
5
+ }
6
+ export declare class WebSocketAuthService {
7
+ private readonly applicationConfig;
8
+ constructor(applicationConfig: WebApplicationConfig);
9
+ /**
10
+ * Validates WebSocket authentication token from URL query parameters
11
+ * @param url - The WebSocket connection URL
12
+ * @returns Authentication result with userId and payload, or null if no token provided
13
+ * @throws Error if authentication fails
14
+ */
15
+ validateAuth(url: string): Promise<WebSocketAuthResult | null>;
16
+ }
17
+ //# sourceMappingURL=websocket-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-auth.d.ts","sourceRoot":"","sources":["../../src/websocket/websocket-auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AAExF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAAjB,iBAAiB,EAAE,oBAAoB;IAEpE;;;;;OAKG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;CAmCrE"}
@@ -0,0 +1,46 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import { URL } from "url";
4
+ import Jwt from "../auth/jwt.js";
5
+ class WebSocketAuthService {
6
+ constructor(applicationConfig) {
7
+ this.applicationConfig = applicationConfig;
8
+ }
9
+ static {
10
+ __name(this, "WebSocketAuthService");
11
+ }
12
+ /**
13
+ * Validates WebSocket authentication token from URL query parameters
14
+ * @param url - The WebSocket connection URL
15
+ * @returns Authentication result with userId and payload, or null if no token provided
16
+ * @throws Error if authentication fails
17
+ */
18
+ async validateAuth(url) {
19
+ try {
20
+ const parsedUrl = new URL(url, "ws://localhost");
21
+ const token = parsedUrl.searchParams.get("token");
22
+ if (!token) {
23
+ return null;
24
+ }
25
+ const jwtSecretKey = this.applicationConfig.auth?.jwtSecretKey;
26
+ if (!jwtSecretKey) {
27
+ throw new Error("JWT secret key not configured");
28
+ }
29
+ const importedJwtSecretKey = await Jwt.importJwtSecretKey({
30
+ jwtSecretKey
31
+ });
32
+ const { payload } = await Jwt.jwtVerify(token, importedJwtSecretKey);
33
+ const userId = parseInt(payload.sub);
34
+ if (isNaN(userId)) {
35
+ throw new Error("Invalid user ID in token");
36
+ }
37
+ return { userId, payload };
38
+ } catch (error) {
39
+ throw new Error(`JWT verification failed: ${error.message}`);
40
+ }
41
+ }
42
+ }
43
+ export {
44
+ WebSocketAuthService
45
+ };
46
+ //# sourceMappingURL=websocket-auth.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/websocket/websocket-auth.ts"],
4
+ "sourcesContent": ["import { URL } from 'url';\nimport Jwt from '../auth/jwt.js';\nimport type { WebApplicationConfig } from '../application/web-application.interface.js';\n\nexport interface WebSocketAuthResult {\n userId: number;\n payload: Record<string, unknown>;\n}\n\nexport class WebSocketAuthService {\n constructor(private readonly applicationConfig: WebApplicationConfig) {}\n\n /**\n * Validates WebSocket authentication token from URL query parameters\n * @param url - The WebSocket connection URL\n * @returns Authentication result with userId and payload, or null if no token provided\n * @throws Error if authentication fails\n */\n async validateAuth(url: string): Promise<WebSocketAuthResult | null> {\n try {\n const parsedUrl = new URL(url, 'ws://localhost');\n const token = parsedUrl.searchParams.get('token');\n\n if (!token) {\n return null; // No token provided, allow unauthenticated connection\n }\n\n // Get JWT secret key from application config\n const jwtSecretKey = this.applicationConfig.auth?.jwtSecretKey;\n\n if (!jwtSecretKey) {\n throw new Error('JWT secret key not configured');\n }\n\n // Import JWT secret key\n const importedJwtSecretKey = await Jwt.importJwtSecretKey({\n jwtSecretKey,\n });\n\n // Verify JWT token\n const { payload } = await Jwt.jwtVerify(token, importedJwtSecretKey);\n\n const userId = parseInt(payload.sub as string);\n\n if (isNaN(userId)) {\n throw new Error('Invalid user ID in token');\n }\n\n return { userId, payload };\n } catch (error: any) {\n throw new Error(`JWT verification failed: ${error.message}`);\n }\n }\n}\n"],
5
+ "mappings": ";;AAAA,SAAS,WAAW;AACpB,OAAO,SAAS;AAQT,MAAM,qBAAqB;AAAA,EAChC,YAA6B,mBAAyC;AAAzC;AAAA,EAA0C;AAAA,EAVzE,OASkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShC,MAAM,aAAa,KAAkD;AACnE,QAAI;AACF,YAAM,YAAY,IAAI,IAAI,KAAK,gBAAgB;AAC/C,YAAM,QAAQ,UAAU,aAAa,IAAI,OAAO;AAEhD,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,MACT;AAGA,YAAM,eAAe,KAAK,kBAAkB,MAAM;AAElD,UAAI,CAAC,cAAc;AACjB,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AAGA,YAAM,uBAAuB,MAAM,IAAI,mBAAmB;AAAA,QACxD;AAAA,MACF,CAAC;AAGD,YAAM,EAAE,QAAQ,IAAI,MAAM,IAAI,UAAU,OAAO,oBAAoB;AAEnE,YAAM,SAAS,SAAS,QAAQ,GAAa;AAE7C,UAAI,MAAM,MAAM,GAAG;AACjB,cAAM,IAAI,MAAM,0BAA0B;AAAA,MAC5C;AAEA,aAAO,EAAE,QAAQ,QAAQ;AAAA,IAC3B,SAAS,OAAY;AACnB,YAAM,IAAI,MAAM,4BAA4B,MAAM,OAAO,EAAE;AAAA,IAC7D;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,19 @@
1
+ import type { WebSocketMessageHandler, WebSocketRoute, WebSocketType } from './websocket.interface.js';
2
+ import type WebSocket from 'ws';
3
+ export default abstract class WebSocketBase {
4
+ protected routes: WebSocketRoute[];
5
+ protected routeHandlers: Map<string, WebSocketMessageHandler>;
6
+ protected defaultRoutes: WebSocketRoute[];
7
+ abstract get type(): WebSocketType;
8
+ protected abstract getControllerDependencies(): Record<string, unknown>;
9
+ protected abstract shouldPrintRoutes(): boolean;
10
+ protected abstract handleMessageError(clientId: string, error: string): void;
11
+ protected configureRoutes(routes: WebSocketRoute[], controllersDirectory: string): Promise<void>;
12
+ protected handleServerMessage(ws: WebSocket, message: WebSocket.Data, clientId: string): Promise<{
13
+ type: unknown;
14
+ action: unknown;
15
+ response: unknown;
16
+ } | void>;
17
+ protected printRoutes(): void;
18
+ }
19
+ //# sourceMappingURL=websocket-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-base.d.ts","sourceRoot":"","sources":["../../src/websocket/websocket-base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAIvG,OAAO,KAAK,SAAS,MAAM,IAAI,CAAC;AAGhC,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,aAAa;IACzC,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,CAAM;IACxC,SAAS,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAa;IAE1E,SAAS,CAAC,aAAa,EAAE,cAAc,EAAE,CAAM;IAE/C,aAAoB,IAAI,IAAI,aAAa,CAAC;IAE1C,SAAS,CAAC,QAAQ,CAAC,yBAAyB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvE,SAAS,CAAC,QAAQ,CAAC,iBAAiB,IAAI,OAAO;IAC/C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;cAE5D,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAwEtF,mBAAmB,CACjC,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,SAAS,CAAC,IAAI,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAuDxE,SAAS,CAAC,WAAW,IAAI,IAAI;CAiB9B"}
@@ -0,0 +1,53 @@
1
+ import WebSocket from 'ws';
2
+ import type { WebSocketClientData } from './websocket-client-manager.interface.js';
3
+ export default class WebSocketClientManager {
4
+ private clients;
5
+ addClient({ clientId, ws, lastActivity, user, }: {
6
+ clientId: string;
7
+ ws: WebSocket | null;
8
+ lastActivity: number;
9
+ user?: {
10
+ userId: number;
11
+ payload: any;
12
+ } | null;
13
+ }): void;
14
+ getClientId({ ws }: {
15
+ ws: WebSocket;
16
+ }): string | undefined;
17
+ getClient({ clientId, requireWs, }: {
18
+ clientId: string;
19
+ requireWs?: boolean;
20
+ }): WebSocketClientData | undefined;
21
+ updateClient({ clientId, key, data, broadcastClientList, }: {
22
+ clientId: string;
23
+ key: string;
24
+ data: any;
25
+ broadcastClientList?: boolean;
26
+ }): void;
27
+ removeClient(clientId: string): void;
28
+ getClientList(): {
29
+ [key: string]: any;
30
+ clientId: string;
31
+ }[];
32
+ getClientByKey({ key, value, requireWs, userType, }: {
33
+ key: string;
34
+ value: string;
35
+ requireWs?: boolean;
36
+ userType?: string;
37
+ }): {
38
+ ws: WebSocket | null;
39
+ lastActivity: number;
40
+ roomName?: string;
41
+ clientId: string;
42
+ } | undefined;
43
+ getClients({ userType }?: {
44
+ userType?: string;
45
+ }): WebSocketClientData[];
46
+ disconnectClient({ clientId }: {
47
+ clientId: string;
48
+ }): void;
49
+ printClients(): void;
50
+ broadcastClientList(type: string): void;
51
+ cleanup(): void;
52
+ }
53
+ //# sourceMappingURL=websocket-client-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-client-manager.d.ts","sourceRoot":"","sources":["../../src/websocket/websocket-client-manager.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAE3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAKnF,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACzC,OAAO,CAAC,OAAO,CAA+C;IAEvD,SAAS,CAAC,EACf,QAAQ,EACR,EAAE,EACF,YAAY,EACZ,IAAI,GACL,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,GAAG,CAAA;SAAE,GAAG,IAAI,CAAC;KAChD;IAiBM,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,SAAS,CAAA;KAAE,GAAG,MAAM,GAAG,SAAS;IAI1D,SAAS,CAAC,EACf,QAAQ,EACR,SAAS,GACV,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,GAAG,mBAAmB,GAAG,SAAS;IAU5B,YAAY,CAAC,EAClB,QAAQ,EACR,GAAG,EACH,IAAI,EACJ,mBAAmB,GACpB,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,GAAG,CAAC;QACV,mBAAmB,CAAC,EAAE,OAAO,CAAC;KAC/B;IA2CM,YAAY,CAAC,QAAQ,EAAE,MAAM;IAsB7B,aAAa;;kBAEN,MAAM;;IAcb,cAAc,CAAC,EACpB,GAAG,EACH,KAAK,EACL,SAAS,EACT,QAAQ,GACT,EAAE;QACD,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;;;;;;IA6BM,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO;IAgBnD,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;IAwBnD,YAAY;IAwBZ,mBAAmB,CAAC,IAAI,EAAE,MAAM;IA0BhC,OAAO,IAAI,IAAI;CAsBvB"}
@@ -0,0 +1,8 @@
1
+ import type WebSocket from 'ws';
2
+ export interface WebSocketClientData {
3
+ ws: WebSocket | null;
4
+ lastActivity: number;
5
+ roomName?: string;
6
+ [key: string]: any;
7
+ }
8
+ //# sourceMappingURL=websocket-client-manager.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-client-manager.interface.d.ts","sourceRoot":"","sources":["../../src/websocket/websocket-client-manager.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,IAAI,CAAC;AAEhC,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB"}
@@ -4,6 +4,7 @@ import WebSocket from "ws";
4
4
  import { log } from "./utils.js";
5
5
  import { Helper, Time } from "../util/index.js";
6
6
  import cluster from "cluster";
7
+ import { safeSerializeError } from "../error/error-reporter.js";
7
8
  class WebSocketClientManager {
8
9
  static {
9
10
  __name(this, "WebSocketClientManager");
@@ -51,7 +52,7 @@ class WebSocketClientManager {
51
52
  return;
52
53
  }
53
54
  if (key === "__proto__" || key === "constructor" || key === "prototype") {
54
- console.warn(`Blocked attempt to modify dangerous property: ${key}`);
55
+ log("Blocked attempt to modify dangerous property", { Property: key });
55
56
  return;
56
57
  }
57
58
  const allowedClientProperties = [
@@ -67,7 +68,7 @@ class WebSocketClientManager {
67
68
  "permissions"
68
69
  ];
69
70
  if (!allowedClientProperties.includes(key)) {
70
- console.warn(`Blocked attempt to modify unauthorized property: ${key}`);
71
+ log("Blocked attempt to modify unauthorized property", { Property: key });
71
72
  return;
72
73
  }
73
74
  Reflect.set(client, key, data);
@@ -87,7 +88,7 @@ class WebSocketClientManager {
87
88
  }
88
89
  } catch (error) {
89
90
  log("Error cleaning up WebSocket connection", {
90
- error: error instanceof Error ? error.message : String(error)
91
+ error: error instanceof Error ? error.message : safeSerializeError(error)
91
92
  });
92
93
  }
93
94
  }
@@ -194,7 +195,7 @@ class WebSocketClientManager {
194
195
  );
195
196
  } catch (error) {
196
197
  log("Error broadcasting client list", {
197
- error: error instanceof Error ? error.message : String(error)
198
+ error: error instanceof Error ? error.message : safeSerializeError(error)
198
199
  });
199
200
  }
200
201
  });
@@ -210,7 +211,7 @@ class WebSocketClientManager {
210
211
  } catch (error) {
211
212
  log("Error cleaning up client connection", {
212
213
  clientId,
213
- error: error instanceof Error ? error.message : String(error)
214
+ error: error instanceof Error ? error.message : safeSerializeError(error)
214
215
  });
215
216
  }
216
217
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/websocket/websocket-client-manager.ts"],
4
- "sourcesContent": ["import WebSocket from 'ws';\nimport { log } from './utils.js';\nimport type { WebSocketClientData } from './websocket-client-manager.interface.js';\nimport { Helper, Time } from '../util/index.js';\nimport cluster from 'cluster';\n\nexport default class WebSocketClientManager {\n private clients: Map<string, WebSocketClientData> = new Map();\n\n public addClient({\n clientId,\n ws,\n lastActivity,\n user,\n }: {\n clientId: string;\n ws: WebSocket | null;\n lastActivity: number;\n user?: { userId: number; payload: any } | null;\n }) {\n this.clients.set(clientId, {\n ws,\n lastActivity,\n user,\n });\n\n this.broadcastClientList('addClient');\n\n log('Client connected', {\n ID: clientId,\n UserId: user?.userId ?? 'unauthenticated',\n });\n\n this.printClients();\n }\n\n public getClientId({ ws }: { ws: WebSocket }): string | undefined {\n return [...this.clients.entries()].find(([_, value]) => value.ws === ws)?.[0];\n }\n\n public getClient({\n clientId,\n requireWs,\n }: {\n clientId: string;\n requireWs?: boolean;\n }): WebSocketClientData | undefined {\n const client = this.clients.get(clientId);\n\n if (requireWs && !client?.ws) {\n return undefined;\n }\n\n return client;\n }\n\n public updateClient({\n clientId,\n key,\n data,\n broadcastClientList,\n }: {\n clientId: string;\n key: string;\n data: any;\n broadcastClientList?: boolean;\n }) {\n const client = this.clients.get(clientId);\n\n if (!client) {\n return;\n }\n\n // Prevent prototype pollution attacks\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n console.warn(`Blocked attempt to modify dangerous property: ${key}`);\n return;\n }\n\n // Define allowed client properties to prevent unauthorized modifications\n const allowedClientProperties = [\n 'id',\n 'ws',\n 'room',\n 'userId',\n 'username',\n 'metadata',\n 'connectedAt',\n 'lastActivity',\n 'status',\n 'permissions',\n ];\n\n if (!allowedClientProperties.includes(key)) {\n console.warn(`Blocked attempt to modify unauthorized property: ${key}`);\n return;\n }\n\n Reflect.set(client, key, data);\n\n this.clients.set(clientId, client);\n\n if (broadcastClientList !== false) {\n this.broadcastClientList('updateClient');\n }\n\n this.printClients();\n }\n\n public removeClient(clientId: string) {\n const client = this.clients.get(clientId);\n\n // Clean up WebSocket connection if it exists\n if (client?.ws) {\n try {\n client.ws.removeAllListeners();\n if (client.ws.readyState === WebSocket.OPEN) {\n client.ws.close();\n }\n } catch (error) {\n log('Error cleaning up WebSocket connection', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n this.clients.delete(clientId);\n this.broadcastClientList('removeClient');\n this.printClients();\n }\n\n public getClientList() {\n const clientList: {\n clientId: string;\n [key: string]: any;\n }[] = [];\n\n this.clients.forEach((clientData, clientId) => {\n clientList.push({\n clientId,\n ...clientData,\n });\n });\n\n return clientList;\n }\n\n public getClientByKey({\n key,\n value,\n requireWs,\n userType,\n }: {\n key: string;\n value: string;\n requireWs?: boolean;\n userType?: string;\n }) {\n const clients = [...this.clients.entries()];\n\n const client = clients.find(([_, clientData]) => {\n const deepKeyValue = Helper.getValueFromObject(clientData, key);\n\n const isValueMatching = deepKeyValue === value;\n\n if (userType && clientData.user?.userType !== userType) {\n return false;\n }\n\n return isValueMatching;\n });\n\n const formattedClient = client\n ? {\n clientId: client[0],\n ...client[1],\n }\n : undefined;\n\n if (requireWs && !formattedClient?.ws) {\n return undefined;\n }\n\n return formattedClient;\n }\n\n public getClients({ userType }: { userType?: string } = {}) {\n const clients: WebSocketClientData[] = [];\n\n this.clients.forEach((clientData, clientId) => {\n if (userType && clientData.user?.userType !== userType) {\n return;\n }\n\n clientData.clientId = clientId;\n\n clients.push(clientData);\n });\n\n return clients;\n }\n\n public disconnectClient({ clientId }: { clientId: string }) {\n const clientInfo = this.clients.get(clientId);\n\n if (clientInfo?.ws) {\n const connectedTime = Date.now() - clientInfo.lastActivity;\n\n clientInfo.ws.close();\n\n log('WebSocket client was disconnected due to inactivity', {\n ID: clientId,\n 'Time Connected': Time.formatTime({\n time: connectedTime,\n format: 's',\n }),\n });\n }\n\n this.removeClient(clientId);\n\n log('Client disconnected', { ID: clientId });\n\n this.printClients();\n }\n\n public printClients() {\n const numClients = this.clients.size;\n\n const workerId = cluster.isWorker && cluster.worker ? cluster.worker.id : null;\n\n let logOutput = '\\n-------------------------------------------------------\\n';\n logOutput += `Connected clients (Count: ${numClients}${workerId ? ` | Worker: ${workerId}` : ''}):\\n`;\n logOutput += '-------------------------------------------------------\\n';\n\n if (numClients > 0) {\n this.clients.forEach((client, clientId) => {\n logOutput += `ID: ${clientId} | Username: ${client?.user?.username ?? '-'} | User Type: ${client?.user?.userType ?? '-'} | Email: ${client.user?.email ?? '-'}\\n`;\n });\n } else {\n logOutput += 'No clients';\n }\n\n logOutput += '\\n';\n\n log(logOutput, undefined, {\n muteWorker: true,\n });\n }\n\n public broadcastClientList(type: string) {\n const clientList = this.getClientList();\n\n this.clients.forEach(({ ws }) => {\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n return;\n }\n\n try {\n ws.send(\n JSON.stringify({\n type: 'system',\n action: 'clientList',\n clientListType: type,\n data: clientList,\n }),\n );\n } catch (error) {\n // Handle send errors (e.g., connection closed)\n log('Error broadcasting client list', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n }\n\n public cleanup(): void {\n // Clean up all client connections\n this.clients.forEach((client, clientId) => {\n if (client.ws) {\n try {\n client.ws.removeAllListeners();\n if (client.ws.readyState === WebSocket.OPEN) {\n client.ws.close();\n }\n } catch (error) {\n log('Error cleaning up client connection', {\n clientId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n });\n\n // Clear all clients\n this.clients.clear();\n log('WebSocket client manager cleaned up');\n }\n}\n"],
5
- "mappings": ";;AAAA,OAAO,eAAe;AACtB,SAAS,WAAW;AAEpB,SAAS,QAAQ,YAAY;AAC7B,OAAO,aAAa;AAEpB,MAAO,uBAAqC;AAAA,EAN5C,OAM4C;AAAA;AAAA;AAAA,EAClC,UAA4C,oBAAI,IAAI;AAAA,EAErD,UAAU;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAKG;AACD,SAAK,QAAQ,IAAI,UAAU;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,SAAK,oBAAoB,WAAW;AAEpC,QAAI,oBAAoB;AAAA,MACtB,IAAI;AAAA,MACJ,QAAQ,MAAM,UAAU;AAAA,IAC1B,CAAC;AAED,SAAK,aAAa;AAAA,EACpB;AAAA,EAEO,YAAY,EAAE,GAAG,GAA0C;AAChE,WAAO,CAAC,GAAG,KAAK,QAAQ,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,MAAM,MAAM,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9E;AAAA,EAEO,UAAU;AAAA,IACf;AAAA,IACA;AAAA,EACF,GAGoC;AAClC,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AAExC,QAAI,aAAa,CAAC,QAAQ,IAAI;AAC5B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,aAAa;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAKG;AACD,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AAExC,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAGA,QAAI,QAAQ,eAAe,QAAQ,iBAAiB,QAAQ,aAAa;AACvE,cAAQ,KAAK,iDAAiD,GAAG,EAAE;AACnE;AAAA,IACF;AAGA,UAAM,0BAA0B;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,wBAAwB,SAAS,GAAG,GAAG;AAC1C,cAAQ,KAAK,oDAAoD,GAAG,EAAE;AACtE;AAAA,IACF;AAEA,YAAQ,IAAI,QAAQ,KAAK,IAAI;AAE7B,SAAK,QAAQ,IAAI,UAAU,MAAM;AAEjC,QAAI,wBAAwB,OAAO;AACjC,WAAK,oBAAoB,cAAc;AAAA,IACzC;AAEA,SAAK,aAAa;AAAA,EACpB;AAAA,EAEO,aAAa,UAAkB;AACpC,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AAGxC,QAAI,QAAQ,IAAI;AACd,UAAI;AACF,eAAO,GAAG,mBAAmB;AAC7B,YAAI,OAAO,GAAG,eAAe,UAAU,MAAM;AAC3C,iBAAO,GAAG,MAAM;AAAA,QAClB;AAAA,MACF,SAAS,OAAO;AACd,YAAI,0CAA0C;AAAA,UAC5C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,QAAQ,OAAO,QAAQ;AAC5B,SAAK,oBAAoB,cAAc;AACvC,SAAK,aAAa;AAAA,EACpB;AAAA,EAEO,gBAAgB;AACrB,UAAM,aAGA,CAAC;AAEP,SAAK,QAAQ,QAAQ,CAAC,YAAY,aAAa;AAC7C,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,GAAG;AAAA,MACL,CAAC;AAAA,IACH,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEO,eAAe;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAKG;AACD,UAAM,UAAU,CAAC,GAAG,KAAK,QAAQ,QAAQ,CAAC;AAE1C,UAAM,SAAS,QAAQ,KAAK,CAAC,CAAC,GAAG,UAAU,MAAM;AAC/C,YAAM,eAAe,OAAO,mBAAmB,YAAY,GAAG;AAE9D,YAAM,kBAAkB,iBAAiB;AAEzC,UAAI,YAAY,WAAW,MAAM,aAAa,UAAU;AACtD,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,kBAAkB,SACpB;AAAA,MACE,UAAU,OAAO,CAAC;AAAA,MAClB,GAAG,OAAO,CAAC;AAAA,IACb,IACA;AAEJ,QAAI,aAAa,CAAC,iBAAiB,IAAI;AACrC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,EAAE,SAAS,IAA2B,CAAC,GAAG;AAC1D,UAAM,UAAiC,CAAC;AAExC,SAAK,QAAQ,QAAQ,CAAC,YAAY,aAAa;AAC7C,UAAI,YAAY,WAAW,MAAM,aAAa,UAAU;AACtD;AAAA,MACF;AAEA,iBAAW,WAAW;AAEtB,cAAQ,KAAK,UAAU;AAAA,IACzB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEO,iBAAiB,EAAE,SAAS,GAAyB;AAC1D,UAAM,aAAa,KAAK,QAAQ,IAAI,QAAQ;AAE5C,QAAI,YAAY,IAAI;AAClB,YAAM,gBAAgB,KAAK,IAAI,IAAI,WAAW;AAE9C,iBAAW,GAAG,MAAM;AAEpB,UAAI,uDAAuD;AAAA,QACzD,IAAI;AAAA,QACJ,kBAAkB,KAAK,WAAW;AAAA,UAChC,MAAM;AAAA,UACN,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,SAAK,aAAa,QAAQ;AAE1B,QAAI,uBAAuB,EAAE,IAAI,SAAS,CAAC;AAE3C,SAAK,aAAa;AAAA,EACpB;AAAA,EAEO,eAAe;AACpB,UAAM,aAAa,KAAK,QAAQ;AAEhC,UAAM,WAAW,QAAQ,YAAY,QAAQ,SAAS,QAAQ,OAAO,KAAK;AAE1E,QAAI,YAAY;AAChB,iBAAa,6BAA6B,UAAU,GAAG,WAAW,cAAc,QAAQ,KAAK,EAAE;AAAA;AAC/F,iBAAa;AAEb,QAAI,aAAa,GAAG;AAClB,WAAK,QAAQ,QAAQ,CAAC,QAAQ,aAAa;AACzC,qBAAa,OAAO,QAAQ,gBAAgB,QAAQ,MAAM,YAAY,GAAG,iBAAiB,QAAQ,MAAM,YAAY,GAAG,aAAa,OAAO,MAAM,SAAS,GAAG;AAAA;AAAA,MAC/J,CAAC;AAAA,IACH,OAAO;AACL,mBAAa;AAAA,IACf;AAEA,iBAAa;AAEb,QAAI,WAAW,QAAW;AAAA,MACxB,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EAEO,oBAAoB,MAAc;AACvC,UAAM,aAAa,KAAK,cAAc;AAEtC,SAAK,QAAQ,QAAQ,CAAC,EAAE,GAAG,MAAM;AAC/B,UAAI,CAAC,MAAM,GAAG,eAAe,UAAU,MAAM;AAC3C;AAAA,MACF;AAEA,UAAI;AACF,WAAG;AAAA,UACD,KAAK,UAAU;AAAA,YACb,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,gBAAgB;AAAA,YAChB,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AAEd,YAAI,kCAAkC;AAAA,UACpC,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEO,UAAgB;AAErB,SAAK,QAAQ,QAAQ,CAAC,QAAQ,aAAa;AACzC,UAAI,OAAO,IAAI;AACb,YAAI;AACF,iBAAO,GAAG,mBAAmB;AAC7B,cAAI,OAAO,GAAG,eAAe,UAAU,MAAM;AAC3C,mBAAO,GAAG,MAAM;AAAA,UAClB;AAAA,QACF,SAAS,OAAO;AACd,cAAI,uCAAuC;AAAA,YACzC;AAAA,YACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAGD,SAAK,QAAQ,MAAM;AACnB,QAAI,qCAAqC;AAAA,EAC3C;AACF;",
4
+ "sourcesContent": ["import WebSocket from 'ws';\nimport { log } from './utils.js';\nimport type { WebSocketClientData } from './websocket-client-manager.interface.js';\nimport { Helper, Time } from '../util/index.js';\nimport cluster from 'cluster';\nimport { safeSerializeError } from '../error/error-reporter.js';\n\nexport default class WebSocketClientManager {\n private clients: Map<string, WebSocketClientData> = new Map();\n\n public addClient({\n clientId,\n ws,\n lastActivity,\n user,\n }: {\n clientId: string;\n ws: WebSocket | null;\n lastActivity: number;\n user?: { userId: number; payload: any } | null;\n }) {\n this.clients.set(clientId, {\n ws,\n lastActivity,\n user,\n });\n\n this.broadcastClientList('addClient');\n\n log('Client connected', {\n ID: clientId,\n UserId: user?.userId ?? 'unauthenticated',\n });\n\n this.printClients();\n }\n\n public getClientId({ ws }: { ws: WebSocket }): string | undefined {\n return [...this.clients.entries()].find(([_, value]) => value.ws === ws)?.[0];\n }\n\n public getClient({\n clientId,\n requireWs,\n }: {\n clientId: string;\n requireWs?: boolean;\n }): WebSocketClientData | undefined {\n const client = this.clients.get(clientId);\n\n if (requireWs && !client?.ws) {\n return undefined;\n }\n\n return client;\n }\n\n public updateClient({\n clientId,\n key,\n data,\n broadcastClientList,\n }: {\n clientId: string;\n key: string;\n data: any;\n broadcastClientList?: boolean;\n }) {\n const client = this.clients.get(clientId);\n\n if (!client) {\n return;\n }\n\n // Prevent prototype pollution attacks\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n log('Blocked attempt to modify dangerous property', { Property: key });\n return;\n }\n\n // Define allowed client properties to prevent unauthorized modifications\n const allowedClientProperties = [\n 'id',\n 'ws',\n 'room',\n 'userId',\n 'username',\n 'metadata',\n 'connectedAt',\n 'lastActivity',\n 'status',\n 'permissions',\n ];\n\n if (!allowedClientProperties.includes(key)) {\n log('Blocked attempt to modify unauthorized property', { Property: key });\n return;\n }\n\n Reflect.set(client, key, data);\n\n this.clients.set(clientId, client);\n\n if (broadcastClientList !== false) {\n this.broadcastClientList('updateClient');\n }\n\n this.printClients();\n }\n\n public removeClient(clientId: string) {\n const client = this.clients.get(clientId);\n\n // Clean up WebSocket connection if it exists\n if (client?.ws) {\n try {\n client.ws.removeAllListeners();\n if (client.ws.readyState === WebSocket.OPEN) {\n client.ws.close();\n }\n } catch (error) {\n log('Error cleaning up WebSocket connection', {\n error: error instanceof Error ? error.message : safeSerializeError(error),\n });\n }\n }\n\n this.clients.delete(clientId);\n this.broadcastClientList('removeClient');\n this.printClients();\n }\n\n public getClientList() {\n const clientList: {\n clientId: string;\n [key: string]: any;\n }[] = [];\n\n this.clients.forEach((clientData, clientId) => {\n clientList.push({\n clientId,\n ...clientData,\n });\n });\n\n return clientList;\n }\n\n public getClientByKey({\n key,\n value,\n requireWs,\n userType,\n }: {\n key: string;\n value: string;\n requireWs?: boolean;\n userType?: string;\n }) {\n const clients = [...this.clients.entries()];\n\n const client = clients.find(([_, clientData]) => {\n const deepKeyValue = Helper.getValueFromObject(clientData, key);\n\n const isValueMatching = deepKeyValue === value;\n\n if (userType && clientData.user?.userType !== userType) {\n return false;\n }\n\n return isValueMatching;\n });\n\n const formattedClient = client\n ? {\n clientId: client[0],\n ...client[1],\n }\n : undefined;\n\n if (requireWs && !formattedClient?.ws) {\n return undefined;\n }\n\n return formattedClient;\n }\n\n public getClients({ userType }: { userType?: string } = {}) {\n const clients: WebSocketClientData[] = [];\n\n this.clients.forEach((clientData, clientId) => {\n if (userType && clientData.user?.userType !== userType) {\n return;\n }\n\n clientData.clientId = clientId;\n\n clients.push(clientData);\n });\n\n return clients;\n }\n\n public disconnectClient({ clientId }: { clientId: string }) {\n const clientInfo = this.clients.get(clientId);\n\n if (clientInfo?.ws) {\n const connectedTime = Date.now() - clientInfo.lastActivity;\n\n clientInfo.ws.close();\n\n log('WebSocket client was disconnected due to inactivity', {\n ID: clientId,\n 'Time Connected': Time.formatTime({\n time: connectedTime,\n format: 's',\n }),\n });\n }\n\n this.removeClient(clientId);\n\n log('Client disconnected', { ID: clientId });\n\n this.printClients();\n }\n\n public printClients() {\n const numClients = this.clients.size;\n\n const workerId = cluster.isWorker && cluster.worker ? cluster.worker.id : null;\n\n let logOutput = '\\n-------------------------------------------------------\\n';\n logOutput += `Connected clients (Count: ${numClients}${workerId ? ` | Worker: ${workerId}` : ''}):\\n`;\n logOutput += '-------------------------------------------------------\\n';\n\n if (numClients > 0) {\n this.clients.forEach((client, clientId) => {\n logOutput += `ID: ${clientId} | Username: ${client?.user?.username ?? '-'} | User Type: ${client?.user?.userType ?? '-'} | Email: ${client.user?.email ?? '-'}\\n`;\n });\n } else {\n logOutput += 'No clients';\n }\n\n logOutput += '\\n';\n\n log(logOutput, undefined, {\n muteWorker: true,\n });\n }\n\n public broadcastClientList(type: string) {\n const clientList = this.getClientList();\n\n this.clients.forEach(({ ws }) => {\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n return;\n }\n\n try {\n ws.send(\n JSON.stringify({\n type: 'system',\n action: 'clientList',\n clientListType: type,\n data: clientList,\n }),\n );\n } catch (error) {\n // Handle send errors (e.g., connection closed)\n log('Error broadcasting client list', {\n error: error instanceof Error ? error.message : safeSerializeError(error),\n });\n }\n });\n }\n\n public cleanup(): void {\n // Clean up all client connections\n this.clients.forEach((client, clientId) => {\n if (client.ws) {\n try {\n client.ws.removeAllListeners();\n if (client.ws.readyState === WebSocket.OPEN) {\n client.ws.close();\n }\n } catch (error) {\n log('Error cleaning up client connection', {\n clientId,\n error: error instanceof Error ? error.message : safeSerializeError(error),\n });\n }\n }\n });\n\n // Clear all clients\n this.clients.clear();\n log('WebSocket client manager cleaned up');\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,64 @@
1
+ import type { WebSocketRoute, WebSocketType } from './websocket.interface.js';
2
+ import type RedisInstance from '../redis/instance.js';
3
+ import type QueueManager from '../queue/manager.js';
4
+ import type DatabaseInstance from '../database/instance.js';
5
+ import type { WebSocketClientProps } from './websocket-client.interface.js';
6
+ import WebSocketBase from './websocket-base.js';
7
+ export default class WebSocketClient extends WebSocketBase {
8
+ protected defaultRoutes: WebSocketRoute[];
9
+ private applicationConfig;
10
+ private options;
11
+ private redisInstance;
12
+ private queueManager;
13
+ private databaseInstance;
14
+ private ws?;
15
+ private clientId?;
16
+ private isConnected;
17
+ private reconnectAttempts;
18
+ private maxReconnectAttempts;
19
+ private reconnectDelay;
20
+ private reconnectTimer?;
21
+ private shouldReconnect;
22
+ constructor(props: WebSocketClientProps);
23
+ get type(): WebSocketType;
24
+ load(): Promise<void>;
25
+ connectToServer(): Promise<void>;
26
+ protected getControllerDependencies(): {
27
+ sendMessage: (data: unknown) => void;
28
+ redisInstance: RedisInstance;
29
+ queueManager: QueueManager;
30
+ databaseInstance: DatabaseInstance;
31
+ };
32
+ protected shouldPrintRoutes(): boolean;
33
+ private handleIncomingMessage;
34
+ protected handleMessageError(clientId: string, error: string): void;
35
+ sendClientMessage: (data: unknown, binary?: boolean) => void;
36
+ sendMessage: (data: unknown) => void;
37
+ disconnect(): void;
38
+ isClientConnected(): boolean;
39
+ /**
40
+ * Schedule a reconnection attempt with exponential backoff
41
+ */
42
+ private scheduleReconnect;
43
+ /**
44
+ * Attempt to reconnect to the server
45
+ */
46
+ private attemptReconnect;
47
+ /**
48
+ * Enable auto-reconnection
49
+ */
50
+ enableAutoReconnect(): void;
51
+ /**
52
+ * Disable auto-reconnection
53
+ */
54
+ disableAutoReconnect(): void;
55
+ /**
56
+ * Get connection status
57
+ */
58
+ getConnectionStatus(): {
59
+ isConnected: boolean;
60
+ reconnectAttempts: number;
61
+ autoReconnectEnabled: boolean;
62
+ };
63
+ }
64
+ //# sourceMappingURL=websocket-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../src/websocket/websocket-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAMhD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,aAAa;IACxD,SAAS,CAAC,aAAa,EAAE,cAAc,EAAE,CAMvC;IAEF,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,EAAE,CAAC,CAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,oBAAoB,CAAc;IAC1C,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAiB;gBAE5B,KAAK,EAAE,oBAAoB;IAWvC,IAAW,IAAI,IAAI,aAAa,CAE/B;IAEY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IA+E7C,SAAS,CAAC,yBAAyB,IAAI;QACrC,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;QACrC,aAAa,EAAE,aAAa,CAAC;QAC7B,YAAY,EAAE,YAAY,CAAC;QAC3B,gBAAgB,EAAE,gBAAgB,CAAC;KACpC;IAQD,SAAS,CAAC,iBAAiB,IAAI,OAAO;IAItC,OAAO,CAAC,qBAAqB,CAqB3B;IAEF,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5D,iBAAiB,GAAI,MAAM,OAAO,EAAE,SAAQ,OAAe,KAAG,IAAI,CAUvE;IAEK,WAAW,GAAI,MAAM,OAAO,KAAG,IAAI,CAExC;IAEK,UAAU,IAAI,IAAI;IAoBlB,iBAAiB,IAAI,OAAO;IAInC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqCzB;;OAEG;YACW,gBAAgB;IA4B9B;;OAEG;IACI,mBAAmB,IAAI,IAAI;IAIlC;;OAEG;IACI,oBAAoB,IAAI,IAAI;IASnC;;OAEG;IACI,mBAAmB,IAAI;QAC5B,WAAW,EAAE,OAAO,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,oBAAoB,EAAE,OAAO,CAAC;KAC/B;CAOF"}
@@ -0,0 +1,14 @@
1
+ import type { ApplicationConfig } from '../application/base-application.interface.js';
2
+ import type DatabaseInstance from '../database/instance.js';
3
+ import type QueueManager from '../queue/manager.js';
4
+ import type { RedisInstance } from '../redis/index.js';
5
+ import type { WebSocketOptions, WebSocketRoute } from './websocket.interface.js';
6
+ export interface WebSocketClientProps {
7
+ applicationConfig: ApplicationConfig;
8
+ options: WebSocketOptions;
9
+ redisInstance: RedisInstance;
10
+ queueManager: QueueManager;
11
+ databaseInstance: DatabaseInstance;
12
+ routes: WebSocketRoute[];
13
+ }
14
+ //# sourceMappingURL=websocket-client.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-client.interface.d.ts","sourceRoot":"","sources":["../../src/websocket/websocket-client.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAEjF,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B"}