http-request-manager 18.15.32 → 18.15.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/README.md +2 -0
  2. package/TEST_COVERAGE_SUMMARY.md +458 -0
  3. package/ng-package.json +8 -0
  4. package/package.json +5 -13
  5. package/src/docs/ADVANCED_WEBSOCKET.md +633 -0
  6. package/src/docs/ARCHITECTURE.md +633 -0
  7. package/src/docs/BATCH_REQUEST_README.md +467 -0
  8. package/src/docs/COMPLETE_API_REFERENCE.md +1037 -0
  9. package/src/docs/DATABASE_README.md +1195 -0
  10. package/src/docs/ENCRYPTION_README.md +403 -0
  11. package/src/docs/HTTP_MANAGER_README.md +628 -0
  12. package/src/docs/HTTP_SINGNALS_MANAGER_README.md +654 -0
  13. package/src/docs/HTTP_STATE_MANAGER_README.md +1391 -0
  14. package/src/docs/INTERCEPTOR_README.md +549 -0
  15. package/src/docs/LOCAL_STORAGE_README.md +1056 -0
  16. package/src/docs/LOCAL_STORAGE_SIGNALS_README.md +338 -0
  17. package/src/docs/LOGGER_README.md +310 -0
  18. package/src/docs/MESSAGE_TRACKER_README.md +518 -0
  19. package/src/docs/MESSAGE_TRACKER_SIGNALS_README.md +563 -0
  20. package/src/docs/MODELS_README.md +1264 -0
  21. package/src/docs/SIGNAL_SERVICES_README.md +238 -0
  22. package/src/docs/SQL_DIXIE_README.md +574 -0
  23. package/src/docs/STORE_STATE_MANAGER_README.md +556 -0
  24. package/src/docs/STORE_STATE_SIGNALS_README.md +600 -0
  25. package/src/docs/UPLOAD_REQUEST_README.md +324 -0
  26. package/src/docs/UTILS_README.md +1604 -0
  27. package/src/docs/WEBSOCKET_MESSAGE_SERVICE.md +799 -0
  28. package/src/docs/WEBSOCKET_SIGNALS_README.md +641 -0
  29. package/src/docs/WEBSOCKET_SINGLETON_REFACTORING.md +201 -0
  30. package/src/docs/WS_MANAGER_README.md +613 -0
  31. package/src/lib/http-request-manager.module.ts +147 -0
  32. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +116 -0
  33. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  34. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +255 -0
  35. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +123 -0
  36. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  37. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +53 -0
  38. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  39. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  40. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +208 -0
  41. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
  42. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
  43. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +214 -0
  44. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.html +53 -0
  45. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.scss +60 -0
  46. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.ts +72 -0
  47. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-download.module.ts +28 -0
  48. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.html +10 -0
  49. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.scss +29 -0
  50. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.ts +100 -0
  51. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/models/download-labels-model.ts +22 -0
  52. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.html +8 -0
  53. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.scss +19 -0
  54. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.ts +26 -0
  55. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app-session.model.ts +30 -0
  56. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app.model.ts +19 -0
  57. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/get-sample.model.ts +25 -0
  58. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-ai-prompt.ts +19 -0
  59. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-details.ts +24 -0
  60. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-info.ts +30 -0
  61. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client.model.ts +49 -0
  62. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-mapper-client-info.ts +33 -0
  63. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.html +279 -0
  64. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.scss +24 -0
  65. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.ts +461 -0
  66. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  67. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  68. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  69. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  70. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  71. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  72. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  73. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  74. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  75. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  76. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  77. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  78. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  79. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  80. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  81. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  82. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  83. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  84. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  85. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +622 -0
  86. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +106 -0
  87. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +687 -0
  88. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +418 -0
  89. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  90. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +576 -0
  91. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +89 -0
  92. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +119 -0
  93. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
  94. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
  95. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
  96. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
  97. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
  98. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
  99. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
  100. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +94 -0
  101. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
  102. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +203 -0
  103. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +144 -0
  104. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
  105. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +102 -0
  106. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +40 -0
  107. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +230 -0
  108. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
  109. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
  110. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
  111. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
  112. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
  113. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
  114. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
  115. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
  116. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +40 -0
  117. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
  118. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/jwt-token.service.ts +62 -0
  119. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
  120. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
  121. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +168 -0
  122. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  123. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  124. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  125. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
  126. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
  127. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  128. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  129. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  130. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  131. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  132. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  133. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
  134. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
  135. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
  136. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
  137. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
  138. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
  139. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
  140. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
  141. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
  142. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
  143. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
  144. package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
  145. package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +49 -0
  146. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
  147. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
  148. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
  149. package/src/lib/http-request-services-demo/store-state-signals-demo/store-state-signals-demo.component.ts +161 -0
  150. package/src/lib/http-request-services-demo/upload-demo/models/index.ts +1 -0
  151. package/src/lib/http-request-services-demo/upload-demo/models/upload-state.model.ts +30 -0
  152. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.html +89 -0
  153. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.scss +160 -0
  154. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.spec.ts +101 -0
  155. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.ts +136 -0
  156. package/src/lib/index.ts +3 -0
  157. package/src/lib/interceptors/credentials.interceptor.ts +16 -0
  158. package/src/lib/interceptors/index.ts +6 -0
  159. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  160. package/src/lib/interceptors/models/index.ts +2 -0
  161. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  162. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  163. package/src/lib/interceptors/request-header.interceptor.ts +56 -0
  164. package/src/lib/message-display/README.md +509 -0
  165. package/src/lib/message-display/index.ts +4 -0
  166. package/src/lib/message-display/models/action.model.ts +27 -0
  167. package/src/lib/message-display/models/communication-message.model.ts +77 -0
  168. package/src/lib/message-display/models/display-config.model.ts +35 -0
  169. package/src/lib/message-display/models/display-rule.interface.ts +28 -0
  170. package/src/lib/message-display/models/display-strategy.interface.ts +8 -0
  171. package/src/lib/message-display/models/index.ts +6 -0
  172. package/src/lib/message-display/models/slide.model.ts +24 -0
  173. package/src/lib/message-display/rules/default-display-rules.ts +35 -0
  174. package/src/lib/message-display/services/message-display-router.service.ts +63 -0
  175. package/src/lib/message-display/strategies/snackbar.strategy.ts +46 -0
  176. package/src/lib/models/batch-options.model.ts +33 -0
  177. package/src/lib/models/batch-progress.model.ts +19 -0
  178. package/src/lib/models/batch-request-state.model.ts +40 -0
  179. package/src/lib/models/batch-result.model.ts +30 -0
  180. package/src/lib/models/config-http-options.model.ts +45 -0
  181. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  182. package/src/lib/models/config-options.model.ts +27 -0
  183. package/src/lib/models/config-token.model.ts +9 -0
  184. package/src/lib/models/data-type.enum.ts +5 -0
  185. package/src/lib/models/database-storage.model.ts +24 -0
  186. package/src/lib/models/index.ts +16 -0
  187. package/src/lib/models/retry-options.model.ts +22 -0
  188. package/src/lib/models/upload-validation-error.model.ts +46 -0
  189. package/src/lib/services/SQL-DixieJS service/dexie-query-executor.ts +246 -0
  190. package/src/lib/services/SQL-DixieJS service/dexie-sql.service.ts +31 -0
  191. package/src/lib/services/SQL-DixieJS service/index.ts +4 -0
  192. package/src/lib/services/SQL-DixieJS service/models/execution-plan.model.ts +52 -0
  193. package/src/lib/services/SQL-DixieJS service/models/index.ts +3 -0
  194. package/src/lib/services/SQL-DixieJS service/models/sql-errors.model.ts +13 -0
  195. package/src/lib/services/SQL-DixieJS service/models/sql-options.model.ts +3 -0
  196. package/src/lib/services/SQL-DixieJS service/query-planner.ts +284 -0
  197. package/src/lib/services/SQL-DixieJS service/schema-validator.ts +217 -0
  198. package/src/lib/services/SQL-DixieJS service/sql-parser.ts +35 -0
  199. package/src/lib/services/database-manager-service/database.manager.service.ts +384 -0
  200. package/src/lib/services/database-manager-service/db.storage.service.ts +240 -0
  201. package/src/lib/services/database-manager-service/index.ts +4 -0
  202. package/src/lib/services/database-manager-service/models/index.ts +2 -0
  203. package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
  204. package/src/lib/services/index.ts +20 -0
  205. package/src/lib/services/local-storage-manager-service/index.ts +4 -0
  206. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  207. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +567 -0
  208. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
  209. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +437 -0
  210. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  211. package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
  212. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
  213. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  214. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
  215. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  216. package/src/lib/services/request-manager-services/README.md +282 -0
  217. package/src/lib/services/request-manager-services/http-manager-signals.service.ts +674 -0
  218. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +353 -0
  219. package/src/lib/services/request-manager-services/http-manager.service.ts +727 -0
  220. package/src/lib/services/request-manager-services/index.ts +8 -0
  221. package/src/lib/services/request-manager-services/request-signals.service.ts +372 -0
  222. package/src/lib/services/request-manager-services/request.service.ts +435 -0
  223. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  224. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  225. package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
  226. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
  227. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +468 -0
  228. package/src/lib/services/request-manager-state-service/http-manager-state.store.spec.ts +665 -0
  229. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +2395 -0
  230. package/src/lib/services/request-manager-state-service/index.ts +3 -0
  231. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +86 -0
  232. package/src/lib/services/request-manager-state-service/models/index.ts +14 -0
  233. package/src/lib/services/request-manager-state-service/models/operation-result.model.ts +18 -0
  234. package/src/lib/services/request-manager-state-service/models/parsing-result.model.ts +21 -0
  235. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +37 -0
  236. package/src/lib/services/request-manager-state-service/models/stream-config.model.ts +20 -0
  237. package/src/lib/services/request-manager-state-service/models/stream-event-metadata.model.ts +23 -0
  238. package/src/lib/services/request-manager-state-service/models/stream-event.model.ts +23 -0
  239. package/src/lib/services/request-manager-state-service/models/stream-output.model.ts +23 -0
  240. package/src/lib/services/request-manager-state-service/models/stream-progress.model.ts +24 -0
  241. package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
  242. package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +42 -0
  243. package/src/lib/services/store-state-manager-service/index.ts +4 -0
  244. package/src/lib/services/store-state-manager-service/models/index.ts +3 -0
  245. package/src/lib/services/store-state-manager-service/models/state-operation-result.model.ts +30 -0
  246. package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
  247. package/src/lib/services/store-state-manager-service/store-state-manager-signals.service.ts +169 -0
  248. package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +153 -0
  249. package/src/lib/services/utils/app.service.spec.ts +25 -0
  250. package/src/lib/services/utils/app.service.ts +21 -0
  251. package/src/lib/services/utils/encryption/README.md +79 -0
  252. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  253. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  254. package/src/lib/services/utils/encryption/index.ts +5 -0
  255. package/src/lib/services/utils/encryption/random.ts +81 -0
  256. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +106 -0
  257. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  258. package/src/lib/services/utils/headers.service.ts +18 -0
  259. package/src/lib/services/utils/index.ts +9 -0
  260. package/src/lib/services/utils/logger.service.ts +90 -0
  261. package/src/lib/services/utils/models/index.ts +4 -0
  262. package/src/lib/services/utils/models/normalized-request-options.model.ts +24 -0
  263. package/src/lib/services/utils/models/path-tracker-state.model.ts +20 -0
  264. package/src/lib/services/utils/models/query-params-tracker-options.model.ts +24 -0
  265. package/src/lib/services/utils/models/query-tracker-state.model.ts +23 -0
  266. package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
  267. package/src/lib/services/utils/object-merger.service.ts +78 -0
  268. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  269. package/src/lib/services/utils/path-query.service.ts +69 -0
  270. package/src/lib/services/utils/query-params-tracker.service.ts +442 -0
  271. package/src/lib/services/utils/random-color.utils.ts +83 -0
  272. package/src/lib/services/utils/utils.service.spec.ts +165 -0
  273. package/src/lib/services/utils/utils.service.ts +192 -0
  274. package/src/lib/services/ws-manager-service/index.ts +13 -0
  275. package/src/lib/services/ws-manager-service/message-tracker-signals.service.ts +147 -0
  276. package/src/lib/services/ws-manager-service/message-tracker.service.ts +477 -0
  277. package/src/lib/services/ws-manager-service/models/channel-info.model.ts +29 -0
  278. package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
  279. package/src/lib/services/ws-manager-service/models/channel-message.model.ts +36 -0
  280. package/src/lib/services/ws-manager-service/models/channel-type.enum.ts +6 -0
  281. package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
  282. package/src/lib/services/ws-manager-service/models/index.ts +10 -0
  283. package/src/lib/services/ws-manager-service/models/notification-message.model.ts +29 -0
  284. package/src/lib/services/ws-manager-service/models/public-message.model.ts +18 -0
  285. package/src/lib/services/ws-manager-service/models/state-message.model.ts +18 -0
  286. package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
  287. package/src/lib/services/ws-manager-service/services/index.ts +4 -0
  288. package/src/lib/services/ws-manager-service/services/websocket-message.service.ts +129 -0
  289. package/src/lib/services/ws-manager-service/services/websocket.service.ts +434 -0
  290. package/src/lib/services/ws-manager-service/websocket-service/index.ts +1 -0
  291. package/src/lib/services/ws-manager-service/websocket-service/websocket-manager.service.ts +716 -0
  292. package/src/lib/services/ws-manager-service/websocket-services-complete.spec.ts +596 -0
  293. package/src/lib/services/ws-manager-service/websocket-signals-manager.service.ts +141 -0
  294. package/src/public-api.ts +19 -0
  295. package/tsconfig.lib.json +34 -0
  296. package/tsconfig.lib.prod.json +10 -0
  297. package/tsconfig.spec.json +14 -0
  298. package/fesm2022/http-request-manager.mjs +0 -13297
  299. package/fesm2022/http-request-manager.mjs.map +0 -1
  300. package/http-request-manager-18.15.32.tgz +0 -0
  301. package/types/http-request-manager.d.ts +0 -3875
@@ -0,0 +1,1056 @@
1
+ # Local Storage Manager Service
2
+
3
+ The `LocalStorageManagerService` manages `localStorage` and `sessionStorage` with encryption, expiration, and reactive features for secure and intelligent data persistence.
4
+
5
+ ## Overview
6
+
7
+ This service provides:
8
+
9
+ - **Secure Storage** - AES encryption support for sensitive data
10
+ - **Expiration Management** - Automatic cleanup of expired items
11
+ - **Storage Types** - Both localStorage (Global) and sessionStorage (Session)
12
+ - **Reactive Updates** - Observable-based storage state management
13
+ - **Metadata Tracking** - Separate storage of settings and data
14
+ - **Type Safety** - Full TypeScript support with generics
15
+
16
+ ## Installation
17
+
18
+ ```typescript
19
+ import { HttpRequestManagerModule } from 'http-request-manager';
20
+
21
+ @NgModule({
22
+ imports: [HttpRequestManagerModule.forRoot({
23
+ LocalStorageOptions: {
24
+ storageName: 'my-app-data',
25
+ storageSettingsName: 'my-app-settings',
26
+ options: {
27
+ encrypted: true,
28
+ expiresIn: '7d'
29
+ }
30
+ }
31
+ })]
32
+ })
33
+ export class AppModule { }
34
+ ```
35
+
36
+ ## Basic Usage
37
+
38
+ ### Service Injection
39
+
40
+ ```typescript
41
+ import { Component, inject } from '@angular/core';
42
+ import { LocalStorageManagerService, SettingOptions } from 'http-request-manager';
43
+
44
+ @Component({
45
+ selector: 'app-settings',
46
+ template: `
47
+ <div class="settings">
48
+ <h2>User Preferences</h2>
49
+
50
+ <div class="setting-item">
51
+ <label>Theme:</label>
52
+ <select [value]="theme()" (change)="setTheme($any($event.target).value)">
53
+ <option value="light">Light</option>
54
+ <option value="dark">Dark</option>
55
+ </select>
56
+ </div>
57
+
58
+ <div class="setting-item">
59
+ <label>Language:</label>
60
+ <select [value]="language()" (change)="setLanguage($any($event.target).value)">
61
+ <option value="en">English</option>
62
+ <option value="es">Spanish</option>
63
+ </select>
64
+ </div>
65
+
66
+ <div class="setting-item">
67
+ <label>
68
+ <input type="checkbox" [checked]="notifications()"
69
+ (change)="setNotifications($any($event.target).checked)">
70
+ Enable Notifications
71
+ </label>
72
+ </div>
73
+
74
+ <div class="actions">
75
+ <button (click)="clearSettings()">Clear All Settings</button>
76
+ <button (click)="exportSettings()">Export Settings</button>
77
+ </div>
78
+
79
+ <div class="storage-info">
80
+ <p>Settings last updated: {{ lastUpdated() }}</p>
81
+ <p>Storage size: {{ storageSize() }} bytes</p>
82
+ </div>
83
+ </div>
84
+ `
85
+ })
86
+ export class SettingsComponent {
87
+ private storage = inject(LocalStorageManagerService);
88
+
89
+ // Reactive signals
90
+ theme = this.storage.signal('theme', 'light');
91
+ language = this.storage.signal('language', 'en');
92
+ notifications = this.storage.signal('notifications', true);
93
+ lastUpdated = this.storage.signal('lastUpdated', new Date().toISOString());
94
+
95
+ // Computed
96
+ storageSize = computed(() => {
97
+ const data = this.storage.getItem('user-preferences');
98
+ return data ? JSON.stringify(data).length : 0;
99
+ });
100
+
101
+ setTheme(theme: string) {
102
+ this.theme.set(theme);
103
+ this.updateLastUpdated();
104
+ }
105
+
106
+ setLanguage(language: string) {
107
+ this.language.set(language);
108
+ this.updateLastUpdated();
109
+ }
110
+
111
+ setNotifications(enabled: boolean) {
112
+ this.notifications.set(enabled);
113
+ this.updateLastUpdated();
114
+ }
115
+
116
+ private updateLastUpdated() {
117
+ this.lastUpdated.set(new Date().toISOString());
118
+ }
119
+
120
+ clearSettings() {
121
+ this.storage.removeItem('user-preferences');
122
+ // Reset to defaults
123
+ this.theme.set('light');
124
+ this.language.set('en');
125
+ this.notifications.set(true);
126
+ this.lastUpdated.set(new Date().toISOString());
127
+ }
128
+
129
+ exportSettings() {
130
+ const settings = this.storage.getItem('user-preferences');
131
+ console.log('Settings:', settings);
132
+ }
133
+ }
134
+ ```
135
+
136
+ ## API Reference
137
+
138
+ ### Store Management
139
+
140
+ #### setStore(options: StoreOptions): void
141
+
142
+ Create or update a storage store:
143
+
144
+ ```typescript
145
+ this.storage.setStore({
146
+ name: 'user-preferences',
147
+ data: {
148
+ theme: 'dark',
149
+ language: 'en',
150
+ notifications: true
151
+ },
152
+ options: SettingOptions.adapt({
153
+ storage: StorageType.GLOBAL,
154
+ encrypted: true,
155
+ expiresIn: '30d'
156
+ })
157
+ });
158
+ ```
159
+
160
+ #### store$(name: string): Observable<any>
161
+
162
+ Get an observable of store data:
163
+
164
+ ```typescript
165
+ settings$ = this.storage.store$('user-preferences');
166
+
167
+ <div *ngIf="settings$ | async as settings">
168
+ Theme: {{ settings.theme }}
169
+ </div>
170
+ ```
171
+
172
+ #### setting$(name: string): Observable<any>
173
+
174
+ Get an observable of store metadata:
175
+
176
+ ```typescript
177
+ metadata$ = this.storage.setting$('user-preferences');
178
+
179
+ <div *ngIf="metadata$ | async as meta">
180
+ Encrypted: {{ meta.encrypted }}
181
+ Expires: {{ meta.expires }}
182
+ </div>
183
+ ```
184
+
185
+ #### resetStore(): void
186
+
187
+ Clear all stores:
188
+
189
+ ```typescript
190
+ this.storage.resetStore();
191
+ ```
192
+
193
+ ### Item Management
194
+
195
+ #### setItem(key: string, value: any, options?: SettingOptions): void
196
+
197
+ Store a value with optional settings:
198
+
199
+ ```typescript
200
+ // Simple storage
201
+ this.storage.setItem('user-name', 'John Doe');
202
+
203
+ // Encrypted storage
204
+ this.storage.setItem('user-token', 'secret-token',
205
+ SettingOptions.adapt({
206
+ encrypted: true,
207
+ expiresIn: '1h'
208
+ })
209
+ );
210
+
211
+ // Session storage
212
+ this.storage.setItem('temp-data', { temporary: true },
213
+ SettingOptions.adapt({
214
+ storage: StorageType.SESSION
215
+ })
216
+ );
217
+ ```
218
+
219
+ #### getItem(key: string): any
220
+
221
+ Retrieve a stored value:
222
+
223
+ ```typescript
224
+ const userName = this.storage.getItem('user-name');
225
+ const encryptedToken = this.storage.getItem('user-token'); // Auto-decrypted
226
+ ```
227
+
228
+ #### removeItem(key: string): void
229
+
230
+ Remove a stored item:
231
+
232
+ ```typescript
233
+ this.storage.removeItem('user-token');
234
+ ```
235
+
236
+ #### hasItem(key: string): boolean
237
+
238
+ Check if item exists:
239
+
240
+ ```typescript
241
+ if (this.storage.hasItem('user-token')) {
242
+ console.log('Token exists');
243
+ }
244
+ ```
245
+
246
+ ### Signal-Based API
247
+
248
+ #### signal(key: string, defaultValue: any, options?: SettingOptions): Signal<any>
249
+
250
+ Create a reactive signal for storage:
251
+
252
+ ```typescript
253
+ // Create signals
254
+ const theme = this.storage.signal('theme', 'light');
255
+ const userData = this.storage.signal('user-data', {}, {
256
+ encrypted: true,
257
+ expiresIn: '24h'
258
+ });
259
+
260
+ // Use in template
261
+ <div [style.color]="theme() === 'dark' ? 'white' : 'black'">
262
+ {{ theme() }}
263
+ </div>
264
+ ```
265
+
266
+ #### computedSignal(key: string, computeFn: Function): Signal<any>
267
+
268
+ Create computed signal from storage:
269
+
270
+ ```typescript
271
+ const userName = this.storage.signal('user-name', '');
272
+ const userEmail = this.storage.signal('user-email', '');
273
+
274
+ // Computed full name
275
+ const fullUser = this.storage.computedSignal('full-user',
276
+ () => `${userName()} <${userEmail()}>`
277
+ );
278
+ ```
279
+
280
+ ### Data Management
281
+
282
+ #### getAllItems(): any[]
283
+
284
+ Get all stored items:
285
+
286
+ ```typescript
287
+ const allItems = this.storage.getAllItems();
288
+ console.log('Stored items:', allItems);
289
+ ```
290
+
291
+ #### getExpiredItems(): any[]
292
+
293
+ Get items that have expired:
294
+
295
+ ```typescript
296
+ const expired = this.storage.getExpiredItems();
297
+ console.log('Expired items:', expired);
298
+ ```
299
+
300
+ #### clearExpiredItems(): void
301
+
302
+ Remove all expired items:
303
+
304
+ ```typescript
305
+ this.storage.clearExpiredItems();
306
+ ```
307
+
308
+ #### exportData(): string
309
+
310
+ Export all data as JSON string:
311
+
312
+ ```typescript
313
+ const exportedData = this.storage.exportData();
314
+ console.log('Exported data:', exportedData);
315
+ ```
316
+
317
+ #### importData(data: string): void
318
+
319
+ Import data from JSON string:
320
+
321
+ ```typescript
322
+ const dataString = '{"theme":"dark","language":"en"}';
323
+ this.storage.importData(dataString);
324
+ ```
325
+
326
+ ## Configuration Options
327
+
328
+ ### SettingOptions
329
+
330
+ ```typescript
331
+ interface SettingOptions {
332
+ storage: StorageType; // GLOBAL or SESSION
333
+ expires?: number; // Epoch timestamp
334
+ expiresIn?: string; // Duration string (e.g., '1d', '2h')
335
+ encrypted?: boolean; // Enable encryption
336
+ }
337
+ ```
338
+
339
+ ### StorageType Enum
340
+
341
+ ```typescript
342
+ enum StorageType {
343
+ GLOBAL = 'global', // localStorage
344
+ SESSION = 'session' // sessionStorage
345
+ }
346
+ ```
347
+
348
+ ### Duration Format
349
+
350
+ Supported duration formats:
351
+ - `30s` - 30 seconds
352
+ - `15m` - 15 minutes
353
+ - `2h` - 2 hours
354
+ - `1d` - 1 day
355
+ - `1w` - 1 week
356
+ - `1mo` - 1 month
357
+ - `1y` - 1 year
358
+
359
+ ## Advanced Examples
360
+
361
+ ### User Session Management
362
+
363
+ ```typescript
364
+ import { Injectable, signal, computed } from '@angular/core';
365
+ import { LocalStorageManagerService, SettingOptions } from 'http-request-manager';
366
+
367
+ @Injectable({
368
+ providedIn: 'root'
369
+ })
370
+ export class UserSessionService {
371
+ private storage = inject(LocalStorageManagerService);
372
+
373
+ // Session signals
374
+ isLoggedIn = this.storage.signal('is-logged-in', false);
375
+ userId = this.storage.signal('user-id', null);
376
+ userName = this.storage.signal('user-name', '');
377
+ userRole = this.storage.signal('user-role', 'guest');
378
+ sessionToken = this.storage.signal('session-token', '', {
379
+ encrypted: true,
380
+ expiresIn: '24h'
381
+ });
382
+ lastActivity = this.storage.signal('last-activity', Date.now());
383
+
384
+ // Computed signals
385
+ isAdmin = computed(() => this.userRole() === 'admin');
386
+ isGuest = computed(() => this.userRole() === 'guest');
387
+ sessionExpired = computed(() => {
388
+ const lastActivity = this.lastActivity();
389
+ const now = Date.now();
390
+ return (now - lastActivity) > (30 * 60 * 1000); // 30 minutes
391
+ });
392
+
393
+ // Session management
394
+ login(user: any, token: string) {
395
+ this.isLoggedIn.set(true);
396
+ this.userId.set(user.id);
397
+ this.userName.set(user.name);
398
+ this.userRole.set(user.role || 'user');
399
+ this.sessionToken.set(token);
400
+ this.updateLastActivity();
401
+ }
402
+
403
+ logout() {
404
+ this.isLoggedIn.set(false);
405
+ this.userId.set(null);
406
+ this.userName.set('');
407
+ this.userRole.set('guest');
408
+ this.sessionToken.set('');
409
+ this.lastActivity.set(Date.now());
410
+
411
+ // Clear sensitive data
412
+ this.storage.removeItem('session-token');
413
+ }
414
+
415
+ updateActivity() {
416
+ this.lastActivity.set(Date.now());
417
+ }
418
+
419
+ private updateLastUpdated() {
420
+ this.lastActivity.set(Date.now());
421
+ }
422
+
423
+ // Auto-logout on inactivity
424
+ constructor() {
425
+ // Monitor user activity
426
+ ['click', 'keypress', 'scroll'].forEach(event => {
427
+ document.addEventListener(event, () => {
428
+ if (this.isLoggedIn()) {
429
+ this.updateActivity();
430
+ }
431
+ });
432
+ });
433
+
434
+ // Check for session expiry every minute
435
+ setInterval(() => {
436
+ if (this.sessionExpired() && this.isLoggedIn()) {
437
+ console.log('Session expired, logging out');
438
+ this.logout();
439
+ // Redirect to login page
440
+ window.location.href = '/login';
441
+ }
442
+ }, 60000);
443
+ }
444
+ }
445
+ ```
446
+
447
+ ### Application State Persistence
448
+
449
+ ```typescript
450
+ @Injectable()
451
+ export class AppStateService {
452
+ private storage = inject(LocalStorageManagerService);
453
+
454
+ // UI State
455
+ sidebarCollapsed = this.storage.signal('sidebar-collapsed', false);
456
+ theme = this.storage.signal('theme', 'light');
457
+ language = this.storage.signal('language', 'en');
458
+
459
+ // User Preferences
460
+ notificationsEnabled = this.storage.signal('notifications', true);
461
+ emailDigestEnabled = this.storage.signal('email-digest', false);
462
+
463
+ // Feature Flags
464
+ experimentalFeatures = this.storage.signal('experimental-features', []);
465
+ betaFeatures = this.storage.signal('beta-features', false);
466
+
467
+ // Navigation State
468
+ currentPage = this.storage.signal('current-page', 'dashboard');
469
+ breadcrumbs = this.storage.signal('breadcrumbs', []);
470
+
471
+ // Data Persistence
472
+ cachedData = this.storage.signal('cached-data', {}, {
473
+ expiresIn: '1h'
474
+ });
475
+ userCache = this.storage.signal('user-cache', {}, {
476
+ encrypted: true,
477
+ expiresIn: '30m'
478
+ });
479
+
480
+ // Computed states
481
+ isDarkTheme = computed(() => this.theme() === 'dark');
482
+ isExperimentalMode = computed(() => this.experimentalFeatures().includes('new-ui'));
483
+ hasUnreadNotifications = computed(() => this.notificationsEnabled());
484
+
485
+ // State management methods
486
+ toggleSidebar() {
487
+ this.sidebarCollapsed.set(!this.sidebarCollapsed());
488
+ }
489
+
490
+ switchTheme(theme: 'light' | 'dark') {
491
+ this.theme.set(theme);
492
+ // Apply theme to document
493
+ document.documentElement.setAttribute('data-theme', theme);
494
+ }
495
+
496
+ setLanguage(language: string) {
497
+ this.language.set(language);
498
+ // Update document language
499
+ document.documentElement.setAttribute('lang', language);
500
+ }
501
+
502
+ enableFeature(feature: string) {
503
+ const features = this.experimentalFeatures();
504
+ if (!features.includes(feature)) {
505
+ this.experimentalFeatures.set([...features, feature]);
506
+ }
507
+ }
508
+
509
+ disableFeature(feature: string) {
510
+ const features = this.experimentalFeatures();
511
+ this.experimentalFeatures.set(features.filter(f => f !== feature));
512
+ }
513
+
514
+ cacheData(key: string, data: any) {
515
+ const currentCache = this.cachedData();
516
+ currentCache[key] = {
517
+ data,
518
+ timestamp: Date.now()
519
+ };
520
+ this.cachedData.set({ ...currentCache });
521
+ }
522
+
523
+ getCachedData(key: string) {
524
+ const cache = this.cachedData();
525
+ const cached = cache[key];
526
+
527
+ if (cached && !this.isExpired(cached.timestamp)) {
528
+ return cached.data;
529
+ }
530
+
531
+ return null;
532
+ }
533
+
534
+ private isExpired(timestamp: number): boolean {
535
+ const now = Date.now();
536
+ const oneHour = 60 * 60 * 1000;
537
+ return (now - timestamp) > oneHour;
538
+ }
539
+
540
+ // Export/Import state
541
+ exportAppState() {
542
+ return {
543
+ theme: this.theme(),
544
+ language: this.language(),
545
+ sidebarCollapsed: this.sidebarCollapsed(),
546
+ notifications: this.notificationsEnabled(),
547
+ experimentalFeatures: this.experimentalFeatures()
548
+ };
549
+ }
550
+
551
+ importAppState(state: any) {
552
+ if (state.theme) this.theme.set(state.theme);
553
+ if (state.language) this.language.set(state.language);
554
+ if (typeof state.sidebarCollapsed === 'boolean') {
555
+ this.sidebarCollapsed.set(state.sidebarCollapsed);
556
+ }
557
+ if (typeof state.notifications === 'boolean') {
558
+ this.notificationsEnabled.set(state.notifications);
559
+ }
560
+ if (Array.isArray(state.experimentalFeatures)) {
561
+ this.experimentalFeatures.set(state.experimentalFeatures);
562
+ }
563
+ }
564
+ }
565
+ ```
566
+
567
+ ### Shopping Cart with Persistence
568
+
569
+ ```typescript
570
+ @Injectable()
571
+ export class ShoppingCartService {
572
+ private storage = inject(LocalStorageManagerService);
573
+
574
+ private cartItems = this.storage.signal('shopping-cart', []);
575
+ private cartTotal = computed(() =>
576
+ this.cartItems().reduce((total, item) => total + (item.price * item.quantity), 0)
577
+ );
578
+ private itemCount = computed(() =>
579
+ this.cartItems().reduce((count, item) => count + item.quantity, 0)
580
+ );
581
+
582
+ // Cart management
583
+ addItem(item: any) {
584
+ const items = this.cartItems();
585
+ const existingItem = items.find(i => i.id === item.id);
586
+
587
+ if (existingItem) {
588
+ existingItem.quantity += 1;
589
+ this.cartItems.set([...items]);
590
+ } else {
591
+ this.cartItems.set([...items, { ...item, quantity: 1 }]);
592
+ }
593
+ }
594
+
595
+ removeItem(itemId: string) {
596
+ const items = this.cartItems().filter(item => item.id !== itemId);
597
+ this.cartItems.set(items);
598
+ }
599
+
600
+ updateQuantity(itemId: string, quantity: number) {
601
+ if (quantity <= 0) {
602
+ this.removeItem(itemId);
603
+ return;
604
+ }
605
+
606
+ const items = this.cartItems();
607
+ const item = items.find(i => i.id === itemId);
608
+ if (item) {
609
+ item.quantity = quantity;
610
+ this.cartItems.set([...items]);
611
+ }
612
+ }
613
+
614
+ clearCart() {
615
+ this.cartItems.set([]);
616
+ }
617
+
618
+ // Computed getters
619
+ get items() { return this.cartItems(); }
620
+ get total() { return this.cartTotal(); }
621
+ get count() { return this.itemCount(); }
622
+
623
+ // Cart persistence
624
+ saveCart() {
625
+ // Auto-saved by signals, but this forces a save
626
+ this.cartItems.set(this.cartItems());
627
+ }
628
+
629
+ loadCart() {
630
+ // Cart is automatically loaded from storage
631
+ const savedCart = this.storage.getItem('shopping-cart');
632
+ if (savedCart) {
633
+ this.cartItems.set(savedCart);
634
+ }
635
+ }
636
+
637
+ // Cart sharing/export
638
+ exportCart() {
639
+ return {
640
+ items: this.cartItems(),
641
+ total: this.cartTotal(),
642
+ exportedAt: Date.now()
643
+ };
644
+ }
645
+
646
+ importCart(cartData: any) {
647
+ if (cartData.items && Array.isArray(cartData.items)) {
648
+ this.cartItems.set(cartData.items);
649
+ }
650
+ }
651
+ }
652
+ ```
653
+
654
+ ## Encryption Support
655
+
656
+ ### Setup Encryption
657
+
658
+ To use encryption, provide an `APP_ID` in your module:
659
+
660
+ ```typescript
661
+ import { APP_ID } from '@angular/core';
662
+
663
+ @NgModule({
664
+ providers: [
665
+ { provide: APP_ID, useValue: "your-unique-guid-here" }
666
+ ]
667
+ })
668
+ export class AppModule { }
669
+ ```
670
+
671
+ ### Encrypted Storage Example
672
+
673
+ ```typescript
674
+ @Component({
675
+ selector: 'secure-data'
676
+ })
677
+ export class SecureDataComponent {
678
+ private storage = inject(LocalStorageManagerService);
679
+
680
+ // Sensitive data (automatically encrypted/decrypted)
681
+ apiKey = this.storage.signal('api-key', '', {
682
+ encrypted: true,
683
+ expiresIn: '24h'
684
+ });
685
+
686
+ userCredentials = this.storage.signal('user-credentials', {}, {
687
+ encrypted: true,
688
+ expiresIn: '8h'
689
+ });
690
+
691
+ // Non-sensitive data
692
+ userName = this.storage.signal('username', '');
693
+
694
+ saveApiKey(key: string) {
695
+ this.apiKey.set(key);
696
+ // Key is automatically encrypted before storing
697
+ }
698
+
699
+ getApiKey() {
700
+ const key = this.apiKey();
701
+ // Key is automatically decrypted when retrieved
702
+ return key;
703
+ }
704
+
705
+ saveCredentials(username: string, password: string) {
706
+ this.userCredentials.set({
707
+ username,
708
+ password: btoa(password) // Additional base64 encoding
709
+ });
710
+ }
711
+
712
+ getCredentials() {
713
+ return this.userCredentials();
714
+ }
715
+ }
716
+ ```
717
+
718
+ ## Security Best Practices
719
+
720
+ ### 1. Sensitive Data Handling
721
+
722
+ ```typescript
723
+ // ✅ Good - Use encryption for sensitive data
724
+ this.storage.setItem('user-token', token, {
725
+ encrypted: true,
726
+ expiresIn: '1h'
727
+ });
728
+
729
+ // ❌ Avoid - Store sensitive data without encryption
730
+ this.storage.setItem('user-password', password);
731
+ ```
732
+
733
+ ### 2. Expiration Management
734
+
735
+ ```typescript
736
+ // ✅ Good - Set reasonable expiration times
737
+ this.storage.setItem('session-data', data, {
738
+ expiresIn: '24h' // Expire session data daily
739
+ });
740
+
741
+ // ❌ Avoid - No expiration for sensitive data
742
+ this.storage.setItem('api-key', key); // Should expire
743
+ ```
744
+
745
+ ### 3. Storage Type Selection
746
+
747
+ ```typescript
748
+ // ✅ Good - Use appropriate storage types
749
+ // Session data (cleared when browser closes)
750
+ this.storage.setItem('temp-calculation', result, {
751
+ storage: StorageType.SESSION
752
+ });
753
+
754
+ // Persistent data (survives browser restarts)
755
+ this.storage.setItem('user-preferences', prefs, {
756
+ storage: StorageType.GLOBAL
757
+ });
758
+ ```
759
+
760
+ ## Performance Optimization
761
+
762
+ ### Storage Size Monitoring
763
+
764
+ ```typescript
765
+ @Injectable()
766
+ export class StorageMonitorService {
767
+ private storage = inject(LocalStorageManagerService);
768
+
769
+ getStorageSize() {
770
+ let total = 0;
771
+ for (let key in localStorage) {
772
+ if (localStorage.hasOwnProperty(key)) {
773
+ total += localStorage[key].length + key.length;
774
+ }
775
+ }
776
+ return total;
777
+ }
778
+
779
+ getStorageUsagePercentage() {
780
+ const used = this.getStorageSize();
781
+ const quota = 5 * 1024 * 1024; // 5MB typical limit
782
+ return (used / quota) * 100;
783
+ }
784
+
785
+ optimizeStorage() {
786
+ // Remove expired items
787
+ this.storage.clearExpiredItems();
788
+
789
+ // Remove old cache data
790
+ const cache = this.storage.getItem('cache');
791
+ if (cache) {
792
+ const cleaned = this.cleanOldCacheData(cache);
793
+ this.storage.setItem('cache', cleaned);
794
+ }
795
+ }
796
+
797
+ private cleanOldCacheData(cache: any) {
798
+ const oneDayAgo = Date.now() - (24 * 60 * 60 * 1000);
799
+ return Object.keys(cache)
800
+ .filter(key => cache[key].timestamp > oneDayAgo)
801
+ .reduce((obj, key) => {
802
+ obj[key] = cache[key];
803
+ return obj;
804
+ }, {});
805
+ }
806
+ }
807
+ ```
808
+
809
+ ### Batch Operations
810
+
811
+ ```typescript
812
+ @Injectable()
813
+ export class BatchStorageService {
814
+ private storage = inject(LocalStorageManagerService);
815
+
816
+ batchSetItems(items: Array<{key: string, value: any, options?: any}>) {
817
+ items.forEach(item => {
818
+ this.storage.setItem(item.key, item.value, item.options);
819
+ });
820
+ }
821
+
822
+ batchGetItems(keys: string[]) {
823
+ const result: any = {};
824
+ keys.forEach(key => {
825
+ result[key] = this.storage.getItem(key);
826
+ });
827
+ return result;
828
+ }
829
+
830
+ batchRemoveItems(keys: string[]) {
831
+ keys.forEach(key => {
832
+ this.storage.removeItem(key);
833
+ });
834
+ }
835
+ }
836
+ ```
837
+
838
+ ## Error Handling
839
+
840
+ ### Storage Error Handling
841
+
842
+ ```typescript
843
+ @Component({
844
+ selector: 'safe-storage'
845
+ })
846
+ export class SafeStorageComponent {
847
+ private storage = inject(LocalStorageManagerService);
848
+
849
+ safeSetItem(key: string, value: any, options?: any) {
850
+ try {
851
+ this.storage.setItem(key, value, options);
852
+ return { success: true };
853
+ } catch (error) {
854
+ console.error('Storage error:', error);
855
+
856
+ // Try to free up space
857
+ this.cleanupOldData();
858
+
859
+ // Retry once
860
+ try {
861
+ this.storage.setItem(key, value, options);
862
+ return { success: true, warning: 'Cleaned up old data' };
863
+ } catch (retryError) {
864
+ console.error('Storage still failing:', retryError);
865
+ return { success: false, error: 'Storage quota exceeded' };
866
+ }
867
+ }
868
+ }
869
+
870
+ private cleanupOldData() {
871
+ // Remove expired items
872
+ this.storage.clearExpiredItems();
873
+
874
+ // Remove oldest cache entries
875
+ const cache = this.storage.getItem('cache');
876
+ if (cache && Array.isArray(cache)) {
877
+ // Keep only the 10 most recent entries
878
+ const recent = cache.slice(-10);
879
+ this.storage.setItem('cache', recent);
880
+ }
881
+ }
882
+ }
883
+ ```
884
+
885
+ ## Integration with Other Services
886
+
887
+ ### With HTTP State Service
888
+
889
+ ```typescript
890
+ @Injectable()
891
+ export class UserStateService extends HTTPManagerStateService<User> {
892
+ private storage = inject(LocalStorageManagerService);
893
+
894
+ constructor() {
895
+ super(
896
+ ApiRequest.adapt({
897
+ path: ['users'],
898
+ adapter: User.adapt
899
+ }),
900
+ DataType.ARRAY,
901
+ DatabaseStorage.adapt({
902
+ table: 'users-cache',
903
+ expiresIn: '1h'
904
+ })
905
+ );
906
+ }
907
+
908
+ // Cache user preferences locally
909
+ saveUserPreferences(userId: string, preferences: any) {
910
+ this.storage.setItem(`user-prefs-${userId}`, preferences, {
911
+ encrypted: true,
912
+ expiresIn: '30d'
913
+ });
914
+ }
915
+
916
+ getUserPreferences(userId: string) {
917
+ return this.storage.getItem(`user-prefs-${userId}`);
918
+ }
919
+ }
920
+ ```
921
+
922
+ ### With WebSocket
923
+
924
+ ```typescript
925
+ @Injectable()
926
+ export class ChatStateService extends HTTPManagerStateService<Message> {
927
+ private storage = inject(LocalStorageManagerService);
928
+
929
+ constructor() {
930
+ super(
931
+ ApiRequest.adapt({
932
+ path: ['messages'],
933
+ ws: {
934
+ id: 'CHAT_STORAGE',
935
+ wsServer: 'ws://localhost:8080'
936
+ }
937
+ }),
938
+ DataType.ARRAY
939
+ );
940
+ }
941
+
942
+ // Save chat history locally
943
+ saveChatHistory(channel: string, messages: Message[]) {
944
+ this.storage.setItem(`chat-history-${channel}`, messages, {
945
+ expiresIn: '7d'
946
+ });
947
+ }
948
+
949
+ getChatHistory(channel: string): Message[] {
950
+ return this.storage.getItem(`chat-history-${channel}`) || [];
951
+ }
952
+ }
953
+ ```
954
+
955
+ ## Best Practices
956
+
957
+ ### 1. Signal-Based Usage
958
+
959
+ ```typescript
960
+ // ✅ Good - Use signals for reactive updates
961
+ const theme = this.storage.signal('theme', 'light');
962
+
963
+ // ❌ Avoid - Manual storage management
964
+ getTheme() {
965
+ return localStorage.getItem('theme') || 'light';
966
+ }
967
+ ```
968
+
969
+ ### 2. Consistent Key Naming
970
+
971
+ ```typescript
972
+ // ✅ Good - Consistent naming convention
973
+ this.storage.setItem('user-profile', data);
974
+ this.storage.setItem('user-preferences', prefs);
975
+ this.storage.setItem('user-session', session);
976
+
977
+ // ❌ Avoid - Inconsistent naming
978
+ this.storage.setItem('profile', data);
979
+ this.storage.setItem('userSettings', prefs);
980
+ this.storage.setItem('sessionInfo', session);
981
+ ```
982
+
983
+ ### 3. Appropriate Expiration
984
+
985
+ ```typescript
986
+ // ✅ Good - Set reasonable expiration
987
+ this.storage.setItem('temp-calculation', result, {
988
+ expiresIn: '1h' // Clear temporary data
989
+ });
990
+
991
+ this.storage.setItem('user-preferences', prefs, {
992
+ expiresIn: '30d' // Keep preferences for a month
993
+ });
994
+
995
+ // ❌ Avoid - No expiration for temporary data
996
+ this.storage.setItem('temp-data', data); // Should have expiration
997
+ ```
998
+
999
+ ### 4. Data Validation
1000
+
1001
+ ```typescript
1002
+ // ✅ Good - Validate before storage
1003
+ saveUserSettings(settings: any) {
1004
+ if (this.validateSettings(settings)) {
1005
+ this.storage.setItem('user-settings', settings);
1006
+ } else {
1007
+ throw new Error('Invalid settings format');
1008
+ }
1009
+ }
1010
+ ```
1011
+
1012
+ ## Troubleshooting
1013
+
1014
+ ### Common Issues
1015
+
1016
+ #### 1. Storage Quota Exceeded
1017
+ ```typescript
1018
+ // Monitor storage usage
1019
+ const monitor = inject(StorageMonitorService);
1020
+ console.log('Storage usage:', monitor.getStorageUsagePercentage(), '%');
1021
+
1022
+ // Clean up when approaching limit
1023
+ if (monitor.getStorageUsagePercentage() > 80) {
1024
+ monitor.optimizeStorage();
1025
+ }
1026
+ ```
1027
+
1028
+ #### 2. Encryption Not Working
1029
+ ```typescript
1030
+ // Ensure APP_ID is provided
1031
+ // Check that encrypted items are retrieved properly
1032
+ const encryptedData = this.storage.getItem('secure-data');
1033
+ console.log('Data decrypted successfully:', encryptedData);
1034
+ ```
1035
+
1036
+ #### 3. Data Not Persisting
1037
+ ```typescript
1038
+ // Check if data is being saved
1039
+ this.storage.setItem('test-data', 'test');
1040
+ console.log('Data saved:', this.storage.getItem('test-data'));
1041
+
1042
+ // Check for storage availability
1043
+ if (typeof(Storage) !== "undefined") {
1044
+ console.log('localStorage is available');
1045
+ } else {
1046
+ console.log('localStorage is not supported');
1047
+ }
1048
+ ```
1049
+
1050
+ ## Related Documentation
1051
+
1052
+ - [HTTP State Service](http-state/README.md)
1053
+ - [Local Storage Signals Service](local-storage-signals/README.md)
1054
+ - [Database Manager Service](database/README.md)
1055
+ - [Utils Service](utils/README.md)
1056
+ - [Architecture Overview](../architecture/README.md)