@knaus94/prisma-extension-cache-manager 1.5.5 → 1.5.7
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 -1
- package/dist/index.js +65 -38
- package/dist/types.d.ts +1 -1
- package/package.json +8 -3
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { ModelExtension, PrismaRedisCacheConfig } from "./types";
|
|
|
4
4
|
* @param config - Конфигурация для кеша Redis и TTL по умолчанию.
|
|
5
5
|
* @returns Prisma расширение.
|
|
6
6
|
*/
|
|
7
|
-
declare const _default: ({ cache,
|
|
7
|
+
declare const _default: ({ cache, debug, ttl: defaultTTL }: PrismaRedisCacheConfig) => (client: any) => import("@prisma/client/extension").PrismaClientExtends<import("@prisma/client/runtime/library").InternalArgs<{}, {
|
|
8
8
|
$allModels: ModelExtension;
|
|
9
9
|
}, {}, {
|
|
10
10
|
$cache: import("cache-manager-ioredis-yet").RedisCache;
|
package/dist/index.js
CHANGED
|
@@ -1,41 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
const types_1 = require("./types");
|
|
7
4
|
const crypto_1 = require("crypto");
|
|
8
5
|
const library_1 = require("@prisma/client/runtime/library");
|
|
9
6
|
const extension_1 = require("@prisma/client/extension");
|
|
10
|
-
|
|
11
|
-
const msgpack5_1 = __importDefault(require("msgpack5"));
|
|
7
|
+
const msgpack_lite_1 = require("msgpack-lite");
|
|
12
8
|
/**
|
|
13
|
-
* Создаем
|
|
9
|
+
* Создаем codec
|
|
14
10
|
* В дальнейшем используем его encode/decode для сериализации/десериализации.
|
|
15
11
|
*/
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
* в MessagePack. Убедитесь, что числа не конфликтуют с другими типами.
|
|
20
|
-
*/
|
|
21
|
-
const TYPE_DATE = 0x01;
|
|
22
|
-
const TYPE_DECIMAL = 0x02;
|
|
23
|
-
/**
|
|
24
|
-
* Регистрируем тип `Date`.
|
|
25
|
-
* - При кодировании превращаем `Date` в строку (ISO).
|
|
26
|
-
* - При декодировании восстанавливаем из строки обратно в `Date`.
|
|
27
|
-
*/
|
|
28
|
-
mp.register(TYPE_DATE, Date, (date) => Buffer.from(date.toISOString()), // encode
|
|
29
|
-
(buffer) => new Date(buffer.toString()) // decode
|
|
30
|
-
);
|
|
12
|
+
const codec = (0, msgpack_lite_1.createCodec)();
|
|
13
|
+
const TYPE_DECIMAL = 0x07;
|
|
14
|
+
const TYPE_DATE = 0x0d;
|
|
31
15
|
/**
|
|
32
16
|
* Регистрируем тип `Decimal`.
|
|
33
17
|
* - При кодировании превращаем `Decimal` в строку.
|
|
34
18
|
* - При декодировании восстанавливаем обратно в `Decimal`.
|
|
35
19
|
*/
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
);
|
|
20
|
+
codec.addExtPacker(TYPE_DECIMAL, library_1.Decimal, (decimal) => {
|
|
21
|
+
return Buffer.from(decimal.toString());
|
|
22
|
+
});
|
|
23
|
+
codec.addExtUnpacker(TYPE_DECIMAL, (buffer) => {
|
|
24
|
+
return new library_1.Decimal(buffer.toString());
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Регистрируем тип `Date`.
|
|
28
|
+
* - При кодировании превращаем `Date` в строку.
|
|
29
|
+
* - При декодировании восстанавливаем обратно в `Date`.
|
|
30
|
+
*/
|
|
31
|
+
codec.addExtPacker(TYPE_DATE, Date, (date) => {
|
|
32
|
+
return Buffer.from(date.toISOString());
|
|
33
|
+
});
|
|
34
|
+
codec.addExtUnpacker(TYPE_DATE, (buffer) => {
|
|
35
|
+
return new Date(buffer.toString());
|
|
36
|
+
});
|
|
39
37
|
/**
|
|
40
38
|
* Генерирует уникальный ключ для кеширования на основе модели и аргументов запроса.
|
|
41
39
|
* @param options - Опции для генерации ключа.
|
|
@@ -56,6 +54,18 @@ function generateComposedKey(options) {
|
|
|
56
54
|
function createKey(key, namespace) {
|
|
57
55
|
return namespace ? `${namespace}:${key}` : key;
|
|
58
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Сериализация данных
|
|
59
|
+
*/
|
|
60
|
+
function serialize(data) {
|
|
61
|
+
return (0, msgpack_lite_1.encode)(data, { codec });
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Десериализация данных
|
|
65
|
+
*/
|
|
66
|
+
function deserialize(buffer) {
|
|
67
|
+
return (0, msgpack_lite_1.decode)(buffer, { codec });
|
|
68
|
+
}
|
|
59
69
|
/**
|
|
60
70
|
* Обрабатывает удаление ключей из кеша после операций записи.
|
|
61
71
|
* @param cache - Кеш-менеджер.
|
|
@@ -88,7 +98,6 @@ async function processUncache(cache, uncacheOption, result) {
|
|
|
88
98
|
if (keysToDelete.length === 0)
|
|
89
99
|
return true;
|
|
90
100
|
try {
|
|
91
|
-
// mdel — это ваш кастомный метод в store для массового удаления ключей.
|
|
92
101
|
await cache.store.mdel(...keysToDelete);
|
|
93
102
|
return true;
|
|
94
103
|
}
|
|
@@ -121,7 +130,7 @@ function shouldUseUncache(uncacheOption) {
|
|
|
121
130
|
* @param config - Конфигурация для кеша Redis и TTL по умолчанию.
|
|
122
131
|
* @returns Prisma расширение.
|
|
123
132
|
*/
|
|
124
|
-
exports.default = ({ cache,
|
|
133
|
+
exports.default = ({ cache, debug, ttl: defaultTTL }) => {
|
|
125
134
|
return extension_1.Prisma.defineExtension({
|
|
126
135
|
name: "prisma-extension-cache-manager",
|
|
127
136
|
client: {
|
|
@@ -174,7 +183,7 @@ exports.default = ({ cache, defaultTTL, debug }) => {
|
|
|
174
183
|
? cacheOption // Если cacheOption — строка, используем её как ключ напрямую
|
|
175
184
|
: generateComposedKey({ model, queryArgs }); // Иначе генерируем ключ
|
|
176
185
|
// Если cacheOption — число, оно означает TTL
|
|
177
|
-
ttl = typeof cacheOption === "number" ? cacheOption :
|
|
186
|
+
ttl = typeof cacheOption === "number" ? cacheOption : undefined;
|
|
178
187
|
}
|
|
179
188
|
// 2b) Если cacheOption — объект с key: function,
|
|
180
189
|
// нужно сначала сделать запрос к БД, чтобы функция могла сгенерировать ключ
|
|
@@ -187,12 +196,21 @@ exports.default = ({ cache, defaultTTL, debug }) => {
|
|
|
187
196
|
}
|
|
188
197
|
// Функция генерирует ключ на основе результатов
|
|
189
198
|
cacheKey = cacheOption.key(result);
|
|
190
|
-
ttl = cacheOption.ttl
|
|
191
|
-
|
|
199
|
+
ttl = cacheOption.ttl;
|
|
200
|
+
if (ttl === undefined) {
|
|
201
|
+
ttl = defaultTTL;
|
|
202
|
+
}
|
|
203
|
+
if (ttl) {
|
|
204
|
+
ttl = Math.ceil(ttl);
|
|
205
|
+
}
|
|
206
|
+
// Сохраняем результат в кеш
|
|
192
207
|
try {
|
|
193
|
-
|
|
208
|
+
const encoded = serialize(result);
|
|
209
|
+
await (ttl && ttl > 0
|
|
210
|
+
? cache.store.client.set(cacheKey, encoded, "EX", ttl / 1000)
|
|
211
|
+
: cache.store.client.set(cacheKey, encoded));
|
|
194
212
|
if (debug) {
|
|
195
|
-
console.log("Data cached with key (function):", cacheKey, "encoded:",
|
|
213
|
+
console.log("Data cached with key (function):", cacheKey, "encoded:", encoded, "decoded:", result);
|
|
196
214
|
}
|
|
197
215
|
}
|
|
198
216
|
catch (e) {
|
|
@@ -202,12 +220,12 @@ exports.default = ({ cache, defaultTTL, debug }) => {
|
|
|
202
220
|
}
|
|
203
221
|
return result;
|
|
204
222
|
}
|
|
205
|
-
// 2c) Иначе
|
|
223
|
+
// 2c) Иначе берём ключ/namespace/ttl из объекта
|
|
206
224
|
else {
|
|
207
225
|
cacheKey =
|
|
208
226
|
createKey(cacheOption.key, cacheOption.namespace) ||
|
|
209
227
|
generateComposedKey({ model, queryArgs });
|
|
210
|
-
ttl = cacheOption.ttl
|
|
228
|
+
ttl = cacheOption.ttl;
|
|
211
229
|
}
|
|
212
230
|
// 3. Если это операция чтения, пробуем вернуть данные из кеша
|
|
213
231
|
if (!isWriteOperation) {
|
|
@@ -215,11 +233,11 @@ exports.default = ({ cache, defaultTTL, debug }) => {
|
|
|
215
233
|
// Используем getBuffer, т.к. сохраняем бинарные данные
|
|
216
234
|
const cached = await cache.store.client.getBuffer(cacheKey);
|
|
217
235
|
if (cached) {
|
|
236
|
+
const data = deserialize(cached);
|
|
218
237
|
if (debug) {
|
|
219
|
-
console.log("Cache hit for key:", cacheKey, "data", cached, "decoded",
|
|
238
|
+
console.log("Cache hit for key:", cacheKey, "data", cached, "decoded", data);
|
|
220
239
|
}
|
|
221
|
-
|
|
222
|
-
return mp.decode(cached);
|
|
240
|
+
return data;
|
|
223
241
|
}
|
|
224
242
|
else {
|
|
225
243
|
if (debug) {
|
|
@@ -239,11 +257,20 @@ exports.default = ({ cache, defaultTTL, debug }) => {
|
|
|
239
257
|
if (useUncache) {
|
|
240
258
|
await processUncache(cache, uncacheOption, result);
|
|
241
259
|
}
|
|
260
|
+
if (ttl === undefined) {
|
|
261
|
+
ttl = defaultTTL;
|
|
262
|
+
}
|
|
263
|
+
if (ttl) {
|
|
264
|
+
ttl = Math.ceil(ttl);
|
|
265
|
+
}
|
|
242
266
|
// 6. Сохраняем результат запроса в кеш
|
|
243
267
|
try {
|
|
244
|
-
|
|
268
|
+
const encoded = serialize(result);
|
|
269
|
+
await (ttl && ttl > 0
|
|
270
|
+
? cache.store.client.set(cacheKey, encoded, "EX", ttl / 1000)
|
|
271
|
+
: cache.store.client.set(cacheKey, encoded));
|
|
245
272
|
if (debug) {
|
|
246
|
-
console.log("Data cached with key:", cacheKey, "encoded:",
|
|
273
|
+
console.log("Data cached with key:", cacheKey, "encoded:", encoded, "decoded:", result);
|
|
247
274
|
}
|
|
248
275
|
}
|
|
249
276
|
catch (e) {
|
package/dist/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knaus94/prisma-extension-cache-manager",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.7",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/knaus94/prisma-extension-cache-manager.git"
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@types/
|
|
43
|
+
"@types/msgpack-lite": "^0.1.11",
|
|
44
44
|
"@types/node": "^20.10.6",
|
|
45
45
|
"prettier": "^3.1.1",
|
|
46
46
|
"rimraf": "^5.0.5",
|
|
@@ -55,9 +55,14 @@
|
|
|
55
55
|
]
|
|
56
56
|
},
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"msgpack5": "^6.0.2",
|
|
59
58
|
"@prisma/client": "^5.7.1",
|
|
60
59
|
"cache-manager": "^5.2.3",
|
|
60
|
+
"cache-manager-ioredis-yet": "^2.1.1",
|
|
61
|
+
"msgpack-lite": "^0.1.26"
|
|
62
|
+
},
|
|
63
|
+
"peerDependencies": {
|
|
64
|
+
"@nestjs/cache-manager": "^1.0.0",
|
|
65
|
+
"cache-manager": "^5.2.0",
|
|
61
66
|
"cache-manager-ioredis-yet": "^2.1.1"
|
|
62
67
|
}
|
|
63
68
|
}
|