ts-cache-mongoose 0.0.1
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/.eslintignore +4 -0
- package/.eslintrc +95 -0
- package/.swcrc +21 -0
- package/LICENSE +21 -0
- package/README.md +26 -0
- package/dist/cjs/cache/Cache.js +37 -0
- package/dist/cjs/cache/Cache.js.map +1 -0
- package/dist/cjs/cache/engine/MemoryCacheEngine.js +25 -0
- package/dist/cjs/cache/engine/MemoryCacheEngine.js.map +1 -0
- package/dist/cjs/cache/engine/RedisCacheEngine.js +28 -0
- package/dist/cjs/cache/engine/RedisCacheEngine.js.map +1 -0
- package/dist/cjs/crypto.js +28 -0
- package/dist/cjs/crypto.js.map +1 -0
- package/dist/cjs/interfaces/ICacheEngine.js +3 -0
- package/dist/cjs/interfaces/ICacheEngine.js.map +1 -0
- package/dist/cjs/interfaces/ICacheMongooseOptions.js +3 -0
- package/dist/cjs/interfaces/ICacheMongooseOptions.js.map +1 -0
- package/dist/cjs/plugin.js +82 -0
- package/dist/cjs/plugin.js.map +1 -0
- package/dist/cjs/types/cache/Cache.d.ts +12 -0
- package/dist/cjs/types/cache/Cache.d.ts.map +1 -0
- package/dist/cjs/types/cache/engine/MemoryCacheEngine.d.ts +11 -0
- package/dist/cjs/types/cache/engine/MemoryCacheEngine.d.ts.map +1 -0
- package/dist/cjs/types/cache/engine/RedisCacheEngine.d.ts +11 -0
- package/dist/cjs/types/cache/engine/RedisCacheEngine.d.ts.map +1 -0
- package/dist/cjs/types/crypto.d.ts +3 -0
- package/dist/cjs/types/crypto.d.ts.map +1 -0
- package/dist/cjs/types/interfaces/ICacheEngine.d.ts +8 -0
- package/dist/cjs/types/interfaces/ICacheEngine.d.ts.map +1 -0
- package/dist/cjs/types/interfaces/ICacheMongooseOptions.d.ts +10 -0
- package/dist/cjs/types/interfaces/ICacheMongooseOptions.d.ts.map +1 -0
- package/dist/cjs/types/plugin.d.ts +24 -0
- package/dist/cjs/types/plugin.d.ts.map +1 -0
- package/dist/esm/cache/Cache.js +33 -0
- package/dist/esm/cache/Cache.js.map +1 -0
- package/dist/esm/cache/engine/MemoryCacheEngine.js +23 -0
- package/dist/esm/cache/engine/MemoryCacheEngine.js.map +1 -0
- package/dist/esm/cache/engine/RedisCacheEngine.js +25 -0
- package/dist/esm/cache/engine/RedisCacheEngine.js.map +1 -0
- package/dist/esm/crypto.js +22 -0
- package/dist/esm/crypto.js.map +1 -0
- package/dist/esm/interfaces/ICacheEngine.js +2 -0
- package/dist/esm/interfaces/ICacheEngine.js.map +1 -0
- package/dist/esm/interfaces/ICacheMongooseOptions.js +2 -0
- package/dist/esm/interfaces/ICacheMongooseOptions.js.map +1 -0
- package/dist/esm/plugin.js.map +1 -0
- package/dist/esm/plugin.mjs +79 -0
- package/dist/esm/types/cache/Cache.d.ts +12 -0
- package/dist/esm/types/cache/Cache.d.ts.map +1 -0
- package/dist/esm/types/cache/engine/MemoryCacheEngine.d.ts +11 -0
- package/dist/esm/types/cache/engine/MemoryCacheEngine.d.ts.map +1 -0
- package/dist/esm/types/cache/engine/RedisCacheEngine.d.ts +11 -0
- package/dist/esm/types/cache/engine/RedisCacheEngine.d.ts.map +1 -0
- package/dist/esm/types/crypto.d.ts +3 -0
- package/dist/esm/types/crypto.d.ts.map +1 -0
- package/dist/esm/types/interfaces/ICacheEngine.d.ts +8 -0
- package/dist/esm/types/interfaces/ICacheEngine.d.ts.map +1 -0
- package/dist/esm/types/interfaces/ICacheMongooseOptions.d.ts +10 -0
- package/dist/esm/types/interfaces/ICacheMongooseOptions.d.ts.map +1 -0
- package/dist/esm/types/plugin.d.ts +24 -0
- package/dist/esm/types/plugin.d.ts.map +1 -0
- package/jest-mongodb-config.ts +10 -0
- package/jest.config.ts +33 -0
- package/package.json +112 -0
- package/src/cache/Cache.ts +46 -0
- package/src/cache/engine/MemoryCacheEngine.ts +32 -0
- package/src/cache/engine/RedisCacheEngine.ts +36 -0
- package/src/crypto.ts +27 -0
- package/src/interfaces/ICacheEngine.ts +8 -0
- package/src/interfaces/ICacheMongooseOptions.ts +10 -0
- package/src/plugin.ts +122 -0
- package/tests/cache.test.ts +51 -0
- package/tests/crypto.test.ts +60 -0
- package/tests/interfaces/IUser.ts +8 -0
- package/tests/schemas/UserSchema.ts +16 -0
- package/tsconfig.json +44 -0
package/.eslintignore
ADDED
package/.eslintrc
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"root": true,
|
|
3
|
+
"env": {
|
|
4
|
+
"commonjs": true,
|
|
5
|
+
"es2021": true,
|
|
6
|
+
"node": true,
|
|
7
|
+
"jest": true
|
|
8
|
+
},
|
|
9
|
+
"parser": "@typescript-eslint/parser",
|
|
10
|
+
"plugins": [
|
|
11
|
+
"@typescript-eslint",
|
|
12
|
+
"jest",
|
|
13
|
+
"jest-formatting",
|
|
14
|
+
"sonarjs"
|
|
15
|
+
],
|
|
16
|
+
"extends": [
|
|
17
|
+
"standard",
|
|
18
|
+
"eslint:recommended",
|
|
19
|
+
"plugin:@typescript-eslint/eslint-recommended",
|
|
20
|
+
"plugin:@typescript-eslint/recommended",
|
|
21
|
+
"plugin:sonarjs/recommended"
|
|
22
|
+
],
|
|
23
|
+
"globals": {
|
|
24
|
+
"Atomics": "readonly",
|
|
25
|
+
"SharedArrayBuffer": "readonly"
|
|
26
|
+
},
|
|
27
|
+
"parserOptions": {
|
|
28
|
+
"ecmaVersion": 2021,
|
|
29
|
+
"sourceType": "module"
|
|
30
|
+
},
|
|
31
|
+
"rules": {
|
|
32
|
+
"@typescript-eslint/array-type": "error",
|
|
33
|
+
"@typescript-eslint/consistent-type-imports": "error",
|
|
34
|
+
"@typescript-eslint/method-signature-style": "error",
|
|
35
|
+
"@typescript-eslint/consistent-indexed-object-style": "error",
|
|
36
|
+
"indent": [
|
|
37
|
+
"error",
|
|
38
|
+
2
|
|
39
|
+
],
|
|
40
|
+
"arrow-parens": [
|
|
41
|
+
"error"
|
|
42
|
+
],
|
|
43
|
+
"linebreak-style": [
|
|
44
|
+
"error",
|
|
45
|
+
"unix"
|
|
46
|
+
],
|
|
47
|
+
"quotes": [
|
|
48
|
+
"error",
|
|
49
|
+
"single"
|
|
50
|
+
],
|
|
51
|
+
"semi": [
|
|
52
|
+
"error",
|
|
53
|
+
"never"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"overrides": [
|
|
57
|
+
{
|
|
58
|
+
"files": [
|
|
59
|
+
"tests/**/*.test.ts"
|
|
60
|
+
],
|
|
61
|
+
"extends": [
|
|
62
|
+
"plugin:jest/style",
|
|
63
|
+
"plugin:jest/recommended",
|
|
64
|
+
"plugin:jest-formatting/recommended"
|
|
65
|
+
],
|
|
66
|
+
"rules": {
|
|
67
|
+
"sonarjs/no-duplicate-string": "off"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"parserOptions": {
|
|
72
|
+
"project": [
|
|
73
|
+
"tsconfig.json"
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
"files": [
|
|
77
|
+
"src/**/*.ts"
|
|
78
|
+
],
|
|
79
|
+
"extends": [
|
|
80
|
+
"plugin:@typescript-eslint/recommended-requiring-type-checking",
|
|
81
|
+
"plugin:@typescript-eslint/strict"
|
|
82
|
+
],
|
|
83
|
+
"rules": {
|
|
84
|
+
"@typescript-eslint/consistent-type-exports": "error",
|
|
85
|
+
"@typescript-eslint/explicit-function-return-type": "error",
|
|
86
|
+
"@typescript-eslint/explicit-module-boundary-types": "error",
|
|
87
|
+
"@typescript-eslint/member-ordering": "error",
|
|
88
|
+
"@typescript-eslint/typedef": "error",
|
|
89
|
+
"@typescript-eslint/prefer-enum-initializers": "error",
|
|
90
|
+
"@typescript-eslint/require-array-sort-compare": "error",
|
|
91
|
+
"@typescript-eslint/no-redundant-type-constituents": "error"
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
}
|
package/.swcrc
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jsc": {
|
|
3
|
+
"parser": {
|
|
4
|
+
"syntax": "typescript",
|
|
5
|
+
"decorators": true,
|
|
6
|
+
"dynamicImport": true
|
|
7
|
+
},
|
|
8
|
+
"target": "es2021",
|
|
9
|
+
"keepClassNames": true,
|
|
10
|
+
"loose": true
|
|
11
|
+
},
|
|
12
|
+
"env": {
|
|
13
|
+
"targets": {
|
|
14
|
+
"node": 16
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"module": {
|
|
18
|
+
"type": "commonjs"
|
|
19
|
+
},
|
|
20
|
+
"sourceMaps": true
|
|
21
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2022 Alex Eagle
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# ts-cache-mongoose
|
|
2
|
+
|
|
3
|
+
Patch history (audit log) & events plugin for mongoose
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/ts-cache-mongoose)
|
|
6
|
+
[](https://www.npmjs.com/package/ts-cache-mongoose)
|
|
7
|
+
[](https://github.com/ilovepixelart/ts-cache-mongoose/blob/main/LICENSE)
|
|
8
|
+
\
|
|
9
|
+
[](https://sonarcloud.io/summary/new_code?id=ilovepixelart_ts-cache-mongoose)
|
|
10
|
+
[](https://sonarcloud.io/summary/new_code?id=ilovepixelart_ts-cache-mongoose)
|
|
11
|
+
\
|
|
12
|
+
[](https://sonarcloud.io/summary/new_code?id=ilovepixelart_ts-cache-mongoose)
|
|
13
|
+
[](https://sonarcloud.io/summary/new_code?id=ilovepixelart_ts-cache-mongoose)
|
|
14
|
+
[](https://sonarcloud.io/summary/new_code?id=ilovepixelart_ts-cache-mongoose)
|
|
15
|
+
|
|
16
|
+
[](https://www.npmjs.com/package/ts-cache-mongoose)
|
|
17
|
+
|
|
18
|
+
## Motivation
|
|
19
|
+
|
|
20
|
+
ts-cache-mongoose is a plugin for mongoose
|
|
21
|
+
\
|
|
22
|
+
Caching queries is a good way to improve performance of your application
|
|
23
|
+
|
|
24
|
+
This is initial prerelease of the plugin, so it may contain bugs
|
|
25
|
+
I will be glad to receive your feedback and suggestions
|
|
26
|
+
Work in progress...
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.engines = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const ms_1 = tslib_1.__importDefault(require("ms"));
|
|
6
|
+
const MemoryCacheEngine_1 = tslib_1.__importDefault(require("./engine/MemoryCacheEngine"));
|
|
7
|
+
const RedisCacheEngine_1 = tslib_1.__importDefault(require("./engine/RedisCacheEngine"));
|
|
8
|
+
exports.engines = ['memory', 'redis'];
|
|
9
|
+
class Cache {
|
|
10
|
+
constructor(engineName, defaultTTL) {
|
|
11
|
+
if (!exports.engines.includes(engineName)) {
|
|
12
|
+
throw new Error(`Invalid engine name: ${engineName}`);
|
|
13
|
+
}
|
|
14
|
+
this.defaultTTL = (0, ms_1.default)(defaultTTL);
|
|
15
|
+
if (engineName === 'redis') {
|
|
16
|
+
this.engine = new RedisCacheEngine_1.default();
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
this.engine = new MemoryCacheEngine_1.default();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async get(key) {
|
|
23
|
+
return await this.engine.get(key);
|
|
24
|
+
}
|
|
25
|
+
async set(key, value, ttl) {
|
|
26
|
+
const actualTTL = ttl ?? this.defaultTTL;
|
|
27
|
+
return await this.engine.set(key, value, actualTTL);
|
|
28
|
+
}
|
|
29
|
+
async del(key) {
|
|
30
|
+
return await this.engine.del(key);
|
|
31
|
+
}
|
|
32
|
+
async clear() {
|
|
33
|
+
return await this.engine.clear();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.default = Cache;
|
|
37
|
+
//# sourceMappingURL=Cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../../src/cache/Cache.ts"],"names":[],"mappings":";;;;AAAA,oDAAmB;AAInB,2FAA0D;AAC1D,yFAAwD;AAE3C,QAAA,OAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAU,CAAA;AAEnD,MAAM,KAAK;IAIT,YAAa,UAA8B,EAAE,UAAkB;QAC7D,IAAI,CAAC,eAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAA;SACtD;QAED,IAAI,CAAC,UAAU,GAAG,IAAA,YAAE,EAAC,UAAU,CAAC,CAAA;QAEhC,IAAI,UAAU,KAAK,OAAO,EAAE;YAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,0BAAgB,EAAE,CAAA;SACrC;aAAM;YACL,IAAI,CAAC,MAAM,GAAG,IAAI,2BAAiB,EAAE,CAAA;SACtC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW,EAAE,KAA0D,EAAE,GAAY;QAC9F,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,CAAC,UAAU,CAAA;QACxC,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAClC,CAAC;CACF;AAED,kBAAe,KAAK,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class MemoryCacheEngine {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.cache = {};
|
|
6
|
+
}
|
|
7
|
+
get(key) {
|
|
8
|
+
const item = this.cache[key];
|
|
9
|
+
if (!item || item.expiresAt < Date.now()) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
return item.value;
|
|
13
|
+
}
|
|
14
|
+
set(key, value, ttl = Infinity) {
|
|
15
|
+
this.cache[key] = { value, expiresAt: Date.now() + ttl };
|
|
16
|
+
}
|
|
17
|
+
del(key) {
|
|
18
|
+
delete this.cache[key];
|
|
19
|
+
}
|
|
20
|
+
clear() {
|
|
21
|
+
this.cache = {};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.default = MemoryCacheEngine;
|
|
25
|
+
//# sourceMappingURL=MemoryCacheEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemoryCacheEngine.js","sourceRoot":"","sources":["../../../../src/cache/engine/MemoryCacheEngine.ts"],"names":[],"mappings":";;AAEA,MAAM,iBAAiB;IAGrB;QACE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;IACjB,CAAC;IAED,GAAG,CAAE,GAAW;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE;YACxC,OAAO,SAAS,CAAA;SACjB;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,GAAG,CAAE,GAAW,EAAE,KAA0D,EAAE,GAAG,GAAG,QAAQ;QAC1F,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAA;IAC1D,CAAC;IAED,GAAG,CAAE,GAAW;QAEd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;IACjB,CAAC;CACF;AAED,kBAAe,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const ioredis_1 = tslib_1.__importDefault(require("ioredis"));
|
|
5
|
+
class RedisCacheEngine {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.client = new ioredis_1.default();
|
|
8
|
+
}
|
|
9
|
+
async get(key) {
|
|
10
|
+
const value = await this.client.get(key);
|
|
11
|
+
if (value === null) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
return JSON.parse(value);
|
|
15
|
+
}
|
|
16
|
+
async set(key, value, ttl = Infinity) {
|
|
17
|
+
const serializedValue = JSON.stringify(value);
|
|
18
|
+
await this.client.setex(key, Math.ceil(ttl / 1000), serializedValue);
|
|
19
|
+
}
|
|
20
|
+
async del(key) {
|
|
21
|
+
await this.client.del(key);
|
|
22
|
+
}
|
|
23
|
+
async clear() {
|
|
24
|
+
await this.client.flushdb();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.default = RedisCacheEngine;
|
|
28
|
+
//# sourceMappingURL=RedisCacheEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisCacheEngine.js","sourceRoot":"","sources":["../../../../src/cache/engine/RedisCacheEngine.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;AAM7B,MAAM,gBAAgB;IAGpB;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAO,EAAE,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,KAAK,KAAK,IAAI,EAAE;YAClB,OAAO,SAAS,CAAA;SACjB;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAiE,CAAA;IAC1F,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW,EAAE,KAAc,EAAE,GAAG,GAAG,QAAQ;QACpD,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,eAAe,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAC7B,CAAC;CACF;AAED,kBAAe,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getKey = exports.sortDeep = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
function sortDeep(data) {
|
|
8
|
+
if (lodash_1.default.isObjectLike(data) && lodash_1.default.isArray(data)) {
|
|
9
|
+
return data.map(sortDeep);
|
|
10
|
+
}
|
|
11
|
+
if (lodash_1.default.isObjectLike(data) && !lodash_1.default.isArray(data)) {
|
|
12
|
+
const sortedKeys = lodash_1.default.keys(data).sort((a, b) => a.localeCompare(b));
|
|
13
|
+
const sortedObj = {};
|
|
14
|
+
sortedKeys.forEach((key) => {
|
|
15
|
+
sortedObj[key] = sortDeep(data[key]);
|
|
16
|
+
});
|
|
17
|
+
return sortedObj;
|
|
18
|
+
}
|
|
19
|
+
return data;
|
|
20
|
+
}
|
|
21
|
+
exports.sortDeep = sortDeep;
|
|
22
|
+
function getKey(data) {
|
|
23
|
+
const sortedObj = sortDeep(data);
|
|
24
|
+
const sortedStr = JSON.stringify(sortedObj);
|
|
25
|
+
return (0, crypto_1.createHash)('sha256').update(sortedStr).digest('hex');
|
|
26
|
+
}
|
|
27
|
+
exports.getKey = getKey;
|
|
28
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":";;;;AAAA,4DAAsB;AACtB,mCAAmC;AAEnC,SAAgB,QAAQ,CAAE,IAAyD;IACjF,IAAI,gBAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,gBAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;KAC1B;IAED,IAAI,gBAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC5C,MAAM,UAAU,GAAG,gBAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;QAClE,MAAM,SAAS,GAA4B,EAAE,CAAA;QAE7C,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACzB,SAAS,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAwD,CAAC,CAAA;QAC7F,CAAC,CAAC,CAAA;QAEF,OAAO,SAAS,CAAA;KACjB;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAjBD,4BAiBC;AAED,SAAgB,MAAM,CAAE,IAAyD;IAC/E,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAC3C,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC7D,CAAC;AAJD,wBAIC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ICacheEngine.js","sourceRoot":"","sources":["../../../src/interfaces/ICacheEngine.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ICacheMongooseOptions.js","sourceRoot":"","sources":["../../../src/interfaces/ICacheMongooseOptions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
|
5
|
+
const ms_1 = tslib_1.__importDefault(require("ms"));
|
|
6
|
+
const Cache_1 = tslib_1.__importDefault(require("./cache/Cache"));
|
|
7
|
+
const crypto_1 = require("./crypto");
|
|
8
|
+
class CacheMongoose {
|
|
9
|
+
constructor() {
|
|
10
|
+
}
|
|
11
|
+
static init(mongoose, cacheMongooseOptions) {
|
|
12
|
+
if (typeof mongoose.Model.hydrate !== 'function')
|
|
13
|
+
throw new Error('Cache is only compatible with versions of mongoose that implement the `model.hydrate` method');
|
|
14
|
+
if (!this.instance) {
|
|
15
|
+
this.instance = new CacheMongoose();
|
|
16
|
+
this.instance.cache = new Cache_1.default(cacheMongooseOptions.engine, cacheMongooseOptions.defaultTTL = '1 minute');
|
|
17
|
+
const cache = this.instance.cache;
|
|
18
|
+
const mongooseExec = mongoose.Query.prototype.exec;
|
|
19
|
+
mongoose.Query.prototype.getCacheKey = function () {
|
|
20
|
+
if (this._key)
|
|
21
|
+
return this._key;
|
|
22
|
+
const filter = this.getFilter();
|
|
23
|
+
const update = this.getUpdate();
|
|
24
|
+
const options = this.getOptions();
|
|
25
|
+
const data = {
|
|
26
|
+
model: this.model.modelName,
|
|
27
|
+
op: this.op,
|
|
28
|
+
filter,
|
|
29
|
+
update,
|
|
30
|
+
skip: options.skip,
|
|
31
|
+
limit: options.limit,
|
|
32
|
+
sort: options.sort,
|
|
33
|
+
_fields: this._fields,
|
|
34
|
+
_path: this._path,
|
|
35
|
+
_distinct: this._distinct
|
|
36
|
+
};
|
|
37
|
+
return (0, crypto_1.getKey)(data);
|
|
38
|
+
};
|
|
39
|
+
mongoose.Query.prototype.getCacheTTL = function () {
|
|
40
|
+
return this._ttl;
|
|
41
|
+
};
|
|
42
|
+
mongoose.Query.prototype.cache = function (ttl, customKey) {
|
|
43
|
+
this._ttl = (0, ms_1.default)(ttl ?? '1 minute');
|
|
44
|
+
this._key = customKey;
|
|
45
|
+
return this;
|
|
46
|
+
};
|
|
47
|
+
mongoose.Query.prototype.exec = async function () {
|
|
48
|
+
if (!lodash_1.default.has(this, '_ttl')) {
|
|
49
|
+
return mongooseExec.apply(this);
|
|
50
|
+
}
|
|
51
|
+
const key = this.getCacheKey();
|
|
52
|
+
const ttl = this.getCacheTTL();
|
|
53
|
+
const model = this.model.modelName;
|
|
54
|
+
const resultCache = await cache.get(key);
|
|
55
|
+
if (resultCache) {
|
|
56
|
+
const constructor = mongoose.model(model);
|
|
57
|
+
if (lodash_1.default.isArray(resultCache)) {
|
|
58
|
+
return resultCache.map((item) => constructor.hydrate(item));
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
return constructor.hydrate(resultCache);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const result = await mongooseExec.call(this);
|
|
65
|
+
cache.set(key, result, ttl).catch((err) => {
|
|
66
|
+
console.error(err);
|
|
67
|
+
});
|
|
68
|
+
return result;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return this.instance;
|
|
72
|
+
}
|
|
73
|
+
async clearCache(customKey) {
|
|
74
|
+
if (!customKey) {
|
|
75
|
+
await this.cache.clear();
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
await this.cache.del(customKey);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.default = CacheMongoose;
|
|
82
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const engines: readonly ["memory", "redis"];
|
|
2
|
+
declare class Cache {
|
|
3
|
+
private engine;
|
|
4
|
+
private defaultTTL;
|
|
5
|
+
constructor(engineName: 'memory' | 'redis', defaultTTL: string);
|
|
6
|
+
get(key: string): Promise<Record<string, unknown> | Record<string, unknown>[] | undefined>;
|
|
7
|
+
set(key: string, value: Record<string, unknown> | Record<string, unknown>[], ttl?: number): Promise<void>;
|
|
8
|
+
del(key: string): Promise<void>;
|
|
9
|
+
clear(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export default Cache;
|
|
12
|
+
//# sourceMappingURL=Cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../../../src/cache/Cache.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,OAAO,8BAA+B,CAAA;AAEnD,cAAM,KAAK;IACT,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAQ;gBAEb,UAAU,EAAE,QAAQ,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM;IAczD,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;IAI3F,GAAG,CAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1G,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhC,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CAG9B;AAED,eAAe,KAAK,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type ICacheEngine from '../../interfaces/ICacheEngine';
|
|
2
|
+
declare class MemoryCacheEngine implements ICacheEngine {
|
|
3
|
+
private cache;
|
|
4
|
+
constructor();
|
|
5
|
+
get(key: string): Record<string, unknown> | Record<string, unknown>[] | undefined;
|
|
6
|
+
set(key: string, value: Record<string, unknown> | Record<string, unknown>[], ttl?: number): void;
|
|
7
|
+
del(key: string): void;
|
|
8
|
+
clear(): void;
|
|
9
|
+
}
|
|
10
|
+
export default MemoryCacheEngine;
|
|
11
|
+
//# sourceMappingURL=MemoryCacheEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemoryCacheEngine.d.ts","sourceRoot":"","sources":["../../../../../src/cache/engine/MemoryCacheEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAA;AAE7D,cAAM,iBAAkB,YAAW,YAAY;IAC7C,OAAO,CAAC,KAAK,CAA+G;;IAM5H,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,SAAS;IAQlF,GAAG,CAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,SAAW,GAAG,IAAI;IAInG,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAKvB,KAAK,IAAK,IAAI;CAGf;AAED,eAAe,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type ICacheEngine from '../../interfaces/ICacheEngine';
|
|
2
|
+
declare class RedisCacheEngine implements ICacheEngine {
|
|
3
|
+
private client;
|
|
4
|
+
constructor();
|
|
5
|
+
get(key: string): Promise<Record<string, unknown> | Record<string, unknown>[] | undefined>;
|
|
6
|
+
set(key: string, value: unknown, ttl?: number): Promise<void>;
|
|
7
|
+
del(key: string): Promise<void>;
|
|
8
|
+
clear(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export default RedisCacheEngine;
|
|
11
|
+
//# sourceMappingURL=RedisCacheEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisCacheEngine.d.ts","sourceRoot":"","sources":["../../../../../src/cache/engine/RedisCacheEngine.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAA;AAE7D,cAAM,gBAAiB,YAAW,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAO;;IAMf,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;IAQ3F,GAAG,CAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,SAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhC,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CAG9B;AAED,eAAe,gBAAgB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/crypto.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAiB5F;AAED,wBAAgB,MAAM,CAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAIzF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface ICacheEngine {
|
|
2
|
+
get: (key: string) => Promise<Record<string, unknown> | Record<string, unknown>[] | undefined> | Record<string, unknown> | Record<string, unknown>[] | undefined;
|
|
3
|
+
set: (key: string, value: Record<string, unknown> | Record<string, unknown>[], ttl?: number) => Promise<void> | void;
|
|
4
|
+
del: (key: string) => Promise<void> | void;
|
|
5
|
+
clear: () => Promise<void> | void;
|
|
6
|
+
}
|
|
7
|
+
export default ICacheEngine;
|
|
8
|
+
//# sourceMappingURL=ICacheEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ICacheEngine.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/ICacheEngine.ts"],"names":[],"mappings":"AAAA,UAAU,YAAY;IACpB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,SAAS,CAAA;IAChK,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACpH,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC1C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CAClC;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ICacheMongooseOptions.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/ICacheMongooseOptions.ts"],"names":[],"mappings":"AAAA,UAAU,qBAAqB;IAC7B,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,eAAe,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Mongoose } from 'mongoose';
|
|
2
|
+
import type ICacheMongooseOptions from './interfaces/ICacheMongooseOptions';
|
|
3
|
+
declare module 'mongoose' {
|
|
4
|
+
interface Query<ResultType, DocType, THelpers, RawDocType> {
|
|
5
|
+
cache: (this: Query<ResultType, DocType, THelpers, RawDocType>, ttl?: string) => this;
|
|
6
|
+
_key?: string;
|
|
7
|
+
getCacheKey: (this: Query<ResultType, DocType, THelpers, RawDocType>) => string;
|
|
8
|
+
_ttl: number;
|
|
9
|
+
getCacheTTL: (this: Query<ResultType, DocType, THelpers, RawDocType>) => number;
|
|
10
|
+
op?: string;
|
|
11
|
+
_fields?: unknown;
|
|
12
|
+
_path?: unknown;
|
|
13
|
+
_distinct?: unknown;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
declare class CacheMongoose {
|
|
17
|
+
private static instance;
|
|
18
|
+
private cache;
|
|
19
|
+
private constructor();
|
|
20
|
+
static init(mongoose: Mongoose, cacheMongooseOptions: ICacheMongooseOptions): CacheMongoose;
|
|
21
|
+
clearCache(customKey: string): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export default CacheMongoose;
|
|
24
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,qBAAqB,MAAM,oCAAoC,CAAA;AAG3E,OAAO,QAAQ,UAAU,CAAC;IACxB,UAAU,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU;QACvD,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;QACrF,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,MAAM,CAAA;QAC/E,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,MAAM,CAAA;QAC/E,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,SAAS,CAAC,EAAE,OAAO,CAAA;KACpB;CACF;AAED,cAAM,aAAa;IAEjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAClD,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO;WAKO,IAAI,CAAE,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,EAAE,qBAAqB,GAAG,aAAa;IAgFtF,UAAU,CAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAO3D;AAED,eAAe,aAAa,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import ms from 'ms';
|
|
2
|
+
import MemoryCacheEngine from './engine/MemoryCacheEngine';
|
|
3
|
+
import RedisCacheEngine from './engine/RedisCacheEngine';
|
|
4
|
+
export const engines = ['memory', 'redis'];
|
|
5
|
+
class Cache {
|
|
6
|
+
constructor(engineName, defaultTTL) {
|
|
7
|
+
if (!engines.includes(engineName)) {
|
|
8
|
+
throw new Error(`Invalid engine name: ${engineName}`);
|
|
9
|
+
}
|
|
10
|
+
this.defaultTTL = ms(defaultTTL);
|
|
11
|
+
if (engineName === 'redis') {
|
|
12
|
+
this.engine = new RedisCacheEngine();
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
this.engine = new MemoryCacheEngine();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async get(key) {
|
|
19
|
+
return await this.engine.get(key);
|
|
20
|
+
}
|
|
21
|
+
async set(key, value, ttl) {
|
|
22
|
+
const actualTTL = ttl ?? this.defaultTTL;
|
|
23
|
+
return await this.engine.set(key, value, actualTTL);
|
|
24
|
+
}
|
|
25
|
+
async del(key) {
|
|
26
|
+
return await this.engine.del(key);
|
|
27
|
+
}
|
|
28
|
+
async clear() {
|
|
29
|
+
return await this.engine.clear();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export default Cache;
|
|
33
|
+
//# sourceMappingURL=Cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../../src/cache/Cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAInB,OAAO,iBAAiB,MAAM,4BAA4B,CAAA;AAC1D,OAAO,gBAAgB,MAAM,2BAA2B,CAAA;AAExD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAU,CAAA;AAEnD,MAAM,KAAK;IAIT,YAAa,UAA8B,EAAE,UAAkB;QAC7D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAA;SACtD;QAED,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,CAAA;QAEhC,IAAI,UAAU,KAAK,OAAO,EAAE;YAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAA;SACrC;aAAM;YACL,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAA;SACtC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW,EAAE,KAA0D,EAAE,GAAY;QAC9F,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,CAAC,UAAU,CAAA;QACxC,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAClC,CAAC;CACF;AAED,eAAe,KAAK,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class MemoryCacheEngine {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.cache = {};
|
|
4
|
+
}
|
|
5
|
+
get(key) {
|
|
6
|
+
const item = this.cache[key];
|
|
7
|
+
if (!item || item.expiresAt < Date.now()) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
return item.value;
|
|
11
|
+
}
|
|
12
|
+
set(key, value, ttl = Infinity) {
|
|
13
|
+
this.cache[key] = { value, expiresAt: Date.now() + ttl };
|
|
14
|
+
}
|
|
15
|
+
del(key) {
|
|
16
|
+
delete this.cache[key];
|
|
17
|
+
}
|
|
18
|
+
clear() {
|
|
19
|
+
this.cache = {};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export default MemoryCacheEngine;
|
|
23
|
+
//# sourceMappingURL=MemoryCacheEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemoryCacheEngine.js","sourceRoot":"","sources":["../../../../src/cache/engine/MemoryCacheEngine.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB;IAGrB;QACE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;IACjB,CAAC;IAED,GAAG,CAAE,GAAW;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE;YACxC,OAAO,SAAS,CAAA;SACjB;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,GAAG,CAAE,GAAW,EAAE,KAA0D,EAAE,GAAG,GAAG,QAAQ;QAC1F,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAA;IAC1D,CAAC;IAED,GAAG,CAAE,GAAW;QAEd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;IACjB,CAAC;CACF;AAED,eAAe,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import IORedis from 'ioredis';
|
|
2
|
+
class RedisCacheEngine {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.client = new IORedis();
|
|
5
|
+
}
|
|
6
|
+
async get(key) {
|
|
7
|
+
const value = await this.client.get(key);
|
|
8
|
+
if (value === null) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
return JSON.parse(value);
|
|
12
|
+
}
|
|
13
|
+
async set(key, value, ttl = Infinity) {
|
|
14
|
+
const serializedValue = JSON.stringify(value);
|
|
15
|
+
await this.client.setex(key, Math.ceil(ttl / 1000), serializedValue);
|
|
16
|
+
}
|
|
17
|
+
async del(key) {
|
|
18
|
+
await this.client.del(key);
|
|
19
|
+
}
|
|
20
|
+
async clear() {
|
|
21
|
+
await this.client.flushdb();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export default RedisCacheEngine;
|
|
25
|
+
//# sourceMappingURL=RedisCacheEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisCacheEngine.js","sourceRoot":"","sources":["../../../../src/cache/engine/RedisCacheEngine.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAM7B,MAAM,gBAAgB;IAGpB;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,KAAK,KAAK,IAAI,EAAE;YAClB,OAAO,SAAS,CAAA;SACjB;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAiE,CAAA;IAC1F,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW,EAAE,KAAc,EAAE,GAAG,GAAG,QAAQ;QACpD,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,eAAe,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAC7B,CAAC;CACF;AAED,eAAe,gBAAgB,CAAA"}
|