@scpxl/nodejs-framework 1.0.49 → 1.0.56

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 (258) hide show
  1. package/README.md +12 -7
  2. package/dist/api-requester/api-requester.js +1 -1
  3. package/dist/api-requester/api-requester.js.map +2 -2
  4. package/dist/api-requester/index.d.ts +1 -1
  5. package/dist/api-requester/index.d.ts.map +1 -1
  6. package/dist/api-requester/index.js.map +2 -2
  7. package/dist/application/base-application.d.ts +6 -5
  8. package/dist/application/base-application.d.ts.map +1 -1
  9. package/dist/application/base-application.interface.d.ts +2 -4
  10. package/dist/application/base-application.interface.d.ts.map +1 -1
  11. package/dist/application/base-application.js +23 -14
  12. package/dist/application/base-application.js.map +2 -2
  13. package/dist/application/command-application.d.ts.map +1 -1
  14. package/dist/application/command-application.js +2 -2
  15. package/dist/application/command-application.js.map +2 -2
  16. package/dist/application/index.d.ts +3 -3
  17. package/dist/application/index.d.ts.map +1 -1
  18. package/dist/application/index.js +4 -4
  19. package/dist/application/index.js.map +2 -2
  20. package/dist/application/web-application.d.ts +5 -5
  21. package/dist/application/web-application.d.ts.map +1 -1
  22. package/dist/application/web-application.js +6 -7
  23. package/dist/application/web-application.js.map +2 -2
  24. package/dist/application/worker-application.d.ts +2 -2
  25. package/dist/application/worker-application.d.ts.map +1 -1
  26. package/dist/application/worker-application.js +2 -2
  27. package/dist/application/worker-application.js.map +2 -2
  28. package/dist/auth/jwt.d.ts.map +1 -1
  29. package/dist/auth/jwt.js +2 -2
  30. package/dist/auth/jwt.js.map +2 -2
  31. package/dist/cache/manager.d.ts.map +1 -1
  32. package/dist/cache/manager.js.map +2 -2
  33. package/dist/cli/index.js +192 -7029
  34. package/dist/cli/index.js.map +4 -4
  35. package/dist/cluster/cluster-manager.d.ts.map +1 -1
  36. package/dist/cluster/cluster-manager.js +1 -1
  37. package/dist/cluster/cluster-manager.js.map +2 -2
  38. package/dist/command/command.d.ts +1 -1
  39. package/dist/command/command.d.ts.map +1 -1
  40. package/dist/command/command.js.map +2 -2
  41. package/dist/config/env.d.ts +1 -1
  42. package/dist/config/env.d.ts.map +1 -1
  43. package/dist/config/env.js.map +1 -1
  44. package/dist/config/index.d.ts +1 -1
  45. package/dist/config/index.d.ts.map +1 -1
  46. package/dist/config/index.js +1 -1
  47. package/dist/config/index.js.map +1 -1
  48. package/dist/config/schema.d.ts.map +1 -1
  49. package/dist/config/schema.js +1 -1
  50. package/dist/config/schema.js.map +2 -2
  51. package/dist/database/dynamic-entity.js +9 -9
  52. package/dist/database/dynamic-entity.js.map +2 -2
  53. package/dist/database/index.d.ts +3 -3
  54. package/dist/database/index.d.ts.map +1 -1
  55. package/dist/database/index.js +5 -5
  56. package/dist/database/index.js.map +2 -2
  57. package/dist/database/instance.d.ts +3 -3
  58. package/dist/database/instance.js +3 -3
  59. package/dist/database/instance.js.map +1 -1
  60. package/dist/database/manager.d.ts +1 -0
  61. package/dist/database/manager.d.ts.map +1 -1
  62. package/dist/database/manager.js +16 -3
  63. package/dist/database/manager.js.map +2 -2
  64. package/dist/error/error-reporter.js +1 -1
  65. package/dist/error/error-reporter.js.map +2 -2
  66. package/dist/error/index.d.ts +2 -3
  67. package/dist/error/index.d.ts.map +1 -1
  68. package/dist/error/index.js +8 -9
  69. package/dist/error/index.js.map +2 -2
  70. package/dist/event/controller/base.d.ts +2 -2
  71. package/dist/event/controller/base.d.ts.map +1 -1
  72. package/dist/event/controller/base.js +2 -2
  73. package/dist/event/controller/base.js.map +2 -2
  74. package/dist/event/index.d.ts +3 -3
  75. package/dist/event/index.d.ts.map +1 -1
  76. package/dist/event/index.js +5 -5
  77. package/dist/event/index.js.map +2 -2
  78. package/dist/event/manager.d.ts.map +1 -1
  79. package/dist/event/manager.interface.d.ts +2 -3
  80. package/dist/event/manager.interface.d.ts.map +1 -1
  81. package/dist/event/manager.js.map +2 -2
  82. package/dist/index.d.ts +1 -1
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +1 -1
  85. package/dist/index.js.map +2 -2
  86. package/dist/lifecycle/index.d.ts +3 -3
  87. package/dist/lifecycle/index.d.ts.map +1 -1
  88. package/dist/lifecycle/index.js +1 -1
  89. package/dist/lifecycle/index.js.map +2 -2
  90. package/dist/lifecycle/lifecycle-manager.d.ts +6 -0
  91. package/dist/lifecycle/lifecycle-manager.d.ts.map +1 -1
  92. package/dist/lifecycle/lifecycle-manager.js +28 -0
  93. package/dist/lifecycle/lifecycle-manager.js.map +2 -2
  94. package/dist/logger/logger.d.ts +20 -1
  95. package/dist/logger/logger.d.ts.map +1 -1
  96. package/dist/logger/logger.js +68 -96
  97. package/dist/logger/logger.js.map +2 -2
  98. package/dist/performance/cache-performance.d.ts.map +1 -1
  99. package/dist/performance/cache-performance.js +1 -1
  100. package/dist/performance/cache-performance.js.map +2 -2
  101. package/dist/performance/database-performance.d.ts.map +1 -1
  102. package/dist/performance/database-performance.js +1 -1
  103. package/dist/performance/database-performance.js.map +2 -2
  104. package/dist/performance/index.d.ts +3 -3
  105. package/dist/performance/index.d.ts.map +1 -1
  106. package/dist/performance/index.js +3 -3
  107. package/dist/performance/index.js.map +1 -1
  108. package/dist/performance/performance-monitor.js +2 -2
  109. package/dist/performance/performance-monitor.js.map +2 -2
  110. package/dist/performance/performance-monitor.plugin.d.ts.map +1 -1
  111. package/dist/performance/performance-monitor.plugin.js +1 -1
  112. package/dist/performance/performance-monitor.plugin.js.map +2 -2
  113. package/dist/performance/queue-performance.d.ts.map +1 -1
  114. package/dist/performance/queue-performance.js +1 -1
  115. package/dist/performance/queue-performance.js.map +2 -2
  116. package/dist/performance/webserver-performance.d.ts.map +1 -1
  117. package/dist/performance/webserver-performance.js +1 -1
  118. package/dist/performance/webserver-performance.js.map +2 -2
  119. package/dist/performance/websocket-performance.d.ts.map +1 -1
  120. package/dist/performance/websocket-performance.js +1 -1
  121. package/dist/performance/websocket-performance.js.map +2 -2
  122. package/dist/queue/index.d.ts +2 -2
  123. package/dist/queue/index.d.ts.map +1 -1
  124. package/dist/queue/index.interface.d.ts +1 -1
  125. package/dist/queue/index.interface.d.ts.map +1 -1
  126. package/dist/queue/index.js.map +2 -2
  127. package/dist/queue/manager.d.ts +9 -2
  128. package/dist/queue/manager.d.ts.map +1 -1
  129. package/dist/queue/manager.js +44 -6
  130. package/dist/queue/manager.js.map +2 -2
  131. package/dist/queue/processor/base.d.ts +5 -5
  132. package/dist/queue/processor/base.d.ts.map +1 -1
  133. package/dist/queue/processor/base.js +2 -2
  134. package/dist/queue/processor/base.js.map +2 -2
  135. package/dist/queue/processor/processor.interface.d.ts +3 -3
  136. package/dist/queue/processor/processor.interface.d.ts.map +1 -1
  137. package/dist/queue/worker.d.ts +5 -0
  138. package/dist/queue/worker.d.ts.map +1 -1
  139. package/dist/queue/worker.interface.d.ts +1 -1
  140. package/dist/queue/worker.interface.d.ts.map +1 -1
  141. package/dist/queue/worker.js +9 -1
  142. package/dist/queue/worker.js.map +2 -2
  143. package/dist/redis/index.d.ts +1 -1
  144. package/dist/redis/index.d.ts.map +1 -1
  145. package/dist/redis/index.js +5 -4
  146. package/dist/redis/index.js.map +2 -2
  147. package/dist/redis/instance.js +1 -1
  148. package/dist/redis/instance.js.map +2 -2
  149. package/dist/redis/manager.d.ts +7 -1
  150. package/dist/redis/manager.d.ts.map +1 -1
  151. package/dist/redis/manager.js +20 -4
  152. package/dist/redis/manager.js.map +2 -2
  153. package/dist/request-context/index.d.ts +1 -1
  154. package/dist/request-context/index.d.ts.map +1 -1
  155. package/dist/request-context/index.js +5 -5
  156. package/dist/request-context/index.js.map +1 -1
  157. package/dist/schemas/entity-builder.d.ts +3 -3
  158. package/dist/schemas/entity-builder.d.ts.map +1 -1
  159. package/dist/schemas/entity-builder.js.map +1 -1
  160. package/dist/services/aws/s3.d.ts.map +1 -1
  161. package/dist/services/aws/s3.js +7 -10
  162. package/dist/services/aws/s3.js.map +2 -2
  163. package/dist/util/file.d.ts +13 -8
  164. package/dist/util/file.d.ts.map +1 -1
  165. package/dist/util/file.js +6 -28
  166. package/dist/util/file.js.map +2 -2
  167. package/dist/util/helper.js +2 -2
  168. package/dist/util/helper.js.map +2 -2
  169. package/dist/util/index.d.ts +2 -2
  170. package/dist/util/index.d.ts.map +1 -1
  171. package/dist/util/index.js +18 -18
  172. package/dist/util/index.js.map +2 -2
  173. package/dist/util/loader.js +3 -3
  174. package/dist/util/loader.js.map +2 -2
  175. package/dist/util/os.js +2 -2
  176. package/dist/util/os.js.map +2 -2
  177. package/dist/webserver/controller/auth-middleware.d.ts +1 -1
  178. package/dist/webserver/controller/auth-middleware.d.ts.map +1 -1
  179. package/dist/webserver/controller/auth-middleware.js +1 -1
  180. package/dist/webserver/controller/auth-middleware.js.map +2 -2
  181. package/dist/webserver/controller/base.d.ts +6 -6
  182. package/dist/webserver/controller/base.d.ts.map +1 -1
  183. package/dist/webserver/controller/base.interface.d.ts +1 -1
  184. package/dist/webserver/controller/base.interface.d.ts.map +1 -1
  185. package/dist/webserver/controller/base.js +4 -4
  186. package/dist/webserver/controller/base.js.map +2 -2
  187. package/dist/webserver/controller/entity.d.ts +4 -3
  188. package/dist/webserver/controller/entity.d.ts.map +1 -1
  189. package/dist/webserver/controller/entity.js +26 -17
  190. package/dist/webserver/controller/entity.js.map +2 -2
  191. package/dist/webserver/controller/example-auth.d.ts.map +1 -1
  192. package/dist/webserver/controller/example-auth.js +1 -1
  193. package/dist/webserver/controller/example-auth.js.map +2 -2
  194. package/dist/webserver/controller/health.d.ts.map +1 -1
  195. package/dist/webserver/controller/health.js +1 -1
  196. package/dist/webserver/controller/health.js.map +2 -2
  197. package/dist/webserver/define-action.d.ts +1 -1
  198. package/dist/webserver/define-action.d.ts.map +1 -1
  199. package/dist/webserver/define-action.js.map +1 -1
  200. package/dist/webserver/define-route.d.ts +1 -1
  201. package/dist/webserver/define-route.d.ts.map +1 -1
  202. package/dist/webserver/define-route.js.map +2 -2
  203. package/dist/webserver/index.d.ts +9 -9
  204. package/dist/webserver/index.d.ts.map +1 -1
  205. package/dist/webserver/index.js +14 -14
  206. package/dist/webserver/index.js.map +2 -2
  207. package/dist/webserver/webserver.d.ts +3 -3
  208. package/dist/webserver/webserver.d.ts.map +1 -1
  209. package/dist/webserver/webserver.interface.d.ts +5 -5
  210. package/dist/webserver/webserver.interface.d.ts.map +1 -1
  211. package/dist/webserver/webserver.interface.js.map +1 -1
  212. package/dist/webserver/webserver.js +9 -9
  213. package/dist/webserver/webserver.js.map +2 -2
  214. package/dist/websocket/controller/server/base.d.ts +2 -2
  215. package/dist/websocket/controller/server/base.js.map +1 -1
  216. package/dist/websocket/controllers/server/system.d.ts.map +1 -1
  217. package/dist/websocket/controllers/server/system.js +1 -1
  218. package/dist/websocket/controllers/server/system.js.map +2 -2
  219. package/dist/websocket/index.d.ts +9 -11
  220. package/dist/websocket/index.d.ts.map +1 -1
  221. package/dist/websocket/index.js +22 -22
  222. package/dist/websocket/index.js.map +2 -2
  223. package/dist/websocket/subscriber-middleware.d.ts.map +1 -1
  224. package/dist/websocket/subscriber-middleware.js.map +2 -2
  225. package/dist/websocket/subscriber-utils.d.ts.map +1 -1
  226. package/dist/websocket/subscriber-utils.js.map +2 -2
  227. package/dist/websocket/utils.d.ts.map +1 -1
  228. package/dist/websocket/utils.js +4 -2
  229. package/dist/websocket/utils.js.map +2 -2
  230. package/dist/websocket/websocket-auth.d.ts.map +1 -1
  231. package/dist/websocket/websocket-auth.js +3 -3
  232. package/dist/websocket/websocket-auth.js.map +2 -2
  233. package/dist/websocket/websocket-base.d.ts +2 -2
  234. package/dist/websocket/websocket-base.d.ts.map +1 -1
  235. package/dist/websocket/websocket-base.js +1 -1
  236. package/dist/websocket/websocket-base.js.map +2 -2
  237. package/dist/websocket/websocket-client-manager.d.ts +2 -0
  238. package/dist/websocket/websocket-client-manager.d.ts.map +1 -1
  239. package/dist/websocket/websocket-client-manager.js +11 -4
  240. package/dist/websocket/websocket-client-manager.js.map +2 -2
  241. package/dist/websocket/websocket-client.d.ts +10 -5
  242. package/dist/websocket/websocket-client.d.ts.map +1 -1
  243. package/dist/websocket/websocket-client.js +27 -5
  244. package/dist/websocket/websocket-client.js.map +2 -2
  245. package/dist/websocket/websocket-room-manager.js +1 -1
  246. package/dist/websocket/websocket-room-manager.js.map +1 -1
  247. package/dist/websocket/websocket-server.d.ts +7 -7
  248. package/dist/websocket/websocket-server.d.ts.map +1 -1
  249. package/dist/websocket/websocket-server.js +25 -20
  250. package/dist/websocket/websocket-server.js.map +2 -2
  251. package/dist/websocket/websocket-service.d.ts +2 -2
  252. package/dist/websocket/websocket-service.d.ts.map +1 -1
  253. package/dist/websocket/websocket-service.js +1 -1
  254. package/dist/websocket/websocket-service.js.map +2 -2
  255. package/dist/websocket/websocket.interface.d.ts +3 -5
  256. package/dist/websocket/websocket.interface.d.ts.map +1 -1
  257. package/dist/websocket/websocket.interface.js.map +2 -2
  258. package/package.json +68 -64
@@ -1 +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"}
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;AAEpC,OAAO,6BAA6B,MAAM,iCAAiC,CAAC;AAE5E,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"}
@@ -1,7 +1,7 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
- import WebSocketServerBaseController from "../../controller/server/base.js";
4
3
  import { Logger } from "../../../logger/index.js";
4
+ import WebSocketServerBaseController from "../../controller/server/base.js";
5
5
  class SystemController extends WebSocketServerBaseController {
6
6
  static {
7
7
  __name(this, "SystemController");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/websocket/controllers/server/system.ts"],
4
- "sourcesContent": ["import type { WebSocket } from 'ws';\nimport WebSocketServerBaseController from '../../controller/server/base.js';\nimport { Logger } from '../../../logger/index.js';\n\nexport default class SystemController extends WebSocketServerBaseController {\n public joinRoom = (clientWebSocket: WebSocket, webSocketClientId: string, data: any): any => {\n const userId = data.userId ?? webSocketClientId;\n const userType = data.userType ?? 'user';\n const username = data.username ?? `user_${webSocketClientId.substring(0, 8)}`;\n const roomName = data.roomName;\n\n if (!roomName) {\n return {\n success: false,\n error: 'Room name is required',\n clientId: webSocketClientId,\n };\n }\n\n try {\n // Join room\n this.webSocketServer.joinRoom({\n ws: clientWebSocket,\n userId,\n userType,\n username,\n roomName,\n });\n\n return {\n success: true,\n message: `Successfully joined room: ${roomName}`,\n data: {\n userId,\n userType,\n username,\n roomName,\n joinedAt: new Date().toISOString(),\n },\n };\n } catch (error) {\n Logger.error({ error, message: 'Failed to join room via system controller' });\n\n return {\n success: false,\n error: 'Failed to join room',\n message: error instanceof Error ? error.message : 'Unknown error',\n clientId: webSocketClientId,\n };\n }\n };\n\n public leaveRoom = (clientWebSocket: WebSocket, webSocketClientId: string, data: any): any => {\n const roomName = data.roomName;\n\n if (!roomName) {\n return {\n success: false,\n error: 'Room name is required',\n clientId: webSocketClientId,\n };\n }\n\n try {\n // Leave room\n this.webSocketServer.leaveRoom({\n ws: clientWebSocket,\n roomName,\n });\n\n return {\n success: true,\n message: `Successfully left room: ${roomName}`,\n data: {\n roomName,\n leftAt: new Date().toISOString(),\n },\n clientId: webSocketClientId,\n };\n } catch (error) {\n Logger.error({ error, message: 'Failed to leave room via system controller' });\n\n return {\n success: false,\n error: 'Failed to leave room',\n message: error instanceof Error ? error.message : 'Unknown error',\n clientId: webSocketClientId,\n };\n }\n };\n}\n"],
5
- "mappings": ";;AACA,OAAO,mCAAmC;AAC1C,SAAS,cAAc;AAEvB,MAAO,yBAAuC,8BAA8B;AAAA,EAJ5E,OAI4E;AAAA;AAAA;AAAA,EACnE,WAAW,wBAAC,iBAA4B,mBAA2B,SAAmB;AAC3F,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,WAAW,KAAK,YAAY;AAClC,UAAM,WAAW,KAAK,YAAY,QAAQ,kBAAkB,UAAU,GAAG,CAAC,CAAC;AAC3E,UAAM,WAAW,KAAK;AAEtB,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,QAAI;AAEF,WAAK,gBAAgB,SAAS;AAAA,QAC5B,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,6BAA6B,QAAQ;AAAA,QAC9C,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,QACnC;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,OAAO,SAAS,4CAA4C,CAAC;AAE5E,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,GA7CkB;AAAA,EA+CX,YAAY,wBAAC,iBAA4B,mBAA2B,SAAmB;AAC5F,UAAM,WAAW,KAAK;AAEtB,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,QAAI;AAEF,WAAK,gBAAgB,UAAU;AAAA,QAC7B,IAAI;AAAA,QACJ;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,2BAA2B,QAAQ;AAAA,QAC5C,MAAM;AAAA,UACJ;AAAA,UACA,SAAQ,oBAAI,KAAK,GAAE,YAAY;AAAA,QACjC;AAAA,QACA,UAAU;AAAA,MACZ;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,OAAO,SAAS,6CAA6C,CAAC;AAE7E,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,GArCmB;AAsCrB;",
4
+ "sourcesContent": ["import type { WebSocket } from 'ws';\nimport { Logger } from '../../../logger/index.js';\nimport WebSocketServerBaseController from '../../controller/server/base.js';\n\nexport default class SystemController extends WebSocketServerBaseController {\n public joinRoom = (clientWebSocket: WebSocket, webSocketClientId: string, data: any): any => {\n const userId = data.userId ?? webSocketClientId;\n const userType = data.userType ?? 'user';\n const username = data.username ?? `user_${webSocketClientId.substring(0, 8)}`;\n const roomName = data.roomName;\n\n if (!roomName) {\n return {\n success: false,\n error: 'Room name is required',\n clientId: webSocketClientId,\n };\n }\n\n try {\n // Join room\n this.webSocketServer.joinRoom({\n ws: clientWebSocket,\n userId,\n userType,\n username,\n roomName,\n });\n\n return {\n success: true,\n message: `Successfully joined room: ${roomName}`,\n data: {\n userId,\n userType,\n username,\n roomName,\n joinedAt: new Date().toISOString(),\n },\n };\n } catch (error) {\n Logger.error({ error, message: 'Failed to join room via system controller' });\n\n return {\n success: false,\n error: 'Failed to join room',\n message: error instanceof Error ? error.message : 'Unknown error',\n clientId: webSocketClientId,\n };\n }\n };\n\n public leaveRoom = (clientWebSocket: WebSocket, webSocketClientId: string, data: any): any => {\n const roomName = data.roomName;\n\n if (!roomName) {\n return {\n success: false,\n error: 'Room name is required',\n clientId: webSocketClientId,\n };\n }\n\n try {\n // Leave room\n this.webSocketServer.leaveRoom({\n ws: clientWebSocket,\n roomName,\n });\n\n return {\n success: true,\n message: `Successfully left room: ${roomName}`,\n data: {\n roomName,\n leftAt: new Date().toISOString(),\n },\n clientId: webSocketClientId,\n };\n } catch (error) {\n Logger.error({ error, message: 'Failed to leave room via system controller' });\n\n return {\n success: false,\n error: 'Failed to leave room',\n message: error instanceof Error ? error.message : 'Unknown error',\n clientId: webSocketClientId,\n };\n }\n };\n}\n"],
5
+ "mappings": ";;AACA,SAAS,cAAc;AACvB,OAAO,mCAAmC;AAE1C,MAAO,yBAAuC,8BAA8B;AAAA,EAJ5E,OAI4E;AAAA;AAAA;AAAA,EACnE,WAAW,wBAAC,iBAA4B,mBAA2B,SAAmB;AAC3F,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,WAAW,KAAK,YAAY;AAClC,UAAM,WAAW,KAAK,YAAY,QAAQ,kBAAkB,UAAU,GAAG,CAAC,CAAC;AAC3E,UAAM,WAAW,KAAK;AAEtB,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,QAAI;AAEF,WAAK,gBAAgB,SAAS;AAAA,QAC5B,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,6BAA6B,QAAQ;AAAA,QAC9C,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,QACnC;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,OAAO,SAAS,4CAA4C,CAAC;AAE5E,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,GA7CkB;AAAA,EA+CX,YAAY,wBAAC,iBAA4B,mBAA2B,SAAmB;AAC5F,UAAM,WAAW,KAAK;AAEtB,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,QAAI;AAEF,WAAK,gBAAgB,UAAU;AAAA,QAC7B,IAAI;AAAA,QACJ;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,2BAA2B,QAAQ;AAAA,QAC5C,MAAM;AAAA,UACJ;AAAA,UACA,SAAQ,oBAAI,KAAK,GAAE,YAAY;AAAA,QACjC;AAAA,QACA,UAAU;AAAA,MACZ;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,OAAO,SAAS,6CAA6C,CAAC;AAE7E,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,GArCmB;AAsCrB;",
6
6
  "names": []
7
7
  }
@@ -1,15 +1,13 @@
1
- export type { WebSocketRoute } from './websocket.interface.js';
2
- export { WebSocketRedisSubscriberEvent } from './websocket.interface.js';
3
- export type { WebSocketSubscriberDefinition, WebSocketSubscriberHandler, WebSocketSubscriberHandlerContext, WebSocketSubscriberMatcher, WebSocketSubscriberHandlersConfig, } from './websocket.interface.js';
4
- export { default as WebSocketServerBaseController } from './controller/server/base.js';
5
1
  export { default as WebSocketClientBaseController } from './controller/client/base.js';
6
- export { WebSocketService } from './websocket-service.js';
7
- export type { WebSocketMessage, WebSocketServiceOptions } from './websocket-service.js';
8
- export { WebSocketAuthService } from './websocket-auth.js';
9
- export type { WebSocketAuthResult } from './websocket-auth.js';
2
+ export { default as WebSocketServerBaseController } from './controller/server/base.js';
10
3
  export { defineWebSocketSubscriber } from './define-subscriber.js';
11
- export { matchByProperty, matchByPropertyPredicate, getNestedProperty, withErrorHandler, withLogging, withRateLimit, withRetry, composeHandlers, withFilter, withValidation, withMetadata, withDebounce, withThrottle, } from './subscriber-utils.js';
12
- export { executeWithMiddleware } from './subscriber-middleware.js';
13
4
  export type { WebSocketSubscriberMiddleware } from './subscriber-middleware.js';
14
- export { loggingMiddleware, timingMiddleware, validationMiddleware, rateLimitMiddleware, errorRecoveryMiddleware, } from './subscriber-middleware.js';
5
+ export { errorRecoveryMiddleware, executeWithMiddleware, loggingMiddleware, rateLimitMiddleware, timingMiddleware, validationMiddleware, } from './subscriber-middleware.js';
6
+ export { composeHandlers, getNestedProperty, matchByProperty, matchByPropertyPredicate, withDebounce, withErrorHandler, withFilter, withLogging, withMetadata, withRateLimit, withRetry, withThrottle, withValidation, } from './subscriber-utils.js';
7
+ export type { WebSocketRoute, WebSocketSubscriberDefinition, WebSocketSubscriberHandler, WebSocketSubscriberHandlerContext, WebSocketSubscriberHandlersConfig, WebSocketSubscriberMatcher, } from './websocket.interface.js';
8
+ export { WebSocketRedisSubscriberEvent } from './websocket.interface.js';
9
+ export type { WebSocketAuthResult } from './websocket-auth.js';
10
+ export { WebSocketAuthService } from './websocket-auth.js';
11
+ export type { WebSocketMessage, WebSocketServiceOptions } from './websocket-service.js';
12
+ export { WebSocketService } from './websocket-service.js';
15
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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,YAAY,EACV,6BAA6B,EAC7B,0BAA0B,EAC1B,iCAAiC,EACjC,0BAA0B,EAC1B,iCAAiC,GAClC,MAAM,0BAA0B,CAAC;AAClC,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;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,SAAS,EACT,eAAe,EACf,UAAU,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,GACb,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/websocket/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,YAAY,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAEhF,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,SAAS,EACT,YAAY,EACZ,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,cAAc,EACd,6BAA6B,EAC7B,0BAA0B,EAC1B,iCAAiC,EACjC,iCAAiC,EACjC,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1,37 +1,37 @@
1
- import { WebSocketRedisSubscriberEvent } from "./websocket.interface.js";
2
- import { default as default2 } from "./controller/server/base.js";
3
- import { default as default3 } from "./controller/client/base.js";
4
- import { WebSocketService } from "./websocket-service.js";
5
- import { WebSocketAuthService } from "./websocket-auth.js";
1
+ import { default as default2 } from "./controller/client/base.js";
2
+ import { default as default3 } from "./controller/server/base.js";
6
3
  import { defineWebSocketSubscriber } from "./define-subscriber.js";
7
4
  import {
5
+ errorRecoveryMiddleware,
6
+ executeWithMiddleware,
7
+ loggingMiddleware,
8
+ rateLimitMiddleware,
9
+ timingMiddleware,
10
+ validationMiddleware
11
+ } from "./subscriber-middleware.js";
12
+ import {
13
+ composeHandlers,
14
+ getNestedProperty,
8
15
  matchByProperty,
9
16
  matchByPropertyPredicate,
10
- getNestedProperty,
17
+ withDebounce,
11
18
  withErrorHandler,
19
+ withFilter,
12
20
  withLogging,
21
+ withMetadata,
13
22
  withRateLimit,
14
23
  withRetry,
15
- composeHandlers,
16
- withFilter,
17
- withValidation,
18
- withMetadata,
19
- withDebounce,
20
- withThrottle
24
+ withThrottle,
25
+ withValidation
21
26
  } from "./subscriber-utils.js";
22
- import { executeWithMiddleware } from "./subscriber-middleware.js";
23
- import {
24
- loggingMiddleware,
25
- timingMiddleware,
26
- validationMiddleware,
27
- rateLimitMiddleware,
28
- errorRecoveryMiddleware
29
- } from "./subscriber-middleware.js";
27
+ import { WebSocketRedisSubscriberEvent } from "./websocket.interface.js";
28
+ import { WebSocketAuthService } from "./websocket-auth.js";
29
+ import { WebSocketService } from "./websocket-service.js";
30
30
  export {
31
31
  WebSocketAuthService,
32
- default3 as WebSocketClientBaseController,
32
+ default2 as WebSocketClientBaseController,
33
33
  WebSocketRedisSubscriberEvent,
34
- default2 as WebSocketServerBaseController,
34
+ default3 as WebSocketServerBaseController,
35
35
  WebSocketService,
36
36
  composeHandlers,
37
37
  defineWebSocketSubscriber,
@@ -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 type {\n WebSocketSubscriberDefinition,\n WebSocketSubscriberHandler,\n WebSocketSubscriberHandlerContext,\n WebSocketSubscriberMatcher,\n WebSocketSubscriberHandlersConfig,\n} 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';\nexport { defineWebSocketSubscriber } from './define-subscriber.js';\n\n// WebSocket subscriber utilities\nexport {\n matchByProperty,\n matchByPropertyPredicate,\n getNestedProperty,\n withErrorHandler,\n withLogging,\n withRateLimit,\n withRetry,\n composeHandlers,\n withFilter,\n withValidation,\n withMetadata,\n withDebounce,\n withThrottle,\n} from './subscriber-utils.js';\n\n// WebSocket subscriber middleware\nexport { executeWithMiddleware } from './subscriber-middleware.js';\nexport type { WebSocketSubscriberMiddleware } from './subscriber-middleware.js';\nexport {\n loggingMiddleware,\n timingMiddleware,\n validationMiddleware,\n rateLimitMiddleware,\n errorRecoveryMiddleware,\n} from './subscriber-middleware.js';\n"],
5
- "mappings": "AACA,SAAS,qCAAqC;AAQ9C,SAAoB,WAAXA,gBAAgD;AACzD,SAAoB,WAAXA,gBAAgD;AACzD,SAAS,wBAAwB;AAEjC,SAAS,4BAA4B;AAErC,SAAS,iCAAiC;AAG1C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,6BAA6B;AAEtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
4
+ "sourcesContent": ["export { default as WebSocketClientBaseController } from './controller/client/base.js';\nexport { default as WebSocketServerBaseController } from './controller/server/base.js';\nexport { defineWebSocketSubscriber } from './define-subscriber.js';\nexport type { WebSocketSubscriberMiddleware } from './subscriber-middleware.js';\n// WebSocket subscriber middleware\nexport {\n errorRecoveryMiddleware,\n executeWithMiddleware,\n loggingMiddleware,\n rateLimitMiddleware,\n timingMiddleware,\n validationMiddleware,\n} from './subscriber-middleware.js';\n// WebSocket subscriber utilities\nexport {\n composeHandlers,\n getNestedProperty,\n matchByProperty,\n matchByPropertyPredicate,\n withDebounce,\n withErrorHandler,\n withFilter,\n withLogging,\n withMetadata,\n withRateLimit,\n withRetry,\n withThrottle,\n withValidation,\n} from './subscriber-utils.js';\nexport type {\n WebSocketRoute,\n WebSocketSubscriberDefinition,\n WebSocketSubscriberHandler,\n WebSocketSubscriberHandlerContext,\n WebSocketSubscriberHandlersConfig,\n WebSocketSubscriberMatcher,\n} from './websocket.interface.js';\nexport { WebSocketRedisSubscriberEvent } from './websocket.interface.js';\nexport type { WebSocketAuthResult } from './websocket-auth.js';\nexport { WebSocketAuthService } from './websocket-auth.js';\nexport type { WebSocketMessage, WebSocketServiceOptions } from './websocket-service.js';\nexport { WebSocketService } from './websocket-service.js';\n"],
5
+ "mappings": "AAAA,SAAoB,WAAXA,gBAAgD;AACzD,SAAoB,WAAXA,gBAAgD;AACzD,SAAS,iCAAiC;AAG1C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AASP,SAAS,qCAAqC;AAE9C,SAAS,4BAA4B;AAErC,SAAS,wBAAwB;",
6
6
  "names": ["default"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subscriber-middleware.d.ts","sourceRoot":"","sources":["../../src/websocket/subscriber-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAG9G;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,iCAAiC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtF;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,iCAAiC,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhG;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,iCAAiC,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpG;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,0BAA0B,EACnC,UAAU,EAAE,6BAA6B,EAAE,EAC3C,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,IAAI,CAAC,CA8Ef;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,aAAa,MAAM,KAAG,6BA8BtD,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAO,6BA4BnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,WAAW,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KACpD,6BAiBD,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,eAAe,MAAM,EAAE,UAAU,MAAM,KAAG,6BA8B7E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAAI,mBAAc,EAAE,iBAAe,KAAG,6BAaxE,CAAC"}
1
+ {"version":3,"file":"subscriber-middleware.d.ts","sourceRoot":"","sources":["../../src/websocket/subscriber-middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAE9G;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,iCAAiC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtF;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,iCAAiC,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhG;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,iCAAiC,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpG;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,0BAA0B,EACnC,UAAU,EAAE,6BAA6B,EAAE,EAC3C,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,IAAI,CAAC,CA8Ef;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,aAAa,MAAM,KAAG,6BA8BtD,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAO,6BA4BnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,WAAW,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KACpD,6BAiBD,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,eAAe,MAAM,EAAE,UAAU,MAAM,KAAG,6BA8B7E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAAI,mBAAc,EAAE,iBAAe,KAAG,6BAaxE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/websocket/subscriber-middleware.ts"],
4
- "sourcesContent": ["import type { WebSocketSubscriberHandler, WebSocketSubscriberHandlerContext } from './websocket.interface.js';\nimport { Logger } from '../logger/index.js';\n\n/**\n * Middleware that can intercept and modify subscriber handler execution\n */\nexport interface WebSocketSubscriberMiddleware {\n /**\n * Unique identifier for the middleware\n */\n name: string;\n\n /**\n * Runs before the handler\n * Return false to skip handler execution\n */\n onBefore?: (context: WebSocketSubscriberHandlerContext) => boolean | Promise<boolean>;\n\n /**\n * Runs after successful handler execution\n */\n onAfter?: (context: WebSocketSubscriberHandlerContext, result: unknown) => void | Promise<void>;\n\n /**\n * Runs on handler error\n * Return true to suppress the error, false to rethrow\n */\n onError?: (context: WebSocketSubscriberHandlerContext, error: Error) => boolean | Promise<boolean>;\n}\n\n/**\n * Execute middleware pipeline and handler\n * @param handler - The handler to execute\n * @param middleware - Array of middleware to apply\n * @param context - Handler context\n */\nexport async function executeWithMiddleware(\n handler: WebSocketSubscriberHandler,\n middleware: WebSocketSubscriberMiddleware[],\n context: WebSocketSubscriberHandlerContext,\n): Promise<void> {\n // Execute \"before\" middleware\n for (const mw of middleware) {\n try {\n const shouldContinue = mw.onBefore ? await mw.onBefore(context) : true;\n if (!shouldContinue) {\n Logger.info({\n message: 'Middleware skipped handler execution',\n meta: {\n middleware: mw.name,\n channel: context.channel,\n },\n });\n return;\n }\n } catch (error) {\n Logger.error({\n message: 'Middleware onBefore failed',\n meta: {\n middleware: mw.name,\n channel: context.channel,\n error: error instanceof Error ? error.message : String(error),\n },\n });\n throw error;\n }\n }\n\n // Execute handler\n let result: unknown;\n try {\n result = await handler(context);\n } catch (error) {\n // Execute \"error\" middleware\n for (const mw of middleware) {\n if (!mw.onError) {\n continue;\n }\n\n try {\n const shouldSuppress = await mw.onError(context, error instanceof Error ? error : new Error(String(error)));\n if (shouldSuppress) {\n return;\n }\n } catch (mwError) {\n Logger.error({\n message: 'Middleware onError failed',\n meta: {\n middleware: mw.name,\n channel: context.channel,\n error: mwError instanceof Error ? mwError.message : String(mwError),\n },\n });\n }\n }\n\n throw error;\n }\n\n // Execute \"after\" middleware\n for (const mw of middleware) {\n if (!mw.onAfter) {\n continue;\n }\n\n try {\n await mw.onAfter(context, result);\n } catch (error) {\n Logger.error({\n message: 'Middleware onAfter failed',\n meta: {\n middleware: mw.name,\n channel: context.channel,\n error: error instanceof Error ? error.message : String(error),\n },\n });\n }\n }\n}\n\n/**\n * Built-in middleware for logging handler execution\n */\nexport const loggingMiddleware = (handlerName: string): WebSocketSubscriberMiddleware => ({\n name: 'logging',\n onBefore: context => {\n Logger.info({\n message: `${handlerName}: Starting execution`,\n meta: {\n channel: context.channel,\n },\n });\n return true;\n },\n onAfter: (context, result) => {\n Logger.info({\n message: `${handlerName}: Completed successfully`,\n meta: {\n channel: context.channel,\n resultType: typeof result,\n },\n });\n },\n onError: (context, error) => {\n Logger.error({\n message: `${handlerName}: Failed`,\n meta: {\n channel: context.channel,\n error: error.message,\n },\n });\n return false; // Don't suppress the error\n },\n});\n\n/**\n * Built-in middleware for timing handler execution\n */\nexport const timingMiddleware = (): WebSocketSubscriberMiddleware => {\n const startTimes = new Map<string, number>();\n\n return {\n name: 'timing',\n onBefore: context => {\n startTimes.set(context.channel, Date.now());\n return true;\n },\n onAfter: context => {\n const startTime = startTimes.get(context.channel);\n if (startTime) {\n const duration = Date.now() - startTime;\n startTimes.delete(context.channel);\n Logger.info({\n message: 'Handler execution timing',\n meta: {\n channel: context.channel,\n durationMs: duration,\n },\n });\n }\n },\n onError: context => {\n startTimes.delete(context.channel);\n return false;\n },\n };\n};\n\n/**\n * Built-in middleware for validating message structure\n */\nexport const validationMiddleware = (\n validator: (message: unknown) => void | Promise<void>,\n): WebSocketSubscriberMiddleware => ({\n name: 'validation',\n onBefore: async context => {\n try {\n await validator(context.message);\n return true;\n } catch (error) {\n Logger.warn({\n message: 'Message validation failed',\n meta: {\n channel: context.channel,\n error: error instanceof Error ? error.message : String(error),\n },\n });\n throw error;\n }\n },\n});\n\n/**\n * Built-in middleware for rate limiting\n */\nexport const rateLimitMiddleware = (maxExecutions: number, windowMs: number): WebSocketSubscriberMiddleware => {\n const executionTimes = new Map<string, number[]>();\n\n return {\n name: 'rate-limit',\n onBefore: context => {\n const channel = context.channel;\n const now = Date.now();\n const times = executionTimes.get(channel) ?? [];\n\n // Remove old entries\n const recentTimes = times.filter(t => now - t < windowMs);\n\n if (recentTimes.length >= maxExecutions) {\n Logger.warn({\n message: 'Rate limit exceeded',\n meta: {\n channel,\n maxExecutions,\n windowMs,\n },\n });\n return false;\n }\n\n recentTimes.push(now);\n executionTimes.set(channel, recentTimes);\n return true;\n },\n };\n};\n\n/**\n * Built-in middleware for error handling and recovery\n */\nexport const errorRecoveryMiddleware = (maxRetries = 3, _delayMs = 1000): WebSocketSubscriberMiddleware => ({\n name: 'error-recovery',\n onError: async (context, error) => {\n Logger.warn({\n message: 'Handler error, could implement retry logic',\n meta: {\n channel: context.channel,\n error: error.message,\n suggestedRetries: maxRetries,\n },\n });\n return false; // Don't suppress - let error bubble up\n },\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Logger } from '../logger/index.js';\nimport type { WebSocketSubscriberHandler, WebSocketSubscriberHandlerContext } from './websocket.interface.js';\n\n/**\n * Middleware that can intercept and modify subscriber handler execution\n */\nexport interface WebSocketSubscriberMiddleware {\n /**\n * Unique identifier for the middleware\n */\n name: string;\n\n /**\n * Runs before the handler\n * Return false to skip handler execution\n */\n onBefore?: (context: WebSocketSubscriberHandlerContext) => boolean | Promise<boolean>;\n\n /**\n * Runs after successful handler execution\n */\n onAfter?: (context: WebSocketSubscriberHandlerContext, result: unknown) => void | Promise<void>;\n\n /**\n * Runs on handler error\n * Return true to suppress the error, false to rethrow\n */\n onError?: (context: WebSocketSubscriberHandlerContext, error: Error) => boolean | Promise<boolean>;\n}\n\n/**\n * Execute middleware pipeline and handler\n * @param handler - The handler to execute\n * @param middleware - Array of middleware to apply\n * @param context - Handler context\n */\nexport async function executeWithMiddleware(\n handler: WebSocketSubscriberHandler,\n middleware: WebSocketSubscriberMiddleware[],\n context: WebSocketSubscriberHandlerContext,\n): Promise<void> {\n // Execute \"before\" middleware\n for (const mw of middleware) {\n try {\n const shouldContinue = mw.onBefore ? await mw.onBefore(context) : true;\n if (!shouldContinue) {\n Logger.info({\n message: 'Middleware skipped handler execution',\n meta: {\n middleware: mw.name,\n channel: context.channel,\n },\n });\n return;\n }\n } catch (error) {\n Logger.error({\n message: 'Middleware onBefore failed',\n meta: {\n middleware: mw.name,\n channel: context.channel,\n error: error instanceof Error ? error.message : String(error),\n },\n });\n throw error;\n }\n }\n\n // Execute handler\n let result: unknown;\n try {\n result = await handler(context);\n } catch (error) {\n // Execute \"error\" middleware\n for (const mw of middleware) {\n if (!mw.onError) {\n continue;\n }\n\n try {\n const shouldSuppress = await mw.onError(context, error instanceof Error ? error : new Error(String(error)));\n if (shouldSuppress) {\n return;\n }\n } catch (mwError) {\n Logger.error({\n message: 'Middleware onError failed',\n meta: {\n middleware: mw.name,\n channel: context.channel,\n error: mwError instanceof Error ? mwError.message : String(mwError),\n },\n });\n }\n }\n\n throw error;\n }\n\n // Execute \"after\" middleware\n for (const mw of middleware) {\n if (!mw.onAfter) {\n continue;\n }\n\n try {\n await mw.onAfter(context, result);\n } catch (error) {\n Logger.error({\n message: 'Middleware onAfter failed',\n meta: {\n middleware: mw.name,\n channel: context.channel,\n error: error instanceof Error ? error.message : String(error),\n },\n });\n }\n }\n}\n\n/**\n * Built-in middleware for logging handler execution\n */\nexport const loggingMiddleware = (handlerName: string): WebSocketSubscriberMiddleware => ({\n name: 'logging',\n onBefore: context => {\n Logger.info({\n message: `${handlerName}: Starting execution`,\n meta: {\n channel: context.channel,\n },\n });\n return true;\n },\n onAfter: (context, result) => {\n Logger.info({\n message: `${handlerName}: Completed successfully`,\n meta: {\n channel: context.channel,\n resultType: typeof result,\n },\n });\n },\n onError: (context, error) => {\n Logger.error({\n message: `${handlerName}: Failed`,\n meta: {\n channel: context.channel,\n error: error.message,\n },\n });\n return false; // Don't suppress the error\n },\n});\n\n/**\n * Built-in middleware for timing handler execution\n */\nexport const timingMiddleware = (): WebSocketSubscriberMiddleware => {\n const startTimes = new Map<string, number>();\n\n return {\n name: 'timing',\n onBefore: context => {\n startTimes.set(context.channel, Date.now());\n return true;\n },\n onAfter: context => {\n const startTime = startTimes.get(context.channel);\n if (startTime) {\n const duration = Date.now() - startTime;\n startTimes.delete(context.channel);\n Logger.info({\n message: 'Handler execution timing',\n meta: {\n channel: context.channel,\n durationMs: duration,\n },\n });\n }\n },\n onError: context => {\n startTimes.delete(context.channel);\n return false;\n },\n };\n};\n\n/**\n * Built-in middleware for validating message structure\n */\nexport const validationMiddleware = (\n validator: (message: unknown) => void | Promise<void>,\n): WebSocketSubscriberMiddleware => ({\n name: 'validation',\n onBefore: async context => {\n try {\n await validator(context.message);\n return true;\n } catch (error) {\n Logger.warn({\n message: 'Message validation failed',\n meta: {\n channel: context.channel,\n error: error instanceof Error ? error.message : String(error),\n },\n });\n throw error;\n }\n },\n});\n\n/**\n * Built-in middleware for rate limiting\n */\nexport const rateLimitMiddleware = (maxExecutions: number, windowMs: number): WebSocketSubscriberMiddleware => {\n const executionTimes = new Map<string, number[]>();\n\n return {\n name: 'rate-limit',\n onBefore: context => {\n const channel = context.channel;\n const now = Date.now();\n const times = executionTimes.get(channel) ?? [];\n\n // Remove old entries\n const recentTimes = times.filter(t => now - t < windowMs);\n\n if (recentTimes.length >= maxExecutions) {\n Logger.warn({\n message: 'Rate limit exceeded',\n meta: {\n channel,\n maxExecutions,\n windowMs,\n },\n });\n return false;\n }\n\n recentTimes.push(now);\n executionTimes.set(channel, recentTimes);\n return true;\n },\n };\n};\n\n/**\n * Built-in middleware for error handling and recovery\n */\nexport const errorRecoveryMiddleware = (maxRetries = 3, _delayMs = 1000): WebSocketSubscriberMiddleware => ({\n name: 'error-recovery',\n onError: async (context, error) => {\n Logger.warn({\n message: 'Handler error, could implement retry logic',\n meta: {\n channel: context.channel,\n error: error.message,\n suggestedRetries: maxRetries,\n },\n });\n return false; // Don't suppress - let error bubble up\n },\n});\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subscriber-utils.d.ts","sourceRoot":"","sources":["../../src/websocket/subscriber-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,iCAAiC,EACjC,0BAA0B,EAC3B,MAAM,0BAA0B,CAAC;AAGlC;;GAEG;AAEH;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,0BAA0B,CASvF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,GAAG,OAAO,EACnD,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,GACrC,0BAA0B,CAS5B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAajE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,GAAG,GAAG,EAC7C,OAAO,EAAE,0BAA0B,CAAC,QAAQ,CAAC,EAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iCAAiC,CAAC,QAAQ,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACtG,WAAW,UAAQ,GAClB,0BAA0B,CAAC,QAAQ,CAAC,CAuBtC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,GAAG,GAAG,EACxC,OAAO,EAAE,0BAA0B,CAAC,QAAQ,CAAC,EAC7C,WAAW,SAAuB,GACjC,0BAA0B,CAAC,QAAQ,CAAC,CAoCtC;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,GAAG,GAAG,EAC1C,OAAO,EAAE,0BAA0B,CAAC,QAAQ,CAAC,EAC7C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,iCAAiC,CAAC,QAAQ,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC7F,0BAA0B,CAAC,QAAQ,CAAC,CAqBtC;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,QAAQ,GAAG,GAAG,EACtC,OAAO,EAAE,0BAA0B,CAAC,QAAQ,CAAC,EAC7C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,iBAAiB,SAAI,GACpB,0BAA0B,CAAC,QAAQ,CAAC,CAoBtC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,GAAG,GAAG,EAC5C,QAAQ,EAAE,0BAA0B,CAAC,QAAQ,CAAC,EAAE,GAC/C,0BAA0B,CAAC,QAAQ,CAAC,CAMtC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,GAAG,GAAG,EACvC,SAAS,EAAE,CAAC,OAAO,EAAE,iCAAiC,CAAC,QAAQ,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAC/F,OAAO,EAAE,0BAA0B,CAAC,QAAQ,CAAC,GAC5C,0BAA0B,CAAC,QAAQ,CAAC,CAOtC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,GAAG,GAAG,EAC3C,SAAS,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACtD,OAAO,EAAE,0BAA0B,CAAC,QAAQ,CAAC,GAC5C,0BAA0B,CAAC,QAAQ,CAAC,CAgBtC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,GAAG,GAAG,EACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,0BAA0B,CAAC,QAAQ,CAAC,GAC5C,0BAA0B,CAAC,QAAQ,CAAC,CAStC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,GAAG,GAAG,EACzC,OAAO,EAAE,0BAA0B,CAAC,QAAQ,CAAC,EAC7C,OAAO,EAAE,MAAM,GACd,0BAA0B,CAAC,QAAQ,CAAC,CA0BtC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,GAAG,GAAG,EACzC,OAAO,EAAE,0BAA0B,CAAC,QAAQ,CAAC,EAC7C,UAAU,EAAE,MAAM,GACjB,0BAA0B,CAAC,QAAQ,CAAC,CAatC"}
1
+ {"version":3,"file":"subscriber-utils.d.ts","sourceRoot":"","sources":["../../src/websocket/subscriber-utils.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/websocket/subscriber-utils.ts"],
4
- "sourcesContent": ["import type {\n WebSocketSubscriberHandler,\n WebSocketSubscriberHandlerContext,\n WebSocketSubscriberMatcher,\n} from './websocket.interface.js';\nimport { Logger } from '../logger/index.js';\n\n/**\n * Utility functions for building and composing WebSocket subscriber handlers\n */\n\n/**\n * Create a predicate matcher for message properties\n * @param key - The property key to check\n * @param value - The expected value\n */\nexport function matchByProperty(key: string, value: unknown): WebSocketSubscriberMatcher {\n return (context: WebSocketSubscriberHandlerContext) => {\n try {\n const messageValue = getNestedProperty(context.message, key);\n return messageValue === value;\n } catch {\n return false;\n }\n };\n}\n\n/**\n * Create a predicate matcher for message property patterns\n * @param key - The property key to check\n * @param predicate - Function to test the value\n */\nexport function matchByPropertyPredicate<_T = unknown>(\n key: string,\n predicate: (value: unknown) => boolean,\n): WebSocketSubscriberMatcher {\n return (context: WebSocketSubscriberHandlerContext) => {\n try {\n const messageValue = getNestedProperty(context.message, key);\n return predicate(messageValue);\n } catch {\n return false;\n }\n };\n}\n\n/**\n * Safely get nested property from an object\n * @param obj - The object to search\n * @param path - Dot-notation path (e.g., 'user.id' or 'data.items.0.name')\n */\nexport function getNestedProperty(obj: any, path: string): unknown {\n const keys = path.split('.');\n let current = obj;\n\n for (const key of keys) {\n if (current == null) {\n return undefined;\n }\n // eslint-disable-next-line security/detect-object-injection\n current = current[key];\n }\n\n return current;\n}\n\n/**\n * Wrap a handler with error handling\n * @param handler - The handler to wrap\n * @param onError - Error handler callback\n * @param throwError - Whether to rethrow the error after handling\n */\nexport function withErrorHandler<TMessage = any>(\n handler: WebSocketSubscriberHandler<TMessage>,\n onError?: (error: Error, context: WebSocketSubscriberHandlerContext<TMessage>) => void | Promise<void>,\n _throwError = false,\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n try {\n return await handler(context);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (onError) {\n try {\n await onError(err, context);\n } catch (callbackError) {\n Logger.error({\n message: 'Error handler callback failed',\n meta: { originalError: err.message, callbackError },\n });\n }\n }\n\n if (_throwError) {\n throw err;\n }\n }\n };\n}\n\n/**\n * Wrap a handler with logging\n * @param handler - The handler to wrap\n * @param handlerName - Name for logging purposes\n */\nexport function withLogging<TMessage = any>(\n handler: WebSocketSubscriberHandler<TMessage>,\n handlerName = 'subscriber-handler',\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n const startTime = Date.now();\n const messageKeys =\n context.message && typeof context.message === 'object'\n ? Object.keys(context.message as Record<string, unknown>).slice(0, 5)\n : [];\n Logger.info({\n message: `${handlerName}: Starting handler execution`,\n meta: {\n channel: context.channel,\n messageKeys,\n },\n });\n\n try {\n const result = await handler(context);\n const duration = Date.now() - startTime;\n Logger.info({\n message: `${handlerName}: Handler completed successfully`,\n meta: { channel: context.channel, durationMs: duration },\n });\n return result;\n } catch (error) {\n const duration = Date.now() - startTime;\n Logger.error({\n message: `${handlerName}: Handler failed`,\n meta: {\n channel: context.channel,\n error: error instanceof Error ? error.message : String(error),\n durationMs: duration,\n },\n });\n throw error;\n }\n };\n}\n\n/**\n * Wrap a handler with rate limiting\n * @param handler - The handler to wrap\n * @param maxExecutions - Max executions allowed\n * @param windowMs - Time window in milliseconds\n * @param onRateLimited - Optional callback when rate limited\n */\nexport function withRateLimit<TMessage = any>(\n handler: WebSocketSubscriberHandler<TMessage>,\n maxExecutions: number,\n windowMs: number,\n onRateLimited?: (context: WebSocketSubscriberHandlerContext<TMessage>) => void | Promise<void>,\n): WebSocketSubscriberHandler<TMessage> {\n const executionTimes: number[] = [];\n\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n const now = Date.now();\n\n // Remove old entries outside the window\n while (executionTimes.length > 0 && executionTimes[0] < now - windowMs) {\n executionTimes.shift();\n }\n\n if (executionTimes.length >= maxExecutions) {\n if (onRateLimited) {\n await onRateLimited(context);\n }\n return;\n }\n\n executionTimes.push(now);\n return await handler(context);\n };\n}\n\n/**\n * Wrap a handler with retry logic\n * @param handler - The handler to wrap\n * @param maxRetries - Maximum number of retries\n * @param delayMs - Delay between retries in milliseconds\n * @param backoffMultiplier - Multiplier for exponential backoff (default: 1, no backoff)\n */\nexport function withRetry<TMessage = any>(\n handler: WebSocketSubscriberHandler<TMessage>,\n maxRetries: number,\n delayMs: number,\n backoffMultiplier = 1,\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n let lastError: Error | null = null;\n let currentDelay = delayMs;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await handler(context);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt < maxRetries) {\n await new Promise(resolve => setTimeout(resolve, currentDelay));\n currentDelay = Math.floor(currentDelay * backoffMultiplier);\n }\n }\n }\n\n throw lastError;\n };\n}\n\n/**\n * Compose multiple handlers into a single handler\n * Executes handlers sequentially, passing context through each one\n * @param handlers - Array of handlers to compose\n */\nexport function composeHandlers<TMessage = any>(\n handlers: WebSocketSubscriberHandler<TMessage>[],\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n for (const handler of handlers) {\n await handler(context);\n }\n };\n}\n\n/**\n * Create a filter handler that conditionally executes based on a predicate\n * @param predicate - Function that returns true if handler should execute\n * @param handler - The handler to execute conditionally\n */\nexport function withFilter<TMessage = any>(\n predicate: (context: WebSocketSubscriberHandlerContext<TMessage>) => boolean | Promise<boolean>,\n handler: WebSocketSubscriberHandler<TMessage>,\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n const shouldExecute = await predicate(context);\n if (shouldExecute) {\n return await handler(context);\n }\n };\n}\n\n/**\n * Validate message structure before execution\n * @param validator - Function that validates the message and throws if invalid\n * @param handler - The handler to wrap\n */\nexport function withValidation<TMessage = any>(\n validator: (message: TMessage) => void | Promise<void>,\n handler: WebSocketSubscriberHandler<TMessage>,\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n try {\n await validator(context.message);\n return await handler(context);\n } catch (error) {\n Logger.warn({\n message: 'Message validation failed',\n meta: {\n channel: context.channel,\n error: error instanceof Error ? error.message : String(error),\n },\n });\n throw error;\n }\n };\n}\n\n/**\n * Add metadata/context to a handler execution\n * @param metadata - Metadata to add to context\n * @param handler - The handler to wrap\n */\nexport function withMetadata<TMessage = any>(\n metadata: Record<string, unknown>,\n handler: WebSocketSubscriberHandler<TMessage>,\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n const enrichedContext = {\n ...context,\n metadata,\n } as any;\n\n return await handler(enrichedContext);\n };\n}\n\n/**\n * Debounce handler execution by channel\n * @param handler - The handler to wrap\n * @param delayMs - Debounce delay in milliseconds\n */\nexport function withDebounce<TMessage = any>(\n handler: WebSocketSubscriberHandler<TMessage>,\n delayMs: number,\n): WebSocketSubscriberHandler<TMessage> {\n const timers = new Map<string, NodeJS.Timeout>();\n\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n const channel = context.channel;\n\n // Cancel previous timer for this channel\n const existingTimer = timers.get(channel);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Set new timer\n return new Promise<void>(resolve => {\n const timer = setTimeout(async () => {\n try {\n await handler(context);\n } finally {\n timers.delete(channel);\n resolve();\n }\n }, delayMs);\n\n timers.set(channel, timer);\n });\n };\n}\n\n/**\n * Throttle handler execution by channel\n * @param handler - The handler to wrap\n * @param intervalMs - Throttle interval in milliseconds\n */\nexport function withThrottle<TMessage = any>(\n handler: WebSocketSubscriberHandler<TMessage>,\n intervalMs: number,\n): WebSocketSubscriberHandler<TMessage> {\n const lastExecutionTime = new Map<string, number>();\n\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n const channel = context.channel;\n const now = Date.now();\n const lastTime = lastExecutionTime.get(channel) ?? 0;\n\n if (now - lastTime >= intervalMs) {\n lastExecutionTime.set(channel, now);\n return await handler(context);\n }\n };\n}\n"],
5
- "mappings": ";;AAKA,SAAS,cAAc;AAWhB,SAAS,gBAAgB,KAAa,OAA4C;AACvF,SAAO,CAAC,YAA+C;AACrD,QAAI;AACF,YAAM,eAAe,kBAAkB,QAAQ,SAAS,GAAG;AAC3D,aAAO,iBAAiB;AAAA,IAC1B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AATgB;AAgBT,SAAS,yBACd,KACA,WAC4B;AAC5B,SAAO,CAAC,YAA+C;AACrD,QAAI;AACF,YAAM,eAAe,kBAAkB,QAAQ,SAAS,GAAG;AAC3D,aAAO,UAAU,YAAY;AAAA,IAC/B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAZgB;AAmBT,SAAS,kBAAkB,KAAU,MAAuB;AACjE,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,MAAI,UAAU;AAEd,aAAW,OAAO,MAAM;AACtB,QAAI,WAAW,MAAM;AACnB,aAAO;AAAA,IACT;AAEA,cAAU,QAAQ,GAAG;AAAA,EACvB;AAEA,SAAO;AACT;AAbgB;AAqBT,SAAS,iBACd,SACA,SACA,cAAc,OACwB;AACtC,SAAO,OAAO,YAAyD;AACrE,QAAI;AACF,aAAO,MAAM,QAAQ,OAAO;AAAA,IAC9B,SAAS,OAAO;AACd,YAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAEpE,UAAI,SAAS;AACX,YAAI;AACF,gBAAM,QAAQ,KAAK,OAAO;AAAA,QAC5B,SAAS,eAAe;AACtB,iBAAO,MAAM;AAAA,YACX,SAAS;AAAA,YACT,MAAM,EAAE,eAAe,IAAI,SAAS,cAAc;AAAA,UACpD,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,aAAa;AACf,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AA3BgB;AAkCT,SAAS,YACd,SACA,cAAc,sBACwB;AACtC,SAAO,OAAO,YAAyD;AACrE,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,cACJ,QAAQ,WAAW,OAAO,QAAQ,YAAY,WAC1C,OAAO,KAAK,QAAQ,OAAkC,EAAE,MAAM,GAAG,CAAC,IAClE,CAAC;AACP,WAAO,KAAK;AAAA,MACV,SAAS,GAAG,WAAW;AAAA,MACvB,MAAM;AAAA,QACJ,SAAS,QAAQ;AAAA,QACjB;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,YAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAO,KAAK;AAAA,QACV,SAAS,GAAG,WAAW;AAAA,QACvB,MAAM,EAAE,SAAS,QAAQ,SAAS,YAAY,SAAS;AAAA,MACzD,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAO,MAAM;AAAA,QACX,SAAS,GAAG,WAAW;AAAA,QACvB,MAAM;AAAA,UACJ,SAAS,QAAQ;AAAA,UACjB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC5D,YAAY;AAAA,QACd;AAAA,MACF,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAvCgB;AAgDT,SAAS,cACd,SACA,eACA,UACA,eACsC;AACtC,QAAM,iBAA2B,CAAC;AAElC,SAAO,OAAO,YAAyD;AACrE,UAAM,MAAM,KAAK,IAAI;AAGrB,WAAO,eAAe,SAAS,KAAK,eAAe,CAAC,IAAI,MAAM,UAAU;AACtE,qBAAe,MAAM;AAAA,IACvB;AAEA,QAAI,eAAe,UAAU,eAAe;AAC1C,UAAI,eAAe;AACjB,cAAM,cAAc,OAAO;AAAA,MAC7B;AACA;AAAA,IACF;AAEA,mBAAe,KAAK,GAAG;AACvB,WAAO,MAAM,QAAQ,OAAO;AAAA,EAC9B;AACF;AA1BgB;AAmCT,SAAS,UACd,SACA,YACA,SACA,oBAAoB,GACkB;AACtC,SAAO,OAAO,YAAyD;AACrE,QAAI,YAA0B;AAC9B,QAAI,eAAe;AAEnB,aAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,UAAI;AACF,eAAO,MAAM,QAAQ,OAAO;AAAA,MAC9B,SAAS,OAAO;AACd,oBAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAEpE,YAAI,UAAU,YAAY;AACxB,gBAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,YAAY,CAAC;AAC9D,yBAAe,KAAK,MAAM,eAAe,iBAAiB;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAEA,UAAM;AAAA,EACR;AACF;AAzBgB;AAgCT,SAAS,gBACd,UACsC;AACtC,SAAO,OAAO,YAAyD;AACrE,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,OAAO;AAAA,IACvB;AAAA,EACF;AACF;AARgB;AAeT,SAAS,WACd,WACA,SACsC;AACtC,SAAO,OAAO,YAAyD;AACrE,UAAM,gBAAgB,MAAM,UAAU,OAAO;AAC7C,QAAI,eAAe;AACjB,aAAO,MAAM,QAAQ,OAAO;AAAA,IAC9B;AAAA,EACF;AACF;AAVgB;AAiBT,SAAS,eACd,WACA,SACsC;AACtC,SAAO,OAAO,YAAyD;AACrE,QAAI;AACF,YAAM,UAAU,QAAQ,OAAO;AAC/B,aAAO,MAAM,QAAQ,OAAO;AAAA,IAC9B,SAAS,OAAO;AACd,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,SAAS,QAAQ;AAAA,UACjB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D;AAAA,MACF,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAnBgB;AA0BT,SAAS,aACd,UACA,SACsC;AACtC,SAAO,OAAO,YAAyD;AACrE,UAAM,kBAAkB;AAAA,MACtB,GAAG;AAAA,MACH;AAAA,IACF;AAEA,WAAO,MAAM,QAAQ,eAAe;AAAA,EACtC;AACF;AAZgB;AAmBT,SAAS,aACd,SACA,SACsC;AACtC,QAAM,SAAS,oBAAI,IAA4B;AAE/C,SAAO,OAAO,YAAyD;AACrE,UAAM,UAAU,QAAQ;AAGxB,UAAM,gBAAgB,OAAO,IAAI,OAAO;AACxC,QAAI,eAAe;AACjB,mBAAa,aAAa;AAAA,IAC5B;AAGA,WAAO,IAAI,QAAc,aAAW;AAClC,YAAM,QAAQ,WAAW,YAAY;AACnC,YAAI;AACF,gBAAM,QAAQ,OAAO;AAAA,QACvB,UAAE;AACA,iBAAO,OAAO,OAAO;AACrB,kBAAQ;AAAA,QACV;AAAA,MACF,GAAG,OAAO;AAEV,aAAO,IAAI,SAAS,KAAK;AAAA,IAC3B,CAAC;AAAA,EACH;AACF;AA7BgB;AAoCT,SAAS,aACd,SACA,YACsC;AACtC,QAAM,oBAAoB,oBAAI,IAAoB;AAElD,SAAO,OAAO,YAAyD;AACrE,UAAM,UAAU,QAAQ;AACxB,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,WAAW,kBAAkB,IAAI,OAAO,KAAK;AAEnD,QAAI,MAAM,YAAY,YAAY;AAChC,wBAAkB,IAAI,SAAS,GAAG;AAClC,aAAO,MAAM,QAAQ,OAAO;AAAA,IAC9B;AAAA,EACF;AACF;AAhBgB;",
4
+ "sourcesContent": ["import { Logger } from '../logger/index.js';\nimport type {\n WebSocketSubscriberHandler,\n WebSocketSubscriberHandlerContext,\n WebSocketSubscriberMatcher,\n} from './websocket.interface.js';\n\n/**\n * Utility functions for building and composing WebSocket subscriber handlers\n */\n\n/**\n * Create a predicate matcher for message properties\n * @param key - The property key to check\n * @param value - The expected value\n */\nexport function matchByProperty(key: string, value: unknown): WebSocketSubscriberMatcher {\n return (context: WebSocketSubscriberHandlerContext) => {\n try {\n const messageValue = getNestedProperty(context.message, key);\n return messageValue === value;\n } catch {\n return false;\n }\n };\n}\n\n/**\n * Create a predicate matcher for message property patterns\n * @param key - The property key to check\n * @param predicate - Function to test the value\n */\nexport function matchByPropertyPredicate<_T = unknown>(\n key: string,\n predicate: (value: unknown) => boolean,\n): WebSocketSubscriberMatcher {\n return (context: WebSocketSubscriberHandlerContext) => {\n try {\n const messageValue = getNestedProperty(context.message, key);\n return predicate(messageValue);\n } catch {\n return false;\n }\n };\n}\n\n/**\n * Safely get nested property from an object\n * @param obj - The object to search\n * @param path - Dot-notation path (e.g., 'user.id' or 'data.items.0.name')\n */\nexport function getNestedProperty(obj: any, path: string): unknown {\n const keys = path.split('.');\n let current = obj;\n\n for (const key of keys) {\n if (current == null) {\n return undefined;\n }\n // eslint-disable-next-line security/detect-object-injection\n current = current[key];\n }\n\n return current;\n}\n\n/**\n * Wrap a handler with error handling\n * @param handler - The handler to wrap\n * @param onError - Error handler callback\n * @param throwError - Whether to rethrow the error after handling\n */\nexport function withErrorHandler<TMessage = any>(\n handler: WebSocketSubscriberHandler<TMessage>,\n onError?: (error: Error, context: WebSocketSubscriberHandlerContext<TMessage>) => void | Promise<void>,\n _throwError = false,\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n try {\n return await handler(context);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (onError) {\n try {\n await onError(err, context);\n } catch (callbackError) {\n Logger.error({\n message: 'Error handler callback failed',\n meta: { originalError: err.message, callbackError },\n });\n }\n }\n\n if (_throwError) {\n throw err;\n }\n }\n };\n}\n\n/**\n * Wrap a handler with logging\n * @param handler - The handler to wrap\n * @param handlerName - Name for logging purposes\n */\nexport function withLogging<TMessage = any>(\n handler: WebSocketSubscriberHandler<TMessage>,\n handlerName = 'subscriber-handler',\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n const startTime = Date.now();\n const messageKeys =\n context.message && typeof context.message === 'object'\n ? Object.keys(context.message as Record<string, unknown>).slice(0, 5)\n : [];\n Logger.info({\n message: `${handlerName}: Starting handler execution`,\n meta: {\n channel: context.channel,\n messageKeys,\n },\n });\n\n try {\n const result = await handler(context);\n const duration = Date.now() - startTime;\n Logger.info({\n message: `${handlerName}: Handler completed successfully`,\n meta: { channel: context.channel, durationMs: duration },\n });\n return result;\n } catch (error) {\n const duration = Date.now() - startTime;\n Logger.error({\n message: `${handlerName}: Handler failed`,\n meta: {\n channel: context.channel,\n error: error instanceof Error ? error.message : String(error),\n durationMs: duration,\n },\n });\n throw error;\n }\n };\n}\n\n/**\n * Wrap a handler with rate limiting\n * @param handler - The handler to wrap\n * @param maxExecutions - Max executions allowed\n * @param windowMs - Time window in milliseconds\n * @param onRateLimited - Optional callback when rate limited\n */\nexport function withRateLimit<TMessage = any>(\n handler: WebSocketSubscriberHandler<TMessage>,\n maxExecutions: number,\n windowMs: number,\n onRateLimited?: (context: WebSocketSubscriberHandlerContext<TMessage>) => void | Promise<void>,\n): WebSocketSubscriberHandler<TMessage> {\n const executionTimes: number[] = [];\n\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n const now = Date.now();\n\n // Remove old entries outside the window\n while (executionTimes.length > 0 && executionTimes[0] < now - windowMs) {\n executionTimes.shift();\n }\n\n if (executionTimes.length >= maxExecutions) {\n if (onRateLimited) {\n await onRateLimited(context);\n }\n return;\n }\n\n executionTimes.push(now);\n return await handler(context);\n };\n}\n\n/**\n * Wrap a handler with retry logic\n * @param handler - The handler to wrap\n * @param maxRetries - Maximum number of retries\n * @param delayMs - Delay between retries in milliseconds\n * @param backoffMultiplier - Multiplier for exponential backoff (default: 1, no backoff)\n */\nexport function withRetry<TMessage = any>(\n handler: WebSocketSubscriberHandler<TMessage>,\n maxRetries: number,\n delayMs: number,\n backoffMultiplier = 1,\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n let lastError: Error | null = null;\n let currentDelay = delayMs;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await handler(context);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt < maxRetries) {\n await new Promise(resolve => setTimeout(resolve, currentDelay));\n currentDelay = Math.floor(currentDelay * backoffMultiplier);\n }\n }\n }\n\n throw lastError;\n };\n}\n\n/**\n * Compose multiple handlers into a single handler\n * Executes handlers sequentially, passing context through each one\n * @param handlers - Array of handlers to compose\n */\nexport function composeHandlers<TMessage = any>(\n handlers: WebSocketSubscriberHandler<TMessage>[],\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n for (const handler of handlers) {\n await handler(context);\n }\n };\n}\n\n/**\n * Create a filter handler that conditionally executes based on a predicate\n * @param predicate - Function that returns true if handler should execute\n * @param handler - The handler to execute conditionally\n */\nexport function withFilter<TMessage = any>(\n predicate: (context: WebSocketSubscriberHandlerContext<TMessage>) => boolean | Promise<boolean>,\n handler: WebSocketSubscriberHandler<TMessage>,\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n const shouldExecute = await predicate(context);\n if (shouldExecute) {\n return await handler(context);\n }\n };\n}\n\n/**\n * Validate message structure before execution\n * @param validator - Function that validates the message and throws if invalid\n * @param handler - The handler to wrap\n */\nexport function withValidation<TMessage = any>(\n validator: (message: TMessage) => void | Promise<void>,\n handler: WebSocketSubscriberHandler<TMessage>,\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n try {\n await validator(context.message);\n return await handler(context);\n } catch (error) {\n Logger.warn({\n message: 'Message validation failed',\n meta: {\n channel: context.channel,\n error: error instanceof Error ? error.message : String(error),\n },\n });\n throw error;\n }\n };\n}\n\n/**\n * Add metadata/context to a handler execution\n * @param metadata - Metadata to add to context\n * @param handler - The handler to wrap\n */\nexport function withMetadata<TMessage = any>(\n metadata: Record<string, unknown>,\n handler: WebSocketSubscriberHandler<TMessage>,\n): WebSocketSubscriberHandler<TMessage> {\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n const enrichedContext = {\n ...context,\n metadata,\n } as any;\n\n return await handler(enrichedContext);\n };\n}\n\n/**\n * Debounce handler execution by channel\n * @param handler - The handler to wrap\n * @param delayMs - Debounce delay in milliseconds\n */\nexport function withDebounce<TMessage = any>(\n handler: WebSocketSubscriberHandler<TMessage>,\n delayMs: number,\n): WebSocketSubscriberHandler<TMessage> {\n const timers = new Map<string, NodeJS.Timeout>();\n\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n const channel = context.channel;\n\n // Cancel previous timer for this channel\n const existingTimer = timers.get(channel);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Set new timer\n return new Promise<void>(resolve => {\n const timer = setTimeout(async () => {\n try {\n await handler(context);\n } finally {\n timers.delete(channel);\n resolve();\n }\n }, delayMs);\n\n timers.set(channel, timer);\n });\n };\n}\n\n/**\n * Throttle handler execution by channel\n * @param handler - The handler to wrap\n * @param intervalMs - Throttle interval in milliseconds\n */\nexport function withThrottle<TMessage = any>(\n handler: WebSocketSubscriberHandler<TMessage>,\n intervalMs: number,\n): WebSocketSubscriberHandler<TMessage> {\n const lastExecutionTime = new Map<string, number>();\n\n return async (context: WebSocketSubscriberHandlerContext<TMessage>) => {\n const channel = context.channel;\n const now = Date.now();\n const lastTime = lastExecutionTime.get(channel) ?? 0;\n\n if (now - lastTime >= intervalMs) {\n lastExecutionTime.set(channel, now);\n return await handler(context);\n }\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/websocket/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,IAAI,CAAC;AAGhC,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/websocket/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,IAAI,CAAC;AAGhC,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;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,CAoBnF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhE"}
@@ -22,9 +22,11 @@ function parseServerMessage(message) {
22
22
  }
23
23
  if (!parsedMessage) {
24
24
  throw new Error("Invalid WebSocket message");
25
- } else if (!parsedMessage.type) {
25
+ }
26
+ if (!parsedMessage.type) {
26
27
  throw new Error("Missing WebSocket message type");
27
- } else if (!parsedMessage.action) {
28
+ }
29
+ if (!parsedMessage.action) {
28
30
  throw new Error("Missing WebSocket message action");
29
31
  }
30
32
  return parsedMessage;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/websocket/utils.ts"],
4
- "sourcesContent": ["import crypto from 'node:crypto';\nimport type WebSocket from 'ws';\nimport { Logger } from '../logger/index.js';\n\nexport interface LogOptions {\n muteWorker?: boolean;\n}\n\nexport function generateClientId(): string {\n if (typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return crypto.randomBytes(16).toString('hex');\n}\n\nexport function log(message: string, meta?: Record<string, unknown>, options?: LogOptions): void {\n Logger.custom({ level: 'webSocket', message, meta, options });\n}\n\nexport function parseServerMessage(message: WebSocket.Data): Record<string, unknown> {\n let parsedMessage;\n\n try {\n parsedMessage = JSON.parse(message.toString());\n } catch {\n throw new Error('Failed to parse JSON');\n }\n\n if (!parsedMessage) {\n throw new Error('Invalid WebSocket message');\n } else if (!parsedMessage.type) {\n throw new Error('Missing WebSocket message type');\n } else if (!parsedMessage.action) {\n throw new Error('Missing WebSocket message action');\n }\n\n return parsedMessage;\n}\n\nexport function getRouteKey(type: string, action: string): string {\n return `${type}:${action}`;\n}\n"],
5
- "mappings": ";;AAAA,OAAO,YAAY;AAEnB,SAAS,cAAc;AAMhB,SAAS,mBAA2B;AACzC,MAAI,OAAO,OAAO,eAAe,YAAY;AAC3C,WAAO,OAAO,WAAW,EAAE,QAAQ,MAAM,EAAE;AAAA,EAC7C;AAEA,SAAO,OAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AAC9C;AANgB;AAQT,SAAS,IAAI,SAAiB,MAAgC,SAA4B;AAC/F,SAAO,OAAO,EAAE,OAAO,aAAa,SAAS,MAAM,QAAQ,CAAC;AAC9D;AAFgB;AAIT,SAAS,mBAAmB,SAAkD;AACnF,MAAI;AAEJ,MAAI;AACF,oBAAgB,KAAK,MAAM,QAAQ,SAAS,CAAC;AAAA,EAC/C,QAAQ;AACN,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAEA,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C,WAAW,CAAC,cAAc,MAAM;AAC9B,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD,WAAW,CAAC,cAAc,QAAQ;AAChC,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,SAAO;AACT;AAlBgB;AAoBT,SAAS,YAAY,MAAc,QAAwB;AAChE,SAAO,GAAG,IAAI,IAAI,MAAM;AAC1B;AAFgB;",
4
+ "sourcesContent": ["import crypto from 'node:crypto';\nimport type WebSocket from 'ws';\nimport { Logger } from '../logger/index.js';\n\nexport interface LogOptions {\n muteWorker?: boolean;\n}\n\nexport function generateClientId(): string {\n if (typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return crypto.randomBytes(16).toString('hex');\n}\n\nexport function log(message: string, meta?: Record<string, unknown>, options?: LogOptions): void {\n Logger.custom({ level: 'webSocket', message, meta, options });\n}\n\nexport function parseServerMessage(message: WebSocket.Data): Record<string, unknown> {\n let parsedMessage: Record<string, unknown>;\n\n try {\n parsedMessage = JSON.parse(message.toString());\n } catch {\n throw new Error('Failed to parse JSON');\n }\n\n if (!parsedMessage) {\n throw new Error('Invalid WebSocket message');\n }\n if (!parsedMessage.type) {\n throw new Error('Missing WebSocket message type');\n }\n if (!parsedMessage.action) {\n throw new Error('Missing WebSocket message action');\n }\n\n return parsedMessage;\n}\n\nexport function getRouteKey(type: string, action: string): string {\n return `${type}:${action}`;\n}\n"],
5
+ "mappings": ";;AAAA,OAAO,YAAY;AAEnB,SAAS,cAAc;AAMhB,SAAS,mBAA2B;AACzC,MAAI,OAAO,OAAO,eAAe,YAAY;AAC3C,WAAO,OAAO,WAAW,EAAE,QAAQ,MAAM,EAAE;AAAA,EAC7C;AAEA,SAAO,OAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AAC9C;AANgB;AAQT,SAAS,IAAI,SAAiB,MAAgC,SAA4B;AAC/F,SAAO,OAAO,EAAE,OAAO,aAAa,SAAS,MAAM,QAAQ,CAAC;AAC9D;AAFgB;AAIT,SAAS,mBAAmB,SAAkD;AACnF,MAAI;AAEJ,MAAI;AACF,oBAAgB,KAAK,MAAM,QAAQ,SAAS,CAAC;AAAA,EAC/C,QAAQ;AACN,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAEA,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACA,MAAI,CAAC,cAAc,MAAM;AACvB,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AACA,MAAI,CAAC,cAAc,QAAQ;AACzB,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,SAAO;AACT;AApBgB;AAsBT,SAAS,YAAY,MAAc,QAAwB;AAChE,SAAO,GAAG,IAAI,IAAI,MAAM;AAC1B;AAFgB;",
6
6
  "names": []
7
7
  }
@@ -1 +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"}
1
+ {"version":3,"file":"websocket-auth.d.ts","sourceRoot":"","sources":["../../src/websocket/websocket-auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AAGxF,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"}
@@ -1,6 +1,6 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
- import { URL } from "url";
3
+ import { URL } from "node:url";
4
4
  import Jwt from "../auth/jwt.js";
5
5
  class WebSocketAuthService {
6
6
  constructor(applicationConfig) {
@@ -30,8 +30,8 @@ class WebSocketAuthService {
30
30
  jwtSecretKey
31
31
  });
32
32
  const { payload } = await Jwt.jwtVerify(token, importedJwtSecretKey);
33
- const userId = parseInt(payload.sub);
34
- if (isNaN(userId)) {
33
+ const userId = parseInt(payload.sub, 10);
34
+ if (Number.isNaN(userId)) {
35
35
  throw new Error("Invalid user ID in token");
36
36
  }
37
37
  return { userId, payload };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
4
+ "sourcesContent": ["import { URL } from 'node:url';\nimport type { WebApplicationConfig } from '../application/web-application.interface.js';\nimport Jwt from '../auth/jwt.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, 10);\n\n if (Number.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;AAEpB,OAAO,SAAS;AAOT,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,KAAe,EAAE;AAEjD,UAAI,OAAO,MAAM,MAAM,GAAG;AACxB,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
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
- import type { WebSocketMessageHandler, WebSocketRoute, WebSocketType } from './websocket.interface.js';
2
1
  import type WebSocket from 'ws';
2
+ import type { WebSocketMessageHandler, WebSocketRoute, WebSocketType } from './websocket.interface.js';
3
3
  export default abstract class WebSocketBase {
4
4
  protected routes: WebSocketRoute[];
5
5
  protected routeHandlers: Map<string, WebSocketMessageHandler>;
@@ -13,7 +13,7 @@ export default abstract class WebSocketBase {
13
13
  type: unknown;
14
14
  action: unknown;
15
15
  response: unknown;
16
- } | void>;
16
+ } | undefined>;
17
17
  protected printRoutes(): void;
18
18
  }
19
19
  //# sourceMappingURL=websocket-base.d.ts.map
@@ -1 +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;cAiFtF,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"}
1
+ {"version":3,"file":"websocket-base.d.ts","sourceRoot":"","sources":["../../src/websocket/websocket-base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,IAAI,CAAC;AAKhC,OAAO,KAAK,EAAE,uBAAuB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEvG,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;cAiFtF,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,SAAS,CAAC;IAuD7E,SAAS,CAAC,WAAW,IAAI,IAAI;CAiB9B"}
@@ -1,7 +1,7 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
- import { getRouteKey, log, parseServerMessage } from "./utils.js";
4
3
  import { File, Helper, Loader } from "../util/index.js";
4
+ import { getRouteKey, log, parseServerMessage } from "./utils.js";
5
5
  class WebSocketBase {
6
6
  static {
7
7
  __name(this, "WebSocketBase");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/websocket/websocket-base.ts"],
4
- "sourcesContent": ["import type { WebSocketMessageHandler, WebSocketRoute, WebSocketType } from './websocket.interface.js';\nimport { getRouteKey, log, parseServerMessage } from './utils.js';\nimport type { WebSocketServerBaseControllerType } from './controller/server/base.interface.js';\nimport type { WebSocketClientBaseControllerType } from './controller/client/base.interface.js';\nimport type WebSocket from 'ws';\nimport { File, Helper, Loader } from '../util/index.js';\n\nexport default abstract class WebSocketBase {\n protected routes: WebSocketRoute[] = [];\n protected routeHandlers: Map<string, WebSocketMessageHandler> = new Map();\n\n protected defaultRoutes: WebSocketRoute[] = [];\n\n public abstract get type(): WebSocketType;\n\n protected abstract getControllerDependencies(): Record<string, unknown>;\n protected abstract shouldPrintRoutes(): boolean;\n protected abstract handleMessageError(clientId: string, error: string): void;\n\n protected async configureRoutes(routes: WebSocketRoute[], controllersDirectory: string): Promise<void> {\n // log ('Configuring routes', { Type: this.type, 'Controllers Directory': controllersDirectory });\n\n const controllersDirectoryExists = await File.pathExists(controllersDirectory);\n\n if (!controllersDirectoryExists) {\n log('Controllers directory not found', {\n Directory: controllersDirectory,\n });\n\n return;\n }\n\n const scriptFileExtension = Helper.getScriptFileExtension();\n\n // Load controllers\n const controllers = await Loader.loadModulesInDirectory({\n directory: controllersDirectory,\n // NOTE:\n // When getting \"system\", it gets /app/node_modules/@scpxl/nodejs-framework/dist/websocket/controllers/server\n // Therefor .js is needed also\n // Fix so only .ts vs .js is needed\n extensions: ['.ts', '.js'],\n });\n\n for (const route of routes) {\n let ControllerClass: WebSocketServerBaseControllerType | WebSocketClientBaseControllerType;\n\n // log('Registering route', {\n // Type: route.type,\n // Controller: route.controller ? route.controller.toString() : route.controllerName,\n // Action: route.action,\n // });\n\n if (route.controller) {\n ControllerClass = route.controller;\n } else if (route.controllerName) {\n ControllerClass = controllers[route.controllerName] as\n | WebSocketServerBaseControllerType\n | WebSocketClientBaseControllerType;\n } else {\n throw new Error('WebSocket controller config not found');\n }\n\n if (typeof ControllerClass !== 'function') {\n log('Controller not found', {\n Controller: route.controllerName,\n Path: `${controllersDirectory}/${route.controllerName}.${scriptFileExtension}`,\n });\n\n continue;\n }\n\n const controllerDependencies = this.getControllerDependencies();\n\n const controllerInstance = new ControllerClass(controllerDependencies as any);\n\n const controllerHandler = controllerInstance[route.action as keyof typeof controllerInstance] as\n | WebSocketMessageHandler\n | undefined;\n const routeKey = getRouteKey(route.type, route.action);\n\n if (typeof controllerHandler !== 'function') {\n log('Controller action not found', {\n Controller: route.controllerName ?? ControllerClass.name,\n Action: route.action,\n RouteKey: routeKey,\n });\n continue;\n }\n\n this.routeHandlers.set(routeKey, controllerHandler.bind(controllerInstance));\n }\n\n if (this.shouldPrintRoutes()) {\n log('Routes:', { Type: this.type });\n\n this.printRoutes();\n }\n }\n\n protected async handleServerMessage(\n ws: WebSocket,\n message: WebSocket.Data,\n clientId: string,\n ): Promise<{ type: unknown; action: unknown; response: unknown } | void> {\n try {\n const parsedMessage = parseServerMessage(message);\n const type = parsedMessage.type;\n const action = parsedMessage.action;\n\n log('Incoming message', {\n 'Client ID': clientId,\n Type: type ?? '-',\n Action: action ?? '-',\n });\n\n const routeKey = getRouteKey(parsedMessage.type as string, parsedMessage.action as string);\n\n const messageHandler = this.routeHandlers.get(routeKey);\n\n if (messageHandler) {\n const messageResponse = await messageHandler(ws, clientId, parsedMessage.data);\n\n return {\n type,\n action,\n response: messageResponse,\n };\n }\n // throw new Error(`Route handler not found (Route Key: ${routeKey} | Type: ${type} | Action: ${action})`);\n\n log('Route handler not found', {\n RouteKey: routeKey,\n Type: type,\n Action: action,\n });\n\n // if (\n // typeof this.applicationConfig.webSocket\n // ?.serverMessageHandler === 'function'\n // ) {\n // // Execute custom application subscriber event handler\n // this.applicationConfig.webSocket.serverMessageHandler(\n // {\n // ws,\n // clientId,\n // parsedMessage,\n // },\n // );\n // }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n log(errorMessage);\n\n this.handleMessageError(clientId, errorMessage);\n }\n }\n\n protected printRoutes(): void {\n let routesString = '';\n\n const routeKeys = Array.from(this.routeHandlers.keys());\n\n routeKeys.forEach((routeKey, index) => {\n const [type, action] = routeKey.split(':');\n\n routesString += `Type: ${type} -> Action: ${action}`;\n\n if (index !== routeKeys.length - 1) {\n routesString += '\\n';\n }\n });\n\n log(routesString);\n }\n}\n"],
5
- "mappings": ";;AACA,SAAS,aAAa,KAAK,0BAA0B;AAIrD,SAAS,MAAM,QAAQ,cAAc;AAErC,MAAO,cAAqC;AAAA,EAP5C,OAO4C;AAAA;AAAA;AAAA,EAChC,SAA2B,CAAC;AAAA,EAC5B,gBAAsD,oBAAI,IAAI;AAAA,EAE9D,gBAAkC,CAAC;AAAA,EAQ7C,MAAgB,gBAAgB,QAA0B,sBAA6C;AAGrG,UAAM,6BAA6B,MAAM,KAAK,WAAW,oBAAoB;AAE7E,QAAI,CAAC,4BAA4B;AAC/B,UAAI,mCAAmC;AAAA,QACrC,WAAW;AAAA,MACb,CAAC;AAED;AAAA,IACF;AAEA,UAAM,sBAAsB,OAAO,uBAAuB;AAG1D,UAAM,cAAc,MAAM,OAAO,uBAAuB;AAAA,MACtD,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,MAKX,YAAY,CAAC,OAAO,KAAK;AAAA,IAC3B,CAAC;AAED,eAAW,SAAS,QAAQ;AAC1B,UAAI;AAQJ,UAAI,MAAM,YAAY;AACpB,0BAAkB,MAAM;AAAA,MAC1B,WAAW,MAAM,gBAAgB;AAC/B,0BAAkB,YAAY,MAAM,cAAc;AAAA,MAGpD,OAAO;AACL,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AAEA,UAAI,OAAO,oBAAoB,YAAY;AACzC,YAAI,wBAAwB;AAAA,UAC1B,YAAY,MAAM;AAAA,UAClB,MAAM,GAAG,oBAAoB,IAAI,MAAM,cAAc,IAAI,mBAAmB;AAAA,QAC9E,CAAC;AAED;AAAA,MACF;AAEA,YAAM,yBAAyB,KAAK,0BAA0B;AAE9D,YAAM,qBAAqB,IAAI,gBAAgB,sBAA6B;AAE5E,YAAM,oBAAoB,mBAAmB,MAAM,MAAyC;AAG5F,YAAM,WAAW,YAAY,MAAM,MAAM,MAAM,MAAM;AAErD,UAAI,OAAO,sBAAsB,YAAY;AAC3C,YAAI,+BAA+B;AAAA,UACjC,YAAY,MAAM,kBAAkB,gBAAgB;AAAA,UACpD,QAAQ,MAAM;AAAA,UACd,UAAU;AAAA,QACZ,CAAC;AACD;AAAA,MACF;AAEA,WAAK,cAAc,IAAI,UAAU,kBAAkB,KAAK,kBAAkB,CAAC;AAAA,IAC7E;AAEA,QAAI,KAAK,kBAAkB,GAAG;AAC5B,UAAI,WAAW,EAAE,MAAM,KAAK,KAAK,CAAC;AAElC,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAgB,oBACd,IACA,SACA,UACuE;AACvE,QAAI;AACF,YAAM,gBAAgB,mBAAmB,OAAO;AAChD,YAAM,OAAO,cAAc;AAC3B,YAAM,SAAS,cAAc;AAE7B,UAAI,oBAAoB;AAAA,QACtB,aAAa;AAAA,QACb,MAAM,QAAQ;AAAA,QACd,QAAQ,UAAU;AAAA,MACpB,CAAC;AAED,YAAM,WAAW,YAAY,cAAc,MAAgB,cAAc,MAAgB;AAEzF,YAAM,iBAAiB,KAAK,cAAc,IAAI,QAAQ;AAEtD,UAAI,gBAAgB;AAClB,cAAM,kBAAkB,MAAM,eAAe,IAAI,UAAU,cAAc,IAAI;AAE7E,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,UAAU;AAAA,QACZ;AAAA,MACF;AAGA,UAAI,2BAA2B;AAAA,QAC7B,UAAU;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAAA,IAeH,SAAS,OAAO;AACd,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAE9D,UAAI,YAAY;AAEhB,WAAK,mBAAmB,UAAU,YAAY;AAAA,IAChD;AAAA,EACF;AAAA,EAEU,cAAoB;AAC5B,QAAI,eAAe;AAEnB,UAAM,YAAY,MAAM,KAAK,KAAK,cAAc,KAAK,CAAC;AAEtD,cAAU,QAAQ,CAAC,UAAU,UAAU;AACrC,YAAM,CAAC,MAAM,MAAM,IAAI,SAAS,MAAM,GAAG;AAEzC,sBAAgB,SAAS,IAAI,eAAe,MAAM;AAElD,UAAI,UAAU,UAAU,SAAS,GAAG;AAClC,wBAAgB;AAAA,MAClB;AAAA,IACF,CAAC;AAED,QAAI,YAAY;AAAA,EAClB;AACF;",
4
+ "sourcesContent": ["import type WebSocket from 'ws';\nimport { File, Helper, Loader } from '../util/index.js';\nimport type { WebSocketClientBaseControllerType } from './controller/client/base.interface.js';\nimport type { WebSocketServerBaseControllerType } from './controller/server/base.interface.js';\nimport { getRouteKey, log, parseServerMessage } from './utils.js';\nimport type { WebSocketMessageHandler, WebSocketRoute, WebSocketType } from './websocket.interface.js';\n\nexport default abstract class WebSocketBase {\n protected routes: WebSocketRoute[] = [];\n protected routeHandlers: Map<string, WebSocketMessageHandler> = new Map();\n\n protected defaultRoutes: WebSocketRoute[] = [];\n\n public abstract get type(): WebSocketType;\n\n protected abstract getControllerDependencies(): Record<string, unknown>;\n protected abstract shouldPrintRoutes(): boolean;\n protected abstract handleMessageError(clientId: string, error: string): void;\n\n protected async configureRoutes(routes: WebSocketRoute[], controllersDirectory: string): Promise<void> {\n // log ('Configuring routes', { Type: this.type, 'Controllers Directory': controllersDirectory });\n\n const controllersDirectoryExists = await File.pathExists(controllersDirectory);\n\n if (!controllersDirectoryExists) {\n log('Controllers directory not found', {\n Directory: controllersDirectory,\n });\n\n return;\n }\n\n const scriptFileExtension = Helper.getScriptFileExtension();\n\n // Load controllers\n const controllers = await Loader.loadModulesInDirectory({\n directory: controllersDirectory,\n // NOTE:\n // When getting \"system\", it gets /app/node_modules/@scpxl/nodejs-framework/dist/websocket/controllers/server\n // Therefor .js is needed also\n // Fix so only .ts vs .js is needed\n extensions: ['.ts', '.js'],\n });\n\n for (const route of routes) {\n let ControllerClass: WebSocketServerBaseControllerType | WebSocketClientBaseControllerType;\n\n // log('Registering route', {\n // Type: route.type,\n // Controller: route.controller ? route.controller.toString() : route.controllerName,\n // Action: route.action,\n // });\n\n if (route.controller) {\n ControllerClass = route.controller;\n } else if (route.controllerName) {\n ControllerClass = controllers[route.controllerName] as\n | WebSocketServerBaseControllerType\n | WebSocketClientBaseControllerType;\n } else {\n throw new Error('WebSocket controller config not found');\n }\n\n if (typeof ControllerClass !== 'function') {\n log('Controller not found', {\n Controller: route.controllerName,\n Path: `${controllersDirectory}/${route.controllerName}.${scriptFileExtension}`,\n });\n\n continue;\n }\n\n const controllerDependencies = this.getControllerDependencies();\n\n const controllerInstance = new ControllerClass(controllerDependencies as any);\n\n const controllerHandler = controllerInstance[route.action as keyof typeof controllerInstance] as\n | WebSocketMessageHandler\n | undefined;\n const routeKey = getRouteKey(route.type, route.action);\n\n if (typeof controllerHandler !== 'function') {\n log('Controller action not found', {\n Controller: route.controllerName ?? ControllerClass.name,\n Action: route.action,\n RouteKey: routeKey,\n });\n continue;\n }\n\n this.routeHandlers.set(routeKey, controllerHandler.bind(controllerInstance));\n }\n\n if (this.shouldPrintRoutes()) {\n log('Routes:', { Type: this.type });\n\n this.printRoutes();\n }\n }\n\n protected async handleServerMessage(\n ws: WebSocket,\n message: WebSocket.Data,\n clientId: string,\n ): Promise<{ type: unknown; action: unknown; response: unknown } | undefined> {\n try {\n const parsedMessage = parseServerMessage(message);\n const type = parsedMessage.type;\n const action = parsedMessage.action;\n\n log('Incoming message', {\n 'Client ID': clientId,\n Type: type ?? '-',\n Action: action ?? '-',\n });\n\n const routeKey = getRouteKey(parsedMessage.type as string, parsedMessage.action as string);\n\n const messageHandler = this.routeHandlers.get(routeKey);\n\n if (messageHandler) {\n const messageResponse = await messageHandler(ws, clientId, parsedMessage.data);\n\n return {\n type,\n action,\n response: messageResponse,\n };\n }\n // throw new Error(`Route handler not found (Route Key: ${routeKey} | Type: ${type} | Action: ${action})`);\n\n log('Route handler not found', {\n RouteKey: routeKey,\n Type: type,\n Action: action,\n });\n\n // if (\n // typeof this.applicationConfig.webSocket\n // ?.serverMessageHandler === 'function'\n // ) {\n // // Execute custom application subscriber event handler\n // this.applicationConfig.webSocket.serverMessageHandler(\n // {\n // ws,\n // clientId,\n // parsedMessage,\n // },\n // );\n // }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n log(errorMessage);\n\n this.handleMessageError(clientId, errorMessage);\n }\n }\n\n protected printRoutes(): void {\n let routesString = '';\n\n const routeKeys = Array.from(this.routeHandlers.keys());\n\n routeKeys.forEach((routeKey, index) => {\n const [type, action] = routeKey.split(':');\n\n routesString += `Type: ${type} -> Action: ${action}`;\n\n if (index !== routeKeys.length - 1) {\n routesString += '\\n';\n }\n });\n\n log(routesString);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,8 @@ import WebSocket from 'ws';
2
2
  import type { WebSocketClientData } from './websocket-client-manager.interface.js';
3
3
  export default class WebSocketClientManager {
4
4
  private clients;
5
+ /** Reverse lookup map for O(1) clientId lookup by WebSocket instance */
6
+ private wsToClientId;
5
7
  addClient({ clientId, ws, lastActivity, user, }: {
6
8
  clientId: string;
7
9
  ws: WebSocket | null;
@@ -1 +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"}
1
+ {"version":3,"file":"websocket-client-manager.d.ts","sourceRoot":"","sources":["../../src/websocket/websocket-client-manager.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,IAAI,CAAC;AAI3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAEnF,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACzC,OAAO,CAAC,OAAO,CAA+C;IAC9D,wEAAwE;IACxE,OAAO,CAAC,YAAY,CAAqC;IAElD,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;IAsBM,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,SAAS,CAAA;KAAE,GAAG,MAAM,GAAG,SAAS;IAK1D,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;IAyB7B,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;CAuBvB"}
@@ -1,15 +1,17 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import cluster from "node:cluster";
3
4
  import WebSocket from "ws";
4
- import { log } from "./utils.js";
5
- import { Helper, Time } from "../util/index.js";
6
- import cluster from "cluster";
7
5
  import { safeSerializeError } from "../error/error-reporter.js";
6
+ import { Helper, Time } from "../util/index.js";
7
+ import { log } from "./utils.js";
8
8
  class WebSocketClientManager {
9
9
  static {
10
10
  __name(this, "WebSocketClientManager");
11
11
  }
12
12
  clients = /* @__PURE__ */ new Map();
13
+ /** Reverse lookup map for O(1) clientId lookup by WebSocket instance */
14
+ wsToClientId = /* @__PURE__ */ new Map();
13
15
  addClient({
14
16
  clientId,
15
17
  ws,
@@ -21,6 +23,9 @@ class WebSocketClientManager {
21
23
  lastActivity,
22
24
  user
23
25
  });
26
+ if (ws) {
27
+ this.wsToClientId.set(ws, clientId);
28
+ }
24
29
  this.broadcastClientList("addClient");
25
30
  log("Client connected", {
26
31
  ID: clientId,
@@ -29,7 +34,7 @@ class WebSocketClientManager {
29
34
  this.printClients();
30
35
  }
31
36
  getClientId({ ws }) {
32
- return [...this.clients.entries()].find(([_, value]) => value.ws === ws)?.[0];
37
+ return this.wsToClientId.get(ws);
33
38
  }
34
39
  getClient({
35
40
  clientId,
@@ -81,6 +86,7 @@ class WebSocketClientManager {
81
86
  removeClient(clientId) {
82
87
  const client = this.clients.get(clientId);
83
88
  if (client?.ws) {
89
+ this.wsToClientId.delete(client.ws);
84
90
  try {
85
91
  client.ws.removeAllListeners();
86
92
  if (client.ws.readyState === WebSocket.OPEN) {
@@ -217,6 +223,7 @@ class WebSocketClientManager {
217
223
  }
218
224
  });
219
225
  this.clients.clear();
226
+ this.wsToClientId.clear();
220
227
  log("WebSocket client manager cleaned up");
221
228
  }
222
229
  }