http-request-manager 18.15.32 → 18.15.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/TEST_COVERAGE_SUMMARY.md +458 -0
- package/ng-package.json +8 -0
- package/package.json +5 -13
- package/src/docs/ADVANCED_WEBSOCKET.md +633 -0
- package/src/docs/ARCHITECTURE.md +633 -0
- package/src/docs/BATCH_REQUEST_README.md +467 -0
- package/src/docs/COMPLETE_API_REFERENCE.md +1037 -0
- package/src/docs/DATABASE_README.md +1195 -0
- package/src/docs/ENCRYPTION_README.md +403 -0
- package/src/docs/HTTP_MANAGER_README.md +628 -0
- package/src/docs/HTTP_SINGNALS_MANAGER_README.md +654 -0
- package/src/docs/HTTP_STATE_MANAGER_README.md +1391 -0
- package/src/docs/INTERCEPTOR_README.md +549 -0
- package/src/docs/LOCAL_STORAGE_README.md +1056 -0
- package/src/docs/LOCAL_STORAGE_SIGNALS_README.md +338 -0
- package/src/docs/LOGGER_README.md +310 -0
- package/src/docs/MESSAGE_TRACKER_README.md +518 -0
- package/src/docs/MESSAGE_TRACKER_SIGNALS_README.md +563 -0
- package/src/docs/MODELS_README.md +1264 -0
- package/src/docs/SIGNAL_SERVICES_README.md +238 -0
- package/src/docs/SQL_DIXIE_README.md +574 -0
- package/src/docs/STORE_STATE_MANAGER_README.md +556 -0
- package/src/docs/STORE_STATE_SIGNALS_README.md +600 -0
- package/src/docs/UPLOAD_REQUEST_README.md +324 -0
- package/src/docs/UTILS_README.md +1604 -0
- package/src/docs/WEBSOCKET_MESSAGE_SERVICE.md +799 -0
- package/src/docs/WEBSOCKET_SIGNALS_README.md +641 -0
- package/src/docs/WEBSOCKET_SINGLETON_REFACTORING.md +201 -0
- package/src/docs/WS_MANAGER_README.md +613 -0
- package/src/lib/http-request-manager.module.ts +147 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +116 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +255 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.html +123 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +53 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +208 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +214 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.html +279 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.ts +461 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +622 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +106 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +687 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +418 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +576 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +89 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +119 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +94 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +203 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +144 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +102 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +40 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +230 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +40 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/jwt-token.service.ts +62 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +168 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +49 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
- package/src/lib/http-request-services-demo/store-state-signals-demo/store-state-signals-demo.component.ts +161 -0
- package/src/lib/http-request-services-demo/upload-demo/models/index.ts +1 -0
- package/src/lib/http-request-services-demo/upload-demo/models/upload-state.model.ts +30 -0
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.html +89 -0
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.scss +160 -0
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.spec.ts +101 -0
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.ts +136 -0
- package/src/lib/index.ts +3 -0
- package/src/lib/interceptors/credentials.interceptor.ts +16 -0
- package/src/lib/interceptors/index.ts +6 -0
- package/src/lib/interceptors/models/error-settings.model.ts +22 -0
- package/src/lib/interceptors/models/index.ts +2 -0
- package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
- package/src/lib/interceptors/request-error.interceptor.ts +65 -0
- package/src/lib/interceptors/request-header.interceptor.ts +56 -0
- package/src/lib/message-display/README.md +509 -0
- package/src/lib/message-display/index.ts +4 -0
- package/src/lib/message-display/models/action.model.ts +27 -0
- package/src/lib/message-display/models/communication-message.model.ts +77 -0
- package/src/lib/message-display/models/display-config.model.ts +35 -0
- package/src/lib/message-display/models/display-rule.interface.ts +28 -0
- package/src/lib/message-display/models/display-strategy.interface.ts +8 -0
- package/src/lib/message-display/models/index.ts +6 -0
- package/src/lib/message-display/models/slide.model.ts +24 -0
- package/src/lib/message-display/rules/default-display-rules.ts +35 -0
- package/src/lib/message-display/services/message-display-router.service.ts +63 -0
- package/src/lib/message-display/strategies/snackbar.strategy.ts +46 -0
- package/src/lib/models/batch-options.model.ts +33 -0
- package/src/lib/models/batch-progress.model.ts +19 -0
- package/src/lib/models/batch-request-state.model.ts +40 -0
- package/src/lib/models/batch-result.model.ts +30 -0
- package/src/lib/models/config-http-options.model.ts +45 -0
- package/src/lib/models/config-local-storage-options.model.ts +27 -0
- package/src/lib/models/config-options.model.ts +27 -0
- package/src/lib/models/config-token.model.ts +9 -0
- package/src/lib/models/data-type.enum.ts +5 -0
- package/src/lib/models/database-storage.model.ts +24 -0
- package/src/lib/models/index.ts +16 -0
- package/src/lib/models/retry-options.model.ts +22 -0
- package/src/lib/models/upload-validation-error.model.ts +46 -0
- package/src/lib/services/SQL-DixieJS service/dexie-query-executor.ts +246 -0
- package/src/lib/services/SQL-DixieJS service/dexie-sql.service.ts +31 -0
- package/src/lib/services/SQL-DixieJS service/index.ts +4 -0
- package/src/lib/services/SQL-DixieJS service/models/execution-plan.model.ts +52 -0
- package/src/lib/services/SQL-DixieJS service/models/index.ts +3 -0
- package/src/lib/services/SQL-DixieJS service/models/sql-errors.model.ts +13 -0
- package/src/lib/services/SQL-DixieJS service/models/sql-options.model.ts +3 -0
- package/src/lib/services/SQL-DixieJS service/query-planner.ts +284 -0
- package/src/lib/services/SQL-DixieJS service/schema-validator.ts +217 -0
- package/src/lib/services/SQL-DixieJS service/sql-parser.ts +35 -0
- package/src/lib/services/database-manager-service/database.manager.service.ts +384 -0
- package/src/lib/services/database-manager-service/db.storage.service.ts +240 -0
- package/src/lib/services/database-manager-service/index.ts +4 -0
- package/src/lib/services/database-manager-service/models/index.ts +2 -0
- package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
- package/src/lib/services/index.ts +20 -0
- package/src/lib/services/local-storage-manager-service/index.ts +4 -0
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +567 -0
- package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
- package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +437 -0
- package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
- package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
- package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
- package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
- package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
- package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
- package/src/lib/services/request-manager-services/README.md +282 -0
- package/src/lib/services/request-manager-services/http-manager-signals.service.ts +674 -0
- package/src/lib/services/request-manager-services/http-manager.service.spec.ts +353 -0
- package/src/lib/services/request-manager-services/http-manager.service.ts +727 -0
- package/src/lib/services/request-manager-services/index.ts +8 -0
- package/src/lib/services/request-manager-services/request-signals.service.ts +372 -0
- package/src/lib/services/request-manager-services/request.service.ts +435 -0
- package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
- package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
- package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
- package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
- package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +468 -0
- package/src/lib/services/request-manager-state-service/http-manager-state.store.spec.ts +665 -0
- package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +2395 -0
- package/src/lib/services/request-manager-state-service/index.ts +3 -0
- package/src/lib/services/request-manager-state-service/models/api-request.model.ts +86 -0
- package/src/lib/services/request-manager-state-service/models/index.ts +14 -0
- package/src/lib/services/request-manager-state-service/models/operation-result.model.ts +18 -0
- package/src/lib/services/request-manager-state-service/models/parsing-result.model.ts +21 -0
- package/src/lib/services/request-manager-state-service/models/request-options.model.ts +37 -0
- package/src/lib/services/request-manager-state-service/models/stream-config.model.ts +20 -0
- package/src/lib/services/request-manager-state-service/models/stream-event-metadata.model.ts +23 -0
- package/src/lib/services/request-manager-state-service/models/stream-event.model.ts +23 -0
- package/src/lib/services/request-manager-state-service/models/stream-output.model.ts +23 -0
- package/src/lib/services/request-manager-state-service/models/stream-progress.model.ts +24 -0
- package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
- package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +42 -0
- package/src/lib/services/store-state-manager-service/index.ts +4 -0
- package/src/lib/services/store-state-manager-service/models/index.ts +3 -0
- package/src/lib/services/store-state-manager-service/models/state-operation-result.model.ts +30 -0
- package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
- package/src/lib/services/store-state-manager-service/store-state-manager-signals.service.ts +169 -0
- package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +153 -0
- package/src/lib/services/utils/app.service.spec.ts +25 -0
- package/src/lib/services/utils/app.service.ts +21 -0
- package/src/lib/services/utils/encryption/README.md +79 -0
- package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
- package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
- package/src/lib/services/utils/encryption/index.ts +5 -0
- package/src/lib/services/utils/encryption/random.ts +81 -0
- package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +106 -0
- package/src/lib/services/utils/headers.service.spec.ts +80 -0
- package/src/lib/services/utils/headers.service.ts +18 -0
- package/src/lib/services/utils/index.ts +9 -0
- package/src/lib/services/utils/logger.service.ts +90 -0
- package/src/lib/services/utils/models/index.ts +4 -0
- package/src/lib/services/utils/models/normalized-request-options.model.ts +24 -0
- package/src/lib/services/utils/models/path-tracker-state.model.ts +20 -0
- package/src/lib/services/utils/models/query-params-tracker-options.model.ts +24 -0
- package/src/lib/services/utils/models/query-tracker-state.model.ts +23 -0
- package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
- package/src/lib/services/utils/object-merger.service.ts +78 -0
- package/src/lib/services/utils/path-query.service.spec.ts +117 -0
- package/src/lib/services/utils/path-query.service.ts +69 -0
- package/src/lib/services/utils/query-params-tracker.service.ts +442 -0
- package/src/lib/services/utils/random-color.utils.ts +83 -0
- package/src/lib/services/utils/utils.service.spec.ts +165 -0
- package/src/lib/services/utils/utils.service.ts +192 -0
- package/src/lib/services/ws-manager-service/index.ts +13 -0
- package/src/lib/services/ws-manager-service/message-tracker-signals.service.ts +147 -0
- package/src/lib/services/ws-manager-service/message-tracker.service.ts +477 -0
- package/src/lib/services/ws-manager-service/models/channel-info.model.ts +29 -0
- package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
- package/src/lib/services/ws-manager-service/models/channel-message.model.ts +36 -0
- package/src/lib/services/ws-manager-service/models/channel-type.enum.ts +6 -0
- package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
- package/src/lib/services/ws-manager-service/models/index.ts +10 -0
- package/src/lib/services/ws-manager-service/models/notification-message.model.ts +29 -0
- package/src/lib/services/ws-manager-service/models/public-message.model.ts +18 -0
- package/src/lib/services/ws-manager-service/models/state-message.model.ts +18 -0
- package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
- package/src/lib/services/ws-manager-service/services/index.ts +4 -0
- package/src/lib/services/ws-manager-service/services/websocket-message.service.ts +129 -0
- package/src/lib/services/ws-manager-service/services/websocket.service.ts +434 -0
- package/src/lib/services/ws-manager-service/websocket-service/index.ts +1 -0
- package/src/lib/services/ws-manager-service/websocket-service/websocket-manager.service.ts +716 -0
- package/src/lib/services/ws-manager-service/websocket-services-complete.spec.ts +596 -0
- package/src/lib/services/ws-manager-service/websocket-signals-manager.service.ts +141 -0
- package/src/public-api.ts +19 -0
- package/tsconfig.lib.json +34 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +14 -0
- package/fesm2022/http-request-manager.mjs +0 -13297
- package/fesm2022/http-request-manager.mjs.map +0 -1
- package/http-request-manager-18.15.32.tgz +0 -0
- package/types/http-request-manager.d.ts +0 -3875
|
@@ -0,0 +1,633 @@
|
|
|
1
|
+
# Advanced WebSocket Guide
|
|
2
|
+
|
|
3
|
+
Comprehensive guide to WebSocket features, channel architecture, and real-time communication patterns.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
1. [Singleton Connection Pattern](#singleton-connection-pattern)
|
|
8
|
+
2. [Channel Architecture](#channel-architecture)
|
|
9
|
+
3. [Message Types](#message-types)
|
|
10
|
+
4. [Message History & Replay](#message-history--replay)
|
|
11
|
+
5. [User Presence Tracking](#user-presence-tracking)
|
|
12
|
+
6. [Notifications System](#notifications-system)
|
|
13
|
+
7. [Best Practices](#best-practices)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Singleton Connection Pattern
|
|
18
|
+
|
|
19
|
+
### One Connection Across ALL Instances
|
|
20
|
+
|
|
21
|
+
The `WebSocketManagerService` uses **static properties** to ensure only ONE WebSocket connection exists across the entire application, regardless of how many service instances are created.
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
export class WebSocketManagerService {
|
|
25
|
+
// Static properties = shared across ALL instances
|
|
26
|
+
private static socket: WebSocket | null = null;
|
|
27
|
+
private static isConnecting = false;
|
|
28
|
+
private static connectionInitialized = false;
|
|
29
|
+
|
|
30
|
+
// Shared BehaviorSubjects
|
|
31
|
+
private static connectionStatus = new BehaviorSubject<boolean>(false);
|
|
32
|
+
private static messages = new BehaviorSubject<any>(null);
|
|
33
|
+
private static subscribedChannels = new BehaviorSubject<Set<string>>(new Set());
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Benefits
|
|
38
|
+
|
|
39
|
+
✅ **Resource Efficiency** - No duplicate connections
|
|
40
|
+
✅ **Consistent State** - All instances share connection status
|
|
41
|
+
✅ **Automatic Coordination** - No manual synchronization needed
|
|
42
|
+
✅ **Memory Optimization** - Single connection object
|
|
43
|
+
|
|
44
|
+
### Example
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// Component 1
|
|
48
|
+
@Component({})
|
|
49
|
+
export class ChatComponent {
|
|
50
|
+
ws1 = inject(WebSocketManagerService);
|
|
51
|
+
|
|
52
|
+
ngOnInit() {
|
|
53
|
+
this.ws1.connect({ wsServer: 'ws://localhost:8080' }, 'token');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Component 2 (different component, same connection)
|
|
58
|
+
@Component({})
|
|
59
|
+
export class NotificationComponent {
|
|
60
|
+
ws2 = inject(WebSocketManagerService);
|
|
61
|
+
|
|
62
|
+
ngOnInit() {
|
|
63
|
+
// This will NOT create a new connection
|
|
64
|
+
// It will use the existing connection from ChatComponent
|
|
65
|
+
this.ws2.messages$.subscribe(msg => {
|
|
66
|
+
console.log('Received:', msg);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Channel Architecture
|
|
75
|
+
|
|
76
|
+
### Channel Prefix System
|
|
77
|
+
|
|
78
|
+
The library uses a prefix-based channel architecture to separate different types of communication:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
export enum ChannelType {
|
|
82
|
+
STATE = 'SYS', // Private state synchronization
|
|
83
|
+
MESSAGE = 'PUB', // Public messaging
|
|
84
|
+
NOTIFICATION = 'MES' // Persistent notifications
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function createChannelName(type: ChannelType, name: string): string {
|
|
88
|
+
return `${type}-${name}`;
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Channel Types
|
|
93
|
+
|
|
94
|
+
#### 1. SYS- Channels (State Synchronization)
|
|
95
|
+
|
|
96
|
+
**Private channels** for synchronizing state between specific clients.
|
|
97
|
+
|
|
98
|
+
**Characteristics:**
|
|
99
|
+
- 🔒 **Private** - Only subscribed users receive messages
|
|
100
|
+
- 🔄 **Real-time** - Instant state updates
|
|
101
|
+
- 📦 **Lightweight** - No database persistence
|
|
102
|
+
- 🎯 **Targeted** - Specific user/state sync
|
|
103
|
+
|
|
104
|
+
**Use Cases:**
|
|
105
|
+
- User-specific state updates
|
|
106
|
+
- Private data synchronization
|
|
107
|
+
- Real-time form collaboration
|
|
108
|
+
- Live cursor tracking
|
|
109
|
+
|
|
110
|
+
**Example:**
|
|
111
|
+
```typescript
|
|
112
|
+
// Subscribe to private state channel
|
|
113
|
+
stateService.subscribeToChannel('SYS-user-123');
|
|
114
|
+
|
|
115
|
+
// Send state update
|
|
116
|
+
stateService.sendChannelMessage('SYS-user-123', {
|
|
117
|
+
type: 'STATE_UPDATE',
|
|
118
|
+
data: { field: 'value' }
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
#### 2. PUB- Channels (Public Messaging)
|
|
123
|
+
|
|
124
|
+
**Public channels** for broadcasting messages to all subscribers.
|
|
125
|
+
|
|
126
|
+
**Characteristics:**
|
|
127
|
+
- 📢 **Broadcast** - All subscribers receive messages
|
|
128
|
+
- 💬 **Chat-like** - Group conversations
|
|
129
|
+
- 🌐 **Open** - Anyone can subscribe
|
|
130
|
+
- ⚡ **Fast** - In-memory routing
|
|
131
|
+
|
|
132
|
+
**Use Cases:**
|
|
133
|
+
- Chat rooms
|
|
134
|
+
- Public announcements
|
|
135
|
+
- Team collaboration
|
|
136
|
+
- Live comments
|
|
137
|
+
|
|
138
|
+
**Example:**
|
|
139
|
+
```typescript
|
|
140
|
+
// Join public chat room
|
|
141
|
+
stateService.subscribeToChannel('PUB-general-chat');
|
|
142
|
+
|
|
143
|
+
// Send message to room
|
|
144
|
+
stateService.sendChannelMessage('PUB-general-chat', {
|
|
145
|
+
type: 'CHAT_MESSAGE',
|
|
146
|
+
user: 'John',
|
|
147
|
+
message: 'Hello everyone!'
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
#### 3. MES- Channels (Persistent Notifications)
|
|
152
|
+
|
|
153
|
+
**Database-backed channels** for notifications with persistence.
|
|
154
|
+
|
|
155
|
+
**Characteristics:**
|
|
156
|
+
- 💾 **Persistent** - Stored in SQLite database
|
|
157
|
+
- 📅 **Historical** - Can retrieve past notifications
|
|
158
|
+
- 🔔 **Notifications** - User alerts and updates
|
|
159
|
+
- 📊 **Trackable** - Read/unread status
|
|
160
|
+
|
|
161
|
+
**Use Cases:**
|
|
162
|
+
- System notifications
|
|
163
|
+
- Alert messages
|
|
164
|
+
- Activity feeds
|
|
165
|
+
- Announcements
|
|
166
|
+
|
|
167
|
+
**Example:**
|
|
168
|
+
```typescript
|
|
169
|
+
// Subscribe to notification channel
|
|
170
|
+
stateService.subscribeToNotificationChannel('MES-alerts');
|
|
171
|
+
|
|
172
|
+
// Send notification
|
|
173
|
+
stateService.sendNotification('MES-alerts', {
|
|
174
|
+
title: 'New Order',
|
|
175
|
+
message: 'Order #12345 received',
|
|
176
|
+
priority: 'high'
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Channel Architecture Diagram
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
184
|
+
│ Client Application │
|
|
185
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
186
|
+
│ │
|
|
187
|
+
│ Component calls: │
|
|
188
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
189
|
+
│ │ subscribeToChannel('general') → PUB-general │ │
|
|
190
|
+
│ │ subscribeToNotificationChannel('alerts') → MES-alerts │ │
|
|
191
|
+
│ │ fetchRecords() → SYS-state │ │
|
|
192
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
193
|
+
│ │ │
|
|
194
|
+
│ ▼ │
|
|
195
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
196
|
+
│ │ HTTPManagerStateService │ │
|
|
197
|
+
│ │ - Adds appropriate prefix (PUB-, MES-, SYS-) │ │
|
|
198
|
+
│ │ - Routes to WebSocketManagerService │ │
|
|
199
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
200
|
+
│ │ │
|
|
201
|
+
│ ▼ │
|
|
202
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
203
|
+
│ │ WebSocketManagerService (Singleton) │ │
|
|
204
|
+
│ │ - Single connection across ALL instances │ │
|
|
205
|
+
│ │ - Channel subscription tracking │ │
|
|
206
|
+
│ │ - Message routing │ │
|
|
207
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
208
|
+
│ │ │
|
|
209
|
+
└────────────────────────────┼─────────────────────────────────────┘
|
|
210
|
+
│
|
|
211
|
+
▼
|
|
212
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
213
|
+
│ WebSocket Server │
|
|
214
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
215
|
+
│ │
|
|
216
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
217
|
+
│ │ PUB- Channel │ │ MES- Channel │ │ SYS- Channel │ │
|
|
218
|
+
│ │ │ │ │ │ │ │
|
|
219
|
+
│ │ In-Memory │ │ DB Persisted │ │ State Sync │ │
|
|
220
|
+
│ │ Broadcasting │ │ Notifications│ │ Private │ │
|
|
221
|
+
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
|
|
222
|
+
│ │ │ │ │
|
|
223
|
+
│ ▼ ▼ ▼ │
|
|
224
|
+
│ ┌────────────────────────────────────────────────┐ │
|
|
225
|
+
│ │ Channel Subscribers (Set<WebSocket>) │ │
|
|
226
|
+
│ └────────────────────────────────────────────────┘ │
|
|
227
|
+
│ │
|
|
228
|
+
│ For MES- channels: │
|
|
229
|
+
│ ┌─────────────────────────────────────────────────┐ │
|
|
230
|
+
│ │ 1. Store in SQLite Database │ │
|
|
231
|
+
│ │ 2. Broadcast to current subscribers │ │
|
|
232
|
+
│ │ 3. Retrieve historical data on new subscription│ │
|
|
233
|
+
│ └─────────────────────────────────────────────────┘ │
|
|
234
|
+
│ │
|
|
235
|
+
└───────────────────────────────────────────────────────────────────┘
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Message Types
|
|
241
|
+
|
|
242
|
+
### WebSocket Communication Types
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
export enum CommunicationType {
|
|
246
|
+
SUBSCRIBE = 'subscribe',
|
|
247
|
+
UNSUBSCRIBE = 'unsubscribe',
|
|
248
|
+
MESSAGE = 'message',
|
|
249
|
+
NOTIFICATION = 'notification',
|
|
250
|
+
BROADCAST = 'broadcast',
|
|
251
|
+
USER_LIST = 'user-list',
|
|
252
|
+
CHANNEL_CREATED = 'channel-created',
|
|
253
|
+
CHANNEL_DELETED = 'channel-deleted',
|
|
254
|
+
PRESENCE = 'presence',
|
|
255
|
+
HISTORY = 'history',
|
|
256
|
+
LAST_SEEN = 'last-seen'
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### Message Structure
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
export interface ChannelMessage {
|
|
264
|
+
type: CommunicationType;
|
|
265
|
+
channel: string;
|
|
266
|
+
content: any;
|
|
267
|
+
sessionId: {
|
|
268
|
+
id: string;
|
|
269
|
+
name?: string;
|
|
270
|
+
email?: string;
|
|
271
|
+
};
|
|
272
|
+
timestamp?: number;
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Example Messages
|
|
277
|
+
|
|
278
|
+
#### Subscribe to Channel
|
|
279
|
+
```json
|
|
280
|
+
{
|
|
281
|
+
"type": "subscribe",
|
|
282
|
+
"channel": "PUB-general",
|
|
283
|
+
"sessionId": {
|
|
284
|
+
"id": "uuid-123",
|
|
285
|
+
"name": "John Doe",
|
|
286
|
+
"email": "john@example.com"
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
#### Send Message
|
|
292
|
+
```json
|
|
293
|
+
{
|
|
294
|
+
"type": "message",
|
|
295
|
+
"channel": "PUB-general",
|
|
296
|
+
"content": {
|
|
297
|
+
"text": "Hello everyone!",
|
|
298
|
+
"timestamp": 1234567890
|
|
299
|
+
},
|
|
300
|
+
"sessionId": {
|
|
301
|
+
"id": "uuid-123",
|
|
302
|
+
"name": "John Doe"
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
#### Notification
|
|
308
|
+
```json
|
|
309
|
+
{
|
|
310
|
+
"type": "notification",
|
|
311
|
+
"channel": "MES-alerts",
|
|
312
|
+
"content": {
|
|
313
|
+
"title": "System Update",
|
|
314
|
+
"message": "Server will restart at 2 AM",
|
|
315
|
+
"priority": "high"
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## Message History & Replay
|
|
323
|
+
|
|
324
|
+
### MessageTrackerService
|
|
325
|
+
|
|
326
|
+
Tracks message history and enables replay on reconnection.
|
|
327
|
+
|
|
328
|
+
**Features:**
|
|
329
|
+
- 📜 **History Tracking** - Records all messages
|
|
330
|
+
- 🔄 **Replay Support** - Resend messages on reconnect
|
|
331
|
+
- 🏷️ **Last Seen ID** - Track position in message stream
|
|
332
|
+
- 📊 **Statistics** - Message counts and metrics
|
|
333
|
+
|
|
334
|
+
### Automatic Re-subscription
|
|
335
|
+
|
|
336
|
+
When a WebSocket reconnects, the MessageTrackerService automatically:
|
|
337
|
+
|
|
338
|
+
1. Retrieves last-seen message ID
|
|
339
|
+
2. Requests historical messages from server
|
|
340
|
+
3. Replays missed messages
|
|
341
|
+
4. Updates subscription state
|
|
342
|
+
|
|
343
|
+
**Example:**
|
|
344
|
+
```typescript
|
|
345
|
+
export class MessageTrackerService {
|
|
346
|
+
private messageHistory = new Map<string, any[]>();
|
|
347
|
+
private lastSeenId = new BehaviorSubject<string>('');
|
|
348
|
+
|
|
349
|
+
// Subscribe with automatic replay
|
|
350
|
+
subscribeToChannel(channel: string, userData?: any) {
|
|
351
|
+
// Track subscription
|
|
352
|
+
this.trackedChannels.add(channel);
|
|
353
|
+
|
|
354
|
+
// Send subscribe message
|
|
355
|
+
this.wsManager.subscribeToChannel(channel, userData);
|
|
356
|
+
|
|
357
|
+
// Replay historical messages
|
|
358
|
+
this.replayHistory(channel);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Replay missed messages
|
|
362
|
+
private replayHistory(channel: string) {
|
|
363
|
+
const lastId = this.lastSeenId.getValue();
|
|
364
|
+
if (lastId) {
|
|
365
|
+
this.requestHistory(channel, lastId);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### Usage
|
|
372
|
+
|
|
373
|
+
```typescript
|
|
374
|
+
@Component({})
|
|
375
|
+
export class ChatComponent {
|
|
376
|
+
private messageTracker = inject(MessageTrackerService);
|
|
377
|
+
|
|
378
|
+
ngOnInit() {
|
|
379
|
+
// Messages flow through MessageTrackerService
|
|
380
|
+
this.messageTracker.messages$.subscribe(message => {
|
|
381
|
+
console.log('Received:', message);
|
|
382
|
+
|
|
383
|
+
// Update last seen
|
|
384
|
+
if (message.id) {
|
|
385
|
+
this.messageTracker.updateLastSeen(message.id);
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## User Presence Tracking
|
|
395
|
+
|
|
396
|
+
### Real-time User Lists
|
|
397
|
+
|
|
398
|
+
Track which users are subscribed to each channel.
|
|
399
|
+
|
|
400
|
+
**Features:**
|
|
401
|
+
- 👥 **User Lists** - See all users in channel
|
|
402
|
+
- 🟢 **Online Status** - Real-time presence
|
|
403
|
+
- 📊 **Channel Stats** - User count per channel
|
|
404
|
+
- 🔄 **Auto-update** - Changes broadcast automatically
|
|
405
|
+
|
|
406
|
+
### Example
|
|
407
|
+
|
|
408
|
+
```typescript
|
|
409
|
+
@Component({
|
|
410
|
+
selector: 'app-channel-users',
|
|
411
|
+
template: `
|
|
412
|
+
<div class="user-list">
|
|
413
|
+
<h3>Users in {{ channelName }} ({{ userCount }})</h3>
|
|
414
|
+
<div *ngFor="let user of users$ | async" class="user">
|
|
415
|
+
<span class="status" [class.online]="user.online"></span>
|
|
416
|
+
{{ user.name }}
|
|
417
|
+
</div>
|
|
418
|
+
</div>
|
|
419
|
+
`
|
|
420
|
+
})
|
|
421
|
+
export class ChannelUsersComponent {
|
|
422
|
+
@Input() channelName = 'PUB-general';
|
|
423
|
+
|
|
424
|
+
private stateService = inject(HTTPManagerStateService);
|
|
425
|
+
|
|
426
|
+
users$ = this.stateService.userListByChannel$.pipe(
|
|
427
|
+
map(users => users.get(this.channelName) || [])
|
|
428
|
+
);
|
|
429
|
+
|
|
430
|
+
userCount$ = this.users$.pipe(map(users => users.length));
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### Presence Messages
|
|
435
|
+
|
|
436
|
+
```json
|
|
437
|
+
{
|
|
438
|
+
"type": "presence",
|
|
439
|
+
"channel": "PUB-general",
|
|
440
|
+
"content": {
|
|
441
|
+
"action": "joined",
|
|
442
|
+
"user": {
|
|
443
|
+
"id": "user-123",
|
|
444
|
+
"name": "John Doe",
|
|
445
|
+
"email": "john@example.com"
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
## Notifications System
|
|
454
|
+
|
|
455
|
+
### Persistent Notifications
|
|
456
|
+
|
|
457
|
+
MES- channels store notifications in the database for persistence.
|
|
458
|
+
|
|
459
|
+
**Server Requirements:**
|
|
460
|
+
|
|
461
|
+
Backend must provide endpoints for:
|
|
462
|
+
- GET today's notification channels
|
|
463
|
+
- GET previous day's notification channels
|
|
464
|
+
- GET notifications by channel with date filters
|
|
465
|
+
|
|
466
|
+
**Database Schema:**
|
|
467
|
+
```sql
|
|
468
|
+
CREATE TABLE notifications (
|
|
469
|
+
id INTEGER PRIMARY KEY,
|
|
470
|
+
channel TEXT NOT NULL,
|
|
471
|
+
user_name TEXT,
|
|
472
|
+
created INTEGER NOT NULL,
|
|
473
|
+
message TEXT NOT NULL
|
|
474
|
+
);
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
### Subscribe to Notifications
|
|
478
|
+
|
|
479
|
+
```typescript
|
|
480
|
+
@Component({})
|
|
481
|
+
export class NotificationBellComponent {
|
|
482
|
+
private stateService = inject(HTTPManagerStateService);
|
|
483
|
+
|
|
484
|
+
notifications$ = this.stateService.notificationMessages$;
|
|
485
|
+
|
|
486
|
+
ngOnInit() {
|
|
487
|
+
// Subscribe to notification channel
|
|
488
|
+
this.stateService.subscribeToNotificationChannel('MES-alerts');
|
|
489
|
+
|
|
490
|
+
// Receive notifications
|
|
491
|
+
this.notifications$.subscribe(notification => {
|
|
492
|
+
this.showNotification(notification);
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
private showNotification(notification: any) {
|
|
497
|
+
// Display notification in UI
|
|
498
|
+
console.log('New notification:', notification);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
### Send Notification
|
|
504
|
+
|
|
505
|
+
```typescript
|
|
506
|
+
// Send to specific user
|
|
507
|
+
stateService.sendNotification('MES-alerts', {
|
|
508
|
+
title: 'New Message',
|
|
509
|
+
body: 'You have a new message from John',
|
|
510
|
+
action: '/messages/123',
|
|
511
|
+
priority: 'high'
|
|
512
|
+
});
|
|
513
|
+
|
|
514
|
+
// Broadcast to all
|
|
515
|
+
stateService.sendBroadcast({
|
|
516
|
+
type: 'announcement',
|
|
517
|
+
message: 'System maintenance at 2 AM'
|
|
518
|
+
});
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
---
|
|
522
|
+
|
|
523
|
+
## Best Practices
|
|
524
|
+
|
|
525
|
+
### 1. Channel Naming Convention
|
|
526
|
+
|
|
527
|
+
```typescript
|
|
528
|
+
// ✅ Good - Use prefixes and descriptive names
|
|
529
|
+
const userChannel = createChannelName(ChannelType.STATE, `user-${userId}`);
|
|
530
|
+
const chatChannel = createChannelName(ChannelType.MESSAGE, 'general-chat');
|
|
531
|
+
const alertChannel = createChannelName(ChannelType.NOTIFICATION, 'system-alerts');
|
|
532
|
+
|
|
533
|
+
// ❌ Avoid - No prefixes or unclear names
|
|
534
|
+
const channel1 = 'channel1';
|
|
535
|
+
const myChannel = 'my-channel';
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### 2. Connection Management
|
|
539
|
+
|
|
540
|
+
```typescript
|
|
541
|
+
// ✅ Good - Connect once in app initialization
|
|
542
|
+
@Injectable({ providedIn: 'root' })
|
|
543
|
+
export class WebSocketInitService {
|
|
544
|
+
private wsManager = inject(WebSocketManagerService);
|
|
545
|
+
|
|
546
|
+
constructor() {
|
|
547
|
+
// Single connection for entire app
|
|
548
|
+
this.wsManager.connect(options, jwtToken);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
// ❌ Avoid - Multiple connect calls
|
|
553
|
+
@Component({})
|
|
554
|
+
export class ComponentA {
|
|
555
|
+
ws = inject(WebSocketManagerService);
|
|
556
|
+
ngOnInit() { this.ws.connect(...); } // Creates connection
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
@Component({})
|
|
560
|
+
export class ComponentB {
|
|
561
|
+
ws = inject(WebSocketManagerService);
|
|
562
|
+
ngOnInit() { this.ws.connect(...); } // Unnecessary - already connected
|
|
563
|
+
}
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
### 3. Message Handling
|
|
567
|
+
|
|
568
|
+
```typescript
|
|
569
|
+
// ✅ Good - Type-safe message handling
|
|
570
|
+
messages$.subscribe((message: ChannelMessage) => {
|
|
571
|
+
switch (message.type) {
|
|
572
|
+
case CommunicationType.MESSAGE:
|
|
573
|
+
this.handleChatMessage(message.content);
|
|
574
|
+
break;
|
|
575
|
+
case CommunicationType.NOTIFICATION:
|
|
576
|
+
this.handleNotification(message.content);
|
|
577
|
+
break;
|
|
578
|
+
case CommunicationType.PRESENCE:
|
|
579
|
+
this.handlePresenceChange(message.content);
|
|
580
|
+
break;
|
|
581
|
+
}
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
// ❌ Avoid - Untyped messages
|
|
585
|
+
messages$.subscribe(message => {
|
|
586
|
+
console.log(message); // No type safety
|
|
587
|
+
});
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
### 4. Error Handling
|
|
591
|
+
|
|
592
|
+
```typescript
|
|
593
|
+
// ✅ Good - Handle connection errors
|
|
594
|
+
connectionStatus$.subscribe(isConnected => {
|
|
595
|
+
if (!isConnected) {
|
|
596
|
+
// Show reconnection UI
|
|
597
|
+
this.showReconnectingMessage();
|
|
598
|
+
|
|
599
|
+
// Attempt manual reconnect if needed
|
|
600
|
+
setTimeout(() => {
|
|
601
|
+
this.wsManager.connect(options, jwtToken);
|
|
602
|
+
}, 5000);
|
|
603
|
+
}
|
|
604
|
+
});
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
### 5. Cleanup
|
|
608
|
+
|
|
609
|
+
```typescript
|
|
610
|
+
// ✅ Good - Unsubscribe on destroy
|
|
611
|
+
@Component({})
|
|
612
|
+
export class ChatComponent implements OnDestroy {
|
|
613
|
+
private subscription?: Subscription;
|
|
614
|
+
|
|
615
|
+
ngOnInit() {
|
|
616
|
+
this.subscription = this.messages$.subscribe(...);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
ngOnDestroy() {
|
|
620
|
+
this.subscription?.unsubscribe();
|
|
621
|
+
this.wsManager.unsubscribeFromChannel('PUB-general');
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
---
|
|
627
|
+
|
|
628
|
+
## Related Documentation
|
|
629
|
+
|
|
630
|
+
- [`WebSocket Manager`](WS_MANAGER_README.md) - Basic WebSocket usage
|
|
631
|
+
- [`HTTP State Manager`](HTTP_STATE_MANAGER_README.md) - State sync with WebSocket
|
|
632
|
+
- [`Complete API Reference`](COMPLETE_API_REFERENCE.md) - Full API documentation
|
|
633
|
+
- [`Architecture`](ARCHITECTURE.md) - System architecture overview
|