http-request-manager 18.15.32 → 18.15.34

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 (301) hide show
  1. package/README.md +2 -0
  2. package/TEST_COVERAGE_SUMMARY.md +458 -0
  3. package/ng-package.json +8 -0
  4. package/package.json +5 -13
  5. package/src/docs/ADVANCED_WEBSOCKET.md +633 -0
  6. package/src/docs/ARCHITECTURE.md +633 -0
  7. package/src/docs/BATCH_REQUEST_README.md +467 -0
  8. package/src/docs/COMPLETE_API_REFERENCE.md +1037 -0
  9. package/src/docs/DATABASE_README.md +1195 -0
  10. package/src/docs/ENCRYPTION_README.md +403 -0
  11. package/src/docs/HTTP_MANAGER_README.md +628 -0
  12. package/src/docs/HTTP_SINGNALS_MANAGER_README.md +654 -0
  13. package/src/docs/HTTP_STATE_MANAGER_README.md +1391 -0
  14. package/src/docs/INTERCEPTOR_README.md +549 -0
  15. package/src/docs/LOCAL_STORAGE_README.md +1056 -0
  16. package/src/docs/LOCAL_STORAGE_SIGNALS_README.md +338 -0
  17. package/src/docs/LOGGER_README.md +310 -0
  18. package/src/docs/MESSAGE_TRACKER_README.md +518 -0
  19. package/src/docs/MESSAGE_TRACKER_SIGNALS_README.md +563 -0
  20. package/src/docs/MODELS_README.md +1264 -0
  21. package/src/docs/SIGNAL_SERVICES_README.md +238 -0
  22. package/src/docs/SQL_DIXIE_README.md +574 -0
  23. package/src/docs/STORE_STATE_MANAGER_README.md +556 -0
  24. package/src/docs/STORE_STATE_SIGNALS_README.md +600 -0
  25. package/src/docs/UPLOAD_REQUEST_README.md +324 -0
  26. package/src/docs/UTILS_README.md +1604 -0
  27. package/src/docs/WEBSOCKET_MESSAGE_SERVICE.md +799 -0
  28. package/src/docs/WEBSOCKET_SIGNALS_README.md +641 -0
  29. package/src/docs/WEBSOCKET_SINGLETON_REFACTORING.md +201 -0
  30. package/src/docs/WS_MANAGER_README.md +613 -0
  31. package/src/lib/http-request-manager.module.ts +147 -0
  32. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +116 -0
  33. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  34. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +255 -0
  35. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +123 -0
  36. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  37. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +53 -0
  38. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  39. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  40. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +208 -0
  41. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
  42. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
  43. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +214 -0
  44. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.html +53 -0
  45. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.scss +60 -0
  46. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.ts +72 -0
  47. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-download.module.ts +28 -0
  48. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.html +10 -0
  49. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.scss +29 -0
  50. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.ts +100 -0
  51. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/models/download-labels-model.ts +22 -0
  52. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.html +8 -0
  53. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.scss +19 -0
  54. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.ts +26 -0
  55. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app-session.model.ts +30 -0
  56. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app.model.ts +19 -0
  57. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/get-sample.model.ts +25 -0
  58. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-ai-prompt.ts +19 -0
  59. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-details.ts +24 -0
  60. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-info.ts +30 -0
  61. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client.model.ts +49 -0
  62. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-mapper-client-info.ts +33 -0
  63. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.html +279 -0
  64. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.scss +24 -0
  65. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.ts +461 -0
  66. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  67. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  68. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  69. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  70. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  71. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  72. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  73. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  74. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  75. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  76. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  77. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  78. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  79. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  80. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  81. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  82. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  83. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  84. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  85. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +622 -0
  86. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +106 -0
  87. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +687 -0
  88. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +418 -0
  89. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  90. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +576 -0
  91. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +89 -0
  92. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +119 -0
  93. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
  94. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
  95. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
  96. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
  97. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
  98. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
  99. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
  100. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +94 -0
  101. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
  102. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +203 -0
  103. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +144 -0
  104. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
  105. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +102 -0
  106. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +40 -0
  107. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +230 -0
  108. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
  109. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
  110. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
  111. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
  112. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
  113. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
  114. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
  115. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
  116. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +40 -0
  117. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
  118. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/jwt-token.service.ts +62 -0
  119. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
  120. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
  121. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +168 -0
  122. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  123. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  124. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  125. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
  126. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
  127. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  128. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  129. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  130. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  131. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  132. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  133. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
  134. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
  135. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
  136. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
  137. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
  138. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
  139. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
  140. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
  141. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
  142. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
  143. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
  144. package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
  145. package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +49 -0
  146. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
  147. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
  148. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
  149. package/src/lib/http-request-services-demo/store-state-signals-demo/store-state-signals-demo.component.ts +161 -0
  150. package/src/lib/http-request-services-demo/upload-demo/models/index.ts +1 -0
  151. package/src/lib/http-request-services-demo/upload-demo/models/upload-state.model.ts +30 -0
  152. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.html +89 -0
  153. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.scss +160 -0
  154. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.spec.ts +101 -0
  155. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.ts +136 -0
  156. package/src/lib/index.ts +3 -0
  157. package/src/lib/interceptors/credentials.interceptor.ts +16 -0
  158. package/src/lib/interceptors/index.ts +6 -0
  159. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  160. package/src/lib/interceptors/models/index.ts +2 -0
  161. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  162. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  163. package/src/lib/interceptors/request-header.interceptor.ts +56 -0
  164. package/src/lib/message-display/README.md +509 -0
  165. package/src/lib/message-display/index.ts +4 -0
  166. package/src/lib/message-display/models/action.model.ts +27 -0
  167. package/src/lib/message-display/models/communication-message.model.ts +77 -0
  168. package/src/lib/message-display/models/display-config.model.ts +35 -0
  169. package/src/lib/message-display/models/display-rule.interface.ts +28 -0
  170. package/src/lib/message-display/models/display-strategy.interface.ts +8 -0
  171. package/src/lib/message-display/models/index.ts +6 -0
  172. package/src/lib/message-display/models/slide.model.ts +24 -0
  173. package/src/lib/message-display/rules/default-display-rules.ts +35 -0
  174. package/src/lib/message-display/services/message-display-router.service.ts +63 -0
  175. package/src/lib/message-display/strategies/snackbar.strategy.ts +46 -0
  176. package/src/lib/models/batch-options.model.ts +33 -0
  177. package/src/lib/models/batch-progress.model.ts +19 -0
  178. package/src/lib/models/batch-request-state.model.ts +40 -0
  179. package/src/lib/models/batch-result.model.ts +30 -0
  180. package/src/lib/models/config-http-options.model.ts +45 -0
  181. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  182. package/src/lib/models/config-options.model.ts +27 -0
  183. package/src/lib/models/config-token.model.ts +9 -0
  184. package/src/lib/models/data-type.enum.ts +5 -0
  185. package/src/lib/models/database-storage.model.ts +24 -0
  186. package/src/lib/models/index.ts +16 -0
  187. package/src/lib/models/retry-options.model.ts +22 -0
  188. package/src/lib/models/upload-validation-error.model.ts +46 -0
  189. package/src/lib/services/SQL-DixieJS service/dexie-query-executor.ts +246 -0
  190. package/src/lib/services/SQL-DixieJS service/dexie-sql.service.ts +31 -0
  191. package/src/lib/services/SQL-DixieJS service/index.ts +4 -0
  192. package/src/lib/services/SQL-DixieJS service/models/execution-plan.model.ts +52 -0
  193. package/src/lib/services/SQL-DixieJS service/models/index.ts +3 -0
  194. package/src/lib/services/SQL-DixieJS service/models/sql-errors.model.ts +13 -0
  195. package/src/lib/services/SQL-DixieJS service/models/sql-options.model.ts +3 -0
  196. package/src/lib/services/SQL-DixieJS service/query-planner.ts +284 -0
  197. package/src/lib/services/SQL-DixieJS service/schema-validator.ts +217 -0
  198. package/src/lib/services/SQL-DixieJS service/sql-parser.ts +35 -0
  199. package/src/lib/services/database-manager-service/database.manager.service.ts +384 -0
  200. package/src/lib/services/database-manager-service/db.storage.service.ts +240 -0
  201. package/src/lib/services/database-manager-service/index.ts +4 -0
  202. package/src/lib/services/database-manager-service/models/index.ts +2 -0
  203. package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
  204. package/src/lib/services/index.ts +20 -0
  205. package/src/lib/services/local-storage-manager-service/index.ts +4 -0
  206. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  207. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +567 -0
  208. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
  209. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +437 -0
  210. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  211. package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
  212. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
  213. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  214. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
  215. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  216. package/src/lib/services/request-manager-services/README.md +282 -0
  217. package/src/lib/services/request-manager-services/http-manager-signals.service.ts +674 -0
  218. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +353 -0
  219. package/src/lib/services/request-manager-services/http-manager.service.ts +727 -0
  220. package/src/lib/services/request-manager-services/index.ts +8 -0
  221. package/src/lib/services/request-manager-services/request-signals.service.ts +372 -0
  222. package/src/lib/services/request-manager-services/request.service.ts +435 -0
  223. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  224. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  225. package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
  226. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
  227. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +468 -0
  228. package/src/lib/services/request-manager-state-service/http-manager-state.store.spec.ts +665 -0
  229. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +2395 -0
  230. package/src/lib/services/request-manager-state-service/index.ts +3 -0
  231. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +86 -0
  232. package/src/lib/services/request-manager-state-service/models/index.ts +14 -0
  233. package/src/lib/services/request-manager-state-service/models/operation-result.model.ts +18 -0
  234. package/src/lib/services/request-manager-state-service/models/parsing-result.model.ts +21 -0
  235. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +37 -0
  236. package/src/lib/services/request-manager-state-service/models/stream-config.model.ts +20 -0
  237. package/src/lib/services/request-manager-state-service/models/stream-event-metadata.model.ts +23 -0
  238. package/src/lib/services/request-manager-state-service/models/stream-event.model.ts +23 -0
  239. package/src/lib/services/request-manager-state-service/models/stream-output.model.ts +23 -0
  240. package/src/lib/services/request-manager-state-service/models/stream-progress.model.ts +24 -0
  241. package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
  242. package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +42 -0
  243. package/src/lib/services/store-state-manager-service/index.ts +4 -0
  244. package/src/lib/services/store-state-manager-service/models/index.ts +3 -0
  245. package/src/lib/services/store-state-manager-service/models/state-operation-result.model.ts +30 -0
  246. package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
  247. package/src/lib/services/store-state-manager-service/store-state-manager-signals.service.ts +169 -0
  248. package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +153 -0
  249. package/src/lib/services/utils/app.service.spec.ts +25 -0
  250. package/src/lib/services/utils/app.service.ts +21 -0
  251. package/src/lib/services/utils/encryption/README.md +79 -0
  252. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  253. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  254. package/src/lib/services/utils/encryption/index.ts +5 -0
  255. package/src/lib/services/utils/encryption/random.ts +81 -0
  256. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +106 -0
  257. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  258. package/src/lib/services/utils/headers.service.ts +18 -0
  259. package/src/lib/services/utils/index.ts +9 -0
  260. package/src/lib/services/utils/logger.service.ts +90 -0
  261. package/src/lib/services/utils/models/index.ts +4 -0
  262. package/src/lib/services/utils/models/normalized-request-options.model.ts +24 -0
  263. package/src/lib/services/utils/models/path-tracker-state.model.ts +20 -0
  264. package/src/lib/services/utils/models/query-params-tracker-options.model.ts +24 -0
  265. package/src/lib/services/utils/models/query-tracker-state.model.ts +23 -0
  266. package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
  267. package/src/lib/services/utils/object-merger.service.ts +78 -0
  268. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  269. package/src/lib/services/utils/path-query.service.ts +69 -0
  270. package/src/lib/services/utils/query-params-tracker.service.ts +442 -0
  271. package/src/lib/services/utils/random-color.utils.ts +83 -0
  272. package/src/lib/services/utils/utils.service.spec.ts +165 -0
  273. package/src/lib/services/utils/utils.service.ts +192 -0
  274. package/src/lib/services/ws-manager-service/index.ts +13 -0
  275. package/src/lib/services/ws-manager-service/message-tracker-signals.service.ts +147 -0
  276. package/src/lib/services/ws-manager-service/message-tracker.service.ts +477 -0
  277. package/src/lib/services/ws-manager-service/models/channel-info.model.ts +29 -0
  278. package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
  279. package/src/lib/services/ws-manager-service/models/channel-message.model.ts +36 -0
  280. package/src/lib/services/ws-manager-service/models/channel-type.enum.ts +6 -0
  281. package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
  282. package/src/lib/services/ws-manager-service/models/index.ts +10 -0
  283. package/src/lib/services/ws-manager-service/models/notification-message.model.ts +29 -0
  284. package/src/lib/services/ws-manager-service/models/public-message.model.ts +18 -0
  285. package/src/lib/services/ws-manager-service/models/state-message.model.ts +18 -0
  286. package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
  287. package/src/lib/services/ws-manager-service/services/index.ts +4 -0
  288. package/src/lib/services/ws-manager-service/services/websocket-message.service.ts +129 -0
  289. package/src/lib/services/ws-manager-service/services/websocket.service.ts +434 -0
  290. package/src/lib/services/ws-manager-service/websocket-service/index.ts +1 -0
  291. package/src/lib/services/ws-manager-service/websocket-service/websocket-manager.service.ts +716 -0
  292. package/src/lib/services/ws-manager-service/websocket-services-complete.spec.ts +596 -0
  293. package/src/lib/services/ws-manager-service/websocket-signals-manager.service.ts +141 -0
  294. package/src/public-api.ts +19 -0
  295. package/tsconfig.lib.json +34 -0
  296. package/tsconfig.lib.prod.json +10 -0
  297. package/tsconfig.spec.json +14 -0
  298. package/fesm2022/http-request-manager.mjs +0 -13297
  299. package/fesm2022/http-request-manager.mjs.map +0 -1
  300. package/http-request-manager-18.15.32.tgz +0 -0
  301. package/types/http-request-manager.d.ts +0 -3875
@@ -0,0 +1,38 @@
1
+ export interface WSUserInterface {
2
+ id: string,
3
+ ldap?: string,
4
+ name?: string,
5
+ email?: string,
6
+ [key: string]: any, // Allow additional properties
7
+ }
8
+
9
+ export class WSUser implements WSUserInterface {
10
+
11
+ constructor(
12
+ public id: string = '',
13
+ public ldap: string = '',
14
+ public name: string = '',
15
+ public email: string = '',
16
+ ) {}
17
+
18
+ static adapt(item?: any): WSUser {
19
+ const user = new WSUser(
20
+ item?.id || item?.sessionId, // Support both for backward compatibility
21
+ item?.ldap,
22
+ item?.name,
23
+ item?.email,
24
+ );
25
+ // Copy any additional properties
26
+ if (item) {
27
+ Object.keys(item).forEach(key => {
28
+ if (!['id', 'sessionId', 'ldap', 'name', 'email'].includes(key)) {
29
+ (user as any)[key] = item[key];
30
+ }
31
+ });
32
+ }
33
+ return user;
34
+ }
35
+
36
+ }
37
+
38
+
@@ -0,0 +1,4 @@
1
+
2
+ export * from "./websocket.service";
3
+ export * from "./websocket-message.service";
4
+
@@ -0,0 +1,129 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { WebSocketManagerService } from '../websocket-service/websocket-manager.service';
3
+ import { ChannelType } from '../models/channel-type.enum';
4
+ import { StateMessage } from '../models/state-message.model';
5
+ import { PublicMessage } from '../models/public-message.model';
6
+ import { NotificationMessage } from '../models/notification-message.model';
7
+ import { LoggerService } from '../../utils/logger.service';
8
+
9
+ /**
10
+ * WebSocketMessageService - Unified service for sending WebSocket messages
11
+ *
12
+ * Provides type-safe methods for sending messages with automatic prefix management.
13
+ * Supports three message types: State (SYS-), Public (PUB-), and Notification (MES-).
14
+ *
15
+ * Features:
16
+ * - Type-safe message models
17
+ * - Automatic prefix management
18
+ * - Runtime validation
19
+ * - Boolean return values for success/failure
20
+ * - Silent failure with console errors
21
+ */
22
+ @Injectable({ providedIn: 'root' })
23
+ export class WebSocketMessageService {
24
+ private wsManagerService = inject(WebSocketManagerService);
25
+ private logger = new LoggerService();
26
+
27
+ /**
28
+ * Send state message (SYS- prefix)
29
+ * Used for CRUD operations and state synchronization
30
+ *
31
+ * @param path - Path array (e.g., ['ai', 'tests'])
32
+ * @param payload - StateMessage with sessionId and content
33
+ * @returns true if sent successfully, false otherwise
34
+ */
35
+ sendStateMessage(path: (string | number)[], payload: StateMessage): boolean {
36
+ // Validate payload
37
+ if (!payload?.sessionId?.id) {
38
+ this.logger.error('WebSocketMessageService', 'StateMessage must have sessionId.id');
39
+ return false;
40
+ }
41
+
42
+ if (!WebSocketManagerService.isConnected()) {
43
+ this.logger.error('WebSocketMessageService', 'Cannot send state message - not connected');
44
+ return false;
45
+ }
46
+
47
+ const channel = `${ChannelType.STATE}-${path.join('/')}`;
48
+ this.wsManagerService.sendMessageInChannel(channel, payload);
49
+ return true;
50
+ }
51
+
52
+ /**
53
+ * Send public message (PUB- prefix)
54
+ * Used for chat, broadcast, general messaging
55
+ *
56
+ * @param channel - Channel name (without prefix)
57
+ * @param payload - PublicMessage with sessionId and content.message
58
+ * @returns true if sent successfully, false otherwise
59
+ */
60
+ sendPublicMessage(channel: string, payload: PublicMessage): boolean {
61
+ // Validate payload
62
+ if (!payload?.sessionId?.id) {
63
+ this.logger.error('WebSocketMessageService', 'PublicMessage must have sessionId.id');
64
+ return false;
65
+ }
66
+
67
+ if (!payload?.content?.message) {
68
+ this.logger.error('WebSocketMessageService', 'PublicMessage must have content.message');
69
+ return false;
70
+ }
71
+
72
+ if (!WebSocketManagerService.isConnected()) {
73
+ this.logger.error('WebSocketMessageService', 'Cannot send public message - not connected');
74
+ return false;
75
+ }
76
+
77
+ const fullChannel = `${ChannelType.PUBLIC}-${channel}`;
78
+ this.wsManagerService.sendMessageInChannel(fullChannel, payload);
79
+ return true;
80
+ }
81
+
82
+ /**
83
+ * Send notification (MES- prefix)
84
+ * Used for persistent notifications with history
85
+ *
86
+ * @param channel - Channel name (without prefix)
87
+ * @param payload - NotificationMessage with sessionId and message
88
+ * @returns true if sent successfully, false otherwise
89
+ */
90
+ sendNotification(channel: string, payload: NotificationMessage): boolean {
91
+ // Validate payload
92
+ if (!payload?.sessionId?.id) {
93
+ this.logger.error('WebSocketMessageService', 'NotificationMessage must have sessionId.id');
94
+ return false;
95
+ }
96
+
97
+ if (!payload?.message) {
98
+ this.logger.error('WebSocketMessageService', 'NotificationMessage must have message');
99
+ return false;
100
+ }
101
+
102
+ if (!WebSocketManagerService.isConnected()) {
103
+ this.logger.error('WebSocketMessageService', 'Cannot send notification - not connected');
104
+ return false;
105
+ }
106
+
107
+ const fullChannel = `${ChannelType.NOTIFICATION}-${channel}`;
108
+ this.wsManagerService.sendMessageInChannel(fullChannel, payload);
109
+ return true;
110
+ }
111
+
112
+ /**
113
+ * Send to custom channel (no prefix)
114
+ * User provides full channel name
115
+ *
116
+ * @param channel - Full channel name
117
+ * @param payload - Any message payload
118
+ * @returns true if sent successfully, false otherwise
119
+ */
120
+ sendToCustomChannel(channel: string, payload: any): boolean {
121
+ if (!WebSocketManagerService.isConnected()) {
122
+ this.logger.error('WebSocketMessageService', 'Cannot send custom message - not connected');
123
+ return false;
124
+ }
125
+
126
+ this.wsManagerService.sendMessageInChannel(channel, payload);
127
+ return true;
128
+ }
129
+ }
@@ -0,0 +1,434 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject, Observable } from 'rxjs';
3
+ import { WSOptions } from '../../request-manager-state-service';
4
+ import { UUID_STR } from '../../utils/encryption/random';
5
+ import { LoggerService } from '../../utils/logger.service';
6
+
7
+ @Injectable({
8
+ providedIn: 'root',
9
+ })
10
+ export class WebsocketService {
11
+ private logger = new LoggerService();
12
+
13
+ private socket: WebSocket | null = null;
14
+
15
+ private messages = new BehaviorSubject<any>(null);
16
+ public messages$: Observable<any> = this.messages.asObservable();
17
+
18
+ private connectionStatus = new BehaviorSubject<boolean>(false);
19
+ public connectionStatus$: Observable<boolean> = this.connectionStatus.asObservable();
20
+
21
+ private isSubscribed: boolean = false;
22
+
23
+ // Track currently subscribed channels
24
+ private subscribedChannels = new BehaviorSubject<Set<string>>(new Set());
25
+ public subscribedChannels$: Observable<Set<string>> = this.subscribedChannels.asObservable();
26
+
27
+ // Store last options for reconnection
28
+ private lastOptions: WSOptions | null = null;
29
+
30
+ private getSessionId(): string {
31
+ return sessionStorage.getItem('WSID') ?? (() => {
32
+ const uuid = UUID_STR()
33
+ sessionStorage.setItem('WSID', uuid)
34
+ return uuid
35
+ })()
36
+ }
37
+
38
+ private sendSubscribe(channelName: string, user: any) {
39
+
40
+ // Check if already subscribed to THIS specific channel (not just any channel)
41
+ const alreadySubscribed = this.subscribedChannels.value.has(channelName);
42
+
43
+ if (this.socket?.readyState === WebSocket.OPEN && !alreadySubscribed) {
44
+ const message = {
45
+ type: 'subscribe',
46
+ subscribedChannel: channelName,
47
+ content: {
48
+ id: this.getSessionId(),
49
+ ...user
50
+ }
51
+ };
52
+ this.socket.send(JSON.stringify(message));
53
+
54
+ // Track this channel as subscribed
55
+ const current = new Set(this.subscribedChannels.value);
56
+ current.add(channelName);
57
+ this.subscribedChannels.next(current);
58
+
59
+ this.isSubscribed = true; // Keep for backward compatibility
60
+ this.logger.debug('WebSocket', `Sent initial subscription to: ${channelName}`);
61
+ } else {
62
+ this.logger.warn('WebSocket', `Subscription prevented`, {
63
+ open: this.socket?.readyState === WebSocket.OPEN,
64
+ channel: channelName,
65
+ alreadySubscribed
66
+ });
67
+ }
68
+ }
69
+
70
+ connect(options: WSOptions, jwtToken: string) {
71
+
72
+ if (this.socket) {
73
+
74
+ if (this.socket.readyState === WebSocket.OPEN) {
75
+ this.logger.debug('WebSocket', 'Connection is already OPEN');
76
+ return;
77
+ }
78
+
79
+ if (this.socket.readyState === WebSocket.CONNECTING) {
80
+ this.logger.debug('WebSocket', 'Already CONNECTING. Waiting for handshake');
81
+ return;
82
+ }
83
+
84
+ if (this.socket.readyState === WebSocket.CLOSING || this.socket.readyState === WebSocket.CLOSED) {
85
+ this.logger.debug('WebSocket', `Cleaning up stale socket`, { state: this.socket.readyState });
86
+ this.socket.close();
87
+ this.socket = null;
88
+ }
89
+ }
90
+
91
+ this.isSubscribed = false;
92
+ // Clear tracked subscriptions for new connection
93
+ this.subscribedChannels.next(new Set());
94
+
95
+ const sessionId = this.getSessionId();
96
+ const URL = (jwtToken) ? `${options.wsServer}?token=${jwtToken}&sessionId=${sessionId}` : `${options.wsServer}?sessionId=${sessionId}`;
97
+
98
+ this.socket = new WebSocket(URL);
99
+
100
+ this.socket.onopen = () => {
101
+ this.logger.info('WebSocket', '📡 Connected to WebSocket');
102
+ this.connectionStatus.next(true);
103
+ this.lastOptions = options;
104
+
105
+ // Subscribe to primary channel
106
+ this.sendSubscribe(options.id, options.user);
107
+
108
+ // Build unified set of all channels to subscribe to (with deduplication)
109
+ const allChannels = new Set<string>();
110
+
111
+ // Add channels from options.channels[]
112
+ if (options.channels && options.channels.length > 0) {
113
+ options.channels.forEach(channel => allChannels.add(channel));
114
+ }
115
+
116
+ // Add channels from options.wsUpdateChannels[] with MES- prefix
117
+ if (options.wsUpdateChannels && options.wsUpdateChannels.length > 0) {
118
+ options.wsUpdateChannels.forEach(ch => {
119
+ const prefixed = ch.startsWith('MES-') ? ch : `MES-${ch}`;
120
+ allChannels.add(prefixed);
121
+ });
122
+ }
123
+
124
+ // Subscribe to all channels (excluding primary channel)
125
+ allChannels.forEach(channel => {
126
+ if (channel !== options.id) {
127
+ this.subscribeToChannel(channel);
128
+ }
129
+ });
130
+
131
+ // Re-subscribe to any previously subscribed channels not in current options
132
+ const previousChannels = this.subscribedChannels.value;
133
+ if (previousChannels.size > 0) {
134
+ previousChannels.forEach(channel => {
135
+ if (!allChannels.has(channel) && channel !== options.id) {
136
+ this.subscribeToChannel(channel);
137
+ }
138
+ });
139
+ }
140
+ };
141
+
142
+ this.socket.onmessage = (event) => {
143
+
144
+ try {
145
+
146
+ const data = JSON.parse(event.data);
147
+
148
+ if (data.error && data.error === 'JWT_INVALID') {
149
+
150
+ this.logger.error('WebSocket', 'JWT validation failed. Authentication error!');
151
+
152
+ this.messages.next(data);
153
+ this.connectionStatus.next(false);
154
+ this.socket?.close();
155
+
156
+ return;
157
+
158
+ }
159
+
160
+ this.messages.next(data);
161
+
162
+ } catch (error) {
163
+ this.logger.error('WebSocket', 'Error parsing WebSocket message', { data: event.data });
164
+ }
165
+
166
+ };
167
+
168
+ this.socket.onclose = () => {
169
+
170
+ this.logger.debug('WebSocket', 'Connection closed');
171
+
172
+ this.connectionStatus.next(false);
173
+ this.socket = null;
174
+ };
175
+
176
+ this.socket.onerror = (error) => {
177
+ this.logger.error('WebSocket', 'WebSocket error', error);
178
+ this.connectionStatus.next(false);
179
+ };
180
+
181
+ }
182
+
183
+ disconnect() {
184
+ if (this.socket) {
185
+ this.socket.close();
186
+ this.socket = null;
187
+ }
188
+ }
189
+
190
+ subscribeToChannel(channelName: string) {
191
+
192
+ if (this.socket?.readyState === WebSocket.OPEN) {
193
+ try {
194
+ const message = {
195
+ type: 'subscribe',
196
+ subscribedChannel: channelName,
197
+ content: {}
198
+ };
199
+
200
+ this.socket.send(JSON.stringify(message));
201
+
202
+ // Track locally - create new Set to trigger change detection
203
+ const current = new Set(this.subscribedChannels.value);
204
+ current.add(channelName);
205
+ this.subscribedChannels.next(current);
206
+ this.logger.debug('WebSocket', `📝 Subscribed to channel`, { channel: channelName });
207
+ } catch (error) {
208
+ this.logger.error('WebSocket', `Failed to subscribe to channel`, { channel: channelName, error });
209
+ }
210
+
211
+ } else {
212
+ this.logger.warn('WebSocket', `Cannot subscribe to channel - WebSocket not open`, { channel: channelName });
213
+ }
214
+
215
+ }
216
+
217
+ subscribeToChannels(channelNames: string[]) {
218
+ if (this.socket?.readyState === WebSocket.OPEN) {
219
+ channelNames.forEach(channel => this.subscribeToChannel(channel));
220
+ } else {
221
+ this.logger.warn('WebSocket', 'Cannot subscribe to channels - WebSocket not open');
222
+ }
223
+ }
224
+
225
+ unsubscribeFromChannel(channel: string) {
226
+ if (this.socket?.readyState === WebSocket.OPEN) {
227
+ this.socket.send(JSON.stringify({ type: 'unsubscribe', subscribedChannel: channel }));
228
+
229
+ // Remove from local tracking - create new Set to trigger change detection
230
+ const current = new Set(this.subscribedChannels.value);
231
+ current.delete(channel);
232
+ this.subscribedChannels.next(current);
233
+ this.logger.debug('WebSocket', `💬 Unsubscribed from channel`, { channel });
234
+ } else {
235
+ this.logger.error('WebSocket', 'Cannot unsubscribe - WebSocket not open');
236
+ }
237
+ }
238
+
239
+ unsubscribeToChannel(channel: string) {
240
+ // Deprecated: Use unsubscribeFromChannel instead
241
+ this.unsubscribeFromChannel(channel);
242
+ }
243
+
244
+ getSubscribedChannels(): Set<string> {
245
+ return this.subscribedChannels.value;
246
+ }
247
+
248
+ sendBroadcast(content: any) {
249
+ if (this.socket?.readyState === WebSocket.OPEN) {
250
+ this.socket.send(JSON.stringify({ type: 'broadcast', content }));
251
+ this.logger.debug('WebSocket', `📢 Send broadcast`, { content });
252
+ } else {
253
+ this.logger.error('WebSocket', 'Cannot send broadcast - WebSocket not open');
254
+ }
255
+ }
256
+
257
+ sendMessageInChannel(channel: string, content: any) {
258
+ if (this.socket?.readyState === WebSocket.OPEN) {
259
+ this.socket.send(JSON.stringify({ type: 'statemanagerMessage', subscribedChannel: channel, content }));
260
+ this.logger.debug('WebSocket', `💬 Send message`, { channel, content });
261
+ } else {
262
+ this.logger.error('WebSocket', 'Cannot send message - WebSocket not open');
263
+ }
264
+ }
265
+
266
+ /**
267
+ * Send a message to a specific channel for channel-based messaging
268
+ * This uses the 'message' type which broadcasts to all subscribers in the channel
269
+ */
270
+ sendChannelMessage(channel: string, content: any) {
271
+ if (this.socket?.readyState === WebSocket.OPEN) {
272
+ this.socket.send(JSON.stringify({ type: 'message', subscribedChannel: channel, content }));
273
+ this.logger.debug('WebSocket', `💬 Send channel message`, { channel, content });
274
+ } else {
275
+ this.logger.error('WebSocket', 'Cannot send channel message - WebSocket not open');
276
+ }
277
+ }
278
+
279
+ /**
280
+ * Send a message to multiple channels at once (batch)
281
+ * Sends the new batch format and falls back to legacy per-channel messages for compatibility
282
+ */
283
+ sendChannelMessageToChannels(channels: string[], content: any) {
284
+ if (this.socket?.readyState === WebSocket.OPEN) {
285
+ try {
286
+ // New batch format
287
+ this.socket.send(JSON.stringify({
288
+ type: 'channelMessage',
289
+ channels: channels,
290
+ data: content
291
+ }));
292
+ this.logger.debug('WebSocket', `💬 Send channel message to channels`, { channels, content });
293
+ } catch (error) {
294
+ this.logger.error('WebSocket', 'Failed to send channelMessage batch', error);
295
+ }
296
+
297
+ // Legacy fallback - send individual messages to each channel
298
+ try {
299
+ channels.forEach(channel => {
300
+ this.socket?.send(JSON.stringify({ type: 'message', subscribedChannel: channel, content }));
301
+ });
302
+ } catch (err) {
303
+ this.logger.warn('WebSocket', 'Legacy fallback failed sending individual messages', err);
304
+ }
305
+
306
+ } else {
307
+ this.logger.error('WebSocket', 'Cannot send message to channels - WebSocket not open');
308
+ }
309
+ }
310
+
311
+ sendMessageToUser(user: string, content: any) {
312
+ if (this.socket?.readyState === WebSocket.OPEN) {
313
+ this.socket.send(JSON.stringify({ type: 'userMessage', subscribedChannel: user, content }));
314
+ this.logger.debug('WebSocket', `💬 Send message to user`, { user, content });
315
+ } else {
316
+ this.logger.error('WebSocket', 'Cannot send message to user - WebSocket not open');
317
+ }
318
+ }
319
+
320
+ getAllChannels() {
321
+ if (this.socket?.readyState === WebSocket.OPEN) {
322
+ this.socket.send(JSON.stringify({ type: 'getChannels' }));
323
+ this.logger.debug('WebSocket', '🗂️ Requested list of all channels');
324
+ } else {
325
+ this.logger.error('WebSocket', 'Cannot request channels - WebSocket not open');
326
+ }
327
+ }
328
+
329
+ createChannel(channel: string) {
330
+ if (this.socket?.readyState === WebSocket.OPEN) {
331
+ this.socket.send(JSON.stringify({ type: 'createChannel', content: channel }));
332
+ this.logger.debug('WebSocket', '🗂️ Created channel', { channel });
333
+ } else {
334
+ this.logger.error('WebSocket', 'Cannot create channel - WebSocket not open');
335
+ }
336
+ }
337
+
338
+ deleteChannel(channel: string) {
339
+ if (this.socket?.readyState === WebSocket.OPEN) {
340
+ this.socket.send(JSON.stringify({ type: 'deleteChannel', content: channel }));
341
+ this.logger.debug('WebSocket', '🗂️ Delete channel', { channel });
342
+ } else {
343
+ this.logger.error('WebSocket', 'Cannot delete channel - WebSocket not open');
344
+ }
345
+ }
346
+
347
+ getUsersInChannel(channel: string) {
348
+ if (this.socket?.readyState === WebSocket.OPEN) {
349
+ this.socket.send(JSON.stringify({ type: 'getUsers', subscribedChannel: channel }));
350
+ this.logger.debug('WebSocket', `👥 Requested users in channel`, { channel });
351
+ } else {
352
+ this.logger.error('WebSocket', 'Cannot request users - WebSocket not open');
353
+ }
354
+ }
355
+
356
+ // =====================
357
+ // Notification Channel Methods (MES- prefix)
358
+ // =====================
359
+
360
+ /**
361
+ * Create a notification channel
362
+ */
363
+ createNotificationChannel(channel: string) {
364
+ if (this.socket?.readyState === WebSocket.OPEN) {
365
+ this.socket.send(JSON.stringify({ type: 'createNotificationChannel', content: channel }));
366
+ console.log('📢 Created notification channel:', channel);
367
+ } else {
368
+ console.error('WebSocket is not open. Cannot create notification channel.');
369
+ }
370
+ }
371
+
372
+ /**
373
+ * Get all notification channels (in-memory)
374
+ */
375
+ getNotificationChannels() {
376
+ if (this.socket?.readyState === WebSocket.OPEN) {
377
+ this.socket.send(JSON.stringify({ type: 'getNotificationChannels' }));
378
+ this.logger.debug('WebSocket', '📢 Requested notification channels list');
379
+ } else {
380
+ this.logger.error('WebSocket', 'Cannot request notification channels - WebSocket not open');
381
+ }
382
+ }
383
+
384
+ getTodaysNotificationChannels() {
385
+ if (this.socket?.readyState === WebSocket.OPEN) {
386
+ this.socket.send(JSON.stringify({ type: 'getTodaysNotificationChannels' }));
387
+ this.logger.debug('WebSocket', "📢 Requested today's notification channels from DB");
388
+ } else {
389
+ this.logger.error('WebSocket', "Cannot request today's notification channels - WebSocket not open");
390
+ }
391
+ }
392
+
393
+ subscribeToNotificationChannel(channel: string, options?: { startEpoch?: number; endEpoch?: number }, user?: any) {
394
+ if (this.socket?.readyState === WebSocket.OPEN) {
395
+ this.socket.send(JSON.stringify({
396
+ type: 'subscribeNotifications',
397
+ subscribedChannel: channel,
398
+ content: {
399
+ ...options,
400
+ ...user
401
+ }
402
+ }));
403
+ this.logger.debug('WebSocket', `📢 Subscribed to notification channel`, { channel, options });
404
+ } else {
405
+ this.logger.error('WebSocket', 'Cannot subscribe to notification channel - WebSocket not open');
406
+ }
407
+ }
408
+
409
+ unsubscribeFromNotificationChannel(channel: string) {
410
+ if (this.socket?.readyState === WebSocket.OPEN) {
411
+ this.socket.send(JSON.stringify({
412
+ type: 'unsubscribeNotifications',
413
+ subscribedChannel: channel
414
+ }));
415
+ this.logger.debug('WebSocket', `📢 Unsubscribed from notification channel`, { channel });
416
+ } else {
417
+ this.logger.error('WebSocket', 'Cannot unsubscribe from notification channel - WebSocket not open');
418
+ }
419
+ }
420
+
421
+ sendNotification(channel: string, content: any) {
422
+ if (this.socket?.readyState === WebSocket.OPEN) {
423
+ this.socket.send(JSON.stringify({
424
+ type: 'notification',
425
+ subscribedChannel: channel,
426
+ content
427
+ }));
428
+ this.logger.debug('WebSocket', `📢 Sent notification to channel`, { channel, content });
429
+ } else {
430
+ this.logger.error('WebSocket', 'Cannot send notification - WebSocket not open');
431
+ }
432
+ }
433
+
434
+ }
@@ -0,0 +1 @@
1
+ export * from './websocket-manager.service';