@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 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, defaultTTL, debug }: PrismaRedisCacheConfig) => (client: any) => import("@prisma/client/extension").PrismaClientExtends<import("@prisma/client/runtime/library").InternalArgs<{}, {
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
- // Импорт msgpack5
11
- const msgpack5_1 = __importDefault(require("msgpack5"));
7
+ const msgpack_lite_1 = require("msgpack-lite");
12
8
  /**
13
- * Создаем экземпляр msgpack5.
9
+ * Создаем codec
14
10
  * В дальнейшем используем его encode/decode для сериализации/десериализации.
15
11
  */
16
- const mp = (0, msgpack5_1.default)();
17
- /**
18
- * Уникальные коды (type) для регистрации пользовательских типов
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
- mp.register(TYPE_DECIMAL, library_1.Decimal, (decimal) => Buffer.from(decimal.toString()), // encode
37
- (buffer) => new library_1.Decimal(buffer.toString()) // decode
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, defaultTTL, debug }) => {
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 : defaultTTL;
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 ?? defaultTTL;
191
- // Сохраняем результат в кеш, используя msgpack5
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
- await cache.set(cacheKey, mp.encode(result), ttl);
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:", mp.encode(result), "decoded:", result);
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) Иначе берем ключ/namespace/ttl из объекта
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 ?? defaultTTL;
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", mp.decode(cached));
238
+ console.log("Cache hit for key:", cacheKey, "data", cached, "decoded", data);
220
239
  }
221
- // Десериализуем через msgpack5
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
- await cache.set(cacheKey, mp.encode(result), ttl);
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:", mp.encode(result), "decoded:", result);
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
@@ -35,7 +35,7 @@ export interface PrismaCacheArgs<T, A, O extends RequiredArgsOperation | Optiona
35
35
  }
36
36
  export interface PrismaRedisCacheConfig {
37
37
  cache: RedisCache;
38
- defaultTTL?: number;
39
38
  debug?: boolean;
39
+ ttl?: number;
40
40
  }
41
41
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knaus94/prisma-extension-cache-manager",
3
- "version": "1.5.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/msgpack5": "^3.4.6",
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
  }