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,119 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { RandomNumber } from '../../../../services/utils/encryption/random';
3
+ import { RetryOptions, DataType, DatabaseStorage } from '../../../../models';
4
+
5
+ import { HTTPManagerStateService, ApiRequest, RequestOptions } from '../../../../services';
6
+
7
+ import { OIDCClient } from '../../models/oidc-client.model';
8
+ import { UserData } from '../../models/user-data.model';
9
+ import { ChannelMessage } from '../../../../services/ws-manager-service/models/channel-message.model';
10
+
11
+ @Injectable({
12
+ providedIn: 'root'
13
+ })
14
+ export class StateDataRequestService extends HTTPManagerStateService<any> {
15
+
16
+ attempts$ = this.wsRetryAttempts$
17
+ nextRetry$ = this.wsNextRetry$
18
+
19
+ path: (string|number)[] = ['ai','tests']
20
+
21
+ constructor() {
22
+ super(
23
+ ApiRequest.adapt({
24
+ server: '',
25
+ retry: RetryOptions.adapt({
26
+ times: 3,
27
+ delay: 1,
28
+ }),
29
+ adapter: OIDCClient.adapt,
30
+ ws: {
31
+ id: ``,
32
+ // wsChannels: ['allChannels'],
33
+ // access: ['read,write,delete,update'],
34
+ wsServer: '',
35
+ jwtToken: '',
36
+ user: UserData.adapt(),
37
+ retry: RetryOptions.adapt({
38
+ times: 3,
39
+ delay: 10,
40
+ }),
41
+ }
42
+ }),
43
+ DataType.ARRAY,
44
+ DatabaseStorage.adapt({
45
+ table: 'ws_demo_data',
46
+ expiresIn: '5mn',
47
+ })
48
+ )
49
+ }
50
+
51
+ updateConnection(
52
+ server: string,
53
+ wsServer: string,
54
+ jwtToken: string,
55
+ user: any,
56
+ path: (string|number)[] = [],
57
+ ) {
58
+
59
+ this.path = path
60
+
61
+ this.setApiRequestOptions({
62
+ server,
63
+ retry: RetryOptions.adapt({
64
+ times: 3,
65
+ delay: 1,
66
+ }),
67
+ adapter: OIDCClient.adapt,
68
+ ws: {
69
+ id: this.path.join('/'),
70
+ wsServer,
71
+ jwtToken,
72
+ user, // general info about user
73
+ retry: RetryOptions.adapt({
74
+ times: 3,
75
+ delay: 10,
76
+ }),
77
+ }
78
+ })
79
+
80
+ }
81
+
82
+ addData() {
83
+
84
+ const num = RandomNumber(1000, 9999)
85
+
86
+ const newData = {
87
+ "spiffe": `sample.com/developer/${num}`,
88
+ "last_name": "boni",
89
+ "email": "mikeboni@hotmail.com",
90
+ "first_name": "mike"
91
+ }
92
+
93
+ this.createRecord(newData, RequestOptions.adapt({ path: this.path }) )
94
+
95
+ }
96
+
97
+ sendMessage(data: ChannelMessage) {
98
+ console.log('sendMessage', data)
99
+ this.wsMessaging(data)
100
+ }
101
+
102
+ getData() {
103
+ this.fetchRecords(RequestOptions.adapt({ path: this.path }) )
104
+ }
105
+
106
+ updateData(data: any) {
107
+ const sampleOptions = RequestOptions.adapt({ path: [...this.path, data.id] })
108
+ console.log('updateData', sampleOptions)
109
+ this.updateRecord(data, sampleOptions)
110
+
111
+ }
112
+
113
+ deleteData(data: any) {
114
+ const sampleOptions = RequestOptions.adapt({ path: [...this.path, data.id] })
115
+ console.log('deleteData', sampleOptions)
116
+ this.deleteRecord(sampleOptions)
117
+ }
118
+
119
+ }
@@ -0,0 +1,16 @@
1
+ import { Component, OnInit } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'app-ws-ai-messaging',
5
+ templateUrl: './ws-ai-messaging.component.html',
6
+ styleUrls: ['./ws-ai-messaging.component.css'],
7
+ standalone: false
8
+ })
9
+ export class WsAiMessagingComponent implements OnInit {
10
+
11
+ constructor() { }
12
+
13
+ ngOnInit() {
14
+ }
15
+
16
+ }
@@ -0,0 +1,16 @@
1
+ import { Component, OnInit } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'app-ws-chats',
5
+ templateUrl: './ws-chats.component.html',
6
+ styleUrls: ['./ws-chats.component.css'],
7
+ standalone: false
8
+ })
9
+ export class WsChatsComponent implements OnInit {
10
+
11
+ constructor() { }
12
+
13
+ ngOnInit() {
14
+ }
15
+
16
+ }
@@ -0,0 +1,31 @@
1
+ /* Highlight the current user chip with the theme primary color */
2
+ .user-chip--primary {
3
+ /* Prefer MDC/Material tokens; fall back to a safe primary */
4
+ background-color: var(--mdc-theme-primary, var(--md-sys-color-primary, #3f51b5)) !important;
5
+ /* Ensure foreground text renders white */
6
+ color: #fff !important;
7
+ /* Also set MDC chip variables where applicable */
8
+ --mdc-evolution-chip-container-color: var(--mdc-theme-primary, var(--md-sys-color-primary, #3f51b5));
9
+ --mdc-evolution-chip-label-text-color: #fff;
10
+ }
11
+
12
+ /* Force inner MDC chip parts to inherit white foreground */
13
+ .user-chip--primary :is(
14
+ .mdc-evolution-chip__text-label,
15
+ .mdc-evolution-chip__action,
16
+ .mdc-evolution-chip__cell,
17
+ .mat-mdc-chip-action-label
18
+ ) {
19
+ color: #fff !important;
20
+ }
21
+
22
+ /* Strong fallback: ensure all descendants render white */
23
+ .user-chip--primary,
24
+ .user-chip--primary * {
25
+ color: #fff !important;
26
+ }
27
+ .box {
28
+ padding: .5rem;
29
+ border: 1px solid rgb(174, 174, 13);
30
+ background-color: rgb(236, 236, 175);
31
+ }
@@ -0,0 +1,94 @@
1
+ @if ((data$ | async); as data) {
2
+ <div style="margin: 1rem;">
3
+ @if ((users$ |async); as users) {
4
+ <div>
5
+ @if (users.length > 0) {
6
+ <h3 style="margin: 0;">Connected Users</h3>
7
+ } @else {
8
+ <h3 style="margin: 0;">No Users</h3>
9
+ }
10
+ <mat-chip-set>
11
+ @for (user of users; track $index) {
12
+ <mat-chip
13
+ [class.user-chip--primary]="isUser(user, (user$ | async))"
14
+ [style.color]="isUser(user, (user$ | async)) ? '#fff' : null"
15
+ [disableRipple]="true"
16
+ >
17
+ {{ user.name || user.ldap || user.id || 'Anonymous' }}
18
+ </mat-chip>
19
+ }
20
+ </mat-chip-set>
21
+ </div>
22
+ }
23
+ <div style="margin-top: 1rem; margin-bottom: 1rem;">
24
+ <mat-divider></mat-divider>
25
+ </div>
26
+
27
+ <div class="box" style="margin-bottom: 1rem;" *ngIf="(userAction$ | async) as userAction">
28
+ {{ userAction?.content?.user?.name }} has {{ userAction?.content?.method }}
29
+ </div>
30
+
31
+ <h3 style="margin: 0;">Data Actions</h3>
32
+ <div style="display: flex; gap: 1rem; margin-bottom: 1rem;">
33
+ <button mat-stroked-button (click)="onGetData()">Get Data</button>
34
+ <div style="flex:1"></div>
35
+ <button mat-stroked-button color="accent" (click)="onUpdateData(data)">Update Data</button>
36
+ <button mat-stroked-button color="warn" (click)="onRemoveData(data)">Remove Data</button>
37
+ <button mat-stroked-button color="primary" (click)="onAddData()">Add Data</button>
38
+ </div>
39
+
40
+ <h3 style="margin: 0; margin-top: 1rem;">WebSocketMessageService Test</h3>
41
+
42
+ <p style="font-size: 0.875rem; color: #666; margin: 0;">
43
+ <strong>Note:</strong> "Fake SessionId" will be received and processed. "Current SessionId" will be filtered out (self-message).
44
+ @if (data.length > 0) {
45
+ <div>
46
+ <table mat-table [dataSource]="data" style="border: 1px solid grey;">
47
+ <ng-container matColumnDef="id">
48
+ <th mat-header-cell *matHeaderCellDef> ID </th>
49
+ <td mat-cell *matCellDef="let element"> {{element.id}} </td>
50
+ </ng-container>
51
+ <ng-container matColumnDef="spiffe">
52
+ <th mat-header-cell *matHeaderCellDef> Spiffe </th>
53
+ <td mat-cell *matCellDef="let element"> {{element.spiffe}} </td>
54
+ </ng-container>
55
+ <ng-container matColumnDef="name">
56
+ <th mat-header-cell *matHeaderCellDef> Name </th>
57
+ <td mat-cell *matCellDef="let element"> {{element.first_name}} {{element.last_name}}</td>
58
+ </ng-container>
59
+ <ng-container matColumnDef="email">
60
+ <th mat-header-cell *matHeaderCellDef> Email </th>
61
+ <td mat-cell *matCellDef="let element"> {{element.email}} </td>
62
+ </ng-container>
63
+ <tr mat-header-row *matHeaderRowDef="['id', 'spiffe', 'name', 'email']"></tr>
64
+ <tr mat-row *matRowDef="let row; columns: ['id', 'spiffe', 'name', 'email'];"></tr>
65
+ </table>
66
+ <div style="border: 1px solid grey; padding: .5rem; border-top: none;">
67
+ <h3 style="margin: 0;">Total Records {{ data.length }}</h3>
68
+ </div>
69
+ </div>
70
+ } @else {
71
+ <div style="margin-top: 1rem; font-style: italic;">
72
+ No Data Available
73
+ </div>
74
+ }
75
+
76
+ <div style="margin-bottom: 1rem; margin-top: 1rem;">
77
+ <mat-divider></mat-divider>
78
+ </div>
79
+
80
+ <div style="display: flex; gap: 0.5rem; margin-bottom: 1rem;">
81
+ <button mat-flat-button color="primary" (click)="onTestDirectStateMessage(63, true)">
82
+ Test UPDATE (Fake Id)
83
+ </button>
84
+ <button mat-stroked-button (click)="onTestDirectStateMessage(63, false)">
85
+ Test UPDATE (Current Id)
86
+ </button>
87
+ <button mat-stroked-button (click)="onTestDirectStateMessage(63, false, 'custom-session-123')">
88
+ Test UPDATE (Custom Id)
89
+ </button>
90
+ </div>
91
+
92
+ </div>
93
+ }
94
+
@@ -0,0 +1,41 @@
1
+ .user-chip--primary {
2
+ background-color: var(--mdc-theme-primary, var(--md-sys-color-primary, #3f51b5)) !important;
3
+ color: #fff !important;
4
+ --mdc-evolution-chip-container-color: var(--mdc-theme-primary, var(--md-sys-color-primary, #3f51b5));
5
+ --mdc-evolution-chip-label-text-color: #fff;
6
+ }
7
+
8
+ .user-chip--primary :is(
9
+ .mdc-evolution-chip__text-label,
10
+ .mdc-evolution-chip__action,
11
+ .mdc-evolution-chip__cell,
12
+ .mat-mdc-chip-action-label
13
+ ) {
14
+ color: #fff !important;
15
+ }
16
+
17
+ .user-chip--primary,
18
+ .user-chip--primary * {
19
+ color: #fff !important;
20
+ }
21
+
22
+ :host ::ng-deep .user-chip--primary {
23
+ background-color: var(--mdc-theme-primary, var(--md-sys-color-primary, #3f51b5)) !important;
24
+ color: #fff !important;
25
+ --mdc-evolution-chip-container-color: var(--mdc-theme-primary, var(--md-sys-color-primary, #3f51b5));
26
+ --mdc-evolution-chip-label-text-color: #fff;
27
+
28
+ .mdc-evolution-chip__text-label,
29
+ .mdc-evolution-chip__action,
30
+ .mdc-evolution-chip__cell,
31
+ .mat-mdc-chip-action-label,
32
+ * {
33
+ color: #fff !important;
34
+ }
35
+ }
36
+
37
+ .box {
38
+ padding: .5rem;
39
+ border: 1px solid rgb(174, 174, 13);
40
+ background-color: rgb(236, 236, 175);
41
+ }
@@ -0,0 +1,203 @@
1
+ import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing';
2
+ import { WsDataControlComponent } from './ws-data-control.component';
3
+ import { StateDataRequestService } from '../services/state-data-request.service';
4
+ import { BehaviorSubject } from 'rxjs';
5
+ import { MatChipsModule } from '@angular/material/chips';
6
+ import { MatTableModule } from '@angular/material/table';
7
+ import { MatButtonModule } from '@angular/material/button';
8
+ import { MatDividerModule } from '@angular/material/divider';
9
+ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
10
+ import { CommonModule } from '@angular/common';
11
+
12
+ describe('WsDataControlComponent', () => {
13
+ let component: WsDataControlComponent;
14
+ let fixture: ComponentFixture<WsDataControlComponent>;
15
+
16
+ // Mock Data
17
+ const mockUser = { sessionId: 'session-123', name: 'Mike Boni' };
18
+ const mockUsers = [mockUser, { sessionId: 'session-456', name: 'Other User' }];
19
+ const mockData = [
20
+ { id: 1, spiffe: 'wavecoders.com/developer/1111', first_name: 'John', last_name: 'Doe', email: 'john@test.com' },
21
+ { id: 63, spiffe: 'wavecoders.com/developer/2222', first_name: 'mike', last_name: 'boni', email: 'mikeboni@hotmail.com' }
22
+ ];
23
+ const mockAction = { content: { user: mockUser, method: 'updated data' } };
24
+
25
+ // Subjects to control the observables in the mock service
26
+ const userSubject = new BehaviorSubject<any>(mockUser);
27
+ const usersSubject = new BehaviorSubject<any[]>(mockUsers);
28
+ const userActionSubject = new BehaviorSubject<any>(mockAction);
29
+ const dataSubject = new BehaviorSubject<any[]>(mockData);
30
+
31
+ // Mock Service Class
32
+ class MockStateDataRequestService {
33
+ user$ = userSubject.asObservable();
34
+ userList$ = usersSubject.asObservable();
35
+ userAction$ = userActionSubject.asObservable();
36
+ data$ = dataSubject.asObservable();
37
+
38
+ updateConnection(server: string, wsServer: string, jwtToken: string, user: any, path: (string|number)[]) {}
39
+ getData() {}
40
+ addData() {}
41
+ updateData(data: any) {}
42
+ deleteData(data: any) {}
43
+ }
44
+
45
+ let mockServiceInstance: MockStateDataRequestService;
46
+
47
+ beforeEach(async () => {
48
+ // Ensure mock data is available immediately
49
+ dataSubject.next(mockData);
50
+ userSubject.next(mockUser);
51
+ usersSubject.next(mockUsers);
52
+ userActionSubject.next(mockAction);
53
+
54
+ // Create mock service instance
55
+ mockServiceInstance = new MockStateDataRequestService();
56
+
57
+ // Spy on methods
58
+ spyOn(mockServiceInstance, 'updateConnection');
59
+ spyOn(mockServiceInstance, 'getData');
60
+ spyOn(mockServiceInstance, 'addData');
61
+ spyOn(mockServiceInstance, 'updateData');
62
+ spyOn(mockServiceInstance, 'deleteData');
63
+
64
+ await TestBed.configureTestingModule({
65
+ declarations: [WsDataControlComponent],
66
+ imports: [
67
+ CommonModule,
68
+ MatChipsModule,
69
+ MatTableModule,
70
+ MatButtonModule,
71
+ MatDividerModule,
72
+ NoopAnimationsModule
73
+ ],
74
+ providers: [
75
+ { provide: StateDataRequestService, useValue: mockServiceInstance }
76
+ ]
77
+ }).compileComponents();
78
+
79
+ fixture = TestBed.createComponent(WsDataControlComponent);
80
+ component = fixture.componentInstance;
81
+
82
+ // Set required @Input properties
83
+ component.server = 'http://api.test.com';
84
+ component.wsServer = 'ws://ws.test.com';
85
+ component.jwtToken = 'mock-jwt-token';
86
+ component.user = mockUser;
87
+ component.path = ['ai', 'tests'];
88
+
89
+ // Ensure initial data is available for table rendering test
90
+ fixture.detectChanges();
91
+ });
92
+
93
+ it('should create the component', () => {
94
+ expect(component).toBeTruthy();
95
+ });
96
+
97
+ it('should call updateConnection and getData during initialization', () => {
98
+ expect(mockServiceInstance.updateConnection).toHaveBeenCalledWith(
99
+ component.server,
100
+ component.wsServer,
101
+ component.jwtToken,
102
+ component.user,
103
+ component.path
104
+ );
105
+ expect(mockServiceInstance.getData).toHaveBeenCalled();
106
+ });
107
+
108
+ it('should call getData when onGetData is triggered', () => {
109
+ component.onGetData();
110
+ // once during init, once during manual call
111
+ expect(mockServiceInstance.getData).toHaveBeenCalledTimes(2);
112
+ });
113
+
114
+ it('should call addData when onAddData is triggered', () => {
115
+ component.onAddData();
116
+ expect(mockServiceInstance.addData).toHaveBeenCalled();
117
+ });
118
+
119
+ it('should call updateData with generated random spiffe when onUpdateData is triggered', () => {
120
+ // Call the method - we can't easily mock RandomNumber, so we just verify updateData is called
121
+ component.onUpdateData(mockData);
122
+
123
+ expect(mockServiceInstance.updateData).toHaveBeenCalled();
124
+
125
+ // Verify the data structure passed to updateData
126
+ const callArgs = (mockServiceInstance.updateData as any).calls.mostRecent().args[0];
127
+ expect(callArgs).toBeDefined();
128
+ expect(callArgs.spiffe).toBeDefined();
129
+ expect(callArgs.spiffe).toMatch(/^wavecoders\.com\/developer\/\d{4,5}$/);
130
+ expect(callArgs.id).toBe(63);
131
+ expect(callArgs.first_name).toBe('mike');
132
+ expect(callArgs.last_name).toBe('boni');
133
+ expect(callArgs.email).toBe('mikeboni@hotmail.com');
134
+ });
135
+
136
+ it('should call deleteData with the last record when onRemoveData is triggered', () => {
137
+ component.onRemoveData(mockData);
138
+ const lastRecord = mockData[mockData.length - 1];
139
+ expect(mockServiceInstance.deleteData).toHaveBeenCalledWith(lastRecord);
140
+ });
141
+
142
+ it('should correctly verify if a user is the current user via isUser', () => {
143
+ const userA = { sessionId: 'AAA' };
144
+ const userB = { sessionId: 'AAA' };
145
+ const userC = { sessionId: 'CCC' };
146
+
147
+ expect(component.isUser(userA, userB)).toBeTrue();
148
+ expect(component.isUser(userA, userC)).toBeFalse();
149
+ });
150
+
151
+ it('should handle userAction$ timing logic (reset after 3 seconds)', fakeAsync(() => {
152
+ let currentAction: any;
153
+ const sub = component.userAction$.subscribe(val => currentAction = val);
154
+
155
+ // 1. Initial state (from BehaviorSubject)
156
+ expect(currentAction).toEqual(mockAction);
157
+
158
+ // 2. Push new action
159
+ const newAction = { content: { user: mockUser, method: 'added data' } };
160
+ userActionSubject.next(newAction);
161
+ tick(); // process the pipe
162
+ expect(currentAction).toEqual(newAction);
163
+
164
+ // 3. Wait 3 seconds
165
+ tick(3000);
166
+ expect(currentAction).toBeNull();
167
+
168
+ sub.unsubscribe();
169
+ }));
170
+
171
+ it('should render the table when data is available', fakeAsync(() => {
172
+ // Initial setup
173
+ fixture.detectChanges();
174
+ tick();
175
+
176
+ const compiled = fixture.nativeElement as HTMLElement;
177
+
178
+ // Multiple rounds of change detection to ensure async pipes resolve
179
+ for (let i = 0; i < 3; i++) {
180
+ fixture.detectChanges();
181
+ tick();
182
+ }
183
+
184
+ const table = compiled.querySelector('table');
185
+ expect(table).toBeTruthy();
186
+
187
+ // Give Angular Material table more time to render
188
+ fixture.detectChanges();
189
+ tick();
190
+
191
+ // Check for table rows (header + data rows)
192
+ const rows = compiled.querySelectorAll('tr');
193
+ expect(rows.length).toBeGreaterThan(1);
194
+ }));
195
+
196
+ it('should display "No Data Available" when data list is empty', () => {
197
+ dataSubject.next([]);
198
+ fixture.detectChanges();
199
+
200
+ const compiled = fixture.nativeElement as HTMLElement;
201
+ expect(compiled.textContent).toContain('No Data Available');
202
+ });
203
+ });
@@ -0,0 +1,144 @@
1
+ import { Component, inject, Input, OnInit } from '@angular/core';
2
+ import { RandomNumber } from '../../../../services/utils/encryption/random';
3
+
4
+ import { StateDataRequestService } from '../services/state-data-request.service';
5
+ import { switchMap, timer, map, startWith } from 'rxjs';
6
+ import { WebSocketMessageService } from '../../../../services/ws-manager-service/services/websocket-message.service';
7
+ import { StateMessage } from '../../../../services/ws-manager-service/models/state-message.model';
8
+
9
+ @Component({
10
+ selector: 'app-ws-data-control',
11
+ templateUrl: './ws-data-control.component.html',
12
+ styleUrls: ['./ws-data-control.component.scss'],
13
+ standalone: false
14
+ })
15
+ export class WsDataControlComponent implements OnInit {
16
+
17
+ @Input() server!: string;
18
+ @Input() wsServer!: string;
19
+ @Input() jwtToken!: string;
20
+ @Input() user!: any;
21
+ @Input() path: (string|number)[] = ['ai','tests'];
22
+
23
+ stateDataRequestService = inject(StateDataRequestService)
24
+ webSocketMessageService = inject(WebSocketMessageService)
25
+
26
+ user$ = this.stateDataRequestService.user$
27
+ users$ = this.stateDataRequestService.userList$
28
+
29
+ userAction$ = this.stateDataRequestService.userAction$
30
+ .pipe(
31
+ switchMap((action) =>
32
+ timer(3 * 1000).pipe(
33
+ map(() => null),
34
+ startWith(action)
35
+ )
36
+ )
37
+ );
38
+
39
+ data$ = this.stateDataRequestService.data$;
40
+
41
+ isUser = (user: any, userItem: any) => {
42
+ return user.sessionId === userItem.sessionId
43
+ }
44
+
45
+ ngOnInit() {
46
+ this.stateDataRequestService.updateConnection(this.server, this.wsServer, this.jwtToken, this.user, this.path);
47
+ this.stateDataRequestService.getData()
48
+ }
49
+
50
+ onGetData() {
51
+ this.stateDataRequestService.getData()
52
+ }
53
+
54
+ onAddData() {
55
+ this.stateDataRequestService.addData()
56
+ }
57
+
58
+ onUpdateData(data: any[]) {
59
+
60
+ const num = RandomNumber(1000, 9999)
61
+
62
+ const newData = {
63
+ "spiffe": `wavecoders.com/developer/${num}`,
64
+ "id": 63,
65
+ "last_name": "boni",
66
+ "email": "mikeboni@hotmail.com",
67
+ "first_name": "mike"
68
+ }
69
+
70
+ this.stateDataRequestService.updateData(newData)
71
+
72
+ }
73
+
74
+ onRemoveData(data: any) {
75
+ const lastRec = data[data.length -1]
76
+ this.stateDataRequestService.deleteData(lastRec)
77
+ }
78
+
79
+ /**
80
+ * Test direct state message via WebSocketMessageService
81
+ * Sends an UPDATE message that should trigger fetchRecord() in the state manager
82
+ *
83
+ * @param recordId - The record ID to update (default: 63)
84
+ * @param useFakeSessionId - If true, uses a fake sessionId to avoid filtering (default: true)
85
+ * @param customSessionId - Optional custom sessionId (overrides useFakeSessionId if provided)
86
+ */
87
+ onTestDirectStateMessage(recordId: number = 63, useFakeSessionId: boolean = true, customSessionId?: string) {
88
+ // Get actual sessionId from sessionStorage (stored by HTTPManagerStateService)
89
+ const actualSessionId = sessionStorage.getItem('WSID') || 'unknown';
90
+
91
+ // Determine sessionId to use
92
+ let sessionId: string;
93
+ if (customSessionId) {
94
+ sessionId = customSessionId;
95
+ } else if (useFakeSessionId) {
96
+ sessionId = `test-${Date.now()}`;
97
+ } else {
98
+ // Use actual sessionId (will be filtered out by receiver)
99
+ sessionId = actualSessionId;
100
+ }
101
+
102
+ // Build StateMessage with same structure as CRUD operations
103
+ const stateMessage: StateMessage = {
104
+ sessionId: {
105
+ id: sessionId,
106
+ name: useFakeSessionId ? 'Test Sender' : (this.user?.name || 'Current User')
107
+ },
108
+ content: {
109
+ method: 'UPDATE',
110
+ path: ['ai', 'tests', recordId],
111
+ user: {
112
+ id: sessionId,
113
+ name: useFakeSessionId ? 'Test Sender' : (this.user?.name || 'Current User')
114
+ }
115
+ }
116
+ };
117
+
118
+ console.log('🧪 [TEST] Sending direct state message:', {
119
+ recordId,
120
+ sessionId,
121
+ actualSessionId,
122
+ useFakeSessionId,
123
+ stateMessage
124
+ });
125
+
126
+ const success = this.webSocketMessageService.sendStateMessage(
127
+ ['ai', 'tests'],
128
+ stateMessage
129
+ );
130
+
131
+ console.log('🧪 [TEST] Message sent:', {
132
+ success,
133
+ actualSessionId,
134
+ sentSessionId: sessionId,
135
+ expectedBehavior: success
136
+ ? 'Server will broadcast to SYS-ai/tests subscribers'
137
+ : 'Failed to send (check connection)',
138
+ receiverBehavior: sessionId !== actualSessionId
139
+ ? 'Receiver will process message and call fetchRecord()'
140
+ : 'Receiver will filter out (sessionId match)'
141
+ });
142
+ }
143
+
144
+ }