http-request-manager 18.15.34 → 18.16.1
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/fesm2022/http-request-manager.mjs +13688 -0
- package/fesm2022/http-request-manager.mjs.map +1 -0
- package/http-request-manager-18.16.0.tgz +0 -0
- package/package.json +15 -6
- package/types/http-request-manager.d.ts +3968 -0
- package/TEST_COVERAGE_SUMMARY.md +0 -458
- package/ng-package.json +0 -8
- package/src/docs/ADVANCED_WEBSOCKET.md +0 -633
- package/src/docs/ARCHITECTURE.md +0 -633
- package/src/docs/BATCH_REQUEST_README.md +0 -467
- package/src/docs/COMPLETE_API_REFERENCE.md +0 -1037
- package/src/docs/DATABASE_README.md +0 -1195
- package/src/docs/ENCRYPTION_README.md +0 -403
- package/src/docs/HTTP_MANAGER_README.md +0 -628
- package/src/docs/HTTP_SINGNALS_MANAGER_README.md +0 -654
- package/src/docs/HTTP_STATE_MANAGER_README.md +0 -1391
- package/src/docs/INTERCEPTOR_README.md +0 -549
- package/src/docs/LOCAL_STORAGE_README.md +0 -1056
- package/src/docs/LOCAL_STORAGE_SIGNALS_README.md +0 -338
- package/src/docs/LOGGER_README.md +0 -310
- package/src/docs/MESSAGE_TRACKER_README.md +0 -518
- package/src/docs/MESSAGE_TRACKER_SIGNALS_README.md +0 -563
- package/src/docs/MODELS_README.md +0 -1264
- package/src/docs/SIGNAL_SERVICES_README.md +0 -238
- package/src/docs/SQL_DIXIE_README.md +0 -574
- package/src/docs/STORE_STATE_MANAGER_README.md +0 -556
- package/src/docs/STORE_STATE_SIGNALS_README.md +0 -600
- package/src/docs/UPLOAD_REQUEST_README.md +0 -324
- package/src/docs/UTILS_README.md +0 -1604
- package/src/docs/WEBSOCKET_MESSAGE_SERVICE.md +0 -799
- package/src/docs/WEBSOCKET_SIGNALS_README.md +0 -641
- package/src/docs/WEBSOCKET_SINGLETON_REFACTORING.md +0 -201
- package/src/docs/WS_MANAGER_README.md +0 -613
- package/src/lib/http-request-manager.module.ts +0 -147
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +0 -116
- 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 +0 -255
- package/src/lib/http-request-services-demo/http-request-services-demo.component.html +0 -123
- package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +0 -6
- package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +0 -53
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +0 -195
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +0 -17
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +0 -208
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +0 -200
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +0 -17
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +0 -214
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.html +0 -53
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.scss +0 -60
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.ts +0 -72
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-download.module.ts +0 -28
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.html +0 -10
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.scss +0 -29
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.ts +0 -100
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/models/download-labels-model.ts +0 -22
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.html +0 -8
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.scss +0 -19
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.ts +0 -26
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app-session.model.ts +0 -30
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app.model.ts +0 -19
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/get-sample.model.ts +0 -25
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-ai-prompt.ts +0 -19
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-details.ts +0 -24
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-info.ts +0 -30
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client.model.ts +0 -49
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-mapper-client-info.ts +0 -33
- package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.html +0 -279
- package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.scss +0 -24
- package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.ts +0 -461
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +0 -53
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +0 -60
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +0 -72
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +0 -28
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +0 -10
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +0 -29
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +0 -100
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +0 -22
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +0 -8
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +0 -19
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +0 -26
- package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +0 -30
- package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +0 -19
- package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +0 -25
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +0 -19
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +0 -24
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +0 -30
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +0 -49
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +0 -33
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +0 -622
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +0 -106
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +0 -687
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +0 -418
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +0 -24
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +0 -576
- package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +0 -89
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +0 -119
- 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 +0 -3
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +0 -16
- 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 +0 -3
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +0 -16
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +0 -31
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +0 -94
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +0 -41
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +0 -203
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +0 -144
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +0 -11
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +0 -102
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +0 -40
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +0 -230
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +0 -30
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +0 -172
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +0 -31
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +0 -239
- package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +0 -31
- package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +0 -32
- 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 +0 -84
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +0 -40
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +0 -3
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/jwt-token.service.ts +0 -62
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +0 -83
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +0 -147
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +0 -168
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +0 -53
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +0 -60
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +0 -72
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +0 -28
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +0 -10
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +0 -29
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +0 -100
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +0 -22
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +0 -8
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +0 -19
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +0 -26
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +0 -30
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +0 -19
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +0 -25
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +0 -19
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +0 -24
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +0 -30
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +0 -49
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +0 -33
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +0 -380
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +0 -24
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +0 -410
- package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +0 -28
- package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +0 -49
- 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 +0 -23
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +0 -36
- package/src/lib/http-request-services-demo/store-state-signals-demo/store-state-signals-demo.component.ts +0 -161
- package/src/lib/http-request-services-demo/upload-demo/models/index.ts +0 -1
- package/src/lib/http-request-services-demo/upload-demo/models/upload-state.model.ts +0 -30
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.html +0 -89
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.scss +0 -160
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.spec.ts +0 -101
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.ts +0 -136
- package/src/lib/index.ts +0 -3
- package/src/lib/interceptors/credentials.interceptor.ts +0 -16
- package/src/lib/interceptors/index.ts +0 -6
- package/src/lib/interceptors/models/error-settings.model.ts +0 -22
- package/src/lib/interceptors/models/index.ts +0 -2
- package/src/lib/interceptors/proxy-debugger.interceptor.ts +0 -46
- package/src/lib/interceptors/request-error.interceptor.ts +0 -65
- package/src/lib/interceptors/request-header.interceptor.ts +0 -56
- package/src/lib/message-display/README.md +0 -509
- package/src/lib/message-display/index.ts +0 -4
- package/src/lib/message-display/models/action.model.ts +0 -27
- package/src/lib/message-display/models/communication-message.model.ts +0 -77
- package/src/lib/message-display/models/display-config.model.ts +0 -35
- package/src/lib/message-display/models/display-rule.interface.ts +0 -28
- package/src/lib/message-display/models/display-strategy.interface.ts +0 -8
- package/src/lib/message-display/models/index.ts +0 -6
- package/src/lib/message-display/models/slide.model.ts +0 -24
- package/src/lib/message-display/rules/default-display-rules.ts +0 -35
- package/src/lib/message-display/services/message-display-router.service.ts +0 -63
- package/src/lib/message-display/strategies/snackbar.strategy.ts +0 -46
- package/src/lib/models/batch-options.model.ts +0 -33
- package/src/lib/models/batch-progress.model.ts +0 -19
- package/src/lib/models/batch-request-state.model.ts +0 -40
- package/src/lib/models/batch-result.model.ts +0 -30
- package/src/lib/models/config-http-options.model.ts +0 -45
- package/src/lib/models/config-local-storage-options.model.ts +0 -27
- package/src/lib/models/config-options.model.ts +0 -27
- package/src/lib/models/config-token.model.ts +0 -9
- package/src/lib/models/data-type.enum.ts +0 -5
- package/src/lib/models/database-storage.model.ts +0 -24
- package/src/lib/models/index.ts +0 -16
- package/src/lib/models/retry-options.model.ts +0 -22
- package/src/lib/models/upload-validation-error.model.ts +0 -46
- package/src/lib/services/SQL-DixieJS service/dexie-query-executor.ts +0 -246
- package/src/lib/services/SQL-DixieJS service/dexie-sql.service.ts +0 -31
- package/src/lib/services/SQL-DixieJS service/index.ts +0 -4
- package/src/lib/services/SQL-DixieJS service/models/execution-plan.model.ts +0 -52
- package/src/lib/services/SQL-DixieJS service/models/index.ts +0 -3
- package/src/lib/services/SQL-DixieJS service/models/sql-errors.model.ts +0 -13
- package/src/lib/services/SQL-DixieJS service/models/sql-options.model.ts +0 -3
- package/src/lib/services/SQL-DixieJS service/query-planner.ts +0 -284
- package/src/lib/services/SQL-DixieJS service/schema-validator.ts +0 -217
- package/src/lib/services/SQL-DixieJS service/sql-parser.ts +0 -35
- package/src/lib/services/database-manager-service/database.manager.service.ts +0 -384
- package/src/lib/services/database-manager-service/db.storage.service.ts +0 -240
- package/src/lib/services/database-manager-service/index.ts +0 -4
- package/src/lib/services/database-manager-service/models/index.ts +0 -2
- package/src/lib/services/database-manager-service/models/table-schema.ts +0 -33
- package/src/lib/services/index.ts +0 -20
- package/src/lib/services/local-storage-manager-service/index.ts +0 -4
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +0 -71
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +0 -567
- package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +0 -67
- package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +0 -437
- package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +0 -30
- package/src/lib/services/local-storage-manager-service/models/index.ts +0 -6
- package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +0 -35
- package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +0 -24
- package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +0 -32
- package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +0 -5
- package/src/lib/services/request-manager-services/README.md +0 -282
- package/src/lib/services/request-manager-services/http-manager-signals.service.ts +0 -674
- package/src/lib/services/request-manager-services/http-manager.service.spec.ts +0 -353
- package/src/lib/services/request-manager-services/http-manager.service.ts +0 -727
- package/src/lib/services/request-manager-services/index.ts +0 -8
- package/src/lib/services/request-manager-services/request-signals.service.ts +0 -372
- package/src/lib/services/request-manager-services/request.service.ts +0 -435
- package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +0 -17
- package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +0 -16
- package/src/lib/services/request-manager-services/rxjs-operators/index.ts +0 -4
- package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +0 -35
- package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +0 -468
- package/src/lib/services/request-manager-state-service/http-manager-state.store.spec.ts +0 -665
- package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +0 -2395
- package/src/lib/services/request-manager-state-service/index.ts +0 -3
- package/src/lib/services/request-manager-state-service/models/api-request.model.ts +0 -86
- package/src/lib/services/request-manager-state-service/models/index.ts +0 -14
- package/src/lib/services/request-manager-state-service/models/operation-result.model.ts +0 -18
- package/src/lib/services/request-manager-state-service/models/parsing-result.model.ts +0 -21
- package/src/lib/services/request-manager-state-service/models/request-options.model.ts +0 -37
- package/src/lib/services/request-manager-state-service/models/stream-config.model.ts +0 -20
- package/src/lib/services/request-manager-state-service/models/stream-event-metadata.model.ts +0 -23
- package/src/lib/services/request-manager-state-service/models/stream-event.model.ts +0 -23
- package/src/lib/services/request-manager-state-service/models/stream-output.model.ts +0 -23
- package/src/lib/services/request-manager-state-service/models/stream-progress.model.ts +0 -24
- package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +0 -13
- package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +0 -42
- package/src/lib/services/store-state-manager-service/index.ts +0 -4
- package/src/lib/services/store-state-manager-service/models/index.ts +0 -3
- package/src/lib/services/store-state-manager-service/models/state-operation-result.model.ts +0 -30
- package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +0 -24
- package/src/lib/services/store-state-manager-service/store-state-manager-signals.service.ts +0 -169
- package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +0 -153
- package/src/lib/services/utils/app.service.spec.ts +0 -25
- package/src/lib/services/utils/app.service.ts +0 -21
- package/src/lib/services/utils/encryption/README.md +0 -79
- package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +0 -282
- package/src/lib/services/utils/encryption/encryption-test.service.ts +0 -39
- package/src/lib/services/utils/encryption/index.ts +0 -5
- package/src/lib/services/utils/encryption/random.ts +0 -81
- package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +0 -106
- package/src/lib/services/utils/headers.service.spec.ts +0 -80
- package/src/lib/services/utils/headers.service.ts +0 -18
- package/src/lib/services/utils/index.ts +0 -9
- package/src/lib/services/utils/logger.service.ts +0 -90
- package/src/lib/services/utils/models/index.ts +0 -4
- package/src/lib/services/utils/models/normalized-request-options.model.ts +0 -24
- package/src/lib/services/utils/models/path-tracker-state.model.ts +0 -20
- package/src/lib/services/utils/models/query-params-tracker-options.model.ts +0 -24
- package/src/lib/services/utils/models/query-tracker-state.model.ts +0 -23
- package/src/lib/services/utils/object-merger.service.spec.ts +0 -18
- package/src/lib/services/utils/object-merger.service.ts +0 -78
- package/src/lib/services/utils/path-query.service.spec.ts +0 -117
- package/src/lib/services/utils/path-query.service.ts +0 -69
- package/src/lib/services/utils/query-params-tracker.service.ts +0 -442
- package/src/lib/services/utils/random-color.utils.ts +0 -83
- package/src/lib/services/utils/utils.service.spec.ts +0 -165
- package/src/lib/services/utils/utils.service.ts +0 -192
- package/src/lib/services/ws-manager-service/index.ts +0 -13
- package/src/lib/services/ws-manager-service/message-tracker-signals.service.ts +0 -147
- package/src/lib/services/ws-manager-service/message-tracker.service.ts +0 -477
- package/src/lib/services/ws-manager-service/models/channel-info.model.ts +0 -29
- package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +0 -24
- package/src/lib/services/ws-manager-service/models/channel-message.model.ts +0 -36
- package/src/lib/services/ws-manager-service/models/channel-type.enum.ts +0 -6
- package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +0 -5
- package/src/lib/services/ws-manager-service/models/index.ts +0 -10
- package/src/lib/services/ws-manager-service/models/notification-message.model.ts +0 -29
- package/src/lib/services/ws-manager-service/models/public-message.model.ts +0 -18
- package/src/lib/services/ws-manager-service/models/state-message.model.ts +0 -18
- package/src/lib/services/ws-manager-service/models/ws-user.model.ts +0 -38
- package/src/lib/services/ws-manager-service/services/index.ts +0 -4
- package/src/lib/services/ws-manager-service/services/websocket-message.service.ts +0 -129
- package/src/lib/services/ws-manager-service/services/websocket.service.ts +0 -434
- package/src/lib/services/ws-manager-service/websocket-service/index.ts +0 -1
- package/src/lib/services/ws-manager-service/websocket-service/websocket-manager.service.ts +0 -716
- package/src/lib/services/ws-manager-service/websocket-services-complete.spec.ts +0 -596
- package/src/lib/services/ws-manager-service/websocket-signals-manager.service.ts +0 -141
- package/src/public-api.ts +0 -19
- package/tsconfig.lib.json +0 -34
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -14
|
@@ -1,477 +0,0 @@
|
|
|
1
|
-
import { Injectable, OnDestroy } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, interval, Observable, Subject, Subscription } from 'rxjs';
|
|
3
|
-
import { takeUntil } from 'rxjs/operators';
|
|
4
|
-
import { WebSocketManagerService } from './websocket-service/websocket-manager.service';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Message Tracker Service - Guaranteed Message Delivery
|
|
8
|
-
*
|
|
9
|
-
* Tracks message IDs, detects gaps, manages acknowledgments, and handles sync.
|
|
10
|
-
* Ensures frontend clients never miss messages even during disconnections.
|
|
11
|
-
*
|
|
12
|
-
* Features:
|
|
13
|
-
* - Per-channel message sequence tracking
|
|
14
|
-
* - Automatic gap detection and recovery
|
|
15
|
-
* - Batch acknowledgments (configurable interval)
|
|
16
|
-
* - Reconnection sync with last-seen tracking
|
|
17
|
-
* - Gap threshold alerting (10 messages before UI notification)
|
|
18
|
-
*/
|
|
19
|
-
@Injectable({
|
|
20
|
-
providedIn: 'root',
|
|
21
|
-
})
|
|
22
|
-
export class MessageTrackerService implements OnDestroy {
|
|
23
|
-
|
|
24
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
25
|
-
// CONFIGURATION
|
|
26
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
27
|
-
|
|
28
|
-
/** Batch acknowledgment interval in milliseconds */
|
|
29
|
-
private readonly BATCH_ACK_INTERVAL_MS = 5000; // 5 seconds
|
|
30
|
-
|
|
31
|
-
/** Maximum gap before alerting UI */
|
|
32
|
-
private readonly GAP_THRESHOLD = 10;
|
|
33
|
-
|
|
34
|
-
/** Maximum messages to store in pending acks before forcing batch */
|
|
35
|
-
private readonly MAX_PENDING_ACKS = 100;
|
|
36
|
-
|
|
37
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
38
|
-
// STATE TRACKING
|
|
39
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Track last seen message ID per channel
|
|
43
|
-
* Map<channelName, lastMessageId>
|
|
44
|
-
*/
|
|
45
|
-
private lastSeen = new Map<string, number>();
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Expected next message ID per channel (for gap detection)
|
|
49
|
-
* Map<channelName, nextExpectedId>
|
|
50
|
-
*/
|
|
51
|
-
private expectedSequence = new Map<string, number>();
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Pending acknowledgments per channel
|
|
55
|
-
* Map<channelName, Set<messageId>>
|
|
56
|
-
*/
|
|
57
|
-
private pendingAcks = new Map<string, Set<number>>();
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Gap count per channel (for threshold alerting)
|
|
61
|
-
* Map<channelName, gapCount>
|
|
62
|
-
*/
|
|
63
|
-
private gapCounts = new Map<string, number>();
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Replay mode tracking (per channel)
|
|
67
|
-
* Used to distinguish replay vs live messages
|
|
68
|
-
*/
|
|
69
|
-
private inReplayMode = new Map<string, boolean>();
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Gap retry count (for retry logic)
|
|
73
|
-
* Map<channel, retryCount>
|
|
74
|
-
*/
|
|
75
|
-
private gapRetryCount = new Map<string, number>();
|
|
76
|
-
|
|
77
|
-
/** Subscription to WebSocket messages */
|
|
78
|
-
private messagesSubscription: Subscription | null = null;
|
|
79
|
-
|
|
80
|
-
/** Subject to signal destroy for takeUntil */
|
|
81
|
-
private destroy$ = new Subject<void>();
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Track channels we want to be subscribed to (survives disconnect/reconnect)
|
|
85
|
-
* This is separate from WebSocketManagerService.subscribedChannels which tracks
|
|
86
|
-
* actual active subscriptions
|
|
87
|
-
*/
|
|
88
|
-
private intendedChannels = new Set<string>();
|
|
89
|
-
|
|
90
|
-
/** Observable to emit processed messages to UI components */
|
|
91
|
-
private messagesSubject = new BehaviorSubject<any>(null);
|
|
92
|
-
public messages$: Observable<any> = this.messagesSubject.asObservable();
|
|
93
|
-
|
|
94
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
95
|
-
// INITIALIZATION
|
|
96
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
97
|
-
|
|
98
|
-
constructor(private wsManager: WebSocketManagerService) {
|
|
99
|
-
// Restore state from sessionStorage (survives page reload)
|
|
100
|
-
this.restoreLastSeen();
|
|
101
|
-
this.restoreIntendedChannels();
|
|
102
|
-
|
|
103
|
-
// Start batch acknowledgment timer
|
|
104
|
-
interval(this.BATCH_ACK_INTERVAL_MS)
|
|
105
|
-
.pipe(takeUntil(this.destroy$))
|
|
106
|
-
.subscribe(() => this.sendAllBatchAcks());
|
|
107
|
-
|
|
108
|
-
// Subscribe to all incoming WebSocket messages
|
|
109
|
-
this.messagesSubscription = this.wsManager.messages$.subscribe(msg => {
|
|
110
|
-
if (msg) {
|
|
111
|
-
this.onMessage(msg);
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
// Listen for reconnect events - re-subscribe with lastSeenId for sync
|
|
116
|
-
this.wsManager.onReconnect$.subscribe(() => {
|
|
117
|
-
console.log('🔄 Reconnection detected, re-subscribing with lastSeenId...');
|
|
118
|
-
this.reSubscribeAllChannels();
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
console.log('✅ MessageTrackerService initialized');
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
ngOnDestroy(): void {
|
|
125
|
-
this.destroy$.next();
|
|
126
|
-
this.destroy$.complete();
|
|
127
|
-
this.persistLastSeen(); // This now also persists intendedChannels
|
|
128
|
-
this.messagesSubscription?.unsubscribe();
|
|
129
|
-
console.log('🛑 MessageTrackerService destroyed');
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
133
|
-
// MESSAGE HANDLING
|
|
134
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Process incoming message
|
|
138
|
-
* Tracks ID, detects gaps, queues acknowledgment
|
|
139
|
-
*/
|
|
140
|
-
private onMessage(msg: any): void {
|
|
141
|
-
const { type, channel, messageId, isReplay } = msg;
|
|
142
|
-
|
|
143
|
-
// Only track messages with IDs (ignore legacy messages without messageId)
|
|
144
|
-
if (messageId === undefined || messageId === null) {
|
|
145
|
-
console.warn('⚠️ Received message without ID (legacy format):', msg);
|
|
146
|
-
// Still forward legacy messages to UI
|
|
147
|
-
this.messagesSubject.next(msg);
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Handle replay mode transitions
|
|
152
|
-
if (isReplay && !this.inReplayMode.get(channel)) {
|
|
153
|
-
console.log(`🔄 Entering replay mode for channel: ${channel}`);
|
|
154
|
-
this.inReplayMode.set(channel, true);
|
|
155
|
-
} else if (!isReplay && this.inReplayMode.get(channel)) {
|
|
156
|
-
console.log(`✅ Exiting replay mode for channel: ${channel}`);
|
|
157
|
-
this.inReplayMode.set(channel, false);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Track message and detect gaps
|
|
161
|
-
this.trackMessage(channel, messageId, isReplay);
|
|
162
|
-
|
|
163
|
-
// Forward message to UI components
|
|
164
|
-
this.messagesSubject.next(msg);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Track message ID and detect gaps
|
|
169
|
-
*/
|
|
170
|
-
private trackMessage(channel: string, messageId: number, isReplay: boolean): void {
|
|
171
|
-
const expected = this.expectedSequence.get(channel) || 1;
|
|
172
|
-
|
|
173
|
-
// Gap detection
|
|
174
|
-
if (messageId !== expected) {
|
|
175
|
-
console.warn(`⚠️ Gap detected in channel "${channel}": expected ${expected}, got ${messageId}`);
|
|
176
|
-
|
|
177
|
-
// Increment gap count
|
|
178
|
-
const currentGapCount = this.gapCounts.get(channel) || 0;
|
|
179
|
-
const newGapCount = currentGapCount + 1;
|
|
180
|
-
this.gapCounts.set(channel, newGapCount);
|
|
181
|
-
|
|
182
|
-
// Check threshold
|
|
183
|
-
if (newGapCount >= this.GAP_THRESHOLD) {
|
|
184
|
-
console.error(`🚨 Gap threshold exceeded for channel "${channel}": ${newGapCount} gaps`);
|
|
185
|
-
this.onGapThresholdExceeded(channel, newGapCount);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Request gap fill
|
|
189
|
-
this.requestGapFill(channel, expected, messageId - 1);
|
|
190
|
-
} else {
|
|
191
|
-
// Reset gap count and retry count on successful sequence
|
|
192
|
-
this.gapCounts.set(channel, 0);
|
|
193
|
-
this.gapRetryCount.set(channel, 0);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// Update tracking
|
|
197
|
-
this.lastSeen.set(channel, messageId);
|
|
198
|
-
this.expectedSequence.set(channel, messageId + 1);
|
|
199
|
-
|
|
200
|
-
// Persist to sessionStorage (debounced in production)
|
|
201
|
-
this.persistLastSeen();
|
|
202
|
-
|
|
203
|
-
// Queue for acknowledgment
|
|
204
|
-
this.queueAck(channel, messageId);
|
|
205
|
-
|
|
206
|
-
// Check if we should force batch ack due to volume
|
|
207
|
-
const pendingCount = this.pendingAcks.get(channel)?.size || 0;
|
|
208
|
-
if (pendingCount >= this.MAX_PENDING_ACKS) {
|
|
209
|
-
console.log(`📦 Forcing batch ack: ${pendingCount} pending messages`);
|
|
210
|
-
this.sendBatchAck(channel);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
215
|
-
// ACKNOWLEDGMENT MANAGEMENT
|
|
216
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Queue message for batch acknowledgment
|
|
220
|
-
*/
|
|
221
|
-
private queueAck(channel: string, messageId: number): void {
|
|
222
|
-
if (!this.pendingAcks.has(channel)) {
|
|
223
|
-
this.pendingAcks.set(channel, new Set());
|
|
224
|
-
}
|
|
225
|
-
this.pendingAcks.get(channel)!.add(messageId);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Send batch acknowledgments for all channels with pending acks
|
|
230
|
-
*/
|
|
231
|
-
private sendAllBatchAcks(): void {
|
|
232
|
-
this.pendingAcks.forEach((messageIds, channel) => {
|
|
233
|
-
if (messageIds.size > 0) {
|
|
234
|
-
this.sendBatchAck(channel);
|
|
235
|
-
}
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Send batch acknowledgment for a specific channel
|
|
241
|
-
*/
|
|
242
|
-
private sendBatchAck(channel: string): void {
|
|
243
|
-
const messageIds = this.pendingAcks.get(channel);
|
|
244
|
-
|
|
245
|
-
if (!messageIds || messageIds.size === 0) {
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// Convert Set to sorted array
|
|
250
|
-
const sortedIds = Array.from(messageIds).sort((a, b) => a - b);
|
|
251
|
-
const ackUpTo = sortedIds[sortedIds.length - 1];
|
|
252
|
-
|
|
253
|
-
console.log(`📦 Batch ack for channel "${channel}": ackUpTo=${ackUpTo} (${messageIds.size} messages)`);
|
|
254
|
-
|
|
255
|
-
this.wsManager.send({
|
|
256
|
-
type: 'messageAckBatch',
|
|
257
|
-
channel,
|
|
258
|
-
ackUpTo,
|
|
259
|
-
// Optional: include skippedIds if you want to report gaps
|
|
260
|
-
// skippedIds: this.getSkippedIds(channel, ackUpTo)
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
// Clear pending acks
|
|
264
|
-
messageIds.clear();
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
268
|
-
// GAP RECOVERY
|
|
269
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Request missing messages from server
|
|
273
|
-
*/
|
|
274
|
-
private requestGapFill(channel: string, fromId: number, toId: number): void {
|
|
275
|
-
const retries = this.gapRetryCount.get(channel) || 0;
|
|
276
|
-
|
|
277
|
-
if (retries >= 3) {
|
|
278
|
-
console.error(`🚨 Gap fill failed after 3 retries for channel "${channel}": ${fromId} to ${toId}`);
|
|
279
|
-
// Could emit to UI for manual intervention
|
|
280
|
-
return;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
console.log(`🔍 Requesting gap fill for channel "${channel}": ${fromId} to ${toId} (attempt ${retries + 1})`);
|
|
284
|
-
|
|
285
|
-
this.wsManager.send({
|
|
286
|
-
type: 'gapRequest',
|
|
287
|
-
channel,
|
|
288
|
-
fromId,
|
|
289
|
-
toId
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
this.gapRetryCount.set(channel, retries + 1);
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Handle gap threshold exceeded (optional: alert UI)
|
|
297
|
-
*/
|
|
298
|
-
private onGapThresholdExceeded(channel: string, gapCount: number): void {
|
|
299
|
-
console.warn(`⚠️ High gap count for channel "${channel}": ${gapCount} missed messages`);
|
|
300
|
-
// Could emit to a separate observable for UI components to subscribe to
|
|
301
|
-
// this.gapAlerts.next({ channel, gapCount });
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
305
|
-
// SUBSCRIPTION MANAGEMENT
|
|
306
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* Subscribe to channel with sync support
|
|
310
|
-
* Automatically includes lastSeenId for replay
|
|
311
|
-
*/
|
|
312
|
-
subscribeToChannel(channel: string, userData?: any): void {
|
|
313
|
-
const lastSeenId = this.lastSeen.get(channel) || 0;
|
|
314
|
-
|
|
315
|
-
console.log(`📥 Subscribing to channel "${channel}" with lastSeenId=${lastSeenId}`);
|
|
316
|
-
console.log(`📝 Adding to intendedChannels (now has ${this.intendedChannels.size + 1} channels)`);
|
|
317
|
-
|
|
318
|
-
// Track this channel as intended (survives disconnect/reconnect)
|
|
319
|
-
this.intendedChannels.add(channel);
|
|
320
|
-
this.persistIntendedChannels();
|
|
321
|
-
|
|
322
|
-
this.wsManager.sendSubscribeWithLastSeen(channel, userData, lastSeenId);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Re-subscribe to all previously subscribed channels after reconnect
|
|
327
|
-
* Includes lastSeenId for each channel to trigger message replay
|
|
328
|
-
*/
|
|
329
|
-
private reSubscribeAllChannels(): void {
|
|
330
|
-
// Use intendedChannels which survives disconnect/reconnect
|
|
331
|
-
const channels = Array.from(this.intendedChannels);
|
|
332
|
-
|
|
333
|
-
console.log(`🔄 Re-subscribing to ${channels.length} channel(s) with lastSeenId...`);
|
|
334
|
-
|
|
335
|
-
channels.forEach((channel: string) => {
|
|
336
|
-
this.subscribeToChannel(channel);
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
console.log(`✅ Re-subscription complete for ${channels.length} channel(s)`);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
343
|
-
// STATE PERSISTENCE
|
|
344
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* Persist lastSeen to sessionStorage (survives page reload)
|
|
348
|
-
*/
|
|
349
|
-
private persistLastSeen(): void {
|
|
350
|
-
try {
|
|
351
|
-
const data = JSON.stringify(Array.from(this.lastSeen.entries()));
|
|
352
|
-
sessionStorage.setItem('messageLastSeen', data);
|
|
353
|
-
|
|
354
|
-
// Also persist intendedChannels
|
|
355
|
-
this.persistIntendedChannels();
|
|
356
|
-
} catch (err: any) {
|
|
357
|
-
console.warn('⚠️ Failed to persist lastSeen:', err.message);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* Restore lastSeen from sessionStorage
|
|
363
|
-
*/
|
|
364
|
-
private restoreLastSeen(): void {
|
|
365
|
-
try {
|
|
366
|
-
const data = sessionStorage.getItem('messageLastSeen');
|
|
367
|
-
if (data) {
|
|
368
|
-
const entries = JSON.parse(data);
|
|
369
|
-
this.lastSeen = new Map(entries);
|
|
370
|
-
|
|
371
|
-
// Rebuild expectedSequence from restored lastSeen
|
|
372
|
-
this.lastSeen.forEach((lastId, channel) => {
|
|
373
|
-
this.expectedSequence.set(channel, lastId + 1);
|
|
374
|
-
});
|
|
375
|
-
|
|
376
|
-
console.log('📥 Restored lastSeen from sessionStorage:', this.lastSeen.size, 'channels');
|
|
377
|
-
}
|
|
378
|
-
} catch (err: any) {
|
|
379
|
-
console.warn('⚠️ Failed to restore lastSeen:', err.message);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
/**
|
|
384
|
-
* Persist intendedChannels to sessionStorage
|
|
385
|
-
*/
|
|
386
|
-
private persistIntendedChannels(): void {
|
|
387
|
-
try {
|
|
388
|
-
const channels = Array.from(this.intendedChannels);
|
|
389
|
-
sessionStorage.setItem('intendedChannels', JSON.stringify(channels));
|
|
390
|
-
} catch (err: any) {
|
|
391
|
-
console.warn('⚠️ Failed to persist intendedChannels:', err.message);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
/**
|
|
396
|
-
* Restore intendedChannels from sessionStorage
|
|
397
|
-
*/
|
|
398
|
-
private restoreIntendedChannels(): void {
|
|
399
|
-
try {
|
|
400
|
-
const data = sessionStorage.getItem('intendedChannels');
|
|
401
|
-
if (data) {
|
|
402
|
-
const channels = JSON.parse(data);
|
|
403
|
-
this.intendedChannels = new Set(channels);
|
|
404
|
-
console.log('📥 Restored intendedChannels from sessionStorage:', this.intendedChannels.size, 'channels');
|
|
405
|
-
}
|
|
406
|
-
} catch (err: any) {
|
|
407
|
-
console.warn('⚠️ Failed to restore intendedChannels:', err.message);
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
412
|
-
// PUBLIC ACCESSORS
|
|
413
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
414
|
-
|
|
415
|
-
/**
|
|
416
|
-
* Get last seen message ID for a channel
|
|
417
|
-
*/
|
|
418
|
-
getLastSeenId(channel: string): number {
|
|
419
|
-
return this.lastSeen.get(channel) || 0;
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
/**
|
|
423
|
-
* Get expected next message ID for a channel
|
|
424
|
-
*/
|
|
425
|
-
getExpectedNextId(channel: string): number {
|
|
426
|
-
return this.expectedSequence.get(channel) || 1;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
/**
|
|
430
|
-
* Check if currently in replay mode for a channel
|
|
431
|
-
*/
|
|
432
|
-
isInReplayMode(channel: string): boolean {
|
|
433
|
-
return this.inReplayMode.get(channel) || false;
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
/**
|
|
437
|
-
* Get gap count for a channel
|
|
438
|
-
*/
|
|
439
|
-
getGapCount(channel: string): number {
|
|
440
|
-
return this.gapCounts.get(channel) || 0;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
444
|
-
// UTILITY METHODS
|
|
445
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
446
|
-
|
|
447
|
-
/**
|
|
448
|
-
* Get skipped IDs between expected and received (for detailed gap reporting)
|
|
449
|
-
*/
|
|
450
|
-
private getSkippedIds(channel: string, upToId: number): number[] {
|
|
451
|
-
const expected = this.expectedSequence.get(channel) || 1;
|
|
452
|
-
const skipped: number[] = [];
|
|
453
|
-
|
|
454
|
-
for (let i = expected; i < upToId; i++) {
|
|
455
|
-
const pending = this.pendingAcks.get(channel);
|
|
456
|
-
if (!pending?.has(i)) {
|
|
457
|
-
skipped.push(i);
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
return skipped;
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
/**
|
|
465
|
-
* Clear all tracking state (useful for debugging or manual reset)
|
|
466
|
-
*/
|
|
467
|
-
clearState(): void {
|
|
468
|
-
this.lastSeen.clear();
|
|
469
|
-
this.expectedSequence.clear();
|
|
470
|
-
this.pendingAcks.clear();
|
|
471
|
-
this.gapCounts.clear();
|
|
472
|
-
this.inReplayMode.clear();
|
|
473
|
-
this.gapRetryCount.clear();
|
|
474
|
-
this.persistLastSeen();
|
|
475
|
-
console.log('🧹 MessageTracker state cleared');
|
|
476
|
-
}
|
|
477
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
export interface ChannelInfoInterface {
|
|
2
|
-
name: string
|
|
3
|
-
canSubscribe: boolean
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export class ChannelInfo implements ChannelInfoInterface {
|
|
7
|
-
|
|
8
|
-
constructor(
|
|
9
|
-
public name = '',
|
|
10
|
-
public canSubscribe = false,
|
|
11
|
-
) {}
|
|
12
|
-
|
|
13
|
-
static adapt(item?: any): ChannelInfo {
|
|
14
|
-
// Handle string input (backward compatibility with old server responses)
|
|
15
|
-
if (typeof item === 'string') {
|
|
16
|
-
return new ChannelInfo(item, true); // Assume subscribable
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Handle object input (new server responses)
|
|
20
|
-
// Default canSubscribe to true if not specified (backward compat)
|
|
21
|
-
return new ChannelInfo(
|
|
22
|
-
item?.name,
|
|
23
|
-
item?.canSubscribe ?? true,
|
|
24
|
-
)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { UserMessage } from "./user-message.model"
|
|
2
|
-
|
|
3
|
-
export interface ChannelMessageInterface {
|
|
4
|
-
channel: string,
|
|
5
|
-
users: UserMessage[],
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export class ChannelMessage implements ChannelMessageInterface {
|
|
9
|
-
|
|
10
|
-
constructor(
|
|
11
|
-
public channel: string,
|
|
12
|
-
public users: UserMessage[] = [],
|
|
13
|
-
) {}
|
|
14
|
-
|
|
15
|
-
static adapt(item?: any): ChannelMessage {
|
|
16
|
-
|
|
17
|
-
return new ChannelMessage(
|
|
18
|
-
item?.channel,
|
|
19
|
-
(item?.users) ? item?.users.map((userItem: any) => UserMessage.adapt(userItem)) : [],
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { WSUser } from "./ws-user.model";
|
|
2
|
-
|
|
3
|
-
export interface ChannelMessageInterface {
|
|
4
|
-
messageId?: number, // NEW: Sequential ID per channel
|
|
5
|
-
channel?: string, // NEW: Channel name
|
|
6
|
-
isReplay?: boolean, // NEW: Replay indicator
|
|
7
|
-
sessionId: any,
|
|
8
|
-
content: any,
|
|
9
|
-
timestamp?: string,
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export class ChannelMessage implements ChannelMessageInterface {
|
|
13
|
-
|
|
14
|
-
constructor(
|
|
15
|
-
public messageId?: number,
|
|
16
|
-
public channel?: string,
|
|
17
|
-
public isReplay?: boolean,
|
|
18
|
-
public sessionId: any = null,
|
|
19
|
-
public content: any = null,
|
|
20
|
-
public timestamp?: string,
|
|
21
|
-
) {}
|
|
22
|
-
|
|
23
|
-
static adapt(item?: any): ChannelMessage {
|
|
24
|
-
|
|
25
|
-
return new ChannelMessage(
|
|
26
|
-
item?.messageId,
|
|
27
|
-
item?.channel,
|
|
28
|
-
item?.isReplay,
|
|
29
|
-
item?.sessionId || item?.id, // Support both for backward compatibility
|
|
30
|
-
item?.content,
|
|
31
|
-
item?.timestamp,
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export * from "./channel-info.model";
|
|
2
|
-
export * from "./ws-user.model";
|
|
3
|
-
|
|
4
|
-
export * from "./communication-type.enum";
|
|
5
|
-
export * from "./channel-type.enum";
|
|
6
|
-
|
|
7
|
-
export * from "./state-message.model";
|
|
8
|
-
export * from "./public-message.model";
|
|
9
|
-
export * from "./notification-message.model";
|
|
10
|
-
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
export interface NotificationMessageInterface {
|
|
2
|
-
sessionId: { id: string; ldap?: string; name?: string; email?: string; color?: string };
|
|
3
|
-
message: string;
|
|
4
|
-
[key: string]: any;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export class NotificationMessage implements NotificationMessageInterface {
|
|
8
|
-
sessionId: { id: string; ldap?: string; name?: string; email?: string; color?: string };
|
|
9
|
-
message: string;
|
|
10
|
-
[key: string]: any;
|
|
11
|
-
|
|
12
|
-
constructor(
|
|
13
|
-
sessionId: { id: string; ldap?: string; name?: string; email?: string; color?: string } = { id: '' },
|
|
14
|
-
message: string = '',
|
|
15
|
-
additionalProperties: any = {}
|
|
16
|
-
) {
|
|
17
|
-
this.sessionId = sessionId;
|
|
18
|
-
this.message = message;
|
|
19
|
-
Object.assign(this, additionalProperties);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
static adapt(item?: any): NotificationMessage {
|
|
23
|
-
return new NotificationMessage(
|
|
24
|
-
item?.sessionId,
|
|
25
|
-
item?.message,
|
|
26
|
-
item
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export interface PublicMessageInterface {
|
|
2
|
-
sessionId: { id: string; ldap?: string; name?: string; email?: string };
|
|
3
|
-
content: { message: string; [key: string]: any };
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export class PublicMessage implements PublicMessageInterface {
|
|
7
|
-
constructor(
|
|
8
|
-
public sessionId: { id: string; ldap?: string; name?: string; email?: string } = { id: '' },
|
|
9
|
-
public content: { message: string; [key: string]: any } = { message: '' }
|
|
10
|
-
) {}
|
|
11
|
-
|
|
12
|
-
static adapt(item?: any): PublicMessage {
|
|
13
|
-
return new PublicMessage(
|
|
14
|
-
item?.sessionId,
|
|
15
|
-
item?.content
|
|
16
|
-
);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export interface StateMessageInterface {
|
|
2
|
-
sessionId: { id: string; ldap?: string; name?: string; email?: string };
|
|
3
|
-
content: any;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export class StateMessage implements StateMessageInterface {
|
|
7
|
-
constructor(
|
|
8
|
-
public sessionId: { id: string; ldap?: string; name?: string; email?: string } = { id: '' },
|
|
9
|
-
public content: any = {}
|
|
10
|
-
) {}
|
|
11
|
-
|
|
12
|
-
static adapt(item?: any): StateMessage {
|
|
13
|
-
return new StateMessage(
|
|
14
|
-
item?.sessionId,
|
|
15
|
-
item?.content
|
|
16
|
-
);
|
|
17
|
-
}
|
|
18
|
-
}
|