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.
- package/README.md +2 -0
- package/TEST_COVERAGE_SUMMARY.md +458 -0
- package/ng-package.json +8 -0
- package/package.json +5 -13
- package/src/docs/ADVANCED_WEBSOCKET.md +633 -0
- package/src/docs/ARCHITECTURE.md +633 -0
- package/src/docs/BATCH_REQUEST_README.md +467 -0
- package/src/docs/COMPLETE_API_REFERENCE.md +1037 -0
- package/src/docs/DATABASE_README.md +1195 -0
- package/src/docs/ENCRYPTION_README.md +403 -0
- package/src/docs/HTTP_MANAGER_README.md +628 -0
- package/src/docs/HTTP_SINGNALS_MANAGER_README.md +654 -0
- package/src/docs/HTTP_STATE_MANAGER_README.md +1391 -0
- package/src/docs/INTERCEPTOR_README.md +549 -0
- package/src/docs/LOCAL_STORAGE_README.md +1056 -0
- package/src/docs/LOCAL_STORAGE_SIGNALS_README.md +338 -0
- package/src/docs/LOGGER_README.md +310 -0
- package/src/docs/MESSAGE_TRACKER_README.md +518 -0
- package/src/docs/MESSAGE_TRACKER_SIGNALS_README.md +563 -0
- package/src/docs/MODELS_README.md +1264 -0
- package/src/docs/SIGNAL_SERVICES_README.md +238 -0
- package/src/docs/SQL_DIXIE_README.md +574 -0
- package/src/docs/STORE_STATE_MANAGER_README.md +556 -0
- package/src/docs/STORE_STATE_SIGNALS_README.md +600 -0
- package/src/docs/UPLOAD_REQUEST_README.md +324 -0
- package/src/docs/UTILS_README.md +1604 -0
- package/src/docs/WEBSOCKET_MESSAGE_SERVICE.md +799 -0
- package/src/docs/WEBSOCKET_SIGNALS_README.md +641 -0
- package/src/docs/WEBSOCKET_SINGLETON_REFACTORING.md +201 -0
- package/src/docs/WS_MANAGER_README.md +613 -0
- package/src/lib/http-request-manager.module.ts +147 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +116 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +255 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.html +123 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +53 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +208 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +214 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.html +279 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.ts +461 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +622 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +106 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +687 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +418 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +576 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +89 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +119 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +94 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +203 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +144 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +102 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +40 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +230 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +40 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/jwt-token.service.ts +62 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +168 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +49 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
- package/src/lib/http-request-services-demo/store-state-signals-demo/store-state-signals-demo.component.ts +161 -0
- package/src/lib/http-request-services-demo/upload-demo/models/index.ts +1 -0
- package/src/lib/http-request-services-demo/upload-demo/models/upload-state.model.ts +30 -0
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.html +89 -0
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.scss +160 -0
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.spec.ts +101 -0
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.ts +136 -0
- package/src/lib/index.ts +3 -0
- package/src/lib/interceptors/credentials.interceptor.ts +16 -0
- package/src/lib/interceptors/index.ts +6 -0
- package/src/lib/interceptors/models/error-settings.model.ts +22 -0
- package/src/lib/interceptors/models/index.ts +2 -0
- package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
- package/src/lib/interceptors/request-error.interceptor.ts +65 -0
- package/src/lib/interceptors/request-header.interceptor.ts +56 -0
- package/src/lib/message-display/README.md +509 -0
- package/src/lib/message-display/index.ts +4 -0
- package/src/lib/message-display/models/action.model.ts +27 -0
- package/src/lib/message-display/models/communication-message.model.ts +77 -0
- package/src/lib/message-display/models/display-config.model.ts +35 -0
- package/src/lib/message-display/models/display-rule.interface.ts +28 -0
- package/src/lib/message-display/models/display-strategy.interface.ts +8 -0
- package/src/lib/message-display/models/index.ts +6 -0
- package/src/lib/message-display/models/slide.model.ts +24 -0
- package/src/lib/message-display/rules/default-display-rules.ts +35 -0
- package/src/lib/message-display/services/message-display-router.service.ts +63 -0
- package/src/lib/message-display/strategies/snackbar.strategy.ts +46 -0
- package/src/lib/models/batch-options.model.ts +33 -0
- package/src/lib/models/batch-progress.model.ts +19 -0
- package/src/lib/models/batch-request-state.model.ts +40 -0
- package/src/lib/models/batch-result.model.ts +30 -0
- package/src/lib/models/config-http-options.model.ts +45 -0
- package/src/lib/models/config-local-storage-options.model.ts +27 -0
- package/src/lib/models/config-options.model.ts +27 -0
- package/src/lib/models/config-token.model.ts +9 -0
- package/src/lib/models/data-type.enum.ts +5 -0
- package/src/lib/models/database-storage.model.ts +24 -0
- package/src/lib/models/index.ts +16 -0
- package/src/lib/models/retry-options.model.ts +22 -0
- package/src/lib/models/upload-validation-error.model.ts +46 -0
- package/src/lib/services/SQL-DixieJS service/dexie-query-executor.ts +246 -0
- package/src/lib/services/SQL-DixieJS service/dexie-sql.service.ts +31 -0
- package/src/lib/services/SQL-DixieJS service/index.ts +4 -0
- package/src/lib/services/SQL-DixieJS service/models/execution-plan.model.ts +52 -0
- package/src/lib/services/SQL-DixieJS service/models/index.ts +3 -0
- package/src/lib/services/SQL-DixieJS service/models/sql-errors.model.ts +13 -0
- package/src/lib/services/SQL-DixieJS service/models/sql-options.model.ts +3 -0
- package/src/lib/services/SQL-DixieJS service/query-planner.ts +284 -0
- package/src/lib/services/SQL-DixieJS service/schema-validator.ts +217 -0
- package/src/lib/services/SQL-DixieJS service/sql-parser.ts +35 -0
- package/src/lib/services/database-manager-service/database.manager.service.ts +384 -0
- package/src/lib/services/database-manager-service/db.storage.service.ts +240 -0
- package/src/lib/services/database-manager-service/index.ts +4 -0
- package/src/lib/services/database-manager-service/models/index.ts +2 -0
- package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
- package/src/lib/services/index.ts +20 -0
- package/src/lib/services/local-storage-manager-service/index.ts +4 -0
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +567 -0
- package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
- package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +437 -0
- package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
- package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
- package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
- package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
- package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
- package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
- package/src/lib/services/request-manager-services/README.md +282 -0
- package/src/lib/services/request-manager-services/http-manager-signals.service.ts +674 -0
- package/src/lib/services/request-manager-services/http-manager.service.spec.ts +353 -0
- package/src/lib/services/request-manager-services/http-manager.service.ts +727 -0
- package/src/lib/services/request-manager-services/index.ts +8 -0
- package/src/lib/services/request-manager-services/request-signals.service.ts +372 -0
- package/src/lib/services/request-manager-services/request.service.ts +435 -0
- package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
- package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
- package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
- package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
- package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +468 -0
- package/src/lib/services/request-manager-state-service/http-manager-state.store.spec.ts +665 -0
- package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +2395 -0
- package/src/lib/services/request-manager-state-service/index.ts +3 -0
- package/src/lib/services/request-manager-state-service/models/api-request.model.ts +86 -0
- package/src/lib/services/request-manager-state-service/models/index.ts +14 -0
- package/src/lib/services/request-manager-state-service/models/operation-result.model.ts +18 -0
- package/src/lib/services/request-manager-state-service/models/parsing-result.model.ts +21 -0
- package/src/lib/services/request-manager-state-service/models/request-options.model.ts +37 -0
- package/src/lib/services/request-manager-state-service/models/stream-config.model.ts +20 -0
- package/src/lib/services/request-manager-state-service/models/stream-event-metadata.model.ts +23 -0
- package/src/lib/services/request-manager-state-service/models/stream-event.model.ts +23 -0
- package/src/lib/services/request-manager-state-service/models/stream-output.model.ts +23 -0
- package/src/lib/services/request-manager-state-service/models/stream-progress.model.ts +24 -0
- package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
- package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +42 -0
- package/src/lib/services/store-state-manager-service/index.ts +4 -0
- package/src/lib/services/store-state-manager-service/models/index.ts +3 -0
- package/src/lib/services/store-state-manager-service/models/state-operation-result.model.ts +30 -0
- package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
- package/src/lib/services/store-state-manager-service/store-state-manager-signals.service.ts +169 -0
- package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +153 -0
- package/src/lib/services/utils/app.service.spec.ts +25 -0
- package/src/lib/services/utils/app.service.ts +21 -0
- package/src/lib/services/utils/encryption/README.md +79 -0
- package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
- package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
- package/src/lib/services/utils/encryption/index.ts +5 -0
- package/src/lib/services/utils/encryption/random.ts +81 -0
- package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +106 -0
- package/src/lib/services/utils/headers.service.spec.ts +80 -0
- package/src/lib/services/utils/headers.service.ts +18 -0
- package/src/lib/services/utils/index.ts +9 -0
- package/src/lib/services/utils/logger.service.ts +90 -0
- package/src/lib/services/utils/models/index.ts +4 -0
- package/src/lib/services/utils/models/normalized-request-options.model.ts +24 -0
- package/src/lib/services/utils/models/path-tracker-state.model.ts +20 -0
- package/src/lib/services/utils/models/query-params-tracker-options.model.ts +24 -0
- package/src/lib/services/utils/models/query-tracker-state.model.ts +23 -0
- package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
- package/src/lib/services/utils/object-merger.service.ts +78 -0
- package/src/lib/services/utils/path-query.service.spec.ts +117 -0
- package/src/lib/services/utils/path-query.service.ts +69 -0
- package/src/lib/services/utils/query-params-tracker.service.ts +442 -0
- package/src/lib/services/utils/random-color.utils.ts +83 -0
- package/src/lib/services/utils/utils.service.spec.ts +165 -0
- package/src/lib/services/utils/utils.service.ts +192 -0
- package/src/lib/services/ws-manager-service/index.ts +13 -0
- package/src/lib/services/ws-manager-service/message-tracker-signals.service.ts +147 -0
- package/src/lib/services/ws-manager-service/message-tracker.service.ts +477 -0
- package/src/lib/services/ws-manager-service/models/channel-info.model.ts +29 -0
- package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
- package/src/lib/services/ws-manager-service/models/channel-message.model.ts +36 -0
- package/src/lib/services/ws-manager-service/models/channel-type.enum.ts +6 -0
- package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
- package/src/lib/services/ws-manager-service/models/index.ts +10 -0
- package/src/lib/services/ws-manager-service/models/notification-message.model.ts +29 -0
- package/src/lib/services/ws-manager-service/models/public-message.model.ts +18 -0
- package/src/lib/services/ws-manager-service/models/state-message.model.ts +18 -0
- package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
- package/src/lib/services/ws-manager-service/services/index.ts +4 -0
- package/src/lib/services/ws-manager-service/services/websocket-message.service.ts +129 -0
- package/src/lib/services/ws-manager-service/services/websocket.service.ts +434 -0
- package/src/lib/services/ws-manager-service/websocket-service/index.ts +1 -0
- package/src/lib/services/ws-manager-service/websocket-service/websocket-manager.service.ts +716 -0
- package/src/lib/services/ws-manager-service/websocket-services-complete.spec.ts +596 -0
- package/src/lib/services/ws-manager-service/websocket-signals-manager.service.ts +141 -0
- package/src/public-api.ts +19 -0
- package/tsconfig.lib.json +34 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +14 -0
- package/fesm2022/http-request-manager.mjs +0 -13297
- package/fesm2022/http-request-manager.mjs.map +0 -1
- package/http-request-manager-18.15.32.tgz +0 -0
- 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)
|