@nest-omni/core 4.1.3-2 → 4.1.3-20
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/audit/audit.module.d.ts +10 -0
- package/audit/audit.module.js +63 -1
- package/audit/controllers/audit.controller.d.ts +88 -0
- package/audit/controllers/audit.controller.js +74 -0
- package/audit/decorators/audit-action.decorator.d.ts +74 -0
- package/audit/decorators/audit-action.decorator.js +42 -0
- package/audit/decorators/audit-controller.decorator.d.ts +9 -1
- package/audit/decorators/audit-controller.decorator.js +11 -2
- package/audit/decorators/audit-operation.decorator.d.ts +45 -0
- package/audit/decorators/audit-operation.decorator.js +49 -0
- package/audit/decorators/entity-audit.decorator.d.ts +85 -1
- package/audit/decorators/entity-audit.decorator.js +153 -3
- package/audit/decorators/index.d.ts +2 -0
- package/audit/decorators/index.js +2 -0
- package/audit/dto/audit-log-query.dto.d.ts +3 -0
- package/audit/dto/audit-log-query.dto.js +3 -0
- package/audit/dto/begin-transaction.dto.d.ts +3 -0
- package/audit/dto/begin-transaction.dto.js +3 -0
- package/audit/dto/compare-entities.dto.d.ts +3 -0
- package/audit/dto/compare-entities.dto.js +3 -0
- package/audit/dto/pre-check-restore.dto.d.ts +3 -0
- package/audit/dto/pre-check-restore.dto.js +3 -0
- package/audit/dto/restore-entity.dto.d.ts +3 -0
- package/audit/dto/restore-entity.dto.js +3 -0
- package/audit/entities/audit-action-summary.entity.d.ts +23 -0
- package/audit/entities/audit-action-summary.entity.js +101 -0
- package/audit/entities/entity-audit-log.entity.d.ts +11 -0
- package/audit/entities/entity-audit-log.entity.js +57 -2
- package/audit/entities/entity-transaction.entity.d.ts +11 -2
- package/audit/entities/entity-transaction.entity.js +42 -3
- package/audit/entities/index.d.ts +3 -0
- package/audit/entities/index.js +3 -0
- package/audit/entities/manual-operation-log.entity.d.ts +4 -0
- package/audit/entities/manual-operation-log.entity.js +12 -1
- package/audit/entities/operation-template.entity.d.ts +4 -0
- package/audit/entities/operation-template.entity.js +4 -0
- package/audit/enums/audit.enums.d.ts +37 -6
- package/audit/enums/audit.enums.js +40 -7
- package/audit/index.d.ts +4 -1
- package/audit/index.js +34 -1
- package/audit/interceptors/audit-action.interceptor.d.ts +38 -0
- package/audit/interceptors/audit-action.interceptor.js +215 -0
- package/audit/interceptors/audit.interceptor.d.ts +15 -0
- package/audit/interceptors/audit.interceptor.js +23 -1
- package/audit/interceptors/index.d.ts +1 -0
- package/audit/interceptors/index.js +1 -0
- package/audit/interfaces/audit.interfaces.d.ts +187 -2
- package/audit/services/audit-action.service.d.ts +141 -0
- package/audit/services/audit-action.service.js +244 -0
- package/audit/services/audit-context.service.d.ts +97 -0
- package/audit/services/audit-context.service.js +185 -0
- package/audit/services/audit-strategy.service.d.ts +6 -0
- package/audit/services/audit-strategy.service.js +13 -0
- package/audit/services/entity-audit.service.d.ts +230 -3
- package/audit/services/entity-audit.service.js +607 -14
- package/audit/services/index.d.ts +3 -0
- package/audit/services/index.js +3 -0
- package/audit/services/manual-audit-log.service.d.ts +134 -9
- package/audit/services/manual-audit-log.service.js +157 -40
- package/audit/services/multi-database.service.d.ts +9 -2
- package/audit/services/multi-database.service.js +9 -21
- package/audit/services/operation-description.service.d.ts +71 -2
- package/audit/services/operation-description.service.js +231 -20
- package/audit/services/transaction-audit.service.d.ts +30 -0
- package/audit/services/transaction-audit.service.js +53 -5
- package/audit/subscribers/entity-audit.subscriber.d.ts +19 -0
- package/audit/subscribers/entity-audit.subscriber.js +76 -1
- package/cache/cache-metrics.service.d.ts +67 -0
- package/cache/cache-metrics.service.js +68 -4
- package/cache/cache-serialization.service.d.ts +31 -0
- package/cache/cache-serialization.service.js +25 -0
- package/cache/cache.constants.d.ts +9 -0
- package/cache/cache.constants.js +9 -0
- package/cache/cache.health.d.ts +26 -0
- package/cache/cache.health.js +30 -0
- package/cache/cache.module.d.ts +82 -2
- package/cache/cache.module.js +76 -5
- package/cache/cache.service.d.ts +140 -0
- package/cache/cache.service.js +169 -0
- package/cache/cache.warmup.service.d.ts +39 -0
- package/cache/cache.warmup.service.js +32 -0
- package/cache/decorators/cache-evict.decorator.d.ts +47 -0
- package/cache/decorators/cache-evict.decorator.js +56 -0
- package/cache/decorators/cache-put.decorator.d.ts +34 -0
- package/cache/decorators/cache-put.decorator.js +39 -0
- package/cache/decorators/cacheable.decorator.d.ts +40 -0
- package/cache/decorators/cacheable.decorator.js +55 -0
- package/cache/dependencies/callback.dependency.d.ts +33 -0
- package/cache/dependencies/callback.dependency.js +39 -1
- package/cache/dependencies/chain.dependency.d.ts +28 -0
- package/cache/dependencies/chain.dependency.js +34 -0
- package/cache/dependencies/db.dependency.d.ts +83 -7
- package/cache/dependencies/db.dependency.js +89 -14
- package/cache/dependencies/file.dependency.d.ts +32 -0
- package/cache/dependencies/file.dependency.js +34 -0
- package/cache/dependencies/tag.dependency.d.ts +75 -4
- package/cache/dependencies/tag.dependency.js +145 -11
- package/cache/dependencies/time.dependency.d.ts +43 -0
- package/cache/dependencies/time.dependency.js +43 -0
- package/cache/examples/basic-usage.d.ts +15 -0
- package/cache/examples/basic-usage.js +62 -8
- package/cache/index.js +9 -0
- package/cache/interfaces/cache-dependency.interface.d.ts +53 -0
- package/cache/interfaces/cache-options.interface.d.ts +89 -0
- package/cache/interfaces/cache-options.interface.js +6 -0
- package/cache/interfaces/cache-provider.interface.d.ts +78 -0
- package/cache/providers/base-cache.provider.d.ts +14 -0
- package/cache/providers/base-cache.provider.js +16 -0
- package/cache/providers/cls-cache.provider.d.ts +20 -0
- package/cache/providers/cls-cache.provider.js +28 -0
- package/cache/providers/memory-cache.provider.d.ts +43 -0
- package/cache/providers/memory-cache.provider.js +66 -0
- package/cache/providers/redis-cache.provider.d.ts +26 -0
- package/cache/providers/redis-cache.provider.js +29 -0
- package/cache/utils/dependency-manager.util.d.ts +52 -0
- package/cache/utils/dependency-manager.util.js +59 -0
- package/cache/utils/key-generator.util.d.ts +42 -0
- package/cache/utils/key-generator.util.js +53 -1
- package/common/abstract.entity.d.ts +14 -0
- package/common/abstract.entity.js +14 -0
- package/common/boilerplate.polyfill.d.ts +142 -0
- package/common/boilerplate.polyfill.js +18 -1
- package/common/dto/dto-container.d.ts +16 -0
- package/common/dto/dto-container.js +20 -0
- package/common/dto/dto-decorators.d.ts +18 -0
- package/common/dto/dto-decorators.js +14 -0
- package/common/dto/dto-extensions.d.ts +11 -0
- package/common/dto/dto-extensions.js +9 -0
- package/common/dto/dto-service-accessor.d.ts +17 -0
- package/common/dto/dto-service-accessor.js +18 -0
- package/common/dto/dto-transformer.d.ts +12 -0
- package/common/dto/dto-transformer.js +9 -0
- package/common/dto/index.js +2 -0
- package/common/examples/paginate-and-map.example.d.ts +6 -0
- package/common/examples/paginate-and-map.example.js +26 -0
- package/common/utils.d.ts +15 -0
- package/common/utils.js +15 -0
- package/constants/language-code.js +1 -0
- package/decorators/field.decorators.d.ts +1 -1
- package/decorators/field.decorators.js +8 -1
- package/decorators/property.decorators.js +1 -0
- package/decorators/public-route.decorator.js +1 -0
- package/decorators/transform.decorators.d.ts +27 -0
- package/decorators/transform.decorators.js +29 -0
- package/decorators/translate.decorator.js +1 -0
- package/decorators/user.decorator.js +1 -0
- package/decorators/validator.decorators.d.ts +8 -18
- package/decorators/validator.decorators.js +22 -190
- package/file-upload/controllers/file-access.controller.d.ts +23 -0
- package/file-upload/controllers/file-access.controller.js +128 -0
- package/file-upload/decorators/column.decorator.d.ts +151 -0
- package/file-upload/decorators/column.decorator.js +273 -0
- package/file-upload/decorators/csv-data.decorator.d.ts +30 -0
- package/file-upload/decorators/csv-data.decorator.js +85 -0
- package/file-upload/decorators/csv-import.decorator.d.ts +34 -0
- package/file-upload/decorators/csv-import.decorator.js +24 -0
- package/file-upload/decorators/examples/column-mapping.example.d.ts +76 -0
- package/file-upload/decorators/examples/column-mapping.example.js +122 -0
- package/file-upload/decorators/excel-data.decorator.d.ts +30 -0
- package/file-upload/decorators/excel-data.decorator.js +85 -0
- package/file-upload/decorators/file-upload.decorator.d.ts +83 -0
- package/file-upload/decorators/file-upload.decorator.js +172 -0
- package/file-upload/decorators/index.d.ts +5 -0
- package/file-upload/decorators/index.js +38 -0
- package/file-upload/decorators/process.decorator.d.ts +40 -0
- package/file-upload/decorators/process.decorator.js +52 -0
- package/file-upload/decorators/validate-data.decorator.d.ts +91 -0
- package/file-upload/decorators/validate-data.decorator.js +39 -0
- package/file-upload/dto/create-file.dto.d.ts +24 -0
- package/file-upload/dto/create-file.dto.js +112 -0
- package/file-upload/dto/find-files.dto.d.ts +15 -0
- package/file-upload/dto/find-files.dto.js +76 -0
- package/file-upload/dto/index.d.ts +4 -0
- package/file-upload/dto/index.js +20 -0
- package/file-upload/dto/pagination.dto.d.ts +7 -0
- package/file-upload/dto/pagination.dto.js +39 -0
- package/file-upload/dto/update-file.dto.d.ts +15 -0
- package/file-upload/dto/update-file.dto.js +67 -0
- package/file-upload/entities/file-metadata.entity.d.ts +25 -0
- package/file-upload/entities/file-metadata.entity.js +76 -0
- package/file-upload/entities/file.entity.d.ts +114 -0
- package/file-upload/entities/file.entity.js +350 -0
- package/file-upload/entities/index.d.ts +2 -0
- package/file-upload/entities/index.js +18 -0
- package/file-upload/enums/file-type.enum.d.ts +72 -0
- package/file-upload/enums/file-type.enum.js +212 -0
- package/file-upload/exceptions/file-upload.exception.d.ts +57 -0
- package/file-upload/exceptions/file-upload.exception.js +120 -0
- package/file-upload/exceptions/index.d.ts +1 -0
- package/file-upload/exceptions/index.js +17 -0
- package/file-upload/file-upload.module.d.ts +89 -0
- package/file-upload/file-upload.module.js +292 -0
- package/file-upload/index.d.ts +37 -0
- package/file-upload/index.js +77 -0
- package/file-upload/interceptors/file-upload.interceptor.d.ts +101 -0
- package/file-upload/interceptors/file-upload.interceptor.js +594 -0
- package/file-upload/interceptors/index.d.ts +1 -0
- package/file-upload/interceptors/index.js +17 -0
- package/file-upload/interfaces/custom-file-type.interface.d.ts +72 -0
- package/file-upload/interfaces/custom-file-type.interface.js +2 -0
- package/file-upload/interfaces/file-buffer.interface.d.ts +72 -0
- package/file-upload/interfaces/file-buffer.interface.js +2 -0
- package/file-upload/interfaces/file-entity.interface.d.ts +142 -0
- package/file-upload/interfaces/file-entity.interface.js +28 -0
- package/file-upload/interfaces/file-metadata.interface.d.ts +21 -0
- package/file-upload/interfaces/file-metadata.interface.js +2 -0
- package/file-upload/interfaces/file-processor.interface.d.ts +93 -0
- package/file-upload/interfaces/file-processor.interface.js +2 -0
- package/file-upload/interfaces/file-upload-options.interface.d.ts +74 -0
- package/file-upload/interfaces/file-upload-options.interface.js +5 -0
- package/file-upload/interfaces/index.d.ts +7 -0
- package/file-upload/interfaces/index.js +24 -0
- package/file-upload/interfaces/processor-options.interface.d.ts +102 -0
- package/file-upload/interfaces/processor-options.interface.js +2 -0
- package/file-upload/interfaces/storage-provider.interface.d.ts +239 -0
- package/file-upload/interfaces/storage-provider.interface.js +2 -0
- package/file-upload/interfaces/upload-options.interface.d.ts +19 -0
- package/file-upload/interfaces/upload-options.interface.js +2 -0
- package/file-upload/processors/csv.processor.d.ts +98 -0
- package/file-upload/processors/csv.processor.js +391 -0
- package/file-upload/processors/excel.processor.d.ts +130 -0
- package/file-upload/processors/excel.processor.js +547 -0
- package/file-upload/processors/image.processor.d.ts +199 -0
- package/file-upload/processors/image.processor.js +377 -0
- package/file-upload/providers/index.d.ts +2 -0
- package/file-upload/providers/index.js +18 -0
- package/file-upload/providers/local-storage.provider.d.ts +98 -0
- package/file-upload/providers/local-storage.provider.js +484 -0
- package/file-upload/providers/s3-storage.provider.d.ts +87 -0
- package/file-upload/providers/s3-storage.provider.js +455 -0
- package/file-upload/services/file-signature-validator.service.d.ts +118 -0
- package/file-upload/services/file-signature-validator.service.js +376 -0
- package/file-upload/services/file.service.d.ts +193 -0
- package/file-upload/services/file.service.js +638 -0
- package/file-upload/services/index.d.ts +4 -0
- package/file-upload/services/index.js +20 -0
- package/file-upload/services/malicious-file-detector.service.d.ts +300 -0
- package/file-upload/services/malicious-file-detector.service.js +1234 -0
- package/file-upload/services/mime-registry.service.d.ts +47 -0
- package/file-upload/services/mime-registry.service.js +167 -0
- package/file-upload/utils/checksum.util.d.ts +28 -0
- package/file-upload/utils/checksum.util.js +65 -0
- package/file-upload/utils/dynamic-import.util.d.ts +54 -0
- package/file-upload/utils/dynamic-import.util.js +156 -0
- package/file-upload/utils/filename.util.d.ts +59 -0
- package/file-upload/utils/filename.util.js +184 -0
- package/file-upload/utils/filepath.util.d.ts +70 -0
- package/file-upload/utils/filepath.util.js +152 -0
- package/file-upload/utils/index.d.ts +4 -0
- package/file-upload/utils/index.js +20 -0
- package/filters/constraint-errors.js +1 -0
- package/helpers/common.helper.d.ts +13 -0
- package/helpers/common.helper.js +13 -0
- package/http-client/config/http-client.config.d.ts +20 -0
- package/http-client/config/http-client.config.js +48 -21
- package/http-client/decorators/http-client.decorators.d.ts +55 -14
- package/http-client/decorators/http-client.decorators.js +154 -78
- package/http-client/entities/http-log.entity.d.ts +217 -8
- package/http-client/entities/http-log.entity.js +7 -22
- package/http-client/errors/http-client.errors.d.ts +57 -0
- package/http-client/errors/http-client.errors.js +58 -0
- package/http-client/examples/advanced-usage.example.d.ts +40 -0
- package/http-client/examples/advanced-usage.example.js +53 -61
- package/http-client/examples/auth-with-waiting-lock.example.d.ts +31 -0
- package/http-client/examples/auth-with-waiting-lock.example.js +52 -5
- package/http-client/examples/basic-usage.example.d.ts +60 -0
- package/http-client/examples/basic-usage.example.js +60 -0
- package/http-client/examples/multi-api-configuration.example.d.ts +60 -0
- package/http-client/examples/multi-api-configuration.example.js +76 -5
- package/http-client/examples/proxy-from-environment.example.d.ts +133 -0
- package/http-client/examples/proxy-from-environment.example.js +409 -0
- package/http-client/http-client.module.d.ts +48 -2
- package/http-client/http-client.module.js +147 -68
- package/http-client/index.d.ts +1 -1
- package/http-client/index.js +8 -0
- package/http-client/interfaces/api-client-config.interface.d.ts +80 -45
- package/http-client/interfaces/api-client-config.interface.js +3 -0
- package/http-client/interfaces/http-client-config.interface.d.ts +109 -52
- package/http-client/services/api-client-registry.service.d.ts +50 -11
- package/http-client/services/api-client-registry.service.js +90 -250
- package/http-client/services/circuit-breaker.service.d.ts +115 -2
- package/http-client/services/circuit-breaker.service.js +237 -7
- package/http-client/services/http-client.service.d.ts +124 -14
- package/http-client/services/http-client.service.js +437 -148
- package/http-client/services/http-log-query.service.d.ts +83 -0
- package/http-client/services/http-log-query.service.js +121 -13
- package/http-client/services/http-replay.service.d.ts +101 -0
- package/http-client/services/http-replay.service.js +86 -0
- package/http-client/services/index.d.ts +0 -1
- package/http-client/services/index.js +0 -1
- package/http-client/services/log-cleanup.service.d.ts +63 -0
- package/http-client/services/log-cleanup.service.js +54 -2
- package/http-client/services/logging.service.d.ts +116 -7
- package/http-client/services/logging.service.js +349 -86
- package/http-client/utils/call-stack-extractor.util.d.ts +63 -0
- package/http-client/utils/call-stack-extractor.util.js +83 -0
- package/http-client/utils/context-extractor.util.d.ts +49 -0
- package/http-client/utils/context-extractor.util.js +52 -0
- package/http-client/utils/curl-generator.util.d.ts +21 -0
- package/http-client/utils/curl-generator.util.js +44 -3
- package/http-client/utils/index.d.ts +1 -0
- package/http-client/utils/index.js +1 -0
- package/http-client/utils/proxy-environment.util.d.ts +42 -0
- package/http-client/utils/proxy-environment.util.js +148 -0
- package/http-client/utils/request-id.util.d.ts +18 -0
- package/http-client/utils/request-id.util.js +20 -0
- package/http-client/utils/retry-recorder.util.d.ts +42 -0
- package/http-client/utils/retry-recorder.util.js +44 -0
- package/http-client/utils/security-validator.util.d.ts +118 -0
- package/http-client/utils/security-validator.util.js +352 -0
- package/index.d.ts +3 -1
- package/index.js +12 -1
- package/interceptors/translation-interceptor.service.js +5 -0
- package/package.json +11 -7
- package/providers/context.provider.js +2 -0
- package/providers/generator.provider.d.ts +4 -0
- package/providers/generator.provider.js +4 -0
- package/redis-lock/comprehensive-lock-cleanup.service.d.ts +94 -0
- package/redis-lock/comprehensive-lock-cleanup.service.js +253 -0
- package/redis-lock/examples/lock-strategy.examples.d.ts +89 -0
- package/redis-lock/examples/lock-strategy.examples.js +130 -15
- package/redis-lock/index.d.ts +2 -0
- package/redis-lock/index.js +8 -1
- package/redis-lock/lock-heartbeat.service.d.ts +80 -0
- package/redis-lock/lock-heartbeat.service.js +232 -0
- package/redis-lock/redis-lock.decorator.d.ts +101 -0
- package/redis-lock/redis-lock.decorator.js +120 -0
- package/redis-lock/redis-lock.module.d.ts +66 -0
- package/redis-lock/redis-lock.module.js +175 -70
- package/redis-lock/redis-lock.service.d.ts +282 -0
- package/redis-lock/redis-lock.service.js +343 -20
- package/setup/bootstrap.setup.d.ts +1 -0
- package/setup/bootstrap.setup.js +21 -0
- package/setup/index.d.ts +1 -0
- package/setup/index.js +1 -0
- package/setup/mode.setup.d.ts +44 -0
- package/setup/mode.setup.js +44 -0
- package/setup/run-in-mode.decorator.d.ts +56 -0
- package/setup/run-in-mode.decorator.js +92 -0
- package/setup/schedule.decorator.d.ts +227 -0
- package/setup/schedule.decorator.js +240 -12
- package/setup/worker.decorator.d.ts +86 -0
- package/setup/worker.decorator.js +97 -0
- package/shared/index.d.ts +1 -1
- package/shared/index.js +1 -1
- package/shared/{serviceRegistryModule.js → service-registry.module.js} +19 -17
- package/shared/services/api-config.service.d.ts +3 -0
- package/shared/services/api-config.service.js +21 -9
- package/shared/services/index.d.ts +0 -1
- package/shared/services/index.js +0 -1
- package/validator-json/decorators.d.ts +17 -0
- package/validator-json/decorators.js +17 -2
- package/validator-json/default.d.ts +6 -0
- package/validator-json/default.js +30 -2
- package/validator-json/defaultConverters.js +1 -0
- package/validator-json/options.d.ts +23 -0
- package/validators/common-validators.d.ts +143 -0
- package/validators/common-validators.js +249 -0
- package/validators/custom-validate.examples.d.ts +23 -0
- package/validators/custom-validate.examples.js +78 -6
- package/validators/custom-validate.validator.d.ts +108 -0
- package/validators/custom-validate.validator.js +85 -0
- package/validators/file-mimetype.validator.d.ts +0 -2
- package/validators/file-mimetype.validator.js +4 -6
- package/validators/index.d.ts +1 -0
- package/validators/index.js +1 -0
- package/validators/is-exists.validator.d.ts +26 -6
- package/validators/is-exists.validator.js +30 -7
- package/validators/is-unique.validator.d.ts +33 -7
- package/validators/is-unique.validator.js +59 -17
- package/validators/skip-empty.validator.d.ts +5 -0
- package/validators/skip-empty.validator.js +5 -0
- package/vault/interfaces/vault-options.interface.d.ts +9 -0
- package/vault/vault-config.loader.d.ts +30 -0
- package/vault/vault-config.loader.js +48 -1
- package/vault/vault-config.service.d.ts +53 -0
- package/vault/vault-config.service.js +57 -0
- package/vault/vault.module.d.ts +4 -0
- package/vault/vault.module.js +4 -0
- package/decorators/examples/validation-decorators.example.d.ts +0 -69
- package/decorators/examples/validation-decorators.example.js +0 -331
- package/http-client/services/cache.service.d.ts +0 -24
- package/http-client/services/cache.service.js +0 -264
- package/shared/services/validator.service.d.ts +0 -3
- package/shared/services/validator.service.js +0 -20
- /package/shared/{serviceRegistryModule.d.ts → service-registry.module.d.ts} +0 -0
|
@@ -21,22 +21,19 @@ var ApiClientRegistryService_1;
|
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.ApiClientRegistryService = exports.AuthType = void 0;
|
|
23
23
|
const common_1 = require("@nestjs/common");
|
|
24
|
-
const axios_1 = require("axios");
|
|
25
|
-
const axios_retry_1 = require("axios-retry");
|
|
26
24
|
const api_client_config_interface_1 = require("../interfaces/api-client-config.interface");
|
|
27
25
|
Object.defineProperty(exports, "AuthType", { enumerable: true, get: function () { return api_client_config_interface_1.AuthType; } });
|
|
28
26
|
const http_client_service_1 = require("./http-client.service");
|
|
29
27
|
const circuit_breaker_service_1 = require("./circuit-breaker.service");
|
|
30
28
|
const logging_service_1 = require("./logging.service");
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
/**
|
|
30
|
+
* API客户端注册服务
|
|
31
|
+
* 负责管理多个 HttpClientService 实例
|
|
32
|
+
*/
|
|
34
33
|
let ApiClientRegistryService = ApiClientRegistryService_1 = class ApiClientRegistryService {
|
|
35
|
-
constructor(
|
|
36
|
-
this.httpClientService = httpClientService;
|
|
34
|
+
constructor(circuitBreakerService, loggingService, globalConfig = {}) {
|
|
37
35
|
this.circuitBreakerService = circuitBreakerService;
|
|
38
36
|
this.loggingService = loggingService;
|
|
39
|
-
this.cacheService = cacheService;
|
|
40
37
|
this.logger = new common_1.Logger(ApiClientRegistryService_1.name);
|
|
41
38
|
this.clients = new Map();
|
|
42
39
|
this.clientConfigs = new Map();
|
|
@@ -60,21 +57,62 @@ let ApiClientRegistryService = ApiClientRegistryService_1 = class ApiClientRegis
|
|
|
60
57
|
maxRecords: 1000000,
|
|
61
58
|
}, enableGlobalRetry: true, enableCircuitBreaker: true }, globalConfig);
|
|
62
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* 创建API客户端实例
|
|
62
|
+
* 使用 HttpClientService.createApiClient 静态方法创建
|
|
63
|
+
*/
|
|
63
64
|
createClient(config) {
|
|
65
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
64
66
|
const clientName = config.name;
|
|
65
67
|
const existingClient = this.clients.get(clientName);
|
|
66
68
|
if (existingClient && !config.override) {
|
|
67
69
|
this.logger.warn(`Client '${clientName}' already exists. Use override: true to replace it.`);
|
|
68
70
|
return existingClient;
|
|
69
71
|
}
|
|
72
|
+
// 合并环境特定配置
|
|
70
73
|
const finalConfig = this.mergeEnvironmentConfig(config);
|
|
71
|
-
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
+
// 使用静态工厂方法创建 HttpClientService 实例
|
|
75
|
+
const httpClient = http_client_service_1.HttpClientService.createApiClient({
|
|
76
|
+
circuitBreakerService: this.circuitBreakerService,
|
|
77
|
+
loggingService: this.loggingService,
|
|
78
|
+
}, {
|
|
79
|
+
name: clientName,
|
|
80
|
+
baseURL: finalConfig.baseURL,
|
|
81
|
+
timeout: ((_a = finalConfig.httpConfig) === null || _a === void 0 ? void 0 : _a.timeout) || 30000,
|
|
82
|
+
httpConfig: Object.assign({ retry: {
|
|
83
|
+
enabled: ((_b = finalConfig.retry) === null || _b === void 0 ? void 0 : _b.enabled) !== false &&
|
|
84
|
+
this.globalDefaults.enableGlobalRetry,
|
|
85
|
+
retries: ((_c = finalConfig.retry) === null || _c === void 0 ? void 0 : _c.retries) ||
|
|
86
|
+
((_e = (_d = this.globalDefaults.globalDefaults) === null || _d === void 0 ? void 0 : _d.retry) === null || _e === void 0 ? void 0 : _e.retries) ||
|
|
87
|
+
3,
|
|
88
|
+
retryDelay: (retryCount) => Math.pow(2, retryCount) * 1000,
|
|
89
|
+
retryCondition: ((_f = finalConfig.retry) === null || _f === void 0 ? void 0 : _f.retryCondition) ||
|
|
90
|
+
((error) => {
|
|
91
|
+
if (!error.response)
|
|
92
|
+
return true;
|
|
93
|
+
const status = error.response.status;
|
|
94
|
+
return status >= 500 || status === 429;
|
|
95
|
+
}),
|
|
96
|
+
shouldResetTimeout: true,
|
|
97
|
+
}, logging: Object.assign({ enabled: true, logRequests: true, logResponses: true, logErrors: true, logHeaders: true, logBody: true, maxBodyLength: 10000, sanitizeHeaders: ['authorization', 'api-key'], logLevel: 'info' }, (_g = this.globalDefaults.globalDefaults) === null || _g === void 0 ? void 0 : _g.logging), circuitBreaker: {
|
|
98
|
+
enabled: this.globalDefaults.enableCircuitBreaker,
|
|
99
|
+
failureThreshold: 5,
|
|
100
|
+
recoveryTimeoutMs: 60000,
|
|
101
|
+
monitoringPeriodMs: 10000,
|
|
102
|
+
minimumThroughputThreshold: 10,
|
|
103
|
+
countHalfOpenCalls: true,
|
|
104
|
+
} }, finalConfig.httpConfig),
|
|
105
|
+
auth: finalConfig.auth,
|
|
106
|
+
});
|
|
107
|
+
// 存储客户端和配置
|
|
108
|
+
this.clients.set(clientName, httpClient);
|
|
74
109
|
this.clientConfigs.set(clientName, finalConfig);
|
|
75
110
|
this.logger.log(`Created API client: ${clientName}`);
|
|
76
|
-
return
|
|
111
|
+
return httpClient;
|
|
77
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* 获取已注册的客户端
|
|
115
|
+
*/
|
|
78
116
|
getClient(name) {
|
|
79
117
|
const client = this.clients.get(name);
|
|
80
118
|
if (!client) {
|
|
@@ -82,9 +120,15 @@ let ApiClientRegistryService = ApiClientRegistryService_1 = class ApiClientRegis
|
|
|
82
120
|
}
|
|
83
121
|
return client;
|
|
84
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* 列出所有已注册的客户端
|
|
125
|
+
*/
|
|
85
126
|
listClients() {
|
|
86
127
|
return Array.from(this.clients.keys());
|
|
87
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* 更新客户端配置
|
|
131
|
+
*/
|
|
88
132
|
updateClient(name, config) {
|
|
89
133
|
const existingConfig = this.clientConfigs.get(name);
|
|
90
134
|
if (!existingConfig) {
|
|
@@ -92,9 +136,13 @@ let ApiClientRegistryService = ApiClientRegistryService_1 = class ApiClientRegis
|
|
|
92
136
|
}
|
|
93
137
|
const updatedConfig = Object.assign(Object.assign({}, existingConfig), config);
|
|
94
138
|
this.clientConfigs.set(name, updatedConfig);
|
|
139
|
+
// 重新创建客户端实例
|
|
95
140
|
this.createClient(Object.assign(Object.assign({}, updatedConfig), { name, override: true }));
|
|
96
141
|
this.logger.log(`Updated API client: ${name}`);
|
|
97
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* 移除客户端
|
|
145
|
+
*/
|
|
98
146
|
removeClient(name) {
|
|
99
147
|
const removed = this.clients.delete(name);
|
|
100
148
|
this.clientConfigs.delete(name);
|
|
@@ -102,9 +150,15 @@ let ApiClientRegistryService = ApiClientRegistryService_1 = class ApiClientRegis
|
|
|
102
150
|
this.logger.log(`Removed API client: ${name}`);
|
|
103
151
|
}
|
|
104
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* 获取客户端配置
|
|
155
|
+
*/
|
|
105
156
|
getClientConfig(name) {
|
|
106
157
|
return this.clientConfigs.get(name);
|
|
107
158
|
}
|
|
159
|
+
/**
|
|
160
|
+
* 获取所有客户端配置
|
|
161
|
+
*/
|
|
108
162
|
getAllClientConfigs() {
|
|
109
163
|
const configs = {};
|
|
110
164
|
this.clientConfigs.forEach((config, name) => {
|
|
@@ -112,6 +166,9 @@ let ApiClientRegistryService = ApiClientRegistryService_1 = class ApiClientRegis
|
|
|
112
166
|
});
|
|
113
167
|
return configs;
|
|
114
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* 批量创建客户端
|
|
171
|
+
*/
|
|
115
172
|
createClients(configs) {
|
|
116
173
|
configs.forEach((config) => {
|
|
117
174
|
try {
|
|
@@ -122,13 +179,22 @@ let ApiClientRegistryService = ApiClientRegistryService_1 = class ApiClientRegis
|
|
|
122
179
|
}
|
|
123
180
|
});
|
|
124
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* 获取全局配置
|
|
184
|
+
*/
|
|
125
185
|
getGlobalConfig() {
|
|
126
186
|
return this.globalDefaults;
|
|
127
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* 更新全局配置
|
|
190
|
+
*/
|
|
128
191
|
updateGlobalConfig(config) {
|
|
129
192
|
Object.assign(this.globalDefaults, config);
|
|
130
193
|
this.logger.log('Global configuration updated');
|
|
131
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* 获取统计信息
|
|
197
|
+
*/
|
|
132
198
|
getAllStats() {
|
|
133
199
|
const stats = {};
|
|
134
200
|
this.clients.forEach((client, name) => {
|
|
@@ -136,17 +202,24 @@ let ApiClientRegistryService = ApiClientRegistryService_1 = class ApiClientRegis
|
|
|
136
202
|
});
|
|
137
203
|
return stats;
|
|
138
204
|
}
|
|
205
|
+
/**
|
|
206
|
+
* 重置所有统计信息
|
|
207
|
+
*/
|
|
139
208
|
resetAllStats() {
|
|
140
209
|
this.clients.forEach((client) => {
|
|
141
210
|
client.resetStats();
|
|
142
211
|
});
|
|
143
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* 健康检查
|
|
215
|
+
*/
|
|
144
216
|
healthCheck() {
|
|
145
217
|
return __awaiter(this, void 0, void 0, function* () {
|
|
146
218
|
const results = {};
|
|
147
219
|
let overallStatus = 'healthy';
|
|
148
220
|
for (const [name, client] of this.clients.entries()) {
|
|
149
221
|
try {
|
|
222
|
+
// 简单的健康检查:尝试获取客户端统计信息
|
|
150
223
|
client.getStats();
|
|
151
224
|
results[name] = { status: 'healthy' };
|
|
152
225
|
}
|
|
@@ -161,156 +234,9 @@ let ApiClientRegistryService = ApiClientRegistryService_1 = class ApiClientRegis
|
|
|
161
234
|
};
|
|
162
235
|
});
|
|
163
236
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
baseURL: config.baseURL,
|
|
168
|
-
timeout: ((_a = config.httpConfig) === null || _a === void 0 ? void 0 : _a.timeout) || 30000,
|
|
169
|
-
headers: Object.assign({ 'Content-Type': 'application/json', 'User-Agent': `${config.name}/1.0.0` }, config.defaultHeaders),
|
|
170
|
-
params: config.defaultParams,
|
|
171
|
-
};
|
|
172
|
-
const instance = axios_1.default.create(axiosConfig);
|
|
173
|
-
const clientName = config.name;
|
|
174
|
-
instance.interceptors.request.use((config) => {
|
|
175
|
-
const authenticatedConfig = config;
|
|
176
|
-
if (config.auth) {
|
|
177
|
-
switch (config.auth.type) {
|
|
178
|
-
case api_client_config_interface_1.AuthType.BEARER_TOKEN:
|
|
179
|
-
const bearerConfig = config.auth.config;
|
|
180
|
-
authenticatedConfig.headers = authenticatedConfig.headers || {};
|
|
181
|
-
authenticatedConfig.headers['Authorization'] =
|
|
182
|
-
`Bearer ${bearerConfig.token}`;
|
|
183
|
-
break;
|
|
184
|
-
case api_client_config_interface_1.AuthType.API_KEY:
|
|
185
|
-
const apiKeyConfig = config.auth.config;
|
|
186
|
-
if (apiKeyConfig.location === 'header') {
|
|
187
|
-
const headerName = apiKeyConfig.name || 'X-API-Key';
|
|
188
|
-
const value = apiKeyConfig.prefix
|
|
189
|
-
? `${apiKeyConfig.prefix} ${apiKeyConfig.key}`
|
|
190
|
-
: apiKeyConfig.key;
|
|
191
|
-
authenticatedConfig.headers = authenticatedConfig.headers || {};
|
|
192
|
-
authenticatedConfig.headers[headerName] = value;
|
|
193
|
-
}
|
|
194
|
-
break;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
const context = context_extractor_util_1.ContextExtractor.getHttpContext();
|
|
198
|
-
const requestId = context.requestId || (0, utils_1.generateRequestId)();
|
|
199
|
-
authenticatedConfig.headers = authenticatedConfig.headers || {};
|
|
200
|
-
authenticatedConfig.headers['X-Request-ID'] = requestId;
|
|
201
|
-
if (context.userId) {
|
|
202
|
-
authenticatedConfig.headers['X-User-ID'] = context.userId;
|
|
203
|
-
}
|
|
204
|
-
authenticatedConfig.headers['X-API-Client'] = clientName;
|
|
205
|
-
return authenticatedConfig;
|
|
206
|
-
}, (error) => {
|
|
207
|
-
this.logger.error(`[${clientName}] Request interceptor error`, error);
|
|
208
|
-
return Promise.reject(error);
|
|
209
|
-
});
|
|
210
|
-
instance.interceptors.response.use((response) => {
|
|
211
|
-
return this.applyResponseTransformer(response, config.responseTransformer);
|
|
212
|
-
}, (error) => {
|
|
213
|
-
var _a;
|
|
214
|
-
if ((_a = config.responseTransformer) === null || _a === void 0 ? void 0 : _a.error) {
|
|
215
|
-
return config.responseTransformer.error(error);
|
|
216
|
-
}
|
|
217
|
-
return Promise.reject(error);
|
|
218
|
-
});
|
|
219
|
-
if (((_b = config.retry) === null || _b === void 0 ? void 0 : _b.enabled) !== false &&
|
|
220
|
-
this.globalDefaults.enableGlobalRetry) {
|
|
221
|
-
(0, axios_retry_1.default)(instance, {
|
|
222
|
-
retries: ((_c = config.retry) === null || _c === void 0 ? void 0 : _c.retries) ||
|
|
223
|
-
((_e = (_d = this.globalDefaults.globalDefaults) === null || _d === void 0 ? void 0 : _d.retry) === null || _e === void 0 ? void 0 : _e.retries) ||
|
|
224
|
-
3,
|
|
225
|
-
retryDelay: (retryCount) => Math.pow(2, retryCount) * 1000,
|
|
226
|
-
retryCondition: ((_f = config.retry) === null || _f === void 0 ? void 0 : _f.retryCondition) ||
|
|
227
|
-
((error) => {
|
|
228
|
-
if (!error.response)
|
|
229
|
-
return true;
|
|
230
|
-
const status = error.response.status;
|
|
231
|
-
return status >= 500 || status === 429;
|
|
232
|
-
}),
|
|
233
|
-
shouldResetTimeout: true,
|
|
234
|
-
onRetry: (retryCount, error, requestConfig) => {
|
|
235
|
-
var _a;
|
|
236
|
-
this.logger.warn(`[${config.name}] Retrying request (attempt ${retryCount}): ${(_a = requestConfig.method) === null || _a === void 0 ? void 0 : _a.toUpperCase()} ${requestConfig.url}`);
|
|
237
|
-
},
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
return instance;
|
|
241
|
-
}
|
|
242
|
-
applyAuthentication(config, auth) {
|
|
243
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
244
|
-
if (!auth) {
|
|
245
|
-
return config;
|
|
246
|
-
}
|
|
247
|
-
const authenticatedConfig = Object.assign({}, config);
|
|
248
|
-
switch (auth.type) {
|
|
249
|
-
case api_client_config_interface_1.AuthType.NONE:
|
|
250
|
-
break;
|
|
251
|
-
case api_client_config_interface_1.AuthType.API_KEY:
|
|
252
|
-
const apiKeyConfig = auth.config;
|
|
253
|
-
if (apiKeyConfig.location === 'header') {
|
|
254
|
-
const headerName = apiKeyConfig.name || 'X-API-Key';
|
|
255
|
-
const value = apiKeyConfig.prefix
|
|
256
|
-
? `${apiKeyConfig.prefix} ${apiKeyConfig.key}`
|
|
257
|
-
: apiKeyConfig.key;
|
|
258
|
-
authenticatedConfig.headers = Object.assign(Object.assign({}, authenticatedConfig.headers), { [headerName]: value });
|
|
259
|
-
}
|
|
260
|
-
else if (apiKeyConfig.location === 'query') {
|
|
261
|
-
const paramName = apiKeyConfig.name || 'api_key';
|
|
262
|
-
authenticatedConfig.params = Object.assign(Object.assign({}, authenticatedConfig.params), { [paramName]: apiKeyConfig.key });
|
|
263
|
-
}
|
|
264
|
-
break;
|
|
265
|
-
case api_client_config_interface_1.AuthType.BEARER_TOKEN:
|
|
266
|
-
const bearerConfig = auth.config;
|
|
267
|
-
const scheme = bearerConfig.scheme || 'Bearer';
|
|
268
|
-
authenticatedConfig.headers = Object.assign(Object.assign({}, authenticatedConfig.headers), { Authorization: `${scheme} ${bearerConfig.token}` });
|
|
269
|
-
break;
|
|
270
|
-
case api_client_config_interface_1.AuthType.BASIC_AUTH:
|
|
271
|
-
const basicConfig = auth.config;
|
|
272
|
-
const credentials = Buffer.from(`${basicConfig.username}:${basicConfig.password}`).toString('base64');
|
|
273
|
-
authenticatedConfig.headers = Object.assign(Object.assign({}, authenticatedConfig.headers), { Authorization: `Basic ${credentials}` });
|
|
274
|
-
break;
|
|
275
|
-
case api_client_config_interface_1.AuthType.OAUTH2:
|
|
276
|
-
const oauthConfig = auth.config;
|
|
277
|
-
authenticatedConfig.headers = Object.assign(Object.assign({}, authenticatedConfig.headers), { Authorization: `Bearer ${oauthConfig.clientSecret}` });
|
|
278
|
-
break;
|
|
279
|
-
case api_client_config_interface_1.AuthType.CUSTOM:
|
|
280
|
-
const customConfig = auth.config;
|
|
281
|
-
return yield customConfig.authenticator(authenticatedConfig);
|
|
282
|
-
}
|
|
283
|
-
return authenticatedConfig;
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
applyResponseTransformer(response, transformer) {
|
|
287
|
-
if (!transformer) {
|
|
288
|
-
return response;
|
|
289
|
-
}
|
|
290
|
-
if (transformer.success) {
|
|
291
|
-
response.data = transformer.success(response);
|
|
292
|
-
}
|
|
293
|
-
if (transformer.dataPath) {
|
|
294
|
-
response.data = this.extractDataByPath(response.data, transformer.dataPath);
|
|
295
|
-
}
|
|
296
|
-
if (transformer.validateResponse && transformer.validator) {
|
|
297
|
-
if (!transformer.validator(response.data)) {
|
|
298
|
-
throw new Error(`Response validation failed for ${transformer.dataPath}`);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
return response;
|
|
302
|
-
}
|
|
303
|
-
extractDataByPath(data, path) {
|
|
304
|
-
const keys = path.split('.');
|
|
305
|
-
let current = data;
|
|
306
|
-
for (const key of keys) {
|
|
307
|
-
if (current === null || current === undefined) {
|
|
308
|
-
return undefined;
|
|
309
|
-
}
|
|
310
|
-
current = current[key];
|
|
311
|
-
}
|
|
312
|
-
return current;
|
|
313
|
-
}
|
|
237
|
+
/**
|
|
238
|
+
* 合并环境特定配置
|
|
239
|
+
*/
|
|
314
240
|
mergeEnvironmentConfig(config) {
|
|
315
241
|
var _a;
|
|
316
242
|
const env = process.env.NODE_ENV || 'development';
|
|
@@ -321,92 +247,6 @@ let ApiClientRegistryService = ApiClientRegistryService_1 = class ApiClientRegis
|
|
|
321
247
|
exports.ApiClientRegistryService = ApiClientRegistryService;
|
|
322
248
|
exports.ApiClientRegistryService = ApiClientRegistryService = ApiClientRegistryService_1 = __decorate([
|
|
323
249
|
(0, common_1.Injectable)(),
|
|
324
|
-
__metadata("design:paramtypes", [
|
|
325
|
-
|
|
326
|
-
logging_service_1.HttpLoggingService,
|
|
327
|
-
cache_service_1.HttpCacheService, Object])
|
|
250
|
+
__metadata("design:paramtypes", [circuit_breaker_service_1.HttpCircuitBreakerService,
|
|
251
|
+
logging_service_1.HttpLoggingService, Object])
|
|
328
252
|
], ApiClientRegistryService);
|
|
329
|
-
class ApiClientInstance {
|
|
330
|
-
constructor(name, config, axiosInstance, httpClientService, loggingService, cacheService) {
|
|
331
|
-
this.name = name;
|
|
332
|
-
this.config = config;
|
|
333
|
-
this.axiosInstance = axiosInstance;
|
|
334
|
-
this.httpClientService = httpClientService;
|
|
335
|
-
this.loggingService = loggingService;
|
|
336
|
-
this.cacheService = cacheService;
|
|
337
|
-
this.stats = {
|
|
338
|
-
totalRequests: 0,
|
|
339
|
-
successfulRequests: 0,
|
|
340
|
-
failedRequests: 0,
|
|
341
|
-
totalResponseTime: 0,
|
|
342
|
-
averageResponseTime: 0,
|
|
343
|
-
};
|
|
344
|
-
}
|
|
345
|
-
get(url, config) {
|
|
346
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
347
|
-
return this.request(Object.assign(Object.assign({}, config), { method: 'GET', url }));
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
post(url, data, config) {
|
|
351
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
352
|
-
return this.request(Object.assign(Object.assign({}, config), { method: 'POST', url, data }));
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
put(url, data, config) {
|
|
356
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
357
|
-
return this.request(Object.assign(Object.assign({}, config), { method: 'PUT', url, data }));
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
patch(url, data, config) {
|
|
361
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
362
|
-
return this.request(Object.assign(Object.assign({}, config), { method: 'PATCH', url, data }));
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
delete(url, config) {
|
|
366
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
367
|
-
return this.request(Object.assign(Object.assign({}, config), { method: 'DELETE', url }));
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
request(config) {
|
|
371
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
372
|
-
const startTime = Date.now();
|
|
373
|
-
this.stats.totalRequests++;
|
|
374
|
-
try {
|
|
375
|
-
const response = yield this.axiosInstance.request(config);
|
|
376
|
-
const responseTime = Date.now() - startTime;
|
|
377
|
-
this.updateStats(true, responseTime);
|
|
378
|
-
return response.data;
|
|
379
|
-
}
|
|
380
|
-
catch (error) {
|
|
381
|
-
const responseTime = Date.now() - startTime;
|
|
382
|
-
this.updateStats(false, responseTime);
|
|
383
|
-
throw error;
|
|
384
|
-
}
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
getStats() {
|
|
388
|
-
return Object.assign({}, this.stats);
|
|
389
|
-
}
|
|
390
|
-
resetStats() {
|
|
391
|
-
this.stats.totalRequests = 0;
|
|
392
|
-
this.stats.successfulRequests = 0;
|
|
393
|
-
this.stats.failedRequests = 0;
|
|
394
|
-
this.stats.totalResponseTime = 0;
|
|
395
|
-
this.stats.averageResponseTime = 0;
|
|
396
|
-
}
|
|
397
|
-
updateStats(success, responseTime) {
|
|
398
|
-
if (success) {
|
|
399
|
-
this.stats.successfulRequests++;
|
|
400
|
-
}
|
|
401
|
-
else {
|
|
402
|
-
this.stats.failedRequests++;
|
|
403
|
-
}
|
|
404
|
-
this.stats.totalResponseTime += responseTime;
|
|
405
|
-
this.stats.averageResponseTime =
|
|
406
|
-
this.stats.totalResponseTime / this.stats.totalRequests;
|
|
407
|
-
if (this.config.responseTimeWarningThreshold &&
|
|
408
|
-
responseTime > this.config.responseTimeWarningThreshold) {
|
|
409
|
-
console.warn(`[API Client ${this.name}] Slow response detected: ${responseTime}ms for ${this.axiosInstance.defaults.baseURL}`);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
}
|
|
@@ -1,13 +1,85 @@
|
|
|
1
1
|
import { Logger } from '@nestjs/common';
|
|
2
2
|
import { CircuitBreakerConfig } from '../interfaces/http-client-config.interface';
|
|
3
|
+
/**
|
|
4
|
+
* Circuit Breaker 清理配置
|
|
5
|
+
*/
|
|
6
|
+
interface CircuitBreakerCleanupConfig {
|
|
7
|
+
/** 最大空闲时间(毫秒),超过此时间未使用的circuit breaker将被清理 */
|
|
8
|
+
maxIdleTimeMs: number;
|
|
9
|
+
/** 清理间隔(毫秒),定期清理的时间间隔 */
|
|
10
|
+
cleanupIntervalMs: number;
|
|
11
|
+
/** 最大circuit breaker数量,超过此数量时触发LRU清理 */
|
|
12
|
+
maxSize: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 熔断器服务
|
|
16
|
+
* 基于Spring Cloud CircuitBreaker的设计理念
|
|
17
|
+
*/
|
|
3
18
|
export declare class HttpCircuitBreakerService {
|
|
4
19
|
private readonly logger;
|
|
5
20
|
private readonly circuitBreakers;
|
|
21
|
+
private cleanupTimer?;
|
|
22
|
+
/** 默认清理配置 */
|
|
23
|
+
private readonly cleanupConfig;
|
|
24
|
+
constructor();
|
|
25
|
+
onModuleDestroy(): void;
|
|
26
|
+
/**
|
|
27
|
+
* 获取或创建熔断器
|
|
28
|
+
*/
|
|
6
29
|
getCircuitBreaker(key: string, config: CircuitBreakerConfig): CircuitBreaker;
|
|
7
|
-
|
|
30
|
+
/**
|
|
31
|
+
* 执行带熔断保护的请求
|
|
32
|
+
*/
|
|
33
|
+
executeWithCircuitBreaker<T>(key: string, requestFn: () => Promise<T>, config: CircuitBreakerConfig, onStateChange?: (state: string) => void): Promise<T>;
|
|
34
|
+
/**
|
|
35
|
+
* 获取熔断器当前状态
|
|
36
|
+
*/
|
|
37
|
+
getCircuitBreakerState(key: string): string | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* 重置所有熔断器
|
|
40
|
+
*/
|
|
8
41
|
resetAll(): void;
|
|
42
|
+
/**
|
|
43
|
+
* 获取所有熔断器状态
|
|
44
|
+
*/
|
|
9
45
|
getAllStates(): Record<string, any>;
|
|
46
|
+
/**
|
|
47
|
+
* 获取Circuit Breaker统计信息
|
|
48
|
+
*/
|
|
49
|
+
getStats(): {
|
|
50
|
+
total: number;
|
|
51
|
+
byState: Record<string, number>;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* 清理空闲的Circuit Breaker
|
|
55
|
+
* 清理超过最大空闲时间的Circuit Breaker
|
|
56
|
+
*/
|
|
57
|
+
cleanupIdle(): number;
|
|
58
|
+
/**
|
|
59
|
+
* 基于LRU策略清理Circuit Breaker
|
|
60
|
+
* 删除最久未访问的Circuit Breaker直到数量降到maxSize以下
|
|
61
|
+
*/
|
|
62
|
+
private cleanupLRU;
|
|
63
|
+
/**
|
|
64
|
+
* 启动定期清理任务
|
|
65
|
+
*/
|
|
66
|
+
private startCleanupTask;
|
|
67
|
+
/**
|
|
68
|
+
* 手动触发清理(用于测试)
|
|
69
|
+
*/
|
|
70
|
+
manualCleanup(): number;
|
|
71
|
+
/**
|
|
72
|
+
* 设置清理配置
|
|
73
|
+
*/
|
|
74
|
+
setCleanupConfig(config: Partial<CircuitBreakerCleanupConfig>): void;
|
|
75
|
+
/**
|
|
76
|
+
* 获取清理配置
|
|
77
|
+
*/
|
|
78
|
+
getCleanupConfig(): CircuitBreakerCleanupConfig;
|
|
10
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* 熔断器类
|
|
82
|
+
*/
|
|
11
83
|
declare class CircuitBreaker {
|
|
12
84
|
private readonly key;
|
|
13
85
|
private readonly config;
|
|
@@ -19,15 +91,56 @@ declare class CircuitBreaker {
|
|
|
19
91
|
private nextAttemptTime;
|
|
20
92
|
private requestCount;
|
|
21
93
|
private windowStartTime;
|
|
94
|
+
private onStateChange?;
|
|
95
|
+
private lastAccessTime;
|
|
22
96
|
constructor(key: string, config: CircuitBreakerConfig, logger: Logger);
|
|
23
|
-
|
|
97
|
+
/**
|
|
98
|
+
* 更新最后访问时间
|
|
99
|
+
*/
|
|
100
|
+
updateLastAccessTime(): void;
|
|
101
|
+
/**
|
|
102
|
+
* 获取最后访问时间
|
|
103
|
+
*/
|
|
104
|
+
getLastAccessTime(): number;
|
|
105
|
+
/**
|
|
106
|
+
* 执行请求
|
|
107
|
+
*/
|
|
108
|
+
execute<T>(requestFn: () => Promise<T>, onStateChange?: (state: string) => void): Promise<T>;
|
|
109
|
+
/**
|
|
110
|
+
* 重置熔断器
|
|
111
|
+
*/
|
|
24
112
|
reset(): void;
|
|
113
|
+
/**
|
|
114
|
+
* 获取熔断器状态
|
|
115
|
+
*/
|
|
25
116
|
getState(): any;
|
|
117
|
+
/**
|
|
118
|
+
* 处理成功请求
|
|
119
|
+
*/
|
|
26
120
|
private onSuccess;
|
|
121
|
+
/**
|
|
122
|
+
* 处理失败请求
|
|
123
|
+
*/
|
|
27
124
|
private onFailure;
|
|
125
|
+
/**
|
|
126
|
+
* 转换到关闭状态
|
|
127
|
+
*/
|
|
28
128
|
private transitionToClosed;
|
|
129
|
+
/**
|
|
130
|
+
* 转换到开启状态
|
|
131
|
+
*/
|
|
29
132
|
private transitionToOpen;
|
|
133
|
+
/**
|
|
134
|
+
* 转换到半开状态
|
|
135
|
+
*/
|
|
30
136
|
private transitionToHalfOpen;
|
|
137
|
+
/**
|
|
138
|
+
* 通知状态变化
|
|
139
|
+
*/
|
|
140
|
+
private notifyStateChange;
|
|
141
|
+
/**
|
|
142
|
+
* 重置监控窗口
|
|
143
|
+
*/
|
|
31
144
|
private resetMonitoringWindow;
|
|
32
145
|
}
|
|
33
146
|
export {};
|