http-request-manager 18.15.33 → 18.15.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/TEST_COVERAGE_SUMMARY.md +458 -0
- package/ng-package.json +8 -0
- package/package.json +4 -13
- package/src/docs/ADVANCED_WEBSOCKET.md +633 -0
- package/src/docs/ARCHITECTURE.md +633 -0
- package/src/docs/BATCH_REQUEST_README.md +467 -0
- package/src/docs/COMPLETE_API_REFERENCE.md +1037 -0
- package/src/docs/DATABASE_README.md +1195 -0
- package/src/docs/ENCRYPTION_README.md +403 -0
- package/src/docs/HTTP_MANAGER_README.md +628 -0
- package/src/docs/HTTP_SINGNALS_MANAGER_README.md +654 -0
- package/src/docs/HTTP_STATE_MANAGER_README.md +1391 -0
- package/src/docs/INTERCEPTOR_README.md +549 -0
- package/src/docs/LOCAL_STORAGE_README.md +1056 -0
- package/src/docs/LOCAL_STORAGE_SIGNALS_README.md +338 -0
- package/src/docs/LOGGER_README.md +310 -0
- package/src/docs/MESSAGE_TRACKER_README.md +518 -0
- package/src/docs/MESSAGE_TRACKER_SIGNALS_README.md +563 -0
- package/src/docs/MODELS_README.md +1264 -0
- package/src/docs/SIGNAL_SERVICES_README.md +238 -0
- package/src/docs/SQL_DIXIE_README.md +574 -0
- package/src/docs/STORE_STATE_MANAGER_README.md +556 -0
- package/src/docs/STORE_STATE_SIGNALS_README.md +600 -0
- package/src/docs/UPLOAD_REQUEST_README.md +324 -0
- package/src/docs/UTILS_README.md +1604 -0
- package/src/docs/WEBSOCKET_MESSAGE_SERVICE.md +799 -0
- package/src/docs/WEBSOCKET_SIGNALS_README.md +641 -0
- package/src/docs/WEBSOCKET_SINGLETON_REFACTORING.md +201 -0
- package/src/docs/WS_MANAGER_README.md +613 -0
- package/src/lib/http-request-manager.module.ts +147 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +116 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +255 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.html +123 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +53 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +208 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +214 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.html +279 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.ts +461 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +622 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +106 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +687 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +418 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +576 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +89 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +119 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +94 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +203 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +144 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +102 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +40 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +230 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +40 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/jwt-token.service.ts +62 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +168 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +49 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
- package/src/lib/http-request-services-demo/store-state-signals-demo/store-state-signals-demo.component.ts +161 -0
- package/src/lib/http-request-services-demo/upload-demo/models/index.ts +1 -0
- package/src/lib/http-request-services-demo/upload-demo/models/upload-state.model.ts +30 -0
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.html +89 -0
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.scss +160 -0
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.spec.ts +101 -0
- package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.ts +136 -0
- package/src/lib/index.ts +3 -0
- package/src/lib/interceptors/credentials.interceptor.ts +16 -0
- package/src/lib/interceptors/index.ts +6 -0
- package/src/lib/interceptors/models/error-settings.model.ts +22 -0
- package/src/lib/interceptors/models/index.ts +2 -0
- package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
- package/src/lib/interceptors/request-error.interceptor.ts +65 -0
- package/src/lib/interceptors/request-header.interceptor.ts +56 -0
- package/src/lib/message-display/README.md +509 -0
- package/src/lib/message-display/index.ts +4 -0
- package/src/lib/message-display/models/action.model.ts +27 -0
- package/src/lib/message-display/models/communication-message.model.ts +77 -0
- package/src/lib/message-display/models/display-config.model.ts +35 -0
- package/src/lib/message-display/models/display-rule.interface.ts +28 -0
- package/src/lib/message-display/models/display-strategy.interface.ts +8 -0
- package/src/lib/message-display/models/index.ts +6 -0
- package/src/lib/message-display/models/slide.model.ts +24 -0
- package/src/lib/message-display/rules/default-display-rules.ts +35 -0
- package/src/lib/message-display/services/message-display-router.service.ts +63 -0
- package/src/lib/message-display/strategies/snackbar.strategy.ts +46 -0
- package/src/lib/models/batch-options.model.ts +33 -0
- package/src/lib/models/batch-progress.model.ts +19 -0
- package/src/lib/models/batch-request-state.model.ts +40 -0
- package/src/lib/models/batch-result.model.ts +30 -0
- package/src/lib/models/config-http-options.model.ts +45 -0
- package/src/lib/models/config-local-storage-options.model.ts +27 -0
- package/src/lib/models/config-options.model.ts +27 -0
- package/src/lib/models/config-token.model.ts +9 -0
- package/src/lib/models/data-type.enum.ts +5 -0
- package/src/lib/models/database-storage.model.ts +24 -0
- package/src/lib/models/index.ts +16 -0
- package/src/lib/models/retry-options.model.ts +22 -0
- package/src/lib/models/upload-validation-error.model.ts +46 -0
- package/src/lib/services/SQL-DixieJS service/dexie-query-executor.ts +246 -0
- package/src/lib/services/SQL-DixieJS service/dexie-sql.service.ts +31 -0
- package/src/lib/services/SQL-DixieJS service/index.ts +4 -0
- package/src/lib/services/SQL-DixieJS service/models/execution-plan.model.ts +52 -0
- package/src/lib/services/SQL-DixieJS service/models/index.ts +3 -0
- package/src/lib/services/SQL-DixieJS service/models/sql-errors.model.ts +13 -0
- package/src/lib/services/SQL-DixieJS service/models/sql-options.model.ts +3 -0
- package/src/lib/services/SQL-DixieJS service/query-planner.ts +284 -0
- package/src/lib/services/SQL-DixieJS service/schema-validator.ts +217 -0
- package/src/lib/services/SQL-DixieJS service/sql-parser.ts +35 -0
- package/src/lib/services/database-manager-service/database.manager.service.ts +384 -0
- package/src/lib/services/database-manager-service/db.storage.service.ts +240 -0
- package/src/lib/services/database-manager-service/index.ts +4 -0
- package/src/lib/services/database-manager-service/models/index.ts +2 -0
- package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
- package/src/lib/services/index.ts +20 -0
- package/src/lib/services/local-storage-manager-service/index.ts +4 -0
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +567 -0
- package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
- package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +437 -0
- package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
- package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
- package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
- package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
- package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
- package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
- package/src/lib/services/request-manager-services/README.md +282 -0
- package/src/lib/services/request-manager-services/http-manager-signals.service.ts +674 -0
- package/src/lib/services/request-manager-services/http-manager.service.spec.ts +353 -0
- package/src/lib/services/request-manager-services/http-manager.service.ts +727 -0
- package/src/lib/services/request-manager-services/index.ts +8 -0
- package/src/lib/services/request-manager-services/request-signals.service.ts +372 -0
- package/src/lib/services/request-manager-services/request.service.ts +435 -0
- package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
- package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
- package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
- package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
- package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +468 -0
- package/src/lib/services/request-manager-state-service/http-manager-state.store.spec.ts +665 -0
- package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +2395 -0
- package/src/lib/services/request-manager-state-service/index.ts +3 -0
- package/src/lib/services/request-manager-state-service/models/api-request.model.ts +86 -0
- package/src/lib/services/request-manager-state-service/models/index.ts +14 -0
- package/src/lib/services/request-manager-state-service/models/operation-result.model.ts +18 -0
- package/src/lib/services/request-manager-state-service/models/parsing-result.model.ts +21 -0
- package/src/lib/services/request-manager-state-service/models/request-options.model.ts +37 -0
- package/src/lib/services/request-manager-state-service/models/stream-config.model.ts +20 -0
- package/src/lib/services/request-manager-state-service/models/stream-event-metadata.model.ts +23 -0
- package/src/lib/services/request-manager-state-service/models/stream-event.model.ts +23 -0
- package/src/lib/services/request-manager-state-service/models/stream-output.model.ts +23 -0
- package/src/lib/services/request-manager-state-service/models/stream-progress.model.ts +24 -0
- package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
- package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +42 -0
- package/src/lib/services/store-state-manager-service/index.ts +4 -0
- package/src/lib/services/store-state-manager-service/models/index.ts +3 -0
- package/src/lib/services/store-state-manager-service/models/state-operation-result.model.ts +30 -0
- package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
- package/src/lib/services/store-state-manager-service/store-state-manager-signals.service.ts +169 -0
- package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +153 -0
- package/src/lib/services/utils/app.service.spec.ts +25 -0
- package/src/lib/services/utils/app.service.ts +21 -0
- package/src/lib/services/utils/encryption/README.md +79 -0
- package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
- package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
- package/src/lib/services/utils/encryption/index.ts +5 -0
- package/src/lib/services/utils/encryption/random.ts +81 -0
- package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +106 -0
- package/src/lib/services/utils/headers.service.spec.ts +80 -0
- package/src/lib/services/utils/headers.service.ts +18 -0
- package/src/lib/services/utils/index.ts +9 -0
- package/src/lib/services/utils/logger.service.ts +90 -0
- package/src/lib/services/utils/models/index.ts +4 -0
- package/src/lib/services/utils/models/normalized-request-options.model.ts +24 -0
- package/src/lib/services/utils/models/path-tracker-state.model.ts +20 -0
- package/src/lib/services/utils/models/query-params-tracker-options.model.ts +24 -0
- package/src/lib/services/utils/models/query-tracker-state.model.ts +23 -0
- package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
- package/src/lib/services/utils/object-merger.service.ts +78 -0
- package/src/lib/services/utils/path-query.service.spec.ts +117 -0
- package/src/lib/services/utils/path-query.service.ts +69 -0
- package/src/lib/services/utils/query-params-tracker.service.ts +442 -0
- package/src/lib/services/utils/random-color.utils.ts +83 -0
- package/src/lib/services/utils/utils.service.spec.ts +165 -0
- package/src/lib/services/utils/utils.service.ts +192 -0
- package/src/lib/services/ws-manager-service/index.ts +13 -0
- package/src/lib/services/ws-manager-service/message-tracker-signals.service.ts +147 -0
- package/src/lib/services/ws-manager-service/message-tracker.service.ts +477 -0
- package/src/lib/services/ws-manager-service/models/channel-info.model.ts +29 -0
- package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
- package/src/lib/services/ws-manager-service/models/channel-message.model.ts +36 -0
- package/src/lib/services/ws-manager-service/models/channel-type.enum.ts +6 -0
- package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
- package/src/lib/services/ws-manager-service/models/index.ts +10 -0
- package/src/lib/services/ws-manager-service/models/notification-message.model.ts +29 -0
- package/src/lib/services/ws-manager-service/models/public-message.model.ts +18 -0
- package/src/lib/services/ws-manager-service/models/state-message.model.ts +18 -0
- package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
- package/src/lib/services/ws-manager-service/services/index.ts +4 -0
- package/src/lib/services/ws-manager-service/services/websocket-message.service.ts +129 -0
- package/src/lib/services/ws-manager-service/services/websocket.service.ts +434 -0
- package/src/lib/services/ws-manager-service/websocket-service/index.ts +1 -0
- package/src/lib/services/ws-manager-service/websocket-service/websocket-manager.service.ts +716 -0
- package/src/lib/services/ws-manager-service/websocket-services-complete.spec.ts +596 -0
- package/src/lib/services/ws-manager-service/websocket-signals-manager.service.ts +141 -0
- package/src/public-api.ts +19 -0
- package/tsconfig.lib.json +34 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +14 -0
- package/fesm2022/http-request-manager.mjs +0 -13688
- package/fesm2022/http-request-manager.mjs.map +0 -1
- package/http-request-manager-18.15.33.tgz +0 -0
- package/types/http-request-manager.d.ts +0 -3968
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
# SQL DexieJS Service
|
|
2
|
+
|
|
3
|
+
`DexieSqlService` lets you query an IndexedDB database managed by `DatabaseManagerService` using familiar MySQL-syntax SQL strings. Queries are parsed at runtime, validated against the live schema, translated into a Dexie.js execution plan, and returned as an `Observable<any[]>`.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Overview](#overview)
|
|
8
|
+
- [Installation](#installation)
|
|
9
|
+
- [Quick Start](#quick-start)
|
|
10
|
+
- [API Reference](#api-reference)
|
|
11
|
+
- [DexieSqlService](#dexiesqlservice)
|
|
12
|
+
- [DexieSqlOptions](#dexiesqloptions)
|
|
13
|
+
- [Error Types](#error-types)
|
|
14
|
+
- [SQL Feature Reference](#sql-feature-reference)
|
|
15
|
+
- [SELECT & Projection](#select--projection)
|
|
16
|
+
- [WHERE — Comparison Operators](#where--comparison-operators)
|
|
17
|
+
- [WHERE — IN / NOT IN](#where--in--not-in)
|
|
18
|
+
- [WHERE — BETWEEN](#where--between)
|
|
19
|
+
- [WHERE — LIKE](#where--like)
|
|
20
|
+
- [AND Conditions](#and-conditions)
|
|
21
|
+
- [OR Conditions](#or-conditions)
|
|
22
|
+
- [ORDER BY](#order-by)
|
|
23
|
+
- [LIMIT & OFFSET](#limit--offset)
|
|
24
|
+
- [DISTINCT](#distinct)
|
|
25
|
+
- [COUNT(*)](#count)
|
|
26
|
+
- [JOIN (INNER & LEFT)](#join-inner--left)
|
|
27
|
+
- [Execution Plans](#execution-plans)
|
|
28
|
+
- [Constraints & Limitations](#constraints--limitations)
|
|
29
|
+
- [Examples](#examples)
|
|
30
|
+
- [Component injection](#component-injection)
|
|
31
|
+
- [Basic SELECT](#basic-select)
|
|
32
|
+
- [Filtering with WHERE](#filtering-with-where)
|
|
33
|
+
- [Multi-column AND](#multi-column-and)
|
|
34
|
+
- [IN / NOT IN lists](#in--not-in-lists)
|
|
35
|
+
- [BETWEEN range](#between-range)
|
|
36
|
+
- [LIKE prefix search](#like-prefix-search)
|
|
37
|
+
- [OR branching](#or-branching)
|
|
38
|
+
- [ORDER BY + LIMIT](#order-by--limit)
|
|
39
|
+
- [Pagination with OFFSET](#pagination-with-offset)
|
|
40
|
+
- [DISTINCT rows](#distinct-rows)
|
|
41
|
+
- [COUNT(*)](#count-rows)
|
|
42
|
+
- [INNER JOIN](#inner-join)
|
|
43
|
+
- [LEFT JOIN](#left-join)
|
|
44
|
+
- [Strict mode](#strict-mode)
|
|
45
|
+
- [Error handling](#error-handling)
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Overview
|
|
50
|
+
|
|
51
|
+
The service is a three-stage pipeline:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
SQL string
|
|
55
|
+
↓ SqlParser — parses SQL using node-sql-parser (MySQL dialect)
|
|
56
|
+
↓ SchemaValidator — validates all columns against the live DexieJS schema
|
|
57
|
+
↓ QueryPlanner — builds an ExecutionPlan matched to the available indexes
|
|
58
|
+
↓ DexieQueryExecutor — runs the plan against IndexedDB via Dexie.js
|
|
59
|
+
Observable<any[]>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Because IndexedDB supports only one index per query, the planner selects the best strategy automatically:
|
|
63
|
+
|
|
64
|
+
| Strategy | When used |
|
|
65
|
+
|---|---|
|
|
66
|
+
| `SIMPLE` | No WHERE, or a single-column condition |
|
|
67
|
+
| `AND_BOUNDED` | AND with no matching compound index — first column uses Dexie, rest filtered in JS |
|
|
68
|
+
| `AND_COMPOUND` | AND whose columns exactly match a compound index `[a+b]` |
|
|
69
|
+
| `OR_MERGE` | OR — each branch runs independently, results are deduplicated |
|
|
70
|
+
| `JOIN_HASH` | Two-table JOIN — left scan + indexed right lookup + JS hash join |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Installation
|
|
75
|
+
|
|
76
|
+
The service is included in the `http-request-manager` library. No extra setup is required beyond the standard module import. `node-sql-parser` is listed as a peer dependency.
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
// app.module.ts
|
|
80
|
+
import { HttpRequestManagerModule } from 'http-request-manager';
|
|
81
|
+
|
|
82
|
+
@NgModule({
|
|
83
|
+
imports: [
|
|
84
|
+
HttpRequestManagerModule.forRoot({ /* ... */ })
|
|
85
|
+
]
|
|
86
|
+
})
|
|
87
|
+
export class AppModule {}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The tables you query must first exist in the DexieJS database. Use `DatabaseManagerService.createDatabaseTable()` to define them before issuing SQL queries.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Quick Start
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
import { Component, inject } from '@angular/core';
|
|
98
|
+
import { DexieSqlService } from 'http-request-manager';
|
|
99
|
+
|
|
100
|
+
@Component({ /* ... */ })
|
|
101
|
+
export class MyComponent {
|
|
102
|
+
private sql = inject(DexieSqlService);
|
|
103
|
+
|
|
104
|
+
loadData() {
|
|
105
|
+
this.sql.query('SELECT * FROM orders WHERE status = "open"')
|
|
106
|
+
.subscribe(rows => console.log(rows));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## API Reference
|
|
114
|
+
|
|
115
|
+
### DexieSqlService
|
|
116
|
+
|
|
117
|
+
#### `query(sql: string, options?: DexieSqlOptions): Observable<any[]>`
|
|
118
|
+
|
|
119
|
+
Executes a SQL SELECT statement against the DexieJS IndexedDB database.
|
|
120
|
+
|
|
121
|
+
| Parameter | Type | Description |
|
|
122
|
+
|---|---|---|
|
|
123
|
+
| `sql` | `string` | MySQL-syntax SELECT statement |
|
|
124
|
+
| `options` | `DexieSqlOptions` | Optional execution options (see below) |
|
|
125
|
+
|
|
126
|
+
Returns an `Observable<any[]>` that:
|
|
127
|
+
- **emits once** with the result array, then completes
|
|
128
|
+
- **errors** with `SqlParseError` if the SQL cannot be parsed
|
|
129
|
+
- **errors** with `SqlValidationError` if columns reference non-indexed fields, tables don't exist, or the query shape is unsupported
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### DexieSqlOptions
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
export interface DexieSqlOptions {
|
|
137
|
+
strict?: boolean;
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
| Option | Default | Description |
|
|
142
|
+
|---|---|---|
|
|
143
|
+
| `strict` | `false` | When `true`, AND queries without a matching compound index throw `SqlValidationError` instead of silently falling back to a JS-side filter |
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
### Error Types
|
|
148
|
+
|
|
149
|
+
Both errors extend `Error` and have a typed `name` property for `instanceof` checks.
|
|
150
|
+
|
|
151
|
+
#### `SqlParseError`
|
|
152
|
+
|
|
153
|
+
Thrown when the SQL string cannot be parsed or is not a SELECT statement.
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
import { SqlParseError } from 'http-request-manager';
|
|
157
|
+
|
|
158
|
+
this.sql.query('DELETE FROM users').subscribe({
|
|
159
|
+
error: err => {
|
|
160
|
+
if (err instanceof SqlParseError) {
|
|
161
|
+
// only SELECT is supported
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
#### `SqlValidationError`
|
|
168
|
+
|
|
169
|
+
Thrown when the query is structurally valid SQL but cannot be executed against the DexieJS schema — for example, a column is not indexed, a table does not exist, or a LIKE pattern starts with `%`.
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
import { SqlValidationError } from 'http-request-manager';
|
|
173
|
+
|
|
174
|
+
this.sql.query('SELECT * FROM orders WHERE note LIKE "%text"').subscribe({
|
|
175
|
+
error: err => {
|
|
176
|
+
if (err instanceof SqlValidationError) {
|
|
177
|
+
// leading-wildcard LIKE is not supported
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## SQL Feature Reference
|
|
186
|
+
|
|
187
|
+
### SELECT & Projection
|
|
188
|
+
|
|
189
|
+
Select all columns or a specific subset.
|
|
190
|
+
|
|
191
|
+
```sql
|
|
192
|
+
-- All columns
|
|
193
|
+
SELECT * FROM orders
|
|
194
|
+
|
|
195
|
+
-- Specific columns only
|
|
196
|
+
SELECT id, name, amount FROM orders
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
When specific columns are listed the result objects contain only those keys.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
### WHERE — Comparison Operators
|
|
204
|
+
|
|
205
|
+
| SQL operator | Dexie method |
|
|
206
|
+
|---|---|
|
|
207
|
+
| `=` | `.equals()` |
|
|
208
|
+
| `!=` / `<>` | `.notEqual()` |
|
|
209
|
+
| `>` | `.above()` |
|
|
210
|
+
| `>=` | `.aboveOrEqual()` |
|
|
211
|
+
| `<` | `.below()` |
|
|
212
|
+
| `<=` | `.belowOrEqual()` |
|
|
213
|
+
|
|
214
|
+
```sql
|
|
215
|
+
SELECT * FROM orders WHERE status = "open"
|
|
216
|
+
SELECT * FROM products WHERE price > 100
|
|
217
|
+
SELECT * FROM users WHERE age >= 18 AND age <= 65
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
### WHERE — IN / NOT IN
|
|
223
|
+
|
|
224
|
+
```sql
|
|
225
|
+
SELECT * FROM orders WHERE status IN ("open", "pending", "processing")
|
|
226
|
+
SELECT * FROM products WHERE category NOT IN ("archived", "hidden")
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Maps to `.anyOf([...])` and `.noneOf([...])` respectively.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
### WHERE — BETWEEN
|
|
234
|
+
|
|
235
|
+
```sql
|
|
236
|
+
SELECT * FROM transactions WHERE amount BETWEEN 50 AND 500
|
|
237
|
+
SELECT * FROM events WHERE timestamp BETWEEN 1700000000 AND 1800000000
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Both bounds are **inclusive**. Maps to `.between(lo, hi, true, true)`.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
### WHERE — LIKE
|
|
245
|
+
|
|
246
|
+
Only **prefix** patterns are supported (`'value%'`). Leading wildcards (`'%value'`) and mid-string wildcards (`'v%lue'`) throw `SqlValidationError`.
|
|
247
|
+
|
|
248
|
+
```sql
|
|
249
|
+
-- Supported: prefix match
|
|
250
|
+
SELECT * FROM users WHERE last_name LIKE "Smi%"
|
|
251
|
+
|
|
252
|
+
-- NOT supported — throws SqlValidationError
|
|
253
|
+
SELECT * FROM users WHERE last_name LIKE "%ith"
|
|
254
|
+
SELECT * FROM users WHERE last_name LIKE "%mit%"
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
A pattern without any `%` is treated as an exact equality match.
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
### AND Conditions
|
|
262
|
+
|
|
263
|
+
Multi-column AND queries are handled in two ways:
|
|
264
|
+
|
|
265
|
+
**1. Compound index match** — if the table has a compound Dexie index matching all the AND columns exactly (e.g. `[status+userId]`), the query uses that index directly with no JS filtering.
|
|
266
|
+
|
|
267
|
+
**2. Pragmatic fallback (default)** — the first column uses Dexie's index; remaining columns are filtered in JavaScript. A `console.warn` is printed suggesting the compound index to add. Enable `strict: true` to throw instead.
|
|
268
|
+
|
|
269
|
+
```sql
|
|
270
|
+
SELECT * FROM orders WHERE status = "open" AND userId = 42
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
### OR Conditions
|
|
276
|
+
|
|
277
|
+
Each OR branch runs as a separate Dexie query. Results are merged and deduplicated by primary key.
|
|
278
|
+
|
|
279
|
+
```sql
|
|
280
|
+
SELECT * FROM orders WHERE status = "open" OR status = "pending"
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
### ORDER BY
|
|
286
|
+
|
|
287
|
+
```sql
|
|
288
|
+
SELECT * FROM orders ORDER BY createdAt DESC
|
|
289
|
+
SELECT * FROM products ORDER BY price ASC
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Sorting is applied in JavaScript after the Dexie fetch. Only a single `ORDER BY` column is supported.
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
### LIMIT & OFFSET
|
|
297
|
+
|
|
298
|
+
```sql
|
|
299
|
+
SELECT * FROM orders LIMIT 10
|
|
300
|
+
SELECT * FROM orders LIMIT 10 OFFSET 20
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
Applied after sorting. `OFFSET` skips the first N rows before applying the limit.
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
### DISTINCT
|
|
308
|
+
|
|
309
|
+
```sql
|
|
310
|
+
SELECT DISTINCT status FROM orders
|
|
311
|
+
SELECT DISTINCT category, brand FROM products
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
Deduplication is performed in JavaScript using `JSON.stringify` on each projected row object.
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
### COUNT(*)
|
|
319
|
+
|
|
320
|
+
Returns a single-element array `[{ count: N }]`.
|
|
321
|
+
|
|
322
|
+
```sql
|
|
323
|
+
SELECT COUNT(*) FROM orders
|
|
324
|
+
SELECT COUNT(*) FROM orders WHERE status = "open"
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
### JOIN (INNER & LEFT)
|
|
330
|
+
|
|
331
|
+
Two-table hash join executed entirely in JavaScript:
|
|
332
|
+
|
|
333
|
+
1. Full scan of the left table
|
|
334
|
+
2. Extract foreign key values
|
|
335
|
+
3. Dexie `.anyOf(ids)` on the right table's join key (must be indexed)
|
|
336
|
+
4. Hash join in memory
|
|
337
|
+
5. Post-join WHERE filters applied
|
|
338
|
+
|
|
339
|
+
```sql
|
|
340
|
+
-- INNER JOIN (excludes left rows with no match)
|
|
341
|
+
SELECT * FROM orders INNER JOIN users ON orders.userId = users.id
|
|
342
|
+
|
|
343
|
+
-- LEFT JOIN (left rows kept even with no matching right row)
|
|
344
|
+
SELECT * FROM orders LEFT JOIN users ON orders.userId = users.id
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
Table aliases are supported:
|
|
348
|
+
|
|
349
|
+
```sql
|
|
350
|
+
SELECT * FROM orders o LEFT JOIN users u ON o.userId = u.id
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
## Execution Plans
|
|
356
|
+
|
|
357
|
+
The planner assigns one of these strategies, visible in the exported `ExecutionPlanType` enum:
|
|
358
|
+
|
|
359
|
+
| Plan | Description |
|
|
360
|
+
|---|---|
|
|
361
|
+
| `SIMPLE` | Single Dexie `.where().op()` or full table scan |
|
|
362
|
+
| `AND_BOUNDED` | First condition indexed, rest JS-filtered |
|
|
363
|
+
| `AND_COMPOUND` | All conditions covered by a compound index |
|
|
364
|
+
| `OR_MERGE` | Multiple independent Dexie queries, deduped |
|
|
365
|
+
| `JOIN_HASH` | Left scan + indexed right `.anyOf()` + JS merge |
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## Constraints & Limitations
|
|
370
|
+
|
|
371
|
+
| Constraint | Detail |
|
|
372
|
+
|---|---|
|
|
373
|
+
| **SELECT only** | INSERT, UPDATE, DELETE are not supported |
|
|
374
|
+
| **One table or two-table JOIN** | Sub-queries are not supported |
|
|
375
|
+
| **Indexed columns only in WHERE** | Only columns registered as Dexie indexes can appear in WHERE or ORDER BY |
|
|
376
|
+
| **Single ORDER BY column** | Only the first `ORDER BY` expression is used |
|
|
377
|
+
| **LIKE leading wildcard** | `'%value'` patterns throw `SqlValidationError` |
|
|
378
|
+
| **IndexedDB one-index limit** | AND without a compound index falls back to JS filtering for columns beyond the first |
|
|
379
|
+
| **MySQL dialect** | The parser uses MySQL syntax; other dialects may work but are not tested |
|
|
380
|
+
|
|
381
|
+
---
|
|
382
|
+
|
|
383
|
+
## Examples
|
|
384
|
+
|
|
385
|
+
### Component injection
|
|
386
|
+
|
|
387
|
+
```typescript
|
|
388
|
+
import { Component, inject } from '@angular/core';
|
|
389
|
+
import { DexieSqlService, SqlParseError, SqlValidationError } from 'http-request-manager';
|
|
390
|
+
|
|
391
|
+
@Component({ /* ... */ })
|
|
392
|
+
export class ExampleComponent {
|
|
393
|
+
private sql = inject(DexieSqlService);
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
### Basic SELECT
|
|
400
|
+
|
|
401
|
+
```typescript
|
|
402
|
+
this.sql.query('SELECT * FROM products')
|
|
403
|
+
.subscribe(rows => console.log(rows));
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
### Filtering with WHERE
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
this.sql.query('SELECT * FROM orders WHERE status = "open"')
|
|
412
|
+
.subscribe(rows => this.openOrders = rows);
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
```typescript
|
|
416
|
+
this.sql.query('SELECT id, name, price FROM products WHERE price > 50')
|
|
417
|
+
.subscribe(rows => this.expensiveProducts = rows);
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
### Multi-column AND
|
|
423
|
+
|
|
424
|
+
```typescript
|
|
425
|
+
// Pragmatic fallback (console.warn printed, no error)
|
|
426
|
+
this.sql.query('SELECT * FROM orders WHERE status = "open" AND userId = 42')
|
|
427
|
+
.subscribe(rows => this.userOrders = rows);
|
|
428
|
+
|
|
429
|
+
// If the table has a compound index [status+userId], no fallback occurs
|
|
430
|
+
this.sql.query(
|
|
431
|
+
'SELECT * FROM orders WHERE status = "open" AND userId = 42',
|
|
432
|
+
{ strict: false }
|
|
433
|
+
).subscribe(rows => this.userOrders = rows);
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
### IN / NOT IN lists
|
|
439
|
+
|
|
440
|
+
```typescript
|
|
441
|
+
this.sql.query('SELECT * FROM orders WHERE status IN ("open", "pending")')
|
|
442
|
+
.subscribe(rows => this.activeOrders = rows);
|
|
443
|
+
|
|
444
|
+
this.sql.query('SELECT * FROM products WHERE category NOT IN ("archived")')
|
|
445
|
+
.subscribe(rows => this.visibleProducts = rows);
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
### BETWEEN range
|
|
451
|
+
|
|
452
|
+
```typescript
|
|
453
|
+
this.sql.query('SELECT * FROM transactions WHERE amount BETWEEN 100 AND 999')
|
|
454
|
+
.subscribe(rows => this.midRangeTransactions = rows);
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
### LIKE prefix search
|
|
460
|
+
|
|
461
|
+
```typescript
|
|
462
|
+
this.sql.query('SELECT * FROM users WHERE last_name LIKE "Smi%"')
|
|
463
|
+
.subscribe(rows => this.smiths = rows);
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
---
|
|
467
|
+
|
|
468
|
+
### OR branching
|
|
469
|
+
|
|
470
|
+
```typescript
|
|
471
|
+
this.sql.query('SELECT * FROM orders WHERE status = "open" OR status = "pending"')
|
|
472
|
+
.subscribe(rows => this.pendingOrders = rows);
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
### ORDER BY + LIMIT
|
|
478
|
+
|
|
479
|
+
```typescript
|
|
480
|
+
this.sql.query('SELECT * FROM orders ORDER BY createdAt DESC LIMIT 5')
|
|
481
|
+
.subscribe(rows => this.latestOrders = rows);
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
### Pagination with OFFSET
|
|
487
|
+
|
|
488
|
+
```typescript
|
|
489
|
+
const page = 2;
|
|
490
|
+
const pageSize = 10;
|
|
491
|
+
|
|
492
|
+
this.sql.query(`SELECT * FROM products ORDER BY name ASC LIMIT ${pageSize} OFFSET ${page * pageSize}`)
|
|
493
|
+
.subscribe(rows => this.pageRows = rows);
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
### DISTINCT rows
|
|
499
|
+
|
|
500
|
+
```typescript
|
|
501
|
+
this.sql.query('SELECT DISTINCT status FROM orders')
|
|
502
|
+
.subscribe(rows => this.statuses = rows.map(r => r['status']));
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
---
|
|
506
|
+
|
|
507
|
+
### COUNT rows
|
|
508
|
+
|
|
509
|
+
```typescript
|
|
510
|
+
this.sql.query('SELECT COUNT(*) FROM orders WHERE status = "open"')
|
|
511
|
+
.subscribe(([result]) => this.openCount = result.count);
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
---
|
|
515
|
+
|
|
516
|
+
### INNER JOIN
|
|
517
|
+
|
|
518
|
+
```typescript
|
|
519
|
+
this.sql.query(
|
|
520
|
+
'SELECT * FROM orders INNER JOIN users ON orders.userId = users.id'
|
|
521
|
+
).subscribe(rows => this.enrichedOrders = rows);
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
---
|
|
525
|
+
|
|
526
|
+
### LEFT JOIN
|
|
527
|
+
|
|
528
|
+
```typescript
|
|
529
|
+
this.sql.query(
|
|
530
|
+
'SELECT * FROM orders LEFT JOIN users ON orders.userId = users.id'
|
|
531
|
+
).subscribe(rows => {
|
|
532
|
+
// rows without a matching user will still appear; user fields will be undefined
|
|
533
|
+
this.allOrders = rows;
|
|
534
|
+
});
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
### Strict mode
|
|
540
|
+
|
|
541
|
+
```typescript
|
|
542
|
+
// Throws SqlValidationError for AND without a compound index
|
|
543
|
+
this.sql.query(
|
|
544
|
+
'SELECT * FROM orders WHERE status = "open" AND amount > 100',
|
|
545
|
+
{ strict: true }
|
|
546
|
+
).subscribe({
|
|
547
|
+
next: rows => this.results = rows,
|
|
548
|
+
error: err => this.error = err.message
|
|
549
|
+
});
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
---
|
|
553
|
+
|
|
554
|
+
### Error handling
|
|
555
|
+
|
|
556
|
+
```typescript
|
|
557
|
+
import { SqlParseError, SqlValidationError } from 'http-request-manager';
|
|
558
|
+
|
|
559
|
+
this.sql.query(this.userInput).subscribe({
|
|
560
|
+
next: rows => {
|
|
561
|
+
this.results = rows;
|
|
562
|
+
this.error = null;
|
|
563
|
+
},
|
|
564
|
+
error: err => {
|
|
565
|
+
if (err instanceof SqlParseError) {
|
|
566
|
+
this.error = `Invalid SQL: ${err.message}`;
|
|
567
|
+
} else if (err instanceof SqlValidationError) {
|
|
568
|
+
this.error = `Query error: ${err.message}`;
|
|
569
|
+
} else {
|
|
570
|
+
this.error = `Unexpected error: ${err.message}`;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
```
|