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,217 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { firstValueFrom } from 'rxjs';
3
+ import { DatabaseManagerService } from '../database-manager-service/database.manager.service';
4
+ import { DexieSqlOptions } from './models/sql-options.model';
5
+ import { SqlValidationError } from './models/sql-errors.model';
6
+ import { ParseResult } from './sql-parser';
7
+
8
+ export interface TableSchemaInfo {
9
+ pk: string;
10
+ simpleIndexes: string[];
11
+ compoundIndexes: string[][];
12
+ }
13
+
14
+ export interface ValidatedQuery {
15
+ ast: any;
16
+ schemas: Record<string, TableSchemaInfo>;
17
+ aliases: Record<string, string>;
18
+ }
19
+
20
+ @Injectable({ providedIn: 'root' })
21
+ export class SchemaValidator {
22
+ private readonly _dbManager = inject(DatabaseManagerService);
23
+
24
+ async validate(parsed: ParseResult, options: DexieSqlOptions = {}): Promise<ValidatedQuery> {
25
+ const { ast } = parsed;
26
+ const fromItems: any[] = (ast as any).from ?? [];
27
+
28
+ // Build alias map and collect real table names
29
+ const aliases: Record<string, string> = {};
30
+ const tableNames: string[] = [];
31
+ for (const item of fromItems) {
32
+ if (item.table) {
33
+ tableNames.push(item.table);
34
+ aliases[item.as ?? item.table] = item.table;
35
+ aliases[item.table] = item.table;
36
+ }
37
+ }
38
+
39
+ if (tableNames.length === 0) {
40
+ throw new SqlValidationError('No tables found in query');
41
+ }
42
+
43
+ // Fetch and parse schema for each table
44
+ const schemas: Record<string, TableSchemaInfo> = {};
45
+ for (const tableName of tableNames) {
46
+ const schemaArr = await firstValueFrom(this._dbManager.getDatabaseTableSchema(tableName));
47
+ if (!schemaArr || schemaArr.length === 0) {
48
+ throw new SqlValidationError(`Table not found: "${tableName}"`);
49
+ }
50
+ schemas[tableName] = this._parseSchemaArray(schemaArr);
51
+ }
52
+
53
+ const defaultTable = tableNames[0];
54
+
55
+ // Validate WHERE columns
56
+ if ((ast as any).where) {
57
+ this._validateWhereNode((ast as any).where, defaultTable, aliases, schemas);
58
+ }
59
+
60
+ // Validate ORDER BY columns
61
+ for (const ob of ((ast as any).orderby ?? [])) {
62
+ if (ob.expr?.type === 'column_ref') {
63
+ const tbl = this._resolveTable(ob.expr.table, defaultTable, aliases);
64
+ this._assertIndexed(ob.expr.column, tbl, schemas);
65
+ }
66
+ }
67
+
68
+ // Validate JOIN ON columns
69
+ for (const item of fromItems) {
70
+ if (item.join && item.on) {
71
+ this._validateJoinOn(item.on, tableNames, aliases, schemas);
72
+ }
73
+ }
74
+
75
+ // Strict mode: AND without compound index → throw
76
+ if (options.strict && (ast as any).where) {
77
+ this._checkStrictAnd((ast as any).where, defaultTable, aliases, schemas);
78
+ }
79
+
80
+ return { ast, schemas, aliases };
81
+ }
82
+
83
+ // ─── Helpers ─────────────────────────────────────────────────────────────
84
+
85
+ private _parseSchemaArray(schemaArr: string[]): TableSchemaInfo {
86
+ const pk = schemaArr[0] ?? '';
87
+ const simpleIndexes: string[] = [];
88
+ const compoundIndexes: string[][] = [];
89
+
90
+ for (let i = 1; i < schemaArr.length; i++) {
91
+ const s = schemaArr[i];
92
+ if (s.startsWith('[') && s.endsWith(']')) {
93
+ compoundIndexes.push(s.slice(1, -1).split('+'));
94
+ } else {
95
+ simpleIndexes.push(s.replace(/^[*&]/, ''));
96
+ }
97
+ }
98
+
99
+ return { pk, simpleIndexes, compoundIndexes };
100
+ }
101
+
102
+ private _isIndexed(col: string, tableName: string, schemas: Record<string, TableSchemaInfo>): boolean {
103
+ const schema = schemas[tableName];
104
+ if (!schema) return false;
105
+ return col === schema.pk || schema.simpleIndexes.includes(col);
106
+ }
107
+
108
+ private _assertIndexed(col: string, tableName: string, schemas: Record<string, TableSchemaInfo>): void {
109
+ if (!this._isIndexed(col, tableName, schemas)) {
110
+ throw new SqlValidationError(`Column "${col}" on table "${tableName}" is not indexed`);
111
+ }
112
+ }
113
+
114
+ private _resolveTable(tableRef: string | null, defaultTable: string, aliases: Record<string, string>): string {
115
+ if (!tableRef) return defaultTable;
116
+ return aliases[tableRef] ?? tableRef;
117
+ }
118
+
119
+ private _validateWhereNode(
120
+ node: any,
121
+ defaultTable: string,
122
+ aliases: Record<string, string>,
123
+ schemas: Record<string, TableSchemaInfo>,
124
+ ): void {
125
+ if (!node || node.type !== 'binary_expr') return;
126
+
127
+ if (node.operator === 'AND' || node.operator === 'OR') {
128
+ this._validateWhereNode(node.left, defaultTable, aliases, schemas);
129
+ this._validateWhereNode(node.right, defaultTable, aliases, schemas);
130
+ return;
131
+ }
132
+
133
+ if (node.left?.type === 'column_ref') {
134
+ const tbl = this._resolveTable(node.left.table, defaultTable, aliases);
135
+ this._assertIndexed(node.left.column, tbl, schemas);
136
+ }
137
+ }
138
+
139
+ private _validateJoinOn(
140
+ onNode: any,
141
+ tableNames: string[],
142
+ aliases: Record<string, string>,
143
+ schemas: Record<string, TableSchemaInfo>,
144
+ ): void {
145
+ if (!onNode || onNode.type !== 'binary_expr' || onNode.operator !== '=') return;
146
+
147
+ const l = onNode.left;
148
+ const r = onNode.right;
149
+ if (l?.type !== 'column_ref' || r?.type !== 'column_ref') return;
150
+
151
+ const leftTable = tableNames[0];
152
+ const rightTable = tableNames[tableNames.length - 1];
153
+
154
+ // Resolve which ON side belongs to left vs right table
155
+ const lTableResolved = aliases[l.table ?? ''] ?? l.table ?? leftTable;
156
+ const rTableResolved = aliases[r.table ?? ''] ?? r.table ?? rightTable;
157
+
158
+ const leftKey = lTableResolved === leftTable ? { col: l.column, table: lTableResolved } : { col: r.column, table: rTableResolved };
159
+ const rightKey = lTableResolved === leftTable ? { col: r.column, table: rTableResolved } : { col: l.column, table: lTableResolved };
160
+
161
+ // Left-side key: PK is exempt, otherwise must be indexed
162
+ const leftSchema = schemas[leftKey.table];
163
+ if (leftSchema && leftKey.col !== leftSchema.pk && !leftSchema.simpleIndexes.includes(leftKey.col)) {
164
+ throw new SqlValidationError(`JOIN column "${leftKey.col}" on table "${leftKey.table}" must be indexed`);
165
+ }
166
+
167
+ // Right-side key: must be indexed (including PK counts)
168
+ if (!this._isIndexed(rightKey.col, rightKey.table, schemas)) {
169
+ throw new SqlValidationError(`JOIN column "${rightKey.col}" on table "${rightKey.table}" must be indexed`);
170
+ }
171
+ }
172
+
173
+ private _checkStrictAnd(
174
+ whereNode: any,
175
+ defaultTable: string,
176
+ aliases: Record<string, string>,
177
+ schemas: Record<string, TableSchemaInfo>,
178
+ ): void {
179
+ if (!whereNode || whereNode.type !== 'binary_expr' || whereNode.operator !== 'AND') return;
180
+
181
+ const leafCols = this._flattenAndCols(whereNode, defaultTable, aliases);
182
+ if (leafCols.length < 2) return;
183
+
184
+ const tableName = leafCols[0].table;
185
+ const schema = schemas[tableName];
186
+ if (!schema) return;
187
+
188
+ const colNames = leafCols.map(c => c.col);
189
+ const hasCompound = schema.compoundIndexes.some(
190
+ ci => ci.length === colNames.length && colNames.every(c => ci.includes(c)),
191
+ );
192
+
193
+ if (!hasCompound) {
194
+ throw new SqlValidationError(
195
+ `Strict mode: compound index required for AND on columns [${colNames.join(', ')}]`,
196
+ );
197
+ }
198
+ }
199
+
200
+ private _flattenAndCols(
201
+ node: any,
202
+ defaultTable: string,
203
+ aliases: Record<string, string>,
204
+ ): Array<{ table: string; col: string }> {
205
+ if (!node || node.type !== 'binary_expr') return [];
206
+ if (node.operator === 'AND') {
207
+ return [
208
+ ...this._flattenAndCols(node.left, defaultTable, aliases),
209
+ ...this._flattenAndCols(node.right, defaultTable, aliases),
210
+ ];
211
+ }
212
+ if (node.left?.type === 'column_ref') {
213
+ return [{ table: this._resolveTable(node.left.table, defaultTable, aliases), col: node.left.column }];
214
+ }
215
+ return [];
216
+ }
217
+ }
@@ -0,0 +1,35 @@
1
+ import { Parser, TableColumnAst, AST } from 'node-sql-parser/build/mysql';
2
+ import { SqlParseError } from './models/sql-errors.model';
3
+
4
+ export interface ParseResult {
5
+ ast: AST;
6
+ tableList: string[];
7
+ columnList: string[];
8
+ }
9
+
10
+ export class SqlParser {
11
+ private readonly _parser = new Parser();
12
+
13
+ parse(sql: string): ParseResult {
14
+ let result: TableColumnAst;
15
+ try {
16
+ result = this._parser.parse(sql);
17
+ } catch (e: any) {
18
+ throw new SqlParseError(e.message ?? 'Failed to parse SQL');
19
+ }
20
+
21
+ const ast = Array.isArray(result.ast) ? result.ast[0] : result.ast;
22
+ if (!ast) {
23
+ throw new SqlParseError('SQL produced no AST — only SELECT statements are supported');
24
+ }
25
+ if ((ast as any).type !== 'select') {
26
+ throw new SqlParseError('Only SELECT statements are supported');
27
+ }
28
+
29
+ return {
30
+ ast,
31
+ tableList: result.tableList ?? [],
32
+ columnList: result.columnList ?? [],
33
+ };
34
+ }
35
+ }
@@ -0,0 +1,384 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { DbService } from './db.storage.service';
3
+ import { LocalStorageManagerService } from '../local-storage-manager-service/local-storage-manager.service';
4
+
5
+ import { TableSchemaDef } from './models/table-schema';
6
+ import { EMPTY, from, Observable, of } from 'rxjs';
7
+ import { catchError, map, switchMap, tap } from 'rxjs/operators';
8
+
9
+ @Injectable({
10
+ providedIn: 'root'
11
+ })
12
+ export class DatabaseManagerService extends DbService {
13
+
14
+ private localStorageManager = inject(LocalStorageManagerService);
15
+
16
+ constructor() {
17
+ super()
18
+ }
19
+
20
+ getDatabaseTables() {
21
+ return from(this.DBOpened()).pipe(
22
+ map(() => this.tables.map((item: any) => item.name))
23
+ )
24
+ }
25
+
26
+ databaseExists(): Observable<boolean> {
27
+ return from(this.hasDatabase());
28
+ }
29
+
30
+ hasDatabaseTable(table: string): Observable<boolean> {
31
+ const tableName = this.cleanTableName(table);
32
+ return from(this.DBOpened()).pipe(
33
+ map(() => {
34
+ return this.tableExists(tableName)
35
+ })
36
+ )
37
+ }
38
+
39
+ getDatabaseTable(table: string): Observable<any> {
40
+ const tableName = this.cleanTableName(table);
41
+ return from(this.DBOpened()).pipe(
42
+ map(() => {
43
+ const found = this.getTable(tableName);
44
+ if(!found) {
45
+ console.warn('No Such Table:', tableName)
46
+ return null;
47
+ }
48
+ return found;
49
+ })
50
+ )
51
+ }
52
+
53
+ getDatabaseTableSchema(table: string): Observable<string[]> {
54
+ const tableName = this.cleanTableName(table);
55
+ return this.getDatabaseTable(tableName).pipe(
56
+ map((dbTable: any) => {
57
+ if(!dbTable) return []
58
+ const cols = dbTable.schema.indexes.map((col: any) => col.name)
59
+ const pri = dbTable.schema.primKey.name
60
+ return [pri, ...cols]
61
+ })
62
+ )
63
+ }
64
+
65
+ createDatabaseTable(tableDef: TableSchemaDef) {
66
+ const tableName = this.cleanTableName(tableDef.table);
67
+ return from(this.createTable(tableDef.table, tableDef.schema)).pipe(
68
+ switchMap(() => from(this.DBOpened())),
69
+ map((opened) => opened && this.tableExists(tableName)),
70
+ catchError((error) => {
71
+ console.error(`createDatabaseTable: failed for table '${tableName}'`, error);
72
+ return of(false);
73
+ })
74
+ )
75
+ }
76
+
77
+ updateDatabaseTableSchema(tableDef: TableSchemaDef) {
78
+ return from(this.createTable(tableDef.table, tableDef.schema)).pipe(
79
+ switchMap(() => this.getDatabaseTable(tableDef.table))
80
+ )
81
+ }
82
+
83
+ // CRUD
84
+ findTableRecords(table: string, column: string, value: any) {
85
+ const tableName = this.cleanTableName(table);
86
+ return this.getDatabaseTable(tableName).pipe(
87
+ switchMap((tableData: any) => {
88
+ if (!tableData) {
89
+ console.warn(`findTableRecords: Table '${tableName}' not found`);
90
+ return from([]);
91
+ }
92
+ return from(tableData.where(column).equals(value).toArray());
93
+ })
94
+ );
95
+ }
96
+
97
+ findTableRecord(table: string, column: string, value: any) {
98
+ const tableName = this.cleanTableName(table);
99
+ return this.findTableRecords(tableName, column, value).pipe(
100
+ map((records: any) => records && records.length > 0 ? records[0] : null)
101
+ );
102
+ }
103
+
104
+ getTableRecords(table: string) {
105
+ const tableName = this.cleanTableName(table);
106
+ return this.getDatabaseTable(tableName).pipe(
107
+ switchMap((tableData: any) => {
108
+ if (!tableData) {
109
+ console.warn(`getTableRecords: Table '${tableName}' not found`);
110
+ return from([]);
111
+ }
112
+ return from(tableData.toArray());
113
+ })
114
+ );
115
+ }
116
+
117
+ getTableRecord(table: string, id: number) {
118
+ const tableName = this.cleanTableName(table);
119
+ return this.getDatabaseTable(tableName).pipe(
120
+ switchMap((tableData: any) => {
121
+ if (!tableData) {
122
+ console.warn(`getTableRecord: Table '${tableName}' not found`);
123
+ return from([null]);
124
+ }
125
+ return from(tableData.get(id)).pipe(
126
+ map((record: any) => record || null)
127
+ );
128
+ })
129
+ );
130
+ }
131
+
132
+ createTableRecord(table: string, record: any) {
133
+ const tableName = this.cleanTableName(table);
134
+ return this.createTableRecords(tableName, [record])
135
+ .pipe(
136
+ map((item: any) => item ? item[0] : null))
137
+ }
138
+
139
+ createTableRecords(table: string, records: any[]) {
140
+ const tableName = this.cleanTableName(table);
141
+
142
+ // Keep full object payload; Dexie stores non-indexed properties as well.
143
+ const insertRecords = records.map((record: any) => {
144
+ const payload = { ...(record || {}) };
145
+ if (payload.id === undefined || payload.id === null || payload.id === '') {
146
+ delete payload.id;
147
+ }
148
+ return payload;
149
+ });
150
+
151
+ const writeRecords = () => from(this.DBOpened()).pipe(
152
+ switchMap((opened) => {
153
+ if (!opened) {
154
+ // console.error(`createTableRecords: DB not open. Cannot write to '${tableName}'.`);
155
+ return EMPTY;
156
+ }
157
+
158
+ const tableInstance = this.getTable(tableName);
159
+ if (!tableInstance) {
160
+ // console.error(`createTableRecords: Table '${tableName}' does not exist in DB version ${this.verno}. Available:`, this.tables.map(t => t.name));
161
+ return EMPTY;
162
+ }
163
+
164
+ // console.log(`createTableRecords: Bulk putting ${insertRecords.length} records into ${tableName}`);
165
+
166
+ return from(tableInstance.bulkPut(insertRecords)).pipe(
167
+ map(() => insertRecords)
168
+ );
169
+ })
170
+ );
171
+
172
+ const recreateMissingTableAndRetry = () => {
173
+ const inferredSchema = this.inferSchemaFromRecords(insertRecords);
174
+
175
+ if (!inferredSchema) {
176
+ // console.warn(`createTableRecords: Could not infer schema for '${tableName}'. Retrying after DB reopen.`);
177
+ return from(this.createNewDatabase()).pipe(
178
+ switchMap(() => writeRecords())
179
+ );
180
+ }
181
+
182
+ const tableDef = TableSchemaDef.adapt({ table: tableName, schema: inferredSchema });
183
+
184
+ return this.createDatabaseTable(tableDef).pipe(
185
+ switchMap((created) => {
186
+ if (!created) {
187
+ // console.warn(`createTableRecords: Failed to recreate table '${tableName}' from inferred schema. Retrying after DB reopen.`);
188
+ return from(this.createNewDatabase()).pipe(
189
+ switchMap(() => writeRecords())
190
+ );
191
+ }
192
+
193
+ return writeRecords();
194
+ })
195
+ );
196
+ };
197
+
198
+ return writeRecords().pipe(
199
+ catchError((error) => {
200
+ if (!this.isMissingObjectStoreError(error)) {
201
+ throw error;
202
+ }
203
+
204
+ return recreateMissingTableAndRetry().pipe(
205
+ catchError((retryError) => {
206
+ if (!this.isMissingObjectStoreError(retryError)) {
207
+ console.error(`createTableRecords: Retry failed for '${tableName}'`, retryError);
208
+ throw retryError;
209
+ }
210
+
211
+ console.warn(`createTableRecords: Table '${tableName}' still missing after retry. Deleting DB and reinitializing...`);
212
+ return this.deleteAndReinitialize().pipe(
213
+ switchMap((reinitialized) => {
214
+ if (!reinitialized) {
215
+ throw retryError;
216
+ }
217
+ const inferredSchema = this.inferSchemaFromRecords(insertRecords);
218
+ if (!inferredSchema) {
219
+ throw retryError;
220
+ }
221
+ const tableDef = TableSchemaDef.adapt({ table: tableName, schema: inferredSchema });
222
+ return this.createDatabaseTable(tableDef).pipe(
223
+ switchMap(() => writeRecords())
224
+ );
225
+ }),
226
+ catchError((finalError) => {
227
+ console.error(`createTableRecords: All retries exhausted for '${tableName}'`, finalError);
228
+ throw finalError;
229
+ })
230
+ );
231
+ })
232
+ );
233
+ })
234
+ );
235
+ }
236
+
237
+ private inferSchemaFromRecords(records: any[]): string | null {
238
+ if (!Array.isArray(records) || records.length === 0) {
239
+ return null;
240
+ }
241
+
242
+ const sample = records.find((record: any) => record && typeof record === 'object');
243
+ if (!sample) {
244
+ return null;
245
+ }
246
+
247
+ const fields = Object.keys(sample)
248
+ .filter((key) => key !== 'id')
249
+ .filter((key) => {
250
+ const value = sample[key];
251
+ return value === null || ['string', 'number', 'boolean'].includes(typeof value);
252
+ })
253
+ .sort();
254
+
255
+ return ['++id', ...fields].join(', ');
256
+ }
257
+
258
+ private isMissingObjectStoreError(error: any): boolean {
259
+ const name = String(error?.name || '').toLowerCase();
260
+ const innerName = String(error?.inner?.name || '').toLowerCase();
261
+ const message = String(error?.message || error?.inner?.message || '').toLowerCase();
262
+
263
+ return (
264
+ name.includes('notfounderror') ||
265
+ innerName.includes('notfounderror') ||
266
+ message.includes('object store') ||
267
+ message.includes('one of the specified object stores was not found')
268
+ );
269
+ }
270
+
271
+ updateTableRecord(table: string, record: any) {
272
+ const tableName = this.cleanTableName(table);
273
+ return this.updateTableRecords(tableName, [record])
274
+ .pipe(
275
+ map(item => item.length > 0 ? item[0] : null)
276
+ )
277
+ }
278
+
279
+ updateTableRecords(table: string, records: any[]) {
280
+
281
+ const tableName = this.cleanTableName(table);
282
+
283
+ return this.getDatabaseTable(tableName).pipe(
284
+
285
+ switchMap((tableData: any) => {
286
+
287
+ if (!tableData) {
288
+ console.warn(`updateTableRecords: Table '${tableName}' not found`);
289
+ return EMPTY;
290
+ }
291
+
292
+ const insertRecords = records.map((record: any) => {
293
+ const payload = { ...(record || {}) };
294
+ if (payload.id === undefined || payload.id === null || payload.id === '') {
295
+ delete payload.id;
296
+ }
297
+ return payload;
298
+ });
299
+
300
+ return from(tableData.bulkPut(insertRecords)).pipe(
301
+ map(() => insertRecords)
302
+ );
303
+
304
+ })
305
+
306
+ )
307
+
308
+ }
309
+
310
+ deleteTableRecord<T>(table: string, id: number) {
311
+ const tableName = this.cleanTableName(table);
312
+ return this.deleteTableRecords(tableName, [id])
313
+ .pipe(
314
+ map(item => item.length > 0 ? item[0] : null)
315
+ )
316
+ }
317
+
318
+ deleteTableRecords(table: string, ids: number[]) {
319
+ const tableName = this.cleanTableName(table);
320
+ return this.getDatabaseTable(tableName).pipe(
321
+
322
+ switchMap((tableData: any) => {
323
+
324
+ return this.getDatabaseTableSchema(tableName).pipe(
325
+
326
+ switchMap((schema: string[]) => {
327
+
328
+ console.log(`deleteTableRecords: Starting delete of ${ids.length} records from ${table}. IDs:`, ids);
329
+
330
+ return from(tableData.bulkDelete(ids)).pipe(
331
+ map(() => ids)
332
+ );
333
+
334
+ })
335
+
336
+ )
337
+
338
+ })
339
+
340
+ )
341
+
342
+ }
343
+
344
+ clearTable(table: string) {
345
+
346
+ const tableName = this.cleanTableName(table);
347
+
348
+ try {
349
+ const tableInstance = this.table(tableName);
350
+ if (!tableInstance) {
351
+ console.warn(`clearTable: Table '${tableName}' not found`);
352
+ return of([]);
353
+ }
354
+
355
+ // console.log(`clearTable: Clearing table '${tableName}'...`);
356
+
357
+ // Use table.clear() directly and wrap in Observable
358
+ return from(Promise.resolve().then(() => {
359
+ return tableInstance.clear();
360
+ })).pipe(
361
+ // tap(() => console.log(`clearTable: ✅ Table '${tableName}' cleared successfully`)),
362
+ map(() => [])
363
+ );
364
+ } catch (error) {
365
+ console.error(`clearTable: ❌ Error:`, error);
366
+ return of([]);
367
+ }
368
+ }
369
+
370
+ clearDatabase(): void {
371
+ this.deleteAndReinitialize().pipe(
372
+ tap(() => this.localStorageManager.clearAllStoredData()),
373
+ catchError((error) => {
374
+ console.error('clearDatabase: ❌ Error clearing database:', error);
375
+ return of(false);
376
+ })
377
+ ).subscribe();
378
+ }
379
+
380
+ resetDatabase(): Observable<boolean> {
381
+ return this.deleteAndReinitialize();
382
+ }
383
+
384
+ }