http-request-manager 18.15.33 → 18.15.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/TEST_COVERAGE_SUMMARY.md +458 -0
- package/ng-package.json +8 -0
- package/package.json +4 -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 -13688
- package/fesm2022/http-request-manager.mjs.map +0 -1
- package/http-request-manager-18.15.33.tgz +0 -0
- package/types/http-request-manager.d.ts +0 -3968
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
<!-- markdownlint-disable MD031 MD060 -->
|
|
2
|
+
|
|
3
|
+
# Message Tracker Service
|
|
4
|
+
|
|
5
|
+
The `MessageTrackerService` provides guaranteed message delivery tracking for WebSocket communications with sequence tracking, gap detection, and automatic re-subscription.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
This service ensures that frontend clients never miss WebSocket messages, even during disconnections. It provides:
|
|
10
|
+
|
|
11
|
+
- ✅ **Per-Channel Message Tracking** - Track message sequences per channel
|
|
12
|
+
- ✅ **Gap Detection** - Automatically detect missing messages
|
|
13
|
+
- ✅ **Batch Acknowledgments** - Efficient message confirmation
|
|
14
|
+
- ✅ **Reconnection Sync** - Resume from last-seen message after disconnect
|
|
15
|
+
- ✅ **Persistent Tracking** - Survives page refreshes via sessionStorage
|
|
16
|
+
- ✅ **Notification Channel Support** - Special handling for notification channels
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { MessageTrackerService } from 'http-request-manager';
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The service is automatically available when you import `HttpRequestManagerModule`.
|
|
25
|
+
|
|
26
|
+
## Basic Usage
|
|
27
|
+
|
|
28
|
+
### Channel Subscription with Tracking
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import { Component, inject, OnDestroy } from '@angular/core';
|
|
32
|
+
import { MessageTrackerService, WebSocketManagerService } from 'http-request-manager';
|
|
33
|
+
import { Subscription } from 'rxjs';
|
|
34
|
+
|
|
35
|
+
@Component({
|
|
36
|
+
selector: 'app-chat',
|
|
37
|
+
template: `
|
|
38
|
+
<div class="chat">
|
|
39
|
+
<h2>Chat Messages</h2>
|
|
40
|
+
<div class="messages">
|
|
41
|
+
<div *ngFor="let message of messages" class="message">
|
|
42
|
+
<strong>{{ message.user }}:</strong> {{ message.content }}
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
`
|
|
47
|
+
})
|
|
48
|
+
export class ChatComponent implements OnDestroy {
|
|
49
|
+
private tracker = inject(MessageTrackerService);
|
|
50
|
+
private wsManager = inject(WebSocketManagerService);
|
|
51
|
+
|
|
52
|
+
messages: any[] = [];
|
|
53
|
+
private messagesSubscription: Subscription;
|
|
54
|
+
|
|
55
|
+
constructor() {
|
|
56
|
+
// Subscribe to tracked messages
|
|
57
|
+
this.messagesSubscription = this.tracker.messages$.subscribe(message => {
|
|
58
|
+
if (message) {
|
|
59
|
+
this.messages.push(message);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Connect and subscribe to channel
|
|
64
|
+
this.wsManager.connect({
|
|
65
|
+
wsServer: 'ws://localhost:8080',
|
|
66
|
+
id: 'chat',
|
|
67
|
+
user: { id: 'user123', name: 'John' }
|
|
68
|
+
}, 'jwt-token');
|
|
69
|
+
|
|
70
|
+
// Subscribe with automatic tracking
|
|
71
|
+
this.tracker.subscribeToChannel('chat');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
ngOnDestroy() {
|
|
75
|
+
this.messagesSubscription?.unsubscribe();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## API Reference
|
|
81
|
+
|
|
82
|
+
### Message Tracking
|
|
83
|
+
|
|
84
|
+
#### `trackMessage(message: any): void`
|
|
85
|
+
|
|
86
|
+
Manually tracks a message and updates sequence tracking.
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
tracker.trackMessage({
|
|
90
|
+
id: 123,
|
|
91
|
+
channel: 'chat',
|
|
92
|
+
user: 'user123',
|
|
93
|
+
content: 'Hello!',
|
|
94
|
+
timestamp: new Date().toISOString()
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Channel Management
|
|
99
|
+
|
|
100
|
+
#### `subscribeToChannel(channel: string, userData?: any): void`
|
|
101
|
+
|
|
102
|
+
Subscribe to a channel with automatic last-seen tracking for message replay.
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
// Subscribe to general chat
|
|
106
|
+
tracker.subscribeToChannel('general');
|
|
107
|
+
|
|
108
|
+
// Subscribe with user data
|
|
109
|
+
tracker.subscribeToChannel('private', { userId: 'user123' });
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Features:**
|
|
113
|
+
- Automatically includes `lastSeenId` for message replay
|
|
114
|
+
- Persists intended channels to sessionStorage
|
|
115
|
+
- Re-subscribes automatically after reconnection
|
|
116
|
+
|
|
117
|
+
#### `unsubscribeFromChannel(channel: string): void`
|
|
118
|
+
|
|
119
|
+
Unsubscribe from a tracked channel.
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
tracker.unsubscribeFromChannel('general');
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
#### `getIntendedChannels(): Set<string>`
|
|
126
|
+
|
|
127
|
+
Get all channels the service intends to stay subscribed to.
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
const channels = tracker.getIntendedChannels();
|
|
131
|
+
console.log('Tracking channels:', Array.from(channels));
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Notification Channels
|
|
135
|
+
|
|
136
|
+
#### `getNotificationChannels(): void`
|
|
137
|
+
|
|
138
|
+
Request list of all notification channels.
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
tracker.getNotificationChannels();
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
#### `getTodaysNotificationChannels(): void`
|
|
145
|
+
|
|
146
|
+
Request list of today's notification channels only.
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
tracker.getTodaysNotificationChannels();
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
#### `subscribeToNotificationChannel(channel: string, options?: any, user?: any): void`
|
|
153
|
+
|
|
154
|
+
Subscribe to a persistent notification channel.
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
tracker.subscribeToNotificationChannel('alerts', {
|
|
158
|
+
limit: 50,
|
|
159
|
+
since: new Date().toISOString()
|
|
160
|
+
}, { id: 'user123' });
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
#### `unsubscribeFromNotificationChannel(channel: string): void`
|
|
164
|
+
|
|
165
|
+
Unsubscribe from a notification channel.
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
tracker.unsubscribeFromNotificationChannel('alerts');
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
#### `sendNotification(channel: string, content: any): void`
|
|
172
|
+
|
|
173
|
+
Send a notification to a channel.
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
tracker.sendNotification('alerts', {
|
|
177
|
+
title: 'New Message',
|
|
178
|
+
body: 'You have a new message',
|
|
179
|
+
priority: 'high'
|
|
180
|
+
});
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
#### `createNotificationChannel(channel: string): void`
|
|
184
|
+
|
|
185
|
+
Create a new notification channel.
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
tracker.createNotificationChannel('system-alerts');
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### State Accessors
|
|
192
|
+
|
|
193
|
+
#### `getLastSeen(channel: string): number`
|
|
194
|
+
|
|
195
|
+
Get the last seen message ID for a channel.
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
const lastId = tracker.getLastSeen('chat');
|
|
199
|
+
console.log('Last seen message ID:', lastId);
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
#### `getExpectedSequence(channel: string): number`
|
|
203
|
+
|
|
204
|
+
Get the expected next message ID for gap detection.
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
const expected = tracker.getExpectedSequence('chat');
|
|
208
|
+
console.log('Expected next message ID:', expected);
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
#### `getGapCount(channel: string): number`
|
|
212
|
+
|
|
213
|
+
Get the number of detected gaps in a channel.
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
const gaps = tracker.getGapCount('chat');
|
|
217
|
+
if (gaps > 0) {
|
|
218
|
+
console.warn(`Detected ${gaps} message gaps in channel ${channel}`);
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
#### `isInReplayMode(channel: string): boolean`
|
|
223
|
+
|
|
224
|
+
Check if a channel is currently in replay mode.
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
if (tracker.isInReplayMode('chat')) {
|
|
228
|
+
console.log('Replaying missed messages...');
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
#### `getMessages(): Observable<any>`
|
|
233
|
+
|
|
234
|
+
Observable emitting all tracked messages.
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
tracker.messages$.subscribe(message => {
|
|
238
|
+
console.log('Tracked message:', message);
|
|
239
|
+
});
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Utility Methods
|
|
243
|
+
|
|
244
|
+
#### `clearState(): void`
|
|
245
|
+
|
|
246
|
+
Clear all tracking state (useful for debugging or manual reset).
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
tracker.clearState();
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
#### `persistLastSeen(): void`
|
|
253
|
+
|
|
254
|
+
Manually persist last-seen IDs to sessionStorage.
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
tracker.persistLastSeen();
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Advanced Features
|
|
261
|
+
|
|
262
|
+
### Gap Detection and Recovery
|
|
263
|
+
|
|
264
|
+
The service automatically detects when messages are missing and can request replay:
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
// Automatic gap detection
|
|
268
|
+
// When a gap is detected (e.g., expected ID 5 but received ID 7):
|
|
269
|
+
// 1. Gap count is incremented
|
|
270
|
+
// 2. If gap threshold exceeded (10 messages), UI is notified
|
|
271
|
+
// 3. Service attempts to recover missed messages on reconnect
|
|
272
|
+
|
|
273
|
+
// Monitor gap counts
|
|
274
|
+
setInterval(() => {
|
|
275
|
+
const channels = tracker.getIntendedChannels();
|
|
276
|
+
channels.forEach(channel => {
|
|
277
|
+
const gaps = tracker.getGapCount(channel);
|
|
278
|
+
if (gaps > 0) {
|
|
279
|
+
console.warn(`Channel ${channel} has ${gaps} message gaps`);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}, 5000);
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### Batch Acknowledgments
|
|
286
|
+
|
|
287
|
+
Messages are acknowledged in batches for efficiency:
|
|
288
|
+
|
|
289
|
+
```typescript
|
|
290
|
+
// Automatic batch acknowledgment every 5 seconds
|
|
291
|
+
// No manual intervention needed
|
|
292
|
+
|
|
293
|
+
// Manual acknowledgment (if needed)
|
|
294
|
+
tracker.sendBatchAck('chat');
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Reconnection Handling
|
|
298
|
+
|
|
299
|
+
Automatic re-subscription with last-seen tracking:
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
// When WebSocket reconnects:
|
|
303
|
+
// 1. All intended channels are re-subscribed
|
|
304
|
+
// 2. Last-seen IDs are sent to server
|
|
305
|
+
// 3. Server replays missed messages
|
|
306
|
+
// 4. Gap detection resumes
|
|
307
|
+
|
|
308
|
+
// This happens automatically - no code needed
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### Persistent Tracking
|
|
312
|
+
|
|
313
|
+
Intended channels survive page refreshes:
|
|
314
|
+
|
|
315
|
+
```typescript
|
|
316
|
+
// Channels are persisted to sessionStorage automatically
|
|
317
|
+
// On page load, service restores intended channels:
|
|
318
|
+
|
|
319
|
+
// Example flow:
|
|
320
|
+
// 1. User subscribes to 'chat' and 'alerts'
|
|
321
|
+
// 2. Page is refreshed
|
|
322
|
+
// 3. Service restores intended channels from sessionStorage
|
|
323
|
+
// 4. When WebSocket connects, auto-subscribes to restored channels
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## Complete Example: Chat Application
|
|
327
|
+
|
|
328
|
+
```typescript
|
|
329
|
+
import { Component, inject, OnDestroy } from '@angular/core';
|
|
330
|
+
import { MessageTrackerService, WebSocketManagerService } from 'http-request-manager';
|
|
331
|
+
import { Subscription } from 'rxjs';
|
|
332
|
+
|
|
333
|
+
interface ChatMessage {
|
|
334
|
+
id: number;
|
|
335
|
+
channel: string;
|
|
336
|
+
user: string;
|
|
337
|
+
content: string;
|
|
338
|
+
timestamp: string;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
@Component({
|
|
342
|
+
selector: 'app-chat-room',
|
|
343
|
+
template: `
|
|
344
|
+
<div class="chat-room">
|
|
345
|
+
<div class="channel-selector">
|
|
346
|
+
<button *ngFor="let channel of channels"
|
|
347
|
+
[class.active]="currentChannel === channel"
|
|
348
|
+
(click)="switchChannel(channel)">
|
|
349
|
+
{{ channel }}
|
|
350
|
+
<span class="unread" *ngIf="getUnreadCount(channel) > 0">
|
|
351
|
+
{{ getUnreadCount(channel) }}
|
|
352
|
+
</span>
|
|
353
|
+
</button>
|
|
354
|
+
</div>
|
|
355
|
+
|
|
356
|
+
<div class="messages">
|
|
357
|
+
<div *ngFor="let message of messages" class="message">
|
|
358
|
+
<div class="message-header">
|
|
359
|
+
<span class="user">{{ message.user }}</span>
|
|
360
|
+
<span class="time">{{ message.timestamp | date:'short' }}</span>
|
|
361
|
+
</div>
|
|
362
|
+
<div class="message-content">{{ message.content }}</div>
|
|
363
|
+
</div>
|
|
364
|
+
</div>
|
|
365
|
+
|
|
366
|
+
<div class="input-area">
|
|
367
|
+
<input [(ngModel)]="newMessage"
|
|
368
|
+
(keyup.enter)="sendMessage()"
|
|
369
|
+
placeholder="Type a message...">
|
|
370
|
+
<button (click)="sendMessage()">Send</button>
|
|
371
|
+
</div>
|
|
372
|
+
|
|
373
|
+
<div class="connection-status" *ngIf="!isConnected">
|
|
374
|
+
⚠️ Disconnected - Reconnecting...
|
|
375
|
+
</div>
|
|
376
|
+
</div>
|
|
377
|
+
`,
|
|
378
|
+
styles: [`
|
|
379
|
+
.chat-room { display: flex; flex-direction: column; height: 100%; }
|
|
380
|
+
.channel-selector { display: flex; gap: 8px; padding: 8px; }
|
|
381
|
+
.messages { flex: 1; overflow-y: auto; padding: 16px; }
|
|
382
|
+
.message { margin-bottom: 16px; }
|
|
383
|
+
.message-header { display: flex; justify-content: space-between; margin-bottom: 4px; }
|
|
384
|
+
.user { font-weight: bold; }
|
|
385
|
+
.time { color: #666; font-size: 0.8em; }
|
|
386
|
+
.input-area { display: flex; gap: 8px; padding: 16px; }
|
|
387
|
+
.input-area input { flex: 1; padding: 8px; }
|
|
388
|
+
.connection-status { background: #fff3cd; padding: 8px; text-align: center; }
|
|
389
|
+
.unread { background: #dc3545; color: white; border-radius: 50%; padding: 2px 6px; font-size: 0.7em; }
|
|
390
|
+
`]
|
|
391
|
+
})
|
|
392
|
+
export class ChatRoomComponent implements OnDestroy {
|
|
393
|
+
private tracker = inject(MessageTrackerService);
|
|
394
|
+
private wsManager = inject(WebSocketManagerService);
|
|
395
|
+
|
|
396
|
+
channels = ['general', 'random', 'announcements'];
|
|
397
|
+
currentChannel = 'general';
|
|
398
|
+
messages: ChatMessage[] = [];
|
|
399
|
+
newMessage = '';
|
|
400
|
+
isConnected = true;
|
|
401
|
+
|
|
402
|
+
private messagesSubscription: Subscription;
|
|
403
|
+
private connectionSubscription: Subscription;
|
|
404
|
+
|
|
405
|
+
constructor() {
|
|
406
|
+
// Subscribe to tracked messages
|
|
407
|
+
this.messagesSubscription = this.tracker.messages$.subscribe(message => {
|
|
408
|
+
if (message && message.channel === this.currentChannel) {
|
|
409
|
+
this.messages.push(message);
|
|
410
|
+
}
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
// Monitor connection status
|
|
414
|
+
this.connectionSubscription = this.wsManager.connectionStatus$.subscribe(connected => {
|
|
415
|
+
this.isConnected = connected;
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
// Initialize WebSocket connection
|
|
419
|
+
this.wsManager.connect({
|
|
420
|
+
wsServer: 'ws://localhost:8080',
|
|
421
|
+
id: 'chat',
|
|
422
|
+
user: { id: 'user123', name: 'John Doe' }
|
|
423
|
+
}, 'jwt-token');
|
|
424
|
+
|
|
425
|
+
// Subscribe to channels with tracking
|
|
426
|
+
this.channels.forEach(channel => {
|
|
427
|
+
this.tracker.subscribeToChannel(channel);
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
switchChannel(channel: string) {
|
|
432
|
+
this.currentChannel = channel;
|
|
433
|
+
// Load messages for this channel
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
sendMessage() {
|
|
437
|
+
if (!this.newMessage.trim()) return;
|
|
438
|
+
|
|
439
|
+
this.wsManager.sendChannelMessage(this.currentChannel, {
|
|
440
|
+
type: 'CHAT_MESSAGE',
|
|
441
|
+
content: this.newMessage,
|
|
442
|
+
timestamp: new Date().toISOString()
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
this.newMessage = '';
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
getUnreadCount(channel: string): number {
|
|
449
|
+
const lastSeen = this.tracker.getLastSeen(channel);
|
|
450
|
+
const expected = this.tracker.getExpectedSequence(channel);
|
|
451
|
+
return Math.max(0, expected - lastSeen - 1);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
ngOnDestroy() {
|
|
455
|
+
this.messagesSubscription?.unsubscribe();
|
|
456
|
+
this.connectionSubscription?.unsubscribe();
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
## Troubleshooting
|
|
462
|
+
|
|
463
|
+
### Messages Not Tracked
|
|
464
|
+
|
|
465
|
+
**Problem**: Messages not appearing in `messages$` observable
|
|
466
|
+
|
|
467
|
+
**Solution**: Ensure WebSocket connection is active and you're subscribed to channels
|
|
468
|
+
|
|
469
|
+
```typescript
|
|
470
|
+
// Check connection
|
|
471
|
+
wsManager.connectionStatus$.subscribe(connected => {
|
|
472
|
+
if (!connected) {
|
|
473
|
+
console.warn('WebSocket not connected');
|
|
474
|
+
}
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
// Ensure subscription
|
|
478
|
+
tracker.subscribeToChannel('your-channel');
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### Gaps Not Detected
|
|
482
|
+
|
|
483
|
+
**Problem**: Missing messages not detected
|
|
484
|
+
|
|
485
|
+
**Solution**: Ensure messages have proper ID structure
|
|
486
|
+
|
|
487
|
+
```typescript
|
|
488
|
+
// Messages should have numeric IDs
|
|
489
|
+
{
|
|
490
|
+
id: 123, // ✅ Required for tracking
|
|
491
|
+
channel: 'chat',
|
|
492
|
+
content: 'Hello'
|
|
493
|
+
}
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
### Channels Not Restored After Refresh
|
|
497
|
+
|
|
498
|
+
**Problem**: Intended channels not persisted
|
|
499
|
+
|
|
500
|
+
**Solution**: Check sessionStorage permissions and browser settings
|
|
501
|
+
|
|
502
|
+
```typescript
|
|
503
|
+
// Check if sessionStorage is available
|
|
504
|
+
try {
|
|
505
|
+
sessionStorage.setItem('test', 'test');
|
|
506
|
+
sessionStorage.removeItem('test');
|
|
507
|
+
console.log('sessionStorage available');
|
|
508
|
+
} catch (e) {
|
|
509
|
+
console.error('sessionStorage not available');
|
|
510
|
+
}
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
## Related Documentation
|
|
514
|
+
|
|
515
|
+
- [Message Tracker Signals Service](./MESSAGE_TRACKER_SIGNALS_README.md) - Signal-based version for Angular 19+
|
|
516
|
+
- [WebSocket Manager Service](./WS_MANAGER_README.md) - Underlying WebSocket connection management
|
|
517
|
+
- [Advanced WebSocket Guide](./ADVANCED_WEBSOCKET.md) - Channel architecture and patterns
|
|
518
|
+
- [WebSocket Message Service](./WEBSOCKET_MESSAGE_SERVICE.md) - Type-safe message sending
|