@nest-omni/core 4.1.3-2 → 4.1.3-22
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 +11 -0
- package/audit/audit.module.js +65 -1
- package/audit/controllers/audit.controller.d.ts +81 -1
- package/audit/controllers/audit.controller.js +67 -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 +38 -0
- package/audit/decorators/audit-operation.decorator.js +42 -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-action-query.dto.d.ts +13 -0
- package/audit/dto/audit-action-query.dto.js +77 -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/index.d.ts +1 -0
- package/audit/dto/index.js +1 -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 +10 -2
- package/audit/entities/entity-audit-log.entity.js +48 -9
- 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 -2
- package/audit/entities/manual-operation-log.entity.js +12 -9
- 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 +29 -6
- package/audit/enums/audit.enums.js +31 -7
- package/audit/examples/decorator-value-mapping.example.d.ts +70 -0
- package/audit/examples/decorator-value-mapping.example.js +414 -0
- package/audit/index.d.ts +5 -1
- package/audit/index.js +38 -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 +16 -0
- package/audit/interceptors/audit.interceptor.js +41 -11
- package/audit/interceptors/index.d.ts +1 -0
- package/audit/interceptors/index.js +1 -0
- package/audit/interfaces/audit.interfaces.d.ts +174 -4
- 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 +106 -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 +273 -5
- package/audit/services/entity-audit.service.js +840 -60
- package/audit/services/index.d.ts +3 -0
- package/audit/services/index.js +3 -0
- package/audit/services/manual-audit-log.service.d.ts +133 -9
- package/audit/services/manual-audit-log.service.js +157 -42
- 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 +20 -0
- package/audit/subscribers/entity-audit.subscriber.js +98 -6
- 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 +87 -2
- package/cache/cache.module.js +84 -11
- package/cache/cache.service.d.ts +143 -3
- package/cache/cache.service.js +173 -4
- 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/entities/index.d.ts +1 -0
- package/cache/entities/index.js +17 -0
- package/cache/entities/typeorm-cache.entity.d.ts +71 -0
- package/cache/entities/typeorm-cache.entity.js +110 -0
- package/cache/examples/basic-usage.d.ts +15 -0
- package/cache/examples/basic-usage.js +62 -8
- package/cache/index.d.ts +2 -1
- package/cache/index.js +28 -2
- 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/index.d.ts +2 -1
- package/cache/providers/index.js +2 -1
- package/cache/providers/lrucache.provider.d.ts +76 -0
- package/cache/providers/lrucache.provider.js +226 -0
- package/cache/providers/redis-cache.provider.d.ts +26 -0
- package/cache/providers/redis-cache.provider.js +29 -0
- package/cache/providers/typeorm-cache.provider.d.ts +211 -0
- package/cache/providers/typeorm-cache.provider.js +483 -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 +143 -0
- package/common/boilerplate.polyfill.js +35 -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/helpers/validation-metadata-helper.d.ts +55 -0
- package/common/helpers/validation-metadata-helper.js +60 -0
- package/common/index.d.ts +1 -0
- package/common/index.js +4 -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 +72 -3
- package/decorators/field.decorators.js +155 -19
- package/decorators/property.decorators.js +1 -0
- package/decorators/public-route.decorator.js +1 -0
- package/decorators/transform.decorators.d.ts +27 -2
- package/decorators/transform.decorators.js +29 -23
- 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/bad-request.filter.js +19 -4
- 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 +54 -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/ip-filter/constants.d.ts +21 -0
- package/ip-filter/constants.js +24 -0
- package/ip-filter/decorators/index.d.ts +1 -0
- package/ip-filter/decorators/index.js +17 -0
- package/ip-filter/decorators/ip-filter.decorator.d.ts +58 -0
- package/ip-filter/decorators/ip-filter.decorator.js +79 -0
- package/ip-filter/guards/index.d.ts +1 -0
- package/ip-filter/guards/index.js +17 -0
- package/ip-filter/guards/ip-filter.guard.d.ts +62 -0
- package/ip-filter/guards/ip-filter.guard.js +174 -0
- package/ip-filter/index.d.ts +7 -0
- package/ip-filter/index.js +23 -0
- package/ip-filter/interfaces/index.d.ts +4 -0
- package/ip-filter/interfaces/index.js +20 -0
- package/ip-filter/interfaces/ip-filter-async-options.interface.d.ts +15 -0
- package/ip-filter/interfaces/ip-filter-async-options.interface.js +2 -0
- package/ip-filter/interfaces/ip-filter-metadata.interface.d.ts +26 -0
- package/ip-filter/interfaces/ip-filter-metadata.interface.js +2 -0
- package/ip-filter/interfaces/ip-filter-options.interface.d.ts +34 -0
- package/ip-filter/interfaces/ip-filter-options.interface.js +2 -0
- package/ip-filter/interfaces/ip-rule.interface.d.ts +36 -0
- package/ip-filter/interfaces/ip-rule.interface.js +2 -0
- package/ip-filter/ip-filter.module.d.ts +55 -0
- package/ip-filter/ip-filter.module.js +105 -0
- package/ip-filter/services/index.d.ts +1 -0
- package/ip-filter/services/index.js +17 -0
- package/ip-filter/services/ip-filter.service.d.ts +92 -0
- package/ip-filter/services/ip-filter.service.js +238 -0
- package/ip-filter/utils/index.d.ts +1 -0
- package/ip-filter/utils/index.js +17 -0
- package/ip-filter/utils/ip-utils.d.ts +61 -0
- package/ip-filter/utils/ip-utils.js +162 -0
- package/package.json +32 -29
- package/providers/context.provider.d.ts +9 -0
- package/providers/context.provider.js +15 -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 +2 -1
- package/setup/bootstrap.setup.js +22 -1
- 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 -18
- 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/cache/providers/memory-cache.provider.d.ts +0 -26
- package/cache/providers/memory-cache.provider.js +0 -171
- 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,21 +21,60 @@ var HttpLoggingService_1;
|
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.HttpLoggingService = void 0;
|
|
23
23
|
const common_1 = require("@nestjs/common");
|
|
24
|
-
const typeorm_1 = require("typeorm");
|
|
25
24
|
const http_log_entity_1 = require("../entities/http-log.entity");
|
|
26
25
|
const request_id_util_1 = require("../utils/request-id.util");
|
|
27
26
|
const context_extractor_util_1 = require("../utils/context-extractor.util");
|
|
28
27
|
const call_stack_extractor_util_1 = require("../utils/call-stack-extractor.util");
|
|
28
|
+
const transaction_1 = require("@nest-omni/transaction");
|
|
29
|
+
/**
|
|
30
|
+
* HTTP日志服务
|
|
31
|
+
* 基于Spring Boot的请求日志记录机制,集成现有的ContextProvider
|
|
32
|
+
* 支持异步批量日志写入以提升性能
|
|
33
|
+
*/
|
|
29
34
|
let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
|
|
30
|
-
constructor(
|
|
31
|
-
this.dataSource = dataSource;
|
|
35
|
+
constructor() {
|
|
32
36
|
this.logger = new common_1.Logger(HttpLoggingService_1.name);
|
|
33
37
|
this.logRepository = null;
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
/** 日志队列 */
|
|
39
|
+
this.logQueue = [];
|
|
40
|
+
/** 默认异步日志配置 */
|
|
41
|
+
this.asyncConfig = {
|
|
42
|
+
batchSize: 50, // 批量写入50条日志
|
|
43
|
+
flushIntervalMs: 5000, // 每5秒刷新一次
|
|
44
|
+
maxRetries: 3, // 失败后最多重试3次
|
|
45
|
+
enabled: true, // 默认启用异步日志
|
|
46
|
+
};
|
|
47
|
+
/** 处理中标志 */
|
|
48
|
+
this.isProcessing = false;
|
|
49
|
+
// 启动定期刷新任务
|
|
50
|
+
if (this.asyncConfig.enabled) {
|
|
51
|
+
this.startFlushTask();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
onModuleDestroy() {
|
|
55
|
+
// 清理定时器
|
|
56
|
+
if (this.flushTimer) {
|
|
57
|
+
clearInterval(this.flushTimer);
|
|
36
58
|
}
|
|
59
|
+
// 刷新剩余日志
|
|
60
|
+
this.flush();
|
|
37
61
|
}
|
|
62
|
+
initRepository(dataSource, tableName) {
|
|
63
|
+
try {
|
|
64
|
+
this.logRepository = (0, transaction_1.getDataSource)(dataSource).getRepository(http_log_entity_1.HttpLogEntity);
|
|
65
|
+
this.logger.log('Database logging initialized');
|
|
66
|
+
return this.logRepository;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
this.logger.error('Failed to initialize database logging', error);
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 记录请求开始
|
|
75
|
+
*/
|
|
38
76
|
logRequestStart(config, loggingOptions, requestId) {
|
|
77
|
+
// 从ContextProvider获取上下文信息
|
|
39
78
|
const context = context_extractor_util_1.ContextExtractor.getHttpContext();
|
|
40
79
|
const actualRequestId = requestId || context.requestId || (0, request_id_util_1.generateRequestId)();
|
|
41
80
|
const { logHeaders = true, logBody = true, sanitizeHeaders = [], } = loggingOptions || {};
|
|
@@ -63,73 +102,96 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
|
|
|
63
102
|
}
|
|
64
103
|
return actualRequestId;
|
|
65
104
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
? this.sanitizeHeaders(response.headers, sanitizeHeaders)
|
|
78
|
-
: undefined,
|
|
79
|
-
body: logBody ? this.sanitizeBody(response.data) : undefined,
|
|
80
|
-
responseSize: JSON.stringify(response.data).length,
|
|
81
|
-
cacheHit,
|
|
82
|
-
circuitBreakerState,
|
|
83
|
-
};
|
|
84
|
-
const logMessage = `HTTP Response [${requestId}]: ${response.status} (${responseTime}ms)${cacheHit ? ' [CACHE HIT]' : ''}`;
|
|
85
|
-
switch ((loggingOptions || {}).logLevel) {
|
|
86
|
-
case 'debug':
|
|
87
|
-
this.logger.debug(logMessage, logData);
|
|
88
|
-
break;
|
|
89
|
-
case 'info':
|
|
90
|
-
default:
|
|
91
|
-
this.logger.log(logMessage, logData);
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
if (databaseLogging && this.logRepository) {
|
|
95
|
-
const callInfo = this.extractCallInfo(decoratorContext, response.config);
|
|
96
|
-
this.saveToDatabase({
|
|
97
|
-
id: requestId,
|
|
105
|
+
/**
|
|
106
|
+
* 记录请求成功响应
|
|
107
|
+
*/
|
|
108
|
+
logRequestSuccess(response_1, startTime_1, requestId_1, loggingOptions_1) {
|
|
109
|
+
return __awaiter(this, arguments, void 0, function* (response, startTime, requestId, loggingOptions, databaseLogging = false, retryRecords, circuitBreakerState, decoratorContext, clientName, callingContext) {
|
|
110
|
+
var _a, _b, _c, _d;
|
|
111
|
+
const { logHeaders = true, logBody = true, sanitizeHeaders = [], } = loggingOptions || {};
|
|
112
|
+
const responseTime = Date.now() - startTime;
|
|
113
|
+
// 获取当前上下文信息
|
|
114
|
+
const context = context_extractor_util_1.ContextExtractor.getHttpContext();
|
|
115
|
+
const logData = {
|
|
98
116
|
requestId,
|
|
99
117
|
userId: context.userId,
|
|
100
|
-
method: ((_a = response.config.method) === null || _a === void 0 ? void 0 : _a.toUpperCase()) || 'UNKNOWN',
|
|
101
|
-
url: response.config.url || '',
|
|
102
|
-
headers: this.sanitizeHeaders(response.config.headers, sanitizeHeaders),
|
|
103
|
-
body: this.sanitizeBodyAsString(response.config.data),
|
|
104
|
-
params: response.config.params,
|
|
105
118
|
statusCode: response.status,
|
|
106
119
|
responseTime,
|
|
107
|
-
|
|
108
|
-
?
|
|
109
|
-
: 1,
|
|
110
|
-
success: true,
|
|
111
|
-
responseHeaders: this.sanitizeHeaders(response.headers, sanitizeHeaders),
|
|
112
|
-
responseBody: logBody
|
|
113
|
-
? this.sanitizeBodyAsString(response.data)
|
|
120
|
+
headers: logHeaders
|
|
121
|
+
? this.sanitizeHeaders(response.headers, sanitizeHeaders)
|
|
114
122
|
: undefined,
|
|
123
|
+
body: logBody ? this.sanitizeBody(response.data) : undefined,
|
|
115
124
|
responseSize: JSON.stringify(response.data).length,
|
|
116
|
-
requestSize: JSON.stringify(response.config.data).length,
|
|
117
|
-
serviceName: context.appId,
|
|
118
|
-
operationName: callInfo.operationName,
|
|
119
|
-
clientIp: context.clientIp,
|
|
120
|
-
source: (_b = context.metadata) === null || _b === void 0 ? void 0 : _b.source,
|
|
121
|
-
tags: context.tags,
|
|
122
|
-
metadata: logData,
|
|
123
|
-
retryRecords,
|
|
124
|
-
cacheHit,
|
|
125
125
|
circuitBreakerState,
|
|
126
|
-
}
|
|
127
|
-
|
|
126
|
+
};
|
|
127
|
+
const logMessage = `HTTP Response [${requestId}]: ${response.status} (${responseTime}ms)`;
|
|
128
|
+
switch ((loggingOptions || {}).logLevel) {
|
|
129
|
+
case 'debug':
|
|
130
|
+
this.logger.debug(logMessage, logData);
|
|
131
|
+
break;
|
|
132
|
+
case 'info':
|
|
133
|
+
default:
|
|
134
|
+
this.logger.log(logMessage, logData);
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
if (!this.logRepository) {
|
|
138
|
+
this.logger.debug('Initializing log repository', {
|
|
139
|
+
dataSource: (_a = loggingOptions.databaseLogging) === null || _a === void 0 ? void 0 : _a.dataSource,
|
|
140
|
+
tableName: (_b = loggingOptions.databaseLogging) === null || _b === void 0 ? void 0 : _b.tableName,
|
|
141
|
+
});
|
|
142
|
+
this.initRepository(loggingOptions.databaseLogging.dataSource, loggingOptions.databaseLogging.tableName);
|
|
143
|
+
}
|
|
144
|
+
// 数据库日志记录
|
|
145
|
+
if (databaseLogging && this.logRepository) {
|
|
146
|
+
this.logger.log('Database logging conditions met, saving to database');
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
this.logger.warn(`Database logging conditions NOT met: databaseLogging=${databaseLogging}, hasRepository=${!!this.logRepository}, type=${typeof this.logRepository}`);
|
|
150
|
+
}
|
|
151
|
+
if (databaseLogging && this.logRepository) {
|
|
152
|
+
// 提取调用信息
|
|
153
|
+
const callInfo = callingContext && callingContext.operationName
|
|
154
|
+
? callingContext
|
|
155
|
+
: this.extractCallInfo(decoratorContext, response.config);
|
|
156
|
+
this.saveToDatabase({
|
|
157
|
+
id: requestId,
|
|
158
|
+
requestId,
|
|
159
|
+
userId: context.userId,
|
|
160
|
+
method: ((_c = response.config.method) === null || _c === void 0 ? void 0 : _c.toUpperCase()) || 'UNKNOWN',
|
|
161
|
+
url: this.getFullUrl(response.config) || '',
|
|
162
|
+
headers: this.sanitizeHeaders(response.config.headers, sanitizeHeaders),
|
|
163
|
+
body: this.sanitizeBodyAsString(response.config.data),
|
|
164
|
+
params: response.config.params,
|
|
165
|
+
statusCode: response.status,
|
|
166
|
+
responseTime,
|
|
167
|
+
attemptCount: (retryRecords === null || retryRecords === void 0 ? void 0 : retryRecords.length)
|
|
168
|
+
? Math.max(...retryRecords.map((r) => r.attempt)) + 1
|
|
169
|
+
: 1,
|
|
170
|
+
success: true,
|
|
171
|
+
responseHeaders: this.sanitizeHeaders(response.headers, sanitizeHeaders),
|
|
172
|
+
responseBody: logBody
|
|
173
|
+
? this.sanitizeBodyAsString(response.data)
|
|
174
|
+
: undefined,
|
|
175
|
+
serviceName: clientName || context.appId,
|
|
176
|
+
operationName: callInfo.operationName,
|
|
177
|
+
clientIp: context.clientIp,
|
|
178
|
+
source: (_d = context.metadata) === null || _d === void 0 ? void 0 : _d.source,
|
|
179
|
+
tags: context.tags,
|
|
180
|
+
metadata: logData,
|
|
181
|
+
retryRecords,
|
|
182
|
+
circuitBreakerState,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
});
|
|
128
186
|
}
|
|
129
|
-
|
|
130
|
-
|
|
187
|
+
/**
|
|
188
|
+
* 记录请求错误
|
|
189
|
+
*/
|
|
190
|
+
logRequestError(error, startTime, requestId, attemptCount, loggingOptions, databaseLogging = false, retryRecords, circuitBreakerState, decoratorContext, clientName, callingContext) {
|
|
191
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
131
192
|
const { logHeaders = true, sanitizeHeaders = [] } = loggingOptions;
|
|
132
193
|
const responseTime = Date.now() - startTime;
|
|
194
|
+
// 获取当前上下文信息
|
|
133
195
|
const context = context_extractor_util_1.ContextExtractor.getHttpContext();
|
|
134
196
|
const logData = {
|
|
135
197
|
requestId,
|
|
@@ -160,39 +222,47 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
|
|
|
160
222
|
this.logger.error(logMessage, logData);
|
|
161
223
|
break;
|
|
162
224
|
}
|
|
225
|
+
if (!this.logRepository) {
|
|
226
|
+
this.initRepository(loggingOptions.databaseLogging.dataSource, loggingOptions.databaseLogging.tableName);
|
|
227
|
+
}
|
|
228
|
+
// 数据库日志记录
|
|
163
229
|
if (databaseLogging && this.logRepository) {
|
|
164
|
-
|
|
230
|
+
// 提取调用信息
|
|
231
|
+
const callInfo = callingContext && callingContext.operationName
|
|
232
|
+
? callingContext
|
|
233
|
+
: this.extractCallInfo(decoratorContext, error.config);
|
|
165
234
|
this.saveToDatabase({
|
|
166
235
|
id: requestId,
|
|
167
236
|
requestId,
|
|
168
237
|
userId: context.userId,
|
|
169
238
|
method: ((_d = (_c = error.config) === null || _c === void 0 ? void 0 : _c.method) === null || _d === void 0 ? void 0 : _d.toUpperCase()) || 'UNKNOWN',
|
|
170
|
-
url: (
|
|
171
|
-
headers: ((
|
|
239
|
+
url: this.getFullUrl(error.config) || '',
|
|
240
|
+
headers: ((_e = error.config) === null || _e === void 0 ? void 0 : _e.headers)
|
|
172
241
|
? this.sanitizeHeaders(error.config.headers, sanitizeHeaders)
|
|
173
242
|
: {},
|
|
174
|
-
body: this.sanitizeBodyAsString((
|
|
175
|
-
params: (
|
|
176
|
-
statusCode: (
|
|
243
|
+
body: this.sanitizeBodyAsString((_f = error.config) === null || _f === void 0 ? void 0 : _f.data),
|
|
244
|
+
params: (_g = error.config) === null || _g === void 0 ? void 0 : _g.params,
|
|
245
|
+
statusCode: (_h = error.response) === null || _h === void 0 ? void 0 : _h.status,
|
|
177
246
|
responseTime,
|
|
178
247
|
attemptCount,
|
|
179
248
|
success: false,
|
|
180
249
|
errorMessage: error.message,
|
|
181
250
|
errorStack: error.stack,
|
|
182
251
|
errorCode: error.code,
|
|
183
|
-
|
|
184
|
-
serviceName: context.appId,
|
|
252
|
+
serviceName: clientName || context.appId,
|
|
185
253
|
operationName: callInfo.operationName,
|
|
186
254
|
clientIp: context.clientIp,
|
|
187
|
-
source: (
|
|
255
|
+
source: (_j = context.metadata) === null || _j === void 0 ? void 0 : _j.source,
|
|
188
256
|
tags: context.tags,
|
|
189
257
|
metadata: logData,
|
|
190
258
|
retryRecords,
|
|
191
|
-
cacheHit,
|
|
192
259
|
circuitBreakerState,
|
|
193
260
|
});
|
|
194
261
|
}
|
|
195
262
|
}
|
|
263
|
+
/**
|
|
264
|
+
* 查询请求日志
|
|
265
|
+
*/
|
|
196
266
|
findLogs(options) {
|
|
197
267
|
return __awaiter(this, void 0, void 0, function* () {
|
|
198
268
|
if (!this.logRepository) {
|
|
@@ -243,6 +313,9 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
|
|
|
243
313
|
return queryBuilder.getMany();
|
|
244
314
|
});
|
|
245
315
|
}
|
|
316
|
+
/**
|
|
317
|
+
* 获取请求统计信息
|
|
318
|
+
*/
|
|
246
319
|
getStatistics(options) {
|
|
247
320
|
return __awaiter(this, void 0, void 0, function* () {
|
|
248
321
|
if (!this.logRepository) {
|
|
@@ -272,12 +345,14 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
|
|
|
272
345
|
.clone()
|
|
273
346
|
.select('AVG(log.responseTime)', 'avg')
|
|
274
347
|
.getRawOne();
|
|
348
|
+
// 按状态码统计
|
|
275
349
|
const statusStats = yield queryBuilder
|
|
276
350
|
.clone()
|
|
277
351
|
.select('log.statusCode', 'statusCode')
|
|
278
352
|
.addSelect('COUNT(*)', 'count')
|
|
279
353
|
.groupBy('log.statusCode')
|
|
280
354
|
.getRawMany();
|
|
355
|
+
// 按方法统计
|
|
281
356
|
const methodStats = yield queryBuilder
|
|
282
357
|
.clone()
|
|
283
358
|
.select('log.method', 'method')
|
|
@@ -301,18 +376,11 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
|
|
|
301
376
|
};
|
|
302
377
|
});
|
|
303
378
|
}
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
this.logRepository = this.dataSource.getRepository(http_log_entity_1.HttpLogEntity);
|
|
308
|
-
this.logger.log('Database logging initialized');
|
|
309
|
-
}
|
|
310
|
-
catch (error) {
|
|
311
|
-
this.logger.error('Failed to initialize database logging', error);
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
}
|
|
379
|
+
/**
|
|
380
|
+
* 提取调用信息
|
|
381
|
+
*/
|
|
315
382
|
extractCallInfo(decoratorContext, config) {
|
|
383
|
+
// 优先使用装饰器配置的调用信息
|
|
316
384
|
if (decoratorContext) {
|
|
317
385
|
const decoratorInfo = call_stack_extractor_util_1.CallStackExtractor.extractFromDecorator(decoratorContext.target, decoratorContext.propertyKey);
|
|
318
386
|
if (decoratorInfo.serviceClass && decoratorInfo.methodName) {
|
|
@@ -321,18 +389,21 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
|
|
|
321
389
|
};
|
|
322
390
|
}
|
|
323
391
|
}
|
|
392
|
+
// 然后尝试手动设置的调用信息
|
|
324
393
|
const manualInfo = call_stack_extractor_util_1.CallStackExtractor.getManualCallInfo();
|
|
325
394
|
if (manualInfo) {
|
|
326
395
|
return {
|
|
327
396
|
operationName: manualInfo.operationName,
|
|
328
397
|
};
|
|
329
398
|
}
|
|
399
|
+
// 最后尝试从调用栈自动提取
|
|
330
400
|
const stackInfo = call_stack_extractor_util_1.CallStackExtractor.getCallInfo();
|
|
331
401
|
if (stackInfo.serviceClass && stackInfo.methodName) {
|
|
332
402
|
return {
|
|
333
403
|
operationName: stackInfo.operationName,
|
|
334
404
|
};
|
|
335
405
|
}
|
|
406
|
+
// 如果都无法获取,根据URL生成操作名称
|
|
336
407
|
if (config === null || config === void 0 ? void 0 : config.url) {
|
|
337
408
|
const pathParts = config.url
|
|
338
409
|
.split('/')
|
|
@@ -346,18 +417,174 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
|
|
|
346
417
|
}
|
|
347
418
|
return {};
|
|
348
419
|
}
|
|
420
|
+
/**
|
|
421
|
+
* 保存到数据库
|
|
422
|
+
* 如果启用异步日志,将日志项添加到队列中
|
|
423
|
+
* 否则同步保存到数据库
|
|
424
|
+
*/
|
|
349
425
|
saveToDatabase(logEntity) {
|
|
350
426
|
return __awaiter(this, void 0, void 0, function* () {
|
|
351
|
-
if (!this.logRepository)
|
|
427
|
+
if (!this.logRepository) {
|
|
428
|
+
this.logger.warn('Log repository not initialized, skipping database logging');
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
if (this.asyncConfig.enabled) {
|
|
432
|
+
// 异步模式:添加到队列
|
|
433
|
+
this.logQueue.push({
|
|
434
|
+
logEntity,
|
|
435
|
+
attempt: 0,
|
|
436
|
+
});
|
|
437
|
+
// 如果队列达到批量大小,立即刷新
|
|
438
|
+
if (this.logQueue.length >= this.asyncConfig.batchSize) {
|
|
439
|
+
setImmediate(() => this.flush());
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
// 同步模式:直接保存
|
|
444
|
+
yield this.saveLogToDatabase(logEntity);
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* 启动定期刷新任务
|
|
450
|
+
*/
|
|
451
|
+
startFlushTask() {
|
|
452
|
+
this.flushTimer = setInterval(() => {
|
|
453
|
+
this.flush();
|
|
454
|
+
}, this.asyncConfig.flushIntervalMs);
|
|
455
|
+
this.logger.log(`Async log flushing started (interval: ${this.asyncConfig.flushIntervalMs}ms, batchSize: ${this.asyncConfig.batchSize})`);
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* 刷新日志队列到数据库
|
|
459
|
+
*/
|
|
460
|
+
flush() {
|
|
461
|
+
if (this.isProcessing || this.logQueue.length === 0) {
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
this.isProcessing = true;
|
|
465
|
+
// 取出当前批次
|
|
466
|
+
const batch = this.logQueue.splice(0, this.asyncConfig.batchSize);
|
|
467
|
+
// 异步处理
|
|
468
|
+
setImmediate(() => __awaiter(this, void 0, void 0, function* () {
|
|
469
|
+
try {
|
|
470
|
+
// 批量保存
|
|
471
|
+
yield Promise.all(batch.map((item) => this.processLogItem(item)));
|
|
472
|
+
this.logger.debug(`Flushed ${batch.length} log entries to database`);
|
|
473
|
+
// 如果还有剩余日志,继续处理
|
|
474
|
+
if (this.logQueue.length > 0) {
|
|
475
|
+
setImmediate(() => this.flush());
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
catch (error) {
|
|
479
|
+
this.logger.error('Error flushing log queue', error);
|
|
480
|
+
// 将失败的日志重新放回队列(如果还有重试机会)
|
|
481
|
+
batch.forEach((item) => {
|
|
482
|
+
if (item.attempt < this.asyncConfig.maxRetries) {
|
|
483
|
+
item.attempt++;
|
|
484
|
+
this.logQueue.unshift(item); // 放回队列头部
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
this.logger.error(`Log entry exceeded max retries, discarding: ${item.logEntity.requestId}`);
|
|
488
|
+
}
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
finally {
|
|
492
|
+
this.isProcessing = false;
|
|
493
|
+
}
|
|
494
|
+
}));
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* 处理单个日志项
|
|
498
|
+
*/
|
|
499
|
+
processLogItem(item) {
|
|
500
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
501
|
+
if (!this.logRepository) {
|
|
352
502
|
return;
|
|
503
|
+
}
|
|
353
504
|
try {
|
|
354
|
-
yield this.logRepository.save(logEntity);
|
|
505
|
+
yield this.logRepository.save(item.logEntity, { reload: false });
|
|
506
|
+
}
|
|
507
|
+
catch (error) {
|
|
508
|
+
this.logger.error(`Failed to save log entry: ${item.logEntity.requestId}`, error);
|
|
509
|
+
throw error; // 重新抛出错误以便重试
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* 同步保存日志到数据库(用于异步模式内部)
|
|
515
|
+
*/
|
|
516
|
+
saveLogToDatabase(logEntity) {
|
|
517
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
518
|
+
var _a;
|
|
519
|
+
if (!this.logRepository) {
|
|
520
|
+
this.logger.warn('Log repository not initialized, skipping database logging');
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
try {
|
|
524
|
+
this.logger.log('Saving HTTP log to database', {
|
|
525
|
+
requestId: logEntity.requestId,
|
|
526
|
+
circuitBreakerState: logEntity.circuitBreakerState,
|
|
527
|
+
retryRecordsCount: ((_a = logEntity.retryRecords) === null || _a === void 0 ? void 0 : _a.length) || 0,
|
|
528
|
+
});
|
|
529
|
+
yield this.logRepository.save(logEntity, { reload: false });
|
|
530
|
+
this.logger.log('Successfully saved HTTP log to database', {
|
|
531
|
+
requestId: logEntity.requestId,
|
|
532
|
+
circuitBreakerState: logEntity.circuitBreakerState,
|
|
533
|
+
});
|
|
355
534
|
}
|
|
356
535
|
catch (error) {
|
|
357
536
|
this.logger.error('Failed to save HTTP log to database', error);
|
|
537
|
+
this.logger.error('Log entity details', logEntity);
|
|
358
538
|
}
|
|
359
539
|
});
|
|
360
540
|
}
|
|
541
|
+
/**
|
|
542
|
+
* 获取日志队列统计信息
|
|
543
|
+
*/
|
|
544
|
+
getQueueStats() {
|
|
545
|
+
return {
|
|
546
|
+
queueSize: this.logQueue.length,
|
|
547
|
+
isProcessing: this.isProcessing,
|
|
548
|
+
config: Object.assign({}, this.asyncConfig),
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* 手动刷新日志队列
|
|
553
|
+
*/
|
|
554
|
+
manualFlush() {
|
|
555
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
556
|
+
return new Promise((resolve) => {
|
|
557
|
+
const checkProcessing = () => {
|
|
558
|
+
if (!this.isProcessing) {
|
|
559
|
+
this.flush();
|
|
560
|
+
// 等待刷新完成
|
|
561
|
+
setTimeout(() => resolve(), 100);
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
setTimeout(checkProcessing, 50);
|
|
565
|
+
}
|
|
566
|
+
};
|
|
567
|
+
checkProcessing();
|
|
568
|
+
});
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* 设置异步日志配置
|
|
573
|
+
*/
|
|
574
|
+
setAsyncConfig(config) {
|
|
575
|
+
Object.assign(this.asyncConfig, config);
|
|
576
|
+
// 重启刷新任务
|
|
577
|
+
if (this.flushTimer) {
|
|
578
|
+
clearInterval(this.flushTimer);
|
|
579
|
+
}
|
|
580
|
+
if (this.asyncConfig.enabled) {
|
|
581
|
+
this.startFlushTask();
|
|
582
|
+
}
|
|
583
|
+
this.logger.log(`Async log config updated: ${JSON.stringify(this.asyncConfig)}`);
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* 转换请求体为字符串
|
|
587
|
+
*/
|
|
361
588
|
sanitizeBodyAsString(data) {
|
|
362
589
|
if (!data)
|
|
363
590
|
return undefined;
|
|
@@ -369,6 +596,9 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
|
|
|
369
596
|
? jsonString.substring(0, 5000) + '...'
|
|
370
597
|
: jsonString;
|
|
371
598
|
}
|
|
599
|
+
/**
|
|
600
|
+
* 清理敏感头信息
|
|
601
|
+
*/
|
|
372
602
|
sanitizeHeaders(headers, sanitizeHeaders) {
|
|
373
603
|
if (!headers)
|
|
374
604
|
return {};
|
|
@@ -395,6 +625,9 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
|
|
|
395
625
|
});
|
|
396
626
|
return sanitized;
|
|
397
627
|
}
|
|
628
|
+
/**
|
|
629
|
+
* 清理敏感请求体信息
|
|
630
|
+
*/
|
|
398
631
|
sanitizeBody(body) {
|
|
399
632
|
if (!body)
|
|
400
633
|
return undefined;
|
|
@@ -425,6 +658,9 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
|
|
|
425
658
|
}
|
|
426
659
|
return body;
|
|
427
660
|
}
|
|
661
|
+
/**
|
|
662
|
+
* 递归清理对象中的敏感字段
|
|
663
|
+
*/
|
|
428
664
|
sanitizeObject(obj, sensitiveFields) {
|
|
429
665
|
if (typeof obj !== 'object' || obj === null)
|
|
430
666
|
return;
|
|
@@ -437,9 +673,36 @@ let HttpLoggingService = HttpLoggingService_1 = class HttpLoggingService {
|
|
|
437
673
|
}
|
|
438
674
|
}
|
|
439
675
|
}
|
|
676
|
+
/**
|
|
677
|
+
* 获取完整URL
|
|
678
|
+
* @param config Axios请求配置
|
|
679
|
+
* @returns 完整的URL字符串
|
|
680
|
+
*/
|
|
681
|
+
getFullUrl(config) {
|
|
682
|
+
if (!config)
|
|
683
|
+
return '';
|
|
684
|
+
// 如果已经有完整的URL,直接返回
|
|
685
|
+
if (config.url && config.url.startsWith('http')) {
|
|
686
|
+
return config.url;
|
|
687
|
+
}
|
|
688
|
+
// 获取baseURL
|
|
689
|
+
const baseURL = config.baseURL || '';
|
|
690
|
+
// 获取URL路径
|
|
691
|
+
const urlPath = config.url || '';
|
|
692
|
+
// 如果baseURL为空,直接返回URL路径
|
|
693
|
+
if (!baseURL) {
|
|
694
|
+
return urlPath;
|
|
695
|
+
}
|
|
696
|
+
// 确保baseURL以/结尾,urlPath不以/开头(除非它是绝对路径)
|
|
697
|
+
const normalizedBaseURL = baseURL.endsWith('/') ? baseURL : baseURL + '/';
|
|
698
|
+
const normalizedUrlPath = urlPath.startsWith('/')
|
|
699
|
+
? urlPath.substring(1)
|
|
700
|
+
: urlPath;
|
|
701
|
+
return normalizedBaseURL + normalizedUrlPath;
|
|
702
|
+
}
|
|
440
703
|
};
|
|
441
704
|
exports.HttpLoggingService = HttpLoggingService;
|
|
442
705
|
exports.HttpLoggingService = HttpLoggingService = HttpLoggingService_1 = __decorate([
|
|
443
706
|
(0, common_1.Injectable)(),
|
|
444
|
-
__metadata("design:paramtypes", [
|
|
707
|
+
__metadata("design:paramtypes", [])
|
|
445
708
|
], HttpLoggingService);
|
|
@@ -1,29 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 调用栈提取工具
|
|
3
|
+
* 用于自动提取HTTP请求的调用服务和方法信息
|
|
4
|
+
*/
|
|
1
5
|
export declare class CallStackExtractor {
|
|
6
|
+
/**
|
|
7
|
+
* 存储装饰器上下文(用于传递装饰器信息到HTTP客户端)
|
|
8
|
+
*/
|
|
9
|
+
private static decoratorContext;
|
|
10
|
+
/**
|
|
11
|
+
* 装饰器上下文引用计数,用于处理多个装饰器嵌套的情况
|
|
12
|
+
*/
|
|
13
|
+
private static decoratorContextDepth;
|
|
14
|
+
/**
|
|
15
|
+
* 设置装饰器上下文
|
|
16
|
+
*/
|
|
17
|
+
static setDecoratorContext(context: {
|
|
18
|
+
target: any;
|
|
19
|
+
propertyKey: string;
|
|
20
|
+
}): void;
|
|
21
|
+
/**
|
|
22
|
+
* 获取装饰器上下文
|
|
23
|
+
*/
|
|
24
|
+
static getDecoratorContext(): {
|
|
25
|
+
target: any;
|
|
26
|
+
propertyKey: string;
|
|
27
|
+
} | null;
|
|
28
|
+
/**
|
|
29
|
+
* 清除装饰器上下文
|
|
30
|
+
*/
|
|
31
|
+
static clearDecoratorContext(): void;
|
|
32
|
+
/**
|
|
33
|
+
* 从调用栈中提取服务和方法信息
|
|
34
|
+
*/
|
|
2
35
|
static extractCallInfo(): {
|
|
3
36
|
serviceClass?: string;
|
|
4
37
|
methodName?: string;
|
|
5
38
|
operationName?: string;
|
|
6
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* 手动设置调用信息(当自动检测失败时)
|
|
42
|
+
*/
|
|
7
43
|
static setCallInfo(serviceClass: string, methodName: string, operationName?: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* 获取手动设置的调用信息
|
|
46
|
+
*/
|
|
8
47
|
static getManualCallInfo(): {
|
|
9
48
|
serviceClass?: string;
|
|
10
49
|
methodName?: string;
|
|
11
50
|
operationName?: string;
|
|
12
51
|
} | null;
|
|
52
|
+
/**
|
|
53
|
+
* 清理手动设置的调用信息
|
|
54
|
+
*/
|
|
13
55
|
static clearCallInfo(): void;
|
|
56
|
+
/**
|
|
57
|
+
* 获取调用信息(优先使用手动设置的信息)
|
|
58
|
+
*/
|
|
14
59
|
static getCallInfo(): {
|
|
15
60
|
serviceClass?: string;
|
|
16
61
|
methodName?: string;
|
|
17
62
|
operationName?: string;
|
|
18
63
|
};
|
|
64
|
+
/**
|
|
65
|
+
* 从装饰器中提取调用信息
|
|
66
|
+
*/
|
|
19
67
|
static extractFromDecorator(target: any, propertyKey: string): {
|
|
20
68
|
serviceClass?: string;
|
|
21
69
|
methodName?: string;
|
|
22
70
|
operationName?: string;
|
|
23
71
|
};
|
|
72
|
+
/**
|
|
73
|
+
* 生成操作名称
|
|
74
|
+
*/
|
|
24
75
|
static generateOperationName(serviceClass?: string, methodName?: string, config?: any): string;
|
|
76
|
+
/**
|
|
77
|
+
* 格式化服务类名
|
|
78
|
+
*/
|
|
25
79
|
static formatServiceClass(serviceClass?: string): string;
|
|
80
|
+
/**
|
|
81
|
+
* 格式化方法名
|
|
82
|
+
*/
|
|
26
83
|
static formatMethodName(methodName?: string): string;
|
|
84
|
+
/**
|
|
85
|
+
* 解析调用栈行
|
|
86
|
+
*/
|
|
27
87
|
private static parseStackLine;
|
|
88
|
+
/**
|
|
89
|
+
* 判断是否为内部调用
|
|
90
|
+
*/
|
|
28
91
|
private static isInternalCall;
|
|
29
92
|
}
|