@nest-omni/core 4.1.3-3 → 4.1.3-30
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 +1 -0
- package/audit/audit.module.js +51 -2
- package/audit/controllers/audit.controller.d.ts +57 -1
- package/audit/controllers/audit.controller.js +43 -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 +1 -1
- package/audit/decorators/audit-controller.decorator.js +2 -2
- package/audit/decorators/audit-operation.decorator.d.ts +0 -7
- package/audit/decorators/audit-operation.decorator.js +0 -7
- package/audit/decorators/entity-audit.decorator.d.ts +78 -2
- package/audit/decorators/entity-audit.decorator.js +145 -4
- 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/index.d.ts +1 -0
- package/audit/dto/index.js +1 -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 +7 -2
- package/audit/entities/entity-audit-log.entity.js +45 -9
- package/audit/entities/entity-transaction.entity.d.ts +8 -2
- package/audit/entities/entity-transaction.entity.js +39 -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 +0 -2
- package/audit/entities/manual-operation-log.entity.js +8 -9
- package/audit/enums/audit.enums.d.ts +14 -6
- package/audit/enums/audit.enums.js +18 -9
- 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 +29 -2
- package/audit/interceptors/audit-action.interceptor.d.ts +39 -0
- package/audit/interceptors/audit-action.interceptor.js +217 -0
- package/audit/interceptors/audit.interceptor.d.ts +1 -0
- package/audit/interceptors/audit.interceptor.js +19 -11
- package/audit/interceptors/index.d.ts +1 -0
- package/audit/interceptors/index.js +1 -0
- package/audit/interfaces/audit.interfaces.d.ts +132 -4
- package/audit/services/audit-action.service.d.ts +142 -0
- package/audit/services/audit-action.service.js +246 -0
- package/audit/services/audit-context.service.d.ts +91 -0
- package/audit/services/audit-context.service.js +170 -0
- package/audit/services/entity-audit.service.d.ts +220 -9
- package/audit/services/entity-audit.service.js +761 -72
- package/audit/services/index.d.ts +3 -0
- package/audit/services/index.js +3 -0
- package/audit/services/manual-audit-log.service.d.ts +23 -23
- package/audit/services/manual-audit-log.service.js +34 -57
- package/audit/services/multi-database.service.d.ts +0 -5
- package/audit/services/multi-database.service.js +0 -24
- package/audit/services/operation-description.service.d.ts +14 -3
- package/audit/services/operation-description.service.js +165 -26
- package/audit/services/transaction-audit.service.d.ts +1 -0
- package/audit/services/transaction-audit.service.js +12 -9
- package/audit/subscribers/entity-audit.subscriber.d.ts +5 -0
- package/audit/subscribers/entity-audit.subscriber.js +69 -5
- package/cache/cache.module.d.ts +7 -8
- package/cache/cache.module.js +15 -13
- package/cache/cache.service.d.ts +6 -4
- package/cache/cache.service.js +24 -12
- package/cache/decorators/cache-put.decorator.js +5 -4
- package/cache/dependencies/callback.dependency.js +9 -0
- package/cache/dependencies/db.dependency.d.ts +43 -12
- package/cache/dependencies/db.dependency.js +46 -18
- package/cache/dependencies/tag.dependency.d.ts +31 -4
- package/cache/dependencies/tag.dependency.js +100 -11
- 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/index.d.ts +2 -1
- package/cache/index.js +19 -2
- package/cache/interfaces/cache-options.interface.d.ts +8 -0
- package/cache/providers/index.d.ts +2 -1
- package/cache/providers/index.js +2 -1
- package/cache/providers/lrucache.provider.d.ts +77 -0
- package/cache/providers/lrucache.provider.js +228 -0
- package/cache/providers/redis-cache.provider.d.ts +1 -0
- package/cache/providers/redis-cache.provider.js +8 -6
- package/cache/providers/typeorm-cache.provider.d.ts +211 -0
- package/cache/providers/typeorm-cache.provider.js +483 -0
- package/common/boilerplate.polyfill.d.ts +1 -0
- package/common/boilerplate.polyfill.js +18 -1
- package/common/helpers/validation-metadata-helper.d.ts +112 -0
- package/common/helpers/validation-metadata-helper.js +164 -0
- package/common/index.d.ts +1 -0
- package/common/index.js +4 -0
- package/decorators/examples/field-i18n.example.d.ts +294 -0
- package/decorators/examples/field-i18n.example.js +478 -0
- package/decorators/field.decorators.d.ts +95 -3
- package/decorators/field.decorators.js +152 -18
- package/decorators/transform.decorators.d.ts +0 -2
- package/decorators/transform.decorators.js +0 -23
- package/decorators/translate.decorator.d.ts +26 -0
- package/decorators/translate.decorator.js +26 -1
- package/email-log/email-log.constants.d.ts +8 -0
- package/email-log/email-log.constants.js +11 -0
- package/email-log/email-log.module.d.ts +47 -0
- package/email-log/email-log.module.js +140 -0
- package/email-log/index.d.ts +11 -0
- package/email-log/index.js +48 -0
- package/email-log/interfaces/email-log-options.interface.d.ts +61 -0
- package/email-log/interfaces/email-log-options.interface.js +134 -0
- package/email-log/interfaces/email-log-transport.interface.d.ts +20 -0
- package/email-log/interfaces/email-log-transport.interface.js +2 -0
- package/email-log/interfaces/index.d.ts +2 -0
- package/email-log/interfaces/index.js +18 -0
- package/email-log/providers/email-provider.d.ts +42 -0
- package/email-log/providers/email-provider.js +127 -0
- package/email-log/providers/index.d.ts +1 -0
- package/email-log/providers/index.js +17 -0
- package/email-log/services/email-log-alert.service.d.ts +46 -0
- package/email-log/services/email-log-alert.service.js +162 -0
- package/email-log/services/email-log-formatter.service.d.ts +78 -0
- package/email-log/services/email-log-formatter.service.js +442 -0
- package/email-log/services/email-log-logger.service.d.ts +85 -0
- package/email-log/services/email-log-logger.service.js +168 -0
- package/email-log/services/email-log-rate-limiter.service.d.ts +42 -0
- package/email-log/services/email-log-rate-limiter.service.js +110 -0
- package/email-log/services/email-log-transport.service.d.ts +80 -0
- package/email-log/services/email-log-transport.service.js +271 -0
- package/email-log/services/index.d.ts +5 -0
- package/email-log/services/index.js +21 -0
- package/email-log/transports/index.d.ts +1 -0
- package/email-log/transports/index.js +17 -0
- package/email-log/transports/pino-email.transport.d.ts +56 -0
- package/email-log/transports/pino-email.transport.js +188 -0
- package/email-log/utils/index.d.ts +2 -0
- package/email-log/utils/index.js +18 -0
- package/email-log/utils/log-level.helper.d.ts +46 -0
- package/email-log/utils/log-level.helper.js +74 -0
- package/email-log/utils/pino-transport.utils.d.ts +135 -0
- package/email-log/utils/pino-transport.utils.js +238 -0
- 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.d.ts +9 -0
- package/filters/bad-request.filter.js +57 -16
- package/http-client/config/http-client.config.d.ts +5 -0
- package/http-client/config/http-client.config.js +27 -14
- package/http-client/decorators/http-client.decorators.d.ts +7 -28
- package/http-client/decorators/http-client.decorators.js +124 -99
- package/http-client/entities/http-log.entity.d.ts +0 -20
- package/http-client/entities/http-log.entity.js +1 -21
- package/http-client/examples/advanced-usage.example.d.ts +4 -5
- package/http-client/examples/advanced-usage.example.js +7 -59
- package/http-client/examples/axios-config-extended.example.d.ts +17 -0
- package/http-client/examples/axios-config-extended.example.js +311 -0
- package/http-client/examples/flexible-response-example.d.ts +28 -0
- package/http-client/examples/flexible-response-example.js +120 -0
- package/http-client/examples/index.d.ts +2 -0
- package/http-client/examples/index.js +2 -0
- 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/examples/ssl-certificate.example.d.ts +47 -0
- package/http-client/examples/ssl-certificate.example.js +432 -0
- package/http-client/http-client.module.d.ts +43 -2
- package/http-client/http-client.module.js +150 -90
- package/http-client/index.d.ts +1 -1
- package/http-client/interfaces/api-client-config.interface.d.ts +24 -103
- package/http-client/interfaces/http-client-config.interface.d.ts +137 -62
- package/http-client/services/api-client-registry.service.d.ts +8 -21
- package/http-client/services/api-client-registry.service.js +31 -282
- package/http-client/services/circuit-breaker.service.d.ts +69 -2
- package/http-client/services/circuit-breaker.service.js +185 -7
- package/http-client/services/http-client.service.d.ts +85 -23
- package/http-client/services/http-client.service.js +512 -168
- package/http-client/services/http-log-query.service.js +0 -13
- package/http-client/services/index.d.ts +0 -1
- package/http-client/services/index.js +0 -1
- package/http-client/services/logging.service.d.ts +69 -16
- package/http-client/services/logging.service.js +290 -170
- package/http-client/utils/call-stack-extractor.util.d.ts +26 -0
- package/http-client/utils/call-stack-extractor.util.js +35 -0
- package/http-client/utils/context-extractor.util.d.ts +2 -0
- package/http-client/utils/context-extractor.util.js +17 -3
- package/http-client/utils/curl-generator.util.js +2 -5
- package/http-client/utils/index.d.ts +2 -0
- package/http-client/utils/index.js +2 -0
- package/http-client/utils/proxy-environment.util.d.ts +42 -0
- package/http-client/utils/proxy-environment.util.js +154 -0
- package/http-client/utils/retry-recorder.util.d.ts +0 -4
- package/http-client/utils/retry-recorder.util.js +2 -27
- package/http-client/utils/sanitize.util.d.ts +58 -0
- package/http-client/utils/sanitize.util.js +188 -0
- package/http-client/utils/security-validator.util.d.ts +118 -0
- package/http-client/utils/security-validator.util.js +354 -0
- package/index.d.ts +4 -1
- package/index.js +6 -1
- package/interceptors/translation-interceptor.service.d.ts +7 -0
- package/interceptors/translation-interceptor.service.js +40 -8
- 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 +34 -29
- package/providers/context.provider.d.ts +9 -0
- package/providers/context.provider.js +13 -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/index.d.ts +2 -0
- package/redis-lock/index.js +5 -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.module.d.ts +6 -0
- package/redis-lock/redis-lock.module.js +136 -77
- package/redis-lock/redis-lock.service.d.ts +31 -0
- package/redis-lock/redis-lock.service.js +124 -17
- package/setup/bootstrap.setup.d.ts +2 -1
- package/setup/bootstrap.setup.js +3 -2
- package/setup/index.d.ts +1 -0
- package/setup/index.js +1 -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 +1 -0
- package/setup/schedule.decorator.js +28 -13
- package/setup/worker.decorator.js +10 -1
- package/shared/index.d.ts +1 -1
- package/shared/index.js +1 -1
- package/shared/{serviceRegistryModule.js → service-registry.module.js} +28 -17
- package/shared/services/api-config.service.d.ts +41 -0
- package/shared/services/api-config.service.js +166 -8
- package/shared/services/index.d.ts +0 -1
- package/shared/services/index.js +0 -1
- package/validators/custom-validate.validator.d.ts +1 -0
- package/validators/custom-validate.validator.js +1 -0
- package/validators/file-mimetype.validator.d.ts +0 -2
- package/validators/file-mimetype.validator.js +4 -6
- package/validators/is-exists.validator.d.ts +15 -6
- package/validators/is-exists.validator.js +8 -7
- package/validators/is-unique.validator.d.ts +22 -7
- package/validators/is-unique.validator.js +41 -17
- package/vault/vault-config.service.js +1 -1
- package/cache/providers/memory-cache.provider.d.ts +0 -49
- package/cache/providers/memory-cache.provider.js +0 -197
- package/http-client/services/cache.service.d.ts +0 -76
- package/http-client/services/cache.service.js +0 -333
- 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
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
12
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
13
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
14
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
15
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
16
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
17
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
var LockHeartbeatService_1;
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.LockHeartbeatService = void 0;
|
|
23
|
+
const common_1 = require("@nestjs/common");
|
|
24
|
+
/**
|
|
25
|
+
* Lock heartbeat service
|
|
26
|
+
*
|
|
27
|
+
* Provides heartbeat mechanism for distributed lock instances.
|
|
28
|
+
* Each instance sends periodic heartbeats to Redis to indicate it's alive.
|
|
29
|
+
* Dead instances can be detected by checking if their heartbeat has expired.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* constructor(private heartbeatService: LockHeartbeatService) {}
|
|
34
|
+
*
|
|
35
|
+
* async isInstanceAlive(instanceId: string): Promise<boolean> {
|
|
36
|
+
* return this.heartbeatService.isInstanceAlive(instanceId);
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
let LockHeartbeatService = LockHeartbeatService_1 = class LockHeartbeatService {
|
|
41
|
+
constructor() {
|
|
42
|
+
this.logger = new common_1.Logger(LockHeartbeatService_1.name);
|
|
43
|
+
this.redis = null;
|
|
44
|
+
this.heartbeatTimer = null;
|
|
45
|
+
/**
|
|
46
|
+
* Heartbeat interval in milliseconds
|
|
47
|
+
* @default 5000 (5 seconds) - reduced for faster failure detection
|
|
48
|
+
*/
|
|
49
|
+
this.heartbeatInterval = 5000;
|
|
50
|
+
/**
|
|
51
|
+
* Heartbeat TTL in seconds (3x interval for safety)
|
|
52
|
+
* @default 15 (15 seconds) - adjusted to match new interval
|
|
53
|
+
*/
|
|
54
|
+
this.heartbeatTtl = 15;
|
|
55
|
+
this.instanceId = this.getInstanceId();
|
|
56
|
+
}
|
|
57
|
+
onModuleInit() {
|
|
58
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
if (!this.redis) {
|
|
60
|
+
this.logger.warn('LockHeartbeatService initialized but no Redis client provided. Heartbeat functionality will not work.');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Send initial heartbeat
|
|
64
|
+
yield this.sendHeartbeat();
|
|
65
|
+
// Start periodic heartbeat
|
|
66
|
+
this.heartbeatTimer = setInterval(() => {
|
|
67
|
+
this.sendHeartbeat().catch((error) => {
|
|
68
|
+
this.logger.error('Failed to send heartbeat:', error);
|
|
69
|
+
});
|
|
70
|
+
}, this.heartbeatInterval);
|
|
71
|
+
this.logger.log(`Heartbeat started for instance: ${this.instanceId}`);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
onModuleDestroy() {
|
|
75
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
76
|
+
// Stop heartbeat timer
|
|
77
|
+
if (this.heartbeatTimer) {
|
|
78
|
+
clearInterval(this.heartbeatTimer);
|
|
79
|
+
this.heartbeatTimer = null;
|
|
80
|
+
}
|
|
81
|
+
// Remove heartbeat record
|
|
82
|
+
yield this.removeHeartbeat();
|
|
83
|
+
this.logger.log('Heartbeat stopped');
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Set Redis client (required for dependency injection)
|
|
88
|
+
*/
|
|
89
|
+
setRedisClient(redis) {
|
|
90
|
+
this.redis = redis;
|
|
91
|
+
this.logger.log('Redis client set for LockHeartbeatService');
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Send heartbeat to Redis
|
|
95
|
+
* Stores instance information with TTL
|
|
96
|
+
*/
|
|
97
|
+
sendHeartbeat() {
|
|
98
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
99
|
+
if (!this.redis) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const key = `heartbeat:${this.instanceId}`;
|
|
103
|
+
const data = {
|
|
104
|
+
instanceId: this.instanceId,
|
|
105
|
+
timestamp: Date.now(),
|
|
106
|
+
pid: process.pid,
|
|
107
|
+
};
|
|
108
|
+
try {
|
|
109
|
+
// Set heartbeat with TTL (3x interval for safety)
|
|
110
|
+
yield this.redis.setex(key, this.heartbeatTtl, JSON.stringify(data));
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
this.logger.error('Error sending heartbeat:', error);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Remove heartbeat record from Redis
|
|
119
|
+
*/
|
|
120
|
+
removeHeartbeat() {
|
|
121
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
122
|
+
if (!this.redis) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const key = `heartbeat:${this.instanceId}`;
|
|
126
|
+
try {
|
|
127
|
+
yield this.redis.del(key);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
this.logger.error('Error removing heartbeat:', error);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check if an instance is alive by checking its heartbeat
|
|
136
|
+
*
|
|
137
|
+
* @param instanceId - Instance identifier to check
|
|
138
|
+
* @returns True if instance is alive (heartbeat exists), false otherwise
|
|
139
|
+
*/
|
|
140
|
+
isInstanceAlive(instanceId) {
|
|
141
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
142
|
+
if (!this.redis) {
|
|
143
|
+
this.logger.warn('Redis client not available, cannot check instance status');
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
const key = `heartbeat:${instanceId}`;
|
|
147
|
+
try {
|
|
148
|
+
const exists = yield this.redis.exists(key);
|
|
149
|
+
return exists === 1;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
this.logger.error(`Error checking instance ${instanceId} status:`, error);
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get heartbeat information for an instance
|
|
159
|
+
*
|
|
160
|
+
* @param instanceId - Instance identifier
|
|
161
|
+
* @returns Heartbeat data or null if not found
|
|
162
|
+
*/
|
|
163
|
+
getHeartbeatInfo(instanceId) {
|
|
164
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
165
|
+
if (!this.redis) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
const key = `heartbeat:${instanceId}`;
|
|
169
|
+
try {
|
|
170
|
+
const data = yield this.redis.get(key);
|
|
171
|
+
if (!data) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
return JSON.parse(data);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
this.logger.error(`Error getting heartbeat info for ${instanceId}:`, error);
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get all active instances (with heartbeat)
|
|
184
|
+
*
|
|
185
|
+
* **Note**: Uses SCAN command to avoid blocking Redis in production.
|
|
186
|
+
*
|
|
187
|
+
* @returns Array of instance IDs that are currently alive
|
|
188
|
+
*/
|
|
189
|
+
getActiveInstances() {
|
|
190
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
191
|
+
if (!this.redis) {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
let cursor = '0';
|
|
196
|
+
const pattern = 'heartbeat:*';
|
|
197
|
+
const allKeys = [];
|
|
198
|
+
// Use SCAN to iterate through keys without blocking Redis
|
|
199
|
+
do {
|
|
200
|
+
const [nextCursor, keys] = yield this.redis.scan(cursor, 'MATCH', pattern, 'COUNT', 100);
|
|
201
|
+
cursor = nextCursor;
|
|
202
|
+
allKeys.push(...keys);
|
|
203
|
+
} while (cursor !== '0');
|
|
204
|
+
return allKeys.map((key) => key.replace('heartbeat:', ''));
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
this.logger.error('Error getting active instances:', error);
|
|
208
|
+
return [];
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get current instance ID
|
|
214
|
+
*/
|
|
215
|
+
getInstanceId() {
|
|
216
|
+
// 1. Kubernetes Pod name
|
|
217
|
+
if (process.env.HOSTNAME) {
|
|
218
|
+
return process.env.HOSTNAME;
|
|
219
|
+
}
|
|
220
|
+
// 2. Custom instance ID
|
|
221
|
+
if (process.env.INSTANCE_ID) {
|
|
222
|
+
return process.env.INSTANCE_ID;
|
|
223
|
+
}
|
|
224
|
+
// 3. Generate unique ID
|
|
225
|
+
return `instance-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
exports.LockHeartbeatService = LockHeartbeatService;
|
|
229
|
+
exports.LockHeartbeatService = LockHeartbeatService = LockHeartbeatService_1 = __decorate([
|
|
230
|
+
(0, common_1.Injectable)(),
|
|
231
|
+
__metadata("design:paramtypes", [])
|
|
232
|
+
], LockHeartbeatService);
|
|
@@ -34,6 +34,12 @@ export interface RedisLockModuleOptions {
|
|
|
34
34
|
* Default retry delay in milliseconds
|
|
35
35
|
*/
|
|
36
36
|
defaultRetryDelay?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Enable automatic lock cleanup on startup
|
|
39
|
+
* This includes heartbeat mechanism and comprehensive cleanup
|
|
40
|
+
* @default true
|
|
41
|
+
*/
|
|
42
|
+
enableCleanup?: boolean;
|
|
37
43
|
}
|
|
38
44
|
/**
|
|
39
45
|
* Redis Lock module with distributed locking support
|
|
@@ -13,6 +13,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13
13
|
exports.RedisLockModule = exports.REDIS_LOCK_SERVICE = void 0;
|
|
14
14
|
const common_1 = require("@nestjs/common");
|
|
15
15
|
const redis_lock_service_1 = require("./redis-lock.service");
|
|
16
|
+
const lock_heartbeat_service_1 = require("./lock-heartbeat.service");
|
|
17
|
+
const comprehensive_lock_cleanup_service_1 = require("./comprehensive-lock-cleanup.service");
|
|
16
18
|
const redis_lock_decorator_1 = require("./redis-lock.decorator");
|
|
17
19
|
/**
|
|
18
20
|
* Injection token for Redis Lock Service
|
|
@@ -52,44 +54,68 @@ let RedisLockModule = RedisLockModule_1 = class RedisLockModule {
|
|
|
52
54
|
* Register Redis Lock module with options
|
|
53
55
|
*/
|
|
54
56
|
static forRoot(options) {
|
|
55
|
-
const { isGlobal = true, redisClient, defaultTtl, defaultKeyPrefix, defaultRetryCount, defaultRetryDelay, } = options;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
const { isGlobal = true, redisClient, defaultTtl, defaultKeyPrefix, defaultRetryCount, defaultRetryDelay, enableCleanup = true, } = options;
|
|
58
|
+
const providers = [
|
|
59
|
+
// Redis client provider
|
|
60
|
+
{
|
|
61
|
+
provide: 'REDIS_LOCK_CLIENT',
|
|
62
|
+
useValue: redisClient,
|
|
63
|
+
},
|
|
64
|
+
// Redis Lock Service
|
|
65
|
+
{
|
|
66
|
+
provide: exports.REDIS_LOCK_SERVICE,
|
|
67
|
+
useFactory: () => {
|
|
68
|
+
const service = new redis_lock_service_1.RedisLockService();
|
|
69
|
+
service.setRedisClient(redisClient);
|
|
70
|
+
if (defaultTtl) {
|
|
71
|
+
service.setDefaultTtl(defaultTtl);
|
|
72
|
+
}
|
|
73
|
+
if (defaultKeyPrefix) {
|
|
74
|
+
service.setDefaultKeyPrefix(defaultKeyPrefix);
|
|
75
|
+
}
|
|
76
|
+
if (defaultRetryCount !== undefined) {
|
|
77
|
+
service.setDefaultRetryCount(defaultRetryCount);
|
|
78
|
+
}
|
|
79
|
+
if (defaultRetryDelay !== undefined) {
|
|
80
|
+
service.setDefaultRetryDelay(defaultRetryDelay);
|
|
81
|
+
}
|
|
82
|
+
return service;
|
|
64
83
|
},
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return service;
|
|
84
|
-
},
|
|
84
|
+
},
|
|
85
|
+
// Also provide the service class itself for direct injection
|
|
86
|
+
{
|
|
87
|
+
provide: redis_lock_service_1.RedisLockService,
|
|
88
|
+
useExisting: exports.REDIS_LOCK_SERVICE,
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
const exportsList = [exports.REDIS_LOCK_SERVICE, redis_lock_service_1.RedisLockService];
|
|
92
|
+
// Add cleanup services if enabled
|
|
93
|
+
if (enableCleanup) {
|
|
94
|
+
providers.push(
|
|
95
|
+
// Heartbeat Service
|
|
96
|
+
{
|
|
97
|
+
provide: lock_heartbeat_service_1.LockHeartbeatService,
|
|
98
|
+
useFactory: () => {
|
|
99
|
+
const service = new lock_heartbeat_service_1.LockHeartbeatService();
|
|
100
|
+
service.setRedisClient(redisClient);
|
|
101
|
+
return service;
|
|
85
102
|
},
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
103
|
+
},
|
|
104
|
+
// Comprehensive Cleanup Service
|
|
105
|
+
{
|
|
106
|
+
provide: comprehensive_lock_cleanup_service_1.ComprehensiveLockCleanupService,
|
|
107
|
+
useFactory: (lockService, heartbeatService) => {
|
|
108
|
+
return new comprehensive_lock_cleanup_service_1.ComprehensiveLockCleanupService(lockService, heartbeatService);
|
|
90
109
|
},
|
|
91
|
-
|
|
92
|
-
|
|
110
|
+
inject: [redis_lock_service_1.RedisLockService, lock_heartbeat_service_1.LockHeartbeatService],
|
|
111
|
+
});
|
|
112
|
+
exportsList.push(lock_heartbeat_service_1.LockHeartbeatService, comprehensive_lock_cleanup_service_1.ComprehensiveLockCleanupService);
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
module: RedisLockModule_1,
|
|
116
|
+
global: isGlobal,
|
|
117
|
+
providers,
|
|
118
|
+
exports: exportsList,
|
|
93
119
|
};
|
|
94
120
|
}
|
|
95
121
|
/**
|
|
@@ -97,52 +123,85 @@ let RedisLockModule = RedisLockModule_1 = class RedisLockModule {
|
|
|
97
123
|
*/
|
|
98
124
|
static forRootAsync(options) {
|
|
99
125
|
var _a;
|
|
126
|
+
const providers = [
|
|
127
|
+
// Async options provider
|
|
128
|
+
{
|
|
129
|
+
provide: 'REDIS_LOCK_MODULE_OPTIONS',
|
|
130
|
+
useFactory: options.useFactory,
|
|
131
|
+
inject: options.inject || [],
|
|
132
|
+
},
|
|
133
|
+
// Redis client provider
|
|
134
|
+
{
|
|
135
|
+
provide: 'REDIS_LOCK_CLIENT',
|
|
136
|
+
useFactory: (moduleOptions) => moduleOptions.redisClient,
|
|
137
|
+
inject: ['REDIS_LOCK_MODULE_OPTIONS'],
|
|
138
|
+
},
|
|
139
|
+
// Redis Lock Service
|
|
140
|
+
{
|
|
141
|
+
provide: exports.REDIS_LOCK_SERVICE,
|
|
142
|
+
useFactory: (moduleOptions) => {
|
|
143
|
+
const service = new redis_lock_service_1.RedisLockService();
|
|
144
|
+
service.setRedisClient(moduleOptions.redisClient);
|
|
145
|
+
if (moduleOptions.defaultTtl) {
|
|
146
|
+
service.setDefaultTtl(moduleOptions.defaultTtl);
|
|
147
|
+
}
|
|
148
|
+
if (moduleOptions.defaultKeyPrefix) {
|
|
149
|
+
service.setDefaultKeyPrefix(moduleOptions.defaultKeyPrefix);
|
|
150
|
+
}
|
|
151
|
+
if (moduleOptions.defaultRetryCount !== undefined) {
|
|
152
|
+
service.setDefaultRetryCount(moduleOptions.defaultRetryCount);
|
|
153
|
+
}
|
|
154
|
+
if (moduleOptions.defaultRetryDelay !== undefined) {
|
|
155
|
+
service.setDefaultRetryDelay(moduleOptions.defaultRetryDelay);
|
|
156
|
+
}
|
|
157
|
+
return service;
|
|
158
|
+
},
|
|
159
|
+
inject: ['REDIS_LOCK_MODULE_OPTIONS'],
|
|
160
|
+
},
|
|
161
|
+
// Also provide the service class itself for direct injection
|
|
162
|
+
{
|
|
163
|
+
provide: redis_lock_service_1.RedisLockService,
|
|
164
|
+
useExisting: exports.REDIS_LOCK_SERVICE,
|
|
165
|
+
},
|
|
166
|
+
// Heartbeat Service
|
|
167
|
+
{
|
|
168
|
+
provide: lock_heartbeat_service_1.LockHeartbeatService,
|
|
169
|
+
useFactory: (moduleOptions) => {
|
|
170
|
+
// Only create if cleanup is enabled
|
|
171
|
+
if (moduleOptions.enableCleanup === false) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
const service = new lock_heartbeat_service_1.LockHeartbeatService();
|
|
175
|
+
service.setRedisClient(moduleOptions.redisClient);
|
|
176
|
+
return service;
|
|
177
|
+
},
|
|
178
|
+
inject: ['REDIS_LOCK_MODULE_OPTIONS'],
|
|
179
|
+
},
|
|
180
|
+
// Comprehensive Cleanup Service
|
|
181
|
+
{
|
|
182
|
+
provide: comprehensive_lock_cleanup_service_1.ComprehensiveLockCleanupService,
|
|
183
|
+
useFactory: (moduleOptions, lockService, heartbeatService) => {
|
|
184
|
+
// Only create if cleanup is enabled
|
|
185
|
+
if (moduleOptions.enableCleanup === false) {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
return new comprehensive_lock_cleanup_service_1.ComprehensiveLockCleanupService(lockService, heartbeatService);
|
|
189
|
+
},
|
|
190
|
+
inject: ['REDIS_LOCK_MODULE_OPTIONS', redis_lock_service_1.RedisLockService, lock_heartbeat_service_1.LockHeartbeatService],
|
|
191
|
+
},
|
|
192
|
+
];
|
|
193
|
+
const exportsList = [
|
|
194
|
+
exports.REDIS_LOCK_SERVICE,
|
|
195
|
+
redis_lock_service_1.RedisLockService,
|
|
196
|
+
lock_heartbeat_service_1.LockHeartbeatService,
|
|
197
|
+
comprehensive_lock_cleanup_service_1.ComprehensiveLockCleanupService,
|
|
198
|
+
];
|
|
100
199
|
return {
|
|
101
200
|
module: RedisLockModule_1,
|
|
102
201
|
global: (_a = options.isGlobal) !== null && _a !== void 0 ? _a : true,
|
|
103
202
|
imports: options.imports || [],
|
|
104
|
-
providers
|
|
105
|
-
|
|
106
|
-
{
|
|
107
|
-
provide: 'REDIS_LOCK_MODULE_OPTIONS',
|
|
108
|
-
useFactory: options.useFactory,
|
|
109
|
-
inject: options.inject || [],
|
|
110
|
-
},
|
|
111
|
-
// Redis client provider
|
|
112
|
-
{
|
|
113
|
-
provide: 'REDIS_LOCK_CLIENT',
|
|
114
|
-
useFactory: (moduleOptions) => moduleOptions.redisClient,
|
|
115
|
-
inject: ['REDIS_LOCK_MODULE_OPTIONS'],
|
|
116
|
-
},
|
|
117
|
-
// Redis Lock Service
|
|
118
|
-
{
|
|
119
|
-
provide: exports.REDIS_LOCK_SERVICE,
|
|
120
|
-
useFactory: (moduleOptions) => {
|
|
121
|
-
const service = new redis_lock_service_1.RedisLockService();
|
|
122
|
-
service.setRedisClient(moduleOptions.redisClient);
|
|
123
|
-
if (moduleOptions.defaultTtl) {
|
|
124
|
-
service.setDefaultTtl(moduleOptions.defaultTtl);
|
|
125
|
-
}
|
|
126
|
-
if (moduleOptions.defaultKeyPrefix) {
|
|
127
|
-
service.setDefaultKeyPrefix(moduleOptions.defaultKeyPrefix);
|
|
128
|
-
}
|
|
129
|
-
if (moduleOptions.defaultRetryCount !== undefined) {
|
|
130
|
-
service.setDefaultRetryCount(moduleOptions.defaultRetryCount);
|
|
131
|
-
}
|
|
132
|
-
if (moduleOptions.defaultRetryDelay !== undefined) {
|
|
133
|
-
service.setDefaultRetryDelay(moduleOptions.defaultRetryDelay);
|
|
134
|
-
}
|
|
135
|
-
return service;
|
|
136
|
-
},
|
|
137
|
-
inject: ['REDIS_LOCK_MODULE_OPTIONS'],
|
|
138
|
-
},
|
|
139
|
-
// Also provide the service class itself for direct injection
|
|
140
|
-
{
|
|
141
|
-
provide: redis_lock_service_1.RedisLockService,
|
|
142
|
-
useExisting: exports.REDIS_LOCK_SERVICE,
|
|
143
|
-
},
|
|
144
|
-
],
|
|
145
|
-
exports: [exports.REDIS_LOCK_SERVICE, redis_lock_service_1.RedisLockService],
|
|
203
|
+
providers,
|
|
204
|
+
exports: exportsList,
|
|
146
205
|
};
|
|
147
206
|
}
|
|
148
207
|
onModuleInit() {
|
|
@@ -69,6 +69,24 @@ export interface LockOptions {
|
|
|
69
69
|
* @default 0 (no automatic extension)
|
|
70
70
|
*/
|
|
71
71
|
autoExtend?: number;
|
|
72
|
+
/**
|
|
73
|
+
* Whether to use exponential backoff for retry attempts
|
|
74
|
+
* If true, retry delay will increase exponentially: retryDelay * 2^(attempt-1)
|
|
75
|
+
* @default false
|
|
76
|
+
*/
|
|
77
|
+
useExponentialBackoff?: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Maximum retry delay in milliseconds when using exponential backoff
|
|
80
|
+
* Ensures retry delay doesn't grow indefinitely
|
|
81
|
+
* @default 60000 (60 seconds)
|
|
82
|
+
*/
|
|
83
|
+
maxRetryDelay?: number;
|
|
84
|
+
/**
|
|
85
|
+
* Random jitter to add to retry delay in milliseconds
|
|
86
|
+
* Helps prevent synchronized retries across multiple instances
|
|
87
|
+
* @default 0 (no jitter)
|
|
88
|
+
*/
|
|
89
|
+
retryJitter?: number;
|
|
72
90
|
}
|
|
73
91
|
export interface LockResult {
|
|
74
92
|
/**
|
|
@@ -116,6 +134,7 @@ export declare class RedisLockService implements OnModuleInit {
|
|
|
116
134
|
private static globalInstance;
|
|
117
135
|
private readonly logger;
|
|
118
136
|
private redis;
|
|
137
|
+
private instanceId;
|
|
119
138
|
private readonly defaultOptions;
|
|
120
139
|
constructor();
|
|
121
140
|
/**
|
|
@@ -228,6 +247,8 @@ export declare class RedisLockService implements OnModuleInit {
|
|
|
228
247
|
*
|
|
229
248
|
* WARNING: Use with caution in production! This will forcefully delete locks.
|
|
230
249
|
*
|
|
250
|
+
* **Note**: Uses SCAN command to avoid blocking Redis in production.
|
|
251
|
+
*
|
|
231
252
|
* @param pattern - Lock pattern (e.g., 'MyService:*' or '*:migration:*')
|
|
232
253
|
* @param keyPrefix - Key prefix (default: 'lock')
|
|
233
254
|
* @returns Number of locks deleted
|
|
@@ -280,6 +301,8 @@ export declare class RedisLockService implements OnModuleInit {
|
|
|
280
301
|
* Get all active locks with optional pattern filtering
|
|
281
302
|
* Useful for monitoring and debugging
|
|
282
303
|
*
|
|
304
|
+
* **Note**: Uses SCAN command to avoid blocking Redis in production.
|
|
305
|
+
*
|
|
283
306
|
* @param pattern - Optional pattern to filter locks (e.g., 'MyService:*')
|
|
284
307
|
* @param keyPrefix - Key prefix (default: 'lock')
|
|
285
308
|
* @returns Array of active lock information
|
|
@@ -296,10 +319,18 @@ export declare class RedisLockService implements OnModuleInit {
|
|
|
296
319
|
private getRedis;
|
|
297
320
|
/**
|
|
298
321
|
* Generate a unique lock value
|
|
322
|
+
* Format: instanceId:timestamp:random:pid
|
|
299
323
|
*
|
|
300
324
|
* @returns Unique lock identifier
|
|
301
325
|
*/
|
|
302
326
|
private generateLockValue;
|
|
327
|
+
/**
|
|
328
|
+
* Get instance identifier
|
|
329
|
+
* Used to distinguish different process instances in distributed environments
|
|
330
|
+
*
|
|
331
|
+
* @returns Instance identifier
|
|
332
|
+
*/
|
|
333
|
+
private getInstanceId;
|
|
303
334
|
/**
|
|
304
335
|
* Build the full Redis key for a lock
|
|
305
336
|
*
|