@saltcute/cache 1.0.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/cache.d.ts +25 -0
- package/dist/cache.js +75 -0
- package/dist/cache.js.map +1 -0
- package/dist/type.d.ts +6 -0
- package/dist/type.js +3 -0
- package/dist/type.js.map +1 -0
- package/package.json +42 -0
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { JsonObject } from "./type";
|
|
2
|
+
export declare class Cache<T extends JsonObject> {
|
|
3
|
+
private namespace;
|
|
4
|
+
private logger;
|
|
5
|
+
private memCache;
|
|
6
|
+
private redisClient;
|
|
7
|
+
private isRedisAvailable;
|
|
8
|
+
constructor(namespace: string);
|
|
9
|
+
private getKey;
|
|
10
|
+
/**
|
|
11
|
+
* Get a value from cache.
|
|
12
|
+
*
|
|
13
|
+
* @param key Cache key.
|
|
14
|
+
* @returns Cache value.
|
|
15
|
+
*/
|
|
16
|
+
get(key: string): Promise<any>;
|
|
17
|
+
/**
|
|
18
|
+
* Put a value into cache.
|
|
19
|
+
*
|
|
20
|
+
* @param key Cache key.
|
|
21
|
+
* @param value Cache value.
|
|
22
|
+
* @param ttl Cache TTL in milliseconds.
|
|
23
|
+
*/
|
|
24
|
+
put(key: string, value: T, ttl: number): Promise<void>;
|
|
25
|
+
}
|
package/dist/cache.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Cache = void 0;
|
|
4
|
+
const logger_1 = require("@saltcute/logger");
|
|
5
|
+
const memory_cache_1 = require("memory-cache");
|
|
6
|
+
const redis_1 = require("redis");
|
|
7
|
+
class Cache {
|
|
8
|
+
namespace;
|
|
9
|
+
logger;
|
|
10
|
+
memCache;
|
|
11
|
+
redisClient;
|
|
12
|
+
isRedisAvailable = true;
|
|
13
|
+
constructor(namespace) {
|
|
14
|
+
this.namespace = namespace;
|
|
15
|
+
this.logger = logger_1.logger.child().withGroup(`${this.namespace}:cache`);
|
|
16
|
+
this.memCache = new memory_cache_1.Cache();
|
|
17
|
+
this.redisClient = (0, redis_1.createClient)();
|
|
18
|
+
this.redisClient.on("error", async () => {
|
|
19
|
+
this.logger.error("Redis connection error, using memory-cache");
|
|
20
|
+
this.isRedisAvailable = false;
|
|
21
|
+
this.redisClient.destroy();
|
|
22
|
+
});
|
|
23
|
+
this.redisClient.connect();
|
|
24
|
+
}
|
|
25
|
+
getKey(key) {
|
|
26
|
+
return `${this.namespace}:${key}`;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get a value from cache.
|
|
30
|
+
*
|
|
31
|
+
* @param key Cache key.
|
|
32
|
+
* @returns Cache value.
|
|
33
|
+
*/
|
|
34
|
+
async get(key) {
|
|
35
|
+
const memCacheValue = this.memCache.get(this.getKey(key));
|
|
36
|
+
if (!memCacheValue && this.isRedisAvailable) {
|
|
37
|
+
const redisValue = await this.redisClient.get(this.getKey(key));
|
|
38
|
+
if (redisValue) {
|
|
39
|
+
try {
|
|
40
|
+
const parsed = JSON.parse(redisValue);
|
|
41
|
+
this.memCache.put(key, parsed, 1000);
|
|
42
|
+
return parsed;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
await this.redisClient.del(key);
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else
|
|
51
|
+
return memCacheValue;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Put a value into cache.
|
|
55
|
+
*
|
|
56
|
+
* @param key Cache key.
|
|
57
|
+
* @param value Cache value.
|
|
58
|
+
* @param ttl Cache TTL in milliseconds.
|
|
59
|
+
*/
|
|
60
|
+
async put(key, value, ttl) {
|
|
61
|
+
if (this.isRedisAvailable) {
|
|
62
|
+
this.memCache.put(this.getKey(key), value, 1000);
|
|
63
|
+
await this.redisClient.set(this.getKey(key), JSON.stringify(value), {
|
|
64
|
+
expiration: {
|
|
65
|
+
type: "EX",
|
|
66
|
+
value: Math.trunc(ttl / 1000),
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else
|
|
71
|
+
this.memCache.put(this.getKey(key), value, ttl);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.Cache = Cache;
|
|
75
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":";;;AAAA,6CAA0C;AAC1C,+CAAiD;AACjD,iCAAqC;AAGrC,MAAa,KAAK;IAOM;IANZ,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,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAQ,EAAa,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAA,oBAAY,GAAE,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;YACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;IAC/B,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,aAAa,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,IAAI,UAAU,EAAE,CAAC;gBACb,IAAI,CAAC;oBACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;oBACrC,OAAO,MAAM,CAAC;gBAClB,CAAC;gBAAC,MAAM,CAAC;oBACL,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAChC,OAAO,IAAI,CAAC;gBAChB,CAAC;YACL,CAAC;QACL,CAAC;;YAAM,OAAO,aAAa,CAAC;IAChC,CAAC;IACD;;;;;;OAMG;IACI,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAQ,EAAE,GAAW;QAC/C,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAChB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EACrB;gBACI,UAAU,EAAE;oBACR,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;iBAChC;aACJ,CACJ,CAAC;QACN,CAAC;;YAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;CACJ;AAjED,sBAiEC"}
|
package/dist/type.d.ts
ADDED
package/dist/type.js
ADDED
package/dist/type.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@saltcute/cache",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Layered cache.",
|
|
5
|
+
"homepage": "https://github.com/saltcute/cache#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/saltcute/cache/issues"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/saltcute/cache.git"
|
|
12
|
+
},
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": "saltcute",
|
|
15
|
+
"type": "commonjs",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": "./dist/cache.js"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist/"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc && tsc-alias",
|
|
24
|
+
"clean": "rimraf dist/*",
|
|
25
|
+
"format": "biome format --write",
|
|
26
|
+
"lint": "biome lint --write",
|
|
27
|
+
"make": "npm run clean && npm run format && npm run lint && npm run build"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@biomejs/biome": "^2.5.0",
|
|
31
|
+
"@types/node": "^25.9.3",
|
|
32
|
+
"rimraf": "^6.1.3",
|
|
33
|
+
"tsc-alias": "^1.8.17",
|
|
34
|
+
"typescript": "^6.0.3"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@saltcute/logger": "^1.0.0",
|
|
38
|
+
"@types/memory-cache": "^0.2.6",
|
|
39
|
+
"memory-cache": "^0.2.0",
|
|
40
|
+
"redis": "^6.0.0"
|
|
41
|
+
}
|
|
42
|
+
}
|