express-memorize 2.3.1 → 2.5.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/CHANGELOG.md +9 -3
- package/README.md +89 -6
- package/dist/MemorizeStore.d.ts +55 -4
- package/dist/MemorizeStore.d.ts.map +1 -1
- package/dist/MemorizeStore.js +244 -31
- package/dist/MemorizeStore.js.map +1 -1
- package/dist/asyncSerializer.d.ts +25 -0
- package/dist/asyncSerializer.d.ts.map +1 -0
- package/dist/asyncSerializer.js +194 -0
- package/dist/asyncSerializer.js.map +1 -0
- package/dist/domain/Memorize.d.ts +71 -0
- package/dist/domain/Memorize.d.ts.map +1 -1
- package/dist/domain/MemorizeBatchOptions.d.ts +13 -0
- package/dist/domain/MemorizeBatchOptions.d.ts.map +1 -0
- package/dist/domain/MemorizeBatchOptions.js +3 -0
- package/dist/domain/MemorizeBatchOptions.js.map +1 -0
- package/dist/domain/MemorizeOptions.d.ts +56 -0
- package/dist/domain/MemorizeOptions.d.ts.map +1 -1
- package/dist/domain/MemorizeStats.d.ts +4 -0
- package/dist/domain/MemorizeStats.d.ts.map +1 -1
- package/dist/domain/index.d.ts +1 -0
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/memorize.d.ts.map +1 -1
- package/dist/memorize.js +153 -9
- package/dist/memorize.js.map +1 -1
- package/package.json +2 -1
|
@@ -8,6 +8,7 @@ import { MemorizeExpireEvent } from './MemorizeExpireEvent';
|
|
|
8
8
|
import { MemorizeEmptyEvent } from './MemorizeEmptyEvent';
|
|
9
9
|
import { MemorizeEvictEvent } from './MemorizeEvictEvent';
|
|
10
10
|
import { MemorizeStats } from './MemorizeStats';
|
|
11
|
+
import { MemorizeBatchOptions } from './MemorizeBatchOptions';
|
|
11
12
|
import { MemorizeStore } from '../MemorizeStore';
|
|
12
13
|
/**
|
|
13
14
|
* The cache instance returned by {@link memorize}.
|
|
@@ -78,6 +79,16 @@ export interface Memorize {
|
|
|
78
79
|
* ```
|
|
79
80
|
*/
|
|
80
81
|
set<T>(key: string, value: T, ttl?: number): void;
|
|
82
|
+
/**
|
|
83
|
+
* Async variant of {@link set}. It yields back to the event loop before
|
|
84
|
+
* serializing and storing the value, which helps when many direct-cache writes
|
|
85
|
+
* are processed with `await` in a loop.
|
|
86
|
+
*
|
|
87
|
+
* @param key - Cache key.
|
|
88
|
+
* @param value - Value to cache.
|
|
89
|
+
* @param ttl - Time-to-live in milliseconds. Defaults to the global TTL.
|
|
90
|
+
*/
|
|
91
|
+
setAsync<T>(key: string, value: T, ttl?: number): Promise<void>;
|
|
81
92
|
/**
|
|
82
93
|
* Returns the cached value for the given key, or `undefined` if the key does
|
|
83
94
|
* not exist or has expired.
|
|
@@ -93,6 +104,13 @@ export interface Memorize {
|
|
|
93
104
|
* ```
|
|
94
105
|
*/
|
|
95
106
|
getValue<T>(key: string): T | undefined;
|
|
107
|
+
/**
|
|
108
|
+
* Async variant of {@link getValue}. It yields back to the event loop before
|
|
109
|
+
* deserializing the cached value.
|
|
110
|
+
*
|
|
111
|
+
* @param key - Cache key.
|
|
112
|
+
*/
|
|
113
|
+
getValueAsync<T>(key: string): Promise<T | undefined>;
|
|
96
114
|
/**
|
|
97
115
|
* Returns the cached value for the given key if it exists, otherwise calls
|
|
98
116
|
* `factory`, caches the result, and returns it.
|
|
@@ -108,6 +126,16 @@ export interface Memorize {
|
|
|
108
126
|
* ```
|
|
109
127
|
*/
|
|
110
128
|
remember<T>(key: string, factory: () => T | Promise<T>, ttl?: number): Promise<T>;
|
|
129
|
+
/**
|
|
130
|
+
* Async variant of {@link remember}. It uses {@link getValueAsync} and
|
|
131
|
+
* {@link setAsync} for cooperative yielding around direct-cache
|
|
132
|
+
* serialization/deserialization.
|
|
133
|
+
*
|
|
134
|
+
* @param key - Cache key.
|
|
135
|
+
* @param factory - Async or sync function that produces the value on a cache miss.
|
|
136
|
+
* @param ttl - Time-to-live in milliseconds. Defaults to the global TTL.
|
|
137
|
+
*/
|
|
138
|
+
rememberAsync<T>(key: string, factory: () => T | Promise<T>, ttl?: number): Promise<T>;
|
|
111
139
|
/**
|
|
112
140
|
* Returns the {@link CacheInfo} for a specific cache key, or `null` if the key
|
|
113
141
|
* does not exist or has expired.
|
|
@@ -130,6 +158,20 @@ export interface Memorize {
|
|
|
130
158
|
* ```
|
|
131
159
|
*/
|
|
132
160
|
getAll(): Record<string, CacheInfo>;
|
|
161
|
+
/**
|
|
162
|
+
* Async variant of {@link getAll}. It scans entries in batches and yields
|
|
163
|
+
* back to the event loop between batches, which reduces long synchronous
|
|
164
|
+
* pauses on large stores.
|
|
165
|
+
*
|
|
166
|
+
* @param options - Batch options.
|
|
167
|
+
* @returns All active cache entries keyed by cache key.
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* ```ts
|
|
171
|
+
* const entries = await cache.getAllAsync({ batchSize: 500 });
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
getAllAsync(options?: MemorizeBatchOptions): Promise<Record<string, CacheInfo>>;
|
|
133
175
|
/**
|
|
134
176
|
* Removes a single entry from the cache and emits a {@link MemorizeEventType.Delete} event.
|
|
135
177
|
*
|
|
@@ -171,6 +213,21 @@ export interface Memorize {
|
|
|
171
213
|
* ```
|
|
172
214
|
*/
|
|
173
215
|
deleteMatching(pattern: string): number;
|
|
216
|
+
/**
|
|
217
|
+
* Async variant of {@link deleteMatching}. It removes matching entries in
|
|
218
|
+
* batches and yields back to the event loop between batches, which reduces
|
|
219
|
+
* long synchronous pauses on large stores.
|
|
220
|
+
*
|
|
221
|
+
* @param pattern - Glob pattern to match against cache keys.
|
|
222
|
+
* @param options - Batch options.
|
|
223
|
+
* @returns The number of entries removed.
|
|
224
|
+
*
|
|
225
|
+
* @example
|
|
226
|
+
* ```ts
|
|
227
|
+
* await cache.deleteMatchingAsync('/api/users/*', { batchSize: 500 });
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
deleteMatchingAsync(pattern: string, options?: MemorizeBatchOptions): Promise<number>;
|
|
174
231
|
/**
|
|
175
232
|
* Removes **all** entries from the cache and emits a {@link MemorizeEventType.Delete}
|
|
176
233
|
* event for each.
|
|
@@ -181,6 +238,20 @@ export interface Memorize {
|
|
|
181
238
|
* ```
|
|
182
239
|
*/
|
|
183
240
|
clear(): void;
|
|
241
|
+
/**
|
|
242
|
+
* Async variant of {@link clear}. It removes entries in batches and yields
|
|
243
|
+
* back to the event loop between batches, which reduces long synchronous
|
|
244
|
+
* pauses on large stores.
|
|
245
|
+
*
|
|
246
|
+
* @param options - Batch options.
|
|
247
|
+
* @returns The number of entries removed.
|
|
248
|
+
*
|
|
249
|
+
* @example
|
|
250
|
+
* ```ts
|
|
251
|
+
* await cache.clearAsync({ batchSize: 500 });
|
|
252
|
+
* ```
|
|
253
|
+
*/
|
|
254
|
+
clearAsync(options?: MemorizeBatchOptions): Promise<number>;
|
|
184
255
|
/**
|
|
185
256
|
* Registers a listener for cache events.
|
|
186
257
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Memorize.d.ts","sourceRoot":"","sources":["../../src/domain/Memorize.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Memorize.d.ts","sourceRoot":"","sources":["../../src/domain/Memorize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for cache operations that can yield between batches to reduce
|
|
3
|
+
* event-loop blocking on large stores.
|
|
4
|
+
*/
|
|
5
|
+
export interface MemorizeBatchOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Number of entries to process before yielding back to the event loop.
|
|
8
|
+
*
|
|
9
|
+
* @defaultValue 1000
|
|
10
|
+
*/
|
|
11
|
+
batchSize?: number;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=MemorizeBatchOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemorizeBatchOptions.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeBatchOptions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemorizeBatchOptions.js","sourceRoot":"","sources":["../../src/domain/MemorizeBatchOptions.ts"],"names":[],"mappings":""}
|
|
@@ -26,6 +26,62 @@ export interface MemorizeOptions {
|
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
28
|
maxEntries?: number;
|
|
29
|
+
/**
|
|
30
|
+
* Maximum serialized byte size allowed for a single entry.
|
|
31
|
+
*
|
|
32
|
+
* Entries larger than this limit are skipped by default. Set
|
|
33
|
+
* {@link MemorizeOptions.sizeLimitAction} to `'throw'` to fail instead.
|
|
34
|
+
*/
|
|
35
|
+
maxValueBytes?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Maximum approximate byte size allowed for the whole cache.
|
|
38
|
+
*
|
|
39
|
+
* When the limit is reached, least-recently-used entries are evicted until
|
|
40
|
+
* the new entry fits. Entries larger than this limit are skipped by default.
|
|
41
|
+
*/
|
|
42
|
+
maxTotalBytes?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Behavior when a single entry exceeds `maxValueBytes` or `maxTotalBytes`.
|
|
45
|
+
*
|
|
46
|
+
* - `'skip'` — do not store the oversized entry.
|
|
47
|
+
* - `'throw'` — throw a `RangeError`.
|
|
48
|
+
*
|
|
49
|
+
* @defaultValue 'skip'
|
|
50
|
+
*/
|
|
51
|
+
sizeLimitAction?: 'skip' | 'throw';
|
|
52
|
+
/**
|
|
53
|
+
* Async serializer backend used by `setAsync`, `getValueAsync`, and
|
|
54
|
+
* `rememberAsync`.
|
|
55
|
+
*
|
|
56
|
+
* - `'yield'` — yield to the event loop, then serialize on the main thread.
|
|
57
|
+
* - `'worker'` — offload built-in serializer work to `worker_threads`.
|
|
58
|
+
*
|
|
59
|
+
* Custom serializer objects always fall back to `'yield'` because functions
|
|
60
|
+
* cannot be transferred to a worker.
|
|
61
|
+
*
|
|
62
|
+
* @defaultValue 'yield'
|
|
63
|
+
*/
|
|
64
|
+
asyncSerializer?: 'yield' | 'worker';
|
|
65
|
+
/**
|
|
66
|
+
* Maximum number of lazy worker threads used by `asyncSerializer: 'worker'`.
|
|
67
|
+
*
|
|
68
|
+
* - `'auto'` — choose a conservative count from available CPU parallelism.
|
|
69
|
+
* - `number` — requested worker count, clamped to available parallelism and
|
|
70
|
+
* an internal safety cap.
|
|
71
|
+
*
|
|
72
|
+
* @defaultValue 'auto'
|
|
73
|
+
*/
|
|
74
|
+
asyncSerializerWorkers?: 'auto' | number;
|
|
75
|
+
/**
|
|
76
|
+
* Minimum estimated serialized byte size required before `setAsync` /
|
|
77
|
+
* `getValueAsync` offloads work to a worker.
|
|
78
|
+
*
|
|
79
|
+
* Smaller values use cooperative yielding on the main thread to avoid worker
|
|
80
|
+
* overhead. Only applies when `asyncSerializer: 'worker'`.
|
|
81
|
+
*
|
|
82
|
+
* @defaultValue 65536
|
|
83
|
+
*/
|
|
84
|
+
asyncSerializerThresholdBytes?: number;
|
|
29
85
|
/**
|
|
30
86
|
* Serializer used by {@link Memorize.set} and {@link Memorize.getValue}.
|
|
31
87
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemorizeOptions.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;;;;;;;;OAcG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B"}
|
|
1
|
+
{"version":3,"file":"MemorizeOptions.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAEnC;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAErC;;;;;;;;OAQG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEzC;;;;;;;;OAQG;IACH,6BAA6B,CAAC,EAAE,MAAM,CAAC;IAEvC;;;;;;;;;;;;;;OAcG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B"}
|
|
@@ -6,6 +6,10 @@ export interface MemorizeStats {
|
|
|
6
6
|
entries: number;
|
|
7
7
|
/** Configured maximum number of entries, or `null` if unlimited. */
|
|
8
8
|
maxEntries: number | null;
|
|
9
|
+
/** Configured maximum byte size for a single entry, or `null` if unlimited. */
|
|
10
|
+
maxValueBytes: number | null;
|
|
11
|
+
/** Configured maximum byte size for the whole cache, or `null` if unlimited. */
|
|
12
|
+
maxTotalBytes: number | null;
|
|
9
13
|
/** Approximate total byte size of all cached bodies. */
|
|
10
14
|
byteSize: number;
|
|
11
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemorizeStats.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeStats.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
1
|
+
{"version":3,"file":"MemorizeStats.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeStats.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+EAA+E;IAC/E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gFAAgF;IAChF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
package/dist/domain/index.d.ts
CHANGED
|
@@ -10,5 +10,6 @@ export type { MemorizeEvictEvent } from './MemorizeEvictEvent';
|
|
|
10
10
|
export type { MemorizeStats } from './MemorizeStats';
|
|
11
11
|
export type { MemorizeOptions } from './MemorizeOptions';
|
|
12
12
|
export type { MemorizeCallOptions } from './MemorizeCallOptions';
|
|
13
|
+
export type { MemorizeBatchOptions } from './MemorizeBatchOptions';
|
|
13
14
|
export type { Memorize } from './Memorize';
|
|
14
15
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/memorize.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memorize.d.ts","sourceRoot":"","sources":["../src/memorize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"memorize.d.ts","sourceRoot":"","sources":["../src/memorize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAInE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEjE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC;AAoC/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAkKhE"}
|
package/dist/memorize.js
CHANGED
|
@@ -4,6 +4,44 @@ exports.memorize = memorize;
|
|
|
4
4
|
const MemorizeStore_1 = require("./MemorizeStore");
|
|
5
5
|
const express_1 = require("./adapters/express");
|
|
6
6
|
const serializer_1 = require("./serializer");
|
|
7
|
+
const asyncSerializer_1 = require("./asyncSerializer");
|
|
8
|
+
function serializedByteSize(body) {
|
|
9
|
+
return Buffer.isBuffer(body) ? body.byteLength : Buffer.byteLength(body);
|
|
10
|
+
}
|
|
11
|
+
function estimateAsyncInputSize(value) {
|
|
12
|
+
var _a;
|
|
13
|
+
if (typeof value === 'string')
|
|
14
|
+
return Buffer.byteLength(value);
|
|
15
|
+
if (Buffer.isBuffer(value))
|
|
16
|
+
return value.byteLength;
|
|
17
|
+
if (value instanceof ArrayBuffer)
|
|
18
|
+
return value.byteLength;
|
|
19
|
+
if (ArrayBuffer.isView(value))
|
|
20
|
+
return value.byteLength;
|
|
21
|
+
try {
|
|
22
|
+
return Buffer.byteLength((_a = JSON.stringify(value)) !== null && _a !== void 0 ? _a : '');
|
|
23
|
+
}
|
|
24
|
+
catch (_b) {
|
|
25
|
+
return Number.POSITIVE_INFINITY;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function normalizeAsyncSerializerThreshold(value) {
|
|
29
|
+
if (value === undefined)
|
|
30
|
+
return 64000;
|
|
31
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
32
|
+
throw new RangeError('asyncSerializerThresholdBytes must be greater than or equal to 0');
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function yieldToEventLoop() {
|
|
37
|
+
return new Promise((resolve) => setImmediate(resolve));
|
|
38
|
+
}
|
|
39
|
+
function nextVersion(versions, key) {
|
|
40
|
+
var _a;
|
|
41
|
+
const version = ((_a = versions.get(key)) !== null && _a !== void 0 ? _a : 0) + 1;
|
|
42
|
+
versions.set(key, version);
|
|
43
|
+
return version;
|
|
44
|
+
}
|
|
7
45
|
/**
|
|
8
46
|
* Creates an in-memory cache instance.
|
|
9
47
|
*
|
|
@@ -55,18 +93,46 @@ const serializer_1 = require("./serializer");
|
|
|
55
93
|
* ```
|
|
56
94
|
*/
|
|
57
95
|
function memorize(options = {}) {
|
|
58
|
-
const { ttl, maxEntries, serializer: serializerOption } = options;
|
|
59
|
-
const store = new MemorizeStore_1.MemorizeStore(maxEntries);
|
|
96
|
+
const { ttl, maxEntries, maxValueBytes, maxTotalBytes, sizeLimitAction, asyncSerializer: asyncSerializerMode = 'yield', asyncSerializerWorkers, asyncSerializerThresholdBytes, serializer: serializerOption, } = options;
|
|
97
|
+
const store = new MemorizeStore_1.MemorizeStore({ maxEntries, maxValueBytes, maxTotalBytes, sizeLimitAction });
|
|
60
98
|
const serializer = (0, serializer_1.createSerializer)(serializerOption);
|
|
99
|
+
const workerSerializer = asyncSerializerMode === 'worker'
|
|
100
|
+
? (0, asyncSerializer_1.createWorkerAsyncSerializer)(serializerOption, asyncSerializerWorkers)
|
|
101
|
+
: null;
|
|
102
|
+
const workerThresholdBytes = normalizeAsyncSerializerThreshold(asyncSerializerThresholdBytes);
|
|
61
103
|
const expressMiddleware = (0, express_1.createExpressMiddleware)(store, ttl);
|
|
104
|
+
const keyVersions = new Map();
|
|
105
|
+
const inFlightRemember = new Map();
|
|
106
|
+
let mutationEpoch = 0;
|
|
62
107
|
const cache = function (callOptions) {
|
|
63
108
|
return expressMiddleware(callOptions);
|
|
64
109
|
};
|
|
65
110
|
cache.express = (callOptions) => expressMiddleware(callOptions);
|
|
66
111
|
cache.set = (key, value, entryTtl) => {
|
|
112
|
+
nextVersion(keyVersions, key);
|
|
67
113
|
const body = serializer.serialize(value);
|
|
68
114
|
const contentType = Buffer.isBuffer(body) ? 'application/octet-stream' : 'application/json';
|
|
69
|
-
store.set(key, { body, statusCode: 200, contentType }, entryTtl !== null && entryTtl !== void 0 ? entryTtl : ttl);
|
|
115
|
+
store.set(key, { body, statusCode: 200, contentType, size: serializedByteSize(body) }, entryTtl !== null && entryTtl !== void 0 ? entryTtl : ttl);
|
|
116
|
+
};
|
|
117
|
+
cache.setAsync = async (key, value, entryTtl) => {
|
|
118
|
+
const version = nextVersion(keyVersions, key);
|
|
119
|
+
const epoch = mutationEpoch;
|
|
120
|
+
await yieldToEventLoop();
|
|
121
|
+
if (!workerSerializer || estimateAsyncInputSize(value) < workerThresholdBytes) {
|
|
122
|
+
if (keyVersions.get(key) !== version || mutationEpoch !== epoch)
|
|
123
|
+
return;
|
|
124
|
+
const body = serializer.serialize(value);
|
|
125
|
+
if (keyVersions.get(key) !== version || mutationEpoch !== epoch)
|
|
126
|
+
return;
|
|
127
|
+
const contentType = Buffer.isBuffer(body) ? 'application/octet-stream' : 'application/json';
|
|
128
|
+
store.set(key, { body, statusCode: 200, contentType, size: serializedByteSize(body) }, entryTtl !== null && entryTtl !== void 0 ? entryTtl : ttl);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const body = await workerSerializer.serialize(value);
|
|
132
|
+
if (keyVersions.get(key) !== version || mutationEpoch !== epoch)
|
|
133
|
+
return;
|
|
134
|
+
const contentType = Buffer.isBuffer(body) ? 'application/octet-stream' : 'application/json';
|
|
135
|
+
store.set(key, { body, statusCode: 200, contentType, size: serializedByteSize(body) }, entryTtl !== null && entryTtl !== void 0 ? entryTtl : ttl);
|
|
70
136
|
};
|
|
71
137
|
cache.getValue = (key) => {
|
|
72
138
|
const entry = store.getRaw(key);
|
|
@@ -79,19 +145,97 @@ function memorize(options = {}) {
|
|
|
79
145
|
return undefined;
|
|
80
146
|
}
|
|
81
147
|
};
|
|
148
|
+
cache.getValueAsync = async (key) => {
|
|
149
|
+
await yieldToEventLoop();
|
|
150
|
+
if (!workerSerializer)
|
|
151
|
+
return cache.getValue(key);
|
|
152
|
+
const entry = store.getRaw(key);
|
|
153
|
+
if (!entry)
|
|
154
|
+
return undefined;
|
|
155
|
+
if (entry.size < workerThresholdBytes) {
|
|
156
|
+
try {
|
|
157
|
+
return serializer.deserialize(entry.body);
|
|
158
|
+
}
|
|
159
|
+
catch (_a) {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
return await workerSerializer.deserialize(entry.body);
|
|
165
|
+
}
|
|
166
|
+
catch (_b) {
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
};
|
|
82
170
|
cache.remember = async (key, factory, rememberTtl) => {
|
|
83
171
|
const existing = cache.getValue(key);
|
|
84
172
|
if (existing !== undefined)
|
|
85
173
|
return existing;
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
174
|
+
const inFlight = inFlightRemember.get(key);
|
|
175
|
+
if (inFlight)
|
|
176
|
+
return inFlight;
|
|
177
|
+
const promise = (async () => {
|
|
178
|
+
const value = await factory();
|
|
179
|
+
cache.set(key, value, rememberTtl);
|
|
180
|
+
return value;
|
|
181
|
+
})();
|
|
182
|
+
inFlightRemember.set(key, promise);
|
|
183
|
+
try {
|
|
184
|
+
return await promise;
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
if (inFlightRemember.get(key) === promise) {
|
|
188
|
+
inFlightRemember.delete(key);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
cache.rememberAsync = async (key, factory, rememberTtl) => {
|
|
193
|
+
const existing = await cache.getValueAsync(key);
|
|
194
|
+
if (existing !== undefined)
|
|
195
|
+
return existing;
|
|
196
|
+
const inFlight = inFlightRemember.get(key);
|
|
197
|
+
if (inFlight)
|
|
198
|
+
return inFlight;
|
|
199
|
+
const promise = (async () => {
|
|
200
|
+
const value = await factory();
|
|
201
|
+
await cache.setAsync(key, value, rememberTtl);
|
|
202
|
+
return value;
|
|
203
|
+
})();
|
|
204
|
+
inFlightRemember.set(key, promise);
|
|
205
|
+
try {
|
|
206
|
+
return await promise;
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
if (inFlightRemember.get(key) === promise) {
|
|
210
|
+
inFlightRemember.delete(key);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
89
213
|
};
|
|
90
214
|
cache.get = (key) => store.get(key);
|
|
91
215
|
cache.getAll = () => store.getAll();
|
|
92
|
-
cache.
|
|
93
|
-
cache.
|
|
94
|
-
|
|
216
|
+
cache.getAllAsync = (batchOptions) => store.getAllAsync(batchOptions);
|
|
217
|
+
cache.delete = (key) => {
|
|
218
|
+
nextVersion(keyVersions, key);
|
|
219
|
+
return store.delete(key);
|
|
220
|
+
};
|
|
221
|
+
cache.deleteMatching = (pattern) => {
|
|
222
|
+
mutationEpoch++;
|
|
223
|
+
return store.deleteMatching(pattern);
|
|
224
|
+
};
|
|
225
|
+
cache.deleteMatchingAsync = (pattern, batchOptions) => {
|
|
226
|
+
mutationEpoch++;
|
|
227
|
+
return store.deleteMatchingAsync(pattern, batchOptions);
|
|
228
|
+
};
|
|
229
|
+
cache.clear = () => {
|
|
230
|
+
mutationEpoch++;
|
|
231
|
+
keyVersions.clear();
|
|
232
|
+
store.clear();
|
|
233
|
+
};
|
|
234
|
+
cache.clearAsync = async (batchOptions) => {
|
|
235
|
+
mutationEpoch++;
|
|
236
|
+
keyVersions.clear();
|
|
237
|
+
return store.clearAsync(batchOptions);
|
|
238
|
+
};
|
|
95
239
|
cache.on = store.on.bind(store);
|
|
96
240
|
cache.size = () => store.size();
|
|
97
241
|
cache.byteSize = () => store.byteSize();
|
package/dist/memorize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memorize.js","sourceRoot":"","sources":["../src/memorize.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"memorize.js","sourceRoot":"","sources":["../src/memorize.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "express-memorize",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "In-memory cache middleware for Express.js. Caches GET responses with optional TTL — zero dependencies, fully typed.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -54,6 +54,7 @@
|
|
|
54
54
|
"test:watch": "jest --watch",
|
|
55
55
|
"prepublishOnly": "npm test && npm run build",
|
|
56
56
|
"bench": "tsx bench/index.ts",
|
|
57
|
+
"bench:eventloop": "tsx bench/eventloop-only.ts",
|
|
57
58
|
"docs": "typedoc",
|
|
58
59
|
"docs:watch": "typedoc --watch"
|
|
59
60
|
},
|