mormati-redis 0.1.1 → 0.1.3
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/dist/index.d.ts +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/modules/cache/cache.const.d.ts +3 -0
- package/dist/modules/cache/cache.const.js +7 -0
- package/dist/modules/cache/cache.const.js.map +1 -0
- package/dist/modules/cache/cache.controller.d.ts +11 -0
- package/dist/modules/cache/cache.controller.js +47 -0
- package/dist/modules/cache/cache.controller.js.map +1 -0
- package/dist/modules/cache/cache.decorator.d.ts +2 -0
- package/dist/modules/cache/cache.decorator.js +8 -0
- package/dist/modules/cache/cache.decorator.js.map +1 -0
- package/dist/modules/cache/cache.interceptor.d.ts +11 -0
- package/dist/modules/cache/cache.interceptor.js +76 -0
- package/dist/modules/cache/cache.interceptor.js.map +1 -0
- package/dist/modules/cache/cache.module.d.ts +2 -0
- package/dist/modules/cache/cache.module.js +32 -0
- package/dist/modules/cache/cache.module.js.map +1 -0
- package/dist/modules/cache/cache.service.d.ts +24 -0
- package/dist/modules/cache/cache.service.js +206 -0
- package/dist/modules/cache/cache.service.js.map +1 -0
- package/dist/modules/cache/cache.type.d.ts +33 -0
- package/dist/modules/cache/cache.type.js +3 -0
- package/dist/modules/cache/cache.type.js.map +1 -0
- package/dist/modules/cache/cache.utils.d.ts +1 -0
- package/dist/modules/cache/cache.utils.js +15 -0
- package/dist/modules/cache/cache.utils.js.map +1 -0
- package/dist/modules/cache/index.d.ts +8 -0
- package/dist/modules/cache/index.js +25 -0
- package/dist/modules/cache/index.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { RedisModule } from './modules/redis/redis.module';
|
|
|
2
2
|
export { RedisConnection } from './modules/redis/redis.connection';
|
|
3
3
|
export { RedisService } from './modules/redis/redis.service';
|
|
4
4
|
export { IRedisModuleAsyncOptions } from './modules/redis/redis.type';
|
|
5
|
+
export * from './modules/cache';
|
|
5
6
|
export { REDIS_CONFIG_SERVICE } from './const';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
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
|
+
};
|
|
2
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
17
|
exports.REDIS_CONFIG_SERVICE = exports.RedisService = exports.RedisConnection = exports.RedisModule = void 0;
|
|
4
18
|
var redis_module_1 = require("./modules/redis/redis.module");
|
|
@@ -7,6 +21,7 @@ var redis_connection_1 = require("./modules/redis/redis.connection");
|
|
|
7
21
|
Object.defineProperty(exports, "RedisConnection", { enumerable: true, get: function () { return redis_connection_1.RedisConnection; } });
|
|
8
22
|
var redis_service_1 = require("./modules/redis/redis.service");
|
|
9
23
|
Object.defineProperty(exports, "RedisService", { enumerable: true, get: function () { return redis_service_1.RedisService; } });
|
|
24
|
+
__exportStar(require("./modules/cache"), exports);
|
|
10
25
|
var const_1 = require("./const");
|
|
11
26
|
Object.defineProperty(exports, "REDIS_CONFIG_SERVICE", { enumerable: true, get: function () { return const_1.REDIS_CONFIG_SERVICE; } });
|
|
12
27
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/redis/src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/redis/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,6DAA2D;AAAlD,2GAAA,WAAW,OAAA;AACpB,qEAAmE;AAA1D,mHAAA,eAAe,OAAA;AACxB,+DAA6D;AAApD,6GAAA,YAAY,OAAA;AAGrB,kDAAgC;AAGhC,iCAEiB;AADb,6GAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CACHE_DEFAULT_TTL = exports.CACHE_HASH_PREFIX = exports.CACHE_CONFIG_KEY = void 0;
|
|
4
|
+
exports.CACHE_CONFIG_KEY = 'cache:config';
|
|
5
|
+
exports.CACHE_HASH_PREFIX = 'api:cache';
|
|
6
|
+
exports.CACHE_DEFAULT_TTL = 'no-ttl';
|
|
7
|
+
//# sourceMappingURL=cache.const.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.const.js","sourceRoot":"","sources":["../../../../../libs/redis/src/modules/cache/cache.const.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG,cAAc,CAAC;AAClC,QAAA,iBAAiB,GAAG,WAAW,CAAC;AAChC,QAAA,iBAAiB,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CacheService } from './cache.service';
|
|
2
|
+
import { CacheStats } from './cache.type';
|
|
3
|
+
export declare class CacheController {
|
|
4
|
+
private readonly cacheService;
|
|
5
|
+
constructor(cacheService: CacheService);
|
|
6
|
+
getCacheStats(): CacheStats;
|
|
7
|
+
resetCacheStats(): {
|
|
8
|
+
message: string;
|
|
9
|
+
stats: CacheStats;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CacheController = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const cache_service_1 = require("./cache.service");
|
|
15
|
+
let CacheController = class CacheController {
|
|
16
|
+
constructor(cacheService) {
|
|
17
|
+
this.cacheService = cacheService;
|
|
18
|
+
}
|
|
19
|
+
getCacheStats() {
|
|
20
|
+
return this.cacheService.getCacheStats();
|
|
21
|
+
}
|
|
22
|
+
resetCacheStats() {
|
|
23
|
+
this.cacheService.resetCacheStats();
|
|
24
|
+
return {
|
|
25
|
+
message: 'Cache statistics have been reset successfully',
|
|
26
|
+
stats: this.cacheService.getCacheStats(),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.CacheController = CacheController;
|
|
31
|
+
__decorate([
|
|
32
|
+
(0, common_1.Get)('stats'),
|
|
33
|
+
__metadata("design:type", Function),
|
|
34
|
+
__metadata("design:paramtypes", []),
|
|
35
|
+
__metadata("design:returntype", Object)
|
|
36
|
+
], CacheController.prototype, "getCacheStats", null);
|
|
37
|
+
__decorate([
|
|
38
|
+
(0, common_1.Get)('stats/reset'),
|
|
39
|
+
__metadata("design:type", Function),
|
|
40
|
+
__metadata("design:paramtypes", []),
|
|
41
|
+
__metadata("design:returntype", Object)
|
|
42
|
+
], CacheController.prototype, "resetCacheStats", null);
|
|
43
|
+
exports.CacheController = CacheController = __decorate([
|
|
44
|
+
(0, common_1.Controller)('cache'),
|
|
45
|
+
__metadata("design:paramtypes", [cache_service_1.CacheService])
|
|
46
|
+
], CacheController);
|
|
47
|
+
//# sourceMappingURL=cache.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.controller.js","sourceRoot":"","sources":["../../../../../libs/redis/src/modules/cache/cache.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAuD;AACvD,mDAA+C;AAIxC,IAAM,eAAe,GAArB,MAAM,eAAe;IAC1B,YAA6B,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAO3D,aAAa;QACX,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;IAC3C,CAAC;IAOD,eAAe;QACb,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,+CAA+C;YACxD,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;SACzC,CAAC;IACJ,CAAC;CACF,CAAA;AAxBY,0CAAe;AAQ1B;IADC,IAAA,YAAG,EAAC,OAAO,CAAC;;;;oDAGZ;AAOD;IADC,IAAA,YAAG,EAAC,aAAa,CAAC;;;;sDAOlB;0BAvBU,eAAe;IAD3B,IAAA,mBAAU,EAAC,OAAO,CAAC;qCAEyB,4BAAY;GAD5C,eAAe,CAwB3B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UseCache = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const cache_const_1 = require("./cache.const");
|
|
6
|
+
const UseCache = (options) => (0, common_1.SetMetadata)(cache_const_1.CACHE_CONFIG_KEY, options);
|
|
7
|
+
exports.UseCache = UseCache;
|
|
8
|
+
//# sourceMappingURL=cache.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.decorator.js","sourceRoot":"","sources":["../../../../../libs/redis/src/modules/cache/cache.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAC7C,+CAAiD;AAa1C,MAAM,QAAQ,GAAG,CAAC,OAA8B,EAAE,EAAE,CACzD,IAAA,oBAAW,EAAC,8BAAgB,EAAE,OAAO,CAAC,CAAC;AAD5B,QAAA,QAAQ,YACoB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
import { CacheService } from './cache.service';
|
|
5
|
+
export declare class CacheInterceptor implements NestInterceptor {
|
|
6
|
+
private readonly reflector;
|
|
7
|
+
private readonly cacheService;
|
|
8
|
+
constructor(reflector: Reflector, cacheService: CacheService);
|
|
9
|
+
intercept(context: ExecutionContext, next: CallHandler): Promise<Observable<any>>;
|
|
10
|
+
private setCacheHeader;
|
|
11
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CacheInterceptor = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const core_1 = require("@nestjs/core");
|
|
15
|
+
const rxjs_1 = require("rxjs");
|
|
16
|
+
const operators_1 = require("rxjs/operators");
|
|
17
|
+
const cache_service_1 = require("./cache.service");
|
|
18
|
+
const cache_const_1 = require("./cache.const");
|
|
19
|
+
let CacheInterceptor = class CacheInterceptor {
|
|
20
|
+
constructor(reflector, cacheService) {
|
|
21
|
+
this.reflector = reflector;
|
|
22
|
+
this.cacheService = cacheService;
|
|
23
|
+
}
|
|
24
|
+
async intercept(context, next) {
|
|
25
|
+
const cacheConfig = this.reflector.get(cache_const_1.CACHE_CONFIG_KEY, context.getHandler());
|
|
26
|
+
if (!cacheConfig)
|
|
27
|
+
return next.handle();
|
|
28
|
+
const { service, module, ttl = cache_const_1.CACHE_DEFAULT_TTL } = cacheConfig;
|
|
29
|
+
const request = context.switchToHttp().getRequest();
|
|
30
|
+
const response = context.switchToHttp().getResponse();
|
|
31
|
+
const method = request.method || "";
|
|
32
|
+
const url = request.url || "";
|
|
33
|
+
const headers = request.headers || {};
|
|
34
|
+
const language = headers['accept-language'] || "en";
|
|
35
|
+
const cache = headers['cache'] || "";
|
|
36
|
+
const query = request.query || {};
|
|
37
|
+
const body = request.body || {};
|
|
38
|
+
if (cache == 'no-cache')
|
|
39
|
+
return next.handle();
|
|
40
|
+
const cacheKey = this.cacheService.generateCacheKey({
|
|
41
|
+
service,
|
|
42
|
+
module,
|
|
43
|
+
method,
|
|
44
|
+
url,
|
|
45
|
+
language,
|
|
46
|
+
query,
|
|
47
|
+
body,
|
|
48
|
+
});
|
|
49
|
+
const cacheResult = await this.cacheService.getCacheWithMetadata(cacheKey);
|
|
50
|
+
if (cacheResult && cache != "revalidate-cache") {
|
|
51
|
+
const { data, cachedAt, ttl } = cacheResult;
|
|
52
|
+
this.setCacheHeader(response, { type: 'HIT', ttl });
|
|
53
|
+
return (0, rxjs_1.of)(data);
|
|
54
|
+
}
|
|
55
|
+
this.setCacheHeader(response, { type: 'MISS', ttl });
|
|
56
|
+
return next.handle().pipe((0, operators_1.tap)(async (responseData) => {
|
|
57
|
+
const metaData = {
|
|
58
|
+
ttl,
|
|
59
|
+
cachedAt: Date.now(),
|
|
60
|
+
};
|
|
61
|
+
await this.cacheService.setCacheWithMetadata(cacheKey, responseData, metaData);
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
setCacheHeader(response, options) {
|
|
65
|
+
const { type, ttl } = options;
|
|
66
|
+
response.setHeader('X-Cache', type);
|
|
67
|
+
response.setHeader('X-Cache-Expires-In', ttl.toString());
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
exports.CacheInterceptor = CacheInterceptor;
|
|
71
|
+
exports.CacheInterceptor = CacheInterceptor = __decorate([
|
|
72
|
+
(0, common_1.Injectable)(),
|
|
73
|
+
__metadata("design:paramtypes", [core_1.Reflector,
|
|
74
|
+
cache_service_1.CacheService])
|
|
75
|
+
], CacheInterceptor);
|
|
76
|
+
//# sourceMappingURL=cache.interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.interceptor.js","sourceRoot":"","sources":["../../../../../libs/redis/src/modules/cache/cache.interceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.CacheModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const core_1 = require("@nestjs/core");
|
|
12
|
+
const cache_service_1 = require("./cache.service");
|
|
13
|
+
const cache_interceptor_1 = require("./cache.interceptor");
|
|
14
|
+
const cache_controller_1 = require("./cache.controller");
|
|
15
|
+
let CacheModule = class CacheModule {
|
|
16
|
+
};
|
|
17
|
+
exports.CacheModule = CacheModule;
|
|
18
|
+
exports.CacheModule = CacheModule = __decorate([
|
|
19
|
+
(0, common_1.Module)({
|
|
20
|
+
imports: [],
|
|
21
|
+
controllers: [cache_controller_1.CacheController],
|
|
22
|
+
providers: [
|
|
23
|
+
cache_service_1.CacheService,
|
|
24
|
+
{
|
|
25
|
+
provide: core_1.APP_INTERCEPTOR,
|
|
26
|
+
useClass: cache_interceptor_1.CacheInterceptor,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
exports: [cache_service_1.CacheService],
|
|
30
|
+
})
|
|
31
|
+
], CacheModule);
|
|
32
|
+
//# sourceMappingURL=cache.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.module.js","sourceRoot":"","sources":["../../../../../libs/redis/src/modules/cache/cache.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,uCAA+C;AAC/C,mDAA+C;AAC/C,2DAAuD;AACvD,yDAAqD;AAc9C,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAI,CAAA;AAAf,kCAAW;sBAAX,WAAW;IAZvB,IAAA,eAAM,EAAC;QACJ,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,CAAC,kCAAe,CAAC;QAC9B,SAAS,EAAE;YACP,4BAAY;YACZ;gBACI,OAAO,EAAE,sBAAe;gBACxB,QAAQ,EAAE,oCAAgB;aAC7B;SACJ;QACD,OAAO,EAAE,CAAC,4BAAY,CAAC;KAC1B,CAAC;GACW,WAAW,CAAI"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { RedisService } from '@mormati/redis';
|
|
2
|
+
import { CacheKeyProps, CacheMetadata, CacheResultWithMetadata, CacheStats } from './cache.type';
|
|
3
|
+
export declare class CacheService {
|
|
4
|
+
private readonly redisService;
|
|
5
|
+
private readonly hashPrefix;
|
|
6
|
+
private cacheHits;
|
|
7
|
+
private cacheMisses;
|
|
8
|
+
private cacheErrors;
|
|
9
|
+
constructor(redisService: RedisService);
|
|
10
|
+
generateCacheKey(props: CacheKeyProps): string;
|
|
11
|
+
setCache<T>(key: string, data: T): Promise<boolean>;
|
|
12
|
+
getCache<T>(key: string): Promise<T | null>;
|
|
13
|
+
getCacheKeys<T>(pattern: string): Promise<{
|
|
14
|
+
totalKeys: number;
|
|
15
|
+
keys: string[];
|
|
16
|
+
}>;
|
|
17
|
+
deleteCache(keys: string | string[]): Promise<boolean>;
|
|
18
|
+
deleteAllCacheByPattern(pattern: string): Promise<string[]>;
|
|
19
|
+
deleteAllCache(): Promise<string[]>;
|
|
20
|
+
setCacheWithMetadata<T>(key: string, data: T, metaData: CacheMetadata): Promise<boolean>;
|
|
21
|
+
getCacheWithMetadata<T>(key: string): Promise<CacheResultWithMetadata<T> | null>;
|
|
22
|
+
getCacheStats(): CacheStats;
|
|
23
|
+
resetCacheStats(): void;
|
|
24
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CacheService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const redis_1 = require("@mormati/redis");
|
|
15
|
+
const cache_utils_1 = require("./cache.utils");
|
|
16
|
+
const cache_const_1 = require("./cache.const");
|
|
17
|
+
let CacheService = class CacheService {
|
|
18
|
+
constructor(redisService) {
|
|
19
|
+
this.redisService = redisService;
|
|
20
|
+
this.hashPrefix = cache_const_1.CACHE_HASH_PREFIX;
|
|
21
|
+
this.cacheHits = 0;
|
|
22
|
+
this.cacheMisses = 0;
|
|
23
|
+
this.cacheErrors = 0;
|
|
24
|
+
}
|
|
25
|
+
generateCacheKey(props) {
|
|
26
|
+
const { service, module, method, url, language, query, body, } = props;
|
|
27
|
+
const hashs = [this.hashPrefix, service, module];
|
|
28
|
+
try {
|
|
29
|
+
if (method)
|
|
30
|
+
hashs.push(method);
|
|
31
|
+
if (url)
|
|
32
|
+
hashs.push(url);
|
|
33
|
+
if (language)
|
|
34
|
+
hashs.push(language);
|
|
35
|
+
if (query && Object.keys(query).length > 0) {
|
|
36
|
+
const queryHash = (0, cache_utils_1.hashObject)(query);
|
|
37
|
+
hashs.push(queryHash);
|
|
38
|
+
}
|
|
39
|
+
if (body && Object.keys(body).length > 0) {
|
|
40
|
+
const bodyHash = (0, cache_utils_1.hashObject)(body);
|
|
41
|
+
hashs.push(bodyHash);
|
|
42
|
+
}
|
|
43
|
+
return hashs.join(':');
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.log("## Error: 'generateCacheKey' in CacheService", error);
|
|
47
|
+
this.cacheErrors++;
|
|
48
|
+
return `${this.hashPrefix}:error:${Date.now()}:${hashs.join(':')}`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async setCache(key, data) {
|
|
52
|
+
try {
|
|
53
|
+
const serialized = JSON.stringify(data);
|
|
54
|
+
await this.redisService.set(key, serialized);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.log("## Error: 'setCache' in CacheService", error);
|
|
59
|
+
this.cacheErrors++;
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async getCache(key) {
|
|
64
|
+
try {
|
|
65
|
+
const cached = await this.redisService.get(key);
|
|
66
|
+
if (!cached)
|
|
67
|
+
return null;
|
|
68
|
+
return JSON.parse(cached);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.log("## Error: 'getCache' in CacheService", error);
|
|
72
|
+
this.cacheErrors++;
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async getCacheKeys(pattern) {
|
|
77
|
+
const result = {
|
|
78
|
+
totalKeys: 0,
|
|
79
|
+
keys: [],
|
|
80
|
+
};
|
|
81
|
+
try {
|
|
82
|
+
const keys = await this.redisService.keys(pattern);
|
|
83
|
+
const totalKeys = keys.length;
|
|
84
|
+
if (totalKeys == 0)
|
|
85
|
+
return result;
|
|
86
|
+
result.keys = keys;
|
|
87
|
+
result.totalKeys = totalKeys;
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.log("## Error: 'getCacheKeys' in CacheService", error);
|
|
92
|
+
this.cacheErrors++;
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async deleteCache(keys) {
|
|
97
|
+
try {
|
|
98
|
+
const keyArray = Array.isArray(keys) ? keys : [keys];
|
|
99
|
+
if (keyArray.length === 0) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
for (const key of keyArray) {
|
|
103
|
+
await this.redisService.del(key);
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.log("## Error: 'deleteCache' in CacheService", error);
|
|
109
|
+
this.cacheErrors++;
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async deleteAllCacheByPattern(pattern) {
|
|
114
|
+
try {
|
|
115
|
+
const hashPattern = `${this.hashPrefix}:${pattern}`;
|
|
116
|
+
const response = await this.getCacheKeys(hashPattern);
|
|
117
|
+
await this.deleteCache(response.keys);
|
|
118
|
+
return response.keys;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.log("## Error: 'deleteAllCacheByPattern' in CacheService", error);
|
|
122
|
+
this.cacheErrors++;
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async deleteAllCache() {
|
|
127
|
+
try {
|
|
128
|
+
const hashPattern = `${this.hashPrefix}:*`;
|
|
129
|
+
const response = await this.getCacheKeys(hashPattern);
|
|
130
|
+
await this.deleteCache(response.keys);
|
|
131
|
+
return response.keys;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.log("## Error: 'deleteAllCache' in CacheService", error);
|
|
135
|
+
this.cacheErrors++;
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async setCacheWithMetadata(key, data, metaData) {
|
|
140
|
+
try {
|
|
141
|
+
const dataWithMetaData = {
|
|
142
|
+
data,
|
|
143
|
+
...metaData
|
|
144
|
+
};
|
|
145
|
+
return await this.setCache(key, dataWithMetaData);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
console.log("## Error: 'setCacheWithMetadata' in CacheService", error);
|
|
149
|
+
this.cacheErrors++;
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async getCacheWithMetadata(key) {
|
|
154
|
+
try {
|
|
155
|
+
const dataWithMetaData = await this.getCache(key);
|
|
156
|
+
if (!dataWithMetaData) {
|
|
157
|
+
this.cacheMisses++;
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
const { data, ...metadata } = dataWithMetaData;
|
|
161
|
+
const ttl = metadata.ttl;
|
|
162
|
+
if (ttl == 'no-ttl') {
|
|
163
|
+
this.cacheHits++;
|
|
164
|
+
return dataWithMetaData;
|
|
165
|
+
}
|
|
166
|
+
const timeElapsed = Math.floor((Date.now() - metadata.cachedAt) / 1000);
|
|
167
|
+
if (!ttl || timeElapsed > ttl) {
|
|
168
|
+
this.cacheMisses++;
|
|
169
|
+
await this.deleteCache(key);
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
this.cacheHits++;
|
|
173
|
+
dataWithMetaData.ttl = Math.max(0, ttl - timeElapsed);
|
|
174
|
+
return dataWithMetaData;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.log("## Error: 'getCacheWithMetadata' in CacheService", error);
|
|
178
|
+
this.cacheErrors++;
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
getCacheStats() {
|
|
183
|
+
const totalRequests = this.cacheHits + this.cacheMisses;
|
|
184
|
+
const missRate = totalRequests > 0 ? this.cacheMisses / totalRequests : 0;
|
|
185
|
+
const hitRate = totalRequests > 0 ? this.cacheHits / totalRequests : 0;
|
|
186
|
+
return {
|
|
187
|
+
totalRequests,
|
|
188
|
+
misses: this.cacheMisses,
|
|
189
|
+
missRate: Math.round(missRate * 10000) / 100,
|
|
190
|
+
hits: this.cacheHits,
|
|
191
|
+
hitRate: Math.round(hitRate * 10000) / 100,
|
|
192
|
+
errors: this.cacheErrors,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
resetCacheStats() {
|
|
196
|
+
this.cacheHits = 0;
|
|
197
|
+
this.cacheMisses = 0;
|
|
198
|
+
this.cacheErrors = 0;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
exports.CacheService = CacheService;
|
|
202
|
+
exports.CacheService = CacheService = __decorate([
|
|
203
|
+
(0, common_1.Injectable)(),
|
|
204
|
+
__metadata("design:paramtypes", [redis_1.RedisService])
|
|
205
|
+
], CacheService);
|
|
206
|
+
//# sourceMappingURL=cache.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.service.js","sourceRoot":"","sources":["../../../../../libs/redis/src/modules/cache/cache.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface CacheDecoratorOptions {
|
|
2
|
+
service: string;
|
|
3
|
+
module: string;
|
|
4
|
+
ttl?: number | 'no-ttl';
|
|
5
|
+
}
|
|
6
|
+
export interface CacheKeyProps {
|
|
7
|
+
service: string;
|
|
8
|
+
module: string;
|
|
9
|
+
method: string;
|
|
10
|
+
url: string;
|
|
11
|
+
language: string;
|
|
12
|
+
query?: Record<string, any>;
|
|
13
|
+
body?: Record<string, any>;
|
|
14
|
+
}
|
|
15
|
+
export interface CacheMetadata {
|
|
16
|
+
cachedAt: number;
|
|
17
|
+
ttl: number | 'no-ttl';
|
|
18
|
+
}
|
|
19
|
+
export interface CacheResultWithMetadata<T = any> extends CacheMetadata {
|
|
20
|
+
data: T;
|
|
21
|
+
}
|
|
22
|
+
export interface CacheStats {
|
|
23
|
+
totalRequests: number;
|
|
24
|
+
misses: number;
|
|
25
|
+
missRate: number;
|
|
26
|
+
hits: number;
|
|
27
|
+
hitRate: number;
|
|
28
|
+
errors: number;
|
|
29
|
+
}
|
|
30
|
+
export interface SetCacheHeaderOption {
|
|
31
|
+
type: 'HIT' | 'MISS';
|
|
32
|
+
ttl: number | 'no-ttl';
|
|
33
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.type.js","sourceRoot":"","sources":["../../../../../libs/redis/src/modules/cache/cache.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const hashObject: (obj: Record<string, any>) => string;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hashObject = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const hashObject = (obj) => {
|
|
6
|
+
const sortedKeys = Object.keys(obj).sort();
|
|
7
|
+
const parts = sortedKeys.map(key => `${key}=${JSON.stringify(obj[key])}`);
|
|
8
|
+
const str = parts.join('&');
|
|
9
|
+
return (0, crypto_1.createHash)('sha256')
|
|
10
|
+
.update(str)
|
|
11
|
+
.digest('hex')
|
|
12
|
+
.substring(0, 16);
|
|
13
|
+
};
|
|
14
|
+
exports.hashObject = hashObject;
|
|
15
|
+
//# sourceMappingURL=cache.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.utils.js","sourceRoot":"","sources":["../../../../../libs/redis/src/modules/cache/cache.utils.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAM7B,MAAM,UAAU,GAAG,CAAC,GAAwB,EAAU,EAAE;IAE3D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAG5B,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC;SACtB,MAAM,CAAC,GAAG,CAAC;SACX,MAAM,CAAC,KAAK,CAAC;SACb,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC,CAAA;AAXY,QAAA,UAAU,cAWtB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './cache.module';
|
|
2
|
+
export * from './cache.service';
|
|
3
|
+
export * from './cache.controller';
|
|
4
|
+
export * from './cache.decorator';
|
|
5
|
+
export * from './cache.interceptor';
|
|
6
|
+
export * from './cache.utils';
|
|
7
|
+
export * from './cache.const';
|
|
8
|
+
export * from './cache.type';
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
__exportStar(require("./cache.module"), exports);
|
|
18
|
+
__exportStar(require("./cache.service"), exports);
|
|
19
|
+
__exportStar(require("./cache.controller"), exports);
|
|
20
|
+
__exportStar(require("./cache.decorator"), exports);
|
|
21
|
+
__exportStar(require("./cache.interceptor"), exports);
|
|
22
|
+
__exportStar(require("./cache.utils"), exports);
|
|
23
|
+
__exportStar(require("./cache.const"), exports);
|
|
24
|
+
__exportStar(require("./cache.type"), exports);
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/redis/src/modules/cache/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,kDAAgC;AAChC,qDAAmC;AACnC,oDAAkC;AAClC,sDAAoC;AACpC,gDAA8B;AAC9B,gDAA8B;AAC9B,+CAA6B"}
|