@nest-omni/core 4.1.3-0 → 4.1.3-10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/audit/audit.module.d.ts +10 -0
- package/audit/audit.module.js +15 -0
- package/audit/controllers/audit.controller.d.ts +24 -0
- package/audit/controllers/audit.controller.js +24 -0
- package/audit/decorators/audit-controller.decorator.d.ts +8 -0
- package/audit/decorators/audit-controller.decorator.js +9 -0
- package/audit/decorators/audit-operation.decorator.d.ts +45 -0
- package/audit/decorators/audit-operation.decorator.js +49 -0
- package/audit/decorators/entity-audit.decorator.d.ts +8 -0
- package/audit/decorators/entity-audit.decorator.js +9 -0
- package/audit/dto/audit-log-query.dto.d.ts +3 -0
- package/audit/dto/audit-log-query.dto.js +3 -0
- package/audit/dto/begin-transaction.dto.d.ts +3 -0
- package/audit/dto/begin-transaction.dto.js +3 -0
- package/audit/dto/compare-entities.dto.d.ts +3 -0
- package/audit/dto/compare-entities.dto.js +3 -0
- package/audit/dto/pre-check-restore.dto.d.ts +3 -0
- package/audit/dto/pre-check-restore.dto.js +3 -0
- package/audit/dto/restore-entity.dto.d.ts +3 -0
- package/audit/dto/restore-entity.dto.js +3 -0
- package/audit/entities/entity-audit-log.entity.d.ts +3 -0
- package/audit/entities/entity-audit-log.entity.js +3 -0
- package/audit/entities/entity-transaction.entity.d.ts +3 -0
- package/audit/entities/entity-transaction.entity.js +3 -0
- package/audit/entities/manual-operation-log.entity.d.ts +4 -0
- package/audit/entities/manual-operation-log.entity.js +4 -0
- 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 +17 -2
- package/audit/enums/audit.enums.js +15 -0
- package/audit/index.js +10 -0
- package/audit/interceptors/audit.interceptor.d.ts +15 -0
- package/audit/interceptors/audit.interceptor.js +23 -1
- package/audit/interfaces/audit.interfaces.d.ts +42 -0
- package/audit/services/audit-context.service.d.ts +15 -0
- package/audit/services/audit-context.service.js +15 -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 +57 -0
- package/audit/services/entity-audit.service.js +91 -0
- package/audit/services/manual-audit-log.service.d.ts +124 -0
- package/audit/services/manual-audit-log.service.js +138 -0
- package/audit/services/multi-database.service.d.ts +12 -0
- package/audit/services/multi-database.service.js +12 -0
- package/audit/services/operation-description.service.d.ts +59 -0
- package/audit/services/operation-description.service.js +76 -2
- package/audit/services/transaction-audit.service.d.ts +30 -0
- package/audit/services/transaction-audit.service.js +47 -0
- package/audit/subscribers/entity-audit.subscriber.d.ts +15 -0
- package/audit/subscribers/entity-audit.subscriber.js +29 -1
- package/cache/cache-metrics.service.d.ts +67 -0
- package/cache/cache-metrics.service.js +68 -4
- package/cache/cache-serialization.service.d.ts +31 -0
- package/cache/cache-serialization.service.js +25 -0
- package/cache/cache.constants.d.ts +9 -0
- package/cache/cache.constants.js +9 -0
- package/cache/cache.health.d.ts +26 -0
- package/cache/cache.health.js +30 -0
- package/cache/cache.module.d.ts +86 -0
- package/cache/cache.module.js +71 -0
- package/cache/cache.service.d.ts +140 -0
- package/cache/cache.service.js +157 -0
- package/cache/cache.warmup.service.d.ts +39 -0
- package/cache/cache.warmup.service.js +32 -0
- package/cache/decorators/cache-evict.decorator.d.ts +47 -0
- package/cache/decorators/cache-evict.decorator.js +56 -0
- package/cache/decorators/cache-put.decorator.d.ts +34 -0
- package/cache/decorators/cache-put.decorator.js +39 -0
- package/cache/decorators/cacheable.decorator.d.ts +40 -0
- package/cache/decorators/cacheable.decorator.js +55 -0
- package/cache/dependencies/callback.dependency.d.ts +33 -0
- package/cache/dependencies/callback.dependency.js +39 -1
- package/cache/dependencies/chain.dependency.d.ts +28 -0
- package/cache/dependencies/chain.dependency.js +34 -0
- package/cache/dependencies/db.dependency.d.ts +45 -0
- package/cache/dependencies/db.dependency.js +48 -1
- package/cache/dependencies/file.dependency.d.ts +32 -0
- package/cache/dependencies/file.dependency.js +34 -0
- package/cache/dependencies/tag.dependency.d.ts +36 -0
- package/cache/dependencies/tag.dependency.js +36 -0
- package/cache/dependencies/time.dependency.d.ts +43 -0
- package/cache/dependencies/time.dependency.js +43 -0
- package/cache/examples/basic-usage.d.ts +15 -0
- package/cache/examples/basic-usage.js +62 -8
- package/cache/index.js +9 -0
- package/cache/interfaces/cache-dependency.interface.d.ts +53 -0
- package/cache/interfaces/cache-options.interface.d.ts +81 -0
- package/cache/interfaces/cache-options.interface.js +6 -0
- package/cache/interfaces/cache-provider.interface.d.ts +78 -0
- package/cache/providers/base-cache.provider.d.ts +14 -0
- package/cache/providers/base-cache.provider.js +16 -0
- package/cache/providers/cls-cache.provider.d.ts +20 -0
- package/cache/providers/cls-cache.provider.js +28 -0
- package/cache/providers/memory-cache.provider.d.ts +23 -0
- package/cache/providers/memory-cache.provider.js +26 -0
- package/cache/providers/redis-cache.provider.d.ts +26 -0
- package/cache/providers/redis-cache.provider.js +29 -0
- package/cache/utils/dependency-manager.util.d.ts +52 -0
- package/cache/utils/dependency-manager.util.js +59 -0
- package/cache/utils/key-generator.util.d.ts +42 -0
- package/cache/utils/key-generator.util.js +53 -1
- package/common/abstract.entity.d.ts +14 -0
- package/common/abstract.entity.js +14 -0
- package/common/boilerplate.polyfill.d.ts +142 -4
- package/common/boilerplate.polyfill.js +24 -131
- package/common/dto/dto-container.d.ts +16 -0
- package/common/dto/dto-container.js +20 -0
- package/common/dto/dto-decorators.d.ts +18 -0
- package/common/dto/dto-decorators.js +14 -0
- package/common/dto/dto-extensions.d.ts +11 -0
- package/common/dto/dto-extensions.js +9 -0
- package/common/dto/dto-service-accessor.d.ts +17 -0
- package/common/dto/dto-service-accessor.js +18 -0
- package/common/dto/dto-transformer.d.ts +12 -0
- package/common/dto/dto-transformer.js +9 -0
- package/common/dto/index.js +2 -0
- package/common/examples/paginate-and-map.example.d.ts +6 -0
- package/common/examples/paginate-and-map.example.js +26 -0
- package/common/utils.d.ts +15 -0
- package/common/utils.js +15 -0
- package/constants/language-code.js +1 -0
- package/decorators/field.decorators.js +8 -1
- package/decorators/property.decorators.js +1 -0
- package/decorators/public-route.decorator.js +1 -0
- package/decorators/transform.decorators.d.ts +27 -0
- package/decorators/transform.decorators.js +29 -0
- package/decorators/translate.decorator.js +1 -0
- package/decorators/user.decorator.js +1 -0
- package/decorators/validator.decorators.d.ts +8 -18
- package/decorators/validator.decorators.js +22 -190
- package/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 +15 -0
- package/http-client/config/http-client.config.js +25 -9
- package/http-client/decorators/http-client.decorators.d.ts +63 -0
- package/http-client/decorators/http-client.decorators.js +71 -3
- package/http-client/entities/http-log.entity.d.ts +229 -0
- package/http-client/entities/http-log.entity.js +6 -1
- 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 +41 -0
- package/http-client/examples/advanced-usage.example.js +68 -24
- 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/http-client.module.d.ts +13 -0
- package/http-client/http-client.module.js +19 -0
- package/http-client/index.js +8 -0
- package/http-client/interfaces/api-client-config.interface.d.ts +125 -0
- package/http-client/interfaces/api-client-config.interface.js +3 -0
- package/http-client/interfaces/http-client-config.interface.d.ts +60 -0
- package/http-client/services/api-client-registry.service.d.ts +57 -0
- package/http-client/services/api-client-registry.service.js +84 -1
- package/http-client/services/cache.service.d.ts +52 -0
- package/http-client/services/cache.service.js +72 -3
- package/http-client/services/circuit-breaker.service.d.ts +46 -0
- package/http-client/services/circuit-breaker.service.js +52 -0
- package/http-client/services/http-client.service.d.ts +67 -0
- package/http-client/services/http-client.service.js +105 -4
- package/http-client/services/http-log-query.service.d.ts +83 -0
- package/http-client/services/http-log-query.service.js +122 -1
- 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/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 +40 -0
- package/http-client/services/logging.service.js +53 -0
- package/http-client/utils/call-stack-extractor.util.d.ts +37 -0
- package/http-client/utils/call-stack-extractor.util.js +48 -0
- package/http-client/utils/context-extractor.util.d.ts +49 -0
- package/http-client/utils/context-extractor.util.js +52 -0
- package/http-client/utils/curl-generator.util.d.ts +21 -0
- package/http-client/utils/curl-generator.util.js +44 -3
- package/http-client/utils/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/i18n/en_US/validation.json +2 -1
- package/i18n/zh_CN/validation.json +2 -1
- package/index.js +8 -0
- package/interceptors/translation-interceptor.service.js +5 -0
- package/package.json +1 -1
- package/providers/context.provider.js +2 -0
- package/providers/generator.provider.d.ts +4 -0
- package/providers/generator.provider.js +4 -0
- package/redis-lock/comprehensive-lock-cleanup.service.d.ts +94 -0
- package/redis-lock/comprehensive-lock-cleanup.service.js +253 -0
- package/redis-lock/examples/lock-strategy.examples.d.ts +89 -0
- package/redis-lock/examples/lock-strategy.examples.js +130 -15
- package/redis-lock/index.d.ts +2 -0
- package/redis-lock/index.js +8 -1
- package/redis-lock/lock-heartbeat.service.d.ts +78 -0
- package/redis-lock/lock-heartbeat.service.js +222 -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 +260 -0
- package/redis-lock/redis-lock.service.js +244 -4
- package/setup/bootstrap.setup.js +20 -0
- package/setup/mode.setup.d.ts +44 -0
- package/setup/mode.setup.js +44 -0
- package/setup/schedule.decorator.d.ts +227 -0
- package/setup/schedule.decorator.js +219 -6
- package/setup/worker.decorator.d.ts +86 -0
- package/setup/worker.decorator.js +88 -0
- package/shared/serviceRegistryModule.js +9 -1
- package/shared/services/api-config.service.d.ts +3 -0
- package/shared/services/api-config.service.js +20 -9
- 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 +96 -0
- package/validators/custom-validate.examples.js +400 -0
- package/validators/custom-validate.validator.d.ts +134 -0
- package/validators/custom-validate.validator.js +214 -0
- package/validators/index.d.ts +2 -0
- package/validators/index.js +2 -0
- package/validators/is-exists.validator.d.ts +18 -4
- package/validators/is-exists.validator.js +67 -6
- package/validators/is-unique.validator.d.ts +32 -5
- package/validators/is-unique.validator.js +99 -17
- package/validators/skip-empty.validator.d.ts +5 -0
- package/validators/skip-empty.validator.js +5 -0
- package/vault/interfaces/vault-options.interface.d.ts +9 -0
- package/vault/vault-config.loader.d.ts +30 -0
- package/vault/vault-config.loader.js +48 -1
- package/vault/vault-config.service.d.ts +53 -0
- package/vault/vault-config.service.js +57 -0
- package/vault/vault.module.d.ts +4 -0
- package/vault/vault.module.js +4 -0
- package/decorators/examples/validation-decorators.example.d.ts +0 -69
- package/decorators/examples/validation-decorators.example.js +0 -331
|
@@ -1,23 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced Schedule Decorators for Worker Mode
|
|
3
|
+
*
|
|
4
|
+
* This module provides decorators for scheduled tasks that:
|
|
5
|
+
* - Only run in Worker or Hybrid mode (not in HTTP-only mode)
|
|
6
|
+
* - Support distributed locking via Redis
|
|
7
|
+
* - Support retry logic for failed tasks
|
|
8
|
+
* - Provide automatic lock key generation
|
|
9
|
+
* - Support task execution logging and error handling
|
|
10
|
+
*/
|
|
1
11
|
import type { CronOptions } from '@nestjs/schedule';
|
|
12
|
+
/**
|
|
13
|
+
* Options for schedule decorators with lock support
|
|
14
|
+
*/
|
|
2
15
|
export interface ScheduleWithLockOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Lock TTL in milliseconds
|
|
18
|
+
* For Cron: defaults to 3600000 (1 hour)
|
|
19
|
+
* For Interval: defaults to 80% of interval duration
|
|
20
|
+
* For Timeout: defaults to 300000 (5 minutes)
|
|
21
|
+
*/
|
|
3
22
|
lockTtl?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Number of retry attempts if task fails
|
|
25
|
+
* @default 0
|
|
26
|
+
*/
|
|
4
27
|
retryCount?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Delay between retry attempts in milliseconds
|
|
30
|
+
* @default 1000
|
|
31
|
+
*/
|
|
5
32
|
retryDelay?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Whether to use exponential backoff for retries
|
|
35
|
+
* @default false
|
|
36
|
+
*/
|
|
6
37
|
useExponentialBackoff?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Maximum retry delay in milliseconds (for exponential backoff)
|
|
40
|
+
* @default 60000 (1 minute)
|
|
41
|
+
*/
|
|
7
42
|
maxRetryDelay?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Whether to log task execution
|
|
45
|
+
* @default true
|
|
46
|
+
*/
|
|
8
47
|
logExecution?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Custom lock key prefix
|
|
50
|
+
* @default 'schedule'
|
|
51
|
+
*/
|
|
9
52
|
lockKeyPrefix?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Automatic lock extension interval in milliseconds
|
|
55
|
+
* If set, the lock will be automatically extended at this interval
|
|
56
|
+
* @default 0 (no automatic extension)
|
|
57
|
+
*/
|
|
10
58
|
autoExtendLock?: number;
|
|
59
|
+
/**
|
|
60
|
+
* Callback function when task execution succeeds
|
|
61
|
+
*/
|
|
11
62
|
onSuccess?: (duration: number) => void | Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Callback function when task execution fails
|
|
65
|
+
*/
|
|
12
66
|
onError?: (error: Error) => void | Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Whether to skip execution if lock cannot be acquired
|
|
69
|
+
* @default true
|
|
70
|
+
*/
|
|
13
71
|
skipIfLocked?: boolean;
|
|
14
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Cron decorator that only executes in Worker or Hybrid mode
|
|
75
|
+
*
|
|
76
|
+
* @param cronTime - Cron expression
|
|
77
|
+
* @param options - Cron options
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* @WorkerCron('0 0 * * *') // Run daily at midnight
|
|
82
|
+
* async dailyTask() {
|
|
83
|
+
* // Task logic
|
|
84
|
+
* }
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
15
87
|
export declare function WorkerCron(cronTime: string | Date, options?: CronOptions): MethodDecorator;
|
|
88
|
+
/**
|
|
89
|
+
* Interval decorator that only executes in Worker or Hybrid mode
|
|
90
|
+
*
|
|
91
|
+
* @param timeout - Interval in milliseconds
|
|
92
|
+
* @param name - Optional name for the interval
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* @WorkerInterval(60000) // Run every minute
|
|
97
|
+
* async minutelyTask() {
|
|
98
|
+
* // Task logic
|
|
99
|
+
* }
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
16
102
|
export declare function WorkerInterval(timeout: number, name?: string): MethodDecorator;
|
|
103
|
+
/**
|
|
104
|
+
* Timeout decorator that only executes in Worker or Hybrid mode
|
|
105
|
+
*
|
|
106
|
+
* @param timeout - Timeout in milliseconds
|
|
107
|
+
* @param name - Optional name for the timeout
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* @WorkerTimeout(5000) // Run once after 5 seconds
|
|
112
|
+
* async startupTask() {
|
|
113
|
+
* // Task logic
|
|
114
|
+
* }
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
17
117
|
export declare function WorkerTimeout(timeout: number, name?: string): MethodDecorator;
|
|
118
|
+
/**
|
|
119
|
+
* Cron decorator with distributed lock support
|
|
120
|
+
* Automatically generates lock key from class and method name
|
|
121
|
+
*
|
|
122
|
+
* @param cronTime - Cron expression
|
|
123
|
+
* @param lockKeyOrOptions - Lock key (string) or options object
|
|
124
|
+
* @param lockTtl - Lock TTL in milliseconds (only if lockKeyOrOptions is a string)
|
|
125
|
+
*
|
|
126
|
+
* @param cronOptions
|
|
127
|
+
* @example
|
|
128
|
+
* ```typescript
|
|
129
|
+
* // Using string lock key
|
|
130
|
+
* @WorkerCronWithLock('0 * * * *', 'hourly-task', 3600000)
|
|
131
|
+
* async hourlyTask() {
|
|
132
|
+
* // Task logic
|
|
133
|
+
* }
|
|
134
|
+
*
|
|
135
|
+
* // Using options object (auto-generates lock key)
|
|
136
|
+
* @WorkerCronWithLock('0 * * * *', { lockTtl: 3600000, retryCount: 3 })
|
|
137
|
+
* async hourlyTask() {
|
|
138
|
+
* // Task logic
|
|
139
|
+
* }
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
18
142
|
export declare function WorkerCronWithLock(cronTime: string | Date, lockKeyOrOptions: string | ScheduleWithLockOptions, lockTtl?: number, cronOptions?: CronOptions): MethodDecorator;
|
|
143
|
+
/**
|
|
144
|
+
* Interval decorator with distributed lock support
|
|
145
|
+
*
|
|
146
|
+
* @param timeout - Interval in milliseconds
|
|
147
|
+
* @param lockKeyOrOptions - Lock key (string) or options object
|
|
148
|
+
* @param lockTtl - Lock TTL in milliseconds (only if lockKeyOrOptions is a string)
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* // Using string lock key
|
|
153
|
+
* @WorkerIntervalWithLock(60000, 'status-check', 50000)
|
|
154
|
+
* async checkStatus() {
|
|
155
|
+
* // Task logic
|
|
156
|
+
* }
|
|
157
|
+
*
|
|
158
|
+
* // Using options object (auto-generates lock key)
|
|
159
|
+
* @WorkerIntervalWithLock(60000, { retryCount: 2 })
|
|
160
|
+
* async checkStatus() {
|
|
161
|
+
* // Task logic
|
|
162
|
+
* }
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
19
165
|
export declare function WorkerIntervalWithLock(timeout: number, lockKeyOrOptions: string | ScheduleWithLockOptions, lockTtl?: number): MethodDecorator;
|
|
166
|
+
/**
|
|
167
|
+
* Timeout decorator with distributed lock support
|
|
168
|
+
*
|
|
169
|
+
* @param timeout - Timeout in milliseconds
|
|
170
|
+
* @param lockKeyOrOptions - Lock key (string) or options object
|
|
171
|
+
* @param lockTtl - Lock TTL in milliseconds (only if lockKeyOrOptions is a string)
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* ```typescript
|
|
175
|
+
* // Using string lock key
|
|
176
|
+
* @WorkerTimeoutWithLock(5000, 'init-task', 10000)
|
|
177
|
+
* async initializeSystem() {
|
|
178
|
+
* // Task logic
|
|
179
|
+
* }
|
|
180
|
+
*
|
|
181
|
+
* // Using options object (auto-generates lock key)
|
|
182
|
+
* @WorkerTimeoutWithLock(5000, { lockTtl: 10000 })
|
|
183
|
+
* async initializeSystem() {
|
|
184
|
+
* // Task logic
|
|
185
|
+
* }
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
20
188
|
export declare function WorkerTimeoutWithLock(timeout: number, lockKeyOrOptions: string | ScheduleWithLockOptions, lockTtl?: number): MethodDecorator;
|
|
189
|
+
/**
|
|
190
|
+
* Smart Cron decorator with auto-generated lock key and intelligent defaults
|
|
191
|
+
* Recommended for most use cases
|
|
192
|
+
*
|
|
193
|
+
* @param cronTime - Cron expression
|
|
194
|
+
* @param options - Schedule options
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* ```typescript
|
|
198
|
+
* @WorkerCronSmart('0 * * * *') // Run hourly with auto-generated lock key
|
|
199
|
+
* async hourlyTask() {
|
|
200
|
+
* // Task logic
|
|
201
|
+
* }
|
|
202
|
+
*
|
|
203
|
+
* @WorkerCronSmart('0 0 * * *', {
|
|
204
|
+
* lockTtl: 7200000, // 2 hours
|
|
205
|
+
* retryCount: 3,
|
|
206
|
+
* onError: (error) => console.error('Task failed:', error),
|
|
207
|
+
* })
|
|
208
|
+
* async dailyTask() {
|
|
209
|
+
* // Task logic
|
|
210
|
+
* }
|
|
211
|
+
* ```
|
|
212
|
+
*/
|
|
21
213
|
export declare function WorkerCronSmart(cronTime: string | Date, options?: ScheduleWithLockOptions, cronOptions?: CronOptions): MethodDecorator;
|
|
214
|
+
/**
|
|
215
|
+
* Smart Interval decorator with auto-generated lock key and intelligent defaults
|
|
216
|
+
* Lock TTL is automatically set to 80% of interval duration
|
|
217
|
+
*
|
|
218
|
+
* @param timeout - Interval in milliseconds
|
|
219
|
+
* @param options - Schedule options
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* ```typescript
|
|
223
|
+
* @WorkerIntervalSmart(120000) // Run every 2 minutes, lock for ~1.6 minutes
|
|
224
|
+
* async checkStatus() {
|
|
225
|
+
* // Task logic
|
|
226
|
+
* }
|
|
227
|
+
* ```
|
|
228
|
+
*/
|
|
22
229
|
export declare function WorkerIntervalSmart(timeout: number, options?: ScheduleWithLockOptions): MethodDecorator;
|
|
230
|
+
/**
|
|
231
|
+
* Advanced Cron decorator with full control
|
|
232
|
+
* Alias for WorkerCronSmart with explicit lock key parameter
|
|
233
|
+
*
|
|
234
|
+
* @param cronTime - Cron expression
|
|
235
|
+
* @param lockKeyOrOptions - Lock key (string) or options object
|
|
236
|
+
* @param options - Schedule options (only if lockKeyOrOptions is a string)
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* ```typescript
|
|
240
|
+
* @WorkerCronAdvanced('0 0 * * *', 'daily-report', {
|
|
241
|
+
* lockTtl: 7200000,
|
|
242
|
+
* retryCount: 5,
|
|
243
|
+
* useExponentialBackoff: true,
|
|
244
|
+
* })
|
|
245
|
+
* async generateDailyReport() {
|
|
246
|
+
* // Task logic
|
|
247
|
+
* }
|
|
248
|
+
* ```
|
|
249
|
+
*/
|
|
23
250
|
export declare function WorkerCronAdvanced(cronTime: string | Date, lockKeyOrOptions: string | ScheduleWithLockOptions, options?: ScheduleWithLockOptions, cronOptions?: CronOptions): MethodDecorator;
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Enhanced Schedule Decorators for Worker Mode
|
|
4
|
+
*
|
|
5
|
+
* This module provides decorators for scheduled tasks that:
|
|
6
|
+
* - Only run in Worker or Hybrid mode (not in HTTP-only mode)
|
|
7
|
+
* - Support distributed locking via Redis
|
|
8
|
+
* - Support retry logic for failed tasks
|
|
9
|
+
* - Provide automatic lock key generation
|
|
10
|
+
* - Support task execution logging and error handling
|
|
11
|
+
*/
|
|
2
12
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
13
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
14
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -21,10 +31,16 @@ exports.WorkerCronAdvanced = WorkerCronAdvanced;
|
|
|
21
31
|
const common_1 = require("@nestjs/common");
|
|
22
32
|
const schedule_1 = require("@nestjs/schedule");
|
|
23
33
|
const mode_setup_1 = require("./mode.setup");
|
|
24
|
-
const
|
|
34
|
+
const redis_lock_1 = require("../redis-lock");
|
|
35
|
+
/**
|
|
36
|
+
* Generate a lock key from class name and method name
|
|
37
|
+
*/
|
|
25
38
|
function generateLockKey(className, methodName) {
|
|
26
39
|
return `${className}.${methodName}`;
|
|
27
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Execute a function with retry logic
|
|
43
|
+
*/
|
|
28
44
|
function executeWithRetry(fn, options) {
|
|
29
45
|
return __awaiter(this, void 0, void 0, function* () {
|
|
30
46
|
const { retryCount = 0, retryDelay = 1000, useExponentialBackoff = false, maxRetryDelay = 60000, logger, taskName, } = options;
|
|
@@ -51,41 +67,55 @@ function executeWithRetry(fn, options) {
|
|
|
51
67
|
throw lastError;
|
|
52
68
|
});
|
|
53
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Base decorator creator for worker-mode tasks
|
|
72
|
+
*/
|
|
54
73
|
function createWorkerDecorator(baseDecorator, decoratorName) {
|
|
55
74
|
return function (target, propertyKey, descriptor) {
|
|
56
75
|
const originalMethod = descriptor.value;
|
|
57
76
|
descriptor.value = function (...args) {
|
|
58
77
|
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
// Only execute in worker or hybrid mode
|
|
59
79
|
if (!(0, mode_setup_1.shouldProcessQueues)()) {
|
|
60
80
|
return;
|
|
61
81
|
}
|
|
62
82
|
return originalMethod.apply(this, args);
|
|
63
83
|
});
|
|
64
84
|
};
|
|
85
|
+
// Apply the base decorator
|
|
65
86
|
baseDecorator(target, propertyKey, descriptor);
|
|
66
87
|
return descriptor;
|
|
67
88
|
};
|
|
68
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Create a worker decorator with lock support
|
|
92
|
+
*/
|
|
69
93
|
function createWorkerDecoratorWithLock(baseDecorator, decoratorName, lockKey, options = {}) {
|
|
70
94
|
return function (target, propertyKey, descriptor) {
|
|
71
95
|
const originalMethod = descriptor.value;
|
|
72
96
|
const className = target.constructor.name;
|
|
73
97
|
const methodName = String(propertyKey);
|
|
74
98
|
const logger = new common_1.Logger(`${className}.${methodName}`);
|
|
99
|
+
// Resolve lock key
|
|
75
100
|
const resolvedLockKey = typeof lockKey === 'function' ? lockKey() : lockKey;
|
|
76
101
|
descriptor.value = function (...args) {
|
|
77
102
|
return __awaiter(this, void 0, void 0, function* () {
|
|
103
|
+
// Only execute in worker or hybrid mode
|
|
78
104
|
if (!(0, mode_setup_1.shouldProcessQueues)()) {
|
|
79
105
|
return;
|
|
80
106
|
}
|
|
81
|
-
|
|
82
|
-
const
|
|
107
|
+
// Get or create global instance - auto-configures from environment variables
|
|
108
|
+
const lockService = redis_lock_1.RedisLockService.getOrCreateGlobalInstance();
|
|
109
|
+
const { lockTtl = 3600000, // 1 hour default
|
|
110
|
+
retryCount = 0, retryDelay = 1000, useExponentialBackoff = false, maxRetryDelay = 60000, logExecution = true, lockKeyPrefix = 'schedule', autoExtendLock = 0, onSuccess, onError, skipIfLocked = true, } = options;
|
|
83
111
|
const fullLockKey = `${lockKeyPrefix}:${resolvedLockKey}`;
|
|
84
112
|
const startTime = Date.now();
|
|
113
|
+
// Log task start
|
|
85
114
|
if (logExecution) {
|
|
86
115
|
logger.log(`Task starting...`);
|
|
87
116
|
}
|
|
88
117
|
try {
|
|
118
|
+
// Acquire lock
|
|
89
119
|
const lockResult = yield lockService.acquireLock(resolvedLockKey, {
|
|
90
120
|
ttl: lockTtl,
|
|
91
121
|
keyPrefix: lockKeyPrefix,
|
|
@@ -101,6 +131,7 @@ function createWorkerDecoratorWithLock(baseDecorator, decoratorName, lockKey, op
|
|
|
101
131
|
}
|
|
102
132
|
}
|
|
103
133
|
try {
|
|
134
|
+
// Execute with retry logic
|
|
104
135
|
const result = yield executeWithRetry(() => originalMethod.apply(this, args), {
|
|
105
136
|
retryCount,
|
|
106
137
|
retryDelay,
|
|
@@ -113,15 +144,18 @@ function createWorkerDecoratorWithLock(baseDecorator, decoratorName, lockKey, op
|
|
|
113
144
|
if (logExecution) {
|
|
114
145
|
logger.log(`Task completed successfully in ${duration}ms`);
|
|
115
146
|
}
|
|
147
|
+
// Call success callback with proper this context
|
|
116
148
|
if (onSuccess) {
|
|
117
149
|
yield onSuccess.call(this, duration);
|
|
118
150
|
}
|
|
119
151
|
return result;
|
|
120
152
|
}
|
|
121
153
|
finally {
|
|
154
|
+
// Clear auto-extension timer if it exists
|
|
122
155
|
if (lockResult.autoExtendTimer) {
|
|
123
156
|
clearInterval(lockResult.autoExtendTimer);
|
|
124
157
|
}
|
|
158
|
+
// Always release the lock
|
|
125
159
|
yield lockService.releaseLock(resolvedLockKey, lockResult.lockValue, lockKeyPrefix);
|
|
126
160
|
if (logExecution) {
|
|
127
161
|
logger.debug(`Lock "${fullLockKey}" released`);
|
|
@@ -130,9 +164,9 @@ function createWorkerDecoratorWithLock(baseDecorator, decoratorName, lockKey, op
|
|
|
130
164
|
}
|
|
131
165
|
catch (error) {
|
|
132
166
|
const duration = Date.now() - startTime;
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
167
|
+
// Always log errors regardless of logExecution setting
|
|
168
|
+
logger.error(`Task failed after ${duration}ms: ${error.message}`, error.stack);
|
|
169
|
+
// Call error callback with proper this context
|
|
136
170
|
if (onError) {
|
|
137
171
|
yield onError.call(this, error);
|
|
138
172
|
}
|
|
@@ -140,25 +174,98 @@ function createWorkerDecoratorWithLock(baseDecorator, decoratorName, lockKey, op
|
|
|
140
174
|
}
|
|
141
175
|
});
|
|
142
176
|
};
|
|
177
|
+
// Apply the base decorator
|
|
143
178
|
baseDecorator(target, propertyKey, descriptor);
|
|
144
179
|
return descriptor;
|
|
145
180
|
};
|
|
146
181
|
}
|
|
182
|
+
// ============================================================================
|
|
183
|
+
// Basic Worker Decorators (without lock)
|
|
184
|
+
// ============================================================================
|
|
185
|
+
/**
|
|
186
|
+
* Cron decorator that only executes in Worker or Hybrid mode
|
|
187
|
+
*
|
|
188
|
+
* @param cronTime - Cron expression
|
|
189
|
+
* @param options - Cron options
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* ```typescript
|
|
193
|
+
* @WorkerCron('0 0 * * *') // Run daily at midnight
|
|
194
|
+
* async dailyTask() {
|
|
195
|
+
* // Task logic
|
|
196
|
+
* }
|
|
197
|
+
* ```
|
|
198
|
+
*/
|
|
147
199
|
function WorkerCron(cronTime, options) {
|
|
148
200
|
return createWorkerDecorator((0, schedule_1.Cron)(cronTime, options), 'WorkerCron');
|
|
149
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* Interval decorator that only executes in Worker or Hybrid mode
|
|
204
|
+
*
|
|
205
|
+
* @param timeout - Interval in milliseconds
|
|
206
|
+
* @param name - Optional name for the interval
|
|
207
|
+
*
|
|
208
|
+
* @example
|
|
209
|
+
* ```typescript
|
|
210
|
+
* @WorkerInterval(60000) // Run every minute
|
|
211
|
+
* async minutelyTask() {
|
|
212
|
+
* // Task logic
|
|
213
|
+
* }
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
150
216
|
function WorkerInterval(timeout, name) {
|
|
151
217
|
if (name) {
|
|
152
218
|
return createWorkerDecorator((0, schedule_1.Interval)(name, timeout), 'WorkerInterval');
|
|
153
219
|
}
|
|
154
220
|
return createWorkerDecorator((0, schedule_1.Interval)(timeout), 'WorkerInterval');
|
|
155
221
|
}
|
|
222
|
+
/**
|
|
223
|
+
* Timeout decorator that only executes in Worker or Hybrid mode
|
|
224
|
+
*
|
|
225
|
+
* @param timeout - Timeout in milliseconds
|
|
226
|
+
* @param name - Optional name for the timeout
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```typescript
|
|
230
|
+
* @WorkerTimeout(5000) // Run once after 5 seconds
|
|
231
|
+
* async startupTask() {
|
|
232
|
+
* // Task logic
|
|
233
|
+
* }
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
156
236
|
function WorkerTimeout(timeout, name) {
|
|
157
237
|
if (name) {
|
|
158
238
|
return createWorkerDecorator((0, schedule_1.Timeout)(name, timeout), 'WorkerTimeout');
|
|
159
239
|
}
|
|
160
240
|
return createWorkerDecorator((0, schedule_1.Timeout)(timeout), 'WorkerTimeout');
|
|
161
241
|
}
|
|
242
|
+
// ============================================================================
|
|
243
|
+
// Worker Decorators with Lock Support
|
|
244
|
+
// ============================================================================
|
|
245
|
+
/**
|
|
246
|
+
* Cron decorator with distributed lock support
|
|
247
|
+
* Automatically generates lock key from class and method name
|
|
248
|
+
*
|
|
249
|
+
* @param cronTime - Cron expression
|
|
250
|
+
* @param lockKeyOrOptions - Lock key (string) or options object
|
|
251
|
+
* @param lockTtl - Lock TTL in milliseconds (only if lockKeyOrOptions is a string)
|
|
252
|
+
*
|
|
253
|
+
* @param cronOptions
|
|
254
|
+
* @example
|
|
255
|
+
* ```typescript
|
|
256
|
+
* // Using string lock key
|
|
257
|
+
* @WorkerCronWithLock('0 * * * *', 'hourly-task', 3600000)
|
|
258
|
+
* async hourlyTask() {
|
|
259
|
+
* // Task logic
|
|
260
|
+
* }
|
|
261
|
+
*
|
|
262
|
+
* // Using options object (auto-generates lock key)
|
|
263
|
+
* @WorkerCronWithLock('0 * * * *', { lockTtl: 3600000, retryCount: 3 })
|
|
264
|
+
* async hourlyTask() {
|
|
265
|
+
* // Task logic
|
|
266
|
+
* }
|
|
267
|
+
* ```
|
|
268
|
+
*/
|
|
162
269
|
function WorkerCronWithLock(cronTime, lockKeyOrOptions, lockTtl, cronOptions) {
|
|
163
270
|
return function (target, propertyKey, descriptor) {
|
|
164
271
|
let lockKey;
|
|
@@ -174,6 +281,28 @@ function WorkerCronWithLock(cronTime, lockKeyOrOptions, lockTtl, cronOptions) {
|
|
|
174
281
|
return createWorkerDecoratorWithLock((0, schedule_1.Cron)(cronTime, cronOptions), 'WorkerCronWithLock', lockKey, options)(target, propertyKey, descriptor);
|
|
175
282
|
};
|
|
176
283
|
}
|
|
284
|
+
/**
|
|
285
|
+
* Interval decorator with distributed lock support
|
|
286
|
+
*
|
|
287
|
+
* @param timeout - Interval in milliseconds
|
|
288
|
+
* @param lockKeyOrOptions - Lock key (string) or options object
|
|
289
|
+
* @param lockTtl - Lock TTL in milliseconds (only if lockKeyOrOptions is a string)
|
|
290
|
+
*
|
|
291
|
+
* @example
|
|
292
|
+
* ```typescript
|
|
293
|
+
* // Using string lock key
|
|
294
|
+
* @WorkerIntervalWithLock(60000, 'status-check', 50000)
|
|
295
|
+
* async checkStatus() {
|
|
296
|
+
* // Task logic
|
|
297
|
+
* }
|
|
298
|
+
*
|
|
299
|
+
* // Using options object (auto-generates lock key)
|
|
300
|
+
* @WorkerIntervalWithLock(60000, { retryCount: 2 })
|
|
301
|
+
* async checkStatus() {
|
|
302
|
+
* // Task logic
|
|
303
|
+
* }
|
|
304
|
+
* ```
|
|
305
|
+
*/
|
|
177
306
|
function WorkerIntervalWithLock(timeout, lockKeyOrOptions, lockTtl) {
|
|
178
307
|
return function (target, propertyKey, descriptor) {
|
|
179
308
|
let lockKey;
|
|
@@ -189,6 +318,28 @@ function WorkerIntervalWithLock(timeout, lockKeyOrOptions, lockTtl) {
|
|
|
189
318
|
return createWorkerDecoratorWithLock((0, schedule_1.Interval)(timeout), 'WorkerIntervalWithLock', lockKey, options)(target, propertyKey, descriptor);
|
|
190
319
|
};
|
|
191
320
|
}
|
|
321
|
+
/**
|
|
322
|
+
* Timeout decorator with distributed lock support
|
|
323
|
+
*
|
|
324
|
+
* @param timeout - Timeout in milliseconds
|
|
325
|
+
* @param lockKeyOrOptions - Lock key (string) or options object
|
|
326
|
+
* @param lockTtl - Lock TTL in milliseconds (only if lockKeyOrOptions is a string)
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
* ```typescript
|
|
330
|
+
* // Using string lock key
|
|
331
|
+
* @WorkerTimeoutWithLock(5000, 'init-task', 10000)
|
|
332
|
+
* async initializeSystem() {
|
|
333
|
+
* // Task logic
|
|
334
|
+
* }
|
|
335
|
+
*
|
|
336
|
+
* // Using options object (auto-generates lock key)
|
|
337
|
+
* @WorkerTimeoutWithLock(5000, { lockTtl: 10000 })
|
|
338
|
+
* async initializeSystem() {
|
|
339
|
+
* // Task logic
|
|
340
|
+
* }
|
|
341
|
+
* ```
|
|
342
|
+
*/
|
|
192
343
|
function WorkerTimeoutWithLock(timeout, lockKeyOrOptions, lockTtl) {
|
|
193
344
|
return function (target, propertyKey, descriptor) {
|
|
194
345
|
let lockKey;
|
|
@@ -204,18 +355,80 @@ function WorkerTimeoutWithLock(timeout, lockKeyOrOptions, lockTtl) {
|
|
|
204
355
|
return createWorkerDecoratorWithLock((0, schedule_1.Timeout)(timeout), 'WorkerTimeoutWithLock', lockKey, options)(target, propertyKey, descriptor);
|
|
205
356
|
};
|
|
206
357
|
}
|
|
358
|
+
// ============================================================================
|
|
359
|
+
// Smart Decorators (Recommended)
|
|
360
|
+
// ============================================================================
|
|
361
|
+
/**
|
|
362
|
+
* Smart Cron decorator with auto-generated lock key and intelligent defaults
|
|
363
|
+
* Recommended for most use cases
|
|
364
|
+
*
|
|
365
|
+
* @param cronTime - Cron expression
|
|
366
|
+
* @param options - Schedule options
|
|
367
|
+
*
|
|
368
|
+
* @example
|
|
369
|
+
* ```typescript
|
|
370
|
+
* @WorkerCronSmart('0 * * * *') // Run hourly with auto-generated lock key
|
|
371
|
+
* async hourlyTask() {
|
|
372
|
+
* // Task logic
|
|
373
|
+
* }
|
|
374
|
+
*
|
|
375
|
+
* @WorkerCronSmart('0 0 * * *', {
|
|
376
|
+
* lockTtl: 7200000, // 2 hours
|
|
377
|
+
* retryCount: 3,
|
|
378
|
+
* onError: (error) => console.error('Task failed:', error),
|
|
379
|
+
* })
|
|
380
|
+
* async dailyTask() {
|
|
381
|
+
* // Task logic
|
|
382
|
+
* }
|
|
383
|
+
* ```
|
|
384
|
+
*/
|
|
207
385
|
function WorkerCronSmart(cronTime, options = {}, cronOptions) {
|
|
208
386
|
return function (target, propertyKey, descriptor) {
|
|
209
387
|
const lockKey = generateLockKey(target.constructor.name, String(propertyKey));
|
|
210
388
|
return createWorkerDecoratorWithLock((0, schedule_1.Cron)(cronTime, cronOptions), 'WorkerCronSmart', lockKey, Object.assign({ lockTtl: 3600000, logExecution: true }, options))(target, propertyKey, descriptor);
|
|
211
389
|
};
|
|
212
390
|
}
|
|
391
|
+
/**
|
|
392
|
+
* Smart Interval decorator with auto-generated lock key and intelligent defaults
|
|
393
|
+
* Lock TTL is automatically set to 80% of interval duration
|
|
394
|
+
*
|
|
395
|
+
* @param timeout - Interval in milliseconds
|
|
396
|
+
* @param options - Schedule options
|
|
397
|
+
*
|
|
398
|
+
* @example
|
|
399
|
+
* ```typescript
|
|
400
|
+
* @WorkerIntervalSmart(120000) // Run every 2 minutes, lock for ~1.6 minutes
|
|
401
|
+
* async checkStatus() {
|
|
402
|
+
* // Task logic
|
|
403
|
+
* }
|
|
404
|
+
* ```
|
|
405
|
+
*/
|
|
213
406
|
function WorkerIntervalSmart(timeout, options = {}) {
|
|
214
407
|
return function (target, propertyKey, descriptor) {
|
|
215
408
|
const lockKey = generateLockKey(target.constructor.name, String(propertyKey));
|
|
216
409
|
return createWorkerDecoratorWithLock((0, schedule_1.Interval)(timeout), 'WorkerIntervalSmart', lockKey, Object.assign({ lockTtl: Math.floor(timeout * 0.8), logExecution: true }, options))(target, propertyKey, descriptor);
|
|
217
410
|
};
|
|
218
411
|
}
|
|
412
|
+
/**
|
|
413
|
+
* Advanced Cron decorator with full control
|
|
414
|
+
* Alias for WorkerCronSmart with explicit lock key parameter
|
|
415
|
+
*
|
|
416
|
+
* @param cronTime - Cron expression
|
|
417
|
+
* @param lockKeyOrOptions - Lock key (string) or options object
|
|
418
|
+
* @param options - Schedule options (only if lockKeyOrOptions is a string)
|
|
419
|
+
*
|
|
420
|
+
* @example
|
|
421
|
+
* ```typescript
|
|
422
|
+
* @WorkerCronAdvanced('0 0 * * *', 'daily-report', {
|
|
423
|
+
* lockTtl: 7200000,
|
|
424
|
+
* retryCount: 5,
|
|
425
|
+
* useExponentialBackoff: true,
|
|
426
|
+
* })
|
|
427
|
+
* async generateDailyReport() {
|
|
428
|
+
* // Task logic
|
|
429
|
+
* }
|
|
430
|
+
* ```
|
|
431
|
+
*/
|
|
219
432
|
function WorkerCronAdvanced(cronTime, lockKeyOrOptions, options, cronOptions) {
|
|
220
433
|
return function (target, propertyKey, descriptor) {
|
|
221
434
|
let lockKey;
|