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,38 @@
|
|
|
1
|
+
export interface WSUserInterface {
|
|
2
|
+
id: string,
|
|
3
|
+
ldap?: string,
|
|
4
|
+
name?: string,
|
|
5
|
+
email?: string,
|
|
6
|
+
[key: string]: any, // Allow additional properties
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class WSUser implements WSUserInterface {
|
|
10
|
+
|
|
11
|
+
constructor(
|
|
12
|
+
public id: string = '',
|
|
13
|
+
public ldap: string = '',
|
|
14
|
+
public name: string = '',
|
|
15
|
+
public email: string = '',
|
|
16
|
+
) {}
|
|
17
|
+
|
|
18
|
+
static adapt(item?: any): WSUser {
|
|
19
|
+
const user = new WSUser(
|
|
20
|
+
item?.id || item?.sessionId, // Support both for backward compatibility
|
|
21
|
+
item?.ldap,
|
|
22
|
+
item?.name,
|
|
23
|
+
item?.email,
|
|
24
|
+
);
|
|
25
|
+
// Copy any additional properties
|
|
26
|
+
if (item) {
|
|
27
|
+
Object.keys(item).forEach(key => {
|
|
28
|
+
if (!['id', 'sessionId', 'ldap', 'name', 'email'].includes(key)) {
|
|
29
|
+
(user as any)[key] = item[key];
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return user;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { WebSocketManagerService } from '../websocket-service/websocket-manager.service';
|
|
3
|
+
import { ChannelType } from '../models/channel-type.enum';
|
|
4
|
+
import { StateMessage } from '../models/state-message.model';
|
|
5
|
+
import { PublicMessage } from '../models/public-message.model';
|
|
6
|
+
import { NotificationMessage } from '../models/notification-message.model';
|
|
7
|
+
import { LoggerService } from '../../utils/logger.service';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* WebSocketMessageService - Unified service for sending WebSocket messages
|
|
11
|
+
*
|
|
12
|
+
* Provides type-safe methods for sending messages with automatic prefix management.
|
|
13
|
+
* Supports three message types: State (SYS-), Public (PUB-), and Notification (MES-).
|
|
14
|
+
*
|
|
15
|
+
* Features:
|
|
16
|
+
* - Type-safe message models
|
|
17
|
+
* - Automatic prefix management
|
|
18
|
+
* - Runtime validation
|
|
19
|
+
* - Boolean return values for success/failure
|
|
20
|
+
* - Silent failure with console errors
|
|
21
|
+
*/
|
|
22
|
+
@Injectable({ providedIn: 'root' })
|
|
23
|
+
export class WebSocketMessageService {
|
|
24
|
+
private wsManagerService = inject(WebSocketManagerService);
|
|
25
|
+
private logger = new LoggerService();
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Send state message (SYS- prefix)
|
|
29
|
+
* Used for CRUD operations and state synchronization
|
|
30
|
+
*
|
|
31
|
+
* @param path - Path array (e.g., ['ai', 'tests'])
|
|
32
|
+
* @param payload - StateMessage with sessionId and content
|
|
33
|
+
* @returns true if sent successfully, false otherwise
|
|
34
|
+
*/
|
|
35
|
+
sendStateMessage(path: (string | number)[], payload: StateMessage): boolean {
|
|
36
|
+
// Validate payload
|
|
37
|
+
if (!payload?.sessionId?.id) {
|
|
38
|
+
this.logger.error('WebSocketMessageService', 'StateMessage must have sessionId.id');
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!WebSocketManagerService.isConnected()) {
|
|
43
|
+
this.logger.error('WebSocketMessageService', 'Cannot send state message - not connected');
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const channel = `${ChannelType.STATE}-${path.join('/')}`;
|
|
48
|
+
this.wsManagerService.sendMessageInChannel(channel, payload);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Send public message (PUB- prefix)
|
|
54
|
+
* Used for chat, broadcast, general messaging
|
|
55
|
+
*
|
|
56
|
+
* @param channel - Channel name (without prefix)
|
|
57
|
+
* @param payload - PublicMessage with sessionId and content.message
|
|
58
|
+
* @returns true if sent successfully, false otherwise
|
|
59
|
+
*/
|
|
60
|
+
sendPublicMessage(channel: string, payload: PublicMessage): boolean {
|
|
61
|
+
// Validate payload
|
|
62
|
+
if (!payload?.sessionId?.id) {
|
|
63
|
+
this.logger.error('WebSocketMessageService', 'PublicMessage must have sessionId.id');
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (!payload?.content?.message) {
|
|
68
|
+
this.logger.error('WebSocketMessageService', 'PublicMessage must have content.message');
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!WebSocketManagerService.isConnected()) {
|
|
73
|
+
this.logger.error('WebSocketMessageService', 'Cannot send public message - not connected');
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const fullChannel = `${ChannelType.PUBLIC}-${channel}`;
|
|
78
|
+
this.wsManagerService.sendMessageInChannel(fullChannel, payload);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Send notification (MES- prefix)
|
|
84
|
+
* Used for persistent notifications with history
|
|
85
|
+
*
|
|
86
|
+
* @param channel - Channel name (without prefix)
|
|
87
|
+
* @param payload - NotificationMessage with sessionId and message
|
|
88
|
+
* @returns true if sent successfully, false otherwise
|
|
89
|
+
*/
|
|
90
|
+
sendNotification(channel: string, payload: NotificationMessage): boolean {
|
|
91
|
+
// Validate payload
|
|
92
|
+
if (!payload?.sessionId?.id) {
|
|
93
|
+
this.logger.error('WebSocketMessageService', 'NotificationMessage must have sessionId.id');
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (!payload?.message) {
|
|
98
|
+
this.logger.error('WebSocketMessageService', 'NotificationMessage must have message');
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (!WebSocketManagerService.isConnected()) {
|
|
103
|
+
this.logger.error('WebSocketMessageService', 'Cannot send notification - not connected');
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const fullChannel = `${ChannelType.NOTIFICATION}-${channel}`;
|
|
108
|
+
this.wsManagerService.sendMessageInChannel(fullChannel, payload);
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Send to custom channel (no prefix)
|
|
114
|
+
* User provides full channel name
|
|
115
|
+
*
|
|
116
|
+
* @param channel - Full channel name
|
|
117
|
+
* @param payload - Any message payload
|
|
118
|
+
* @returns true if sent successfully, false otherwise
|
|
119
|
+
*/
|
|
120
|
+
sendToCustomChannel(channel: string, payload: any): boolean {
|
|
121
|
+
if (!WebSocketManagerService.isConnected()) {
|
|
122
|
+
this.logger.error('WebSocketMessageService', 'Cannot send custom message - not connected');
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
this.wsManagerService.sendMessageInChannel(channel, payload);
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Observable } from 'rxjs';
|
|
3
|
+
import { WSOptions } from '../../request-manager-state-service';
|
|
4
|
+
import { UUID_STR } from '../../utils/encryption/random';
|
|
5
|
+
import { LoggerService } from '../../utils/logger.service';
|
|
6
|
+
|
|
7
|
+
@Injectable({
|
|
8
|
+
providedIn: 'root',
|
|
9
|
+
})
|
|
10
|
+
export class WebsocketService {
|
|
11
|
+
private logger = new LoggerService();
|
|
12
|
+
|
|
13
|
+
private socket: WebSocket | null = null;
|
|
14
|
+
|
|
15
|
+
private messages = new BehaviorSubject<any>(null);
|
|
16
|
+
public messages$: Observable<any> = this.messages.asObservable();
|
|
17
|
+
|
|
18
|
+
private connectionStatus = new BehaviorSubject<boolean>(false);
|
|
19
|
+
public connectionStatus$: Observable<boolean> = this.connectionStatus.asObservable();
|
|
20
|
+
|
|
21
|
+
private isSubscribed: boolean = false;
|
|
22
|
+
|
|
23
|
+
// Track currently subscribed channels
|
|
24
|
+
private subscribedChannels = new BehaviorSubject<Set<string>>(new Set());
|
|
25
|
+
public subscribedChannels$: Observable<Set<string>> = this.subscribedChannels.asObservable();
|
|
26
|
+
|
|
27
|
+
// Store last options for reconnection
|
|
28
|
+
private lastOptions: WSOptions | null = null;
|
|
29
|
+
|
|
30
|
+
private getSessionId(): string {
|
|
31
|
+
return sessionStorage.getItem('WSID') ?? (() => {
|
|
32
|
+
const uuid = UUID_STR()
|
|
33
|
+
sessionStorage.setItem('WSID', uuid)
|
|
34
|
+
return uuid
|
|
35
|
+
})()
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private sendSubscribe(channelName: string, user: any) {
|
|
39
|
+
|
|
40
|
+
// Check if already subscribed to THIS specific channel (not just any channel)
|
|
41
|
+
const alreadySubscribed = this.subscribedChannels.value.has(channelName);
|
|
42
|
+
|
|
43
|
+
if (this.socket?.readyState === WebSocket.OPEN && !alreadySubscribed) {
|
|
44
|
+
const message = {
|
|
45
|
+
type: 'subscribe',
|
|
46
|
+
subscribedChannel: channelName,
|
|
47
|
+
content: {
|
|
48
|
+
id: this.getSessionId(),
|
|
49
|
+
...user
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
this.socket.send(JSON.stringify(message));
|
|
53
|
+
|
|
54
|
+
// Track this channel as subscribed
|
|
55
|
+
const current = new Set(this.subscribedChannels.value);
|
|
56
|
+
current.add(channelName);
|
|
57
|
+
this.subscribedChannels.next(current);
|
|
58
|
+
|
|
59
|
+
this.isSubscribed = true; // Keep for backward compatibility
|
|
60
|
+
this.logger.debug('WebSocket', `Sent initial subscription to: ${channelName}`);
|
|
61
|
+
} else {
|
|
62
|
+
this.logger.warn('WebSocket', `Subscription prevented`, {
|
|
63
|
+
open: this.socket?.readyState === WebSocket.OPEN,
|
|
64
|
+
channel: channelName,
|
|
65
|
+
alreadySubscribed
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
connect(options: WSOptions, jwtToken: string) {
|
|
71
|
+
|
|
72
|
+
if (this.socket) {
|
|
73
|
+
|
|
74
|
+
if (this.socket.readyState === WebSocket.OPEN) {
|
|
75
|
+
this.logger.debug('WebSocket', 'Connection is already OPEN');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (this.socket.readyState === WebSocket.CONNECTING) {
|
|
80
|
+
this.logger.debug('WebSocket', 'Already CONNECTING. Waiting for handshake');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (this.socket.readyState === WebSocket.CLOSING || this.socket.readyState === WebSocket.CLOSED) {
|
|
85
|
+
this.logger.debug('WebSocket', `Cleaning up stale socket`, { state: this.socket.readyState });
|
|
86
|
+
this.socket.close();
|
|
87
|
+
this.socket = null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
this.isSubscribed = false;
|
|
92
|
+
// Clear tracked subscriptions for new connection
|
|
93
|
+
this.subscribedChannels.next(new Set());
|
|
94
|
+
|
|
95
|
+
const sessionId = this.getSessionId();
|
|
96
|
+
const URL = (jwtToken) ? `${options.wsServer}?token=${jwtToken}&sessionId=${sessionId}` : `${options.wsServer}?sessionId=${sessionId}`;
|
|
97
|
+
|
|
98
|
+
this.socket = new WebSocket(URL);
|
|
99
|
+
|
|
100
|
+
this.socket.onopen = () => {
|
|
101
|
+
this.logger.info('WebSocket', '📡 Connected to WebSocket');
|
|
102
|
+
this.connectionStatus.next(true);
|
|
103
|
+
this.lastOptions = options;
|
|
104
|
+
|
|
105
|
+
// Subscribe to primary channel
|
|
106
|
+
this.sendSubscribe(options.id, options.user);
|
|
107
|
+
|
|
108
|
+
// Build unified set of all channels to subscribe to (with deduplication)
|
|
109
|
+
const allChannels = new Set<string>();
|
|
110
|
+
|
|
111
|
+
// Add channels from options.channels[]
|
|
112
|
+
if (options.channels && options.channels.length > 0) {
|
|
113
|
+
options.channels.forEach(channel => allChannels.add(channel));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Add channels from options.wsUpdateChannels[] with MES- prefix
|
|
117
|
+
if (options.wsUpdateChannels && options.wsUpdateChannels.length > 0) {
|
|
118
|
+
options.wsUpdateChannels.forEach(ch => {
|
|
119
|
+
const prefixed = ch.startsWith('MES-') ? ch : `MES-${ch}`;
|
|
120
|
+
allChannels.add(prefixed);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Subscribe to all channels (excluding primary channel)
|
|
125
|
+
allChannels.forEach(channel => {
|
|
126
|
+
if (channel !== options.id) {
|
|
127
|
+
this.subscribeToChannel(channel);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// Re-subscribe to any previously subscribed channels not in current options
|
|
132
|
+
const previousChannels = this.subscribedChannels.value;
|
|
133
|
+
if (previousChannels.size > 0) {
|
|
134
|
+
previousChannels.forEach(channel => {
|
|
135
|
+
if (!allChannels.has(channel) && channel !== options.id) {
|
|
136
|
+
this.subscribeToChannel(channel);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
this.socket.onmessage = (event) => {
|
|
143
|
+
|
|
144
|
+
try {
|
|
145
|
+
|
|
146
|
+
const data = JSON.parse(event.data);
|
|
147
|
+
|
|
148
|
+
if (data.error && data.error === 'JWT_INVALID') {
|
|
149
|
+
|
|
150
|
+
this.logger.error('WebSocket', 'JWT validation failed. Authentication error!');
|
|
151
|
+
|
|
152
|
+
this.messages.next(data);
|
|
153
|
+
this.connectionStatus.next(false);
|
|
154
|
+
this.socket?.close();
|
|
155
|
+
|
|
156
|
+
return;
|
|
157
|
+
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
this.messages.next(data);
|
|
161
|
+
|
|
162
|
+
} catch (error) {
|
|
163
|
+
this.logger.error('WebSocket', 'Error parsing WebSocket message', { data: event.data });
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
this.socket.onclose = () => {
|
|
169
|
+
|
|
170
|
+
this.logger.debug('WebSocket', 'Connection closed');
|
|
171
|
+
|
|
172
|
+
this.connectionStatus.next(false);
|
|
173
|
+
this.socket = null;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
this.socket.onerror = (error) => {
|
|
177
|
+
this.logger.error('WebSocket', 'WebSocket error', error);
|
|
178
|
+
this.connectionStatus.next(false);
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
disconnect() {
|
|
184
|
+
if (this.socket) {
|
|
185
|
+
this.socket.close();
|
|
186
|
+
this.socket = null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
subscribeToChannel(channelName: string) {
|
|
191
|
+
|
|
192
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
193
|
+
try {
|
|
194
|
+
const message = {
|
|
195
|
+
type: 'subscribe',
|
|
196
|
+
subscribedChannel: channelName,
|
|
197
|
+
content: {}
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
this.socket.send(JSON.stringify(message));
|
|
201
|
+
|
|
202
|
+
// Track locally - create new Set to trigger change detection
|
|
203
|
+
const current = new Set(this.subscribedChannels.value);
|
|
204
|
+
current.add(channelName);
|
|
205
|
+
this.subscribedChannels.next(current);
|
|
206
|
+
this.logger.debug('WebSocket', `📝 Subscribed to channel`, { channel: channelName });
|
|
207
|
+
} catch (error) {
|
|
208
|
+
this.logger.error('WebSocket', `Failed to subscribe to channel`, { channel: channelName, error });
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
} else {
|
|
212
|
+
this.logger.warn('WebSocket', `Cannot subscribe to channel - WebSocket not open`, { channel: channelName });
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
subscribeToChannels(channelNames: string[]) {
|
|
218
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
219
|
+
channelNames.forEach(channel => this.subscribeToChannel(channel));
|
|
220
|
+
} else {
|
|
221
|
+
this.logger.warn('WebSocket', 'Cannot subscribe to channels - WebSocket not open');
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
unsubscribeFromChannel(channel: string) {
|
|
226
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
227
|
+
this.socket.send(JSON.stringify({ type: 'unsubscribe', subscribedChannel: channel }));
|
|
228
|
+
|
|
229
|
+
// Remove from local tracking - create new Set to trigger change detection
|
|
230
|
+
const current = new Set(this.subscribedChannels.value);
|
|
231
|
+
current.delete(channel);
|
|
232
|
+
this.subscribedChannels.next(current);
|
|
233
|
+
this.logger.debug('WebSocket', `💬 Unsubscribed from channel`, { channel });
|
|
234
|
+
} else {
|
|
235
|
+
this.logger.error('WebSocket', 'Cannot unsubscribe - WebSocket not open');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
unsubscribeToChannel(channel: string) {
|
|
240
|
+
// Deprecated: Use unsubscribeFromChannel instead
|
|
241
|
+
this.unsubscribeFromChannel(channel);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
getSubscribedChannels(): Set<string> {
|
|
245
|
+
return this.subscribedChannels.value;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
sendBroadcast(content: any) {
|
|
249
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
250
|
+
this.socket.send(JSON.stringify({ type: 'broadcast', content }));
|
|
251
|
+
this.logger.debug('WebSocket', `📢 Send broadcast`, { content });
|
|
252
|
+
} else {
|
|
253
|
+
this.logger.error('WebSocket', 'Cannot send broadcast - WebSocket not open');
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
sendMessageInChannel(channel: string, content: any) {
|
|
258
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
259
|
+
this.socket.send(JSON.stringify({ type: 'statemanagerMessage', subscribedChannel: channel, content }));
|
|
260
|
+
this.logger.debug('WebSocket', `💬 Send message`, { channel, content });
|
|
261
|
+
} else {
|
|
262
|
+
this.logger.error('WebSocket', 'Cannot send message - WebSocket not open');
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Send a message to a specific channel for channel-based messaging
|
|
268
|
+
* This uses the 'message' type which broadcasts to all subscribers in the channel
|
|
269
|
+
*/
|
|
270
|
+
sendChannelMessage(channel: string, content: any) {
|
|
271
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
272
|
+
this.socket.send(JSON.stringify({ type: 'message', subscribedChannel: channel, content }));
|
|
273
|
+
this.logger.debug('WebSocket', `💬 Send channel message`, { channel, content });
|
|
274
|
+
} else {
|
|
275
|
+
this.logger.error('WebSocket', 'Cannot send channel message - WebSocket not open');
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Send a message to multiple channels at once (batch)
|
|
281
|
+
* Sends the new batch format and falls back to legacy per-channel messages for compatibility
|
|
282
|
+
*/
|
|
283
|
+
sendChannelMessageToChannels(channels: string[], content: any) {
|
|
284
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
285
|
+
try {
|
|
286
|
+
// New batch format
|
|
287
|
+
this.socket.send(JSON.stringify({
|
|
288
|
+
type: 'channelMessage',
|
|
289
|
+
channels: channels,
|
|
290
|
+
data: content
|
|
291
|
+
}));
|
|
292
|
+
this.logger.debug('WebSocket', `💬 Send channel message to channels`, { channels, content });
|
|
293
|
+
} catch (error) {
|
|
294
|
+
this.logger.error('WebSocket', 'Failed to send channelMessage batch', error);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Legacy fallback - send individual messages to each channel
|
|
298
|
+
try {
|
|
299
|
+
channels.forEach(channel => {
|
|
300
|
+
this.socket?.send(JSON.stringify({ type: 'message', subscribedChannel: channel, content }));
|
|
301
|
+
});
|
|
302
|
+
} catch (err) {
|
|
303
|
+
this.logger.warn('WebSocket', 'Legacy fallback failed sending individual messages', err);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
} else {
|
|
307
|
+
this.logger.error('WebSocket', 'Cannot send message to channels - WebSocket not open');
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
sendMessageToUser(user: string, content: any) {
|
|
312
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
313
|
+
this.socket.send(JSON.stringify({ type: 'userMessage', subscribedChannel: user, content }));
|
|
314
|
+
this.logger.debug('WebSocket', `💬 Send message to user`, { user, content });
|
|
315
|
+
} else {
|
|
316
|
+
this.logger.error('WebSocket', 'Cannot send message to user - WebSocket not open');
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
getAllChannels() {
|
|
321
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
322
|
+
this.socket.send(JSON.stringify({ type: 'getChannels' }));
|
|
323
|
+
this.logger.debug('WebSocket', '🗂️ Requested list of all channels');
|
|
324
|
+
} else {
|
|
325
|
+
this.logger.error('WebSocket', 'Cannot request channels - WebSocket not open');
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
createChannel(channel: string) {
|
|
330
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
331
|
+
this.socket.send(JSON.stringify({ type: 'createChannel', content: channel }));
|
|
332
|
+
this.logger.debug('WebSocket', '🗂️ Created channel', { channel });
|
|
333
|
+
} else {
|
|
334
|
+
this.logger.error('WebSocket', 'Cannot create channel - WebSocket not open');
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
deleteChannel(channel: string) {
|
|
339
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
340
|
+
this.socket.send(JSON.stringify({ type: 'deleteChannel', content: channel }));
|
|
341
|
+
this.logger.debug('WebSocket', '🗂️ Delete channel', { channel });
|
|
342
|
+
} else {
|
|
343
|
+
this.logger.error('WebSocket', 'Cannot delete channel - WebSocket not open');
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
getUsersInChannel(channel: string) {
|
|
348
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
349
|
+
this.socket.send(JSON.stringify({ type: 'getUsers', subscribedChannel: channel }));
|
|
350
|
+
this.logger.debug('WebSocket', `👥 Requested users in channel`, { channel });
|
|
351
|
+
} else {
|
|
352
|
+
this.logger.error('WebSocket', 'Cannot request users - WebSocket not open');
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// =====================
|
|
357
|
+
// Notification Channel Methods (MES- prefix)
|
|
358
|
+
// =====================
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Create a notification channel
|
|
362
|
+
*/
|
|
363
|
+
createNotificationChannel(channel: string) {
|
|
364
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
365
|
+
this.socket.send(JSON.stringify({ type: 'createNotificationChannel', content: channel }));
|
|
366
|
+
console.log('📢 Created notification channel:', channel);
|
|
367
|
+
} else {
|
|
368
|
+
console.error('WebSocket is not open. Cannot create notification channel.');
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Get all notification channels (in-memory)
|
|
374
|
+
*/
|
|
375
|
+
getNotificationChannels() {
|
|
376
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
377
|
+
this.socket.send(JSON.stringify({ type: 'getNotificationChannels' }));
|
|
378
|
+
this.logger.debug('WebSocket', '📢 Requested notification channels list');
|
|
379
|
+
} else {
|
|
380
|
+
this.logger.error('WebSocket', 'Cannot request notification channels - WebSocket not open');
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
getTodaysNotificationChannels() {
|
|
385
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
386
|
+
this.socket.send(JSON.stringify({ type: 'getTodaysNotificationChannels' }));
|
|
387
|
+
this.logger.debug('WebSocket', "📢 Requested today's notification channels from DB");
|
|
388
|
+
} else {
|
|
389
|
+
this.logger.error('WebSocket', "Cannot request today's notification channels - WebSocket not open");
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
subscribeToNotificationChannel(channel: string, options?: { startEpoch?: number; endEpoch?: number }, user?: any) {
|
|
394
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
395
|
+
this.socket.send(JSON.stringify({
|
|
396
|
+
type: 'subscribeNotifications',
|
|
397
|
+
subscribedChannel: channel,
|
|
398
|
+
content: {
|
|
399
|
+
...options,
|
|
400
|
+
...user
|
|
401
|
+
}
|
|
402
|
+
}));
|
|
403
|
+
this.logger.debug('WebSocket', `📢 Subscribed to notification channel`, { channel, options });
|
|
404
|
+
} else {
|
|
405
|
+
this.logger.error('WebSocket', 'Cannot subscribe to notification channel - WebSocket not open');
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
unsubscribeFromNotificationChannel(channel: string) {
|
|
410
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
411
|
+
this.socket.send(JSON.stringify({
|
|
412
|
+
type: 'unsubscribeNotifications',
|
|
413
|
+
subscribedChannel: channel
|
|
414
|
+
}));
|
|
415
|
+
this.logger.debug('WebSocket', `📢 Unsubscribed from notification channel`, { channel });
|
|
416
|
+
} else {
|
|
417
|
+
this.logger.error('WebSocket', 'Cannot unsubscribe from notification channel - WebSocket not open');
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
sendNotification(channel: string, content: any) {
|
|
422
|
+
if (this.socket?.readyState === WebSocket.OPEN) {
|
|
423
|
+
this.socket.send(JSON.stringify({
|
|
424
|
+
type: 'notification',
|
|
425
|
+
subscribedChannel: channel,
|
|
426
|
+
content
|
|
427
|
+
}));
|
|
428
|
+
this.logger.debug('WebSocket', `📢 Sent notification to channel`, { channel, content });
|
|
429
|
+
} else {
|
|
430
|
+
this.logger.error('WebSocket', 'Cannot send notification - WebSocket not open');
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './websocket-manager.service';
|