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,727 @@
1
+ import { Inject, inject, Injectable, Injector, Optional } from '@angular/core';
2
+ import { HttpErrorResponse } from '@angular/common/http';
3
+ import { BehaviorSubject, 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 { RequestService } from './request.service';
8
+ import { requestPolling, countdown, delayedRetry } from './rxjs-operators';
9
+
10
+ import { CONFIG_SETTINGS_TOKEN } from '../../models/config-token.model';
11
+ import { ConfigOptions, BatchOptions, BatchResult, BatchRequestState } from '../../models';
12
+ import { ObjectMergerService } from '../utils/object-merger.service';
13
+ import { ToastColors, ToastDisplay, ToastMessageDisplayService } from 'toast-message-display';
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 HTTPManagerService<T> extends RequestService {
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$ // Messages flow through MessageTrackerService
31
+ override subscribedChannels$ = this.wsManager.subscribedChannels$
32
+ retryCount$ = this.wsManager.retryCount$
33
+ maxRetries$ = this.wsManager.maxRetries$
34
+
35
+ private countdown = new BehaviorSubject<number>(0);
36
+ countdown$ = this.countdown.asObservable();
37
+
38
+ private error = new BehaviorSubject<boolean>(false);
39
+ error$ = this.error.asObservable();
40
+
41
+ private data = new BehaviorSubject<any>(null)
42
+ data$ = this.data.asObservable()
43
+
44
+ private polling$ = new Subject<void>();
45
+
46
+ config = ApiRequest.adapt();
47
+
48
+ override streamProgress$ = this.streamProgress.asObservable();
49
+
50
+ constructor(@Optional() @Inject(CONFIG_SETTINGS_TOKEN) private configOptions?: ConfigOptions) {
51
+ super()
52
+ this.config = (configOptions) ? ApiRequest.adapt(configOptions.httpRequestOptions) : this.config
53
+ }
54
+
55
+ // ═══════════════════════════════════════════════════════════════════════════
56
+ // WEBSOCKET METHODS (Delegated to WebSocketManagerService singleton)
57
+ // ═══════════════════════════════════════════════════════════════════════════
58
+
59
+ /**
60
+ * Connect to WebSocket server
61
+ * Only the first call across ALL instances will establish a connection
62
+ */
63
+ override connect(options: any, jwtToken: string): void {
64
+ this.wsManager.connect(options, jwtToken);
65
+ }
66
+
67
+ /**
68
+ * Disconnect from WebSocket server
69
+ */
70
+ override disconnect(): void {
71
+ this.wsManager.disconnect();
72
+ }
73
+
74
+ /**
75
+ * Subscribe to a channel
76
+ */
77
+ override subscribeToChannel(channel: string, userData?: any): void {
78
+ this.messageTracker.subscribeToChannel(channel, userData);
79
+ }
80
+
81
+ /**
82
+ * Subscribe to multiple channels
83
+ */
84
+ override subscribeToChannels(channels: string[], userData?: any): void {
85
+ channels.forEach(channel => this.messageTracker.subscribeToChannel(channel, userData));
86
+ }
87
+
88
+ /**
89
+ * Unsubscribe from a channel
90
+ */
91
+ override unsubscribeFromChannel(channel: string): void {
92
+ this.wsManager.unsubscribeFromChannel(channel);
93
+ }
94
+
95
+ /**
96
+ * Get currently subscribed channels
97
+ */
98
+ override getSubscribedChannels(): Set<string> {
99
+ return this.wsManager.getSubscribedChannels();
100
+ }
101
+
102
+ /**
103
+ * Send broadcast message
104
+ */
105
+ override sendBroadcast(content: any): void {
106
+ this.wsManager.sendBroadcast(content);
107
+ }
108
+
109
+ /**
110
+ * Send message in channel (state manager message)
111
+ */
112
+ override sendMessageInChannel(channel: string, content: any): void {
113
+ this.wsManager.sendMessageInChannel(channel, content);
114
+ }
115
+
116
+ /**
117
+ * Send channel message
118
+ */
119
+ override sendChannelMessage(channel: string, content: any): void {
120
+ this.wsManager.sendChannelMessage(channel, content);
121
+ }
122
+
123
+ /**
124
+ * Send message to multiple channels
125
+ */
126
+ override sendChannelMessageToChannels(channels: string[], content: any): void {
127
+ this.wsManager.sendChannelMessageToChannels(channels, content);
128
+ }
129
+
130
+ /**
131
+ * Send message to user
132
+ */
133
+ override sendMessageToUser(user: string, content: any): void {
134
+ this.wsManager.sendMessageToUser(user, content);
135
+ }
136
+
137
+ /**
138
+ * Get all channels
139
+ */
140
+ override getAllChannels(): void {
141
+ this.wsManager.getAllChannels();
142
+ }
143
+
144
+ /**
145
+ * Create channel
146
+ */
147
+ override createChannel(channel: string): void {
148
+ this.wsManager.createChannel(channel);
149
+ }
150
+
151
+ /**
152
+ * Delete channel
153
+ */
154
+ override deleteChannel(channel: string): void {
155
+ this.wsManager.deleteChannel(channel);
156
+ }
157
+
158
+ /**
159
+ * Get users in channel
160
+ */
161
+ override getUsersInChannel(channel: string): void {
162
+ this.wsManager.getUsersInChannel(channel);
163
+ }
164
+
165
+ /**
166
+ * Create notification channel
167
+ */
168
+ override createNotificationChannel(channel: string): void {
169
+ this.wsManager.createNotificationChannel(channel);
170
+ }
171
+
172
+ /**
173
+ * Get notification channels
174
+ */
175
+ override getNotificationChannels(): void {
176
+ this.wsManager.getNotificationChannels();
177
+ }
178
+
179
+ /**
180
+ * Get today's notification channels
181
+ */
182
+ override getTodaysNotificationChannels(): void {
183
+ this.wsManager.getTodaysNotificationChannels();
184
+ }
185
+
186
+ /**
187
+ * Subscribe to notification channel
188
+ */
189
+ override subscribeToNotificationChannel(channel: string, options?: any, user?: any): void {
190
+ this.wsManager.subscribeToNotificationChannel(channel, options, user);
191
+ }
192
+
193
+ /**
194
+ * Unsubscribe from notification channel
195
+ */
196
+ override unsubscribeFromNotificationChannel(channel: string): void {
197
+ this.wsManager.unsubscribeFromNotificationChannel(channel);
198
+ }
199
+
200
+ /**
201
+ * Send notification to channel
202
+ */
203
+ override sendNotification(channel: string, content: any): void {
204
+ this.wsManager.sendNotification(channel, content);
205
+ }
206
+
207
+ // REQUESTS
208
+
209
+ getRequest<T>(options?: ApiRequest, params?: any[]) {
210
+
211
+ this.isPending.next(true);
212
+ this.data.next(null)
213
+ this.streamProgress.next({
214
+ received: 0,
215
+ total: undefined,
216
+ percent: 0,
217
+ stage: 'connecting'
218
+ });
219
+
220
+ const updatedOptions = this.defineReqOptions(options, params)
221
+ const func = this.getRecordRequest;
222
+ const requests = this.createRequest(func, updatedOptions);
223
+
224
+ return this.createObservable<T>(updatedOptions, requests, func.name)
225
+ .pipe(
226
+ tap(data => {
227
+ this.data.next(data)
228
+ if(updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage)
229
+ }),
230
+ finalize(() => {
231
+ this.streamProgress.next({
232
+ ...this.streamProgress.value,
233
+ stage: 'complete'
234
+ });
235
+ this.isPending.next(false)
236
+ }),
237
+ catchError((err) => {
238
+ if(updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message)
239
+ this.streamProgress.next({
240
+ ...this.streamProgress.value,
241
+ stage: 'error'
242
+ });
243
+ this.isPending.next(false)
244
+ return this.handleError(err);
245
+ })
246
+ )
247
+ }
248
+
249
+ postRequest<T extends { id?: number|string }>(data: T, options: ApiRequest, params?: any[]) {
250
+
251
+ this.isPending.next(true);
252
+ this.data.next(null)
253
+
254
+ const updatedOptions = this.defineReqOptions(options, params)
255
+ const func = this.createRecordRequest;
256
+ const requests = this.createRequest(func, updatedOptions, data);
257
+
258
+ return this.createObservable<T>(updatedOptions, requests, func.name).pipe(
259
+ tap(data => {
260
+ this.data.next(data)
261
+ if(updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage)
262
+ }),
263
+ finalize(() => this.isPending.next(false)),
264
+ catchError((err) => {
265
+ if(updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message)
266
+ this.isPending.next(false)
267
+ return this.handleError(err);
268
+ })
269
+ )
270
+ }
271
+
272
+ putRequest<T extends { id?: number|string }>(data: T, options: ApiRequest, params?: any[]) {
273
+
274
+ this.isPending.next(true);
275
+ this.data.next(null)
276
+
277
+ const updatedOptions = this.defineReqOptions(options, params)
278
+ const func = this.updateRecordRequest;
279
+ const requests = this.createRequest(func, updatedOptions, data);
280
+
281
+ return this.createObservable<T>(updatedOptions, requests, func.name).pipe(
282
+ tap(data => {
283
+ this.data.next(data)
284
+ if(updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage)
285
+ }),
286
+ finalize(() => this.isPending.next(false)),
287
+ catchError((err) => {
288
+ if(updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message)
289
+ this.isPending.next(false)
290
+ return this.handleError(err);
291
+ })
292
+ )
293
+ }
294
+
295
+ deleteRequest<T>(options: ApiRequest, params?: any[]) {
296
+
297
+ this.isPending.next(true);
298
+ this.data.next(null)
299
+
300
+ const updatedOptions = this.defineReqOptions(options, params)
301
+ const func = this.deleteRecordRequest;
302
+ const requests = this.createRequest(func, updatedOptions);
303
+
304
+ return this.createObservable<T>(updatedOptions, requests, func.name).pipe(
305
+ tap(data => {
306
+ this.data.next(data)
307
+ if(updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage)
308
+ }),
309
+ finalize(() => this.isPending.next(false)),
310
+ catchError((err) => {
311
+ if(updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message)
312
+ this.isPending.next(false)
313
+ return this.handleError(err);
314
+ })
315
+ )
316
+ }
317
+
318
+ downloadRequest<T>(options: ApiRequest, params?: any[], saveAs?: string) {
319
+
320
+ this.isPending.next(true);
321
+
322
+ const updatedOptions = this.defineReqOptions(options, params)
323
+ const func = this.downloadFileRequest;
324
+ const requests = this.createRequest(func, updatedOptions)
325
+
326
+ return this.createObservable<T>(updatedOptions, requests, func.name)
327
+ .pipe(
328
+ catchError((err) => {
329
+ this.error.next(true)
330
+ this.isPending.next(false)
331
+ return this.handleError(err);
332
+ })
333
+ )
334
+
335
+ }
336
+
337
+ uploadRequest<T>(files: File | File[], options: ApiRequest, params?: any[]) {
338
+
339
+ this.isPending.next(true);
340
+ this.data.next(null)
341
+
342
+ const updatedOptions = this.defineReqOptions(options, params)
343
+ updatedOptions.uploadFiles = files
344
+
345
+ const func = this.uploadFileRequest;
346
+ const requests = this.createRequest(func, updatedOptions);
347
+
348
+ return this.createObservable<T>(updatedOptions, requests, func.name).pipe(
349
+ tap(data => {
350
+ this.data.next(data)
351
+ if(updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage)
352
+ }),
353
+ finalize(() => this.isPending.next(false)),
354
+ catchError((err) => {
355
+ if(updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message)
356
+ this.isPending.next(false)
357
+ return this.handleError(err);
358
+ })
359
+ )
360
+ }
361
+
362
+ private createObservable<T>(options: ApiRequest, request$: Observable<T>, funcName: string) {
363
+
364
+ const polling = options.polling ? (options.polling > 0 ? true : false) : false;
365
+ const isPolling =
366
+ polling &&
367
+ !(funcName === 'deleteRecordRequest' || funcName === 'updateRecordRequest' || funcName === 'createRecordRequest')
368
+ ? true
369
+ : false;
370
+
371
+ this.polling$.next();
372
+
373
+ const polling$ =
374
+ (isPolling && options.polling) || 0 >= 3
375
+ ? request$.pipe(
376
+ requestPolling((options.polling || 0) + 1, this.polling$, this.isPending),
377
+ tap(() => this.countdown.next(0)),
378
+ tap(() => {
379
+ if (!options.polling) return;
380
+ const count = options.polling ? options.polling : 0;
381
+ // console.log('COUNT:', count);
382
+ countdown(count)
383
+ .pipe(
384
+ map((x: number) => {
385
+ // console.log('XX:', count, x);
386
+ const pollingInSec = options.polling || 0;
387
+ const percentageCompleted = ((pollingInSec - x) / pollingInSec) * 100;
388
+ return Math.round(percentageCompleted);
389
+ })
390
+ )
391
+ .subscribe((countDownValue: number) => {
392
+ // console.log(this.countdown.value, countDownValue);
393
+ this.countdown.next(countDownValue);
394
+ });
395
+ }),
396
+ )
397
+ : request$.pipe(
398
+ catchError((err: any) => {
399
+
400
+ if (err instanceof HttpErrorResponse) {
401
+ this.error.next(true);
402
+ return this.handleError(err);
403
+ }
404
+
405
+ return throwError(() => err);
406
+ }),
407
+ // finalize(() => this.isPending.next(false))
408
+ )
409
+
410
+ return polling$.pipe(
411
+ (options?.retry && options.retry.times > 0)
412
+ ? delayedRetry((options.retry.delay || 3) * 1000, (options.retry.times || 0) - 1)
413
+ : (source: Observable<T>) => source,
414
+ catchError((err: any, caught: Observable<T>) => {
415
+
416
+ if (err instanceof HttpErrorResponse) {
417
+ this.error.next(true);
418
+ if(isPolling) this.stopPolling();
419
+ return this.handleError(err);
420
+ }
421
+
422
+ return throwError(() => err);
423
+ })
424
+ );
425
+ }
426
+
427
+ private createRequest(func: Function, options: ApiRequest, data?: any | any[]) {
428
+ const dataItem = this.prepareRequestData(options, data, func.name);
429
+ return func.bind(this)(dataItem.options, dataItem.data);
430
+ }
431
+
432
+ private prepareRequestData(options: ApiRequest, data: any, funcName: string) {
433
+
434
+ if ((options.mapper && funcName === 'updateRecordRequest') || funcName === 'createRecordRequest') {
435
+ if (options?.mapper) {
436
+ data = options.mapper
437
+ ? Array.isArray(data)
438
+ ? map((item) => options.mapper(item))
439
+ : options.mapper(data)
440
+ : data;
441
+ }
442
+ } else {
443
+ if (options?.adapter) {
444
+ data = Array.isArray(data)
445
+ ? map((item) => options.adapter(item))
446
+ : options.adapter(data)
447
+ }
448
+ }
449
+
450
+ return { options: options, data: data };
451
+ }
452
+
453
+ // MISC
454
+
455
+ private handleError(error: Response | any) {
456
+ this.error.next(error.message || `${error.status} - ${error.statusText}`)
457
+ return throwError(() => error)
458
+ }
459
+
460
+ private handleErrorWithSnackBar(error: Response | any, message?: string) {
461
+
462
+ const displayError = ToastDisplay.adapt({
463
+ message: message || error.message || `${error.status} - ${error.statusText}`,
464
+ action: 'OK',
465
+ color: ToastColors.ERROR,
466
+ icon: 'error',
467
+ duration: 5 * 1000, //5 seconds
468
+ })
469
+
470
+ this.toastMessage.toastMessage(displayError)
471
+
472
+ }
473
+
474
+ private handleSuccessWithSnackBar(message?: string) {
475
+
476
+ const displaySuccess = ToastDisplay.adapt({
477
+ message: message || 'Success',
478
+ action: 'OK',
479
+ color: ToastColors.SUCCESS,
480
+ icon: 'check_circle',
481
+ duration: 3 * 1000, //3 seconds
482
+ })
483
+
484
+ this.toastMessage.toastMessage(displaySuccess)
485
+
486
+ }
487
+
488
+ private stopPolling() {
489
+ this.isPending.next(false);
490
+ this.polling$.next();
491
+ }
492
+
493
+ private defineReqOptions(options: any, params?: any[]) {
494
+
495
+ const req = ApiRequest.adapt(options)
496
+ if(req?.path) req.path = (params) ? [...req.path, ...params] : req.path
497
+
498
+ const optionsReq = (req)? req : ApiRequest.adapt()
499
+ const updatedOptions = this.objectMergerService.mergeOptions(optionsReq)
500
+
501
+ return updatedOptions
502
+
503
+ }
504
+
505
+ // BATCH REQUESTS
506
+
507
+ /**
508
+ * Execute multiple HTTP requests with configurable execution strategy
509
+ * @param requests Array of ApiRequest configurations
510
+ * @param options Optional batch configuration (all properties optional)
511
+ * @returns Observable emitting array of data in the order of requests provided
512
+ */
513
+ getBatchRequests<U = T>(
514
+ requests: ApiRequest[],
515
+ options?: BatchOptions
516
+ ): Observable<U[]> {
517
+ const batchOptions = BatchOptions.adapt(options);
518
+
519
+ const mode = batchOptions.mode || 'sequential';
520
+
521
+ if (mode === 'parallel') {
522
+ return this.getParallelRequest(requests, batchOptions);
523
+ } else {
524
+ return this.getSequentialRequest(requests, batchOptions);
525
+ }
526
+ }
527
+
528
+ /**
529
+ * Execute requests sequentially (one at a time, in order)
530
+ * @param requests Array of ApiRequest configurations
531
+ * @param options Optional batch configuration
532
+ * @returns Observable emitting array of data when all requests complete
533
+ */
534
+ getSequentialRequest<U = T>(
535
+ requests: ApiRequest[],
536
+ options?: BatchOptions,
537
+ successMessage?: string,
538
+ errorMessage?: string
539
+ ): Observable<U[]> {
540
+ const batchOptions = BatchOptions.adapt(options);
541
+ const results: U[] = new Array(requests.length);
542
+
543
+ return from(requests).pipe(
544
+ concatMap((req, index) => {
545
+ return this.getRequest<U>(req, undefined).pipe(
546
+ tap(data => {
547
+ results[index] = data;
548
+ }),
549
+ catchError(error => this.handleSequentialError(req, error, index, batchOptions))
550
+ );
551
+ }),
552
+ toArray(),
553
+ tap(() => {
554
+ if (batchOptions.displaySuccess) this.handleSuccessWithSnackBar(successMessage);
555
+ }),
556
+ map(() => results)
557
+ );
558
+ }
559
+
560
+ /**
561
+ * Execute requests in parallel with concurrency control
562
+ * @param requests Array of ApiRequest configurations
563
+ * @param options Optional batch configuration with concurrency limit
564
+ * @returns Observable emitting array of data when all requests complete
565
+ */
566
+ getParallelRequest<U = T>(
567
+ requests: ApiRequest[],
568
+ options?: BatchOptions,
569
+ successMessage?: string,
570
+ errorMessage?: string
571
+ ): Observable<U[]> {
572
+ const batchOptions = BatchOptions.adapt(options);
573
+ const concurrency = batchOptions.concurrency || 3;
574
+ const results: U[] = new Array(requests.length);
575
+
576
+ return from(requests).pipe(
577
+ mergeMap((req, index) => {
578
+ return this.getRequest<U>(req, undefined).pipe(
579
+ tap(data => {
580
+ results[index] = data;
581
+ }),
582
+ catchError(error => this.handleParallelError(req, error, index, batchOptions))
583
+ );
584
+ }, concurrency),
585
+ toArray(),
586
+ tap(() => {
587
+ if (batchOptions.displaySuccess) this.handleSuccessWithSnackBar(successMessage);
588
+ }),
589
+ map(() => results)
590
+ );
591
+ }
592
+
593
+ /**
594
+ * Execute multiple HTTP requests and emit individual state changes in real-time
595
+ * @param requests Array of ApiRequest configurations
596
+ * @param options Optional batch configuration (all properties optional)
597
+ * @returns Observable stream of individual request states
598
+ */
599
+ getBatchRequestsStream<U = T>(
600
+ requests: ApiRequest[],
601
+ options?: BatchOptions
602
+ ): Observable<BatchRequestState<U>> {
603
+ const batchOptions = BatchOptions.adapt(options);
604
+ const mode = batchOptions.mode || 'sequential';
605
+
606
+ if (mode === 'parallel') {
607
+ return this.getParallelStream(requests, batchOptions);
608
+ } else {
609
+ return this.getSequentialStream(requests, batchOptions);
610
+ }
611
+ }
612
+
613
+ /**
614
+ * Execute requests sequentially and emit state changes
615
+ */
616
+ private getSequentialStream<U>(
617
+ requests: ApiRequest[],
618
+ options: BatchOptions
619
+ ): Observable<BatchRequestState<U>> {
620
+ return from(requests).pipe(
621
+ concatMap((req, index) => {
622
+ const pending$: Observable<BatchRequestState<U>> = of({
623
+ index,
624
+ request: req,
625
+ isPending: true
626
+ });
627
+
628
+ const result$: Observable<BatchRequestState<U>> = this.getRequest<U>(req).pipe(
629
+ map((data) => ({
630
+ index,
631
+ request: req,
632
+ isPending: false,
633
+ data
634
+ }) as BatchRequestState<U>),
635
+ catchError((error) => of({
636
+ index,
637
+ request: req,
638
+ isPending: false,
639
+ error
640
+ } as BatchRequestState<U>))
641
+ );
642
+
643
+ return pending$.pipe(
644
+ concatMap(() => result$)
645
+ );
646
+ })
647
+ );
648
+ }
649
+
650
+ /**
651
+ * Execute requests in parallel and emit state changes
652
+ */
653
+ private getParallelStream<U>(
654
+ requests: ApiRequest[],
655
+ options: BatchOptions
656
+ ): Observable<BatchRequestState<U>> {
657
+ const concurrency = options.concurrency || 3;
658
+
659
+ return from(requests).pipe(
660
+ mergeMap((req, index) => {
661
+ const pending$: Observable<BatchRequestState<U>> = of({
662
+ index,
663
+ request: req,
664
+ isPending: true
665
+ });
666
+
667
+ const result$: Observable<BatchRequestState<U>> = this.getRequest<U>(req).pipe(
668
+ map((data) => ({
669
+ index,
670
+ request: req,
671
+ isPending: false,
672
+ data
673
+ }) as BatchRequestState<U>),
674
+ catchError((error) => of({
675
+ index,
676
+ request: req,
677
+ isPending: false,
678
+ error
679
+ } as BatchRequestState<U>))
680
+ );
681
+
682
+ return pending$.pipe(
683
+ concatMap(() => result$)
684
+ );
685
+ }, concurrency)
686
+ );
687
+ }
688
+
689
+ private handleSequentialError<U>(
690
+ request: ApiRequest,
691
+ error: any,
692
+ index: number,
693
+ options: BatchOptions
694
+ ): Observable<U> {
695
+ if (options.logErrors !== false) {
696
+ console.error(`Batch request ${index} failed:`, error);
697
+ }
698
+
699
+ if (options.stopOnError) {
700
+ return throwError(() => error);
701
+ }
702
+
703
+ if (options.ignoreErrors) {
704
+ return of(undefined as unknown as U);
705
+ }
706
+
707
+ return throwError(() => error);
708
+ }
709
+
710
+ private handleParallelError<U>(
711
+ request: ApiRequest,
712
+ error: any,
713
+ index: number,
714
+ options: BatchOptions
715
+ ): Observable<U> {
716
+ if (options.logErrors !== false) {
717
+ console.error(`Batch request ${index} failed:`, error);
718
+ }
719
+
720
+ if (options.ignoreErrors) {
721
+ return of(undefined as unknown as U);
722
+ }
723
+
724
+ return of(undefined as unknown as U);
725
+ }
726
+ }
727
+