@knaus94/prisma-extension-cache-manager 1.0.16 → 1.1.0
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.js +49 -29
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +4 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ function generateComposedKey(options) {
|
|
|
7
7
|
const hash = (0, crypto_1.createHash)("md5")
|
|
8
8
|
.update(JSON.stringify(options?.queryArgs))
|
|
9
9
|
.digest("hex");
|
|
10
|
-
return `
|
|
10
|
+
return `Prisma@${options.model}@${hash}`;
|
|
11
11
|
}
|
|
12
12
|
exports.default = ({ cache }) => {
|
|
13
13
|
return extension_1.Prisma.defineExtension({
|
|
@@ -21,25 +21,39 @@ exports.default = ({ cache }) => {
|
|
|
21
21
|
query: {
|
|
22
22
|
$allModels: {
|
|
23
23
|
async $allOperations({ model, operation, args, query }) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
if (!types_1.CACHE_OPERATIONS.includes(operation))
|
|
25
|
+
return query(args);
|
|
26
|
+
const { cache: cacheOption, uncache: uncacheOption, ...queryArgs } = args;
|
|
27
|
+
function processUncache(result) {
|
|
28
|
+
const option = uncacheOption;
|
|
29
|
+
let keysToDelete = [];
|
|
30
|
+
if (typeof option === "function") {
|
|
31
|
+
const keys = option(result);
|
|
32
|
+
keysToDelete = Array.isArray(keys) ? keys : [keys];
|
|
33
|
+
}
|
|
34
|
+
else if (typeof option === "string") {
|
|
35
|
+
keysToDelete = [option];
|
|
36
|
+
}
|
|
37
|
+
else if (Array.isArray(option)) {
|
|
38
|
+
keysToDelete = option;
|
|
39
|
+
}
|
|
40
|
+
if (!keysToDelete.length)
|
|
41
|
+
return;
|
|
42
|
+
return Promise.all(keysToDelete.map((key) => cache.del(key).catch(() => Promise.resolve(true))));
|
|
43
|
+
}
|
|
44
|
+
const useCache = cacheOption !== undefined &&
|
|
45
|
+
["boolean", "object"].includes(typeof cacheOption);
|
|
46
|
+
const useUncache = uncacheOption !== undefined &&
|
|
47
|
+
(typeof uncacheOption === "function" ||
|
|
48
|
+
typeof uncacheOption === "string" ||
|
|
49
|
+
Array.isArray(uncacheOption));
|
|
32
50
|
if (!useCache) {
|
|
33
51
|
const result = await query(queryArgs);
|
|
34
|
-
if (useUncache)
|
|
35
|
-
|
|
36
|
-
if (keys?.length > 0) {
|
|
37
|
-
await Promise.all(keys.map((key) => cache.del(key).catch(() => Promise.resolve(true))));
|
|
38
|
-
}
|
|
39
|
-
}
|
|
52
|
+
if (useUncache)
|
|
53
|
+
processUncache(result);
|
|
40
54
|
return result;
|
|
41
55
|
}
|
|
42
|
-
if (typeof
|
|
56
|
+
if (typeof cacheOption === "boolean") {
|
|
43
57
|
const cacheKey = generateComposedKey({
|
|
44
58
|
model,
|
|
45
59
|
queryArgs,
|
|
@@ -49,16 +63,26 @@ exports.default = ({ cache }) => {
|
|
|
49
63
|
return typeof cached === "string" ? JSON.parse(cached) : cached;
|
|
50
64
|
}
|
|
51
65
|
const result = await query(queryArgs);
|
|
52
|
-
if (useUncache)
|
|
53
|
-
|
|
54
|
-
if (keys?.length > 0) {
|
|
55
|
-
await Promise.all(keys.map((key) => cache.del(key).catch(() => Promise.resolve(true))));
|
|
56
|
-
}
|
|
57
|
-
}
|
|
66
|
+
if (useUncache)
|
|
67
|
+
processUncache(result);
|
|
58
68
|
await cache.set(cacheKey, JSON.stringify(result));
|
|
59
69
|
return result;
|
|
60
70
|
}
|
|
61
|
-
const { key, ttl } =
|
|
71
|
+
const { key, ttl } = cacheOption;
|
|
72
|
+
if (typeof key === "function") {
|
|
73
|
+
const result = await query(queryArgs);
|
|
74
|
+
if (useUncache)
|
|
75
|
+
processUncache(result);
|
|
76
|
+
const customCacheKey = key(result);
|
|
77
|
+
const value = JSON.stringify(result);
|
|
78
|
+
if (ttl) {
|
|
79
|
+
await cache.set(customCacheKey, value, ttl);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
await cache.set(customCacheKey, value);
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
62
86
|
const customCacheKey = key ||
|
|
63
87
|
generateComposedKey({
|
|
64
88
|
model,
|
|
@@ -69,12 +93,8 @@ exports.default = ({ cache }) => {
|
|
|
69
93
|
return typeof cached === "string" ? JSON.parse(cached) : cached;
|
|
70
94
|
}
|
|
71
95
|
const result = await query(queryArgs);
|
|
72
|
-
if (useUncache)
|
|
73
|
-
|
|
74
|
-
if (keys?.length > 0) {
|
|
75
|
-
await Promise.all(keys.map((key) => cache.del(key).catch(() => Promise.resolve(true))));
|
|
76
|
-
}
|
|
77
|
-
}
|
|
96
|
+
if (useUncache)
|
|
97
|
+
processUncache(result);
|
|
78
98
|
const value = JSON.stringify(result);
|
|
79
99
|
if (ttl) {
|
|
80
100
|
await cache.set(customCacheKey, value, ttl);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,wDAAkD;AAClD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -12,19 +12,19 @@ export type ModelExtension = {
|
|
|
12
12
|
} & {
|
|
13
13
|
[O2 in OptionalArgsOperation]: OptionalArgsFunction<O2>;
|
|
14
14
|
};
|
|
15
|
-
export interface CacheOptions {
|
|
15
|
+
export interface CacheOptions<T, A, O extends RequiredArgsOperation | OptionalArgsOperation> {
|
|
16
16
|
/**
|
|
17
17
|
* Cache key
|
|
18
18
|
*/
|
|
19
|
-
key: string;
|
|
19
|
+
key: ((result: Prisma.Result<T, A, O>) => string) | string;
|
|
20
20
|
/**
|
|
21
21
|
* Time to live
|
|
22
22
|
*/
|
|
23
23
|
ttl?: number;
|
|
24
24
|
}
|
|
25
25
|
export interface PrismaCacheArgs<T, A, O extends RequiredArgsOperation | OptionalArgsOperation> {
|
|
26
|
-
cache?: boolean | CacheOptions
|
|
27
|
-
uncache?: (result: Prisma.Result<T, A, O>) => string[];
|
|
26
|
+
cache?: boolean | CacheOptions<T, A, O>;
|
|
27
|
+
uncache?: ((result: Prisma.Result<T, A, O>) => string[] | string) | string | string[];
|
|
28
28
|
}
|
|
29
29
|
export interface PrismaRedisCacheConfig {
|
|
30
30
|
cache: Cache;
|