@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,22 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache serialization options
|
|
3
|
+
*/
|
|
1
4
|
export interface CacheSerializationOptions {
|
|
5
|
+
/** Whether to compress large values */
|
|
2
6
|
compress?: boolean;
|
|
7
|
+
/** Compression threshold (bytes) */
|
|
3
8
|
compressThreshold?: number;
|
|
4
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Serialization result
|
|
12
|
+
*/
|
|
5
13
|
export interface SerializationResult {
|
|
6
14
|
data: Buffer;
|
|
7
15
|
compressed: boolean;
|
|
8
16
|
originalSize: number;
|
|
9
17
|
serializedSize: number;
|
|
10
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Deserialization result
|
|
21
|
+
*/
|
|
11
22
|
export interface DeserializationResult<T> {
|
|
12
23
|
data: T;
|
|
13
24
|
wasCompressed: boolean;
|
|
14
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Simple cache serialization service
|
|
28
|
+
*
|
|
29
|
+
* Handles basic data compression for cache values
|
|
30
|
+
*/
|
|
15
31
|
export declare class CacheSerializationService {
|
|
16
32
|
private readonly logger;
|
|
33
|
+
/**
|
|
34
|
+
* Serialize and optionally compress cache value
|
|
35
|
+
*/
|
|
17
36
|
serialize<T>(value: T, options?: CacheSerializationOptions): Promise<SerializationResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Deserialize and decompress cache value
|
|
39
|
+
*/
|
|
18
40
|
deserialize<T>(buffer: Buffer): Promise<DeserializationResult<T>>;
|
|
41
|
+
/**
|
|
42
|
+
* Serialize value with proper Date handling
|
|
43
|
+
*/
|
|
19
44
|
private serializeWithDates;
|
|
45
|
+
/**
|
|
46
|
+
* Pre-process object to convert Date objects to serializable format
|
|
47
|
+
*/
|
|
20
48
|
private preProcessDates;
|
|
49
|
+
/**
|
|
50
|
+
* Deserialize value with proper Date restoration
|
|
51
|
+
*/
|
|
21
52
|
private deserializeWithDates;
|
|
22
53
|
}
|
|
@@ -22,18 +22,28 @@ const zlib_1 = require("zlib");
|
|
|
22
22
|
const util_1 = require("util");
|
|
23
23
|
const gzipAsync = (0, util_1.promisify)(zlib_1.gzip);
|
|
24
24
|
const gunzipAsync = (0, util_1.promisify)(zlib_1.gunzip);
|
|
25
|
+
/**
|
|
26
|
+
* Simple cache serialization service
|
|
27
|
+
*
|
|
28
|
+
* Handles basic data compression for cache values
|
|
29
|
+
*/
|
|
25
30
|
let CacheSerializationService = CacheSerializationService_1 = class CacheSerializationService {
|
|
26
31
|
constructor() {
|
|
27
32
|
this.logger = new common_1.Logger(CacheSerializationService_1.name);
|
|
28
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Serialize and optionally compress cache value
|
|
36
|
+
*/
|
|
29
37
|
serialize(value_1) {
|
|
30
38
|
return __awaiter(this, arguments, void 0, function* (value, options = {}) {
|
|
31
39
|
const { compress = false, compressThreshold = 1024 } = options;
|
|
32
40
|
try {
|
|
41
|
+
// Serialize the value with date handling
|
|
33
42
|
const serialized = this.serializeWithDates(value);
|
|
34
43
|
const originalSize = Buffer.byteLength(serialized, 'utf8');
|
|
35
44
|
let data;
|
|
36
45
|
let wasCompressed = false;
|
|
46
|
+
// Compress if enabled and data is large enough
|
|
37
47
|
if (compress && originalSize >= compressThreshold) {
|
|
38
48
|
try {
|
|
39
49
|
data = yield gzipAsync(Buffer.from(serialized, 'utf8'));
|
|
@@ -60,12 +70,17 @@ let CacheSerializationService = CacheSerializationService_1 = class CacheSeriali
|
|
|
60
70
|
}
|
|
61
71
|
});
|
|
62
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Deserialize and decompress cache value
|
|
75
|
+
*/
|
|
63
76
|
deserialize(buffer) {
|
|
64
77
|
return __awaiter(this, void 0, void 0, function* () {
|
|
65
78
|
try {
|
|
66
79
|
let dataString;
|
|
67
80
|
let wasCompressed = false;
|
|
81
|
+
// Try to detect if data is compressed
|
|
68
82
|
if (buffer.length >= 2 && buffer[0] === 0x1f && buffer[1] === 0x8b) {
|
|
83
|
+
// Gzip magic numbers
|
|
69
84
|
dataString = (yield gunzipAsync(buffer)).toString('utf8');
|
|
70
85
|
wasCompressed = true;
|
|
71
86
|
}
|
|
@@ -84,10 +99,17 @@ let CacheSerializationService = CacheSerializationService_1 = class CacheSeriali
|
|
|
84
99
|
}
|
|
85
100
|
});
|
|
86
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Serialize value with proper Date handling
|
|
104
|
+
*/
|
|
87
105
|
serializeWithDates(value) {
|
|
106
|
+
// Pre-process the value to handle Date objects
|
|
88
107
|
const processed = this.preProcessDates(value);
|
|
89
108
|
return JSON.stringify(processed);
|
|
90
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Pre-process object to convert Date objects to serializable format
|
|
112
|
+
*/
|
|
91
113
|
preProcessDates(obj) {
|
|
92
114
|
if (obj === null || obj === undefined) {
|
|
93
115
|
return obj;
|
|
@@ -107,6 +129,9 @@ let CacheSerializationService = CacheSerializationService_1 = class CacheSeriali
|
|
|
107
129
|
}
|
|
108
130
|
return obj;
|
|
109
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Deserialize value with proper Date restoration
|
|
134
|
+
*/
|
|
110
135
|
deserializeWithDates(dataString) {
|
|
111
136
|
return JSON.parse(dataString, (key, val) => {
|
|
112
137
|
if (val && typeof val === 'object' && val.__type === 'Date') {
|
|
@@ -1,2 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache constants and injection tokens
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Injection token for cache compression enabled flag
|
|
6
|
+
*/
|
|
1
7
|
export declare const CACHE_COMPRESSION_ENABLED: unique symbol;
|
|
8
|
+
/**
|
|
9
|
+
* Injection token for cache compression threshold
|
|
10
|
+
*/
|
|
2
11
|
export declare const CACHE_COMPRESSION_THRESHOLD: unique symbol;
|
package/cache/cache.constants.js
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cache constants and injection tokens
|
|
4
|
+
*/
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.CACHE_COMPRESSION_THRESHOLD = exports.CACHE_COMPRESSION_ENABLED = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Injection token for cache compression enabled flag
|
|
9
|
+
*/
|
|
4
10
|
exports.CACHE_COMPRESSION_ENABLED = Symbol('CACHE_COMPRESSION_ENABLED');
|
|
11
|
+
/**
|
|
12
|
+
* Injection token for cache compression threshold
|
|
13
|
+
*/
|
|
5
14
|
exports.CACHE_COMPRESSION_THRESHOLD = Symbol('CACHE_COMPRESSION_THRESHOLD');
|
package/cache/cache.health.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { CacheService } from './cache.service';
|
|
2
|
+
/**
|
|
3
|
+
* Cache health check result
|
|
4
|
+
*/
|
|
2
5
|
export interface CacheHealthResult {
|
|
3
6
|
status: 'healthy' | 'degraded' | 'unhealthy';
|
|
4
7
|
layers: {
|
|
@@ -22,14 +25,37 @@ export interface CacheHealthResult {
|
|
|
22
25
|
timestamp: Date;
|
|
23
26
|
overallLatency: number;
|
|
24
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Cache health checker
|
|
30
|
+
*
|
|
31
|
+
* Provides health monitoring for all cache layers
|
|
32
|
+
*/
|
|
25
33
|
export declare class CacheHealthChecker {
|
|
26
34
|
private readonly cacheService;
|
|
27
35
|
private readonly logger;
|
|
28
36
|
constructor(cacheService: CacheService);
|
|
37
|
+
/**
|
|
38
|
+
* Check health of all cache layers
|
|
39
|
+
*/
|
|
29
40
|
checkHealth(): Promise<CacheHealthResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Get detailed cache statistics
|
|
43
|
+
*/
|
|
30
44
|
getDetailedStats(): Promise<any>;
|
|
45
|
+
/**
|
|
46
|
+
* Check CLS cache health
|
|
47
|
+
*/
|
|
31
48
|
private checkClsHealth;
|
|
49
|
+
/**
|
|
50
|
+
* Check Memory cache health
|
|
51
|
+
*/
|
|
32
52
|
private checkMemoryHealth;
|
|
53
|
+
/**
|
|
54
|
+
* Check Redis cache health
|
|
55
|
+
*/
|
|
33
56
|
private checkRedisHealth;
|
|
57
|
+
/**
|
|
58
|
+
* Generate recommendations based on health and stats
|
|
59
|
+
*/
|
|
34
60
|
private generateRecommendations;
|
|
35
61
|
}
|
package/cache/cache.health.js
CHANGED
|
@@ -23,11 +23,19 @@ exports.CacheHealthChecker = void 0;
|
|
|
23
23
|
const common_1 = require("@nestjs/common");
|
|
24
24
|
const cache_service_1 = require("./cache.service");
|
|
25
25
|
const cache_options_interface_1 = require("./interfaces/cache-options.interface");
|
|
26
|
+
/**
|
|
27
|
+
* Cache health checker
|
|
28
|
+
*
|
|
29
|
+
* Provides health monitoring for all cache layers
|
|
30
|
+
*/
|
|
26
31
|
let CacheHealthChecker = CacheHealthChecker_1 = class CacheHealthChecker {
|
|
27
32
|
constructor(cacheService) {
|
|
28
33
|
this.cacheService = cacheService;
|
|
29
34
|
this.logger = new common_1.Logger(CacheHealthChecker_1.name);
|
|
30
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Check health of all cache layers
|
|
38
|
+
*/
|
|
31
39
|
checkHealth() {
|
|
32
40
|
return __awaiter(this, void 0, void 0, function* () {
|
|
33
41
|
const startTime = Date.now();
|
|
@@ -37,6 +45,7 @@ let CacheHealthChecker = CacheHealthChecker_1 = class CacheHealthChecker {
|
|
|
37
45
|
redis: yield this.checkRedisHealth(),
|
|
38
46
|
};
|
|
39
47
|
const overallLatency = Date.now() - startTime;
|
|
48
|
+
// Determine overall status
|
|
40
49
|
const layerStatuses = Object.values(results);
|
|
41
50
|
const healthyCount = layerStatuses.filter((layer) => layer.available).length;
|
|
42
51
|
const totalCount = layerStatuses.length;
|
|
@@ -58,6 +67,9 @@ let CacheHealthChecker = CacheHealthChecker_1 = class CacheHealthChecker {
|
|
|
58
67
|
};
|
|
59
68
|
});
|
|
60
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Get detailed cache statistics
|
|
72
|
+
*/
|
|
61
73
|
getDetailedStats() {
|
|
62
74
|
return __awaiter(this, void 0, void 0, function* () {
|
|
63
75
|
const stats = this.cacheService.getStats();
|
|
@@ -69,10 +81,14 @@ let CacheHealthChecker = CacheHealthChecker_1 = class CacheHealthChecker {
|
|
|
69
81
|
};
|
|
70
82
|
});
|
|
71
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Check CLS cache health
|
|
86
|
+
*/
|
|
72
87
|
checkClsHealth() {
|
|
73
88
|
return __awaiter(this, void 0, void 0, function* () {
|
|
74
89
|
const startTime = Date.now();
|
|
75
90
|
try {
|
|
91
|
+
// Try to write and read a test value
|
|
76
92
|
yield this.cacheService.set('health:cls:test', 'test-value', {
|
|
77
93
|
layers: [cache_options_interface_1.CacheLayer.CLS],
|
|
78
94
|
});
|
|
@@ -101,10 +117,14 @@ let CacheHealthChecker = CacheHealthChecker_1 = class CacheHealthChecker {
|
|
|
101
117
|
}
|
|
102
118
|
});
|
|
103
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Check Memory cache health
|
|
122
|
+
*/
|
|
104
123
|
checkMemoryHealth() {
|
|
105
124
|
return __awaiter(this, void 0, void 0, function* () {
|
|
106
125
|
const startTime = Date.now();
|
|
107
126
|
try {
|
|
127
|
+
// Try to write and read a test value
|
|
108
128
|
yield this.cacheService.set('health:memory:test', 'test-value', {
|
|
109
129
|
layers: [cache_options_interface_1.CacheLayer.MEMORY],
|
|
110
130
|
});
|
|
@@ -113,6 +133,7 @@ let CacheHealthChecker = CacheHealthChecker_1 = class CacheHealthChecker {
|
|
|
113
133
|
});
|
|
114
134
|
const latency = Date.now() - startTime;
|
|
115
135
|
if (result === 'test-value') {
|
|
136
|
+
// Get memory cache size (if available)
|
|
116
137
|
const stats = this.cacheService.getStats();
|
|
117
138
|
return { available: true, latency, size: stats.totalSets };
|
|
118
139
|
}
|
|
@@ -134,10 +155,14 @@ let CacheHealthChecker = CacheHealthChecker_1 = class CacheHealthChecker {
|
|
|
134
155
|
}
|
|
135
156
|
});
|
|
136
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Check Redis cache health
|
|
160
|
+
*/
|
|
137
161
|
checkRedisHealth() {
|
|
138
162
|
return __awaiter(this, void 0, void 0, function* () {
|
|
139
163
|
const startTime = Date.now();
|
|
140
164
|
try {
|
|
165
|
+
// Try to write and read a test value
|
|
141
166
|
yield this.cacheService.set('health:redis:test', 'test-value', {
|
|
142
167
|
layers: [cache_options_interface_1.CacheLayer.REDIS],
|
|
143
168
|
});
|
|
@@ -166,8 +191,12 @@ let CacheHealthChecker = CacheHealthChecker_1 = class CacheHealthChecker {
|
|
|
166
191
|
}
|
|
167
192
|
});
|
|
168
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Generate recommendations based on health and stats
|
|
196
|
+
*/
|
|
169
197
|
generateRecommendations(health, stats) {
|
|
170
198
|
const recommendations = [];
|
|
199
|
+
// Health-based recommendations
|
|
171
200
|
if (!health.layers.redis.available) {
|
|
172
201
|
recommendations.push('Redis is unavailable. Check Redis connection and configuration.');
|
|
173
202
|
}
|
|
@@ -177,6 +206,7 @@ let CacheHealthChecker = CacheHealthChecker_1 = class CacheHealthChecker {
|
|
|
177
206
|
if (health.overallLatency > 100) {
|
|
178
207
|
recommendations.push('Cache latency is high. Consider optimizing cache operations or increasing resources.');
|
|
179
208
|
}
|
|
209
|
+
// Statistics-based recommendations
|
|
180
210
|
if (stats.hitRate < 0.5) {
|
|
181
211
|
recommendations.push('Cache hit rate is low. Review cache TTL and key patterns.');
|
|
182
212
|
}
|
package/cache/cache.module.d.ts
CHANGED
|
@@ -2,20 +2,106 @@ import { DynamicModule, OnModuleInit } from '@nestjs/common';
|
|
|
2
2
|
import type { DataSource } from 'typeorm';
|
|
3
3
|
import type { Redis } from 'ioredis';
|
|
4
4
|
import { CacheService } from './cache.service';
|
|
5
|
+
/**
|
|
6
|
+
* Injection token for CacheService
|
|
7
|
+
*/
|
|
5
8
|
export declare const CACHE_SERVICE: unique symbol;
|
|
9
|
+
/**
|
|
10
|
+
* Cache module configuration options
|
|
11
|
+
*/
|
|
6
12
|
export interface CacheModuleOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Whether to make the module global
|
|
15
|
+
* @default true
|
|
16
|
+
*/
|
|
7
17
|
isGlobal?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Redis client instance (optional)
|
|
20
|
+
* If not provided, Redis caching will be disabled
|
|
21
|
+
*/
|
|
8
22
|
redisClient?: Redis;
|
|
23
|
+
/**
|
|
24
|
+
* TypeORM DataSource for DbDependency
|
|
25
|
+
* If not provided, DbDependency will throw error when used
|
|
26
|
+
*/
|
|
9
27
|
dataSource?: DataSource;
|
|
28
|
+
/**
|
|
29
|
+
* Default TTL for memory cache in milliseconds
|
|
30
|
+
*/
|
|
10
31
|
memoryTtl?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Namespace for memory cache
|
|
34
|
+
*/
|
|
11
35
|
memoryNamespace?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Enable compression for cache values
|
|
38
|
+
* @default false
|
|
39
|
+
*/
|
|
12
40
|
enableCompression?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Compression threshold in bytes
|
|
43
|
+
* @default 1024
|
|
44
|
+
*/
|
|
13
45
|
compressionThreshold?: number;
|
|
14
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Unified cache module with three-tier architecture
|
|
49
|
+
*
|
|
50
|
+
* Provides CacheService and cache decorators (@Cacheable, @CacheEvict, @CachePut)
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* // Basic usage (without Redis)
|
|
55
|
+
* @Module({
|
|
56
|
+
* imports: [
|
|
57
|
+
* CacheModule.forRoot()
|
|
58
|
+
* ]
|
|
59
|
+
* })
|
|
60
|
+
* export class AppModule {}
|
|
61
|
+
*
|
|
62
|
+
* // With Redis
|
|
63
|
+
* import { RedisModule } from '@songkeys/nestjs-redis';
|
|
64
|
+
*
|
|
65
|
+
* @Module({
|
|
66
|
+
* imports: [
|
|
67
|
+
* RedisModule.forRoot({ ... }),
|
|
68
|
+
* CacheModule.forRootAsync({
|
|
69
|
+
* imports: [RedisModule],
|
|
70
|
+
* inject: [RedisService],
|
|
71
|
+
* useFactory: (redisService: RedisService) => ({
|
|
72
|
+
* redisClient: redisService.getClient()
|
|
73
|
+
* })
|
|
74
|
+
* })
|
|
75
|
+
* ]
|
|
76
|
+
* })
|
|
77
|
+
* export class AppModule {}
|
|
78
|
+
*
|
|
79
|
+
* // With TypeORM DataSource for DbDependency
|
|
80
|
+
* @Module({
|
|
81
|
+
* imports: [
|
|
82
|
+
* TypeOrmModule.forRoot({ ... }),
|
|
83
|
+
* CacheModule.forRootAsync({
|
|
84
|
+
* imports: [TypeOrmModule],
|
|
85
|
+
* inject: [DataSource],
|
|
86
|
+
* useFactory: (dataSource: DataSource) => ({
|
|
87
|
+
* dataSource
|
|
88
|
+
* })
|
|
89
|
+
* })
|
|
90
|
+
* ]
|
|
91
|
+
* })
|
|
92
|
+
* export class AppModule {}
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
15
95
|
export declare class CacheModule implements OnModuleInit {
|
|
16
96
|
private readonly cacheService;
|
|
17
97
|
constructor(cacheService: CacheService);
|
|
98
|
+
/**
|
|
99
|
+
* Register cache module with options
|
|
100
|
+
*/
|
|
18
101
|
static forRoot(options?: CacheModuleOptions): DynamicModule;
|
|
102
|
+
/**
|
|
103
|
+
* Register cache module asynchronously
|
|
104
|
+
*/
|
|
19
105
|
static forRootAsync(options: {
|
|
20
106
|
imports?: any[];
|
|
21
107
|
inject?: any[];
|
package/cache/cache.module.js
CHANGED
|
@@ -20,13 +20,68 @@ const dependencies_1 = require("./dependencies");
|
|
|
20
20
|
const decorators_1 = require("./decorators");
|
|
21
21
|
const providers_1 = require("./providers");
|
|
22
22
|
const cache_constants_1 = require("./cache.constants");
|
|
23
|
+
/**
|
|
24
|
+
* Injection token for CacheService
|
|
25
|
+
*/
|
|
23
26
|
exports.CACHE_SERVICE = Symbol('CACHE_SERVICE');
|
|
27
|
+
/**
|
|
28
|
+
* Unified cache module with three-tier architecture
|
|
29
|
+
*
|
|
30
|
+
* Provides CacheService and cache decorators (@Cacheable, @CacheEvict, @CachePut)
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* // Basic usage (without Redis)
|
|
35
|
+
* @Module({
|
|
36
|
+
* imports: [
|
|
37
|
+
* CacheModule.forRoot()
|
|
38
|
+
* ]
|
|
39
|
+
* })
|
|
40
|
+
* export class AppModule {}
|
|
41
|
+
*
|
|
42
|
+
* // With Redis
|
|
43
|
+
* import { RedisModule } from '@songkeys/nestjs-redis';
|
|
44
|
+
*
|
|
45
|
+
* @Module({
|
|
46
|
+
* imports: [
|
|
47
|
+
* RedisModule.forRoot({ ... }),
|
|
48
|
+
* CacheModule.forRootAsync({
|
|
49
|
+
* imports: [RedisModule],
|
|
50
|
+
* inject: [RedisService],
|
|
51
|
+
* useFactory: (redisService: RedisService) => ({
|
|
52
|
+
* redisClient: redisService.getClient()
|
|
53
|
+
* })
|
|
54
|
+
* })
|
|
55
|
+
* ]
|
|
56
|
+
* })
|
|
57
|
+
* export class AppModule {}
|
|
58
|
+
*
|
|
59
|
+
* // With TypeORM DataSource for DbDependency
|
|
60
|
+
* @Module({
|
|
61
|
+
* imports: [
|
|
62
|
+
* TypeOrmModule.forRoot({ ... }),
|
|
63
|
+
* CacheModule.forRootAsync({
|
|
64
|
+
* imports: [TypeOrmModule],
|
|
65
|
+
* inject: [DataSource],
|
|
66
|
+
* useFactory: (dataSource: DataSource) => ({
|
|
67
|
+
* dataSource
|
|
68
|
+
* })
|
|
69
|
+
* })
|
|
70
|
+
* ]
|
|
71
|
+
* })
|
|
72
|
+
* export class AppModule {}
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
24
75
|
let CacheModule = CacheModule_1 = class CacheModule {
|
|
25
76
|
constructor(cacheService) {
|
|
26
77
|
this.cacheService = cacheService;
|
|
27
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Register cache module with options
|
|
81
|
+
*/
|
|
28
82
|
static forRoot(options = {}) {
|
|
29
83
|
const { isGlobal = true, redisClient, dataSource, memoryTtl, memoryNamespace, enableCompression = false, compressionThreshold = 1024, } = options;
|
|
84
|
+
// Set DataSource for DbDependency if provided
|
|
30
85
|
if (dataSource) {
|
|
31
86
|
dependencies_1.DbDependency.setDataSource(dataSource);
|
|
32
87
|
}
|
|
@@ -34,6 +89,7 @@ let CacheModule = CacheModule_1 = class CacheModule {
|
|
|
34
89
|
module: CacheModule_1,
|
|
35
90
|
global: isGlobal,
|
|
36
91
|
providers: [
|
|
92
|
+
// Providers
|
|
37
93
|
providers_1.ClsCacheProvider,
|
|
38
94
|
{
|
|
39
95
|
provide: providers_1.MemoryCacheProvider,
|
|
@@ -42,6 +98,7 @@ let CacheModule = CacheModule_1 = class CacheModule {
|
|
|
42
98
|
namespace: memoryNamespace,
|
|
43
99
|
}),
|
|
44
100
|
},
|
|
101
|
+
// Redis client provider (optional)
|
|
45
102
|
...(redisClient
|
|
46
103
|
? [
|
|
47
104
|
{
|
|
@@ -51,6 +108,7 @@ let CacheModule = CacheModule_1 = class CacheModule {
|
|
|
51
108
|
]
|
|
52
109
|
: []),
|
|
53
110
|
providers_1.RedisCacheProvider,
|
|
111
|
+
// Compression configuration providers
|
|
54
112
|
{
|
|
55
113
|
provide: cache_constants_1.CACHE_COMPRESSION_ENABLED,
|
|
56
114
|
useValue: enableCompression,
|
|
@@ -59,12 +117,14 @@ let CacheModule = CacheModule_1 = class CacheModule {
|
|
|
59
117
|
provide: cache_constants_1.CACHE_COMPRESSION_THRESHOLD,
|
|
60
118
|
useValue: compressionThreshold,
|
|
61
119
|
},
|
|
120
|
+
// Additional services
|
|
62
121
|
cache_warmup_service_1.CacheWarmupService,
|
|
63
122
|
cache_metrics_service_1.CacheMetricsService,
|
|
64
123
|
{
|
|
65
124
|
provide: cache_serialization_service_1.CacheSerializationService,
|
|
66
125
|
useFactory: () => new cache_serialization_service_1.CacheSerializationService(),
|
|
67
126
|
},
|
|
127
|
+
// CacheService
|
|
68
128
|
{
|
|
69
129
|
provide: exports.CACHE_SERVICE,
|
|
70
130
|
useClass: cache_service_1.CacheService,
|
|
@@ -80,6 +140,9 @@ let CacheModule = CacheModule_1 = class CacheModule {
|
|
|
80
140
|
],
|
|
81
141
|
};
|
|
82
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Register cache module asynchronously
|
|
145
|
+
*/
|
|
83
146
|
static forRootAsync(options) {
|
|
84
147
|
var _a;
|
|
85
148
|
return {
|
|
@@ -87,15 +150,18 @@ let CacheModule = CacheModule_1 = class CacheModule {
|
|
|
87
150
|
global: (_a = options.isGlobal) !== null && _a !== void 0 ? _a : true,
|
|
88
151
|
imports: options.imports || [],
|
|
89
152
|
providers: [
|
|
153
|
+
// Async options provider
|
|
90
154
|
{
|
|
91
155
|
provide: 'CACHE_MODULE_OPTIONS',
|
|
92
156
|
useFactory: options.useFactory,
|
|
93
157
|
inject: options.inject || [],
|
|
94
158
|
},
|
|
159
|
+
// Providers
|
|
95
160
|
providers_1.ClsCacheProvider,
|
|
96
161
|
{
|
|
97
162
|
provide: providers_1.MemoryCacheProvider,
|
|
98
163
|
useFactory: (moduleOptions) => {
|
|
164
|
+
// Set DataSource for DbDependency if provided
|
|
99
165
|
if (moduleOptions.dataSource) {
|
|
100
166
|
dependencies_1.DbDependency.setDataSource(moduleOptions.dataSource);
|
|
101
167
|
}
|
|
@@ -106,18 +172,21 @@ let CacheModule = CacheModule_1 = class CacheModule {
|
|
|
106
172
|
},
|
|
107
173
|
inject: ['CACHE_MODULE_OPTIONS'],
|
|
108
174
|
},
|
|
175
|
+
// Redis client provider (optional)
|
|
109
176
|
{
|
|
110
177
|
provide: providers_1.REDIS_CLIENT,
|
|
111
178
|
useFactory: (moduleOptions) => moduleOptions.redisClient,
|
|
112
179
|
inject: ['CACHE_MODULE_OPTIONS'],
|
|
113
180
|
},
|
|
114
181
|
providers_1.RedisCacheProvider,
|
|
182
|
+
// Additional services
|
|
115
183
|
cache_warmup_service_1.CacheWarmupService,
|
|
116
184
|
cache_metrics_service_1.CacheMetricsService,
|
|
117
185
|
{
|
|
118
186
|
provide: cache_serialization_service_1.CacheSerializationService,
|
|
119
187
|
useFactory: () => new cache_serialization_service_1.CacheSerializationService(),
|
|
120
188
|
},
|
|
189
|
+
// Compression configuration providers
|
|
121
190
|
{
|
|
122
191
|
provide: cache_constants_1.CACHE_COMPRESSION_ENABLED,
|
|
123
192
|
useFactory: (moduleOptions) => moduleOptions.enableCompression || false,
|
|
@@ -128,6 +197,7 @@ let CacheModule = CacheModule_1 = class CacheModule {
|
|
|
128
197
|
useFactory: (moduleOptions) => moduleOptions.compressionThreshold || 1024,
|
|
129
198
|
inject: ['CACHE_MODULE_OPTIONS'],
|
|
130
199
|
},
|
|
200
|
+
// CacheService
|
|
131
201
|
{
|
|
132
202
|
provide: exports.CACHE_SERVICE,
|
|
133
203
|
useClass: cache_service_1.CacheService,
|
|
@@ -144,6 +214,7 @@ let CacheModule = CacheModule_1 = class CacheModule {
|
|
|
144
214
|
};
|
|
145
215
|
}
|
|
146
216
|
onModuleInit() {
|
|
217
|
+
// Set global cache service for decorators
|
|
147
218
|
(0, decorators_1.setCacheService)(this.cacheService);
|
|
148
219
|
}
|
|
149
220
|
};
|