@nest-omni/core 4.1.3-1 → 4.1.3-11
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 +39 -1
- 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 +9 -1
- package/audit/decorators/audit-controller.decorator.js +11 -2
- package/audit/decorators/audit-operation.decorator.d.ts +45 -0
- package/audit/decorators/audit-operation.decorator.js +49 -0
- package/audit/decorators/entity-audit.decorator.d.ts +76 -1
- package/audit/decorators/entity-audit.decorator.js +135 -3
- package/audit/decorators/index.d.ts +1 -0
- package/audit/decorators/index.js +1 -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 +8 -0
- package/audit/entities/entity-audit-log.entity.js +33 -1
- package/audit/entities/entity-transaction.entity.d.ts +10 -0
- package/audit/entities/entity-transaction.entity.js +33 -1
- package/audit/entities/index.d.ts +2 -0
- package/audit/entities/index.js +2 -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 +45 -5
- package/audit/enums/audit.enums.js +47 -4
- package/audit/index.d.ts +3 -1
- package/audit/index.js +30 -1
- package/audit/interceptors/audit.interceptor.d.ts +15 -0
- package/audit/interceptors/audit.interceptor.js +23 -1
- package/audit/interfaces/audit.interfaces.d.ts +182 -2
- 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 +129 -3
- package/audit/services/entity-audit.service.js +301 -6
- package/audit/services/index.d.ts +2 -0
- package/audit/services/index.js +2 -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 -100
- 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 +20 -5
- 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 +278 -0
- package/redis-lock/redis-lock.service.js +282 -12
- 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 +235 -12
- package/setup/worker.decorator.d.ts +86 -0
- package/setup/worker.decorator.js +88 -0
- package/shared/serviceRegistryModule.js +27 -14
- 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
package/cache/index.js
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.KeyGenerator = exports.DependencyManager = exports.CacheLayer = exports.TimeDependency = exports.TagDependency = exports.FileDependency = exports.DbDependency = exports.ChainDependency = exports.CallbackDependency = exports.REDIS_CLIENT = exports.BaseCacheProvider = exports.RedisCacheProvider = exports.MemoryCacheProvider = exports.ClsCacheProvider = exports.setCacheService = exports.getCacheService = exports.CachePut = exports.CacheEvict = exports.Cacheable = exports.CacheSerializationService = exports.CacheMetricsService = exports.CacheWarmupService = exports.CacheHealthChecker = exports.CacheService = exports.CACHE_COMPRESSION_THRESHOLD = exports.CACHE_COMPRESSION_ENABLED = exports.CACHE_SERVICE = exports.CacheModule = void 0;
|
|
4
|
+
// Module
|
|
4
5
|
var cache_module_1 = require("./cache.module");
|
|
5
6
|
Object.defineProperty(exports, "CacheModule", { enumerable: true, get: function () { return cache_module_1.CacheModule; } });
|
|
6
7
|
Object.defineProperty(exports, "CACHE_SERVICE", { enumerable: true, get: function () { return cache_module_1.CACHE_SERVICE; } });
|
|
8
|
+
// Constants
|
|
7
9
|
var cache_constants_1 = require("./cache.constants");
|
|
8
10
|
Object.defineProperty(exports, "CACHE_COMPRESSION_ENABLED", { enumerable: true, get: function () { return cache_constants_1.CACHE_COMPRESSION_ENABLED; } });
|
|
9
11
|
Object.defineProperty(exports, "CACHE_COMPRESSION_THRESHOLD", { enumerable: true, get: function () { return cache_constants_1.CACHE_COMPRESSION_THRESHOLD; } });
|
|
12
|
+
// Service
|
|
10
13
|
var cache_service_1 = require("./cache.service");
|
|
11
14
|
Object.defineProperty(exports, "CacheService", { enumerable: true, get: function () { return cache_service_1.CacheService; } });
|
|
15
|
+
// Additional Services
|
|
12
16
|
var cache_health_1 = require("./cache.health");
|
|
13
17
|
Object.defineProperty(exports, "CacheHealthChecker", { enumerable: true, get: function () { return cache_health_1.CacheHealthChecker; } });
|
|
14
18
|
var cache_warmup_service_1 = require("./cache.warmup.service");
|
|
@@ -17,12 +21,14 @@ var cache_metrics_service_1 = require("./cache-metrics.service");
|
|
|
17
21
|
Object.defineProperty(exports, "CacheMetricsService", { enumerable: true, get: function () { return cache_metrics_service_1.CacheMetricsService; } });
|
|
18
22
|
var cache_serialization_service_1 = require("./cache-serialization.service");
|
|
19
23
|
Object.defineProperty(exports, "CacheSerializationService", { enumerable: true, get: function () { return cache_serialization_service_1.CacheSerializationService; } });
|
|
24
|
+
// Decorators
|
|
20
25
|
var decorators_1 = require("./decorators");
|
|
21
26
|
Object.defineProperty(exports, "Cacheable", { enumerable: true, get: function () { return decorators_1.Cacheable; } });
|
|
22
27
|
Object.defineProperty(exports, "CacheEvict", { enumerable: true, get: function () { return decorators_1.CacheEvict; } });
|
|
23
28
|
Object.defineProperty(exports, "CachePut", { enumerable: true, get: function () { return decorators_1.CachePut; } });
|
|
24
29
|
Object.defineProperty(exports, "getCacheService", { enumerable: true, get: function () { return decorators_1.getCacheService; } });
|
|
25
30
|
Object.defineProperty(exports, "setCacheService", { enumerable: true, get: function () { return decorators_1.setCacheService; } });
|
|
31
|
+
// Providers
|
|
26
32
|
var providers_1 = require("./providers");
|
|
27
33
|
Object.defineProperty(exports, "ClsCacheProvider", { enumerable: true, get: function () { return providers_1.ClsCacheProvider; } });
|
|
28
34
|
Object.defineProperty(exports, "MemoryCacheProvider", { enumerable: true, get: function () { return providers_1.MemoryCacheProvider; } });
|
|
@@ -30,6 +36,7 @@ Object.defineProperty(exports, "RedisCacheProvider", { enumerable: true, get: fu
|
|
|
30
36
|
Object.defineProperty(exports, "BaseCacheProvider", { enumerable: true, get: function () { return providers_1.BaseCacheProvider; } });
|
|
31
37
|
var redis_cache_provider_1 = require("./providers/redis-cache.provider");
|
|
32
38
|
Object.defineProperty(exports, "REDIS_CLIENT", { enumerable: true, get: function () { return redis_cache_provider_1.REDIS_CLIENT; } });
|
|
39
|
+
// Dependencies
|
|
33
40
|
var dependencies_1 = require("./dependencies");
|
|
34
41
|
Object.defineProperty(exports, "CallbackDependency", { enumerable: true, get: function () { return dependencies_1.CallbackDependency; } });
|
|
35
42
|
Object.defineProperty(exports, "ChainDependency", { enumerable: true, get: function () { return dependencies_1.ChainDependency; } });
|
|
@@ -37,8 +44,10 @@ Object.defineProperty(exports, "DbDependency", { enumerable: true, get: function
|
|
|
37
44
|
Object.defineProperty(exports, "FileDependency", { enumerable: true, get: function () { return dependencies_1.FileDependency; } });
|
|
38
45
|
Object.defineProperty(exports, "TagDependency", { enumerable: true, get: function () { return dependencies_1.TagDependency; } });
|
|
39
46
|
Object.defineProperty(exports, "TimeDependency", { enumerable: true, get: function () { return dependencies_1.TimeDependency; } });
|
|
47
|
+
// Interfaces
|
|
40
48
|
var interfaces_1 = require("./interfaces");
|
|
41
49
|
Object.defineProperty(exports, "CacheLayer", { enumerable: true, get: function () { return interfaces_1.CacheLayer; } });
|
|
50
|
+
// Utils (advanced usage)
|
|
42
51
|
var utils_1 = require("./utils");
|
|
43
52
|
Object.defineProperty(exports, "DependencyManager", { enumerable: true, get: function () { return utils_1.DependencyManager; } });
|
|
44
53
|
Object.defineProperty(exports, "KeyGenerator", { enumerable: true, get: function () { return utils_1.KeyGenerator; } });
|
|
@@ -1,11 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache dependency interface - similar to Yii2 cache dependency system
|
|
3
|
+
*
|
|
4
|
+
* A cache dependency represents a dependency relationship between cached data
|
|
5
|
+
* and some external state. When the external state changes, the cached data
|
|
6
|
+
* becomes invalid.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // Tag-based dependency
|
|
11
|
+
* new TagDependency(['user-list'])
|
|
12
|
+
*
|
|
13
|
+
* // Database-based dependency
|
|
14
|
+
* new DbDependency('SELECT MAX(updated_at) FROM users WHERE id = ?', [userId])
|
|
15
|
+
*
|
|
16
|
+
* // Callback-based dependency
|
|
17
|
+
* new CallbackDependency(() => ConfigService.get('app.version'))
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
1
20
|
export interface CacheDependency {
|
|
21
|
+
/**
|
|
22
|
+
* Get a unique key that identifies this dependency
|
|
23
|
+
* This key is used to store the dependency state
|
|
24
|
+
*
|
|
25
|
+
* @returns Unique dependency key
|
|
26
|
+
*/
|
|
2
27
|
getKey(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Get the current state/value of this dependency
|
|
30
|
+
* This value will be compared with stored state to detect changes
|
|
31
|
+
*
|
|
32
|
+
* @returns Current dependency data/state
|
|
33
|
+
*/
|
|
3
34
|
getData(): Promise<any>;
|
|
35
|
+
/**
|
|
36
|
+
* Check if the dependency has changed by comparing old data with current data
|
|
37
|
+
*
|
|
38
|
+
* @param oldData - Previously stored dependency data
|
|
39
|
+
* @returns true if dependency has changed, false otherwise
|
|
40
|
+
*/
|
|
4
41
|
isChanged(oldData: any): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Reset/clear the dependency state
|
|
44
|
+
* Used when manually invalidating dependencies
|
|
45
|
+
*/
|
|
5
46
|
reset?(): Promise<void>;
|
|
6
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Serialized dependency data stored alongside cached values
|
|
50
|
+
*/
|
|
7
51
|
export interface DependencyData {
|
|
52
|
+
/**
|
|
53
|
+
* Dependency key
|
|
54
|
+
*/
|
|
8
55
|
key: string;
|
|
56
|
+
/**
|
|
57
|
+
* Dependency state snapshot at cache time
|
|
58
|
+
*/
|
|
9
59
|
data: any;
|
|
60
|
+
/**
|
|
61
|
+
* Timestamp when dependency was captured
|
|
62
|
+
*/
|
|
10
63
|
timestamp: number;
|
|
11
64
|
}
|
|
@@ -1,32 +1,113 @@
|
|
|
1
1
|
import type { CacheDependency } from './cache-dependency.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Cache layer enum - defines the three-tier cache architecture
|
|
4
|
+
*/
|
|
2
5
|
export declare enum CacheLayer {
|
|
6
|
+
/** L1: Request-level cache (nestjs-cls) - fastest, scoped to request */
|
|
3
7
|
CLS = "cls",
|
|
8
|
+
/** L2: Process-level cache (native Map) - fast, scoped to process */
|
|
4
9
|
MEMORY = "memory",
|
|
10
|
+
/** L3: Distributed cache (Redis) - persistent, shared across processes */
|
|
5
11
|
REDIS = "redis"
|
|
6
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Cache configuration options
|
|
15
|
+
*/
|
|
7
16
|
export interface CacheOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Time to live in milliseconds
|
|
19
|
+
* @example 300_000 // 5 minutes
|
|
20
|
+
*/
|
|
8
21
|
ttl?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Cache layers to use
|
|
24
|
+
* @default [CacheLayer.MEMORY, CacheLayer.REDIS]
|
|
25
|
+
*/
|
|
9
26
|
layers?: CacheLayer[];
|
|
27
|
+
/**
|
|
28
|
+
* Key prefix for namespacing
|
|
29
|
+
* @example 'user:' will result in keys like 'user:123'
|
|
30
|
+
*/
|
|
10
31
|
prefix?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Condition function to determine if value should be cached
|
|
34
|
+
* @param args - Method arguments
|
|
35
|
+
* @returns true to cache, false to skip
|
|
36
|
+
*/
|
|
11
37
|
condition?: (...args: any[]) => boolean | Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Cache dependencies - cache will be invalidated when dependencies change
|
|
40
|
+
* Similar to Yii2 cache dependency system
|
|
41
|
+
*/
|
|
12
42
|
dependencies?: CacheDependency[];
|
|
43
|
+
/**
|
|
44
|
+
* Whether to backfill upper cache layers when value is found in lower layer
|
|
45
|
+
* @default true
|
|
46
|
+
*/
|
|
13
47
|
backfill?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Namespace for grouping related cache keys
|
|
50
|
+
*/
|
|
14
51
|
namespace?: string;
|
|
15
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Options for cache decorator key generation
|
|
55
|
+
*/
|
|
16
56
|
export interface CacheKeyOptions {
|
|
57
|
+
/**
|
|
58
|
+
* Static key or key generator function
|
|
59
|
+
*/
|
|
17
60
|
key?: string | ((...args: any[]) => string);
|
|
61
|
+
/**
|
|
62
|
+
* Key prefix
|
|
63
|
+
*/
|
|
18
64
|
prefix?: string;
|
|
65
|
+
/**
|
|
66
|
+
* Whether to include all method arguments in key generation
|
|
67
|
+
* @default false
|
|
68
|
+
*/
|
|
19
69
|
includeAllArgs?: boolean;
|
|
20
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Options for @Cacheable decorator
|
|
73
|
+
*/
|
|
21
74
|
export interface CacheableOptions extends CacheOptions, CacheKeyOptions {
|
|
22
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Options for @CacheEvict decorator
|
|
78
|
+
*/
|
|
23
79
|
export interface CacheEvictOptions {
|
|
80
|
+
/**
|
|
81
|
+
* Keys to evict (can be static strings or generator functions)
|
|
82
|
+
*/
|
|
24
83
|
keys?: Array<string | ((...args: any[]) => string)>;
|
|
84
|
+
/**
|
|
85
|
+
* Patterns to match for eviction (supports wildcards)
|
|
86
|
+
* @example ['user:*', 'posts:list:*']
|
|
87
|
+
*/
|
|
25
88
|
patterns?: string[];
|
|
89
|
+
/**
|
|
90
|
+
* Tags to invalidate
|
|
91
|
+
*/
|
|
26
92
|
tags?: string[];
|
|
93
|
+
/**
|
|
94
|
+
* Cache layers to evict from
|
|
95
|
+
*/
|
|
27
96
|
layers?: CacheLayer[];
|
|
97
|
+
/**
|
|
98
|
+
* Condition to determine if eviction should occur
|
|
99
|
+
* @param args - Method arguments
|
|
100
|
+
* @param result - Method return value
|
|
101
|
+
*/
|
|
28
102
|
condition?: (...args: any[]) => boolean | Promise<boolean>;
|
|
103
|
+
/**
|
|
104
|
+
* Whether to evict before or after method execution
|
|
105
|
+
* @default 'after'
|
|
106
|
+
*/
|
|
29
107
|
timing?: 'before' | 'after';
|
|
30
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Options for @CachePut decorator
|
|
111
|
+
*/
|
|
31
112
|
export interface CachePutOptions extends CacheOptions, CacheKeyOptions {
|
|
32
113
|
}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CacheLayer = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Cache layer enum - defines the three-tier cache architecture
|
|
6
|
+
*/
|
|
4
7
|
var CacheLayer;
|
|
5
8
|
(function (CacheLayer) {
|
|
9
|
+
/** L1: Request-level cache (nestjs-cls) - fastest, scoped to request */
|
|
6
10
|
CacheLayer["CLS"] = "cls";
|
|
11
|
+
/** L2: Process-level cache (native Map) - fast, scoped to process */
|
|
7
12
|
CacheLayer["MEMORY"] = "memory";
|
|
13
|
+
/** L3: Distributed cache (Redis) - persistent, shared across processes */
|
|
8
14
|
CacheLayer["REDIS"] = "redis";
|
|
9
15
|
})(CacheLayer || (exports.CacheLayer = CacheLayer = {}));
|
|
@@ -1,28 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base cache provider interface
|
|
3
|
+
* All cache providers (CLS, Memory, Redis) implement this interface
|
|
4
|
+
*/
|
|
1
5
|
export interface CacheProvider {
|
|
6
|
+
/**
|
|
7
|
+
* Get value from cache
|
|
8
|
+
*
|
|
9
|
+
* @param key - Cache key
|
|
10
|
+
* @returns Cached value or null if not found
|
|
11
|
+
*/
|
|
2
12
|
get<T>(key: string): Promise<T | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Set value in cache
|
|
15
|
+
*
|
|
16
|
+
* @param key - Cache key
|
|
17
|
+
* @param value - Value to cache
|
|
18
|
+
* @param ttl - Time to live in milliseconds
|
|
19
|
+
*/
|
|
3
20
|
set<T>(key: string, value: T, ttl?: number): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Delete value from cache
|
|
23
|
+
*
|
|
24
|
+
* @param key - Cache key or array of keys
|
|
25
|
+
*/
|
|
4
26
|
delete(key: string | string[]): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Delete keys matching a pattern (supports wildcards)
|
|
29
|
+
*
|
|
30
|
+
* @param pattern - Pattern to match (e.g., 'user:*')
|
|
31
|
+
* @returns Number of keys deleted
|
|
32
|
+
*/
|
|
5
33
|
deletePattern?(pattern: string): Promise<number>;
|
|
34
|
+
/**
|
|
35
|
+
* Clear all cache entries
|
|
36
|
+
*/
|
|
6
37
|
clear(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Check if a key exists in cache
|
|
40
|
+
*
|
|
41
|
+
* @param key - Cache key
|
|
42
|
+
*/
|
|
7
43
|
has(key: string): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Get multiple values at once
|
|
46
|
+
*
|
|
47
|
+
* @param keys - Array of cache keys
|
|
48
|
+
* @returns Array of values (null for missing keys)
|
|
49
|
+
*/
|
|
8
50
|
mget<T>(keys: string[]): Promise<(T | null)[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Set multiple values at once
|
|
53
|
+
*
|
|
54
|
+
* @param items - Array of key-value pairs
|
|
55
|
+
* @param ttl - Time to live in milliseconds
|
|
56
|
+
*/
|
|
9
57
|
mset(items: Array<{
|
|
10
58
|
key: string;
|
|
11
59
|
value: any;
|
|
12
60
|
}>, ttl?: number): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Get provider name
|
|
63
|
+
*/
|
|
13
64
|
getName(): string;
|
|
14
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Cache statistics
|
|
68
|
+
*/
|
|
15
69
|
export interface CacheStats {
|
|
70
|
+
/**
|
|
71
|
+
* Total number of get operations
|
|
72
|
+
*/
|
|
16
73
|
totalGets: number;
|
|
74
|
+
/**
|
|
75
|
+
* Number of cache hits
|
|
76
|
+
*/
|
|
17
77
|
hits: number;
|
|
78
|
+
/**
|
|
79
|
+
* Number of cache misses
|
|
80
|
+
*/
|
|
18
81
|
misses: number;
|
|
82
|
+
/**
|
|
83
|
+
* Hit rate (hits / totalGets)
|
|
84
|
+
*/
|
|
19
85
|
hitRate: number;
|
|
86
|
+
/**
|
|
87
|
+
* Stats per layer
|
|
88
|
+
*/
|
|
20
89
|
byLayer: Record<string, {
|
|
21
90
|
hits: number;
|
|
22
91
|
misses: number;
|
|
23
92
|
hitRate: number;
|
|
24
93
|
}>;
|
|
94
|
+
/**
|
|
95
|
+
* Total number of set operations
|
|
96
|
+
*/
|
|
25
97
|
totalSets: number;
|
|
98
|
+
/**
|
|
99
|
+
* Total number of delete operations
|
|
100
|
+
*/
|
|
26
101
|
totalDeletes: number;
|
|
102
|
+
/**
|
|
103
|
+
* Total number of clear operations
|
|
104
|
+
*/
|
|
27
105
|
totalClears: number;
|
|
28
106
|
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { CacheProvider } from '../interfaces/cache-provider.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Base cache provider with common utility methods
|
|
4
|
+
*/
|
|
2
5
|
export declare abstract class BaseCacheProvider implements CacheProvider {
|
|
3
6
|
abstract get<T>(key: string): Promise<T | null>;
|
|
4
7
|
abstract set<T>(key: string, value: T, ttl?: number): Promise<void>;
|
|
@@ -7,10 +10,21 @@ export declare abstract class BaseCacheProvider implements CacheProvider {
|
|
|
7
10
|
abstract clear(): Promise<void>;
|
|
8
11
|
abstract has(key: string): Promise<boolean>;
|
|
9
12
|
abstract getName(): string;
|
|
13
|
+
/**
|
|
14
|
+
* Get multiple values at once
|
|
15
|
+
* Default implementation - can be overridden for better performance
|
|
16
|
+
*/
|
|
10
17
|
mget<T>(keys: string[]): Promise<(T | null)[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Set multiple values at once
|
|
20
|
+
* Default implementation - can be overridden for better performance
|
|
21
|
+
*/
|
|
11
22
|
mset(items: Array<{
|
|
12
23
|
key: string;
|
|
13
24
|
value: any;
|
|
14
25
|
}>, ttl?: number): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Convert wildcard pattern to RegExp
|
|
28
|
+
*/
|
|
15
29
|
protected patternToRegex(pattern: string): RegExp;
|
|
16
30
|
}
|
|
@@ -10,21 +10,37 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.BaseCacheProvider = void 0;
|
|
13
|
+
/**
|
|
14
|
+
* Base cache provider with common utility methods
|
|
15
|
+
*/
|
|
13
16
|
class BaseCacheProvider {
|
|
17
|
+
/**
|
|
18
|
+
* Get multiple values at once
|
|
19
|
+
* Default implementation - can be overridden for better performance
|
|
20
|
+
*/
|
|
14
21
|
mget(keys) {
|
|
15
22
|
return __awaiter(this, void 0, void 0, function* () {
|
|
16
23
|
const promises = keys.map((key) => this.get(key));
|
|
17
24
|
return Promise.all(promises);
|
|
18
25
|
});
|
|
19
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Set multiple values at once
|
|
29
|
+
* Default implementation - can be overridden for better performance
|
|
30
|
+
*/
|
|
20
31
|
mset(items, ttl) {
|
|
21
32
|
return __awaiter(this, void 0, void 0, function* () {
|
|
22
33
|
const promises = items.map((item) => this.set(item.key, item.value, ttl));
|
|
23
34
|
yield Promise.all(promises);
|
|
24
35
|
});
|
|
25
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Convert wildcard pattern to RegExp
|
|
39
|
+
*/
|
|
26
40
|
patternToRegex(pattern) {
|
|
41
|
+
// Escape special regex characters except *
|
|
27
42
|
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
|
|
43
|
+
// Convert * to .*
|
|
28
44
|
const regexPattern = escaped.replace(/\*/g, '.*');
|
|
29
45
|
return new RegExp(`^${regexPattern}$`);
|
|
30
46
|
}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { BaseCacheProvider } from './base-cache.provider';
|
|
2
|
+
/**
|
|
3
|
+
* CLS (Continuation Local Storage) cache provider
|
|
4
|
+
*
|
|
5
|
+
* This is the L1 cache layer - request-scoped caching using nestjs-cls.
|
|
6
|
+
* Data stored here is only available within the same request context.
|
|
7
|
+
*
|
|
8
|
+
* Fastest cache layer but limited to single request lifecycle.
|
|
9
|
+
*/
|
|
2
10
|
export declare class ClsCacheProvider extends BaseCacheProvider {
|
|
3
11
|
private static readonly CACHE_PREFIX;
|
|
4
12
|
private static readonly KEYS_SET;
|
|
@@ -9,8 +17,20 @@ export declare class ClsCacheProvider extends BaseCacheProvider {
|
|
|
9
17
|
deletePattern(pattern: string): Promise<number>;
|
|
10
18
|
clear(): Promise<void>;
|
|
11
19
|
has(key: string): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Get full key with prefix
|
|
22
|
+
*/
|
|
12
23
|
private getFullKey;
|
|
24
|
+
/**
|
|
25
|
+
* Add key to tracked keys set
|
|
26
|
+
*/
|
|
13
27
|
private addKeyToSet;
|
|
28
|
+
/**
|
|
29
|
+
* Remove key from tracked keys set
|
|
30
|
+
*/
|
|
14
31
|
private removeKeyFromSet;
|
|
32
|
+
/**
|
|
33
|
+
* Get all tracked keys
|
|
34
|
+
*/
|
|
15
35
|
private getAllKeys;
|
|
16
36
|
}
|
|
@@ -12,6 +12,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.ClsCacheProvider = void 0;
|
|
13
13
|
const nestjs_cls_1 = require("nestjs-cls");
|
|
14
14
|
const base_cache_provider_1 = require("./base-cache.provider");
|
|
15
|
+
/**
|
|
16
|
+
* CLS (Continuation Local Storage) cache provider
|
|
17
|
+
*
|
|
18
|
+
* This is the L1 cache layer - request-scoped caching using nestjs-cls.
|
|
19
|
+
* Data stored here is only available within the same request context.
|
|
20
|
+
*
|
|
21
|
+
* Fastest cache layer but limited to single request lifecycle.
|
|
22
|
+
*/
|
|
15
23
|
class ClsCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
16
24
|
getName() {
|
|
17
25
|
return 'CLS';
|
|
@@ -25,6 +33,7 @@ class ClsCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
25
33
|
if (!cached) {
|
|
26
34
|
return null;
|
|
27
35
|
}
|
|
36
|
+
// Check TTL
|
|
28
37
|
if (cached.expiresAt && Date.now() > cached.expiresAt) {
|
|
29
38
|
yield this.delete(key);
|
|
30
39
|
return null;
|
|
@@ -32,6 +41,7 @@ class ClsCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
32
41
|
return cached.value;
|
|
33
42
|
}
|
|
34
43
|
catch (_a) {
|
|
44
|
+
// CLS might not be available (e.g., outside request context)
|
|
35
45
|
return null;
|
|
36
46
|
}
|
|
37
47
|
});
|
|
@@ -46,9 +56,11 @@ class ClsCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
46
56
|
cached.expiresAt = Date.now() + ttl;
|
|
47
57
|
}
|
|
48
58
|
store.set(fullKey, cached);
|
|
59
|
+
// Track this key for cleanup
|
|
49
60
|
this.addKeyToSet(key);
|
|
50
61
|
}
|
|
51
62
|
catch (_a) {
|
|
63
|
+
// CLS might not be available, silently fail
|
|
52
64
|
}
|
|
53
65
|
});
|
|
54
66
|
}
|
|
@@ -64,6 +76,7 @@ class ClsCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
64
76
|
}
|
|
65
77
|
}
|
|
66
78
|
catch (_a) {
|
|
79
|
+
// CLS might not be available, silently fail
|
|
67
80
|
}
|
|
68
81
|
});
|
|
69
82
|
}
|
|
@@ -90,6 +103,7 @@ class ClsCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
90
103
|
yield this.delete(allKeys);
|
|
91
104
|
}
|
|
92
105
|
catch (_a) {
|
|
106
|
+
// CLS might not be available, silently fail
|
|
93
107
|
}
|
|
94
108
|
});
|
|
95
109
|
}
|
|
@@ -99,9 +113,15 @@ class ClsCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
99
113
|
return value !== null;
|
|
100
114
|
});
|
|
101
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Get full key with prefix
|
|
118
|
+
*/
|
|
102
119
|
getFullKey(key) {
|
|
103
120
|
return `${ClsCacheProvider.CACHE_PREFIX}${key}`;
|
|
104
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Add key to tracked keys set
|
|
124
|
+
*/
|
|
105
125
|
addKeyToSet(key) {
|
|
106
126
|
try {
|
|
107
127
|
const store = nestjs_cls_1.ClsServiceManager.getClsService();
|
|
@@ -110,8 +130,12 @@ class ClsCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
110
130
|
store.set(ClsCacheProvider.KEYS_SET, keys);
|
|
111
131
|
}
|
|
112
132
|
catch (_a) {
|
|
133
|
+
// Ignore
|
|
113
134
|
}
|
|
114
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* Remove key from tracked keys set
|
|
138
|
+
*/
|
|
115
139
|
removeKeyFromSet(key) {
|
|
116
140
|
try {
|
|
117
141
|
const store = nestjs_cls_1.ClsServiceManager.getClsService();
|
|
@@ -122,8 +146,12 @@ class ClsCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
122
146
|
}
|
|
123
147
|
}
|
|
124
148
|
catch (_a) {
|
|
149
|
+
// Ignore
|
|
125
150
|
}
|
|
126
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Get all tracked keys
|
|
154
|
+
*/
|
|
127
155
|
getAllKeys() {
|
|
128
156
|
try {
|
|
129
157
|
const store = nestjs_cls_1.ClsServiceManager.getClsService();
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { BaseCacheProvider } from './base-cache.provider';
|
|
2
|
+
/**
|
|
3
|
+
* Memory cache provider using native Map with TTL support
|
|
4
|
+
*
|
|
5
|
+
* This is the L2 cache layer - process-level caching.
|
|
6
|
+
* Data is stored in memory and shared across all requests in the same process.
|
|
7
|
+
*
|
|
8
|
+
* Faster than Redis but not shared across multiple processes/servers.
|
|
9
|
+
*/
|
|
2
10
|
export declare class MemoryCacheProvider extends BaseCacheProvider {
|
|
3
11
|
private cache;
|
|
4
12
|
private keys;
|
|
@@ -15,10 +23,25 @@ export declare class MemoryCacheProvider extends BaseCacheProvider {
|
|
|
15
23
|
deletePattern(pattern: string): Promise<number>;
|
|
16
24
|
clear(): Promise<void>;
|
|
17
25
|
has(key: string): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Get all keys (for debugging/testing)
|
|
28
|
+
*/
|
|
18
29
|
getAllKeys(): string[];
|
|
30
|
+
/**
|
|
31
|
+
* Get cache size
|
|
32
|
+
*/
|
|
19
33
|
getSize(): number;
|
|
34
|
+
/**
|
|
35
|
+
* Clean up expired items (optional maintenance method)
|
|
36
|
+
*/
|
|
20
37
|
cleanup(): number;
|
|
38
|
+
/**
|
|
39
|
+
* Optimized mget with batch cleanup
|
|
40
|
+
*/
|
|
21
41
|
mget<T>(keys: string[]): Promise<(T | null)[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Optimized mset
|
|
44
|
+
*/
|
|
22
45
|
mset(items: Array<{
|
|
23
46
|
key: string;
|
|
24
47
|
value: any;
|
|
@@ -11,6 +11,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.MemoryCacheProvider = void 0;
|
|
13
13
|
const base_cache_provider_1 = require("./base-cache.provider");
|
|
14
|
+
/**
|
|
15
|
+
* Memory cache provider using native Map with TTL support
|
|
16
|
+
*
|
|
17
|
+
* This is the L2 cache layer - process-level caching.
|
|
18
|
+
* Data is stored in memory and shared across all requests in the same process.
|
|
19
|
+
*
|
|
20
|
+
* Faster than Redis but not shared across multiple processes/servers.
|
|
21
|
+
*/
|
|
14
22
|
class MemoryCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
15
23
|
constructor(options) {
|
|
16
24
|
super();
|
|
@@ -29,6 +37,7 @@ class MemoryCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
29
37
|
if (!item) {
|
|
30
38
|
return null;
|
|
31
39
|
}
|
|
40
|
+
// Check if item has expired
|
|
32
41
|
if (item.expiresAt && Date.now() > item.expiresAt) {
|
|
33
42
|
this.cache.delete(key);
|
|
34
43
|
this.keys.delete(key);
|
|
@@ -110,6 +119,7 @@ class MemoryCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
110
119
|
if (!item) {
|
|
111
120
|
return false;
|
|
112
121
|
}
|
|
122
|
+
// Check if item has expired
|
|
113
123
|
if (item.expiresAt && Date.now() > item.expiresAt) {
|
|
114
124
|
this.cache.delete(key);
|
|
115
125
|
this.keys.delete(key);
|
|
@@ -122,12 +132,21 @@ class MemoryCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
122
132
|
}
|
|
123
133
|
});
|
|
124
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Get all keys (for debugging/testing)
|
|
137
|
+
*/
|
|
125
138
|
getAllKeys() {
|
|
126
139
|
return Array.from(this.keys);
|
|
127
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Get cache size
|
|
143
|
+
*/
|
|
128
144
|
getSize() {
|
|
129
145
|
return this.keys.size;
|
|
130
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Clean up expired items (optional maintenance method)
|
|
149
|
+
*/
|
|
131
150
|
cleanup() {
|
|
132
151
|
let cleaned = 0;
|
|
133
152
|
const now = Date.now();
|
|
@@ -140,6 +159,9 @@ class MemoryCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
140
159
|
}
|
|
141
160
|
return cleaned;
|
|
142
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* Optimized mget with batch cleanup
|
|
164
|
+
*/
|
|
143
165
|
mget(keys) {
|
|
144
166
|
return __awaiter(this, void 0, void 0, function* () {
|
|
145
167
|
const results = [];
|
|
@@ -150,6 +172,7 @@ class MemoryCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
150
172
|
results.push(null);
|
|
151
173
|
continue;
|
|
152
174
|
}
|
|
175
|
+
// Check if item has expired
|
|
153
176
|
if (item.expiresAt && now > item.expiresAt) {
|
|
154
177
|
this.cache.delete(key);
|
|
155
178
|
this.keys.delete(key);
|
|
@@ -161,6 +184,9 @@ class MemoryCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
|
161
184
|
return results;
|
|
162
185
|
});
|
|
163
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Optimized mset
|
|
189
|
+
*/
|
|
164
190
|
mset(items, ttl) {
|
|
165
191
|
return __awaiter(this, void 0, void 0, function* () {
|
|
166
192
|
const promises = items.map((item) => this.set(item.key, item.value, ttl));
|