@nest-omni/core 3.1.1-12 → 3.1.1-13
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/cache/cache-metrics.service.d.ts +83 -0
- package/cache/cache-metrics.service.js +298 -0
- package/cache/cache-serialization.service.d.ts +29 -0
- package/cache/cache-serialization.service.js +217 -0
- package/cache/cache.health.d.ts +35 -0
- package/cache/cache.health.js +193 -0
- package/cache/cache.module.d.ts +24 -0
- package/cache/cache.module.js +105 -0
- package/cache/cache.service.d.ts +35 -0
- package/cache/cache.service.js +280 -0
- package/cache/cache.warmup.service.d.ts +34 -0
- package/cache/cache.warmup.service.js +199 -0
- package/cache/decorators/cache-evict.decorator.d.ts +2 -0
- package/cache/decorators/cache-evict.decorator.js +72 -0
- package/cache/decorators/cache-put.decorator.d.ts +2 -0
- package/cache/decorators/cache-put.decorator.js +48 -0
- package/cache/decorators/cacheable.decorator.d.ts +4 -0
- package/cache/decorators/cacheable.decorator.js +68 -0
- package/cache/decorators/index.d.ts +3 -0
- package/cache/decorators/index.js +11 -0
- package/cache/dependencies/callback.dependency.d.ts +11 -0
- package/cache/dependencies/callback.dependency.js +92 -0
- package/cache/dependencies/chain.dependency.d.ts +20 -0
- package/cache/dependencies/chain.dependency.js +113 -0
- package/cache/dependencies/db.dependency.d.ts +15 -0
- package/cache/dependencies/db.dependency.js +71 -0
- package/cache/dependencies/file.dependency.d.ts +17 -0
- package/cache/dependencies/file.dependency.js +63 -0
- package/cache/dependencies/index.d.ts +6 -0
- package/cache/dependencies/index.js +22 -0
- package/cache/dependencies/tag.dependency.d.ts +16 -0
- package/cache/dependencies/tag.dependency.js +75 -0
- package/cache/dependencies/time.dependency.d.ts +19 -0
- package/cache/dependencies/time.dependency.js +71 -0
- package/cache/examples/quick-start.d.ts +5 -0
- package/cache/examples/quick-start.js +341 -0
- package/cache/index.d.ts +14 -0
- package/cache/index.js +41 -0
- package/cache/interfaces/cache-dependency.interface.d.ts +11 -0
- package/cache/interfaces/cache-dependency.interface.js +2 -0
- package/cache/interfaces/cache-options.interface.d.ts +32 -0
- package/cache/interfaces/cache-options.interface.js +9 -0
- package/cache/interfaces/cache-provider.interface.d.ts +28 -0
- package/cache/interfaces/cache-provider.interface.js +2 -0
- package/cache/interfaces/index.d.ts +3 -0
- package/cache/interfaces/index.js +19 -0
- package/cache/providers/base-cache.provider.d.ts +16 -0
- package/cache/providers/base-cache.provider.js +32 -0
- package/cache/providers/cls-cache.provider.d.ts +16 -0
- package/cache/providers/cls-cache.provider.js +140 -0
- package/cache/providers/index.d.ts +4 -0
- package/cache/providers/index.js +23 -0
- package/cache/providers/memory-cache.provider.d.ts +23 -0
- package/cache/providers/memory-cache.provider.js +130 -0
- package/cache/providers/redis-cache.provider.d.ts +23 -0
- package/cache/providers/redis-cache.provider.js +215 -0
- package/cache/utils/dependency-manager.util.d.ts +15 -0
- package/cache/utils/dependency-manager.util.js +141 -0
- package/cache/utils/index.d.ts +2 -0
- package/cache/utils/index.js +18 -0
- package/cache/utils/key-generator.util.d.ts +13 -0
- package/cache/utils/key-generator.util.js +74 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +4 -17
- package/redis-lock/index.d.ts +4 -0
- package/redis-lock/index.js +13 -0
- package/{setup → redis-lock}/redis-lock.decorator.d.ts +3 -0
- package/{setup → redis-lock}/redis-lock.decorator.js +25 -14
- package/redis-lock/redis-lock.examples.d.ts +13 -0
- package/redis-lock/redis-lock.examples.js +159 -0
- package/redis-lock/redis-lock.module.d.ts +23 -0
- package/redis-lock/redis-lock.module.js +117 -0
- package/{setup → redis-lock}/redis-lock.service.d.ts +9 -21
- package/{setup → redis-lock}/redis-lock.service.js +29 -103
- package/setup/index.d.ts +1 -2
- package/setup/index.js +1 -2
- package/setup/schedule.decorator.js +1 -1
- package/shared/serviceRegistryModule.js +63 -4
- package/shared/services/api-config.service.d.ts +0 -5
- package/shared/services/api-config.service.js +3 -27
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ClsCacheProvider = void 0;
|
|
13
|
+
const nestjs_cls_1 = require("nestjs-cls");
|
|
14
|
+
const base_cache_provider_1 = require("./base-cache.provider");
|
|
15
|
+
class ClsCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
16
|
+
getName() {
|
|
17
|
+
return 'CLS';
|
|
18
|
+
}
|
|
19
|
+
get(key) {
|
|
20
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
+
try {
|
|
22
|
+
const store = nestjs_cls_1.ClsServiceManager.getClsService();
|
|
23
|
+
const fullKey = this.getFullKey(key);
|
|
24
|
+
const cached = store.get(fullKey);
|
|
25
|
+
if (!cached) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
if (cached.expiresAt && Date.now() > cached.expiresAt) {
|
|
29
|
+
yield this.delete(key);
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return cached.value;
|
|
33
|
+
}
|
|
34
|
+
catch (_a) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
set(key, value, ttl) {
|
|
40
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
try {
|
|
42
|
+
const store = nestjs_cls_1.ClsServiceManager.getClsService();
|
|
43
|
+
const fullKey = this.getFullKey(key);
|
|
44
|
+
const cached = { value };
|
|
45
|
+
if (ttl && ttl > 0) {
|
|
46
|
+
cached.expiresAt = Date.now() + ttl;
|
|
47
|
+
}
|
|
48
|
+
store.set(fullKey, cached);
|
|
49
|
+
this.addKeyToSet(key);
|
|
50
|
+
}
|
|
51
|
+
catch (_a) {
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
delete(key) {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
try {
|
|
58
|
+
const store = nestjs_cls_1.ClsServiceManager.getClsService();
|
|
59
|
+
const keys = Array.isArray(key) ? key : [key];
|
|
60
|
+
for (const k of keys) {
|
|
61
|
+
const fullKey = this.getFullKey(k);
|
|
62
|
+
store.set(fullKey, undefined);
|
|
63
|
+
this.removeKeyFromSet(k);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (_a) {
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
deletePattern(pattern) {
|
|
71
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
+
try {
|
|
73
|
+
const allKeys = this.getAllKeys();
|
|
74
|
+
const regex = this.patternToRegex(pattern);
|
|
75
|
+
const matchedKeys = allKeys.filter((key) => regex.test(key));
|
|
76
|
+
if (matchedKeys.length > 0) {
|
|
77
|
+
yield this.delete(matchedKeys);
|
|
78
|
+
}
|
|
79
|
+
return matchedKeys.length;
|
|
80
|
+
}
|
|
81
|
+
catch (_a) {
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
clear() {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
try {
|
|
89
|
+
const allKeys = this.getAllKeys();
|
|
90
|
+
yield this.delete(allKeys);
|
|
91
|
+
}
|
|
92
|
+
catch (_a) {
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
has(key) {
|
|
97
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
+
const value = yield this.get(key);
|
|
99
|
+
return value !== null;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
getFullKey(key) {
|
|
103
|
+
return `${ClsCacheProvider.CACHE_PREFIX}${key}`;
|
|
104
|
+
}
|
|
105
|
+
addKeyToSet(key) {
|
|
106
|
+
try {
|
|
107
|
+
const store = nestjs_cls_1.ClsServiceManager.getClsService();
|
|
108
|
+
const keys = store.get(ClsCacheProvider.KEYS_SET) || new Set();
|
|
109
|
+
keys.add(key);
|
|
110
|
+
store.set(ClsCacheProvider.KEYS_SET, keys);
|
|
111
|
+
}
|
|
112
|
+
catch (_a) {
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
removeKeyFromSet(key) {
|
|
116
|
+
try {
|
|
117
|
+
const store = nestjs_cls_1.ClsServiceManager.getClsService();
|
|
118
|
+
const keys = store.get(ClsCacheProvider.KEYS_SET);
|
|
119
|
+
if (keys) {
|
|
120
|
+
keys.delete(key);
|
|
121
|
+
store.set(ClsCacheProvider.KEYS_SET, keys);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (_a) {
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
getAllKeys() {
|
|
128
|
+
try {
|
|
129
|
+
const store = nestjs_cls_1.ClsServiceManager.getClsService();
|
|
130
|
+
const keys = store.get(ClsCacheProvider.KEYS_SET);
|
|
131
|
+
return keys ? Array.from(keys) : [];
|
|
132
|
+
}
|
|
133
|
+
catch (_a) {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.ClsCacheProvider = ClsCacheProvider;
|
|
139
|
+
ClsCacheProvider.CACHE_PREFIX = 'cache:cls:';
|
|
140
|
+
ClsCacheProvider.KEYS_SET = 'cache:cls:keys';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.RedisCacheProvider = exports.REDIS_CLIENT = void 0;
|
|
18
|
+
__exportStar(require("./base-cache.provider"), exports);
|
|
19
|
+
__exportStar(require("./cls-cache.provider"), exports);
|
|
20
|
+
__exportStar(require("./memory-cache.provider"), exports);
|
|
21
|
+
var redis_cache_provider_1 = require("./redis-cache.provider");
|
|
22
|
+
Object.defineProperty(exports, "REDIS_CLIENT", { enumerable: true, get: function () { return redis_cache_provider_1.REDIS_CLIENT; } });
|
|
23
|
+
Object.defineProperty(exports, "RedisCacheProvider", { enumerable: true, get: function () { return redis_cache_provider_1.RedisCacheProvider; } });
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BaseCacheProvider } from './base-cache.provider';
|
|
2
|
+
export declare class MemoryCacheProvider extends BaseCacheProvider {
|
|
3
|
+
private keyv;
|
|
4
|
+
private keys;
|
|
5
|
+
constructor(options?: {
|
|
6
|
+
ttl?: number;
|
|
7
|
+
namespace?: string;
|
|
8
|
+
});
|
|
9
|
+
getName(): string;
|
|
10
|
+
get<T>(key: string): Promise<T | null>;
|
|
11
|
+
set<T>(key: string, value: T, ttl?: number): Promise<void>;
|
|
12
|
+
delete(key: string | string[]): Promise<void>;
|
|
13
|
+
deletePattern(pattern: string): Promise<number>;
|
|
14
|
+
clear(): Promise<void>;
|
|
15
|
+
has(key: string): Promise<boolean>;
|
|
16
|
+
getAllKeys(): string[];
|
|
17
|
+
getSize(): number;
|
|
18
|
+
mget<T>(keys: string[]): Promise<(T | null)[]>;
|
|
19
|
+
mset(items: Array<{
|
|
20
|
+
key: string;
|
|
21
|
+
value: any;
|
|
22
|
+
}>, ttl?: number): Promise<void>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MemoryCacheProvider = void 0;
|
|
13
|
+
const keyv_1 = require("keyv");
|
|
14
|
+
const base_cache_provider_1 = require("./base-cache.provider");
|
|
15
|
+
class MemoryCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
super();
|
|
18
|
+
this.keys = new Set();
|
|
19
|
+
this.keyv = new keyv_1.default({
|
|
20
|
+
store: new Map(),
|
|
21
|
+
ttl: options === null || options === void 0 ? void 0 : options.ttl,
|
|
22
|
+
namespace: (options === null || options === void 0 ? void 0 : options.namespace) || 'cache:memory',
|
|
23
|
+
});
|
|
24
|
+
this.keyv.on('set', (key) => {
|
|
25
|
+
this.keys.add(key);
|
|
26
|
+
});
|
|
27
|
+
this.keyv.on('delete', (key) => {
|
|
28
|
+
this.keys.delete(key);
|
|
29
|
+
});
|
|
30
|
+
this.keyv.on('clear', () => {
|
|
31
|
+
this.keys.clear();
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
getName() {
|
|
35
|
+
return 'Memory';
|
|
36
|
+
}
|
|
37
|
+
get(key) {
|
|
38
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
39
|
+
try {
|
|
40
|
+
const value = yield this.keyv.get(key);
|
|
41
|
+
return value !== null && value !== void 0 ? value : null;
|
|
42
|
+
}
|
|
43
|
+
catch (_a) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
set(key, value, ttl) {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
try {
|
|
51
|
+
yield this.keyv.set(key, value, ttl);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throw new Error(`MemoryCacheProvider: Failed to set key ${key}: ${error instanceof Error ? error.message : String(error)}`);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
delete(key) {
|
|
59
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
60
|
+
try {
|
|
61
|
+
if (Array.isArray(key)) {
|
|
62
|
+
const promises = key.map((k) => this.keyv.delete(k));
|
|
63
|
+
yield Promise.all(promises);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
yield this.keyv.delete(key);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
throw new Error(`MemoryCacheProvider: Failed to delete key(s): ${error instanceof Error ? error.message : String(error)}`);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
deletePattern(pattern) {
|
|
75
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
76
|
+
try {
|
|
77
|
+
const regex = this.patternToRegex(pattern);
|
|
78
|
+
const matchedKeys = Array.from(this.keys).filter((key) => regex.test(key));
|
|
79
|
+
if (matchedKeys.length > 0) {
|
|
80
|
+
yield this.delete(matchedKeys);
|
|
81
|
+
}
|
|
82
|
+
return matchedKeys.length;
|
|
83
|
+
}
|
|
84
|
+
catch (_a) {
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
clear() {
|
|
90
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
try {
|
|
92
|
+
yield this.keyv.clear();
|
|
93
|
+
this.keys.clear();
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
throw new Error(`MemoryCacheProvider: Failed to clear cache: ${error instanceof Error ? error.message : String(error)}`);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
has(key) {
|
|
101
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
102
|
+
try {
|
|
103
|
+
const value = yield this.keyv.get(key);
|
|
104
|
+
return value !== undefined;
|
|
105
|
+
}
|
|
106
|
+
catch (_a) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
getAllKeys() {
|
|
112
|
+
return Array.from(this.keys);
|
|
113
|
+
}
|
|
114
|
+
getSize() {
|
|
115
|
+
return this.keys.size;
|
|
116
|
+
}
|
|
117
|
+
mget(keys) {
|
|
118
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
119
|
+
const promises = keys.map((key) => this.get(key));
|
|
120
|
+
return Promise.all(promises);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
mset(items, ttl) {
|
|
124
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
125
|
+
const promises = items.map((item) => this.set(item.key, item.value, ttl));
|
|
126
|
+
yield Promise.all(promises);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.MemoryCacheProvider = MemoryCacheProvider;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type Redis from 'ioredis';
|
|
2
|
+
import { BaseCacheProvider } from './base-cache.provider';
|
|
3
|
+
export declare const REDIS_CLIENT: unique symbol;
|
|
4
|
+
export declare class RedisCacheProvider extends BaseCacheProvider {
|
|
5
|
+
private readonly redis?;
|
|
6
|
+
private readonly keyPrefix;
|
|
7
|
+
constructor(redis?: Redis);
|
|
8
|
+
getName(): string;
|
|
9
|
+
get<T>(key: string): Promise<T | null>;
|
|
10
|
+
set<T>(key: string, value: T, ttl?: number): Promise<void>;
|
|
11
|
+
delete(key: string | string[]): Promise<void>;
|
|
12
|
+
deletePattern(pattern: string): Promise<number>;
|
|
13
|
+
clear(): Promise<void>;
|
|
14
|
+
has(key: string): Promise<boolean>;
|
|
15
|
+
mget<T>(keys: string[]): Promise<(T | null)[]>;
|
|
16
|
+
mset(items: Array<{
|
|
17
|
+
key: string;
|
|
18
|
+
value: any;
|
|
19
|
+
}>, ttl?: number): Promise<void>;
|
|
20
|
+
isAvailable(): boolean;
|
|
21
|
+
getClient(): Redis | undefined;
|
|
22
|
+
private getFullKey;
|
|
23
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
15
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
16
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
17
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
18
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
19
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
20
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.RedisCacheProvider = exports.REDIS_CLIENT = void 0;
|
|
25
|
+
const common_1 = require("@nestjs/common");
|
|
26
|
+
const base_cache_provider_1 = require("./base-cache.provider");
|
|
27
|
+
exports.REDIS_CLIENT = Symbol('REDIS_CLIENT');
|
|
28
|
+
let RedisCacheProvider = class RedisCacheProvider extends base_cache_provider_1.BaseCacheProvider {
|
|
29
|
+
constructor(redis) {
|
|
30
|
+
super();
|
|
31
|
+
this.redis = redis;
|
|
32
|
+
this.keyPrefix = 'cache:';
|
|
33
|
+
if (!redis) {
|
|
34
|
+
console.warn('RedisCacheProvider: Redis client not injected. Redis caching will be disabled.');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
getName() {
|
|
38
|
+
return 'Redis';
|
|
39
|
+
}
|
|
40
|
+
get(key) {
|
|
41
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
if (!this.redis) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const fullKey = this.getFullKey(key);
|
|
47
|
+
const value = yield this.redis.get(fullKey);
|
|
48
|
+
if (!value) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return JSON.parse(value);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.warn(`RedisCacheProvider: Failed to get key ${key}: ${error instanceof Error ? error.message : String(error)}`);
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
set(key, value, ttl) {
|
|
60
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
if (!this.redis) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const fullKey = this.getFullKey(key);
|
|
66
|
+
const serialized = JSON.stringify(value);
|
|
67
|
+
if (ttl && ttl > 0) {
|
|
68
|
+
yield this.redis.setex(fullKey, Math.ceil(ttl / 1000), serialized);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
yield this.redis.set(fullKey, serialized);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
throw new Error(`RedisCacheProvider: Failed to set key ${key}: ${error instanceof Error ? error.message : String(error)}`);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
delete(key) {
|
|
80
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
+
if (!this.redis) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const keys = Array.isArray(key) ? key : [key];
|
|
86
|
+
const fullKeys = keys.map((k) => this.getFullKey(k));
|
|
87
|
+
if (fullKeys.length > 0) {
|
|
88
|
+
yield this.redis.del(...fullKeys);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
throw new Error(`RedisCacheProvider: Failed to delete key(s): ${error instanceof Error ? error.message : String(error)}`);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
deletePattern(pattern) {
|
|
97
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
+
if (!this.redis) {
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const fullPattern = this.getFullKey(pattern);
|
|
103
|
+
let cursor = '0';
|
|
104
|
+
let deletedCount = 0;
|
|
105
|
+
do {
|
|
106
|
+
const [nextCursor, keys] = yield this.redis.scan(cursor, 'MATCH', fullPattern, 'COUNT', 100);
|
|
107
|
+
cursor = nextCursor;
|
|
108
|
+
if (keys.length > 0) {
|
|
109
|
+
yield this.redis.del(...keys);
|
|
110
|
+
deletedCount += keys.length;
|
|
111
|
+
}
|
|
112
|
+
} while (cursor !== '0');
|
|
113
|
+
return deletedCount;
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.warn(`RedisCacheProvider: deletePattern failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
clear() {
|
|
122
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
+
if (!this.redis) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
yield this.deletePattern('*');
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
throw new Error(`RedisCacheProvider: Failed to clear cache: ${error instanceof Error ? error.message : String(error)}`);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
has(key) {
|
|
135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
if (!this.redis) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const fullKey = this.getFullKey(key);
|
|
141
|
+
const exists = yield this.redis.exists(fullKey);
|
|
142
|
+
return exists === 1;
|
|
143
|
+
}
|
|
144
|
+
catch (_a) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
mget(keys) {
|
|
150
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
151
|
+
if (!this.redis || keys.length === 0) {
|
|
152
|
+
return keys.map(() => null);
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
const fullKeys = keys.map((k) => this.getFullKey(k));
|
|
156
|
+
const values = yield this.redis.mget(...fullKeys);
|
|
157
|
+
return values.map((value) => {
|
|
158
|
+
if (!value) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
return JSON.parse(value);
|
|
163
|
+
}
|
|
164
|
+
catch (_a) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
console.warn(`RedisCacheProvider: mget failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
171
|
+
return keys.map(() => null);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
mset(items, ttl) {
|
|
176
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
177
|
+
if (!this.redis || items.length === 0) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
const pipeline = this.redis.pipeline();
|
|
182
|
+
for (const item of items) {
|
|
183
|
+
const fullKey = this.getFullKey(item.key);
|
|
184
|
+
const serialized = JSON.stringify(item.value);
|
|
185
|
+
if (ttl && ttl > 0) {
|
|
186
|
+
pipeline.setex(fullKey, Math.ceil(ttl / 1000), serialized);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
pipeline.set(fullKey, serialized);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
yield pipeline.exec();
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
throw new Error(`RedisCacheProvider: mset failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
isAvailable() {
|
|
200
|
+
return !!this.redis && this.redis.status === 'ready';
|
|
201
|
+
}
|
|
202
|
+
getClient() {
|
|
203
|
+
return this.redis;
|
|
204
|
+
}
|
|
205
|
+
getFullKey(key) {
|
|
206
|
+
return `${this.keyPrefix}${key}`;
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
exports.RedisCacheProvider = RedisCacheProvider;
|
|
210
|
+
exports.RedisCacheProvider = RedisCacheProvider = __decorate([
|
|
211
|
+
(0, common_1.Injectable)(),
|
|
212
|
+
__param(0, (0, common_1.Optional)()),
|
|
213
|
+
__param(0, (0, common_1.Inject)(exports.REDIS_CLIENT)),
|
|
214
|
+
__metadata("design:paramtypes", [Function])
|
|
215
|
+
], RedisCacheProvider);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CacheDependency, DependencyData } from '../interfaces';
|
|
2
|
+
export interface CachedValueWithDependencies<T> {
|
|
3
|
+
value: T;
|
|
4
|
+
dependencies?: DependencyData[];
|
|
5
|
+
cachedAt: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class DependencyManager {
|
|
8
|
+
static wrapWithDependencies<T>(value: T, dependencies?: CacheDependency[]): Promise<CachedValueWithDependencies<T>>;
|
|
9
|
+
static captureDependencies(dependencies: CacheDependency[]): Promise<DependencyData[]>;
|
|
10
|
+
static areDependenciesChanged(dependencies: CacheDependency[], cachedDependencies?: DependencyData[]): Promise<boolean>;
|
|
11
|
+
static unwrapAndValidate<T>(wrapped: CachedValueWithDependencies<T> | null, dependencies?: CacheDependency[]): Promise<T | null>;
|
|
12
|
+
static getChangedDependencies(dependencies: CacheDependency[], cachedDependencies?: DependencyData[]): Promise<string[]>;
|
|
13
|
+
static serializeDependencies(dependencies: DependencyData[]): string;
|
|
14
|
+
static deserializeDependencies(serialized: string): DependencyData[];
|
|
15
|
+
}
|