@saltcute/cache 1.0.2 → 1.0.4
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/cache.d.ts +1 -0
- package/dist/cache.js +65 -26
- package/dist/cache.js.map +1 -1
- package/package.json +1 -1
package/dist/cache.d.ts
CHANGED
package/dist/cache.js
CHANGED
|
@@ -6,21 +6,37 @@ const memory_cache_1 = require("memory-cache");
|
|
|
6
6
|
const redis_1 = require("redis");
|
|
7
7
|
class Cache {
|
|
8
8
|
namespace;
|
|
9
|
+
static REDIS_HOT_KEY_MEM_CACHE_TTL = 1000;
|
|
9
10
|
logger;
|
|
10
11
|
memCache;
|
|
11
12
|
redisClient;
|
|
12
13
|
isRedisAvailable = true;
|
|
13
14
|
constructor(namespace) {
|
|
14
15
|
this.namespace = namespace;
|
|
15
|
-
this.logger = logger_1.logger.child().
|
|
16
|
+
this.logger = logger_1.logger.child().withPrefix(`[${this.namespace}:cache]`);
|
|
16
17
|
this.memCache = new memory_cache_1.Cache();
|
|
17
|
-
this.redisClient = (0, redis_1.createClient)(
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
this.redisClient = (0, redis_1.createClient)({
|
|
19
|
+
socket: {
|
|
20
|
+
reconnectStrategy: (retries) => Math.min(retries * 100, 3000),
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
this.redisClient.on("error", async (e) => {
|
|
24
|
+
if (this.isRedisAvailable) {
|
|
25
|
+
this.logger
|
|
26
|
+
.withError(e)
|
|
27
|
+
.error("Redis connection error, using memory-cache.");
|
|
28
|
+
this.isRedisAvailable = false;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
this.redisClient.connect().catch((e) => {
|
|
32
|
+
this.logger
|
|
33
|
+
.withError(e)
|
|
34
|
+
.error("Redis connection error, using memory-cache.");
|
|
20
35
|
this.isRedisAvailable = false;
|
|
21
|
-
this.redisClient.destroy();
|
|
22
36
|
});
|
|
23
|
-
this.redisClient.
|
|
37
|
+
this.redisClient.on("ready", () => {
|
|
38
|
+
this.isRedisAvailable = true; // recover when the socket comes back
|
|
39
|
+
});
|
|
24
40
|
}
|
|
25
41
|
getKey(key) {
|
|
26
42
|
return `${this.namespace}:${key}`;
|
|
@@ -33,22 +49,35 @@ class Cache {
|
|
|
33
49
|
*/
|
|
34
50
|
async get(key) {
|
|
35
51
|
const memCacheValue = this.memCache.get(this.getKey(key));
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
52
|
+
try {
|
|
53
|
+
if (!memCacheValue && this.isRedisAvailable) {
|
|
54
|
+
const redisReadBegin = performance.now();
|
|
55
|
+
const redisValue = await this.redisClient.get(this.getKey(key));
|
|
56
|
+
const redisReadLapsed = performance.now() - redisReadBegin;
|
|
57
|
+
if (redisValue) {
|
|
58
|
+
try {
|
|
59
|
+
const parsed = JSON.parse(redisValue);
|
|
60
|
+
this.memCache.put(this.getKey(key), parsed, Cache.REDIS_HOT_KEY_MEM_CACHE_TTL);
|
|
61
|
+
this.logger.trace(`GET "${this.getKey(key)}" Redis HIT, took ${redisReadLapsed.toFixed(1)}ms.`);
|
|
62
|
+
return parsed;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
this.logger.trace(`GET "${this.getKey(key)}" Redis INVALID, took ${redisReadLapsed.toFixed(1)}ms.`);
|
|
66
|
+
await this.redisClient.del(this.getKey(key));
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
47
69
|
}
|
|
48
70
|
}
|
|
71
|
+
else {
|
|
72
|
+
return memCacheValue;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
this.logger
|
|
77
|
+
.withError(e)
|
|
78
|
+
.warn(`Redis GET failed for "${this.getKey(key)}", falling back to memory-cache.`);
|
|
79
|
+
return this.memCache.get(this.getKey(key));
|
|
49
80
|
}
|
|
50
|
-
else
|
|
51
|
-
return memCacheValue;
|
|
52
81
|
}
|
|
53
82
|
/**
|
|
54
83
|
* Put a value into cache.
|
|
@@ -58,17 +87,27 @@ class Cache {
|
|
|
58
87
|
* @param ttl Cache TTL in milliseconds.
|
|
59
88
|
*/
|
|
60
89
|
async put(key, value, ttl) {
|
|
90
|
+
const putBegin = performance.now();
|
|
61
91
|
if (this.isRedisAvailable) {
|
|
62
|
-
this.memCache.put(this.getKey(key), value,
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
92
|
+
this.memCache.put(this.getKey(key), value, Cache.REDIS_HOT_KEY_MEM_CACHE_TTL);
|
|
93
|
+
try {
|
|
94
|
+
await this.redisClient.set(this.getKey(key), JSON.stringify(value), {
|
|
95
|
+
expiration: {
|
|
96
|
+
type: "EX",
|
|
97
|
+
value: Math.trunc(ttl / 1000),
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
this.logger
|
|
103
|
+
.withError(e)
|
|
104
|
+
.warn(`Redis PUT failed for "${this.getKey(key)}", value kept in memory-cache only.`);
|
|
105
|
+
}
|
|
69
106
|
}
|
|
70
107
|
else
|
|
71
108
|
this.memCache.put(this.getKey(key), value, ttl);
|
|
109
|
+
const putLapsed = performance.now() - putBegin;
|
|
110
|
+
this.logger.trace(`PUT "${this.getKey(key)}", took ${putLapsed.toFixed(1)}ms.`);
|
|
72
111
|
}
|
|
73
112
|
}
|
|
74
113
|
exports.Cache = Cache;
|
package/dist/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":";;;AAAA,6CAA0C;AAC1C,+CAAiD;AACjD,iCAAqC;AACrC,MAAa,KAAK;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":";;;AAAA,6CAA0C;AAC1C,+CAAiD;AACjD,iCAAqC;AACrC,MAAa,KAAK;IASM;IARZ,MAAM,CAAU,2BAA2B,GAAG,IAAI,CAAC;IAEnD,MAAM,CAAC;IAEP,QAAQ,CAAC;IACT,WAAW,CAAC;IAEZ,gBAAgB,GAAG,IAAI,CAAC;IAChC,YAAoB,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;QACjC,IAAI,CAAC,MAAM,GAAG,eAAM,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,SAAS,SAAS,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAQ,EAAa,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAA,oBAAY,EAAC;YAC5B,MAAM,EAAE;gBACJ,iBAAiB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,IAAI,CAAC;aAChE;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM;qBACN,SAAS,CAAC,CAAC,CAAC;qBACZ,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBAC1D,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAClC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACnC,IAAI,CAAC,MAAM;iBACN,SAAS,CAAC,CAAC,CAAC;iBACZ,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC1D,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC9B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,qCAAqC;QACvE,CAAC,CAAC,CAAC;IACP,CAAC;IACO,MAAM,CAAC,GAAW;QACtB,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;IACtC,CAAC;IACD;;;;;OAKG;IACI,KAAK,CAAC,GAAG,CAAC,GAAW;QACxB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC;YACD,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1C,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBACzC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChE,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;gBAE3D,IAAI,UAAU,EAAE,CAAC;oBACb,IAAI,CAAC;wBACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;wBACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CACb,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAChB,MAAM,EACN,KAAK,CAAC,2BAA2B,CACpC,CAAC;wBACF,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/E,CAAC;wBACF,OAAO,MAAM,CAAC;oBAClB,CAAC;oBAAC,MAAM,CAAC;wBACL,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yBAAyB,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CACnF,CAAC;wBACF,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC7C,OAAO,IAAI,CAAC;oBAChB,CAAC;gBACL,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,OAAO,aAAa,CAAC;YACzB,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,MAAM;iBACN,SAAS,CAAC,CAAC,CAAC;iBACZ,IAAI,CACD,yBAAyB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAC9E,CAAC;YACN,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IACD;;;;;;OAMG;IACI,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAQ,EAAE,GAAW;QAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CACb,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAChB,KAAK,EACL,KAAK,CAAC,2BAA2B,CACpC,CAAC;YACF,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAChB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EACrB;oBACI,UAAU,EAAE;wBACR,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;qBAChC;iBACJ,CACJ,CAAC;YACN,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM;qBACN,SAAS,CAAC,CAAC,CAAC;qBACZ,IAAI,CACD,yBAAyB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qCAAqC,CACjF,CAAC;YACV,CAAC;QACL,CAAC;;YAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/D,CAAC;IACN,CAAC;;AA1HL,sBA2HC"}
|