cachette 1.1.16 → 1.1.19
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/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/CacheInstance.d.ts +8 -0
- package/dist/src/lib/CacheInstance.js +12 -0
- package/dist/src/lib/CacheInstance.js.map +1 -1
- package/dist/src/lib/LocalCache.d.ts +22 -1
- package/dist/src/lib/LocalCache.js +69 -6
- package/dist/src/lib/LocalCache.js.map +1 -1
- package/dist/src/lib/RedisCache.d.ts +27 -5
- package/dist/src/lib/RedisCache.js +52 -10
- package/dist/src/lib/RedisCache.js.map +1 -1
- package/dist/src/lib/WriteThroughCache.d.ts +6 -2
- package/dist/src/lib/WriteThroughCache.js +7 -7
- package/dist/src/lib/WriteThroughCache.js.map +1 -1
- package/package.json +8 -7
package/dist/src/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,sDAAoC;AACpC,mDAAiC;AACjC,mDAAiC;AACjC,0DAAwC"}
|
|
@@ -76,6 +76,14 @@ export declare abstract class CacheInstance extends EventEmitter {
|
|
|
76
76
|
* @param lock The lock object
|
|
77
77
|
*/
|
|
78
78
|
unlock(lock: any): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Determine whether *at least one non-expired lock* starts with the given pattern.
|
|
81
|
+
*/
|
|
82
|
+
hasLock(prefix: string): Promise<boolean>;
|
|
83
|
+
/**
|
|
84
|
+
* Terminate / exit / quit the instance
|
|
85
|
+
*/
|
|
86
|
+
quit(): Promise<void>;
|
|
79
87
|
/**
|
|
80
88
|
* Keep track of active fetches to prevent
|
|
81
89
|
* simultaneous requests to the same resource in parallel.
|
|
@@ -36,6 +36,18 @@ class CacheInstance extends EventEmitter {
|
|
|
36
36
|
unlock(lock) {
|
|
37
37
|
throw new Error('unsupported');
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Determine whether *at least one non-expired lock* starts with the given pattern.
|
|
41
|
+
*/
|
|
42
|
+
hasLock(prefix) {
|
|
43
|
+
throw new Error('unsupported');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Terminate / exit / quit the instance
|
|
47
|
+
*/
|
|
48
|
+
quit() {
|
|
49
|
+
return new Promise((resolve) => { resolve(); });
|
|
50
|
+
}
|
|
39
51
|
/**
|
|
40
52
|
* Get or fetch a value
|
|
41
53
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheInstance.js","sourceRoot":"","sources":["../../../src/lib/CacheInstance.ts"],"names":[],"mappings":";;;AAAA,uCAAuC;AAMvC,MAAsB,aAAc,SAAQ,YAAY;IAAxD;;
|
|
1
|
+
{"version":3,"file":"CacheInstance.js","sourceRoot":"","sources":["../../../src/lib/CacheInstance.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { CachableValue, CacheInstance } from './CacheInstance';
|
|
|
2
2
|
export declare class LocalCache extends CacheInstance {
|
|
3
3
|
static DEFAULT_MAX_ITEMS: number;
|
|
4
4
|
static DEFAULT_MAX_AGE: number;
|
|
5
|
+
static LOCK_ACQUIRE_TIMEOUT: number;
|
|
5
6
|
private cache;
|
|
6
7
|
/**
|
|
7
8
|
* @inheritdoc
|
|
@@ -18,7 +19,7 @@ export declare class LocalCache extends CacheInstance {
|
|
|
18
19
|
/**
|
|
19
20
|
* @inheritdoc
|
|
20
21
|
*/
|
|
21
|
-
getValue(key: string): Promise<
|
|
22
|
+
getValue(key: string): Promise<any>;
|
|
22
23
|
/**
|
|
23
24
|
* @inheritdoc
|
|
24
25
|
*/
|
|
@@ -35,4 +36,24 @@ export declare class LocalCache extends CacheInstance {
|
|
|
35
36
|
* @inheritdoc
|
|
36
37
|
*/
|
|
37
38
|
clearMemory(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* @inheritdoc
|
|
41
|
+
* Dumb locking is supported for local development work
|
|
42
|
+
*/
|
|
43
|
+
isLockingSupported(): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* @inheritdoc
|
|
46
|
+
*/
|
|
47
|
+
lock(resource: string, ttlMs: number): Promise<any>;
|
|
48
|
+
/**
|
|
49
|
+
* @inheritdoc
|
|
50
|
+
*/
|
|
51
|
+
unlock(lock: any): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* @inheritdoc
|
|
54
|
+
*
|
|
55
|
+
* Note that this specific implementation in `LocalCache` is not very efficient.
|
|
56
|
+
* Use RedisCache for a performant implementation.
|
|
57
|
+
*/
|
|
58
|
+
hasLock(prefix: string): Promise<boolean>;
|
|
38
59
|
}
|
|
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.LocalCache = void 0;
|
|
4
4
|
const LRU = require("lru-cache");
|
|
5
5
|
const CacheInstance_1 = require("./CacheInstance");
|
|
6
|
+
async function sleep(ms) {
|
|
7
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
8
|
+
}
|
|
6
9
|
class LocalCache extends CacheInstance_1.CacheInstance {
|
|
7
10
|
constructor() {
|
|
8
11
|
super(...arguments);
|
|
@@ -10,7 +13,7 @@ class LocalCache extends CacheInstance_1.CacheInstance {
|
|
|
10
13
|
// for options.
|
|
11
14
|
this.cache = new LRU({
|
|
12
15
|
max: Number.parseInt(process.env.CACHETTE_LC_MAX_ITEMS, 10) || LocalCache.DEFAULT_MAX_ITEMS,
|
|
13
|
-
|
|
16
|
+
ttl: Number.parseInt(process.env.CACHETTE_LC_MAX_AGE, 10) || LocalCache.DEFAULT_MAX_AGE,
|
|
14
17
|
stale: false,
|
|
15
18
|
});
|
|
16
19
|
}
|
|
@@ -24,7 +27,7 @@ class LocalCache extends CacheInstance_1.CacheInstance {
|
|
|
24
27
|
* @inheritdoc
|
|
25
28
|
*/
|
|
26
29
|
async itemCount() {
|
|
27
|
-
return this.cache.
|
|
30
|
+
return this.cache.size;
|
|
28
31
|
}
|
|
29
32
|
/**
|
|
30
33
|
* @inheritdoc
|
|
@@ -40,7 +43,7 @@ class LocalCache extends CacheInstance_1.CacheInstance {
|
|
|
40
43
|
this.cache.set(key, value);
|
|
41
44
|
}
|
|
42
45
|
else {
|
|
43
|
-
this.cache.set(key, value, ttl * 1000);
|
|
46
|
+
this.cache.set(key, value, { ttl: ttl * 1000 });
|
|
44
47
|
}
|
|
45
48
|
return true;
|
|
46
49
|
}
|
|
@@ -62,23 +65,83 @@ class LocalCache extends CacheInstance_1.CacheInstance {
|
|
|
62
65
|
* @inheritdoc
|
|
63
66
|
*/
|
|
64
67
|
async delValue(key) {
|
|
65
|
-
this.cache.
|
|
68
|
+
this.cache.delete(key);
|
|
66
69
|
}
|
|
67
70
|
/**
|
|
68
71
|
* @inheritdoc
|
|
69
72
|
*/
|
|
70
73
|
async clear() {
|
|
71
|
-
this.cache.
|
|
74
|
+
this.cache.clear();
|
|
72
75
|
}
|
|
73
76
|
/**
|
|
74
77
|
* @inheritdoc
|
|
75
78
|
*/
|
|
76
79
|
async clearMemory() {
|
|
77
|
-
this.cache.
|
|
80
|
+
this.cache.clear();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* @inheritdoc
|
|
84
|
+
* Dumb locking is supported for local development work
|
|
85
|
+
*/
|
|
86
|
+
isLockingSupported() {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* @inheritdoc
|
|
91
|
+
*/
|
|
92
|
+
async lock(resource, ttlMs) {
|
|
93
|
+
let isLocked = true;
|
|
94
|
+
const startTimestamp = Date.now();
|
|
95
|
+
while (isLocked) {
|
|
96
|
+
if (Date.now() - startTimestamp > LocalCache.LOCK_ACQUIRE_TIMEOUT) {
|
|
97
|
+
throw new Error(`Abandoning locking ${resource} , as timed out while waiting for other lock to be released.`);
|
|
98
|
+
}
|
|
99
|
+
this.cache.purgeStale();
|
|
100
|
+
if (!this.cache.has(resource)) {
|
|
101
|
+
isLocked = false;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// LRU keeps its TTL information private, so we don't know how long to wait.
|
|
105
|
+
// Whatever, we just loop on waiting a bit and retrying.
|
|
106
|
+
await sleep(10);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
this.cache.set(resource, 1, { ttl: ttlMs });
|
|
110
|
+
return new Promise(resolve => { resolve(resource); });
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* @inheritdoc
|
|
114
|
+
*/
|
|
115
|
+
async unlock(lock) {
|
|
116
|
+
this.cache.delete(lock);
|
|
117
|
+
return new Promise(resolve => { resolve(); });
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* @inheritdoc
|
|
121
|
+
*
|
|
122
|
+
* Note that this specific implementation in `LocalCache` is not very efficient.
|
|
123
|
+
* Use RedisCache for a performant implementation.
|
|
124
|
+
*/
|
|
125
|
+
async hasLock(prefix) {
|
|
126
|
+
const startsWithPattern = prefix.replace(/\*$/, '');
|
|
127
|
+
let found = false;
|
|
128
|
+
this.cache.purgeStale();
|
|
129
|
+
this.cache.forEach((value, key) => {
|
|
130
|
+
// Doing a full CPU-inefficient traversal because `lru-cache.LRU` doesn't
|
|
131
|
+
// provide a `some` function or a way to exit this `forEach`. An alternative
|
|
132
|
+
// would be to work on `keys()`, which then would be RAM-inefficient.
|
|
133
|
+
// Neither is a big deal, this cache is meant to be used for small local/dev
|
|
134
|
+
// If this needs fixing, TODO move away from LRU.lru-cache.
|
|
135
|
+
if (key.startsWith(startsWithPattern)) {
|
|
136
|
+
found = true;
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
return new Promise((resolve) => { resolve(found); });
|
|
78
140
|
}
|
|
79
141
|
}
|
|
80
142
|
exports.LocalCache = LocalCache;
|
|
81
143
|
LocalCache.DEFAULT_MAX_ITEMS = 5000;
|
|
82
144
|
// Default maximum age for the items, in MS.
|
|
83
145
|
LocalCache.DEFAULT_MAX_AGE = 30 * 60 * 1000;
|
|
146
|
+
LocalCache.LOCK_ACQUIRE_TIMEOUT = 2000;
|
|
84
147
|
//# sourceMappingURL=LocalCache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalCache.js","sourceRoot":"","sources":["../../../src/lib/LocalCache.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AAEjC,mDAA+D;
|
|
1
|
+
{"version":3,"file":"LocalCache.js","sourceRoot":"","sources":["../../../src/lib/LocalCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,11 +17,11 @@ export declare class RedisCache extends CacheInstance {
|
|
|
17
17
|
static FALSE_VALUE: string;
|
|
18
18
|
static JSON_PREFIX: string;
|
|
19
19
|
static ERROR_PREFIX: string;
|
|
20
|
-
static
|
|
21
|
-
static
|
|
22
|
-
static
|
|
23
|
-
static
|
|
24
|
-
static
|
|
20
|
+
static REDIS_CONNECTION_TIMEOUT_MS: number;
|
|
21
|
+
static REDLOCK_RETRY_COUNT: number;
|
|
22
|
+
static REDLOCK_RETRY_DELAY_MS: number;
|
|
23
|
+
static REDLOCK_CLOCK_DRIFT_FACTOR: number;
|
|
24
|
+
static REDLOCK_JITTER_MS: number;
|
|
25
25
|
private redisClient;
|
|
26
26
|
private ready;
|
|
27
27
|
private url;
|
|
@@ -41,6 +41,7 @@ export declare class RedisCache extends CacheInstance {
|
|
|
41
41
|
* with an UncaughtException.
|
|
42
42
|
*/
|
|
43
43
|
errorStrategy(): void;
|
|
44
|
+
redlockErrorStrategy(err: any): void;
|
|
44
45
|
/**
|
|
45
46
|
* The end event is emitted by the redis client when an
|
|
46
47
|
* established connection has ended.
|
|
@@ -116,4 +117,25 @@ export declare class RedisCache extends CacheInstance {
|
|
|
116
117
|
* @inheritdoc
|
|
117
118
|
*/
|
|
118
119
|
unlock(lock: Redlock.Lock): Promise<void>;
|
|
120
|
+
/**
|
|
121
|
+
* @inheritdoc
|
|
122
|
+
*
|
|
123
|
+
* Implementation note & usage ***warning***: looking at Redis docs and the www,
|
|
124
|
+
* there's no "index-backed" Redis function to do this in O(1).
|
|
125
|
+
*
|
|
126
|
+
* So, doing it with a Redis SCAN, https://redis.io/commands/scan . In many use cases it's okay,
|
|
127
|
+
* 1. Because Redis SCAN is fast (10M keys / 40ms on a laptop)
|
|
128
|
+
* 2. If your use case writes a reasonable number of locks, and sets reasonably-small TTLs,
|
|
129
|
+
* guaranteeing Redis contains a reasonable-to-scan volume of items (depending on your hardware).
|
|
130
|
+
*
|
|
131
|
+
* Recommendation: This implies **workloads relying on this function should
|
|
132
|
+
* own their own Redis db**, to not scan through tons of unrelated keys.
|
|
133
|
+
*
|
|
134
|
+
* Implementation note: you might try to use instead a redis Hashmap / Set / Sorted set to group
|
|
135
|
+
* "sublocks", to be able use H/S/Z Redis functions to query efficiently inside a group of locks.
|
|
136
|
+
* That won't work in use cases where you need one TTL per lock, because it'd limit to one TTL
|
|
137
|
+
* (associated to a Redis *value*!) per prefix. Thus, values with TTLs, thus, SCAN.
|
|
138
|
+
*/
|
|
139
|
+
hasLock(prefix: string): Promise<boolean>;
|
|
140
|
+
quit(): Promise<void>;
|
|
119
141
|
}
|
|
@@ -21,7 +21,7 @@ class RedisCache extends CacheInstance_1.CacheInstance {
|
|
|
21
21
|
this.url = redisUrl;
|
|
22
22
|
this.redisClient = new Redis(redisUrl, {
|
|
23
23
|
readOnly,
|
|
24
|
-
retryStrategy: () => RedisCache.
|
|
24
|
+
retryStrategy: () => RedisCache.REDIS_CONNECTION_TIMEOUT_MS,
|
|
25
25
|
// master failover
|
|
26
26
|
reconnectOnError: (err) => !readOnly && err.message.startsWith('READONLY'),
|
|
27
27
|
// This will prevent the get/setValue calls from hanging
|
|
@@ -29,14 +29,16 @@ class RedisCache extends CacheInstance_1.CacheInstance {
|
|
|
29
29
|
enableOfflineQueue: false,
|
|
30
30
|
});
|
|
31
31
|
this.redlock = new Redlock([this.redisClient], {
|
|
32
|
-
driftFactor: RedisCache.
|
|
33
|
-
retryCount: RedisCache.
|
|
34
|
-
retryDelay: RedisCache.
|
|
35
|
-
retryJitter: RedisCache.
|
|
32
|
+
driftFactor: RedisCache.REDLOCK_CLOCK_DRIFT_FACTOR,
|
|
33
|
+
retryCount: RedisCache.REDLOCK_RETRY_COUNT,
|
|
34
|
+
retryDelay: RedisCache.REDLOCK_RETRY_DELAY_MS,
|
|
35
|
+
retryJitter: RedisCache.REDLOCK_JITTER_MS,
|
|
36
36
|
});
|
|
37
37
|
this.redisClient.on('ready', this.startConnectionStrategy.bind(this));
|
|
38
38
|
this.redisClient.on('end', this.endConnectionStrategy.bind(this));
|
|
39
39
|
this.redisClient.on('error', this.errorStrategy.bind(this));
|
|
40
|
+
// TODO when migrating to Redlock v5: rename 'clientError' to 'error'
|
|
41
|
+
this.redlock.on('clientError', this.redlockErrorStrategy.bind(this));
|
|
40
42
|
}
|
|
41
43
|
/**
|
|
42
44
|
* @inheritdoc
|
|
@@ -61,6 +63,9 @@ class RedisCache extends CacheInstance_1.CacheInstance {
|
|
|
61
63
|
errorStrategy() {
|
|
62
64
|
this.emit('warn', 'Error while connected to the Redis cache!');
|
|
63
65
|
}
|
|
66
|
+
redlockErrorStrategy(err) {
|
|
67
|
+
this.emit('warn', 'Redlock error:', err);
|
|
68
|
+
}
|
|
64
69
|
/**
|
|
65
70
|
* The end event is emitted by the redis client when an
|
|
66
71
|
* established connection has ended.
|
|
@@ -255,6 +260,43 @@ class RedisCache extends CacheInstance_1.CacheInstance {
|
|
|
255
260
|
async unlock(lock) {
|
|
256
261
|
return this.redlock.unlock(lock);
|
|
257
262
|
}
|
|
263
|
+
/**
|
|
264
|
+
* @inheritdoc
|
|
265
|
+
*
|
|
266
|
+
* Implementation note & usage ***warning***: looking at Redis docs and the www,
|
|
267
|
+
* there's no "index-backed" Redis function to do this in O(1).
|
|
268
|
+
*
|
|
269
|
+
* So, doing it with a Redis SCAN, https://redis.io/commands/scan . In many use cases it's okay,
|
|
270
|
+
* 1. Because Redis SCAN is fast (10M keys / 40ms on a laptop)
|
|
271
|
+
* 2. If your use case writes a reasonable number of locks, and sets reasonably-small TTLs,
|
|
272
|
+
* guaranteeing Redis contains a reasonable-to-scan volume of items (depending on your hardware).
|
|
273
|
+
*
|
|
274
|
+
* Recommendation: This implies **workloads relying on this function should
|
|
275
|
+
* own their own Redis db**, to not scan through tons of unrelated keys.
|
|
276
|
+
*
|
|
277
|
+
* Implementation note: you might try to use instead a redis Hashmap / Set / Sorted set to group
|
|
278
|
+
* "sublocks", to be able use H/S/Z Redis functions to query efficiently inside a group of locks.
|
|
279
|
+
* That won't work in use cases where you need one TTL per lock, because it'd limit to one TTL
|
|
280
|
+
* (associated to a Redis *value*!) per prefix. Thus, values with TTLs, thus, SCAN.
|
|
281
|
+
*/
|
|
282
|
+
async hasLock(prefix) {
|
|
283
|
+
const redisPrefix = prefix.endsWith('*') ? prefix : `${prefix}*`;
|
|
284
|
+
let cursor = '';
|
|
285
|
+
while (cursor !== '0') { // indicates Redis completed the scan
|
|
286
|
+
// Redis detail: we set the `count` option to a number (1000) greater than
|
|
287
|
+
// the default (10), to minimize the amount of network round-trips caused
|
|
288
|
+
// by incomplete scans needing more scanning from the returned cursor.
|
|
289
|
+
const [nextCursor, matchingKeys] = await this.redisClient.scan(cursor || '0', 'match', redisPrefix, 'count', 1000);
|
|
290
|
+
if (matchingKeys.length > 0) {
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
cursor = nextCursor;
|
|
294
|
+
}
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
async quit() {
|
|
298
|
+
await this.redisClient.quit();
|
|
299
|
+
}
|
|
258
300
|
}
|
|
259
301
|
exports.RedisCache = RedisCache;
|
|
260
302
|
/**
|
|
@@ -266,9 +308,9 @@ RedisCache.TRUE_VALUE = 'f405eed4-507c-4aa5-a6d2-c1813d584b8f-TRUE';
|
|
|
266
308
|
RedisCache.FALSE_VALUE = 'f405eed4-507c-4aa5-a6d2-c1813d584b8f-FALSE';
|
|
267
309
|
RedisCache.JSON_PREFIX = 'f405eed4-507c-4aa5-a6d2-c1813d584b8f-JSON';
|
|
268
310
|
RedisCache.ERROR_PREFIX = 'f405eed4-507c-4aa5-a6d2-c1813d584b8f-ERROR';
|
|
269
|
-
RedisCache.
|
|
270
|
-
RedisCache.
|
|
271
|
-
RedisCache.
|
|
272
|
-
RedisCache.
|
|
273
|
-
RedisCache.
|
|
311
|
+
RedisCache.REDIS_CONNECTION_TIMEOUT_MS = parseInt(process.env.REDIS_CONNECTION_TIMEOUT_MS, 10) || 5000;
|
|
312
|
+
RedisCache.REDLOCK_RETRY_COUNT = parseInt(process.env.REDLOCK_RETRY_COUNT, 10) || 20; // lib. default: 10
|
|
313
|
+
RedisCache.REDLOCK_RETRY_DELAY_MS = parseInt(process.env.REDLOCK_RETRY_DELAY_MS, 10) || 200; // lib. default: 200
|
|
314
|
+
RedisCache.REDLOCK_CLOCK_DRIFT_FACTOR = parseInt(process.env.REDLOCK_CLOCK_DRIFT_FACTOR, 10) || 0.01; // lib. default: 0.01
|
|
315
|
+
RedisCache.REDLOCK_JITTER_MS = parseInt(process.env.REDLOCK_JITTER_MS, 10) || 200; // lib. default: 200
|
|
274
316
|
//# sourceMappingURL=RedisCache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisCache.js","sourceRoot":"","sources":["../../../src/lib/RedisCache.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AACjC,mCAAmC;AAEnC,mDAA+D;AAG/D;;;;;;GAMG;AACH,MAAa,UAAW,SAAQ,6BAAa;IAuB3C,YAAY,QAAgB,EAAE,QAAQ,GAAG,KAAK;QAC5C,KAAK,EAAE,CAAC;QALF,UAAK,GAAG,KAAK,CAAC;QAOpB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE;YACxF,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,GAAG,CAAC,CAAC;SACnD;QAED,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE;YACrC,QAAQ;YACR,aAAa,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"RedisCache.js","sourceRoot":"","sources":["../../../src/lib/RedisCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,7 +40,11 @@ export declare class WriteThroughCache extends CacheInstance {
|
|
|
40
40
|
* @inheritdoc
|
|
41
41
|
*/
|
|
42
42
|
clearMemory(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* @inheritdoc
|
|
45
|
+
* Locking is *not* supported by the Write-Through cache. You want either:
|
|
46
|
+
* - The full-fledged RedisCache for prod workloads
|
|
47
|
+
* - A dumb LocalCache for dev/local workloads
|
|
48
|
+
*/
|
|
43
49
|
isLockingSupported(): boolean;
|
|
44
|
-
lock(resource: string, ttlMs: number): Promise<any>;
|
|
45
|
-
unlock(lock: any): Promise<void>;
|
|
46
50
|
}
|
|
@@ -84,14 +84,14 @@ class WriteThroughCache extends CacheInstance_1.CacheInstance {
|
|
|
84
84
|
await this.localCache.clearMemory();
|
|
85
85
|
await this.redisCacheForWriting.clearMemory();
|
|
86
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* @inheritdoc
|
|
89
|
+
* Locking is *not* supported by the Write-Through cache. You want either:
|
|
90
|
+
* - The full-fledged RedisCache for prod workloads
|
|
91
|
+
* - A dumb LocalCache for dev/local workloads
|
|
92
|
+
*/
|
|
87
93
|
isLockingSupported() {
|
|
88
|
-
return
|
|
89
|
-
}
|
|
90
|
-
lock(resource, ttlMs) {
|
|
91
|
-
return this.redisCacheForWriting.lock(resource, ttlMs);
|
|
92
|
-
}
|
|
93
|
-
unlock(lock) {
|
|
94
|
-
return this.redisCacheForWriting.unlock(lock);
|
|
94
|
+
return false;
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
exports.WriteThroughCache = WriteThroughCache;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WriteThroughCache.js","sourceRoot":"","sources":["../../../src/lib/WriteThroughCache.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"WriteThroughCache.js","sourceRoot":"","sources":["../../../src/lib/WriteThroughCache.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cachette",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.19",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=14.0.0",
|
|
6
6
|
"npm": ">=6.10.2"
|
|
@@ -58,16 +58,17 @@
|
|
|
58
58
|
"@types/bluebird": "3.x",
|
|
59
59
|
"@types/chai": "4.x",
|
|
60
60
|
"@types/ioredis": "4.x",
|
|
61
|
-
"@types/
|
|
61
|
+
"@types/lru-cache": "7.x",
|
|
62
|
+
"@types/mocha": "9.x",
|
|
62
63
|
"@types/node": "14.x",
|
|
63
64
|
"@types/sinon": "9.x",
|
|
64
|
-
"@typescript-eslint/eslint-plugin": "
|
|
65
|
-
"@typescript-eslint/parser": "
|
|
65
|
+
"@typescript-eslint/eslint-plugin": "5.x",
|
|
66
|
+
"@typescript-eslint/parser": "5.x",
|
|
66
67
|
"bluebird": "3.x",
|
|
67
68
|
"chai": "4.x",
|
|
68
|
-
"eslint": "
|
|
69
|
+
"eslint": "8.x",
|
|
69
70
|
"mocha": "9.x",
|
|
70
|
-
"npm-audit-resolver": "
|
|
71
|
+
"npm-audit-resolver": "^3.0.0-7",
|
|
71
72
|
"nyc": "15.x",
|
|
72
73
|
"pre-commit": "1.x",
|
|
73
74
|
"sinon": "9.x",
|
|
@@ -77,7 +78,7 @@
|
|
|
77
78
|
"dependencies": {
|
|
78
79
|
"@types/redlock": "4.x",
|
|
79
80
|
"ioredis": "4.x",
|
|
80
|
-
"lru-cache": "
|
|
81
|
+
"lru-cache": "7.x",
|
|
81
82
|
"redlock": "4.x"
|
|
82
83
|
}
|
|
83
84
|
}
|