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,687 @@
1
+ import { Component, Input, OnInit, ViewChild, inject } from '@angular/core'
2
+
3
+ import { BehaviorSubject, EMPTY, Observable, throwError, of } from 'rxjs'
4
+ import { FormArray, FormBuilder, Validators } from '@angular/forms'
5
+ import { catchError, tap, map } from 'rxjs/operators'
6
+
7
+ import { ClientInfo } from './models/sample-client-info'
8
+ import { ClientInfoMapper } from './models/sample-mapper-client-info'
9
+ import { AIPrompt } from './models/sample-ai-prompt'
10
+ import { ApiRequest, HTTPManagerService, StreamType, BatchOptions, BatchRequestState, BatchProgress, calculateBatchProgress } from '../..'
11
+
12
+ import { ToastColors, ToastDisplay, ToastMessageDisplayService } from 'toast-message-display'
13
+
14
+ @Component({
15
+ selector: 'app-request-manager-demo',
16
+ templateUrl: './request-manager-demo.component.html',
17
+ styleUrls: ['./request-manager-demo.component.scss'],
18
+ providers: [HTTPManagerService],
19
+ standalone: false
20
+ })
21
+ export class RequestManagerDemoComponent implements OnInit {
22
+
23
+ @Input() server = 'http://localhost:8080'
24
+ @Input() adapter?: Function
25
+ @Input() mapper?: Function
26
+
27
+ displayedColumns: string[] = []
28
+
29
+ // Dynamic columns based on data structure
30
+ getColumnsFromData(data: any[]): string[] {
31
+ if (!data || data.length === 0) {
32
+ return []
33
+ }
34
+
35
+ const firstRecord = data[0]
36
+ if (!firstRecord || typeof firstRecord !== 'object') {
37
+ return []
38
+ }
39
+
40
+ // Extract all keys from the first record, excluding null/undefined
41
+ return Object.keys(firstRecord).filter(key =>
42
+ firstRecord[key] !== null && firstRecord[key] !== undefined
43
+ )
44
+ }
45
+
46
+ // Update displayed columns when data changes
47
+ updateDisplayedColumns(data: any[]): void {
48
+ this.displayedColumns = this.getColumnsFromData(data)
49
+ console.log('[DEMO] Updated columns:', this.displayedColumns)
50
+ }
51
+
52
+ // Helper to check if value is an object
53
+ isObject(value: any): boolean {
54
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
55
+ }
56
+
57
+ private fb = inject(FormBuilder)
58
+ private toastMessage = inject(ToastMessageDisplayService)
59
+
60
+ questionControl = this.fb.control("", [Validators.required])
61
+
62
+ httpManagerService = inject(HTTPManagerService)
63
+
64
+ isPending$ = this.httpManagerService.isPending$
65
+ countdown$ = this.httpManagerService.countdown$
66
+
67
+ GET_error$ = new BehaviorSubject<string>('')
68
+ POST_error$ = new BehaviorSubject<string>('')
69
+ PUT_error$ = new BehaviorSubject<string>('')
70
+ DELETE_error$ = new BehaviorSubject<string>('')
71
+
72
+ STREAM_error$ = new BehaviorSubject<string>('')
73
+ STREAM_AI_error$ = new BehaviorSubject<string>('')
74
+
75
+ GET$?: Observable<any>
76
+ POST$?: Observable<any>
77
+ PUT$?: Observable<any>
78
+ DELETE$?: Observable<any>
79
+
80
+ STREAM$?: Observable<any>
81
+ STREAM_AI$?: Observable<any>
82
+
83
+ // Batch request properties
84
+ parallelBatch$?: Observable<any[]>
85
+ sequentialBatch$?: Observable<any[]>
86
+ parallelExecutionTime?: number
87
+ sequentialExecutionTime?: number
88
+ parallelResults?: any[]
89
+ sequentialResults?: any[]
90
+ isParallelLoading = false
91
+ isSequentialLoading = false
92
+ parallelError?: string
93
+ sequentialError?: string
94
+
95
+ // Parallel batch states for individual request tracking
96
+ parallelBatchStates: (BatchRequestState<any> | undefined)[] = []
97
+
98
+ // Sequential batch states for individual request tracking
99
+ sequentialBatchStates: (BatchRequestState<any> | undefined)[] = []
100
+
101
+ // Stream batch request properties
102
+ streamBatchStates: (BatchRequestState<any> | undefined)[] = []
103
+ streamProgress?: BatchProgress
104
+ streamExecutionTime?: number
105
+ isStreamLoading = false
106
+ streamError?: string
107
+
108
+ // Computed properties for filtered states (removes undefined)
109
+ get filteredParallelStates(): BatchRequestState<any>[] {
110
+ return this.parallelBatchStates.filter(s => s !== undefined) as BatchRequestState<any>[]
111
+ }
112
+
113
+ get filteredSequentialStates(): BatchRequestState<any>[] {
114
+ return this.sequentialBatchStates.filter(s => s !== undefined) as BatchRequestState<any>[]
115
+ }
116
+
117
+ get filteredStreamStates(): BatchRequestState<any>[] {
118
+ return this.streamBatchStates.filter(s => s !== undefined) as BatchRequestState<any>[]
119
+ }
120
+
121
+ requestParams = {
122
+ GET: ApiRequest.adapt(),
123
+ POST: ApiRequest.adapt(),
124
+ PUT: ApiRequest.adapt(),
125
+ DELETE: ApiRequest.adapt(),
126
+ STREAM: ApiRequest.adapt(),
127
+ }
128
+
129
+ streamTypes = [
130
+ { id: 'JSON', value: 'json' },
131
+ { id: 'NDJSON', value: 'ndjson' },
132
+ { id: 'AI Streaming', value: 'ai_streaming' },
133
+ { id: 'Event Stream', value: 'event_stream' },
134
+ { id: 'Auto', value: 'auto' },
135
+ ]
136
+
137
+ streamType = 'Auto'
138
+
139
+ @ViewChild("failedState", { static: true }) failedState: any
140
+ @ViewChild("pollingState", { static: true }) pollingState: any
141
+
142
+ downloadRequest = ApiRequest.adapt({
143
+ server: 'assets/images',
144
+ path: ['lego.png'],
145
+ saveAs: 'john.jpg', // Optional
146
+ headers: { 'Authorization': 'Bearer Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6InJ0c0ZULWItN0x1WTdEVlllU05LY0lKN1ZuYyJ9.eyJhdWQiOiI4ODhhMzFjZS01OWQzLTRhMTItYTU5Ni04ZDYyZjY0MWI1MDUiLCJpc3MiOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vNmY0MTE5ODItY2YyMy00ZTQ1LTk0NDktNGI2MDdiN2E4OGVjL3YyLjAiLCJpYXQiOjE3NjU4MzQxNDksIm5iZiI6MTc2NTgzNDE0OSwiZXhwIjoxNzY1ODM5NzQ2LCJhY2N0IjowLCJhaW8iOiJBV1FBbS84YUFBQUFVUEZOYUhSZkZ4ZVkwRWthcFBzdWZaNG1QYXV6YVRoODRRZUtQRzkrbEFIVE5XanVwQy9ZSjEwK2IrMktWVlJSSXZRNFpwS2xyWTFGd0xRZmtXOTNLbkRNckxSeEMzWTVOOGlQREZ4b1liZExucW1QL1N1ZE1pRW1Va05tTklSWSIsImF6cCI6Ijg4OGEzMWNlLTU5ZDMtNGExMi1hNTk2LThkNjJmNjQxYjUwNSIsImF6cGFjciI6IjAiLCJncm91cHMiOlsiZWE2ZDk5YjAtNDgyNC00MDU0LTk0MTQtZDNhOTZkZDA3MjRiIl0sIm5hbWUiOiJHVExDIEFwcCBTdXBlciBBZG1pbiIsIm9pZCI6IjI2NzUxY2I2LWNlMDEtNDMzMC05OTc0LWZjMzgxMjQ3YTEzYyIsInByZWZlcnJlZF91c2VybmFtZSI6Imd0bGMwMDNAZ3RsYy5jYSIsInJoIjoiMS5BUzRBZ2hsQmJ5UFBSVTZVU1V0Z2UzcUk3TTR4aW9qVFdSSktwWmFOWXZaQnRRVm1BYTR1QUEuIiwicm9sZXMiOlsiZ3RsYy5hY2wuc3VwZXJhZG1pbiJdLCJzY3AiOiJHVExDX0FwcGxpY2F0aW9uIiwic2lkIjoiMDAzZjVhZDktZmJmNi1jZTkyLTg3MjItMWEzNDExYjMzMDJiIiwic3ViIjoiS0RYQ3drVlhUbTRUUmcwaTkxbXZDZzgtQ29uLXpWbk5FQ2Y5LVg0dkpzUSIsInRpZCI6IjZmNDExOTgyLWNmMjMtNGU0NS05NDQ5LTRiNjA3YjdhODhlYyIsInVwbiI6Imd0bGMwMDNAZ3RsYy5jYSIsInV0aSI6InpBaTJoMmpVUUVHbVY0RTJXMWxqQUEiLCJ2ZXIiOiIyLjAiLCJ3aWRzIjpbImI3OWZiZjRkLTNlZjktNDY4OS04MTQzLTc2YjE5NGU4NTUwOSJdLCJ4bXNfZnRkIjoiUDJraW1ZM0tqc1BTRndxNHlZdmJ0bGhrSUk3d2tXNmFpcW1FQ1BaNEdja0JkWE5sWVhOMExXUnpiWE0ifQ.LzppoggMm27smSAy9SamtPN95vCzdELCAfhtOj5n_T_H6g9xCmNRLS9FaUFQMau6Qvl0lROKl7WDklTswLFkfxbIxCBWtXdL-LTqT5cDURSJAll8vC3zlN3Hg9pAFBUVZFRolt6Z7LvPdI3pvUOQs0yFwVzp9k6cLF8aemKdwKQrMX3XXua1MfBWZcqQ4WiBVNmKh8w6yQB35I4u5WqdFnu33nUGb-kvc18SOpoUfiJnlV-PudaEzFXdU3CjAaMEcuPFv5xLwWJKuhU73dNH4EyQDFMVGtcIHNnieOfiY_nK2_0-5DM6aI40UIRK6Bt-HmMQpnbhLps5y3ep6Z7RNw' } // Optional
147
+ })
148
+
149
+ // downloadRequest = ApiRequest.adapt({
150
+ // server: 'oidc/ai/file'
151
+ // })
152
+
153
+ sampleClientData = {
154
+ id: 0,
155
+ name: "Old School Dates",
156
+ domain: "osd.com",
157
+ service: "osd",
158
+ spiffe: "osd.com/osd",
159
+ secret: "SMOPECXP-OS4P-USOG-X2II-3XMD1FQDR3IJX",
160
+ created: 1693003138,
161
+ modified: 1693003138,
162
+ icon: "",
163
+ imageFile: "",
164
+ email: "wavecoders@gmail.com"
165
+ }
166
+
167
+ requestForm = this.fb.group({
168
+ path: this.fb.control<string>("ai/"),
169
+ headers: this.fb.array([]),
170
+ adapter: [null],
171
+ mapper: [null],
172
+ retry: this.fb.group({
173
+ times: [3],
174
+ delay: [3],
175
+ }),
176
+ polling: [3],
177
+ })
178
+
179
+ AIType = 0
180
+
181
+ sampleAdaptors = [
182
+ { label: "ClientInfo Basic", value: ClientInfo.adapt },
183
+ { label: "AI Prompt", value: AIPrompt.adapt },
184
+ ]
185
+
186
+ sampleMappers = [
187
+ { label: "Mapper Basic", value: ClientInfoMapper.adapt },
188
+ { label: "AI Prompt", value: AIPrompt.adapt },
189
+ ]
190
+
191
+ get retry() {
192
+ return this.requestForm.get('retry')?.value
193
+ }
194
+
195
+ get headers(): FormArray {
196
+ return this.requestForm.get('headers') as FormArray
197
+ }
198
+
199
+ get isValid() {
200
+ this.requestForm.markAllAsTouched()
201
+ return this.requestForm.valid
202
+ }
203
+
204
+ hasId = (arr: any[]) => {
205
+ if (arr.length === 0) return false
206
+ return !isNaN(arr[arr.length - 1])
207
+ }
208
+
209
+ props = (adapter: any) => {
210
+ return (adapter) ? adapter() : null
211
+ }
212
+
213
+ // server = `http://sample-endpoint/as/authorization.oauth2`
214
+
215
+ arrayObjectsToObjects = (arr: any[]) => {
216
+ return Array.isArray(arr) ? arr.reduce((obj, item) => Object.assign(obj, { [item.key]: item.value }), {}) : {}
217
+ }
218
+
219
+ constructor() { }
220
+
221
+ ngOnInit() {
222
+
223
+ // const reqGet2 = ApiRequest.adapt({
224
+ // server,
225
+ // path: ['clients'],
226
+ // headers: { authentication: "Bearer <KEY>" },
227
+ // adapter: ClientInfo,
228
+ // dataType: DataType.OBJECT,
229
+ // // concurrent: false,
230
+ // // polling: 3, //seconds
231
+ // })
232
+
233
+ // const req2 = [1024,1025,1026].map(item => {
234
+ // return this.httpManagerService.getRequest<ClientInfo[]>(reqGet2, [item])
235
+ // .pipe(
236
+ // catchError(error => {
237
+ // return throwError(() => new Error(error.error.message))
238
+ // })
239
+ // )
240
+ // })
241
+
242
+ // forkJoin(req2)
243
+ // .subscribe(res => console.log(res))
244
+
245
+ }
246
+
247
+ onStreamType(type: string) {
248
+ this.streamType = type
249
+ }
250
+
251
+ addHeader() {
252
+ const header = this.fb.group({
253
+ key: ['', Validators.required],
254
+ value: ['']
255
+ })
256
+ this.headers.push(header)
257
+ }
258
+
259
+ removeHeader(index: number) {
260
+ this.headers.removeAt(index)
261
+ }
262
+
263
+ compileRequest() {
264
+
265
+ const requestParams = this.requestForm.value
266
+
267
+ requestParams.headers = this.arrayObjectsToObjects(
268
+ requestParams.headers || []
269
+ )
270
+
271
+ const pathReq = (requestParams.path === "") ? [] : (requestParams.path || "").split("/")
272
+
273
+ if (!this.pollingState.checked) requestParams.polling = 0
274
+
275
+ if (!this.failedState.checked) {
276
+ requestParams.retry = { times: 0,delay: 0 }
277
+ }
278
+
279
+ const apiOptions = ApiRequest.adapt(requestParams)
280
+ apiOptions.displayError = true
281
+ apiOptions.path = []
282
+ apiOptions.server = this.server
283
+ apiOptions.adapter = this.adapter
284
+ apiOptions.mapper = this.mapper
285
+ return { apiOptions: apiOptions, path: pathReq }
286
+
287
+ }
288
+
289
+ onGetRequest() {
290
+
291
+ if(!this.isValid) return
292
+
293
+ const reqParams = this.compileRequest()
294
+
295
+ this.requestParams.GET = reqParams.apiOptions
296
+
297
+ this.GET$ = EMPTY //Cancels Previous
298
+ this.GET_error$.next('')
299
+
300
+ this.GET$ = this.httpManagerService.getRequest<ClientInfo[]>({...reqParams.apiOptions}, reqParams.path)
301
+ .pipe(
302
+ // tap((data) => console.log("API GET response", data)),
303
+ catchError(error => {
304
+ return throwError(() => this.errorHandling(error, 'GET'))
305
+ })
306
+ )
307
+
308
+ }
309
+
310
+ onCreateRequest() {
311
+
312
+ if(!this.isValid) return
313
+
314
+ const reqParams = this.compileRequest()
315
+ this.requestParams.POST = reqParams.apiOptions
316
+
317
+ this.POST$ = EMPTY //Cancels Previous
318
+ this.POST_error$.next('')
319
+
320
+ console.log("POST", this.sampleClientData)
321
+ console.log("POST", reqParams.apiOptions)
322
+ console.log("POST", reqParams.path)
323
+
324
+ this.POST$ = this.httpManagerService.postRequest<ClientInfo>(this.sampleClientData, reqParams.apiOptions, reqParams.path)
325
+ .pipe(
326
+ // tap((data) => console.log("API POST response", data)),
327
+ catchError(error => {
328
+ return throwError(() => this.errorHandling(error, 'POST'))
329
+ })
330
+ )
331
+
332
+ }
333
+
334
+ onUpdateRequest() {
335
+
336
+ if(!this.isValid) return
337
+
338
+ const reqParams = this.compileRequest()
339
+
340
+ if(!this.hasId(reqParams.path)) {
341
+ console.log("Missing ID")
342
+ return
343
+ }
344
+
345
+ this.sampleClientData.id = parseInt(reqParams.path[reqParams.path.length-1])
346
+ this.requestParams.PUT = reqParams.apiOptions
347
+
348
+ this.PUT$ = EMPTY //Cancels Previous
349
+ this.PUT_error$.next('')
350
+
351
+ this.PUT$ = this.httpManagerService.putRequest<any>(this.sampleClientData, reqParams.apiOptions, reqParams.path)
352
+ .pipe(
353
+ // tap((data) => console.log("API PUT response", data)),
354
+ catchError(error => {
355
+ return throwError(() => this.errorHandling(error, 'PUT'))
356
+ })
357
+ )
358
+
359
+ }
360
+
361
+ onDeleteRequest() {
362
+
363
+ if(!this.isValid) return
364
+
365
+ const reqParams = this.compileRequest()
366
+ this.requestParams.DELETE = reqParams.apiOptions
367
+
368
+ if(!this.hasId(reqParams.path)) {
369
+ console.log("Missing ID")
370
+ return
371
+ }
372
+
373
+ this.sampleClientData.id = parseInt(reqParams.path[reqParams.path.length-1])
374
+ this.requestParams.DELETE = reqParams.apiOptions
375
+
376
+ this.DELETE$ = EMPTY //Cancels Previous
377
+ this.DELETE_error$.next('')
378
+
379
+ this.DELETE$ = this.httpManagerService.deleteRequest<ClientInfo>(reqParams.apiOptions, reqParams.path)
380
+ .pipe(
381
+ // tap((data) => console.log("API DELETE response", data)),
382
+ catchError(error => {
383
+ return throwError(() => this.errorHandling(error, 'DELETE'))
384
+ })
385
+ )
386
+
387
+ }
388
+
389
+ onStreamPostRequest() {
390
+
391
+ if (!this.isValid) return
392
+
393
+ const reqParams = this.compileRequest()
394
+
395
+ let payload = {}
396
+ let apiPath: string[] = reqParams.path
397
+ let apiOptions = reqParams.apiOptions
398
+ let responseMapper: (items: any) => any = (items) => items.response
399
+
400
+ if (this.AIType === 0) {
401
+
402
+ // API request
403
+ payload = { prompt: this.questionControl.value }
404
+
405
+ } else {
406
+
407
+ // Local Ollama request
408
+ apiOptions.server = "api"
409
+ apiPath = ["generate"]
410
+ apiOptions.stream = true
411
+ apiOptions.streamType = this.streamType as StreamType
412
+ payload = {
413
+ model: "phi3:latest",
414
+ prompt: this.questionControl.value,
415
+ stream: true,
416
+ }
417
+
418
+ responseMapper = (items) => items.map((word: any) => word.response).flat().join('')
419
+
420
+ }
421
+
422
+ this.requestParams.STREAM = apiOptions
423
+ this.STREAM_AI$ = EMPTY
424
+ this.STREAM_AI_error$.next('')
425
+
426
+ this.STREAM_AI$ = this.httpManagerService.postRequest<any>(payload, apiOptions, apiPath).pipe(
427
+ map(responseMapper),
428
+ tap(() => this.questionControl.reset()),
429
+ catchError(error => throwError(() => this.errorHandling(error, 'STREAM')))
430
+ )
431
+
432
+ }
433
+
434
+
435
+ onStreamRequest() {
436
+
437
+ if(!this.isValid) return
438
+
439
+ const reqParams = this.compileRequest()
440
+
441
+ reqParams.apiOptions.stream = true
442
+ reqParams.apiOptions.streamType = StreamType.NDJSON
443
+
444
+ this.requestParams.GET = reqParams.apiOptions
445
+ this.STREAM$ = this.httpManagerService.getRequest<ClientInfo[]>(reqParams.apiOptions, reqParams.path)
446
+ .pipe(
447
+ tap((data) => {
448
+ console.log("API STREAM response", data)
449
+ if (data && data.length > 0) {
450
+ this.updateDisplayedColumns(data)
451
+ }
452
+ }),
453
+ catchError(error => {
454
+ return throwError(() => this.errorHandling(error, 'STREAM'))
455
+ })
456
+ )
457
+
458
+ }
459
+
460
+ onDownloadCompleted() {
461
+
462
+ const message = "Download Completed"
463
+
464
+ const display = ToastDisplay.adapt({
465
+ message,
466
+ action: 'Ok',
467
+ color: ToastColors.SUCCESS,
468
+ icon: 'sentiment_satisfied_alt',
469
+ })
470
+
471
+ this.toastMessage.toastMessage(display)
472
+ }
473
+
474
+ onDownloadFailed(err: string) {
475
+
476
+ const message = "Download Failed"
477
+
478
+ const display = ToastDisplay.adapt({
479
+ message,
480
+ action: 'Ok',
481
+ color: ToastColors.ERROR,
482
+ icon: 'warning',
483
+ })
484
+
485
+ this.toastMessage.toastMessage(display)
486
+ }
487
+
488
+ errorHandling(err: any, type: string) {
489
+ if(type === 'GET') this.GET_error$.next(err.message)
490
+ if(type === 'POST') this.POST_error$.next(err.message)
491
+ if(type === 'PUT') this.PUT_error$.next(err.message)
492
+ if(type === 'DELETE') this.DELETE_error$.next(err.message)
493
+ if(type === 'STREAM') this.STREAM_error$.next(err.message)
494
+ }
495
+
496
+ onSelectAIType(type: number) {
497
+ this.AIType = type
498
+ }
499
+
500
+ // ═══════════════════════════════════════════════════════════════════════════
501
+ // BATCH REQUEST DEMO METHODS
502
+ // ═══════════════════════════════════════════════════════════════════════════
503
+
504
+ /**
505
+ * Execute parallel batch request - fetch 5 users from JSONPlaceholder with individual states
506
+ */
507
+ onExecuteParallelBatch() {
508
+ this.isParallelLoading = true
509
+ this.parallelError = undefined
510
+ this.parallelExecutionTime = undefined
511
+ this.parallelResults = undefined
512
+
513
+ const requests = this.createBatchRequests(
514
+ 'https://jsonplaceholder.typicode.com',
515
+ ['users'],
516
+ [1, 2, 3, 4, 5]
517
+ )
518
+
519
+ const startTime = performance.now()
520
+
521
+ this.httpManagerService.getParallelRequest(requests, BatchOptions.adapt({
522
+ concurrency: 3,
523
+ ignoreErrors: true,
524
+ logErrors: true
525
+ })).pipe(
526
+ tap(results => {
527
+ this.parallelResults = results
528
+ this.parallelExecutionTime = performance.now() - startTime
529
+ this.isParallelLoading = false
530
+ }),
531
+ catchError(error => {
532
+ this.parallelError = error.message || 'Parallel batch failed'
533
+ this.isParallelLoading = false
534
+ return throwError(() => error)
535
+ })
536
+ ).subscribe()
537
+ }
538
+
539
+ /**
540
+ * Execute sequential batch request - fetch 5 todos from JSONPlaceholder with individual states
541
+ */
542
+ onExecuteSequentialBatch() {
543
+ this.isSequentialLoading = true
544
+ this.sequentialError = undefined
545
+ this.sequentialExecutionTime = undefined
546
+ this.sequentialResults = undefined
547
+
548
+ const requests = this.createBatchRequests(
549
+ 'https://jsonplaceholder.typicode.com',
550
+ ['todos'],
551
+ [1, 2, 3, 4, 5]
552
+ )
553
+
554
+ const startTime = performance.now()
555
+
556
+ this.httpManagerService.getSequentialRequest(requests, BatchOptions.adapt({
557
+ stopOnError: false,
558
+ ignoreErrors: true,
559
+ logErrors: true
560
+ })).pipe(
561
+ tap(results => {
562
+ this.sequentialResults = results
563
+ this.sequentialExecutionTime = performance.now() - startTime
564
+ this.isSequentialLoading = false
565
+ }),
566
+ catchError(error => {
567
+ this.sequentialError = error.message || 'Sequential batch failed'
568
+ this.isSequentialLoading = false
569
+ return throwError(() => error)
570
+ })
571
+ ).subscribe()
572
+ }
573
+
574
+ /**
575
+ * Execute stream batch request - fetch 5 posts with real-time state updates
576
+ */
577
+ onExecuteStreamBatch() {
578
+ this.isStreamLoading = true
579
+ this.streamError = undefined
580
+ this.streamExecutionTime = undefined
581
+ this.streamBatchStates = []
582
+ this.streamProgress = undefined
583
+
584
+ const requests = this.createBatchRequests(
585
+ 'https://jsonplaceholder.typicode.com',
586
+ ['posts'],
587
+ [1, 2, 3, 4, 5]
588
+ )
589
+
590
+ const startTime = performance.now()
591
+
592
+ this.httpManagerService.getBatchRequestsStream(requests, {
593
+ mode: 'parallel',
594
+ concurrency: 3,
595
+ stopOnError: false,
596
+ ignoreErrors: true,
597
+ logErrors: true
598
+ }).pipe(
599
+ tap(state => {
600
+ this.streamBatchStates[state.index] = state
601
+ this.streamProgress = calculateBatchProgress(this.streamBatchStates.filter(s => s !== undefined) as BatchRequestState<any>[]);
602
+
603
+ if (!state.isPending) {
604
+ this.streamExecutionTime = performance.now() - startTime
605
+ }
606
+
607
+ this.isStreamLoading = this.streamBatchStates.some(s => s && s.isPending)
608
+ }),
609
+ catchError(error => {
610
+ this.streamError = error.message || 'Stream batch failed'
611
+ this.isStreamLoading = false
612
+ return throwError(() => error)
613
+ })
614
+ ).subscribe()
615
+ }
616
+
617
+ /**
618
+ * Type guard for pending state
619
+ */
620
+ isPendingState(state: BatchRequestState<any>): boolean {
621
+ return state.isPending === true
622
+ }
623
+
624
+ /**
625
+ * Type guard for success state
626
+ */
627
+ isSuccessState(state: BatchRequestState<any>): boolean {
628
+ return state.isPending === false && state.data !== undefined
629
+ }
630
+
631
+ /**
632
+ * Type guard for error state
633
+ */
634
+ isErrorState(state: BatchRequestState<any>): boolean {
635
+ return state.isPending === false && state.error !== undefined
636
+ }
637
+
638
+ /**
639
+ * Helper to create batch requests from IDs
640
+ */
641
+ private createBatchRequests(
642
+ baseUrl: string,
643
+ basePath: string[],
644
+ ids: number[]
645
+ ): ApiRequest[] {
646
+ return ids.map(id =>
647
+ ApiRequest.adapt({
648
+ server: baseUrl,
649
+ path: [...basePath, id]
650
+ })
651
+ )
652
+ }
653
+
654
+ /**
655
+ * Check if result is successful (not undefined)
656
+ */
657
+ isSuccess(result: any): boolean {
658
+ return result !== undefined && result !== null
659
+ }
660
+
661
+ /**
662
+ * Format execution time for display
663
+ */
664
+ formatTime(ms: number): string {
665
+ if (ms < 1000) {
666
+ return `${Math.round(ms)}ms`
667
+ }
668
+ return `${(ms / 1000).toFixed(2)}s`
669
+ }
670
+
671
+ /**
672
+ * Get success count from results array
673
+ */
674
+ getSuccessCount(results?: any[]): number {
675
+ if (!results) return 0
676
+ return results.filter(r => r !== undefined).length
677
+ }
678
+
679
+ /**
680
+ * Get failure count from results array
681
+ */
682
+ getFailureCount(results?: any[]): number {
683
+ if (!results) return 0
684
+ return results.filter(r => r === undefined).length
685
+ }
686
+
687
+ }