http-request-manager 18.15.33 → 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 (300) hide show
  1. package/TEST_COVERAGE_SUMMARY.md +458 -0
  2. package/ng-package.json +8 -0
  3. package/package.json +4 -13
  4. package/src/docs/ADVANCED_WEBSOCKET.md +633 -0
  5. package/src/docs/ARCHITECTURE.md +633 -0
  6. package/src/docs/BATCH_REQUEST_README.md +467 -0
  7. package/src/docs/COMPLETE_API_REFERENCE.md +1037 -0
  8. package/src/docs/DATABASE_README.md +1195 -0
  9. package/src/docs/ENCRYPTION_README.md +403 -0
  10. package/src/docs/HTTP_MANAGER_README.md +628 -0
  11. package/src/docs/HTTP_SINGNALS_MANAGER_README.md +654 -0
  12. package/src/docs/HTTP_STATE_MANAGER_README.md +1391 -0
  13. package/src/docs/INTERCEPTOR_README.md +549 -0
  14. package/src/docs/LOCAL_STORAGE_README.md +1056 -0
  15. package/src/docs/LOCAL_STORAGE_SIGNALS_README.md +338 -0
  16. package/src/docs/LOGGER_README.md +310 -0
  17. package/src/docs/MESSAGE_TRACKER_README.md +518 -0
  18. package/src/docs/MESSAGE_TRACKER_SIGNALS_README.md +563 -0
  19. package/src/docs/MODELS_README.md +1264 -0
  20. package/src/docs/SIGNAL_SERVICES_README.md +238 -0
  21. package/src/docs/SQL_DIXIE_README.md +574 -0
  22. package/src/docs/STORE_STATE_MANAGER_README.md +556 -0
  23. package/src/docs/STORE_STATE_SIGNALS_README.md +600 -0
  24. package/src/docs/UPLOAD_REQUEST_README.md +324 -0
  25. package/src/docs/UTILS_README.md +1604 -0
  26. package/src/docs/WEBSOCKET_MESSAGE_SERVICE.md +799 -0
  27. package/src/docs/WEBSOCKET_SIGNALS_README.md +641 -0
  28. package/src/docs/WEBSOCKET_SINGLETON_REFACTORING.md +201 -0
  29. package/src/docs/WS_MANAGER_README.md +613 -0
  30. package/src/lib/http-request-manager.module.ts +147 -0
  31. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +116 -0
  32. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  33. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +255 -0
  34. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +123 -0
  35. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  36. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +53 -0
  37. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  38. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  39. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +208 -0
  40. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
  41. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
  42. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +214 -0
  43. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.html +53 -0
  44. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.scss +60 -0
  45. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.ts +72 -0
  46. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-download.module.ts +28 -0
  47. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.html +10 -0
  48. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.scss +29 -0
  49. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.ts +100 -0
  50. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/models/download-labels-model.ts +22 -0
  51. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.html +8 -0
  52. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.scss +19 -0
  53. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.ts +26 -0
  54. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app-session.model.ts +30 -0
  55. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app.model.ts +19 -0
  56. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/get-sample.model.ts +25 -0
  57. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-ai-prompt.ts +19 -0
  58. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-details.ts +24 -0
  59. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-info.ts +30 -0
  60. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client.model.ts +49 -0
  61. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-mapper-client-info.ts +33 -0
  62. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.html +279 -0
  63. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.scss +24 -0
  64. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.ts +461 -0
  65. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  66. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  67. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  68. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  69. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  70. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  71. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  72. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  73. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  74. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  75. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  76. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  77. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  78. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  79. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  80. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  81. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  82. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  83. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  84. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +622 -0
  85. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +106 -0
  86. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +687 -0
  87. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +418 -0
  88. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  89. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +576 -0
  90. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +89 -0
  91. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +119 -0
  92. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
  93. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
  94. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
  95. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
  96. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
  97. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
  98. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
  99. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +94 -0
  100. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
  101. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +203 -0
  102. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +144 -0
  103. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
  104. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +102 -0
  105. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +40 -0
  106. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +230 -0
  107. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
  108. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
  109. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
  110. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
  111. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
  112. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
  113. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
  114. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
  115. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +40 -0
  116. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
  117. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/jwt-token.service.ts +62 -0
  118. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
  119. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
  120. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +168 -0
  121. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  122. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  123. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  124. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
  125. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
  126. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  127. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  128. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  129. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  130. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  131. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  132. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
  133. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
  134. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
  135. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
  136. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
  137. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
  138. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
  139. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
  140. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
  141. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
  142. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
  143. package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
  144. package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +49 -0
  145. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
  146. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
  147. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
  148. package/src/lib/http-request-services-demo/store-state-signals-demo/store-state-signals-demo.component.ts +161 -0
  149. package/src/lib/http-request-services-demo/upload-demo/models/index.ts +1 -0
  150. package/src/lib/http-request-services-demo/upload-demo/models/upload-state.model.ts +30 -0
  151. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.html +89 -0
  152. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.scss +160 -0
  153. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.spec.ts +101 -0
  154. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.ts +136 -0
  155. package/src/lib/index.ts +3 -0
  156. package/src/lib/interceptors/credentials.interceptor.ts +16 -0
  157. package/src/lib/interceptors/index.ts +6 -0
  158. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  159. package/src/lib/interceptors/models/index.ts +2 -0
  160. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  161. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  162. package/src/lib/interceptors/request-header.interceptor.ts +56 -0
  163. package/src/lib/message-display/README.md +509 -0
  164. package/src/lib/message-display/index.ts +4 -0
  165. package/src/lib/message-display/models/action.model.ts +27 -0
  166. package/src/lib/message-display/models/communication-message.model.ts +77 -0
  167. package/src/lib/message-display/models/display-config.model.ts +35 -0
  168. package/src/lib/message-display/models/display-rule.interface.ts +28 -0
  169. package/src/lib/message-display/models/display-strategy.interface.ts +8 -0
  170. package/src/lib/message-display/models/index.ts +6 -0
  171. package/src/lib/message-display/models/slide.model.ts +24 -0
  172. package/src/lib/message-display/rules/default-display-rules.ts +35 -0
  173. package/src/lib/message-display/services/message-display-router.service.ts +63 -0
  174. package/src/lib/message-display/strategies/snackbar.strategy.ts +46 -0
  175. package/src/lib/models/batch-options.model.ts +33 -0
  176. package/src/lib/models/batch-progress.model.ts +19 -0
  177. package/src/lib/models/batch-request-state.model.ts +40 -0
  178. package/src/lib/models/batch-result.model.ts +30 -0
  179. package/src/lib/models/config-http-options.model.ts +45 -0
  180. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  181. package/src/lib/models/config-options.model.ts +27 -0
  182. package/src/lib/models/config-token.model.ts +9 -0
  183. package/src/lib/models/data-type.enum.ts +5 -0
  184. package/src/lib/models/database-storage.model.ts +24 -0
  185. package/src/lib/models/index.ts +16 -0
  186. package/src/lib/models/retry-options.model.ts +22 -0
  187. package/src/lib/models/upload-validation-error.model.ts +46 -0
  188. package/src/lib/services/SQL-DixieJS service/dexie-query-executor.ts +246 -0
  189. package/src/lib/services/SQL-DixieJS service/dexie-sql.service.ts +31 -0
  190. package/src/lib/services/SQL-DixieJS service/index.ts +4 -0
  191. package/src/lib/services/SQL-DixieJS service/models/execution-plan.model.ts +52 -0
  192. package/src/lib/services/SQL-DixieJS service/models/index.ts +3 -0
  193. package/src/lib/services/SQL-DixieJS service/models/sql-errors.model.ts +13 -0
  194. package/src/lib/services/SQL-DixieJS service/models/sql-options.model.ts +3 -0
  195. package/src/lib/services/SQL-DixieJS service/query-planner.ts +284 -0
  196. package/src/lib/services/SQL-DixieJS service/schema-validator.ts +217 -0
  197. package/src/lib/services/SQL-DixieJS service/sql-parser.ts +35 -0
  198. package/src/lib/services/database-manager-service/database.manager.service.ts +384 -0
  199. package/src/lib/services/database-manager-service/db.storage.service.ts +240 -0
  200. package/src/lib/services/database-manager-service/index.ts +4 -0
  201. package/src/lib/services/database-manager-service/models/index.ts +2 -0
  202. package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
  203. package/src/lib/services/index.ts +20 -0
  204. package/src/lib/services/local-storage-manager-service/index.ts +4 -0
  205. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  206. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +567 -0
  207. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
  208. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +437 -0
  209. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  210. package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
  211. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
  212. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  213. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
  214. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  215. package/src/lib/services/request-manager-services/README.md +282 -0
  216. package/src/lib/services/request-manager-services/http-manager-signals.service.ts +674 -0
  217. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +353 -0
  218. package/src/lib/services/request-manager-services/http-manager.service.ts +727 -0
  219. package/src/lib/services/request-manager-services/index.ts +8 -0
  220. package/src/lib/services/request-manager-services/request-signals.service.ts +372 -0
  221. package/src/lib/services/request-manager-services/request.service.ts +435 -0
  222. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  223. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  224. package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
  225. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
  226. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +468 -0
  227. package/src/lib/services/request-manager-state-service/http-manager-state.store.spec.ts +665 -0
  228. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +2395 -0
  229. package/src/lib/services/request-manager-state-service/index.ts +3 -0
  230. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +86 -0
  231. package/src/lib/services/request-manager-state-service/models/index.ts +14 -0
  232. package/src/lib/services/request-manager-state-service/models/operation-result.model.ts +18 -0
  233. package/src/lib/services/request-manager-state-service/models/parsing-result.model.ts +21 -0
  234. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +37 -0
  235. package/src/lib/services/request-manager-state-service/models/stream-config.model.ts +20 -0
  236. package/src/lib/services/request-manager-state-service/models/stream-event-metadata.model.ts +23 -0
  237. package/src/lib/services/request-manager-state-service/models/stream-event.model.ts +23 -0
  238. package/src/lib/services/request-manager-state-service/models/stream-output.model.ts +23 -0
  239. package/src/lib/services/request-manager-state-service/models/stream-progress.model.ts +24 -0
  240. package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
  241. package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +42 -0
  242. package/src/lib/services/store-state-manager-service/index.ts +4 -0
  243. package/src/lib/services/store-state-manager-service/models/index.ts +3 -0
  244. package/src/lib/services/store-state-manager-service/models/state-operation-result.model.ts +30 -0
  245. package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
  246. package/src/lib/services/store-state-manager-service/store-state-manager-signals.service.ts +169 -0
  247. package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +153 -0
  248. package/src/lib/services/utils/app.service.spec.ts +25 -0
  249. package/src/lib/services/utils/app.service.ts +21 -0
  250. package/src/lib/services/utils/encryption/README.md +79 -0
  251. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  252. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  253. package/src/lib/services/utils/encryption/index.ts +5 -0
  254. package/src/lib/services/utils/encryption/random.ts +81 -0
  255. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +106 -0
  256. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  257. package/src/lib/services/utils/headers.service.ts +18 -0
  258. package/src/lib/services/utils/index.ts +9 -0
  259. package/src/lib/services/utils/logger.service.ts +90 -0
  260. package/src/lib/services/utils/models/index.ts +4 -0
  261. package/src/lib/services/utils/models/normalized-request-options.model.ts +24 -0
  262. package/src/lib/services/utils/models/path-tracker-state.model.ts +20 -0
  263. package/src/lib/services/utils/models/query-params-tracker-options.model.ts +24 -0
  264. package/src/lib/services/utils/models/query-tracker-state.model.ts +23 -0
  265. package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
  266. package/src/lib/services/utils/object-merger.service.ts +78 -0
  267. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  268. package/src/lib/services/utils/path-query.service.ts +69 -0
  269. package/src/lib/services/utils/query-params-tracker.service.ts +442 -0
  270. package/src/lib/services/utils/random-color.utils.ts +83 -0
  271. package/src/lib/services/utils/utils.service.spec.ts +165 -0
  272. package/src/lib/services/utils/utils.service.ts +192 -0
  273. package/src/lib/services/ws-manager-service/index.ts +13 -0
  274. package/src/lib/services/ws-manager-service/message-tracker-signals.service.ts +147 -0
  275. package/src/lib/services/ws-manager-service/message-tracker.service.ts +477 -0
  276. package/src/lib/services/ws-manager-service/models/channel-info.model.ts +29 -0
  277. package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
  278. package/src/lib/services/ws-manager-service/models/channel-message.model.ts +36 -0
  279. package/src/lib/services/ws-manager-service/models/channel-type.enum.ts +6 -0
  280. package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
  281. package/src/lib/services/ws-manager-service/models/index.ts +10 -0
  282. package/src/lib/services/ws-manager-service/models/notification-message.model.ts +29 -0
  283. package/src/lib/services/ws-manager-service/models/public-message.model.ts +18 -0
  284. package/src/lib/services/ws-manager-service/models/state-message.model.ts +18 -0
  285. package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
  286. package/src/lib/services/ws-manager-service/services/index.ts +4 -0
  287. package/src/lib/services/ws-manager-service/services/websocket-message.service.ts +129 -0
  288. package/src/lib/services/ws-manager-service/services/websocket.service.ts +434 -0
  289. package/src/lib/services/ws-manager-service/websocket-service/index.ts +1 -0
  290. package/src/lib/services/ws-manager-service/websocket-service/websocket-manager.service.ts +716 -0
  291. package/src/lib/services/ws-manager-service/websocket-services-complete.spec.ts +596 -0
  292. package/src/lib/services/ws-manager-service/websocket-signals-manager.service.ts +141 -0
  293. package/src/public-api.ts +19 -0
  294. package/tsconfig.lib.json +34 -0
  295. package/tsconfig.lib.prod.json +10 -0
  296. package/tsconfig.spec.json +14 -0
  297. package/fesm2022/http-request-manager.mjs +0 -13688
  298. package/fesm2022/http-request-manager.mjs.map +0 -1
  299. package/http-request-manager-18.15.33.tgz +0 -0
  300. package/types/http-request-manager.d.ts +0 -3968
@@ -0,0 +1,674 @@
1
+ import { Inject, inject, Injectable, Injector, Optional, signal } from '@angular/core';
2
+ import { HttpErrorResponse } from '@angular/common/http';
3
+ import { Observable, Subject, throwError, from, of } from 'rxjs';
4
+ import { tap, map, finalize, catchError, concatMap, mergeMap, toArray, concat } from 'rxjs/operators';
5
+
6
+ import { ApiRequest } from '../request-manager-state-service/models/api-request.model';
7
+ import { RequestSignalsService } from './request-signals.service';
8
+ import { requestPolling, countdown, delayedRetry } from './rxjs-operators';
9
+
10
+ import { ToastColors, ToastDisplay, ToastMessageDisplayService } from 'toast-message-display';
11
+ import { CONFIG_SETTINGS_TOKEN } from '../../models/config-token.model';
12
+ import { ConfigOptions, BatchOptions, BatchResult, BatchRequestState } from '../../models';
13
+ import { ObjectMergerService } from '../utils/object-merger.service';
14
+ import { WebSocketManagerService } from '../ws-manager-service/websocket-service';
15
+ import { MessageTrackerService } from '../ws-manager-service/message-tracker.service';
16
+
17
+ @Injectable({
18
+ providedIn: 'root',
19
+ })
20
+ export class HTTPManagerSignalsService<T> extends RequestSignalsService {
21
+
22
+ toastMessage = inject(ToastMessageDisplayService);
23
+ ng_injector = inject(Injector);
24
+ objectMergerService = inject(ObjectMergerService);
25
+ wsManager = inject(WebSocketManagerService);
26
+ messageTracker = inject(MessageTrackerService);
27
+
28
+ // Delegate WebSocket observables to WebSocketManagerService (singleton)
29
+ override connectionStatus$ = this.wsManager.connectionStatus$;
30
+ override messages$ = this.messageTracker.messages$;
31
+ override subscribedChannels$ = this.wsManager.subscribedChannels$;
32
+
33
+ // ✅ Replaced BehaviorSubjects with Angular signals
34
+ countdown = signal<number>(0);
35
+ error = signal<string | boolean>(false);
36
+ data = signal<any>(null);
37
+
38
+ private polling$ = new Subject<void>();
39
+
40
+ config = ApiRequest.adapt();
41
+
42
+ constructor(@Optional() @Inject(CONFIG_SETTINGS_TOKEN) private configOptions?: ConfigOptions) {
43
+ super();
44
+ this.config = configOptions
45
+ ? ApiRequest.adapt(configOptions.httpRequestOptions)
46
+ : this.config;
47
+ }
48
+
49
+ // ═══════════════════════════════════════════════════════════════════════════
50
+ // WEBSOCKET METHODS (Delegated to WebSocketManagerService singleton)
51
+ // ═══════════════════════════════════════════════════════════════════════════
52
+
53
+ /**
54
+ * Connect to WebSocket server
55
+ */
56
+ override connect(options: any, jwtToken: string): void {
57
+ this.wsManager.connect(options, jwtToken);
58
+ }
59
+
60
+ /**
61
+ * Disconnect from WebSocket server
62
+ */
63
+ override disconnect(): void {
64
+ this.wsManager.disconnect();
65
+ }
66
+
67
+ /**
68
+ * Subscribe to a channel
69
+ */
70
+ override subscribeToChannel(channel: string, userData?: any): void {
71
+ this.messageTracker.subscribeToChannel(channel, userData);
72
+ }
73
+
74
+ /**
75
+ * Subscribe to multiple channels
76
+ */
77
+ override subscribeToChannels(channels: string[], userData?: any): void {
78
+ channels.forEach(channel => this.messageTracker.subscribeToChannel(channel, userData));
79
+ }
80
+
81
+ /**
82
+ * Unsubscribe from a channel
83
+ */
84
+ override unsubscribeFromChannel(channel: string): void {
85
+ this.wsManager.unsubscribeFromChannel(channel);
86
+ }
87
+
88
+ /**
89
+ * Get currently subscribed channels
90
+ */
91
+ override getSubscribedChannels(): Set<string> {
92
+ return this.wsManager.getSubscribedChannels();
93
+ }
94
+
95
+ /**
96
+ * Send broadcast message
97
+ */
98
+ override sendBroadcast(content: any): void {
99
+ this.wsManager.sendBroadcast(content);
100
+ }
101
+
102
+ /**
103
+ * Send message in channel (state manager message)
104
+ */
105
+ override sendMessageInChannel(channel: string, content: any): void {
106
+ this.wsManager.sendMessageInChannel(channel, content);
107
+ }
108
+
109
+ /**
110
+ * Send channel message
111
+ */
112
+ override sendChannelMessage(channel: string, content: any): void {
113
+ this.wsManager.sendChannelMessage(channel, content);
114
+ }
115
+
116
+ /**
117
+ * Send message to multiple channels
118
+ */
119
+ override sendChannelMessageToChannels(channels: string[], content: any): void {
120
+ this.wsManager.sendChannelMessageToChannels(channels, content);
121
+ }
122
+
123
+ /**
124
+ * Send message to user
125
+ */
126
+ override sendMessageToUser(user: string, content: any): void {
127
+ this.wsManager.sendMessageToUser(user, content);
128
+ }
129
+
130
+ /**
131
+ * Get all channels
132
+ */
133
+ override getAllChannels(): void {
134
+ this.wsManager.getAllChannels();
135
+ }
136
+
137
+ /**
138
+ * Create channel
139
+ */
140
+ override createChannel(channel: string): void {
141
+ this.wsManager.createChannel(channel);
142
+ }
143
+
144
+ /**
145
+ * Delete channel
146
+ */
147
+ override deleteChannel(channel: string): void {
148
+ this.wsManager.deleteChannel(channel);
149
+ }
150
+
151
+ /**
152
+ * Get users in channel
153
+ */
154
+ override getUsersInChannel(channel: string): void {
155
+ this.wsManager.getUsersInChannel(channel);
156
+ }
157
+
158
+ /**
159
+ * Create notification channel
160
+ */
161
+ override createNotificationChannel(channel: string): void {
162
+ this.wsManager.createNotificationChannel(channel);
163
+ }
164
+
165
+ /**
166
+ * Get notification channels
167
+ */
168
+ override getNotificationChannels(): void {
169
+ this.wsManager.getNotificationChannels();
170
+ }
171
+
172
+ /**
173
+ * Get today's notification channels
174
+ */
175
+ override getTodaysNotificationChannels(): void {
176
+ this.wsManager.getTodaysNotificationChannels();
177
+ }
178
+
179
+ /**
180
+ * Subscribe to notification channel
181
+ */
182
+ override subscribeToNotificationChannel(channel: string, options?: any, user?: any): void {
183
+ this.wsManager.subscribeToNotificationChannel(channel, options, user);
184
+ }
185
+
186
+ /**
187
+ * Unsubscribe from notification channel
188
+ */
189
+ override unsubscribeFromNotificationChannel(channel: string): void {
190
+ this.wsManager.unsubscribeFromNotificationChannel(channel);
191
+ }
192
+
193
+ /**
194
+ * Send notification to channel
195
+ */
196
+ override sendNotification(channel: string, content: any): void {
197
+ this.wsManager.sendNotification(channel, content);
198
+ }
199
+
200
+ // REQUESTS
201
+ getRequest<T>(options?: ApiRequest, params?: any[]) {
202
+ this.isPending.set(true);
203
+ this.data.set(null);
204
+
205
+ const updatedOptions = this.defineReqOptions(options, params);
206
+ const func = this.getRecordRequest;
207
+ const requests = this.createRequest(func, updatedOptions);
208
+
209
+ return this.createObservable<T>(updatedOptions, requests, func.name).pipe(
210
+ tap(data => {
211
+ this.data.set(data);
212
+ if (updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage);
213
+ }),
214
+ finalize(() => this.isPending.set(false)),
215
+ catchError((err) => {
216
+ if (updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message);
217
+ this.isPending.set(false);
218
+ return this.handleError(err);
219
+ })
220
+ );
221
+ }
222
+
223
+ postRequest<T extends { id?: number|string }>(data: T, options: ApiRequest, params?: any[]) {
224
+ this.isPending.set(true);
225
+ this.data.set(null);
226
+
227
+ const updatedOptions = this.defineReqOptions(options, params);
228
+ const func = this.createRecordRequest;
229
+ const requests = this.createRequest(func, updatedOptions, data);
230
+
231
+ return this.createObservable<T>(updatedOptions, requests, func.name).pipe(
232
+ tap(data => {
233
+ this.data.set(data);
234
+ if (updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage);
235
+ }),
236
+ finalize(() => this.isPending.set(false)),
237
+ catchError((err) => {
238
+ if (updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage);
239
+ this.isPending.set(false);
240
+ return this.handleError(err);
241
+ })
242
+ );
243
+ }
244
+
245
+ putRequest<T extends { id?: number|string }>(data: T, options: ApiRequest, params?: any[]) {
246
+ this.isPending.set(true);
247
+ this.data.set(null);
248
+
249
+ const updatedOptions = this.defineReqOptions(options, params);
250
+ const func = this.updateRecordRequest;
251
+ const requests = this.createRequest(func, updatedOptions, data);
252
+
253
+ return this.createObservable<T>(updatedOptions, requests, func.name).pipe(
254
+ tap(data => {
255
+ this.data.set(data);
256
+ if (updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage);
257
+ }),
258
+ finalize(() => this.isPending.set(false)),
259
+ catchError((err) => {
260
+ if (updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage);
261
+ this.isPending.set(false);
262
+ return this.handleError(err);
263
+ })
264
+ );
265
+ }
266
+
267
+ deleteRequest<T>(options: ApiRequest, params?: any[]) {
268
+ this.isPending.set(true);
269
+ this.data.set(null);
270
+
271
+ const updatedOptions = this.defineReqOptions(options, params);
272
+ const func = this.deleteRecordRequest;
273
+ const requests = this.createRequest(func, updatedOptions);
274
+
275
+ return this.createObservable<T>(updatedOptions, requests, func.name).pipe(
276
+ tap(data => {
277
+ this.data.set(data);
278
+ if (updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage);
279
+ }),
280
+ finalize(() => this.isPending.set(false)),
281
+ catchError((err) => {
282
+ if (updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage);
283
+ this.isPending.set(false);
284
+ return this.handleError(err);
285
+ })
286
+ );
287
+ }
288
+
289
+ downloadRequest<T>(options: ApiRequest, params?: any[], saveAs?: string) {
290
+ this.isPending.set(true);
291
+
292
+ const updatedOptions = this.defineReqOptions(options, params);
293
+ const func = this.downloadFileRequest;
294
+ const requests = this.createRequest(func, updatedOptions);
295
+
296
+ return this.createObservable<T>(updatedOptions, requests, func.name).pipe(
297
+ catchError((err) => {
298
+ this.error.set(true);
299
+ this.isPending.set(false);
300
+ return this.handleError(err);
301
+ })
302
+ );
303
+ }
304
+ uploadRequest<T>(files: File | File[], options: ApiRequest, params?: any[]) {
305
+ this.isPending.set(true);
306
+ this.data.set(null);
307
+
308
+ const updatedOptions = this.defineReqOptions(options, params);
309
+ updatedOptions.uploadFiles = files;
310
+
311
+ const func = this.uploadFileRequest;
312
+ const requests = this.createRequest(func, updatedOptions);
313
+
314
+ return this.createObservable<T>(updatedOptions, requests, func.name).pipe(
315
+ tap(data => {
316
+ this.data.set(data);
317
+ if (updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage);
318
+ }),
319
+ finalize(() => this.isPending.set(false)),
320
+ catchError((err) => {
321
+ if (updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message);
322
+ this.isPending.set(false);
323
+ return this.handleError(err);
324
+ })
325
+ );
326
+ }
327
+
328
+ // --- private helpers ---
329
+ private createObservable<T>(options: ApiRequest, request$: Observable<T>, funcName: string) {
330
+ const polling =
331
+ options.polling ? (options.polling > 0 ? true : false) : false;
332
+
333
+ const isPolling =
334
+ polling &&
335
+ !(funcName === 'deleteRecordRequest' ||
336
+ funcName === 'updateRecordRequest' ||
337
+ funcName === 'createRecordRequest');
338
+
339
+ this.polling$.next();
340
+
341
+ const polling$ =
342
+ (isPolling && options.polling) || 0 >= 3
343
+ ? request$.pipe(
344
+ requestPolling((options.polling || 0) + 1, this.polling$, this.isPending),
345
+ tap(() => this.countdown.set(0)),
346
+ tap(() => {
347
+ if (!options.polling) return;
348
+ const count = options.polling ? options.polling : 0;
349
+ countdown(count)
350
+ .pipe(
351
+ map((x: number) => {
352
+ const pollingInSec = options.polling || 0;
353
+ const percentageCompleted = ((pollingInSec - x) / pollingInSec) * 100;
354
+ return Math.round(percentageCompleted);
355
+ })
356
+ )
357
+ .subscribe((countDownValue: number) => {
358
+ this.countdown.set(countDownValue);
359
+ });
360
+ }),
361
+ )
362
+ : request$.pipe(
363
+ catchError((err: any) => {
364
+ if (err instanceof HttpErrorResponse) {
365
+ this.error.set(true);
366
+ return this.handleError(err);
367
+ }
368
+ return throwError(() => err);
369
+ })
370
+ );
371
+
372
+ return polling$.pipe(
373
+ options?.retry && options.retry.times > 0
374
+ ? delayedRetry((options.retry.delay || 3) * 1000, (options.retry.times || 0) - 1)
375
+ : (source: Observable<T>) => source,
376
+ catchError((err: any, caught: Observable<T>) => {
377
+ if (err instanceof HttpErrorResponse) {
378
+ this.error.set(true);
379
+ if (isPolling) this.stopPolling();
380
+ return this.handleError(err);
381
+ }
382
+ return throwError(() => err);
383
+ })
384
+ );
385
+ }
386
+
387
+ private createRequest(func: Function, options: ApiRequest, data?: any | any[]) {
388
+ const dataItem = this.prepareRequestData(options, data, func.name);
389
+ return func.bind(this)(dataItem.options, dataItem.data);
390
+ }
391
+
392
+ private prepareRequestData(options: ApiRequest, data: any, funcName: string) {
393
+ if ((options.mapper && funcName === 'updateRecordRequest') || funcName === 'createRecordRequest') {
394
+ if (options?.mapper) {
395
+ data = options.mapper
396
+ ? Array.isArray(data)
397
+ ? map((item) => options.mapper(item))
398
+ : options.mapper(data)
399
+ : data;
400
+ }
401
+ } else {
402
+ if (options?.adapter) {
403
+ data = Array.isArray(data)
404
+ ? map((item) => options.adapter(item))
405
+ : options.adapter(data);
406
+ }
407
+ }
408
+ return { options: options, data: data };
409
+ }
410
+
411
+ private handleError(error: Response | any) {
412
+ this.error.set(error.message || `${error.status} - ${error.statusText}`);
413
+ return throwError(() => error);
414
+ }
415
+
416
+ private handleErrorWithSnackBar(error: Response | any, message?: string) {
417
+ const displayError = ToastDisplay.adapt({
418
+ message: message || error.message || `${error.status} - ${error.statusText}`,
419
+ action: 'OK',
420
+ color: ToastColors.ERROR,
421
+ icon: 'error',
422
+ duration: 5 * 1000,
423
+ });
424
+ this.toastMessage.toastMessage(displayError);
425
+ }
426
+
427
+ private handleSuccessWithSnackBar(message?: string) {
428
+ const displaySuccess = ToastDisplay.adapt({
429
+ message: message || 'Success',
430
+ action: 'OK',
431
+ color: ToastColors.SUCCESS,
432
+ icon: 'check_circle',
433
+ duration: 3 * 1000,
434
+ });
435
+ this.toastMessage.toastMessage(displaySuccess);
436
+ }
437
+
438
+ private stopPolling() {
439
+ this.isPending.set(false);
440
+ this.polling$.next();
441
+ }
442
+
443
+ private defineReqOptions(options: any, params?: any[]) {
444
+ const req = ApiRequest.adapt(options);
445
+ if (req?.path) req.path = params ? [...req.path, ...params] : req.path;
446
+
447
+ const optionsReq = req ? req : ApiRequest.adapt();
448
+ const updatedOptions = this.objectMergerService.mergeOptions(optionsReq);
449
+
450
+ return updatedOptions;
451
+ }
452
+
453
+ // BATCH REQUESTS
454
+
455
+ /**
456
+ * Execute multiple HTTP requests with configurable execution strategy
457
+ * @param requests Array of ApiRequest configurations
458
+ * @param options Optional batch configuration (all properties optional)
459
+ * @returns Observable emitting array of data in the order of requests provided
460
+ */
461
+ getBatchRequests<U = T>(
462
+ requests: ApiRequest[],
463
+ options?: BatchOptions
464
+ ): Observable<U[]> {
465
+ const batchOptions = BatchOptions.adapt(options);
466
+
467
+ const mode = batchOptions.mode || 'sequential';
468
+
469
+ if (mode === 'parallel') {
470
+ return this.getParallelRequest(requests, batchOptions);
471
+ } else {
472
+ return this.getSequentialRequest(requests, batchOptions);
473
+ }
474
+ }
475
+
476
+ /**
477
+ * Execute requests sequentially (one at a time, in order)
478
+ * @param requests Array of ApiRequest configurations
479
+ * @param options Optional batch configuration
480
+ * @returns Observable emitting array of data when all requests complete
481
+ */
482
+ getSequentialRequest<U = T>(
483
+ requests: ApiRequest[],
484
+ options?: BatchOptions,
485
+ successMessage?: string,
486
+ errorMessage?: string
487
+ ): Observable<U[]> {
488
+ const batchOptions = BatchOptions.adapt(options);
489
+ const results: U[] = new Array(requests.length);
490
+
491
+ return from(requests).pipe(
492
+ concatMap((req, index) => {
493
+ return this.getRequest<U>(req, undefined).pipe(
494
+ tap(data => {
495
+ results[index] = data;
496
+ }),
497
+ catchError(error => this.handleSequentialError(req, error, index, batchOptions))
498
+ );
499
+ }),
500
+ toArray(),
501
+ tap(() => {
502
+ if (batchOptions.displaySuccess) this.handleSuccessWithSnackBar(successMessage);
503
+ }),
504
+ map(() => results)
505
+ );
506
+ }
507
+
508
+ /**
509
+ * Execute requests in parallel with concurrency control
510
+ * @param requests Array of ApiRequest configurations
511
+ * @param options Optional batch configuration with concurrency limit
512
+ * @returns Observable emitting array of data when all requests complete
513
+ */
514
+ getParallelRequest<U = T>(
515
+ requests: ApiRequest[],
516
+ options?: BatchOptions,
517
+ successMessage?: string,
518
+ errorMessage?: string
519
+ ): Observable<U[]> {
520
+ const batchOptions = BatchOptions.adapt(options);
521
+ const concurrency = batchOptions.concurrency || 3;
522
+ const results: U[] = new Array(requests.length);
523
+
524
+ return from(requests).pipe(
525
+ mergeMap((req, index) => {
526
+ return this.getRequest<U>(req, undefined).pipe(
527
+ tap(data => {
528
+ results[index] = data;
529
+ }),
530
+ catchError(error => this.handleParallelError(req, error, index, batchOptions))
531
+ );
532
+ }, concurrency),
533
+ toArray(),
534
+ tap(() => {
535
+ if (batchOptions.displaySuccess) this.handleSuccessWithSnackBar(successMessage);
536
+ }),
537
+ map(() => results)
538
+ );
539
+ }
540
+
541
+ /**
542
+ * Execute multiple HTTP requests and emit individual state changes in real-time
543
+ * @param requests Array of ApiRequest configurations
544
+ * @param options Optional batch configuration (all properties optional)
545
+ * @returns Observable stream of individual request states
546
+ */
547
+ getBatchRequestsStream<U = T>(
548
+ requests: ApiRequest[],
549
+ options?: BatchOptions
550
+ ): Observable<BatchRequestState<U>> {
551
+ const batchOptions = BatchOptions.adapt(options);
552
+ const mode = batchOptions.mode || 'sequential';
553
+
554
+ if (mode === 'parallel') {
555
+ return this.getParallelStream(requests, batchOptions);
556
+ } else {
557
+ return this.getSequentialStream(requests, batchOptions);
558
+ }
559
+ }
560
+
561
+ /**
562
+ * Execute requests sequentially and emit state changes
563
+ */
564
+ private getSequentialStream<U>(
565
+ requests: ApiRequest[],
566
+ options: BatchOptions
567
+ ): Observable<BatchRequestState<U>> {
568
+ return from(requests).pipe(
569
+ concatMap((req, index) => {
570
+ const pending$: Observable<BatchRequestState<U>> = of({
571
+ index,
572
+ request: req,
573
+ isPending: true
574
+ });
575
+
576
+ const result$: Observable<BatchRequestState<U>> = this.getRequest<U>(req).pipe(
577
+ map((data) => ({
578
+ index,
579
+ request: req,
580
+ isPending: false,
581
+ data
582
+ }) as BatchRequestState<U>),
583
+ catchError((error) => of({
584
+ index,
585
+ request: req,
586
+ isPending: false,
587
+ error
588
+ } as BatchRequestState<U>))
589
+ );
590
+
591
+ return pending$.pipe(
592
+ concatMap(() => result$)
593
+ );
594
+ })
595
+ );
596
+ }
597
+
598
+ /**
599
+ * Execute requests in parallel and emit state changes
600
+ */
601
+ private getParallelStream<U>(
602
+ requests: ApiRequest[],
603
+ options: BatchOptions
604
+ ): Observable<BatchRequestState<U>> {
605
+ const concurrency = options.concurrency || 3;
606
+
607
+ return from(requests).pipe(
608
+ mergeMap((req, index) => {
609
+ const pending$: Observable<BatchRequestState<U>> = of({
610
+ index,
611
+ request: req,
612
+ isPending: true
613
+ });
614
+
615
+ const result$: Observable<BatchRequestState<U>> = this.getRequest<U>(req).pipe(
616
+ map((data) => ({
617
+ index,
618
+ request: req,
619
+ isPending: false,
620
+ data
621
+ }) as BatchRequestState<U>),
622
+ catchError((error) => of({
623
+ index,
624
+ request: req,
625
+ isPending: false,
626
+ error
627
+ } as BatchRequestState<U>))
628
+ );
629
+
630
+ return pending$.pipe(
631
+ concatMap(() => result$)
632
+ );
633
+ }, concurrency)
634
+ );
635
+ }
636
+
637
+ private handleSequentialError<U>(
638
+ request: ApiRequest,
639
+ error: any,
640
+ index: number,
641
+ options: BatchOptions
642
+ ): Observable<U> {
643
+ if (options.logErrors !== false) {
644
+ console.error(`Batch request ${index} failed:`, error);
645
+ }
646
+
647
+ if (options.stopOnError) {
648
+ return throwError(() => error);
649
+ }
650
+
651
+ if (options.ignoreErrors) {
652
+ return of(undefined as unknown as U);
653
+ }
654
+
655
+ return throwError(() => error);
656
+ }
657
+
658
+ private handleParallelError<U>(
659
+ request: ApiRequest,
660
+ error: any,
661
+ index: number,
662
+ options: BatchOptions
663
+ ): Observable<U> {
664
+ if (options.logErrors !== false) {
665
+ console.error(`Batch request ${index} failed:`, error);
666
+ }
667
+
668
+ if (options.ignoreErrors) {
669
+ return of(undefined as unknown as U);
670
+ }
671
+
672
+ return of(undefined as unknown as U);
673
+ }
674
+ }