express-memorize 1.4.0 → 2.0.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/README.md +201 -78
- package/dist/MemorizeStore.d.ts +29 -7
- package/dist/MemorizeStore.d.ts.map +1 -1
- package/dist/MemorizeStore.js +76 -7
- package/dist/MemorizeStore.js.map +1 -1
- package/dist/adapters/express.d.ts +25 -0
- package/dist/adapters/express.d.ts.map +1 -0
- package/dist/adapters/express.js +62 -0
- package/dist/adapters/express.js.map +1 -0
- package/dist/adapters/fetch.d.ts +45 -0
- package/dist/adapters/fetch.d.ts.map +1 -0
- package/dist/adapters/fetch.js +72 -0
- package/dist/adapters/fetch.js.map +1 -0
- package/dist/adapters/hono.d.ts +34 -0
- package/dist/adapters/hono.d.ts.map +1 -0
- package/dist/adapters/hono.js +63 -0
- package/dist/adapters/hono.js.map +1 -0
- package/dist/adapters/nestjs.d.ts +84 -0
- package/dist/adapters/nestjs.d.ts.map +1 -0
- package/dist/adapters/nestjs.js +194 -0
- package/dist/adapters/nestjs.js.map +1 -0
- package/dist/domain/CacheEntry.d.ts +2 -0
- package/dist/domain/CacheEntry.d.ts.map +1 -1
- package/dist/domain/Memorize.d.ts +99 -4
- package/dist/domain/Memorize.d.ts.map +1 -1
- package/dist/domain/MemorizeEvent.d.ts +2 -1
- package/dist/domain/MemorizeEvent.d.ts.map +1 -1
- package/dist/domain/MemorizeEventType.d.ts +3 -1
- package/dist/domain/MemorizeEventType.d.ts.map +1 -1
- package/dist/domain/MemorizeEventType.js +2 -0
- package/dist/domain/MemorizeEventType.js.map +1 -1
- package/dist/domain/MemorizeEvictEvent.d.ts +18 -0
- package/dist/domain/MemorizeEvictEvent.d.ts.map +1 -0
- package/dist/domain/MemorizeEvictEvent.js +3 -0
- package/dist/domain/MemorizeEvictEvent.js.map +1 -0
- package/dist/domain/MemorizeOptions.d.ts +12 -0
- package/dist/domain/MemorizeOptions.d.ts.map +1 -1
- package/dist/domain/MemorizeSetEvent.d.ts +2 -0
- package/dist/domain/MemorizeSetEvent.d.ts.map +1 -1
- package/dist/domain/MemorizeStats.d.ts +12 -0
- package/dist/domain/MemorizeStats.d.ts.map +1 -0
- package/dist/domain/MemorizeStats.js +3 -0
- package/dist/domain/MemorizeStats.js.map +1 -0
- package/dist/domain/index.d.ts +2 -0
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/memorize.d.ts +19 -16
- package/dist/memorize.d.ts.map +1 -1
- package/dist/memorize.js +51 -50
- package/dist/memorize.js.map +1 -1
- package/package.json +46 -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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"}
|
|
@@ -12,5 +12,7 @@ export interface CacheEntry {
|
|
|
12
12
|
expiresAt: number | null;
|
|
13
13
|
/** Number of times this entry has been requested (including the initial cache miss). */
|
|
14
14
|
hits: number;
|
|
15
|
+
/** Approximate size of the cached body in bytes. */
|
|
16
|
+
size: number;
|
|
15
17
|
}
|
|
16
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;IACzB,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
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;IACzB,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"Memorize.d.ts","sourceRoot":"","sources":["../../src/domain/Memorize.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"MemorizeEvictEvent.js","sourceRoot":"","sources":["../../src/domain/MemorizeEvictEvent.ts"],"names":[],"mappings":""}
|
|
@@ -12,5 +12,17 @@ export interface MemorizeOptions {
|
|
|
12
12
|
* Omit to cache indefinitely. Can be overridden per-route via {@link MemorizeCallOptions}.
|
|
13
13
|
*/
|
|
14
14
|
ttl?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Maximum number of entries the cache may hold at any time.
|
|
17
|
+
*
|
|
18
|
+
* When the limit is reached, the least-recently-used (LRU) entry is evicted
|
|
19
|
+
* before the new one is stored. Omit for an unlimited cache.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const cache = memorize({ maxEntries: 1_000 });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
maxEntries?: number;
|
|
15
27
|
}
|
|
16
28
|
//# 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;
|
|
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;IAEb;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -21,5 +21,7 @@ export interface MemorizeSetEvent {
|
|
|
21
21
|
contentType: string;
|
|
22
22
|
/** Expiry timestamp in ms, or `null` if no TTL was set. */
|
|
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;
|
|
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;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 @@
|
|
|
1
|
+
{"version":3,"file":"MemorizeStats.js","sourceRoot":"","sources":["../../src/domain/MemorizeStats.ts"],"names":[],"mappings":""}
|
package/dist/domain/index.d.ts
CHANGED
|
@@ -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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/memorize.d.ts
CHANGED
|
@@ -3,37 +3,40 @@ import { MemorizeOptions } from './domain/MemorizeOptions';
|
|
|
3
3
|
import { MemorizeCallOptions } from './domain/MemorizeCallOptions';
|
|
4
4
|
export type { Memorize, MemorizeOptions, MemorizeCallOptions };
|
|
5
5
|
/**
|
|
6
|
-
* Creates an in-memory cache
|
|
6
|
+
* Creates an in-memory cache instance.
|
|
7
7
|
*
|
|
8
|
-
* Returns a {@link Memorize} instance that can be used as
|
|
9
|
-
* a
|
|
10
|
-
* same underlying store.
|
|
8
|
+
* Returns a {@link Memorize} instance that can be used as Express middleware,
|
|
9
|
+
* as a direct service-level cache, or as a cache management API — all sharing
|
|
10
|
+
* the same underlying store.
|
|
11
11
|
*
|
|
12
|
-
* **Only `GET` requests
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* **HTTP middleware:** Only `GET` requests with a `2xx` status code are cached.
|
|
13
|
+
* The cache key is `req.originalUrl`, which includes the query string.
|
|
14
|
+
*
|
|
15
|
+
* **Direct cache:** Use {@link Memorize.set}, {@link Memorize.getValue}, and
|
|
16
|
+
* {@link Memorize.remember} to cache arbitrary values from services, workers,
|
|
17
|
+
* or any non-HTTP code.
|
|
15
18
|
*
|
|
16
19
|
* @param options - Global configuration for the cache instance.
|
|
17
20
|
*
|
|
18
|
-
* @example
|
|
21
|
+
* @example Express middleware
|
|
19
22
|
* ```ts
|
|
20
23
|
* const cache = memorize({ ttl: 30_000 });
|
|
21
24
|
*
|
|
22
|
-
* app.get('/users', cache(),
|
|
23
|
-
*
|
|
24
|
-
* });
|
|
25
|
+
* app.get('/users', cache.express(), handler);
|
|
26
|
+
* app.get('/users', cache(), handler); // backwards-compatible alias
|
|
25
27
|
* ```
|
|
26
28
|
*
|
|
27
|
-
* @example
|
|
29
|
+
* @example Service-level caching
|
|
28
30
|
* ```ts
|
|
29
|
-
* const cache = memorize({ ttl:
|
|
30
|
-
*
|
|
31
|
+
* const cache = memorize({ ttl: 30_000 });
|
|
32
|
+
*
|
|
33
|
+
* const users = await cache.remember('users:list', () => userService.findAll());
|
|
34
|
+
* cache.set('config', appConfig);
|
|
35
|
+
* const config = cache.getValue<AppConfig>('config');
|
|
31
36
|
* ```
|
|
32
37
|
*
|
|
33
38
|
* @example Cache invalidation
|
|
34
39
|
* ```ts
|
|
35
|
-
* const cache = memorize({ ttl: 30_000 });
|
|
36
|
-
*
|
|
37
40
|
* app.post('/users', (req, res) => {
|
|
38
41
|
* users.push(req.body);
|
|
39
42
|
* cache.delete('/users');
|
package/dist/memorize.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memorize.d.ts","sourceRoot":"","sources":["../src/memorize.ts"],"names":[],"mappings":"
|
|
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,QAAQ,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CA6ChE"}
|