http-request-manager 18.15.33 → 18.15.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/TEST_COVERAGE_SUMMARY.md +458 -0
  2. package/ng-package.json +8 -0
  3. package/package.json +4 -13
  4. package/src/docs/ADVANCED_WEBSOCKET.md +633 -0
  5. package/src/docs/ARCHITECTURE.md +633 -0
  6. package/src/docs/BATCH_REQUEST_README.md +467 -0
  7. package/src/docs/COMPLETE_API_REFERENCE.md +1037 -0
  8. package/src/docs/DATABASE_README.md +1195 -0
  9. package/src/docs/ENCRYPTION_README.md +403 -0
  10. package/src/docs/HTTP_MANAGER_README.md +628 -0
  11. package/src/docs/HTTP_SINGNALS_MANAGER_README.md +654 -0
  12. package/src/docs/HTTP_STATE_MANAGER_README.md +1391 -0
  13. package/src/docs/INTERCEPTOR_README.md +549 -0
  14. package/src/docs/LOCAL_STORAGE_README.md +1056 -0
  15. package/src/docs/LOCAL_STORAGE_SIGNALS_README.md +338 -0
  16. package/src/docs/LOGGER_README.md +310 -0
  17. package/src/docs/MESSAGE_TRACKER_README.md +518 -0
  18. package/src/docs/MESSAGE_TRACKER_SIGNALS_README.md +563 -0
  19. package/src/docs/MODELS_README.md +1264 -0
  20. package/src/docs/SIGNAL_SERVICES_README.md +238 -0
  21. package/src/docs/SQL_DIXIE_README.md +574 -0
  22. package/src/docs/STORE_STATE_MANAGER_README.md +556 -0
  23. package/src/docs/STORE_STATE_SIGNALS_README.md +600 -0
  24. package/src/docs/UPLOAD_REQUEST_README.md +324 -0
  25. package/src/docs/UTILS_README.md +1604 -0
  26. package/src/docs/WEBSOCKET_MESSAGE_SERVICE.md +799 -0
  27. package/src/docs/WEBSOCKET_SIGNALS_README.md +641 -0
  28. package/src/docs/WEBSOCKET_SINGLETON_REFACTORING.md +201 -0
  29. package/src/docs/WS_MANAGER_README.md +613 -0
  30. package/src/lib/http-request-manager.module.ts +147 -0
  31. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +116 -0
  32. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  33. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +255 -0
  34. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +123 -0
  35. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  36. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +53 -0
  37. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  38. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  39. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +208 -0
  40. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
  41. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
  42. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +214 -0
  43. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.html +53 -0
  44. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.scss +60 -0
  45. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.ts +72 -0
  46. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-download.module.ts +28 -0
  47. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.html +10 -0
  48. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.scss +29 -0
  49. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.ts +100 -0
  50. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/models/download-labels-model.ts +22 -0
  51. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.html +8 -0
  52. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.scss +19 -0
  53. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.ts +26 -0
  54. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app-session.model.ts +30 -0
  55. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app.model.ts +19 -0
  56. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/get-sample.model.ts +25 -0
  57. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-ai-prompt.ts +19 -0
  58. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-details.ts +24 -0
  59. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-info.ts +30 -0
  60. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client.model.ts +49 -0
  61. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-mapper-client-info.ts +33 -0
  62. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.html +279 -0
  63. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.scss +24 -0
  64. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.ts +461 -0
  65. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  66. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  67. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  68. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  69. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  70. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  71. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  72. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  73. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  74. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  75. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  76. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  77. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  78. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  79. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  80. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  81. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  82. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  83. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  84. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +622 -0
  85. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +106 -0
  86. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +687 -0
  87. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +418 -0
  88. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  89. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +576 -0
  90. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +89 -0
  91. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +119 -0
  92. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
  93. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
  94. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
  95. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
  96. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
  97. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
  98. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
  99. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +94 -0
  100. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
  101. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +203 -0
  102. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +144 -0
  103. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
  104. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +102 -0
  105. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +40 -0
  106. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +230 -0
  107. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
  108. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
  109. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
  110. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
  111. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
  112. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
  113. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
  114. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
  115. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +40 -0
  116. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
  117. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/jwt-token.service.ts +62 -0
  118. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
  119. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
  120. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +168 -0
  121. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  122. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  123. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  124. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
  125. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
  126. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  127. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  128. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  129. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  130. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  131. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  132. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
  133. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
  134. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
  135. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
  136. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
  137. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
  138. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
  139. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
  140. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
  141. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
  142. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
  143. package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
  144. package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +49 -0
  145. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
  146. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
  147. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
  148. package/src/lib/http-request-services-demo/store-state-signals-demo/store-state-signals-demo.component.ts +161 -0
  149. package/src/lib/http-request-services-demo/upload-demo/models/index.ts +1 -0
  150. package/src/lib/http-request-services-demo/upload-demo/models/upload-state.model.ts +30 -0
  151. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.html +89 -0
  152. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.scss +160 -0
  153. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.spec.ts +101 -0
  154. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.ts +136 -0
  155. package/src/lib/index.ts +3 -0
  156. package/src/lib/interceptors/credentials.interceptor.ts +16 -0
  157. package/src/lib/interceptors/index.ts +6 -0
  158. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  159. package/src/lib/interceptors/models/index.ts +2 -0
  160. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  161. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  162. package/src/lib/interceptors/request-header.interceptor.ts +56 -0
  163. package/src/lib/message-display/README.md +509 -0
  164. package/src/lib/message-display/index.ts +4 -0
  165. package/src/lib/message-display/models/action.model.ts +27 -0
  166. package/src/lib/message-display/models/communication-message.model.ts +77 -0
  167. package/src/lib/message-display/models/display-config.model.ts +35 -0
  168. package/src/lib/message-display/models/display-rule.interface.ts +28 -0
  169. package/src/lib/message-display/models/display-strategy.interface.ts +8 -0
  170. package/src/lib/message-display/models/index.ts +6 -0
  171. package/src/lib/message-display/models/slide.model.ts +24 -0
  172. package/src/lib/message-display/rules/default-display-rules.ts +35 -0
  173. package/src/lib/message-display/services/message-display-router.service.ts +63 -0
  174. package/src/lib/message-display/strategies/snackbar.strategy.ts +46 -0
  175. package/src/lib/models/batch-options.model.ts +33 -0
  176. package/src/lib/models/batch-progress.model.ts +19 -0
  177. package/src/lib/models/batch-request-state.model.ts +40 -0
  178. package/src/lib/models/batch-result.model.ts +30 -0
  179. package/src/lib/models/config-http-options.model.ts +45 -0
  180. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  181. package/src/lib/models/config-options.model.ts +27 -0
  182. package/src/lib/models/config-token.model.ts +9 -0
  183. package/src/lib/models/data-type.enum.ts +5 -0
  184. package/src/lib/models/database-storage.model.ts +24 -0
  185. package/src/lib/models/index.ts +16 -0
  186. package/src/lib/models/retry-options.model.ts +22 -0
  187. package/src/lib/models/upload-validation-error.model.ts +46 -0
  188. package/src/lib/services/SQL-DixieJS service/dexie-query-executor.ts +246 -0
  189. package/src/lib/services/SQL-DixieJS service/dexie-sql.service.ts +31 -0
  190. package/src/lib/services/SQL-DixieJS service/index.ts +4 -0
  191. package/src/lib/services/SQL-DixieJS service/models/execution-plan.model.ts +52 -0
  192. package/src/lib/services/SQL-DixieJS service/models/index.ts +3 -0
  193. package/src/lib/services/SQL-DixieJS service/models/sql-errors.model.ts +13 -0
  194. package/src/lib/services/SQL-DixieJS service/models/sql-options.model.ts +3 -0
  195. package/src/lib/services/SQL-DixieJS service/query-planner.ts +284 -0
  196. package/src/lib/services/SQL-DixieJS service/schema-validator.ts +217 -0
  197. package/src/lib/services/SQL-DixieJS service/sql-parser.ts +35 -0
  198. package/src/lib/services/database-manager-service/database.manager.service.ts +384 -0
  199. package/src/lib/services/database-manager-service/db.storage.service.ts +240 -0
  200. package/src/lib/services/database-manager-service/index.ts +4 -0
  201. package/src/lib/services/database-manager-service/models/index.ts +2 -0
  202. package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
  203. package/src/lib/services/index.ts +20 -0
  204. package/src/lib/services/local-storage-manager-service/index.ts +4 -0
  205. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  206. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +567 -0
  207. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
  208. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +437 -0
  209. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  210. package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
  211. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
  212. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  213. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
  214. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  215. package/src/lib/services/request-manager-services/README.md +282 -0
  216. package/src/lib/services/request-manager-services/http-manager-signals.service.ts +674 -0
  217. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +353 -0
  218. package/src/lib/services/request-manager-services/http-manager.service.ts +727 -0
  219. package/src/lib/services/request-manager-services/index.ts +8 -0
  220. package/src/lib/services/request-manager-services/request-signals.service.ts +372 -0
  221. package/src/lib/services/request-manager-services/request.service.ts +435 -0
  222. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  223. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  224. package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
  225. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
  226. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +468 -0
  227. package/src/lib/services/request-manager-state-service/http-manager-state.store.spec.ts +665 -0
  228. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +2395 -0
  229. package/src/lib/services/request-manager-state-service/index.ts +3 -0
  230. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +86 -0
  231. package/src/lib/services/request-manager-state-service/models/index.ts +14 -0
  232. package/src/lib/services/request-manager-state-service/models/operation-result.model.ts +18 -0
  233. package/src/lib/services/request-manager-state-service/models/parsing-result.model.ts +21 -0
  234. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +37 -0
  235. package/src/lib/services/request-manager-state-service/models/stream-config.model.ts +20 -0
  236. package/src/lib/services/request-manager-state-service/models/stream-event-metadata.model.ts +23 -0
  237. package/src/lib/services/request-manager-state-service/models/stream-event.model.ts +23 -0
  238. package/src/lib/services/request-manager-state-service/models/stream-output.model.ts +23 -0
  239. package/src/lib/services/request-manager-state-service/models/stream-progress.model.ts +24 -0
  240. package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
  241. package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +42 -0
  242. package/src/lib/services/store-state-manager-service/index.ts +4 -0
  243. package/src/lib/services/store-state-manager-service/models/index.ts +3 -0
  244. package/src/lib/services/store-state-manager-service/models/state-operation-result.model.ts +30 -0
  245. package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
  246. package/src/lib/services/store-state-manager-service/store-state-manager-signals.service.ts +169 -0
  247. package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +153 -0
  248. package/src/lib/services/utils/app.service.spec.ts +25 -0
  249. package/src/lib/services/utils/app.service.ts +21 -0
  250. package/src/lib/services/utils/encryption/README.md +79 -0
  251. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  252. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  253. package/src/lib/services/utils/encryption/index.ts +5 -0
  254. package/src/lib/services/utils/encryption/random.ts +81 -0
  255. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +106 -0
  256. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  257. package/src/lib/services/utils/headers.service.ts +18 -0
  258. package/src/lib/services/utils/index.ts +9 -0
  259. package/src/lib/services/utils/logger.service.ts +90 -0
  260. package/src/lib/services/utils/models/index.ts +4 -0
  261. package/src/lib/services/utils/models/normalized-request-options.model.ts +24 -0
  262. package/src/lib/services/utils/models/path-tracker-state.model.ts +20 -0
  263. package/src/lib/services/utils/models/query-params-tracker-options.model.ts +24 -0
  264. package/src/lib/services/utils/models/query-tracker-state.model.ts +23 -0
  265. package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
  266. package/src/lib/services/utils/object-merger.service.ts +78 -0
  267. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  268. package/src/lib/services/utils/path-query.service.ts +69 -0
  269. package/src/lib/services/utils/query-params-tracker.service.ts +442 -0
  270. package/src/lib/services/utils/random-color.utils.ts +83 -0
  271. package/src/lib/services/utils/utils.service.spec.ts +165 -0
  272. package/src/lib/services/utils/utils.service.ts +192 -0
  273. package/src/lib/services/ws-manager-service/index.ts +13 -0
  274. package/src/lib/services/ws-manager-service/message-tracker-signals.service.ts +147 -0
  275. package/src/lib/services/ws-manager-service/message-tracker.service.ts +477 -0
  276. package/src/lib/services/ws-manager-service/models/channel-info.model.ts +29 -0
  277. package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
  278. package/src/lib/services/ws-manager-service/models/channel-message.model.ts +36 -0
  279. package/src/lib/services/ws-manager-service/models/channel-type.enum.ts +6 -0
  280. package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
  281. package/src/lib/services/ws-manager-service/models/index.ts +10 -0
  282. package/src/lib/services/ws-manager-service/models/notification-message.model.ts +29 -0
  283. package/src/lib/services/ws-manager-service/models/public-message.model.ts +18 -0
  284. package/src/lib/services/ws-manager-service/models/state-message.model.ts +18 -0
  285. package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
  286. package/src/lib/services/ws-manager-service/services/index.ts +4 -0
  287. package/src/lib/services/ws-manager-service/services/websocket-message.service.ts +129 -0
  288. package/src/lib/services/ws-manager-service/services/websocket.service.ts +434 -0
  289. package/src/lib/services/ws-manager-service/websocket-service/index.ts +1 -0
  290. package/src/lib/services/ws-manager-service/websocket-service/websocket-manager.service.ts +716 -0
  291. package/src/lib/services/ws-manager-service/websocket-services-complete.spec.ts +596 -0
  292. package/src/lib/services/ws-manager-service/websocket-signals-manager.service.ts +141 -0
  293. package/src/public-api.ts +19 -0
  294. package/tsconfig.lib.json +34 -0
  295. package/tsconfig.lib.prod.json +10 -0
  296. package/tsconfig.spec.json +14 -0
  297. package/fesm2022/http-request-manager.mjs +0 -13688
  298. package/fesm2022/http-request-manager.mjs.map +0 -1
  299. package/http-request-manager-18.15.33.tgz +0 -0
  300. package/types/http-request-manager.d.ts +0 -3968
@@ -0,0 +1,461 @@
1
+ import { Component, Input, OnInit, ViewChild, inject } from '@angular/core'
2
+
3
+ import { BehaviorSubject, EMPTY, Observable, throwError } from 'rxjs'
4
+ import { FormArray, FormBuilder, Validators } from '@angular/forms'
5
+
6
+ import { ClientInfo } from './models/sample-client-info'
7
+ import { ClientInfoMapper } from './models/sample-mapper-client-info'
8
+ import { AIPrompt } from './models/sample-ai-prompt'
9
+ import { ApiRequest, HTTPManagerService, StreamType } from '../..'
10
+ import { catchError, map, tap } from 'rxjs/operators'
11
+
12
+ import { ToastColors, ToastDisplay, ToastMessageDisplayService } from 'toast-message-display'
13
+
14
+ @Component({
15
+ selector: 'app-request-manager-basic-demo',
16
+ templateUrl: './request-manager-basic-demo.component.html',
17
+ styleUrls: ['./request-manager-basic-demo.component.scss'],
18
+ providers: [HTTPManagerService],
19
+ standalone: false
20
+ })
21
+ export class RequestManagerBasicDemoComponent implements OnInit {
22
+
23
+ server = 'http://localhost:8080'
24
+ adapter?: Function
25
+ 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
+ requestParams = {
84
+ GET: ApiRequest.adapt(),
85
+ POST: ApiRequest.adapt(),
86
+ PUT: ApiRequest.adapt(),
87
+ DELETE: ApiRequest.adapt(),
88
+ STREAM: ApiRequest.adapt(),
89
+ }
90
+
91
+ streamTypes = [
92
+ { id: 'JSON', value: 'json' },
93
+ { id: 'NDJSON', value: 'ndjson' },
94
+ { id: 'AI Streaming', value: 'ai_streaming' },
95
+ { id: 'Event Stream', value: 'event_stream' },
96
+ { id: 'Auto', value: 'auto' },
97
+ ]
98
+
99
+ streamType = 'Auto'
100
+
101
+ @ViewChild("failedState", { static: true }) failedState: any
102
+ @ViewChild("pollingState", { static: true }) pollingState: any
103
+
104
+ downloadRequest = ApiRequest.adapt({
105
+ server: 'assets/images',
106
+ path: ['lego.png'],
107
+ saveAs: 'john.jpg', // Optional
108
+ headers: { 'Authorization': 'Bearer Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6InJ0c0ZULWItN0x1WTdEVlllU05LY0lKN1ZuYyJ9.eyJhdWQiOiI4ODhhMzFjZS01OWQzLTRhMTItYTU5Ni04ZDYyZjY0MWI1MDUiLCJpc3MiOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vNmY0MTE5ODItY2YyMy00ZTQ1LTk0NDktNGI2MDdiN2E4OGVjL3YyLjAiLCJpYXQiOjE3NjU4MzQxNDksIm5iZiI6MTc2NTgzNDE0OSwiZXhwIjoxNzY1ODM5NzQ2LCJhY2N0IjowLCJhaW8iOiJBV1FBbS84YUFBQUFVUEZOYUhSZkZ4ZVkwRWthcFBzdWZaNG1QYXV6YVRoODRRZUtQRzkrbEFIVE5XanVwQy9ZSjEwK2IrMktWVlJSSXZRNFpwS2xyWTFGd0xRZmtXOTNLbkRNckxSeEMzWTVOOGlQREZ4b1liZExucW1QL1N1ZE1pRW1Va05tTklSWSIsImF6cCI6Ijg4OGEzMWNlLTU5ZDMtNGExMi1hNTk2LThkNjJmNjQxYjUwNSIsImF6cGFjciI6IjAiLCJncm91cHMiOlsiZWE2ZDk5YjAtNDgyNC00MDU0LTk0MTQtZDNhOTZkZDA3MjRiIl0sIm5hbWUiOiJHVExDIEFwcCBTdXBlciBBZG1pbiIsIm9pZCI6IjI2NzUxY2I2LWNlMDEtNDMzMC05OTc0LWZjMzgxMjQ3YTEzYyIsInByZWZlcnJlZF91c2VybmFtZSI6Imd0bGMwMDNAZ3RsYy5jYSIsInJoIjoiMS5BUzRBZ2hsQmJ5UFBSVTZVU1V0Z2UzcUk3TTR4aW9qVFdSSktwWmFOWXZaQnRRVm1BYTR1QUEuIiwicm9sZXMiOlsiZ3RsYy5hY2wuc3VwZXJhZG1pbiJdLCJzY3AiOiJHVExDX0FwcGxpY2F0aW9uIiwic2lkIjoiMDAzZjVhZDktZmJmNi1jZTkyLTg3MjItMWEzNDExYjMzMDJiIiwic3ViIjoiS0RYQ3drVlhUbTRUUmcwaTkxbXZDZzgtQ29uLXpWbk5FQ2Y5LVg0dkpzUSIsInRpZCI6IjZmNDExOTgyLWNmMjMtNGU0NS05NDQ5LTRiNjA3YjdhODhlYyIsInVwbiI6Imd0bGMwMDNAZ3RsYy5jYSIsInV0aSI6InpBaTJoMmpVUUVHbVY0RTJXMWxqQUEiLCJ2ZXIiOiIyLjAiLCJ3aWRzIjpbImI3OWZiZjRkLTNlZjktNDY4OS04MTQzLTc2YjE5NGU4NTUwOSJdLCJ4bXNfZnRkIjoiUDJraW1ZM0tqc1BTRndxNHlZdmJ0bGhrSUk3d2tXNmFpcW1FQ1BaNEdja0JkWE5sWVhOMExXUnpiWE0ifQ.LzppoggMm27smSAy9SamtPN95vCzdELCAfhtOj5n_T_H6g9xCmNRLS9FaUFQMau6Qvl0lROKl7WDklTswLFkfxbIxCBWtXdL-LTqT5cDURSJAll8vC3zlN3Hg9pAFBUVZFRolt6Z7LvPdI3pvUOQs0yFwVzp9k6cLF8aemKdwKQrMX3XXua1MfBWZcqQ4WiBVNmKh8w6yQB35I4u5WqdFnu33nUGb-kvc18SOpoUfiJnlV-PudaEzFXdU3CjAaMEcuPFv5xLwWJKuhU73dNH4EyQDFMVGtcIHNnieOfiY_nK2_0-5DM6aI40UIRK6Bt-HmMQpnbhLps5y3ep6Z7RNw' } // Optional
109
+ })
110
+
111
+ // downloadRequest = ApiRequest.adapt({
112
+ // server: 'oidc/ai/file'
113
+ // })
114
+
115
+ sampleClientData = {
116
+ id: 0,
117
+ name: "Old School Dates",
118
+ domain: "osd.com",
119
+ service: "osd",
120
+ spiffe: "osd.com/osd",
121
+ secret: "SMOPECXP-OS4P-USOG-X2II-3XMD1FQDR3IJX",
122
+ created: 1693003138,
123
+ modified: 1693003138,
124
+ icon: "",
125
+ imageFile: "",
126
+ email: "wavecoders@gmail.com"
127
+ }
128
+
129
+ requestForm = this.fb.group({
130
+ path: this.fb.control<string>("ai/"),
131
+ headers: this.fb.array([]),
132
+ adapter: [null],
133
+ mapper: [null],
134
+ retry: this.fb.group({
135
+ times: [3],
136
+ delay: [3],
137
+ }),
138
+ polling: [3],
139
+ })
140
+
141
+ AIType = 0
142
+
143
+ sampleAdaptors = [
144
+ { label: "ClientInfo Basic", value: ClientInfo.adapt },
145
+ { label: "AI Prompt", value: AIPrompt.adapt },
146
+ ]
147
+
148
+ sampleMappers = [
149
+ { label: "Mapper Basic", value: ClientInfoMapper.adapt },
150
+ { label: "AI Prompt", value: AIPrompt.adapt },
151
+ ]
152
+
153
+ get retry() {
154
+ return this.requestForm.get('retry')?.value
155
+ }
156
+
157
+ get headers(): FormArray {
158
+ return this.requestForm.get('headers') as FormArray
159
+ }
160
+
161
+ get isValid() {
162
+ this.requestForm.markAllAsTouched()
163
+ return this.requestForm.valid
164
+ }
165
+
166
+ hasId = (arr: any[]) => {
167
+ if (arr.length === 0) return false
168
+ return !isNaN(arr[arr.length - 1])
169
+ }
170
+
171
+ props = (adapter: any) => {
172
+ return (adapter) ? adapter() : null
173
+ }
174
+
175
+ // server = `http://sample-endpoint/as/authorization.oauth2`
176
+
177
+ arrayObjectsToObjects = (arr: any[]) => {
178
+ return Array.isArray(arr) ? arr.reduce((obj, item) => Object.assign(obj, { [item.key]: item.value }), {}) : {}
179
+ }
180
+
181
+ constructor() { }
182
+
183
+ ngOnInit() {
184
+
185
+ // const reqGet2 = ApiRequest.adapt({
186
+ // server,
187
+ // path: ['clients'],
188
+ // headers: { authentication: "Bearer <KEY>" },
189
+ // adapter: ClientInfo,
190
+ // dataType: DataType.OBJECT,
191
+ // // concurrent: false,
192
+ // // polling: 3, //seconds
193
+ // })
194
+
195
+ // const req2 = [1024,1025,1026].map(item => {
196
+ // return this.httpManagerService.getRequest<ClientInfo[]>(reqGet2, [item])
197
+ // .pipe(
198
+ // catchError(error => {
199
+ // return throwError(() => new Error(error.error.message))
200
+ // })
201
+ // )
202
+ // })
203
+
204
+ // forkJoin(req2)
205
+ // .subscribe(res => console.log(res))
206
+
207
+ }
208
+
209
+ onStreamType(type: string) {
210
+ this.streamType = type
211
+ }
212
+
213
+ addHeader() {
214
+ const header = this.fb.group({
215
+ key: ['', Validators.required],
216
+ value: ['']
217
+ })
218
+ this.headers.push(header)
219
+ }
220
+
221
+ removeHeader(index: number) {
222
+ this.headers.removeAt(index)
223
+ }
224
+
225
+ compileRequest() {
226
+
227
+ const requestParams = this.requestForm.value
228
+
229
+ requestParams.headers = this.arrayObjectsToObjects(
230
+ requestParams.headers || []
231
+ )
232
+
233
+ const pathReq = (requestParams.path === "") ? [] : (requestParams.path || "").split("/")
234
+
235
+ if (!this.pollingState.checked) requestParams.polling = 0
236
+
237
+ if (!this.failedState.checked) {
238
+ requestParams.retry = { times: 0,delay: 0 }
239
+ }
240
+
241
+ const apiOptions = ApiRequest.adapt(requestParams)
242
+ apiOptions.path = []
243
+ apiOptions.server = this.server
244
+ apiOptions.adapter = this.adapter
245
+ apiOptions.mapper = this.mapper
246
+ return { apiOptions: apiOptions, path: pathReq }
247
+
248
+ }
249
+
250
+ onGetRequest() {
251
+
252
+ if(!this.isValid) return
253
+
254
+ const reqParams = this.compileRequest()
255
+
256
+ this.requestParams.GET = reqParams.apiOptions
257
+
258
+ this.GET$ = EMPTY //Cancels Previous
259
+ this.GET_error$.next('')
260
+
261
+ this.GET$ = this.httpManagerService.getRequest<ClientInfo[]>({...reqParams.apiOptions}, reqParams.path)
262
+ .pipe(
263
+ // tap((data) => console.log("API GET response", data)),
264
+ catchError(error => {
265
+ return throwError(() => this.errorHandling(error, 'GET'))
266
+ })
267
+ )
268
+
269
+ }
270
+
271
+ onCreateRequest() {
272
+
273
+ if(!this.isValid) return
274
+
275
+ const reqParams = this.compileRequest()
276
+ this.requestParams.POST = reqParams.apiOptions
277
+
278
+ this.POST$ = EMPTY //Cancels Previous
279
+ this.POST_error$.next('')
280
+
281
+ console.log("POST", this.sampleClientData)
282
+ console.log("POST", reqParams.apiOptions)
283
+ console.log("POST", reqParams.path)
284
+
285
+ this.POST$ = this.httpManagerService.postRequest<ClientInfo>(this.sampleClientData, reqParams.apiOptions, reqParams.path)
286
+ .pipe(
287
+ // tap((data) => console.log("API POST response", data)),
288
+ catchError(error => {
289
+ return throwError(() => this.errorHandling(error, 'POST'))
290
+ })
291
+ )
292
+
293
+ }
294
+
295
+ onUpdateRequest() {
296
+
297
+ if(!this.isValid) return
298
+
299
+ const reqParams = this.compileRequest()
300
+
301
+ if(!this.hasId(reqParams.path)) {
302
+ console.log("Missing ID")
303
+ return
304
+ }
305
+
306
+ this.sampleClientData.id = parseInt(reqParams.path[reqParams.path.length-1])
307
+ this.requestParams.PUT = reqParams.apiOptions
308
+
309
+ this.PUT$ = EMPTY //Cancels Previous
310
+ this.PUT_error$.next('')
311
+
312
+ this.PUT$ = this.httpManagerService.putRequest<any>(this.sampleClientData, reqParams.apiOptions, reqParams.path)
313
+ .pipe(
314
+ // tap((data) => console.log("API PUT response", data)),
315
+ catchError(error => {
316
+ return throwError(() => this.errorHandling(error, 'PUT'))
317
+ })
318
+ )
319
+
320
+ }
321
+
322
+ onDeleteRequest() {
323
+
324
+ if(!this.isValid) return
325
+
326
+ const reqParams = this.compileRequest()
327
+ this.requestParams.DELETE = reqParams.apiOptions
328
+
329
+ if(!this.hasId(reqParams.path)) {
330
+ console.log("Missing ID")
331
+ return
332
+ }
333
+
334
+ this.sampleClientData.id = parseInt(reqParams.path[reqParams.path.length-1])
335
+ this.requestParams.DELETE = reqParams.apiOptions
336
+
337
+ this.DELETE$ = EMPTY //Cancels Previous
338
+ this.DELETE_error$.next('')
339
+
340
+ this.DELETE$ = this.httpManagerService.deleteRequest<ClientInfo>(reqParams.apiOptions, reqParams.path)
341
+ .pipe(
342
+ // tap((data) => console.log("API DELETE response", data)),
343
+ catchError(error => {
344
+ return throwError(() => this.errorHandling(error, 'DELETE'))
345
+ })
346
+ )
347
+
348
+ }
349
+
350
+ onStreamPostRequest() {
351
+
352
+ if (!this.isValid) return
353
+
354
+ const reqParams = this.compileRequest()
355
+
356
+ let payload = {}
357
+ let apiPath: string[] = reqParams.path
358
+ let apiOptions = reqParams.apiOptions
359
+ let responseMapper: (items: any) => any = (items) => items.response
360
+
361
+ if (this.AIType === 0) {
362
+
363
+ // API request
364
+ payload = { prompt: this.questionControl.value }
365
+
366
+ } else {
367
+
368
+ // Local Ollama request
369
+ apiOptions.server = "api"
370
+ apiPath = ["generate"]
371
+ apiOptions.stream = true
372
+ apiOptions.streamType = this.streamType as StreamType
373
+ payload = {
374
+ model: "phi3:latest",
375
+ prompt: this.questionControl.value,
376
+ stream: true,
377
+ }
378
+
379
+ responseMapper = (items) => items.map((word: any) => word.response).flat().join('')
380
+
381
+ }
382
+
383
+ this.requestParams.STREAM = apiOptions
384
+ this.STREAM_AI$ = EMPTY
385
+ this.STREAM_AI_error$.next('')
386
+
387
+ this.STREAM_AI$ = this.httpManagerService.postRequest<any>(payload, apiOptions, apiPath).pipe(
388
+ map(responseMapper),
389
+ tap(() => this.questionControl.reset()),
390
+ catchError(error => throwError(() => this.errorHandling(error, 'STREAM')))
391
+ )
392
+
393
+ }
394
+
395
+
396
+ onStreamRequest() {
397
+
398
+ if(!this.isValid) return
399
+
400
+ const reqParams = this.compileRequest()
401
+
402
+ reqParams.apiOptions.stream = true
403
+ reqParams.apiOptions.streamType = StreamType.NDJSON
404
+
405
+ this.requestParams.GET = reqParams.apiOptions
406
+ this.STREAM$ = this.httpManagerService.getRequest<ClientInfo[]>(reqParams.apiOptions, reqParams.path)
407
+ .pipe(
408
+ tap((data) => {
409
+ console.log("API STREAM response", data)
410
+ if (data && data.length > 0) {
411
+ this.updateDisplayedColumns(data)
412
+ }
413
+ }),
414
+ catchError(error => {
415
+ return throwError(() => this.errorHandling(error, 'STREAM'))
416
+ })
417
+ )
418
+
419
+ }
420
+
421
+ onDownloadCompleted() {
422
+
423
+ const message = "Download Completed"
424
+
425
+ const display = ToastDisplay.adapt({
426
+ message,
427
+ action: 'Ok',
428
+ color: ToastColors.SUCCESS,
429
+ icon: 'sentiment_satisfied_alt',
430
+ })
431
+
432
+ this.toastMessage.toastMessage(display)
433
+ }
434
+
435
+ onDownloadFailed(err: string) {
436
+
437
+ const message = "Download Failed"
438
+
439
+ const display = ToastDisplay.adapt({
440
+ message,
441
+ action: 'Ok',
442
+ color: ToastColors.ERROR,
443
+ icon: 'warning',
444
+ })
445
+
446
+ this.toastMessage.toastMessage(display)
447
+ }
448
+
449
+ errorHandling(err: any, type: string) {
450
+ if(type === 'GET') this.GET_error$.next(err.message)
451
+ if(type === 'POST') this.POST_error$.next(err.message)
452
+ if(type === 'PUT') this.PUT_error$.next(err.message)
453
+ if(type === 'DELETE') this.DELETE_error$.next(err.message)
454
+ if(type === 'STREAM') this.STREAM_error$.next(err.message)
455
+ }
456
+
457
+ onSelectAIType(type: number) {
458
+ this.AIType = type
459
+ }
460
+
461
+ }
@@ -0,0 +1,53 @@
1
+ @if (!isPending) {
2
+ @if (hasError) {
3
+ <div class="width center-txt" style="margin-bottom: 4px;">
4
+ <mat-icon color="warn" class="warn-icon">warning</mat-icon>
5
+ </div>
6
+ } @else {
7
+ @if (active) {
8
+ <div class="container-obj">
9
+ <div class="centered-obj-div">
10
+ <mat-progress-spinner
11
+ color="primary"
12
+ mode="indeterminate"
13
+ [diameter]="44"
14
+ ></mat-progress-spinner>
15
+ </div>
16
+ </div>
17
+ } @else {
18
+ <button data-tracking="export-btn" mat-icon-button (click)="onAction()" class="icon-button" [disabled]="disabled">
19
+ <mat-icon class="custom-icon">file_download</mat-icon>
20
+ </button>
21
+ }
22
+ }
23
+ } @else {
24
+ @if ((progress > 0 && progress < 100)) {
25
+ <div
26
+ class="spinner-container"
27
+ >
28
+ <div class="spinner-background">
29
+ {{progress}}%
30
+ </div>
31
+ <mat-progress-spinner
32
+ color="primary"
33
+ [mode]="mode"
34
+ [value]="progress"
35
+ [diameter]="44"
36
+ ></mat-progress-spinner>
37
+ </div>
38
+ } @else {
39
+ <div class="container-obj">
40
+ <div class="centered-obj-div">
41
+ <mat-progress-spinner
42
+ color="primary"
43
+ mode="indeterminate"
44
+ [diameter]="44"
45
+ ></mat-progress-spinner>
46
+ </div>
47
+ </div>
48
+ }
49
+ }
50
+
51
+
52
+
53
+
@@ -0,0 +1,60 @@
1
+ :not(spinner-container).spinner-container {
2
+ position: relative;
3
+
4
+ .spinner-background {
5
+ position: absolute;
6
+ width: 44px;
7
+ height: 44px;
8
+ font-size: 12px;
9
+ line-height: 32px;
10
+ text-align: center;
11
+ overflow: hidden;
12
+ border-radius: 50%;
13
+ border: solid 5px whitesmoke;
14
+ }
15
+
16
+ }
17
+
18
+ .center-txt {
19
+ align-content: center;
20
+ text-align: -webkit-center;
21
+ }
22
+
23
+ .width {
24
+ width: 48px;
25
+ height: 48px;
26
+ }
27
+
28
+ .icon-button {
29
+ display: flex;
30
+ align-items: center;
31
+ justify-content: center;
32
+ width: 48px;
33
+ height: 48px;
34
+ padding: 0;
35
+ }
36
+
37
+ // .custom-icon {
38
+ // font-size: 32px;
39
+ // line-height: 1;
40
+ // position: relative;
41
+ // left: -4px;
42
+ // }
43
+
44
+ .container-obj {
45
+ display: flex;
46
+ justify-content: center;
47
+ align-items: center;
48
+ width: 48px;
49
+ height: 48px;
50
+ }
51
+
52
+ .centered-obj-div {
53
+ text-align: center
54
+ }
55
+
56
+ // .warn-icon {
57
+ // position: relative;
58
+ // top: 6px;
59
+ // width: 48px;
60
+ // }
@@ -0,0 +1,72 @@
1
+ import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core';
2
+ import { ProgressSpinnerMode } from '@angular/material/progress-spinner';
3
+ import { Subscription, timer } from 'rxjs';
4
+
5
+ @Component({
6
+ selector: 'app-download-file',
7
+ templateUrl: './download-file.component.html',
8
+ styleUrls: ['./download-file.component.scss'],
9
+ encapsulation: ViewEncapsulation.None,
10
+ standalone: false
11
+ })
12
+ export class DownloadFileComponent implements OnInit {
13
+
14
+ private subscriptions = new Subscription();
15
+
16
+ @Input() event?: Function;
17
+ @Input() displayError = 3; // seconds
18
+ @Input() diameter = 32;
19
+ @Input() mode: ProgressSpinnerMode = 'determinate';
20
+ @Input() isPending = false;
21
+
22
+ @Input() active = false;
23
+ @Input() disabled = false;
24
+
25
+ @Output() error = new EventEmitter<void>();
26
+
27
+ private _progress = 0;
28
+ @Input() set progress(value: any) {
29
+ this._progress = value ?? 0;
30
+ }
31
+
32
+ get progress() {
33
+ return this._progress;
34
+ }
35
+
36
+ private _hasError = false;
37
+ private errorTimerActive = false;
38
+
39
+ @Input() set hasError(value: boolean | any) {
40
+
41
+ this._hasError = !!value;
42
+
43
+ if (this._hasError && !this.errorTimerActive) {
44
+ this.errorTimerActive = true;
45
+ this.active = false;
46
+ this.error.emit()
47
+ this.subscriptions.add(
48
+ timer(this.displayError * 1000)
49
+ .subscribe((err) => {
50
+ this._hasError = false;
51
+ this.errorTimerActive = false;
52
+ })
53
+ );
54
+ }
55
+
56
+ }
57
+
58
+ get hasError() {
59
+ return this._hasError;
60
+ }
61
+
62
+ ngOnInit() {}
63
+
64
+ onAction() {
65
+ this.isPending = false
66
+ if (this.event) this.event()
67
+ }
68
+
69
+ ngOnDestroy() {
70
+ this.subscriptions.unsubscribe()
71
+ }
72
+ }
@@ -0,0 +1,28 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+
4
+ import { DownloadFileComponent } from './download-file/download-file.component';
5
+ import { FileDownloaderComponent } from './file-downloader.component';
6
+
7
+ import { SpinnerComponent } from './spinner/spinner.component';
8
+ import { MatIconModule } from '@angular/material/icon';
9
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
10
+ import { MatButtonModule } from '@angular/material/button';
11
+
12
+ @NgModule({
13
+ imports: [
14
+ CommonModule,
15
+ MatIconModule,
16
+ MatProgressSpinnerModule,
17
+ MatButtonModule,
18
+ ],
19
+ declarations: [
20
+ SpinnerComponent,
21
+ DownloadFileComponent,
22
+ FileDownloaderComponent,
23
+ ],
24
+ exports: [
25
+ FileDownloaderComponent
26
+ ]
27
+ })
28
+ export class FileDownloaderModule { }
@@ -0,0 +1,10 @@
1
+ <app-download-file
2
+ [disabled]="disabled"
3
+ [displayError]="3"
4
+ [event]="onDownloadStreaming.bind(this)"
5
+ [isPending]="(isPending$ | async) || false"
6
+ [progress]="(progress$ | async)"
7
+ [hasError]="(error$ | async)"
8
+ (error)="onError(labels.error)"
9
+ [active]="active"
10
+ ></app-download-file>