express-memorize 2.3.0 → 2.4.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.
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=MemorizeBatchOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemorizeBatchOptions.js","sourceRoot":"","sources":["../../src/domain/MemorizeBatchOptions.ts"],"names":[],"mappings":""}
@@ -26,6 +26,42 @@ 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';
29
65
  /**
30
66
  * Serializer used by {@link Memorize.set} and {@link Memorize.getValue}.
31
67
  *
@@ -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;;;;;;;;;;;;;;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"}
@@ -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"}
@@ -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;AAGnE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEjE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAiDhE"}
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;AAgB/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAwJhE"}
package/dist/memorize.js CHANGED
@@ -4,6 +4,19 @@ 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 yieldToEventLoop() {
12
+ return new Promise((resolve) => setImmediate(resolve));
13
+ }
14
+ function nextVersion(versions, key) {
15
+ var _a;
16
+ const version = ((_a = versions.get(key)) !== null && _a !== void 0 ? _a : 0) + 1;
17
+ versions.set(key, version);
18
+ return version;
19
+ }
7
20
  /**
8
21
  * Creates an in-memory cache instance.
9
22
  *
@@ -55,25 +68,66 @@ const serializer_1 = require("./serializer");
55
68
  * ```
56
69
  */
57
70
  function memorize(options = {}) {
58
- const { ttl, maxEntries, serializer: serializerOption } = options;
59
- const store = new MemorizeStore_1.MemorizeStore(maxEntries);
71
+ const { ttl, maxEntries, maxValueBytes, maxTotalBytes, sizeLimitAction, asyncSerializer: asyncSerializerMode = 'yield', serializer: serializerOption, } = options;
72
+ const store = new MemorizeStore_1.MemorizeStore({ maxEntries, maxValueBytes, maxTotalBytes, sizeLimitAction });
60
73
  const serializer = (0, serializer_1.createSerializer)(serializerOption);
74
+ const workerSerializer = asyncSerializerMode === 'worker'
75
+ ? (0, asyncSerializer_1.createWorkerAsyncSerializer)(serializerOption)
76
+ : null;
61
77
  const expressMiddleware = (0, express_1.createExpressMiddleware)(store, ttl);
78
+ const keyVersions = new Map();
79
+ const inFlightRemember = new Map();
80
+ let mutationEpoch = 0;
62
81
  const cache = function (callOptions) {
63
82
  return expressMiddleware(callOptions);
64
83
  };
65
84
  cache.express = (callOptions) => expressMiddleware(callOptions);
66
85
  cache.set = (key, value, entryTtl) => {
86
+ nextVersion(keyVersions, key);
67
87
  const body = serializer.serialize(value);
68
88
  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);
89
+ store.set(key, { body, statusCode: 200, contentType, size: serializedByteSize(body) }, entryTtl !== null && entryTtl !== void 0 ? entryTtl : ttl);
90
+ };
91
+ cache.setAsync = async (key, value, entryTtl) => {
92
+ const version = nextVersion(keyVersions, key);
93
+ const epoch = mutationEpoch;
94
+ await yieldToEventLoop();
95
+ if (!workerSerializer) {
96
+ if (keyVersions.get(key) !== version || mutationEpoch !== epoch)
97
+ return;
98
+ const body = serializer.serialize(value);
99
+ if (keyVersions.get(key) !== version || mutationEpoch !== epoch)
100
+ return;
101
+ const contentType = Buffer.isBuffer(body) ? 'application/octet-stream' : 'application/json';
102
+ store.set(key, { body, statusCode: 200, contentType, size: serializedByteSize(body) }, entryTtl !== null && entryTtl !== void 0 ? entryTtl : ttl);
103
+ return;
104
+ }
105
+ const body = await workerSerializer.serialize(value);
106
+ if (keyVersions.get(key) !== version || mutationEpoch !== epoch)
107
+ return;
108
+ const contentType = Buffer.isBuffer(body) ? 'application/octet-stream' : 'application/json';
109
+ store.set(key, { body, statusCode: 200, contentType, size: serializedByteSize(body) }, entryTtl !== null && entryTtl !== void 0 ? entryTtl : ttl);
70
110
  };
71
111
  cache.getValue = (key) => {
72
- const info = store.get(key);
73
- if (!info)
112
+ const entry = store.getRaw(key);
113
+ if (!entry)
114
+ return undefined;
115
+ try {
116
+ return serializer.deserialize(entry.body);
117
+ }
118
+ catch (_a) {
119
+ return undefined;
120
+ }
121
+ };
122
+ cache.getValueAsync = async (key) => {
123
+ await yieldToEventLoop();
124
+ if (!workerSerializer)
125
+ return cache.getValue(key);
126
+ const entry = store.getRaw(key);
127
+ if (!entry)
74
128
  return undefined;
75
129
  try {
76
- return serializer.deserialize(info.body);
130
+ return await workerSerializer.deserialize(entry.body);
77
131
  }
78
132
  catch (_a) {
79
133
  return undefined;
@@ -83,15 +137,71 @@ function memorize(options = {}) {
83
137
  const existing = cache.getValue(key);
84
138
  if (existing !== undefined)
85
139
  return existing;
86
- const value = await factory();
87
- cache.set(key, value, rememberTtl);
88
- return value;
140
+ const inFlight = inFlightRemember.get(key);
141
+ if (inFlight)
142
+ return inFlight;
143
+ const promise = (async () => {
144
+ const value = await factory();
145
+ cache.set(key, value, rememberTtl);
146
+ return value;
147
+ })();
148
+ inFlightRemember.set(key, promise);
149
+ try {
150
+ return await promise;
151
+ }
152
+ finally {
153
+ if (inFlightRemember.get(key) === promise) {
154
+ inFlightRemember.delete(key);
155
+ }
156
+ }
157
+ };
158
+ cache.rememberAsync = async (key, factory, rememberTtl) => {
159
+ const existing = await cache.getValueAsync(key);
160
+ if (existing !== undefined)
161
+ return existing;
162
+ const inFlight = inFlightRemember.get(key);
163
+ if (inFlight)
164
+ return inFlight;
165
+ const promise = (async () => {
166
+ const value = await factory();
167
+ await cache.setAsync(key, value, rememberTtl);
168
+ return value;
169
+ })();
170
+ inFlightRemember.set(key, promise);
171
+ try {
172
+ return await promise;
173
+ }
174
+ finally {
175
+ if (inFlightRemember.get(key) === promise) {
176
+ inFlightRemember.delete(key);
177
+ }
178
+ }
89
179
  };
90
180
  cache.get = (key) => store.get(key);
91
181
  cache.getAll = () => store.getAll();
92
- cache.delete = (key) => store.delete(key);
93
- cache.deleteMatching = (pattern) => store.deleteMatching(pattern);
94
- cache.clear = () => store.clear();
182
+ cache.getAllAsync = (batchOptions) => store.getAllAsync(batchOptions);
183
+ cache.delete = (key) => {
184
+ nextVersion(keyVersions, key);
185
+ return store.delete(key);
186
+ };
187
+ cache.deleteMatching = (pattern) => {
188
+ mutationEpoch++;
189
+ return store.deleteMatching(pattern);
190
+ };
191
+ cache.deleteMatchingAsync = (pattern, batchOptions) => {
192
+ mutationEpoch++;
193
+ return store.deleteMatchingAsync(pattern, batchOptions);
194
+ };
195
+ cache.clear = () => {
196
+ mutationEpoch++;
197
+ keyVersions.clear();
198
+ store.clear();
199
+ };
200
+ cache.clearAsync = async (batchOptions) => {
201
+ mutationEpoch++;
202
+ keyVersions.clear();
203
+ return store.clearAsync(batchOptions);
204
+ };
95
205
  cache.on = store.on.bind(store);
96
206
  cache.size = () => store.size();
97
207
  cache.byteSize = () => store.byteSize();
@@ -1 +1 @@
1
- {"version":3,"file":"memorize.js","sourceRoot":"","sources":["../src/memorize.ts"],"names":[],"mappings":"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"}
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.0",
3
+ "version": "2.4.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
  },