express-memorize 1.3.0 → 1.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.
Files changed (57) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +208 -70
  3. package/dist/MemorizeStore.d.ts +31 -8
  4. package/dist/MemorizeStore.d.ts.map +1 -1
  5. package/dist/MemorizeStore.js +100 -14
  6. package/dist/MemorizeStore.js.map +1 -1
  7. package/dist/adapters/express.d.ts +25 -0
  8. package/dist/adapters/express.d.ts.map +1 -0
  9. package/dist/adapters/express.js +62 -0
  10. package/dist/adapters/express.js.map +1 -0
  11. package/dist/adapters/fetch.d.ts +45 -0
  12. package/dist/adapters/fetch.d.ts.map +1 -0
  13. package/dist/adapters/fetch.js +72 -0
  14. package/dist/adapters/fetch.js.map +1 -0
  15. package/dist/adapters/hono.d.ts +34 -0
  16. package/dist/adapters/hono.d.ts.map +1 -0
  17. package/dist/adapters/hono.js +63 -0
  18. package/dist/adapters/hono.js.map +1 -0
  19. package/dist/adapters/nestjs.d.ts +84 -0
  20. package/dist/adapters/nestjs.d.ts.map +1 -0
  21. package/dist/adapters/nestjs.js +194 -0
  22. package/dist/adapters/nestjs.js.map +1 -0
  23. package/dist/domain/CacheEntry.d.ts +5 -1
  24. package/dist/domain/CacheEntry.d.ts.map +1 -1
  25. package/dist/domain/CacheInfo.d.ts +1 -1
  26. package/dist/domain/CacheInfo.d.ts.map +1 -1
  27. package/dist/domain/Memorize.d.ts +99 -4
  28. package/dist/domain/Memorize.d.ts.map +1 -1
  29. package/dist/domain/MemorizeCallOptions.d.ts +4 -3
  30. package/dist/domain/MemorizeCallOptions.d.ts.map +1 -1
  31. package/dist/domain/MemorizeEvent.d.ts +2 -1
  32. package/dist/domain/MemorizeEvent.d.ts.map +1 -1
  33. package/dist/domain/MemorizeEventType.d.ts +3 -1
  34. package/dist/domain/MemorizeEventType.d.ts.map +1 -1
  35. package/dist/domain/MemorizeEventType.js +2 -0
  36. package/dist/domain/MemorizeEventType.js.map +1 -1
  37. package/dist/domain/MemorizeEvictEvent.d.ts +18 -0
  38. package/dist/domain/MemorizeEvictEvent.d.ts.map +1 -0
  39. package/dist/domain/MemorizeEvictEvent.js +3 -0
  40. package/dist/domain/MemorizeEvictEvent.js.map +1 -0
  41. package/dist/domain/MemorizeOptions.d.ts +14 -1
  42. package/dist/domain/MemorizeOptions.d.ts.map +1 -1
  43. package/dist/domain/MemorizeSetEvent.d.ts +3 -1
  44. package/dist/domain/MemorizeSetEvent.d.ts.map +1 -1
  45. package/dist/domain/MemorizeStats.d.ts +12 -0
  46. package/dist/domain/MemorizeStats.d.ts.map +1 -0
  47. package/dist/domain/MemorizeStats.js +3 -0
  48. package/dist/domain/MemorizeStats.js.map +1 -0
  49. package/dist/domain/index.d.ts +2 -0
  50. package/dist/domain/index.d.ts.map +1 -1
  51. package/dist/index.d.ts +1 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/memorize.d.ts +19 -16
  54. package/dist/memorize.d.ts.map +1 -1
  55. package/dist/memorize.js +51 -45
  56. package/dist/memorize.js.map +1 -1
  57. package/package.json +50 -12
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemorizeModule = exports.MemorizeInterceptor = exports.MEMORIZE_MODULE_OPTIONS = exports.MEMORIZE_CACHE = void 0;
4
+ exports.MemorizeCacheKey = MemorizeCacheKey;
5
+ exports.MemorizeTtl = MemorizeTtl;
6
+ exports.MemorizeNoCache = MemorizeNoCache;
7
+ const memorize_1 = require("../memorize");
8
+ exports.MEMORIZE_CACHE = Symbol('MEMORIZE_CACHE');
9
+ exports.MEMORIZE_MODULE_OPTIONS = Symbol('MEMORIZE_MODULE_OPTIONS');
10
+ const CACHE_KEY_METADATA = 'express-memorize:nestjs:cache-key';
11
+ const TTL_METADATA = 'express-memorize:nestjs:ttl';
12
+ const NO_CACHE_METADATA = 'express-memorize:nestjs:no-cache';
13
+ const metadataFallback = new WeakMap();
14
+ function setMetadata(key, value, target) {
15
+ var _a;
16
+ const reflect = Reflect;
17
+ if (reflect.defineMetadata) {
18
+ reflect.defineMetadata(key, value, target);
19
+ return;
20
+ }
21
+ const existing = (_a = metadataFallback.get(target)) !== null && _a !== void 0 ? _a : new Map();
22
+ existing.set(key, value);
23
+ metadataFallback.set(target, existing);
24
+ }
25
+ function getOwnMetadata(key, target) {
26
+ var _a;
27
+ const reflect = Reflect;
28
+ const value = reflect.getMetadata ? reflect.getMetadata(key, target) : (_a = metadataFallback.get(target)) === null || _a === void 0 ? void 0 : _a.get(key);
29
+ return value;
30
+ }
31
+ function getMetadata(key, context) {
32
+ var _a;
33
+ return (_a = getOwnMetadata(key, context.getHandler())) !== null && _a !== void 0 ? _a : getOwnMetadata(key, context.getClass());
34
+ }
35
+ function createMetadataDecorator(key, value) {
36
+ return (target, propertyKey, descriptor) => {
37
+ var _a;
38
+ setMetadata(key, value, (_a = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value) !== null && _a !== void 0 ? _a : target);
39
+ };
40
+ }
41
+ function setCacheHeader(response, value) {
42
+ if (!response || response.headersSent)
43
+ return;
44
+ if (response.setHeader)
45
+ response.setHeader('X-Cache', value);
46
+ else if (response.header)
47
+ response.header('X-Cache', value);
48
+ }
49
+ function defaultKey(request) {
50
+ var _a, _b;
51
+ return (_b = (_a = request.originalUrl) !== null && _a !== void 0 ? _a : request.url) !== null && _b !== void 0 ? _b : '';
52
+ }
53
+ function parseCachedBody(body) {
54
+ if (typeof body !== 'string')
55
+ return body;
56
+ try {
57
+ return JSON.parse(body);
58
+ }
59
+ catch (_a) {
60
+ return body;
61
+ }
62
+ }
63
+ function toObservable(value) {
64
+ return {
65
+ subscribe(observerOrNext, _error, complete) {
66
+ var _a, _b;
67
+ if (typeof observerOrNext === 'function') {
68
+ observerOrNext(value);
69
+ complete === null || complete === void 0 ? void 0 : complete();
70
+ return { unsubscribe() { } };
71
+ }
72
+ (_a = observerOrNext === null || observerOrNext === void 0 ? void 0 : observerOrNext.next) === null || _a === void 0 ? void 0 : _a.call(observerOrNext, value);
73
+ (_b = observerOrNext === null || observerOrNext === void 0 ? void 0 : observerOrNext.complete) === null || _b === void 0 ? void 0 : _b.call(observerOrNext);
74
+ return { unsubscribe() { } };
75
+ },
76
+ };
77
+ }
78
+ function normalizeObserver(observerOrNext, error, complete) {
79
+ if (typeof observerOrNext === 'function') {
80
+ return { next: observerOrNext, error, complete };
81
+ }
82
+ return observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : {};
83
+ }
84
+ function cacheObservable(source, onCompleteValue) {
85
+ return {
86
+ subscribe(observerOrNext, error, complete) {
87
+ const observer = normalizeObserver(observerOrNext, error, complete);
88
+ let hasValue = false;
89
+ let latestValue;
90
+ return source.subscribe({
91
+ next(value) {
92
+ var _a;
93
+ hasValue = true;
94
+ latestValue = value;
95
+ (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, value);
96
+ },
97
+ error(err) {
98
+ var _a;
99
+ (_a = observer.error) === null || _a === void 0 ? void 0 : _a.call(observer, err);
100
+ },
101
+ complete() {
102
+ var _a;
103
+ if (hasValue)
104
+ onCompleteValue(latestValue);
105
+ (_a = observer.complete) === null || _a === void 0 ? void 0 : _a.call(observer);
106
+ },
107
+ });
108
+ },
109
+ };
110
+ }
111
+ /**
112
+ * Decorates a controller or handler with a fixed cache key.
113
+ */
114
+ function MemorizeCacheKey(key) {
115
+ return createMetadataDecorator(CACHE_KEY_METADATA, key);
116
+ }
117
+ /**
118
+ * Decorates a controller or handler with a TTL override in milliseconds.
119
+ */
120
+ function MemorizeTtl(ttl) {
121
+ return createMetadataDecorator(TTL_METADATA, ttl);
122
+ }
123
+ /**
124
+ * Decorates a controller or handler so the interceptor bypasses cache reads and writes.
125
+ */
126
+ function MemorizeNoCache() {
127
+ return createMetadataDecorator(NO_CACHE_METADATA, true);
128
+ }
129
+ /**
130
+ * NestJS interceptor backed by a shared {@link Memorize} cache instance.
131
+ *
132
+ * Register through {@link MemorizeModule.forRoot} for dependency injection, or
133
+ * instantiate directly in tests and small applications.
134
+ */
135
+ class MemorizeInterceptor {
136
+ constructor(cache = (0, memorize_1.memorize)(), options = {}) {
137
+ this.cache = cache;
138
+ this.options = options;
139
+ }
140
+ intercept(context, next) {
141
+ var _a, _b, _c, _d;
142
+ const http = context.switchToHttp();
143
+ const request = http.getRequest();
144
+ const response = http.getResponse();
145
+ if (request.method !== 'GET') {
146
+ return next.handle();
147
+ }
148
+ const noCache = getMetadata(NO_CACHE_METADATA, context);
149
+ if (noCache) {
150
+ setCacheHeader(response, 'BYPASS');
151
+ return next.handle();
152
+ }
153
+ const metadataKey = getMetadata(CACHE_KEY_METADATA, context);
154
+ const key = (_c = metadataKey !== null && metadataKey !== void 0 ? metadataKey : (_b = (_a = this.options).key) === null || _b === void 0 ? void 0 : _b.call(_a, { context, request })) !== null && _c !== void 0 ? _c : defaultKey(request);
155
+ const ttl = (_d = getMetadata(TTL_METADATA, context)) !== null && _d !== void 0 ? _d : this.options.ttl;
156
+ const cached = this.cache._store.getRaw(key);
157
+ if (cached) {
158
+ setCacheHeader(response, 'HIT');
159
+ return toObservable(parseCachedBody(cached.body));
160
+ }
161
+ setCacheHeader(response, 'MISS');
162
+ return cacheObservable(next.handle(), (value) => {
163
+ if (value === undefined || response.headersSent)
164
+ return;
165
+ this.cache.set(key, value, ttl);
166
+ });
167
+ }
168
+ }
169
+ exports.MemorizeInterceptor = MemorizeInterceptor;
170
+ /**
171
+ * Dynamic Nest module that provides a shared cache and interceptor.
172
+ */
173
+ class MemorizeModule {
174
+ static forRoot(options = {}) {
175
+ return {
176
+ module: MemorizeModule,
177
+ providers: [
178
+ { provide: exports.MEMORIZE_MODULE_OPTIONS, useValue: options },
179
+ {
180
+ provide: exports.MEMORIZE_CACHE,
181
+ useFactory: () => (0, memorize_1.memorize)(options),
182
+ },
183
+ {
184
+ provide: MemorizeInterceptor,
185
+ useFactory: (cache, moduleOptions) => new MemorizeInterceptor(cache, moduleOptions),
186
+ inject: [exports.MEMORIZE_CACHE, exports.MEMORIZE_MODULE_OPTIONS],
187
+ },
188
+ ],
189
+ exports: [exports.MEMORIZE_CACHE, MemorizeInterceptor],
190
+ };
191
+ }
192
+ }
193
+ exports.MemorizeModule = MemorizeModule;
194
+ //# sourceMappingURL=nestjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nestjs.js","sourceRoot":"","sources":["../../src/adapters/nestjs.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,11 @@ export interface CacheEntry {
8
8
  statusCode: number;
9
9
  /** Value of the `Content-Type` response header (e.g. `application/json; charset=utf-8`). */
10
10
  contentType: string;
11
- /** Unix timestamp (ms) at which the entry expires, or `null` if it never expires. */
11
+ /** Unix timestamp (ms) at which the entry expires, or `null` when TTL is `Infinity`. */
12
12
  expiresAt: number | null;
13
+ /** Number of times this entry has been requested (including the initial cache miss). */
14
+ hits: number;
15
+ /** Approximate size of the cached body in bytes. */
16
+ size: number;
13
17
  }
14
18
  //# sourceMappingURL=CacheEntry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CacheEntry.d.ts","sourceRoot":"","sources":["../../src/domain/CacheEntry.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,+DAA+D;IAC/D,IAAI,EAAE,OAAO,CAAC;IACd,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B"}
1
+ {"version":3,"file":"CacheEntry.d.ts","sourceRoot":"","sources":["../../src/domain/CacheEntry.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,+DAA+D;IAC/D,IAAI,EAAE,OAAO,CAAC;IACd,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -6,7 +6,7 @@ import { CacheEntry } from './CacheEntry';
6
6
  export interface CacheInfo extends CacheEntry {
7
7
  /** The cache key — the full request path including query string (e.g. `/users?page=1`). */
8
8
  key: string;
9
- /** Milliseconds remaining until the entry expires. `null` if the entry has no TTL. */
9
+ /** Milliseconds remaining until the entry expires. `null` when TTL is `Infinity`. */
10
10
  remainingTtl: number | null;
11
11
  }
12
12
  //# sourceMappingURL=CacheInfo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CacheInfo.d.ts","sourceRoot":"","sources":["../../src/domain/CacheInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,2FAA2F;IAC3F,GAAG,EAAE,MAAM,CAAC;IACZ,sFAAsF;IACtF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B"}
1
+ {"version":3,"file":"CacheInfo.d.ts","sourceRoot":"","sources":["../../src/domain/CacheInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,2FAA2F;IAC3F,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B"}
@@ -6,6 +6,9 @@ import { MemorizeSetEvent } from './MemorizeSetEvent';
6
6
  import { MemorizeDeleteEvent } from './MemorizeDeleteEvent';
7
7
  import { MemorizeExpireEvent } from './MemorizeExpireEvent';
8
8
  import { MemorizeEmptyEvent } from './MemorizeEmptyEvent';
9
+ import { MemorizeEvictEvent } from './MemorizeEvictEvent';
10
+ import { MemorizeStats } from './MemorizeStats';
11
+ import { MemorizeStore } from '../MemorizeStore';
9
12
  /**
10
13
  * The cache instance returned by {@link memorize}.
11
14
  *
@@ -23,12 +26,22 @@ import { MemorizeEmptyEvent } from './MemorizeEmptyEvent';
23
26
  * // Global middleware — caches every GET route automatically
24
27
  * app.use(cache());
25
28
  *
29
+ * // Direct service-level usage
30
+ * const users = await cache.remember('users:list', () => userService.findAll());
31
+ *
26
32
  * // Cache management
27
33
  * cache.delete('/users');
28
34
  * cache.clear();
29
35
  * ```
30
36
  */
31
37
  export interface Memorize {
38
+ /**
39
+ * Returns an Express `RequestHandler` that caches `GET` responses with a `2xx`
40
+ * status code. Alias of {@link Memorize.express} kept for backwards compatibility.
41
+ *
42
+ * @param options - Optional per-route options (e.g. TTL override).
43
+ */
44
+ (options?: MemorizeCallOptions): RequestHandler;
32
45
  /**
33
46
  * Returns an Express `RequestHandler` that caches `GET` responses with a `2xx`
34
47
  * status code.
@@ -43,12 +56,58 @@ export interface Memorize {
43
56
  *
44
57
  * @example
45
58
  * ```ts
46
- * app.get('/users', cache(), handler); // global TTL
47
- * app.get('/products', cache({ ttl: 5_000 }), handler); // 5-second override
48
- * app.use(cache()); // global middleware
59
+ * app.get('/users', cache.express(), handler); // global TTL
60
+ * app.get('/products', cache.express({ ttl: 5_000 }), handler); // 5-second override
61
+ * app.use(cache.express()); // global middleware
49
62
  * ```
50
63
  */
51
- (options?: MemorizeCallOptions): RequestHandler;
64
+ express(options?: MemorizeCallOptions): RequestHandler;
65
+ /**
66
+ * Stores an arbitrary value in the cache under the given key.
67
+ *
68
+ * The value is serialized with `JSON.stringify`. Retrieve it with {@link getValue}.
69
+ *
70
+ * @param key - Cache key.
71
+ * @param value - Value to cache.
72
+ * @param ttl - Time-to-live in milliseconds. Defaults to the global TTL.
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * cache.set('config', { theme: 'dark' });
77
+ * cache.set('config', { theme: 'dark' }, 60_000);
78
+ * ```
79
+ */
80
+ set<T>(key: string, value: T, ttl?: number): void;
81
+ /**
82
+ * Returns the cached value for the given key, or `undefined` if the key does
83
+ * not exist or has expired.
84
+ *
85
+ * Values stored via {@link set} or {@link remember} are deserialized with
86
+ * `JSON.parse`.
87
+ *
88
+ * @param key - Cache key.
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * const config = cache.getValue<Config>('config');
93
+ * ```
94
+ */
95
+ getValue<T>(key: string): T | undefined;
96
+ /**
97
+ * Returns the cached value for the given key if it exists, otherwise calls
98
+ * `factory`, caches the result, and returns it.
99
+ *
100
+ * @param key - Cache key.
101
+ * @param factory - Async or sync function that produces the value on a cache miss.
102
+ * @param ttl - Time-to-live in milliseconds. Defaults to the global TTL.
103
+ *
104
+ * @example
105
+ * ```ts
106
+ * const users = await cache.remember('users:list', () => userService.findAll());
107
+ * const users = await cache.remember('users:list', () => userService.findAll(), 30_000);
108
+ * ```
109
+ */
110
+ remember<T>(key: string, factory: () => T | Promise<T>, ttl?: number): Promise<T>;
52
111
  /**
53
112
  * Returns the {@link CacheInfo} for a specific cache key, or `null` if the key
54
113
  * does not exist or has expired.
@@ -144,5 +203,41 @@ export interface Memorize {
144
203
  on(event: MemorizeEventType.Delete, handler: (e: MemorizeDeleteEvent) => void): void;
145
204
  on(event: MemorizeEventType.Expire, handler: (e: MemorizeExpireEvent) => void): void;
146
205
  on(event: MemorizeEventType.Empty, handler: (e: MemorizeEmptyEvent) => void): void;
206
+ on(event: MemorizeEventType.Evict, handler: (e: MemorizeEvictEvent) => void): void;
207
+ /**
208
+ * Returns the number of active (non-expired) cache entries.
209
+ *
210
+ * @example
211
+ * ```ts
212
+ * console.log(`${cache.size()} entries in cache`);
213
+ * ```
214
+ */
215
+ size(): number;
216
+ /**
217
+ * Returns the approximate total byte size of all cached bodies.
218
+ *
219
+ * The value is an estimate based on UTF-8 encoding for strings and
220
+ * `byteLength` for buffers. It may not reflect actual memory usage.
221
+ *
222
+ * @example
223
+ * ```ts
224
+ * console.log(`~${cache.byteSize()} bytes cached`);
225
+ * ```
226
+ */
227
+ byteSize(): number;
228
+ /**
229
+ * Returns aggregate cache statistics.
230
+ *
231
+ * @example
232
+ * ```ts
233
+ * const { entries, maxEntries, byteSize } = cache.getStats();
234
+ * ```
235
+ */
236
+ getStats(): MemorizeStats;
237
+ /**
238
+ * The underlying store. Intended for use by framework adapters only.
239
+ * @internal
240
+ */
241
+ _store: MemorizeStore;
147
242
  }
148
243
  //# sourceMappingURL=Memorize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Memorize.d.ts","sourceRoot":"","sources":["../../src/domain/Memorize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;;;;;;;;;;;;;;;OAkBG;IACH,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,cAAc,CAAC;IAEhD;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAEnC;;;;;;;OAOG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEpC;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE7B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IAExC;;;;;;;;OAQG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;;;;;;;;;;;;;;;;OAiBG;IACH,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,GAAG,EAAK,OAAO,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI,CAAC;IAClF,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI,CAAC;IACrF,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI,CAAC;IACrF,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,EAAG,OAAO,EAAE,CAAC,CAAC,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAC;CACrF"}
1
+ {"version":3,"file":"Memorize.d.ts","sourceRoot":"","sources":["../../src/domain/Memorize.ts"],"names":[],"mappings":"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"}
@@ -11,13 +11,14 @@ export interface MemorizeCallOptions {
11
11
  /**
12
12
  * Time-to-live override for this specific route, in milliseconds.
13
13
  * Takes precedence over the global `ttl` set in {@link MemorizeOptions}.
14
- * Pass `0` or omit to fall back to the global TTL.
14
+ * Omit to fall back to the global TTL. Pass `Infinity` to cache indefinitely.
15
+ * Pass `0` to expire immediately.
15
16
  */
16
17
  ttl?: number;
17
18
  /**
18
19
  * When `true`, the middleware skips both reading from and writing to the cache
19
- * for this route. Useful when a global `app.use(cache())` is in place but a
20
- * specific route should never be cached.
20
+ * for this route and sets `X-Cache: BYPASS` on the response. Useful when a
21
+ * global `app.use(cache())` is in place but a specific route should never be cached.
21
22
  */
22
23
  noCache?: boolean;
23
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MemorizeCallOptions.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeCallOptions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
1
+ {"version":3,"file":"MemorizeCallOptions.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeCallOptions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
@@ -2,6 +2,7 @@ import { MemorizeSetEvent } from './MemorizeSetEvent';
2
2
  import { MemorizeDeleteEvent } from './MemorizeDeleteEvent';
3
3
  import { MemorizeExpireEvent } from './MemorizeExpireEvent';
4
4
  import { MemorizeEmptyEvent } from './MemorizeEmptyEvent';
5
+ import { MemorizeEvictEvent } from './MemorizeEvictEvent';
5
6
  /** Union of all possible cache events. */
6
- export type MemorizeEvent = MemorizeSetEvent | MemorizeDeleteEvent | MemorizeExpireEvent | MemorizeEmptyEvent;
7
+ export type MemorizeEvent = MemorizeSetEvent | MemorizeDeleteEvent | MemorizeExpireEvent | MemorizeEmptyEvent | MemorizeEvictEvent;
7
8
  //# sourceMappingURL=MemorizeEvent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MemorizeEvent.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,0CAA0C;AAC1C,MAAM,MAAM,aAAa,GACrB,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,kBAAkB,CAAC"}
1
+ {"version":3,"file":"MemorizeEvent.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,0CAA0C;AAC1C,MAAM,MAAM,aAAa,GACrB,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,kBAAkB,GAClB,kBAAkB,CAAC"}
@@ -17,6 +17,8 @@ export declare enum MemorizeEventType {
17
17
  /** Fired when an entry is automatically removed after its TTL elapses. */
18
18
  Expire = "expire",
19
19
  /** Fired when the last entry is removed, leaving the cache empty. */
20
- Empty = "empty"
20
+ Empty = "empty",
21
+ /** Fired when an entry is automatically removed because `maxEntries` was reached. */
22
+ Evict = "evict"
21
23
  }
22
24
  //# sourceMappingURL=MemorizeEventType.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MemorizeEventType.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeEventType.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,oBAAY,iBAAiB;IAC3B,oDAAoD;IACpD,GAAG,QAAQ;IACX,2EAA2E;IAC3E,MAAM,WAAW;IACjB,0EAA0E;IAC1E,MAAM,WAAW;IACjB,qEAAqE;IACrE,KAAK,UAAU;CAChB"}
1
+ {"version":3,"file":"MemorizeEventType.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeEventType.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,oBAAY,iBAAiB;IAC3B,oDAAoD;IACpD,GAAG,QAAQ;IACX,2EAA2E;IAC3E,MAAM,WAAW;IACjB,0EAA0E;IAC1E,MAAM,WAAW;IACjB,qEAAqE;IACrE,KAAK,UAAU;IACf,qFAAqF;IACrF,KAAK,UAAU;CAChB"}
@@ -22,5 +22,7 @@ var MemorizeEventType;
22
22
  MemorizeEventType["Expire"] = "expire";
23
23
  /** Fired when the last entry is removed, leaving the cache empty. */
24
24
  MemorizeEventType["Empty"] = "empty";
25
+ /** Fired when an entry is automatically removed because `maxEntries` was reached. */
26
+ MemorizeEventType["Evict"] = "evict";
25
27
  })(MemorizeEventType || (exports.MemorizeEventType = MemorizeEventType = {}));
26
28
  //# sourceMappingURL=MemorizeEventType.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MemorizeEventType.js","sourceRoot":"","sources":["../../src/domain/MemorizeEventType.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;GAUG;AACH,IAAY,iBASX;AATD,WAAY,iBAAiB;IAC3B,oDAAoD;IACpD,gCAAW,CAAA;IACX,2EAA2E;IAC3E,sCAAiB,CAAA;IACjB,0EAA0E;IAC1E,sCAAiB,CAAA;IACjB,qEAAqE;IACrE,oCAAe,CAAA;AACjB,CAAC,EATW,iBAAiB,iCAAjB,iBAAiB,QAS5B"}
1
+ {"version":3,"file":"MemorizeEventType.js","sourceRoot":"","sources":["../../src/domain/MemorizeEventType.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;GAUG;AACH,IAAY,iBAWX;AAXD,WAAY,iBAAiB;IAC3B,oDAAoD;IACpD,gCAAW,CAAA;IACX,2EAA2E;IAC3E,sCAAiB,CAAA;IACjB,0EAA0E;IAC1E,sCAAiB,CAAA;IACjB,qEAAqE;IACrE,oCAAe,CAAA;IACf,qFAAqF;IACrF,oCAAe,CAAA;AACjB,CAAC,EAXW,iBAAiB,iCAAjB,iBAAiB,QAW5B"}
@@ -0,0 +1,18 @@
1
+ import { MemorizeEventType } from './MemorizeEventType';
2
+ /**
3
+ * Emitted when an entry is automatically removed because the cache reached
4
+ * its `maxEntries` limit.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * cache.on(MemorizeEventType.Evict, (e) => {
9
+ * console.log(`evicted ${e.key} to make room`);
10
+ * });
11
+ * ```
12
+ */
13
+ export interface MemorizeEvictEvent {
14
+ type: MemorizeEventType.Evict;
15
+ /** The cache key that was evicted. */
16
+ key: string;
17
+ }
18
+ //# sourceMappingURL=MemorizeEvictEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemorizeEvictEvent.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeEvictEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC;IAC9B,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;CACb"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=MemorizeEvictEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemorizeEvictEvent.js","sourceRoot":"","sources":["../../src/domain/MemorizeEvictEvent.ts"],"names":[],"mappings":""}
@@ -9,8 +9,21 @@
9
9
  export interface MemorizeOptions {
10
10
  /**
11
11
  * Default time-to-live for every cached entry, in milliseconds.
12
- * Omit to cache indefinitely. Can be overridden per-route via {@link MemorizeCallOptions}.
12
+ * Omit to use the store's finite default TTL. Pass `Infinity` to cache indefinitely.
13
+ * Can be overridden per-route via {@link MemorizeCallOptions}.
13
14
  */
14
15
  ttl?: number;
16
+ /**
17
+ * Maximum number of entries the cache may hold at any time.
18
+ *
19
+ * When the limit is reached, the least-recently-used (LRU) entry is evicted
20
+ * before the new one is stored. Omit for an unlimited cache.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const cache = memorize({ maxEntries: 1_000 });
25
+ * ```
26
+ */
27
+ maxEntries?: number;
15
28
  }
16
29
  //# sourceMappingURL=MemorizeOptions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MemorizeOptions.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeOptions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd"}
1
+ {"version":3,"file":"MemorizeOptions.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeOptions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -19,7 +19,9 @@ export interface MemorizeSetEvent {
19
19
  statusCode: number;
20
20
  /** `Content-Type` header value of the stored response. */
21
21
  contentType: string;
22
- /** Expiry timestamp in ms, or `null` if no TTL was set. */
22
+ /** Expiry timestamp in ms, or `null` when TTL is `Infinity`. */
23
23
  expiresAt: number | null;
24
+ /** Approximate byte size of the cached body. */
25
+ size: number;
24
26
  }
25
27
  //# sourceMappingURL=MemorizeSetEvent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MemorizeSetEvent.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeSetEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,iBAAiB,CAAC,GAAG,CAAC;IAC5B,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B"}
1
+ {"version":3,"file":"MemorizeSetEvent.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeSetEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,iBAAiB,CAAC,GAAG,CAAC;IAC5B,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Aggregate cache statistics returned by {@link Memorize.getStats}.
3
+ */
4
+ export interface MemorizeStats {
5
+ /** Number of active (non-expired) cache entries. */
6
+ entries: number;
7
+ /** Configured maximum number of entries, or `null` if unlimited. */
8
+ maxEntries: number | null;
9
+ /** Approximate total byte size of all cached bodies. */
10
+ byteSize: number;
11
+ }
12
+ //# sourceMappingURL=MemorizeStats.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=MemorizeStats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemorizeStats.js","sourceRoot":"","sources":["../../src/domain/MemorizeStats.ts"],"names":[],"mappings":""}
@@ -6,6 +6,8 @@ export type { MemorizeSetEvent } from './MemorizeSetEvent';
6
6
  export type { MemorizeDeleteEvent } from './MemorizeDeleteEvent';
7
7
  export type { MemorizeExpireEvent } from './MemorizeExpireEvent';
8
8
  export type { MemorizeEmptyEvent } from './MemorizeEmptyEvent';
9
+ export type { MemorizeEvictEvent } from './MemorizeEvictEvent';
10
+ export type { MemorizeStats } from './MemorizeStats';
9
11
  export type { MemorizeOptions } from './MemorizeOptions';
10
12
  export type { MemorizeCallOptions } from './MemorizeCallOptions';
11
13
  export type { Memorize } from './Memorize';
@@ -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,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,QAAQ,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { memorize } from './memorize';
2
2
  export type { Memorize, MemorizeOptions, MemorizeCallOptions } from './memorize';
3
3
  export { MemorizeEventType } from './domain/MemorizeEventType';
4
- export type { CacheEntry, CacheInfo, MemorizeEvent, MemorizeSetEvent, MemorizeDeleteEvent, MemorizeExpireEvent, MemorizeEmptyEvent, } from './domain/index';
4
+ export type { CacheEntry, CacheInfo, MemorizeEvent, MemorizeSetEvent, MemorizeDeleteEvent, MemorizeExpireEvent, MemorizeEmptyEvent, MemorizeEvictEvent, MemorizeStats, } from './domain/index';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,YAAY,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,YAAY,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,GACd,MAAM,gBAAgB,CAAC"}