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,1264 @@
|
|
|
1
|
+
# Models Reference Guide
|
|
2
|
+
|
|
3
|
+
Comprehensive reference for all data models used in the HTTP Request Manager library.
|
|
4
|
+
|
|
5
|
+
## Model Pattern
|
|
6
|
+
|
|
7
|
+
All models follow a consistent pattern with an interface and implementation class:
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
export interface ModelNameInterface {
|
|
11
|
+
property1: string;
|
|
12
|
+
property2?: number;
|
|
13
|
+
property3: SomeType;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class ModelNameModel implements ModelNameInterface {
|
|
17
|
+
constructor(
|
|
18
|
+
public property1: string = '',
|
|
19
|
+
public property2?: number,
|
|
20
|
+
public property3: SomeType
|
|
21
|
+
) {}
|
|
22
|
+
|
|
23
|
+
static adapt(item?: any): ModelNameModel {
|
|
24
|
+
return new ModelNameModel(
|
|
25
|
+
item?.property1,
|
|
26
|
+
item?.property2,
|
|
27
|
+
item?.property3 ? SomeType.adapt(item.property3) : SomeType.adapt()
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Key Features:**
|
|
34
|
+
- ✅ Interface + Class pattern
|
|
35
|
+
- ✅ Public constructor parameters
|
|
36
|
+
- ✅ Default values for required fields
|
|
37
|
+
- ✅ Static `adapt()` method for transformation
|
|
38
|
+
- ✅ Type safety with TypeScript
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## HTTP Request Models
|
|
43
|
+
|
|
44
|
+
### ApiRequest
|
|
45
|
+
|
|
46
|
+
Configuration for HTTP requests.
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
export interface ApiRequestInterface {
|
|
50
|
+
server: string;
|
|
51
|
+
path?: any[];
|
|
52
|
+
headers?: any;
|
|
53
|
+
adapter?: any;
|
|
54
|
+
mapper?: any;
|
|
55
|
+
polling?: number;
|
|
56
|
+
retry?: RetryOptions;
|
|
57
|
+
stream?: boolean;
|
|
58
|
+
streamType?: StreamType;
|
|
59
|
+
displayError?: boolean;
|
|
60
|
+
displaySuccess?: boolean;
|
|
61
|
+
successMessage?: string;
|
|
62
|
+
errorMessage?: string;
|
|
63
|
+
saveAs?: string;
|
|
64
|
+
fileContentHeader?: string;
|
|
65
|
+
ws?: WSOptions;
|
|
66
|
+
env?: string;
|
|
67
|
+
uploadFiles?: File | File[];
|
|
68
|
+
uploadFieldName?: string;
|
|
69
|
+
uploadHttpMethod?: 'POST' | 'PUT';
|
|
70
|
+
allowedTypes?: string[];
|
|
71
|
+
maxFileSize?: number;
|
|
72
|
+
maxTotalSize?: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export class ApiRequest implements ApiRequestInterface {
|
|
76
|
+
constructor(
|
|
77
|
+
public server = '',
|
|
78
|
+
public path?: any[],
|
|
79
|
+
public headers?: any,
|
|
80
|
+
public adapter?: any,
|
|
81
|
+
public mapper?: any,
|
|
82
|
+
public polling?: number,
|
|
83
|
+
public retry?: RetryOptions,
|
|
84
|
+
public stream?: boolean,
|
|
85
|
+
public streamType?: StreamType,
|
|
86
|
+
public displayError?: boolean,
|
|
87
|
+
public displaySuccess?: boolean,
|
|
88
|
+
public successMessage?: string,
|
|
89
|
+
public errorMessage?: string,
|
|
90
|
+
public saveAs?: string,
|
|
91
|
+
public fileContentHeader?: string,
|
|
92
|
+
public ws?: WSOptions,
|
|
93
|
+
public env?: string,
|
|
94
|
+
public uploadFiles?: File | File[],
|
|
95
|
+
public uploadFieldName?: string,
|
|
96
|
+
public uploadHttpMethod?: 'POST' | 'PUT',
|
|
97
|
+
public allowedTypes?: string[],
|
|
98
|
+
public maxFileSize?: number,
|
|
99
|
+
public maxTotalSize?: number,
|
|
100
|
+
) {}
|
|
101
|
+
|
|
102
|
+
static adapt(item?: any): ApiRequest {
|
|
103
|
+
const server = Array.isArray(item?.server) ? item.server.join('/') : item?.server || '';
|
|
104
|
+
return new ApiRequest(
|
|
105
|
+
server,
|
|
106
|
+
item?.path ? item.path : [],
|
|
107
|
+
item?.headers ? item.headers : {},
|
|
108
|
+
item?.adapter,
|
|
109
|
+
item?.mapper,
|
|
110
|
+
item?.polling ? Math.floor(item.polling) : 0,
|
|
111
|
+
item?.retry ? RetryOptions.adapt(item.retry) : RetryOptions.adapt(),
|
|
112
|
+
item?.stream ? item.stream : false,
|
|
113
|
+
item?.streamType || StreamType.AI_STREAMING,
|
|
114
|
+
item?.displayError ? item.displayError : false,
|
|
115
|
+
item?.displaySuccess ? item.displaySuccess : false,
|
|
116
|
+
item?.successMessage,
|
|
117
|
+
item?.errorMessage,
|
|
118
|
+
item?.saveAs,
|
|
119
|
+
item?.fileContentHeader,
|
|
120
|
+
item?.ws,
|
|
121
|
+
item?.env || 'dev',
|
|
122
|
+
item?.uploadFiles,
|
|
123
|
+
item?.uploadFieldName,
|
|
124
|
+
item?.uploadHttpMethod,
|
|
125
|
+
Array.isArray(item?.allowedTypes) ? item.allowedTypes : [],
|
|
126
|
+
item?.maxFileSize,
|
|
127
|
+
item?.maxTotalSize,
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Properties:**
|
|
134
|
+
|
|
135
|
+
| Property | Type | Default | Description |
|
|
136
|
+
|----------|------|---------|-------------|
|
|
137
|
+
| `server` | `string` | `''` | Base URL or server key for the request |
|
|
138
|
+
| `path` | `any[]` | `[]` | Path segments to append to URL |
|
|
139
|
+
| `headers` | `any` | `{}` | Custom headers for the request |
|
|
140
|
+
| `adapter` | `Function` | `undefined` | Transform incoming response data |
|
|
141
|
+
| `mapper` | `Function` | `undefined` | Transform outgoing request payload |
|
|
142
|
+
| `polling` | `number` | `0` | Polling interval in seconds (0 = disabled) |
|
|
143
|
+
| `retry` | `RetryOptions` | `{ times: 0, delay: 3 }` | Retry configuration |
|
|
144
|
+
| `stream` | `boolean` | `false` | Enable streaming response handling |
|
|
145
|
+
| `streamType` | `StreamType` | `AI_STREAMING` | Streaming format: `NDJSON`, `SSE`, or `AI_STREAMING` |
|
|
146
|
+
| `displayError` | `boolean` | `false` | Show error toast notification |
|
|
147
|
+
| `displaySuccess` | `boolean` | `false` | Show success toast notification |
|
|
148
|
+
| `successMessage` | `string` | `undefined` | Custom success toast message |
|
|
149
|
+
| `errorMessage` | `string` | `undefined` | Custom error toast message |
|
|
150
|
+
| `saveAs` | `string` | `undefined` | Filename for file downloads |
|
|
151
|
+
| `fileContentHeader` | `string` | `undefined` | Content-Disposition header value for downloads |
|
|
152
|
+
| `ws` | `WSOptions` | `undefined` | WebSocket configuration for real-time sync |
|
|
153
|
+
| `env` | `string` | `'dev'` | Environment for WebSocket channel naming |
|
|
154
|
+
| `uploadFiles` | `File \| File[]` | `undefined` | Files to upload (set internally by `uploadRequest`) |
|
|
155
|
+
| `uploadFieldName` | `string` | `undefined` | Form-data field name for uploaded files |
|
|
156
|
+
| `uploadHttpMethod` | `'POST' \| 'PUT'` | `undefined` | HTTP method for upload requests |
|
|
157
|
+
| `allowedTypes` | `string[]` | `[]` | Allowed MIME types for upload validation |
|
|
158
|
+
| `maxFileSize` | `number` | `undefined` | Maximum per-file size in bytes |
|
|
159
|
+
| `maxTotalSize` | `number` | `undefined` | Maximum total upload size in bytes |
|
|
160
|
+
|
|
161
|
+
**Usage:**
|
|
162
|
+
```typescript
|
|
163
|
+
const request = ApiRequest.adapt({
|
|
164
|
+
server: 'https://api.example.com',
|
|
165
|
+
path: ['users', 123],
|
|
166
|
+
headers: { 'Authorization': 'Bearer token' },
|
|
167
|
+
adapter: User.adapt,
|
|
168
|
+
retry: { times: 3, delay: 2 }
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### RequestOptions
|
|
173
|
+
|
|
174
|
+
Extended request configuration for state manager methods (`fetchRecords`, `fetchStream`, etc.).
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
export interface RequestOptionsInterface {
|
|
178
|
+
path: any[];
|
|
179
|
+
headers: any;
|
|
180
|
+
forceRefresh?: boolean;
|
|
181
|
+
ignoreQueryParams?: string[];
|
|
182
|
+
queryParamsExpiresIn?: string | number;
|
|
183
|
+
watchParams?: string[];
|
|
184
|
+
watchExpiresAt?: number;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export class RequestOptions implements RequestOptionsInterface {
|
|
188
|
+
constructor(
|
|
189
|
+
public path: any[] = [],
|
|
190
|
+
public headers = {},
|
|
191
|
+
public forceRefresh?: boolean,
|
|
192
|
+
public ignoreQueryParams?: string[],
|
|
193
|
+
public queryParamsExpiresIn?: string | number,
|
|
194
|
+
public watchParams?: string[],
|
|
195
|
+
public watchExpiresAt?: number,
|
|
196
|
+
) {}
|
|
197
|
+
|
|
198
|
+
static adapt(item?: any): RequestOptions {
|
|
199
|
+
return new RequestOptions(
|
|
200
|
+
item?.path,
|
|
201
|
+
item?.headers,
|
|
202
|
+
item?.forceRefresh,
|
|
203
|
+
Array.isArray(item?.ignoreQueryParams) ? item.ignoreQueryParams : [],
|
|
204
|
+
item?.queryParamsExpiresIn,
|
|
205
|
+
item?.watchParams,
|
|
206
|
+
item?.watchExpiresAt,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Properties:**
|
|
213
|
+
|
|
214
|
+
| Property | Type | Default | Description |
|
|
215
|
+
|----------|------|---------|-------------|
|
|
216
|
+
| `path` | `any[]` | `[]` | URL path segments |
|
|
217
|
+
| `headers` | `any` | `{}` | Custom HTTP headers |
|
|
218
|
+
| `forceRefresh` | `boolean` | `undefined` | Bypass query tracking and always make the API request |
|
|
219
|
+
| `ignoreQueryParams` | `string[]` | `[]` | Query parameter keys to exclude from request-change tracking |
|
|
220
|
+
| `queryParamsExpiresIn` | `string \| number` | `undefined` | Expiry duration for tracked query values (e.g., `'10s'`, `'5mn'`, `'1h'`) |
|
|
221
|
+
| `watchParams` | `string[]` | `undefined` | Specific query keys to watch for change detection (variation mode) |
|
|
222
|
+
| `watchExpiresAt` | `number` | `undefined` | Epoch timestamp when tracked values expire |
|
|
223
|
+
|
|
224
|
+
**Usage:**
|
|
225
|
+
```typescript
|
|
226
|
+
service.fetchRecords(RequestOptions.adapt({
|
|
227
|
+
path: ['users'],
|
|
228
|
+
ignoreQueryParams: ['page', 'size'],
|
|
229
|
+
queryParamsExpiresIn: '10s',
|
|
230
|
+
forceRefresh: false
|
|
231
|
+
}));
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Scope and behavior:**
|
|
235
|
+
- Database enabled (`DatabaseStorage` configured): tracker is active and can prevent repeated identical API calls until expiry resets tracked values.
|
|
236
|
+
- Database disabled: tracker is not enabled; requests go straight to API.
|
|
237
|
+
- `forceRefresh: true` bypasses tracking and always makes the API request.
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Configuration Models
|
|
242
|
+
|
|
243
|
+
### ConfigOptions
|
|
244
|
+
|
|
245
|
+
Global library configuration passed via `forRoot()`.
|
|
246
|
+
|
|
247
|
+
```typescript
|
|
248
|
+
export interface ConfigOptions {
|
|
249
|
+
httpRequestOptions?: ConfigHTTPOptions;
|
|
250
|
+
LocalStorageOptions?: ConfigLocalStorageOptions;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export class ConfigOptions implements ConfigOptions {
|
|
254
|
+
constructor(
|
|
255
|
+
public httpRequestOptions?: ConfigHTTPOptions,
|
|
256
|
+
public LocalStorageOptions?: ConfigLocalStorageOptions
|
|
257
|
+
) {}
|
|
258
|
+
|
|
259
|
+
static adapt(item?: any): ConfigOptions {
|
|
260
|
+
return new ConfigOptions(
|
|
261
|
+
item?.httpRequestOptions ? ConfigHTTPOptions.adapt(item.httpRequestOptions) : undefined,
|
|
262
|
+
item?.LocalStorageOptions ? ConfigLocalStorageOptions.adapt(item.LocalStorageOptions) : undefined
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### ConfigHTTPOptions
|
|
269
|
+
|
|
270
|
+
HTTP service configuration.
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
export interface ConfigHTTPOptions {
|
|
274
|
+
server: string;
|
|
275
|
+
path?: any[];
|
|
276
|
+
headers?: any;
|
|
277
|
+
polling?: number;
|
|
278
|
+
retry?: RetryOptions;
|
|
279
|
+
stream?: boolean;
|
|
280
|
+
displayError?: boolean;
|
|
281
|
+
displaySuccess?: boolean;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export class ConfigHTTPOptions {
|
|
285
|
+
constructor(
|
|
286
|
+
public server: string = '',
|
|
287
|
+
public path?: any[],
|
|
288
|
+
public headers?: any,
|
|
289
|
+
public polling?: number,
|
|
290
|
+
public retry?: RetryOptions,
|
|
291
|
+
public stream?: boolean,
|
|
292
|
+
public displayError?: boolean,
|
|
293
|
+
public displaySuccess?: boolean,
|
|
294
|
+
) {}
|
|
295
|
+
|
|
296
|
+
static adapt(item?: any): ConfigHTTPOptions {
|
|
297
|
+
return new ConfigHTTPOptions(
|
|
298
|
+
item?.server,
|
|
299
|
+
Array.isArray(item?.path) ? item.path : [],
|
|
300
|
+
item?.headers,
|
|
301
|
+
item?.polling,
|
|
302
|
+
item?.retry ? RetryOptions.adapt(item.retry) : undefined,
|
|
303
|
+
item?.stream,
|
|
304
|
+
item?.displayError,
|
|
305
|
+
item?.displaySuccess,
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**Usage:**
|
|
312
|
+
```typescript
|
|
313
|
+
HttpRequestManagerModule.forRoot({
|
|
314
|
+
httpRequestOptions: {
|
|
315
|
+
server: 'https://api.example.com',
|
|
316
|
+
retry: { times: 3, delay: 2 },
|
|
317
|
+
displayError: true
|
|
318
|
+
}
|
|
319
|
+
})
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### ConfigLocalStorageOptions
|
|
323
|
+
|
|
324
|
+
LocalStorage configuration.
|
|
325
|
+
|
|
326
|
+
```typescript
|
|
327
|
+
export interface ConfigLocalStorageOptions {
|
|
328
|
+
storageName: string;
|
|
329
|
+
storageSettingsName: string;
|
|
330
|
+
options?: SettingOptions;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
export class ConfigLocalStorageOptions {
|
|
334
|
+
constructor(
|
|
335
|
+
public storageName: string = 'storage',
|
|
336
|
+
public storageSettingsName: string = 'global-storage',
|
|
337
|
+
public options?: SettingOptions
|
|
338
|
+
) {}
|
|
339
|
+
|
|
340
|
+
static adapt(item?: any): ConfigLocalStorageOptions {
|
|
341
|
+
return new ConfigLocalStorageOptions(
|
|
342
|
+
item?.storageName,
|
|
343
|
+
item?.storageSettingsName,
|
|
344
|
+
item?.options ? SettingOptions.adapt(item.options) : undefined
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### ConfigToken
|
|
351
|
+
|
|
352
|
+
Injection token type for configuration.
|
|
353
|
+
|
|
354
|
+
```typescript
|
|
355
|
+
export const CONFIG_SETTINGS_TOKEN = new InjectionToken<ConfigOptions>(
|
|
356
|
+
'HTTP_REQUEST_MANAGER_CONFIG'
|
|
357
|
+
);
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
**Usage:**
|
|
361
|
+
```typescript
|
|
362
|
+
constructor(
|
|
363
|
+
@Inject(CONFIG_SETTINGS_TOKEN) private config?: ConfigOptions
|
|
364
|
+
) {
|
|
365
|
+
// Use config
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## State Management Models
|
|
372
|
+
|
|
373
|
+
### DataType
|
|
374
|
+
|
|
375
|
+
Enum for data structure types.
|
|
376
|
+
|
|
377
|
+
```typescript
|
|
378
|
+
export enum DataType {
|
|
379
|
+
ARRAY = 'array',
|
|
380
|
+
OBJECT = 'object'
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
**Usage:**
|
|
385
|
+
```typescript
|
|
386
|
+
// For list of records
|
|
387
|
+
super(request, DataType.ARRAY);
|
|
388
|
+
|
|
389
|
+
// For single object
|
|
390
|
+
super(request, DataType.OBJECT);
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### DatabaseStorage
|
|
394
|
+
|
|
395
|
+
IndexedDB caching configuration.
|
|
396
|
+
|
|
397
|
+
```typescript
|
|
398
|
+
export interface DatabaseStorageInterface {
|
|
399
|
+
table: string;
|
|
400
|
+
expiresIn?: string;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
export class DatabaseStorage {
|
|
404
|
+
constructor(
|
|
405
|
+
public table: string,
|
|
406
|
+
public expiresIn?: string
|
|
407
|
+
) {}
|
|
408
|
+
|
|
409
|
+
static adapt(item?: any): DatabaseStorage {
|
|
410
|
+
return new DatabaseStorage(
|
|
411
|
+
item?.table,
|
|
412
|
+
item?.expiresIn
|
|
413
|
+
);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
**Usage:**
|
|
419
|
+
```typescript
|
|
420
|
+
super(
|
|
421
|
+
ApiRequest.adapt({ path: ['users'] }),
|
|
422
|
+
DataType.ARRAY,
|
|
423
|
+
DatabaseStorage.adapt({
|
|
424
|
+
table: 'users',
|
|
425
|
+
expiresIn: '1h'
|
|
426
|
+
})
|
|
427
|
+
);
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### StateStorageOptions
|
|
431
|
+
|
|
432
|
+
Persistent state configuration for StoreStateManagerService.
|
|
433
|
+
|
|
434
|
+
```typescript
|
|
435
|
+
export interface StateStorageOptionsInterface {
|
|
436
|
+
store: string;
|
|
437
|
+
options?: SettingOptions;
|
|
438
|
+
model?: Function;
|
|
439
|
+
version?: number;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
export class StateStorageOptions {
|
|
443
|
+
constructor(
|
|
444
|
+
public store: string,
|
|
445
|
+
public options?: SettingOptions,
|
|
446
|
+
public model?: Function,
|
|
447
|
+
public version?: number
|
|
448
|
+
) {}
|
|
449
|
+
|
|
450
|
+
static adapt(item?: any): StateStorageOptions {
|
|
451
|
+
return new StateStorageOptions(
|
|
452
|
+
item?.store,
|
|
453
|
+
item?.options ? SettingOptions.adapt(item.options) : undefined,
|
|
454
|
+
item?.model,
|
|
455
|
+
item?.version
|
|
456
|
+
);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
**Usage:**
|
|
462
|
+
```typescript
|
|
463
|
+
export class AppStateService extends StoreStateManagerService<AppState> {
|
|
464
|
+
constructor() {
|
|
465
|
+
super(StateStorageOptions.adapt({
|
|
466
|
+
store: 'app-state',
|
|
467
|
+
options: {
|
|
468
|
+
storage: StorageType.GLOBAL,
|
|
469
|
+
encrypted: true,
|
|
470
|
+
expiresIn: '24h'
|
|
471
|
+
},
|
|
472
|
+
model: AppState.adapt,
|
|
473
|
+
version: 1
|
|
474
|
+
}));
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
## WebSocket Models
|
|
482
|
+
|
|
483
|
+
### WSOptions
|
|
484
|
+
|
|
485
|
+
WebSocket connection configuration.
|
|
486
|
+
|
|
487
|
+
```typescript
|
|
488
|
+
export interface WSOptionsInterface {
|
|
489
|
+
wsServer: string;
|
|
490
|
+
id: string;
|
|
491
|
+
user?: any;
|
|
492
|
+
channels?: string[];
|
|
493
|
+
jwtToken?: string;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
export class WSOptions {
|
|
497
|
+
constructor(
|
|
498
|
+
public wsServer: string,
|
|
499
|
+
public id: string,
|
|
500
|
+
public user?: any,
|
|
501
|
+
public channels?: string[],
|
|
502
|
+
public jwtToken?: string
|
|
503
|
+
) {}
|
|
504
|
+
|
|
505
|
+
static adapt(item?: any): WSOptions {
|
|
506
|
+
return new WSOptions(
|
|
507
|
+
item?.wsServer,
|
|
508
|
+
item?.id,
|
|
509
|
+
item?.user,
|
|
510
|
+
Array.isArray(item?.channels) ? item.channels : [],
|
|
511
|
+
item?.jwtToken
|
|
512
|
+
);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
**Usage:**
|
|
518
|
+
```typescript
|
|
519
|
+
const wsOptions = WSOptions.adapt({
|
|
520
|
+
wsServer: 'ws://localhost:8080',
|
|
521
|
+
id: 'my-channel',
|
|
522
|
+
user: { userId: 123, name: 'John' },
|
|
523
|
+
channels: ['notifications', 'updates']
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
wsManager.connect(wsOptions, 'jwt-token');
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
### StreamType
|
|
530
|
+
|
|
531
|
+
Enum for streaming response types.
|
|
532
|
+
|
|
533
|
+
```typescript
|
|
534
|
+
export enum StreamType {
|
|
535
|
+
NDJSON = 'ndjson',
|
|
536
|
+
SSE = 'sse'
|
|
537
|
+
}
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
### ChannelType
|
|
541
|
+
|
|
542
|
+
Enum for channel prefixes.
|
|
543
|
+
|
|
544
|
+
```typescript
|
|
545
|
+
export enum ChannelType {
|
|
546
|
+
STATE = 'SYS', // Private state sync
|
|
547
|
+
MESSAGE = 'PUB', // Public messaging
|
|
548
|
+
NOTIFICATION = 'MES' // Persistent notifications
|
|
549
|
+
}
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
**Usage:**
|
|
553
|
+
```typescript
|
|
554
|
+
const privateChannel = createChannelName(ChannelType.STATE, 'user-123');
|
|
555
|
+
// Result: 'SYS-user-123'
|
|
556
|
+
|
|
557
|
+
const publicChannel = createChannelName(ChannelType.MESSAGE, 'general');
|
|
558
|
+
// Result: 'PUB-general'
|
|
559
|
+
|
|
560
|
+
const notificationChannel = createChannelName(ChannelType.NOTIFICATION, 'alerts');
|
|
561
|
+
// Result: 'MES-alerts'
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
### ChannelMessage
|
|
565
|
+
|
|
566
|
+
WebSocket message structure.
|
|
567
|
+
|
|
568
|
+
```typescript
|
|
569
|
+
export interface ChannelMessageInterface {
|
|
570
|
+
type: string;
|
|
571
|
+
channel: string;
|
|
572
|
+
content: any;
|
|
573
|
+
sessionId?: {
|
|
574
|
+
id: string;
|
|
575
|
+
name?: string;
|
|
576
|
+
email?: string;
|
|
577
|
+
};
|
|
578
|
+
timestamp?: number;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
export class ChannelMessage {
|
|
582
|
+
constructor(
|
|
583
|
+
public type: string,
|
|
584
|
+
public channel: string,
|
|
585
|
+
public content: any,
|
|
586
|
+
public sessionId?: {
|
|
587
|
+
id: string;
|
|
588
|
+
name?: string;
|
|
589
|
+
email?: string;
|
|
590
|
+
},
|
|
591
|
+
public timestamp?: number
|
|
592
|
+
) {}
|
|
593
|
+
|
|
594
|
+
static adapt(item?: any): ChannelMessage {
|
|
595
|
+
return new ChannelMessage(
|
|
596
|
+
item?.type,
|
|
597
|
+
item?.channel,
|
|
598
|
+
item?.content,
|
|
599
|
+
item?.sessionId ? {
|
|
600
|
+
id: item.sessionId.id,
|
|
601
|
+
name: item.sessionId.name,
|
|
602
|
+
email: item.sessionId.email
|
|
603
|
+
} : undefined,
|
|
604
|
+
item?.timestamp
|
|
605
|
+
);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
### WSUser
|
|
611
|
+
|
|
612
|
+
WebSocket user information.
|
|
613
|
+
|
|
614
|
+
```typescript
|
|
615
|
+
export interface WSUserInterface {
|
|
616
|
+
id: string;
|
|
617
|
+
name?: string;
|
|
618
|
+
email?: string;
|
|
619
|
+
channels?: string[];
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
export class WSUser {
|
|
623
|
+
constructor(
|
|
624
|
+
public id: string,
|
|
625
|
+
public name?: string,
|
|
626
|
+
public email?: string,
|
|
627
|
+
public channels?: string[]
|
|
628
|
+
) {}
|
|
629
|
+
|
|
630
|
+
static adapt(item?: any): WSUser {
|
|
631
|
+
return new WSUser(
|
|
632
|
+
item?.id,
|
|
633
|
+
item?.name,
|
|
634
|
+
item?.email,
|
|
635
|
+
Array.isArray(item?.channels) ? item.channels : []
|
|
636
|
+
);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
### CommunicationType
|
|
642
|
+
|
|
643
|
+
Enum for WebSocket message types.
|
|
644
|
+
|
|
645
|
+
```typescript
|
|
646
|
+
export enum CommunicationType {
|
|
647
|
+
SUBSCRIBE = 'subscribe',
|
|
648
|
+
UNSUBSCRIBE = 'unsubscribe',
|
|
649
|
+
MESSAGE = 'message',
|
|
650
|
+
NOTIFICATION = 'notification',
|
|
651
|
+
BROADCAST = 'broadcast',
|
|
652
|
+
USER_LIST = 'user-list',
|
|
653
|
+
CHANNEL_CREATED = 'channel-created',
|
|
654
|
+
CHANNEL_DELETED = 'channel-deleted',
|
|
655
|
+
PRESENCE = 'presence',
|
|
656
|
+
HISTORY = 'history',
|
|
657
|
+
LAST_SEEN = 'last-seen'
|
|
658
|
+
}
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
---
|
|
662
|
+
|
|
663
|
+
## Storage Models
|
|
664
|
+
|
|
665
|
+
### StorageType
|
|
666
|
+
|
|
667
|
+
Enum for storage scope.
|
|
668
|
+
|
|
669
|
+
```typescript
|
|
670
|
+
export enum StorageType {
|
|
671
|
+
GLOBAL = 'global', // localStorage
|
|
672
|
+
SESSION = 'session' // sessionStorage
|
|
673
|
+
}
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
### SettingOptions
|
|
677
|
+
|
|
678
|
+
Storage configuration options.
|
|
679
|
+
|
|
680
|
+
```typescript
|
|
681
|
+
export interface SettingOptionsInterface {
|
|
682
|
+
storage?: StorageType;
|
|
683
|
+
expires?: number;
|
|
684
|
+
expiresIn?: string;
|
|
685
|
+
encrypted?: boolean;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
export class SettingOptions {
|
|
689
|
+
constructor(
|
|
690
|
+
public storage?: StorageType,
|
|
691
|
+
public expires?: number,
|
|
692
|
+
public expiresIn?: string,
|
|
693
|
+
public encrypted?: boolean
|
|
694
|
+
) {}
|
|
695
|
+
|
|
696
|
+
static adapt(item?: any): SettingOptions {
|
|
697
|
+
return new SettingOptions(
|
|
698
|
+
item?.storage,
|
|
699
|
+
item?.expires,
|
|
700
|
+
item?.expiresIn,
|
|
701
|
+
item?.encrypted
|
|
702
|
+
);
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
**Usage:**
|
|
708
|
+
```typescript
|
|
709
|
+
// Encrypted localStorage with 7-day expiration
|
|
710
|
+
SettingOptions.adapt({
|
|
711
|
+
storage: StorageType.GLOBAL,
|
|
712
|
+
encrypted: true,
|
|
713
|
+
expiresIn: '7d'
|
|
714
|
+
});
|
|
715
|
+
|
|
716
|
+
// Unencrypted sessionStorage
|
|
717
|
+
SettingOptions.adapt({
|
|
718
|
+
storage: StorageType.SESSION,
|
|
719
|
+
encrypted: false
|
|
720
|
+
});
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
### StorageData
|
|
724
|
+
|
|
725
|
+
Internal storage data structure.
|
|
726
|
+
|
|
727
|
+
```typescript
|
|
728
|
+
export interface StorageDataInterface {
|
|
729
|
+
data: any;
|
|
730
|
+
settings: SettingOptions;
|
|
731
|
+
expires?: number;
|
|
732
|
+
}
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
---
|
|
736
|
+
|
|
737
|
+
## Database Models
|
|
738
|
+
|
|
739
|
+
### TableSchemaDef
|
|
740
|
+
|
|
741
|
+
IndexedDB table schema definition.
|
|
742
|
+
|
|
743
|
+
```typescript
|
|
744
|
+
export interface TableSchemaDefInterface {
|
|
745
|
+
table: string;
|
|
746
|
+
schema: string;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
export class TableSchemaDef {
|
|
750
|
+
constructor(
|
|
751
|
+
public table: string,
|
|
752
|
+
public schema: string
|
|
753
|
+
) {}
|
|
754
|
+
|
|
755
|
+
static adapt(item?: any): TableSchemaDef {
|
|
756
|
+
return new TableSchemaDef(
|
|
757
|
+
item?.table,
|
|
758
|
+
item?.schema
|
|
759
|
+
);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
```
|
|
763
|
+
|
|
764
|
+
**Usage:**
|
|
765
|
+
```typescript
|
|
766
|
+
const userTable = TableSchemaDef.adapt({
|
|
767
|
+
table: 'users',
|
|
768
|
+
schema: '++id, name, email, age, createdAt'
|
|
769
|
+
});
|
|
770
|
+
|
|
771
|
+
dbManager.createDatabaseTable(userTable).subscribe();
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
### Schema Examples
|
|
775
|
+
|
|
776
|
+
```typescript
|
|
777
|
+
// Simple auto-increment ID
|
|
778
|
+
'++id'
|
|
779
|
+
|
|
780
|
+
// Multiple indexes
|
|
781
|
+
'++id, name, email'
|
|
782
|
+
|
|
783
|
+
// Compound index
|
|
784
|
+
'++id, [category+status]'
|
|
785
|
+
|
|
786
|
+
// Multi-entry index
|
|
787
|
+
'++id, tags' // tags is an array
|
|
788
|
+
|
|
789
|
+
// Full schema example
|
|
790
|
+
'++id, name, email, &username, [firstName+lastName], tags'
|
|
791
|
+
```
|
|
792
|
+
|
|
793
|
+
---
|
|
794
|
+
|
|
795
|
+
## Retry & Error Models
|
|
796
|
+
|
|
797
|
+
### RetryOptions
|
|
798
|
+
|
|
799
|
+
Retry configuration for HTTP requests.
|
|
800
|
+
|
|
801
|
+
```typescript
|
|
802
|
+
export interface RetryOptionsInterface {
|
|
803
|
+
times: number;
|
|
804
|
+
delay: number;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
export class RetryOptions {
|
|
808
|
+
constructor(
|
|
809
|
+
public times: number = 0,
|
|
810
|
+
public delay: number = 3
|
|
811
|
+
) {}
|
|
812
|
+
|
|
813
|
+
static adapt(item?: any): RetryOptions {
|
|
814
|
+
return new RetryOptions(
|
|
815
|
+
item?.times || 0,
|
|
816
|
+
item?.delay || 3
|
|
817
|
+
);
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
```
|
|
821
|
+
|
|
822
|
+
**Usage:**
|
|
823
|
+
```typescript
|
|
824
|
+
// Retry 3 times with 2 second delay
|
|
825
|
+
RetryOptions.adapt({ times: 3, delay: 2 });
|
|
826
|
+
|
|
827
|
+
// No retry
|
|
828
|
+
RetryOptions.adapt({ times: 0 });
|
|
829
|
+
|
|
830
|
+
// Default retry
|
|
831
|
+
RetryOptions.adapt(); // { times: 0, delay: 3 }
|
|
832
|
+
```
|
|
833
|
+
|
|
834
|
+
### ErrorSettings
|
|
835
|
+
|
|
836
|
+
Error handling configuration for interceptors.
|
|
837
|
+
|
|
838
|
+
```typescript
|
|
839
|
+
export interface ErrorSettingsInterface {
|
|
840
|
+
displayError?: boolean;
|
|
841
|
+
displayWarning?: boolean;
|
|
842
|
+
customHandler?: (error: any) => void;
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
export class ErrorSettings {
|
|
846
|
+
constructor(
|
|
847
|
+
public displayError?: boolean,
|
|
848
|
+
public displayWarning?: boolean,
|
|
849
|
+
public customHandler?: (error: any) => void
|
|
850
|
+
) {}
|
|
851
|
+
}
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
---
|
|
855
|
+
|
|
856
|
+
## Utility Models
|
|
857
|
+
|
|
858
|
+
### ObjectMerger
|
|
859
|
+
|
|
860
|
+
Deep merge configuration.
|
|
861
|
+
|
|
862
|
+
```typescript
|
|
863
|
+
export interface MergeOptions {
|
|
864
|
+
clone?: boolean;
|
|
865
|
+
mergeArrays?: boolean;
|
|
866
|
+
customMerge?: (key: string, target: any, source: any) => any;
|
|
867
|
+
}
|
|
868
|
+
```
|
|
869
|
+
|
|
870
|
+
**Usage:**
|
|
871
|
+
```typescript
|
|
872
|
+
const merged = objectMerger.deepMerge(obj1, obj2, {
|
|
873
|
+
clone: true,
|
|
874
|
+
mergeArrays: false
|
|
875
|
+
});
|
|
876
|
+
```
|
|
877
|
+
|
|
878
|
+
### HeadersConfig
|
|
879
|
+
|
|
880
|
+
Header configuration.
|
|
881
|
+
|
|
882
|
+
```typescript
|
|
883
|
+
export interface HeadersConfig {
|
|
884
|
+
'Content-Type'?: string;
|
|
885
|
+
'Accept-Language'?: string;
|
|
886
|
+
'Current-Date'?: string;
|
|
887
|
+
'Authorization'?: string;
|
|
888
|
+
[key: string]: string | undefined;
|
|
889
|
+
}
|
|
890
|
+
```
|
|
891
|
+
|
|
892
|
+
---
|
|
893
|
+
|
|
894
|
+
## Model Adapters Pattern
|
|
895
|
+
|
|
896
|
+
All models use the `adapt()` pattern for safe transformation:
|
|
897
|
+
|
|
898
|
+
```typescript
|
|
899
|
+
// Basic adaptation
|
|
900
|
+
const user = User.adapt(apiResponse);
|
|
901
|
+
|
|
902
|
+
// With nested objects
|
|
903
|
+
const order = Order.adapt({
|
|
904
|
+
...data,
|
|
905
|
+
customer: Customer.adapt(data.customer),
|
|
906
|
+
items: data.items.map(item => OrderItem.adapt(item))
|
|
907
|
+
});
|
|
908
|
+
|
|
909
|
+
// With defaults
|
|
910
|
+
const config = ConfigOptions.adapt(userProvided || {});
|
|
911
|
+
|
|
912
|
+
// Array adaptation
|
|
913
|
+
const users = response.users.map(u => User.adapt(u));
|
|
914
|
+
```
|
|
915
|
+
|
|
916
|
+
### Adapter Functions
|
|
917
|
+
|
|
918
|
+
Adapters can be passed to HTTP requests:
|
|
919
|
+
|
|
920
|
+
```typescript
|
|
921
|
+
const request = ApiRequest.adapt({
|
|
922
|
+
path: ['users'],
|
|
923
|
+
adapter: User.adapt // Transform response
|
|
924
|
+
});
|
|
925
|
+
|
|
926
|
+
httpManager.getRequest(request).subscribe();
|
|
927
|
+
// data$ will emit User[] instead of raw JSON
|
|
928
|
+
```
|
|
929
|
+
|
|
930
|
+
### Custom Adapters
|
|
931
|
+
|
|
932
|
+
Create adapters for your models:
|
|
933
|
+
|
|
934
|
+
```typescript
|
|
935
|
+
export interface ProductInterface {
|
|
936
|
+
id: number;
|
|
937
|
+
name: string;
|
|
938
|
+
price: number;
|
|
939
|
+
category: Category;
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
export class Product implements ProductInterface {
|
|
943
|
+
constructor(
|
|
944
|
+
public id: number = 0,
|
|
945
|
+
public name: string = '',
|
|
946
|
+
public price: number = 0,
|
|
947
|
+
public category: Category
|
|
948
|
+
) {}
|
|
949
|
+
|
|
950
|
+
static adapt(item?: any): Product {
|
|
951
|
+
return new Product(
|
|
952
|
+
item?.id,
|
|
953
|
+
item?.name,
|
|
954
|
+
item?.price,
|
|
955
|
+
item?.category ? Category.adapt(item.category) : Category.adapt()
|
|
956
|
+
);
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
```
|
|
960
|
+
|
|
961
|
+
---
|
|
962
|
+
|
|
963
|
+
## Batch Request Models
|
|
964
|
+
|
|
965
|
+
### BatchOptions
|
|
966
|
+
|
|
967
|
+
Configuration for batch request execution.
|
|
968
|
+
|
|
969
|
+
```typescript
|
|
970
|
+
export interface BatchOptionsInterface {
|
|
971
|
+
mode?: 'sequential' | 'parallel';
|
|
972
|
+
stopOnError?: boolean;
|
|
973
|
+
concurrency?: number;
|
|
974
|
+
ignoreErrors?: boolean;
|
|
975
|
+
logErrors?: boolean;
|
|
976
|
+
displaySuccess?: boolean;
|
|
977
|
+
displayError?: boolean;
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
export class BatchOptions implements BatchOptionsInterface {
|
|
981
|
+
constructor(
|
|
982
|
+
public mode: 'sequential' | 'parallel' = 'sequential',
|
|
983
|
+
public stopOnError: boolean = false,
|
|
984
|
+
public concurrency: number = 3,
|
|
985
|
+
public ignoreErrors: boolean = false,
|
|
986
|
+
public logErrors: boolean = true,
|
|
987
|
+
public displaySuccess?: boolean,
|
|
988
|
+
public displayError?: boolean,
|
|
989
|
+
) {}
|
|
990
|
+
|
|
991
|
+
static adapt(item?: any): BatchOptions {
|
|
992
|
+
return new BatchOptions(
|
|
993
|
+
item?.mode ?? 'sequential',
|
|
994
|
+
item?.stopOnError ?? false,
|
|
995
|
+
item?.concurrency ?? 3,
|
|
996
|
+
item?.ignoreErrors ?? false,
|
|
997
|
+
item?.logErrors !== false,
|
|
998
|
+
item?.displaySuccess ?? false,
|
|
999
|
+
item?.displayError ?? false,
|
|
1000
|
+
);
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
```
|
|
1004
|
+
|
|
1005
|
+
### BatchProgress
|
|
1006
|
+
|
|
1007
|
+
Progress tracking for batch operations.
|
|
1008
|
+
|
|
1009
|
+
```typescript
|
|
1010
|
+
export interface BatchProgress {
|
|
1011
|
+
total: number;
|
|
1012
|
+
pending: number;
|
|
1013
|
+
completed: number;
|
|
1014
|
+
failed: number;
|
|
1015
|
+
percent: number;
|
|
1016
|
+
}
|
|
1017
|
+
```
|
|
1018
|
+
|
|
1019
|
+
### BatchRequestState
|
|
1020
|
+
|
|
1021
|
+
Per-request state within a batch operation.
|
|
1022
|
+
|
|
1023
|
+
```typescript
|
|
1024
|
+
export type BatchRequestState<T> =
|
|
1025
|
+
| BatchPendingState
|
|
1026
|
+
| BatchSuccessState<T>
|
|
1027
|
+
| BatchErrorState;
|
|
1028
|
+
|
|
1029
|
+
export interface BatchPendingState {
|
|
1030
|
+
index: number;
|
|
1031
|
+
request: any;
|
|
1032
|
+
isPending: true;
|
|
1033
|
+
data?: undefined;
|
|
1034
|
+
error?: undefined;
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
export interface BatchSuccessState<T> {
|
|
1038
|
+
index: number;
|
|
1039
|
+
request: any;
|
|
1040
|
+
isPending: false;
|
|
1041
|
+
data: T;
|
|
1042
|
+
error?: undefined;
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
export interface BatchErrorState {
|
|
1046
|
+
index: number;
|
|
1047
|
+
request: any;
|
|
1048
|
+
isPending: false;
|
|
1049
|
+
data?: undefined;
|
|
1050
|
+
error: any;
|
|
1051
|
+
}
|
|
1052
|
+
```
|
|
1053
|
+
|
|
1054
|
+
### BatchResult
|
|
1055
|
+
|
|
1056
|
+
Result of a single request within a batch.
|
|
1057
|
+
|
|
1058
|
+
```typescript
|
|
1059
|
+
export interface BatchResultInterface<T = any> {
|
|
1060
|
+
request: any;
|
|
1061
|
+
success: boolean;
|
|
1062
|
+
data?: T;
|
|
1063
|
+
error?: any;
|
|
1064
|
+
index: number;
|
|
1065
|
+
timestamp: number;
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
export class BatchResult<T = any> implements BatchResultInterface<T> {
|
|
1069
|
+
constructor(
|
|
1070
|
+
public request: any,
|
|
1071
|
+
public success: boolean,
|
|
1072
|
+
public data?: T,
|
|
1073
|
+
public error?: any,
|
|
1074
|
+
public index: number = 0,
|
|
1075
|
+
public timestamp: number = Date.now(),
|
|
1076
|
+
) {}
|
|
1077
|
+
|
|
1078
|
+
static adapt<T>(item?: any): BatchResult<T> {
|
|
1079
|
+
return new BatchResult<T>(
|
|
1080
|
+
item?.request,
|
|
1081
|
+
item?.success ?? false,
|
|
1082
|
+
item?.data,
|
|
1083
|
+
item?.error,
|
|
1084
|
+
item?.index ?? 0,
|
|
1085
|
+
item?.timestamp ?? Date.now(),
|
|
1086
|
+
);
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1089
|
+
```
|
|
1090
|
+
|
|
1091
|
+
---
|
|
1092
|
+
|
|
1093
|
+
## Upload Models
|
|
1094
|
+
|
|
1095
|
+
### UploadValidationErrorModel
|
|
1096
|
+
|
|
1097
|
+
Error returned when upload validation fails.
|
|
1098
|
+
|
|
1099
|
+
```typescript
|
|
1100
|
+
export interface InvalidFileInfoInterface {
|
|
1101
|
+
fileName: string;
|
|
1102
|
+
fileSize: number;
|
|
1103
|
+
fileType: string;
|
|
1104
|
+
errors: string[];
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
export class InvalidFileInfoModel implements InvalidFileInfoInterface {
|
|
1108
|
+
constructor(
|
|
1109
|
+
public fileName: string = '',
|
|
1110
|
+
public fileSize: number = 0,
|
|
1111
|
+
public fileType: string = '',
|
|
1112
|
+
public errors: string[] = []
|
|
1113
|
+
) {}
|
|
1114
|
+
|
|
1115
|
+
static adapt(item?: any): InvalidFileInfoModel {
|
|
1116
|
+
return new InvalidFileInfoModel(
|
|
1117
|
+
item?.fileName,
|
|
1118
|
+
item?.fileSize,
|
|
1119
|
+
item?.fileType,
|
|
1120
|
+
Array.isArray(item?.errors) ? item.errors : []
|
|
1121
|
+
);
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
export interface UploadValidationErrorInterface {
|
|
1126
|
+
invalidFiles: InvalidFileInfoModel[];
|
|
1127
|
+
validFilesCount: number;
|
|
1128
|
+
totalFilesCount: number;
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
export class UploadValidationErrorModel implements UploadValidationErrorInterface {
|
|
1132
|
+
constructor(
|
|
1133
|
+
public invalidFiles: InvalidFileInfoModel[] = [],
|
|
1134
|
+
public validFilesCount: number = 0,
|
|
1135
|
+
public totalFilesCount: number = 0
|
|
1136
|
+
) {}
|
|
1137
|
+
|
|
1138
|
+
static adapt(item?: any): UploadValidationErrorModel {
|
|
1139
|
+
return new UploadValidationErrorModel(
|
|
1140
|
+
Array.isArray(item?.invalidFiles) ? item.invalidFiles.map((f: any) => InvalidFileInfoModel.adapt(f)) : [],
|
|
1141
|
+
item?.validFilesCount,
|
|
1142
|
+
item?.totalFilesCount
|
|
1143
|
+
);
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
```
|
|
1147
|
+
|
|
1148
|
+
---
|
|
1149
|
+
|
|
1150
|
+
## Query Parameter Tracking Models
|
|
1151
|
+
|
|
1152
|
+
### QueryParamsTrackerOptions
|
|
1153
|
+
|
|
1154
|
+
Options for the query parameter tracking system.
|
|
1155
|
+
|
|
1156
|
+
```typescript
|
|
1157
|
+
export interface QueryParamsTrackerOptionsInterface {
|
|
1158
|
+
mode?: 'exact' | 'variation';
|
|
1159
|
+
watchParams?: string[];
|
|
1160
|
+
watchExpiresAt?: string | number;
|
|
1161
|
+
watchParamsExpire?: string | number;
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
export class QueryParamsTrackerOptionsModel implements QueryParamsTrackerOptionsInterface {
|
|
1165
|
+
constructor(
|
|
1166
|
+
public mode?: 'exact' | 'variation',
|
|
1167
|
+
public watchParams?: string[],
|
|
1168
|
+
public watchExpiresAt?: string | number,
|
|
1169
|
+
public watchParamsExpire?: string | number
|
|
1170
|
+
) {}
|
|
1171
|
+
|
|
1172
|
+
static adapt(item?: any): QueryParamsTrackerOptionsModel {
|
|
1173
|
+
return new QueryParamsTrackerOptionsModel(
|
|
1174
|
+
item?.mode,
|
|
1175
|
+
Array.isArray(item?.watchParams) ? item.watchParams : [],
|
|
1176
|
+
item?.watchExpiresAt,
|
|
1177
|
+
item?.watchParamsExpire
|
|
1178
|
+
);
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
```
|
|
1182
|
+
|
|
1183
|
+
**Properties:**
|
|
1184
|
+
|
|
1185
|
+
| Property | Type | Default | Description |
|
|
1186
|
+
|----------|------|---------|-------------|
|
|
1187
|
+
| `mode` | `'exact' \| 'variation'` | `undefined` | Tracking mode: `exact` matches full query hash, `variation` watches individual param values |
|
|
1188
|
+
| `watchParams` | `string[]` | `[]` | Specific query parameter keys to watch for changes |
|
|
1189
|
+
| `watchExpiresAt` | `string \| number` | `undefined` | Epoch timestamp or duration string when tracked values expire |
|
|
1190
|
+
| `watchParamsExpire` | `string \| number` | `undefined` | Alternative expiry duration for watched params (e.g., `'10s'`, `'5mn'`) |
|
|
1191
|
+
|
|
1192
|
+
### NormalizedRequestOptions
|
|
1193
|
+
|
|
1194
|
+
Internal normalized representation of request options.
|
|
1195
|
+
|
|
1196
|
+
```typescript
|
|
1197
|
+
export type QueryValue = string;
|
|
1198
|
+
export type NormalizedQueryParams = Record<string, QueryValue>;
|
|
1199
|
+
|
|
1200
|
+
export interface NormalizedRequestOptionsInterface {
|
|
1201
|
+
pathKey: string;
|
|
1202
|
+
query: NormalizedQueryParams;
|
|
1203
|
+
hasQuery: boolean;
|
|
1204
|
+
}
|
|
1205
|
+
```
|
|
1206
|
+
|
|
1207
|
+
### PathTrackerState
|
|
1208
|
+
|
|
1209
|
+
Per-path tracking state for consumed query values.
|
|
1210
|
+
|
|
1211
|
+
```typescript
|
|
1212
|
+
export interface PathTrackerStateInterface {
|
|
1213
|
+
watchExpiresAt?: number;
|
|
1214
|
+
consumedValuesByKey: Record<string, QueryValue[]>;
|
|
1215
|
+
}
|
|
1216
|
+
```
|
|
1217
|
+
|
|
1218
|
+
### QueryTrackerState
|
|
1219
|
+
|
|
1220
|
+
Top-level state for the query parameter tracking system.
|
|
1221
|
+
|
|
1222
|
+
```typescript
|
|
1223
|
+
export interface QueryTrackerStateInterface {
|
|
1224
|
+
paths: Record<string, PathTrackerStateInterface>;
|
|
1225
|
+
}
|
|
1226
|
+
```
|
|
1227
|
+
|
|
1228
|
+
---
|
|
1229
|
+
|
|
1230
|
+
## Operation Models
|
|
1231
|
+
|
|
1232
|
+
### OperationResultModel
|
|
1233
|
+
|
|
1234
|
+
Result of a CRUD operation emitted after state changes.
|
|
1235
|
+
|
|
1236
|
+
```typescript
|
|
1237
|
+
export interface OperationResultInterface {
|
|
1238
|
+
success: boolean;
|
|
1239
|
+
operation: 'CREATE' | 'UPDATE' | 'DELETE';
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
export class OperationResultModel implements OperationResultInterface {
|
|
1243
|
+
constructor(
|
|
1244
|
+
public success: boolean = false,
|
|
1245
|
+
public operation: 'CREATE' | 'UPDATE' | 'DELETE' = 'UPDATE',
|
|
1246
|
+
) {}
|
|
1247
|
+
|
|
1248
|
+
static adapt(item?: any): OperationResultModel {
|
|
1249
|
+
return new OperationResultModel(
|
|
1250
|
+
item?.success ?? false,
|
|
1251
|
+
item?.operation || 'UPDATE',
|
|
1252
|
+
);
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
```
|
|
1256
|
+
|
|
1257
|
+
---
|
|
1258
|
+
|
|
1259
|
+
## Related Documentation
|
|
1260
|
+
|
|
1261
|
+
- [`Complete API Reference`](COMPLETE_API_REFERENCE.md) - Full API with methods
|
|
1262
|
+
- [`HTTP Manager`](HTTP_MANAGER_README.md) - HTTP service usage
|
|
1263
|
+
- [`State Manager`](HTTP_STATE_MANAGER_README.md) - State management
|
|
1264
|
+
- [`Architecture`](ARCHITECTURE.md) - System architecture
|