@autofleet/matmon 2.0.8 → 2.1.1
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/lib/cache.d.ts +7 -0
- package/lib/cache.js +37 -1
- package/lib/redis/index.d.ts +1 -0
- package/lib/redis/index.js +12 -0
- package/package.json +1 -1
package/lib/cache.d.ts
CHANGED
|
@@ -6,3 +6,10 @@ export declare const getWithCacheSupport: ({ cacheKey, cacheGet, cacheSet, fetch
|
|
|
6
6
|
fetching: any;
|
|
7
7
|
skipCache: any;
|
|
8
8
|
}) => Promise<any>;
|
|
9
|
+
export declare const getMultipleWithCache: ({ getFromCache, setInCache, getter, multiGetter, idField, }: {
|
|
10
|
+
getFromCache: any;
|
|
11
|
+
setInCache: any;
|
|
12
|
+
getter?: any;
|
|
13
|
+
multiGetter?: any;
|
|
14
|
+
idField?: string;
|
|
15
|
+
}) => (queries: any[]) => Promise<any[]>;
|
package/lib/cache.js
CHANGED
|
@@ -22,7 +22,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
22
22
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
23
|
};
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.getWithCacheSupport = exports.getNewLRU = void 0;
|
|
25
|
+
exports.getMultipleWithCache = exports.getWithCacheSupport = exports.getNewLRU = void 0;
|
|
26
26
|
const lru_cache_1 = __importDefault(require("lru-cache"));
|
|
27
27
|
const locking = __importStar(require("./locking"));
|
|
28
28
|
const dotenv_1 = __importDefault(require("dotenv"));
|
|
@@ -77,3 +77,39 @@ exports.getWithCacheSupport = async ({ cacheKey, cacheGet, cacheSet, fetching, s
|
|
|
77
77
|
}
|
|
78
78
|
return valueToReturn;
|
|
79
79
|
};
|
|
80
|
+
const getIdField = (query, idField) => {
|
|
81
|
+
if (typeof query === 'string') {
|
|
82
|
+
return query;
|
|
83
|
+
}
|
|
84
|
+
return query[idField];
|
|
85
|
+
};
|
|
86
|
+
exports.getMultipleWithCache = ({ getFromCache, setInCache, getter = undefined, multiGetter = undefined, idField = 'id', }) => async (queries) => {
|
|
87
|
+
const queriesMap = new Map(queries.filter(Boolean).map(query => [getIdField(query, idField), query]));
|
|
88
|
+
const resultMap = new Map();
|
|
89
|
+
const valuesToPullFromCache = [...queriesMap.values()];
|
|
90
|
+
const valuesFromCache = await Promise.all(valuesToPullFromCache.map(query => getFromCache(query)));
|
|
91
|
+
valuesFromCache.filter(Boolean).map((value) => {
|
|
92
|
+
queriesMap.delete(getIdField(value, idField));
|
|
93
|
+
resultMap.set(getIdField(value, idField), value);
|
|
94
|
+
return value;
|
|
95
|
+
});
|
|
96
|
+
let valuesFromGetter = [];
|
|
97
|
+
if (queriesMap.size > 0) {
|
|
98
|
+
if (multiGetter) {
|
|
99
|
+
valuesFromGetter = await multiGetter([...queriesMap.values()]);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
valuesFromGetter = await Promise.all([...queriesMap.values()].map(id => getter(id)));
|
|
103
|
+
}
|
|
104
|
+
valuesFromGetter.forEach((value) => {
|
|
105
|
+
setInCache(value[idField], value);
|
|
106
|
+
resultMap.set(getIdField(value, idField), value);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return queries.map((query) => {
|
|
110
|
+
if (!query) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
return resultMap.get(getIdField(query, idField));
|
|
114
|
+
});
|
|
115
|
+
};
|
package/lib/redis/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ declare class RedisCache {
|
|
|
9
9
|
private useLock;
|
|
10
10
|
constructor(options: any);
|
|
11
11
|
get(key: any): Promise<any>;
|
|
12
|
+
getMultiple(keys: any): Promise<any>;
|
|
12
13
|
set(key: any, value: any): Promise<void>;
|
|
13
14
|
remove(key: any): Promise<void>;
|
|
14
15
|
removeMultiple(keys: any): Promise<void>;
|
package/lib/redis/index.js
CHANGED
|
@@ -58,6 +58,18 @@ class RedisCache {
|
|
|
58
58
|
}
|
|
59
59
|
return JSON.parse(value);
|
|
60
60
|
}
|
|
61
|
+
async getMultiple(keys) {
|
|
62
|
+
const keysWithPrefix = keys.map(key => KEY_PREFIX + key);
|
|
63
|
+
let values;
|
|
64
|
+
try {
|
|
65
|
+
// Try to get the value from redis.
|
|
66
|
+
values = await this.client.mgetAsync(keysWithPrefix);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
throw new errors_1.RedisCacheError('Failed to get a value', err);
|
|
70
|
+
}
|
|
71
|
+
return values.map(value => JSON.parse(value));
|
|
72
|
+
}
|
|
61
73
|
async set(key, value) {
|
|
62
74
|
const keyWithPrefix = KEY_PREFIX + key;
|
|
63
75
|
const ttl = parseInt(String(this.baseTTL * (Math.random() + 1)), 10);
|