@node-ts-cache/core 1.0.0 → 1.0.2
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/LICENSE +1 -1
- package/README.md +62 -632
- package/dist/decorator/cache.decorator.d.ts +2 -2
- package/dist/decorator/cache.decorator.js +1 -3
- package/dist/decorator/cache.decorator.js.map +1 -1
- package/dist/decorator/multicache.decorator.d.ts +1 -1
- package/dist/decorator/multicache.decorator.js +1 -3
- package/dist/decorator/multicache.decorator.js.map +1 -1
- package/dist/decorator/synccache.decorator.d.ts +1 -1
- package/dist/decorator/synccache.decorator.js +0 -1
- package/dist/decorator/synccache.decorator.js.map +1 -1
- package/dist/storage/fs/fs.json.storage.js +1 -0
- package/dist/storage/fs/fs.json.storage.js.map +1 -1
- package/dist/storage/memory/memory.storage.js +1 -3
- package/dist/storage/memory/memory.storage.js.map +1 -1
- package/dist/strategy/caching/abstract.base.strategy.js +1 -0
- package/dist/strategy/caching/abstract.base.strategy.js.map +1 -1
- package/dist/strategy/caching/expiration.strategy.js.map +1 -1
- package/package.json +8 -6
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -6,26 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
Simple and extensible caching module for TypeScript/Node.js with decorator support.
|
|
8
8
|
|
|
9
|
-
## Table of Contents
|
|
10
|
-
|
|
11
|
-
- [Installation](#installation)
|
|
12
|
-
- [Quick Start](#quick-start)
|
|
13
|
-
- [Decorators](#decorators)
|
|
14
|
-
- [@Cache](#cache)
|
|
15
|
-
- [@SyncCache](#synccache)
|
|
16
|
-
- [@MultiCache](#multicache)
|
|
17
|
-
- [Direct API Usage](#direct-api-usage)
|
|
18
|
-
- [Strategies](#strategies)
|
|
19
|
-
- [ExpirationStrategy](#expirationstrategy)
|
|
20
|
-
- [Storages](#storages)
|
|
21
|
-
- [Built-in Storages](#built-in-storages)
|
|
22
|
-
- [Additional Storages](#additional-storages)
|
|
23
|
-
- [Custom Key Strategies](#custom-key-strategies)
|
|
24
|
-
- [Interface Definitions](#interface-definitions)
|
|
25
|
-
- [Advanced Usage](#advanced-usage)
|
|
26
|
-
- [Environment Variables](#environment-variables)
|
|
27
|
-
- [Testing](#testing)
|
|
28
|
-
|
|
29
9
|
## Installation
|
|
30
10
|
|
|
31
11
|
```bash
|
|
@@ -37,726 +17,176 @@ npm install @node-ts-cache/core
|
|
|
37
17
|
```typescript
|
|
38
18
|
import { Cache, ExpirationStrategy, MemoryStorage } from '@node-ts-cache/core';
|
|
39
19
|
|
|
40
|
-
// Create a caching strategy with in-memory storage
|
|
41
20
|
const cacheStrategy = new ExpirationStrategy(new MemoryStorage());
|
|
42
21
|
|
|
43
22
|
class UserService {
|
|
44
23
|
@Cache(cacheStrategy, { ttl: 60 })
|
|
45
24
|
async getUser(id: string): Promise<User> {
|
|
46
|
-
// Expensive operation - result will be cached for 60 seconds
|
|
47
25
|
return await database.findUser(id);
|
|
48
26
|
}
|
|
49
27
|
}
|
|
50
28
|
```
|
|
51
29
|
|
|
52
|
-
##
|
|
53
|
-
|
|
54
|
-
### @Cache
|
|
30
|
+
## Storage Engines
|
|
55
31
|
|
|
56
|
-
|
|
32
|
+
The core package includes `MemoryStorage` and `FsJsonStorage`. Additional storage backends are available as separate packages:
|
|
57
33
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
34
|
+
| Package | Storage Type | Sync/Async | Use Case |
|
|
35
|
+
| -------------------------------------- | --------------------------------------------------------------------- | ---------- | -------------------------------------- |
|
|
36
|
+
| `@node-ts-cache/core` | MemoryStorage | Sync | Development, simple caching |
|
|
37
|
+
| `@node-ts-cache/core` | FsJsonStorage | Async | Persistent local cache |
|
|
38
|
+
| `@node-ts-cache/node-cache-storage` | [node-cache](https://www.npmjs.com/package/node-cache) | Sync | Production single-instance with TTL |
|
|
39
|
+
| `@node-ts-cache/lru-storage` | [lru-cache](https://www.npmjs.com/package/lru-cache) | Sync | Memory-bounded with automatic eviction |
|
|
40
|
+
| `@node-ts-cache/redis-storage` | [redis](https://www.npmjs.com/package/redis) (v4.x) | Async | Shared cache |
|
|
41
|
+
| `@node-ts-cache/ioredis-storage` | [ioredis](https://www.npmjs.com/package/ioredis) | Async | Shared cache with compression |
|
|
42
|
+
| `@node-ts-cache/lru-redis-storage` | LRU + Redis | Async | Two-tier: fast local + shared remote |
|
|
43
|
+
| `@node-ts-cache/elasticsearch-storage` | [elasticsearch](https://www.npmjs.com/package/@elastic/elasticsearch) | Async | Search-integrated caching |
|
|
44
|
+
| `@node-ts-cache/memcached-storage` | [memcached](https://www.npmjs.com/package/memcached) | Async | High-performance distributed cache |
|
|
45
|
+
| `@node-ts-cache/valkey-storage` | [iovalkey](https://www.npmjs.com/package/iovalkey) | Async | Redis-compatible, open source |
|
|
63
46
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
- `strategy` - A caching strategy instance (e.g., `ExpirationStrategy`)
|
|
67
|
-
- `options` - Options passed to the strategy (see [ExpirationStrategy](#expirationstrategy))
|
|
68
|
-
- `keyStrategy` - Optional custom key generation strategy
|
|
47
|
+
## Decorators
|
|
69
48
|
|
|
70
|
-
|
|
49
|
+
### @Cache
|
|
71
50
|
|
|
72
|
-
|
|
51
|
+
Caches async method results. Cache key is generated from class name, method name, and arguments.
|
|
73
52
|
|
|
74
53
|
```typescript
|
|
75
|
-
import { Cache, ExpirationStrategy, MemoryStorage } from '@node-ts-cache/core';
|
|
76
|
-
|
|
77
|
-
const strategy = new ExpirationStrategy(new MemoryStorage());
|
|
78
|
-
|
|
79
54
|
class ProductService {
|
|
80
55
|
@Cache(strategy, { ttl: 300 })
|
|
81
56
|
async getProduct(id: string): Promise<Product> {
|
|
82
|
-
console.log('Fetching product from database...');
|
|
83
57
|
return await db.products.findById(id);
|
|
84
58
|
}
|
|
85
|
-
|
|
86
|
-
@Cache(strategy, { ttl: 3600, isCachedForever: false })
|
|
87
|
-
async getCategories(): Promise<Category[]> {
|
|
88
|
-
return await db.categories.findAll();
|
|
89
|
-
}
|
|
90
59
|
}
|
|
91
|
-
|
|
92
|
-
// Usage
|
|
93
|
-
const service = new ProductService();
|
|
94
|
-
|
|
95
|
-
// First call - hits database
|
|
96
|
-
const product1 = await service.getProduct('123');
|
|
97
|
-
|
|
98
|
-
// Second call with same args - returns cached result
|
|
99
|
-
const product2 = await service.getProduct('123');
|
|
100
|
-
|
|
101
|
-
// Different args - hits database again
|
|
102
|
-
const product3 = await service.getProduct('456');
|
|
103
60
|
```
|
|
104
61
|
|
|
105
|
-
|
|
62
|
+
**Note:** `@Cache` always returns a Promise since cache operations may be asynchronous.
|
|
106
63
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
**Signature:**
|
|
110
|
-
|
|
111
|
-
```typescript
|
|
112
|
-
@SyncCache(strategy: ISynchronousCacheType, options?: ExpirationOptions, keyStrategy?: ISyncKeyStrategy)
|
|
113
|
-
```
|
|
64
|
+
### @SyncCache
|
|
114
65
|
|
|
115
|
-
|
|
66
|
+
Caches synchronous method results without converting to Promises. Use with synchronous storages like `MemoryStorage` or `LRUStorage`.
|
|
116
67
|
|
|
117
68
|
```typescript
|
|
118
|
-
import { SyncCache, ExpirationStrategy, MemoryStorage } from '@node-ts-cache/core';
|
|
119
|
-
|
|
120
|
-
const strategy = new ExpirationStrategy(new MemoryStorage());
|
|
121
|
-
|
|
122
69
|
class ConfigService {
|
|
123
70
|
@SyncCache(strategy, { ttl: 60 })
|
|
124
71
|
getConfig(key: string): ConfigValue {
|
|
125
|
-
// Expensive computation
|
|
126
72
|
return computeConfig(key);
|
|
127
73
|
}
|
|
128
74
|
}
|
|
129
|
-
|
|
130
|
-
// Usage - returns value directly, not a Promise
|
|
131
|
-
const config = new ConfigService().getConfig('theme');
|
|
132
75
|
```
|
|
133
76
|
|
|
134
77
|
### @MultiCache
|
|
135
78
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
- Caching array-based lookups efficiently
|
|
139
|
-
- Implementing local + remote cache tiers
|
|
140
|
-
- Reducing database queries for batch operations
|
|
141
|
-
|
|
142
|
-
**Signature:**
|
|
79
|
+
Multi-tier caching with batch operations for array-based lookups.
|
|
143
80
|
|
|
144
81
|
```typescript
|
|
145
|
-
@MultiCache(
|
|
146
|
-
strategies: Array<IMultiSynchronousCacheType | IMultiIAsynchronousCacheType>,
|
|
147
|
-
parameterIndex: number,
|
|
148
|
-
cacheKeyFn?: (element: any) => string,
|
|
149
|
-
options?: ExpirationOptions
|
|
150
|
-
)
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
**Parameters:**
|
|
154
|
-
|
|
155
|
-
- `strategies` - Array of cache strategies, checked in order (first = fastest, last = slowest)
|
|
156
|
-
- `parameterIndex` - Index of the array parameter in the method signature
|
|
157
|
-
- `cacheKeyFn` - Optional function to generate cache keys for each element
|
|
158
|
-
- `options` - Options passed to strategies
|
|
159
|
-
|
|
160
|
-
**Example:**
|
|
161
|
-
|
|
162
|
-
```typescript
|
|
163
|
-
import { MultiCache, ExpirationStrategy } from '@node-ts-cache/core';
|
|
164
|
-
import NodeCacheStorage from '@node-ts-cache/node-cache-storage';
|
|
165
|
-
import RedisIOStorage from '@node-ts-cache/ioredis-storage';
|
|
166
|
-
|
|
167
|
-
// Local cache (fastest) -> Redis (shared) -> Database (slowest)
|
|
168
|
-
const localCache = new ExpirationStrategy(new NodeCacheStorage());
|
|
169
|
-
const redisCache = new RedisIOStorage(() => redisClient, { maxAge: 3600 });
|
|
170
|
-
|
|
171
82
|
class UserService {
|
|
172
|
-
@MultiCache([localCache, redisCache], 0,
|
|
83
|
+
@MultiCache([localCache, redisCache], 0, id => `user:${id}`, { ttl: 300 })
|
|
173
84
|
async getUsersByIds(userIds: string[]): Promise<User[]> {
|
|
174
|
-
// This only runs for IDs not found in any cache
|
|
175
|
-
// IMPORTANT: Return results in the same order as input IDs
|
|
176
85
|
return await db.users.findByIds(userIds);
|
|
177
86
|
}
|
|
178
87
|
}
|
|
179
|
-
|
|
180
|
-
// Usage
|
|
181
|
-
const service = new UserService();
|
|
182
|
-
|
|
183
|
-
// First call - checks local, then redis, then hits database
|
|
184
|
-
const users = await service.getUsersByIds(['1', '2', '3']);
|
|
185
|
-
|
|
186
|
-
// Second call - user 1 & 2 from local cache, user 4 from database
|
|
187
|
-
const moreUsers = await service.getUsersByIds(['1', '2', '4']);
|
|
188
88
|
```
|
|
189
89
|
|
|
190
|
-
**Return Value Requirements:**
|
|
191
|
-
|
|
192
|
-
- Return an array with the same length and order as the input array
|
|
193
|
-
- Use `null` for entries that exist but are empty
|
|
194
|
-
- Use `undefined` for entries that should be re-queried next time
|
|
195
|
-
|
|
196
90
|
## Direct API Usage
|
|
197
91
|
|
|
198
|
-
|
|
92
|
+
Use the caching strategy directly without decorators:
|
|
199
93
|
|
|
200
94
|
```typescript
|
|
201
|
-
import { ExpirationStrategy, MemoryStorage } from '@node-ts-cache/core';
|
|
202
|
-
|
|
203
95
|
const cache = new ExpirationStrategy(new MemoryStorage());
|
|
204
96
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
// Check cache first
|
|
208
|
-
const cached = await cache.getItem<Data>(key);
|
|
209
|
-
if (cached !== undefined) {
|
|
210
|
-
return cached;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// Fetch fresh data
|
|
214
|
-
const data = await fetchData(key);
|
|
97
|
+
// Get item
|
|
98
|
+
const value = await cache.getItem<Data>('key');
|
|
215
99
|
|
|
216
|
-
|
|
217
|
-
|
|
100
|
+
// Set item with TTL
|
|
101
|
+
await cache.setItem('key', data, { ttl: 300 });
|
|
218
102
|
|
|
219
|
-
|
|
220
|
-
|
|
103
|
+
// Delete item
|
|
104
|
+
await cache.setItem('key', undefined);
|
|
221
105
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
async clearAll(): Promise<void> {
|
|
227
|
-
await cache.clear();
|
|
228
|
-
}
|
|
229
|
-
}
|
|
106
|
+
// Clear all
|
|
107
|
+
await cache.clear();
|
|
230
108
|
```
|
|
231
109
|
|
|
232
|
-
##
|
|
233
|
-
|
|
234
|
-
### ExpirationStrategy
|
|
235
|
-
|
|
236
|
-
Time-based cache expiration strategy. Items are automatically invalidated after a specified TTL (Time To Live).
|
|
110
|
+
## ExpirationStrategy Options
|
|
237
111
|
|
|
238
|
-
|
|
112
|
+
| Option | Type | Default | Description |
|
|
113
|
+
| ----------------- | --------- | ------- | --------------------------------------------------------------------------------- |
|
|
114
|
+
| `ttl` | `number` | `60` | Time to live in seconds |
|
|
115
|
+
| `isLazy` | `boolean` | `true` | If `true`, delete on access after expiration. If `false`, delete via `setTimeout` |
|
|
116
|
+
| `isCachedForever` | `boolean` | `false` | If `true`, items never expire |
|
|
239
117
|
|
|
240
118
|
```typescript
|
|
241
|
-
new ExpirationStrategy(storage: IAsynchronousCacheType | ISynchronousCacheType)
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
**Options:**
|
|
245
|
-
|
|
246
|
-
| Option | Type | Default | Description |
|
|
247
|
-
| ----------------- | --------- | ------- | ------------------------------------------------------------------------------------------------------------------------- |
|
|
248
|
-
| `ttl` | `number` | `60` | Time to live in **seconds** |
|
|
249
|
-
| `isLazy` | `boolean` | `true` | If `true`, items are deleted when accessed after expiration. If `false`, items are deleted automatically via `setTimeout` |
|
|
250
|
-
| `isCachedForever` | `boolean` | `false` | If `true`, items never expire (ignores `ttl`) |
|
|
251
|
-
|
|
252
|
-
**Example:**
|
|
253
|
-
|
|
254
|
-
```typescript
|
|
255
|
-
import { ExpirationStrategy, MemoryStorage } from '@node-ts-cache/core';
|
|
256
|
-
|
|
257
|
-
const storage = new MemoryStorage();
|
|
258
|
-
const strategy = new ExpirationStrategy(storage);
|
|
259
|
-
|
|
260
119
|
// Cache for 5 minutes with lazy expiration
|
|
261
|
-
await strategy.setItem('
|
|
120
|
+
await strategy.setItem('key', value, { ttl: 300, isLazy: true });
|
|
262
121
|
|
|
263
122
|
// Cache forever
|
|
264
|
-
await strategy.setItem('
|
|
265
|
-
|
|
266
|
-
// Cache for 10 seconds with eager expiration (auto-delete)
|
|
267
|
-
await strategy.setItem('key3', 'value', { ttl: 10, isLazy: false });
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
**Lazy vs Eager Expiration:**
|
|
271
|
-
|
|
272
|
-
- **Lazy (`isLazy: true`)**: Expired items remain in storage until accessed. Memory is freed on read. Better for large caches.
|
|
273
|
-
- **Eager (`isLazy: false`)**: Items are deleted via `setTimeout` after TTL. Frees memory automatically but uses timers.
|
|
274
|
-
|
|
275
|
-
## Storages
|
|
276
|
-
|
|
277
|
-
### Built-in Storages
|
|
278
|
-
|
|
279
|
-
These storages are included in the core package:
|
|
280
|
-
|
|
281
|
-
#### MemoryStorage
|
|
282
|
-
|
|
283
|
-
Simple in-memory storage using a JavaScript object. Best for development and simple use cases.
|
|
284
|
-
|
|
285
|
-
```typescript
|
|
286
|
-
import { MemoryStorage, ExpirationStrategy } from '@node-ts-cache/core';
|
|
287
|
-
|
|
288
|
-
const storage = new MemoryStorage();
|
|
289
|
-
const strategy = new ExpirationStrategy(storage);
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
**Characteristics:**
|
|
293
|
-
|
|
294
|
-
- Synchronous operations
|
|
295
|
-
- No external dependencies
|
|
296
|
-
- Data lost on process restart
|
|
297
|
-
- No size limits (can cause memory issues)
|
|
298
|
-
|
|
299
|
-
#### FsJsonStorage
|
|
300
|
-
|
|
301
|
-
File-based storage that persists cache to a JSON file. Useful for persistent local caching.
|
|
302
|
-
|
|
303
|
-
```typescript
|
|
304
|
-
import { FsJsonStorage, ExpirationStrategy } from '@node-ts-cache/core';
|
|
305
|
-
|
|
306
|
-
const storage = new FsJsonStorage('/tmp/cache.json');
|
|
307
|
-
const strategy = new ExpirationStrategy(storage);
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
**Characteristics:**
|
|
311
|
-
|
|
312
|
-
- Asynchronous operations
|
|
313
|
-
- Survives process restarts
|
|
314
|
-
- Slower than memory storage
|
|
315
|
-
- Good for development/single-instance deployments
|
|
316
|
-
|
|
317
|
-
### Additional Storages
|
|
318
|
-
|
|
319
|
-
Install these separately based on your needs:
|
|
320
|
-
|
|
321
|
-
#### NodeCacheStorage
|
|
322
|
-
|
|
323
|
-
Wrapper for [node-cache](https://www.npmjs.com/package/node-cache) - a simple in-memory cache with TTL support.
|
|
324
|
-
|
|
325
|
-
```bash
|
|
326
|
-
npm install @node-ts-cache/node-cache-storage
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
```typescript
|
|
330
|
-
import { ExpirationStrategy } from '@node-ts-cache/core';
|
|
331
|
-
import NodeCacheStorage from '@node-ts-cache/node-cache-storage';
|
|
332
|
-
|
|
333
|
-
const storage = new NodeCacheStorage({
|
|
334
|
-
stdTTL: 100, // Default TTL in seconds
|
|
335
|
-
checkperiod: 120, // Cleanup interval in seconds
|
|
336
|
-
maxKeys: 1000 // Maximum number of keys
|
|
337
|
-
});
|
|
338
|
-
const strategy = new ExpirationStrategy(storage);
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
**Characteristics:**
|
|
342
|
-
|
|
343
|
-
- Synchronous operations
|
|
344
|
-
- Supports multi-get/set operations
|
|
345
|
-
- Built-in TTL and cleanup
|
|
346
|
-
- Good for production single-instance apps
|
|
347
|
-
|
|
348
|
-
#### LRUStorage
|
|
349
|
-
|
|
350
|
-
Wrapper for [lru-cache](https://www.npmjs.com/package/lru-cache) - Least Recently Used cache with automatic eviction.
|
|
351
|
-
|
|
352
|
-
```bash
|
|
353
|
-
npm install @node-ts-cache/lru-storage
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
```typescript
|
|
357
|
-
import { ExpirationStrategy } from '@node-ts-cache/core';
|
|
358
|
-
import LRUStorage from '@node-ts-cache/lru-storage';
|
|
359
|
-
|
|
360
|
-
const storage = new LRUStorage({
|
|
361
|
-
max: 500, // Maximum number of items
|
|
362
|
-
ttl: 300 // TTL in seconds
|
|
363
|
-
});
|
|
364
|
-
const strategy = new ExpirationStrategy(storage);
|
|
365
|
-
```
|
|
123
|
+
await strategy.setItem('key', value, { isCachedForever: true });
|
|
366
124
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
- Synchronous operations
|
|
370
|
-
- Automatic eviction when max size reached
|
|
371
|
-
- Memory-safe with bounded size
|
|
372
|
-
- Supports multi-get/set operations
|
|
373
|
-
|
|
374
|
-
**Note:** LRU cache has its own TTL (`ttl` in seconds). When using with `ExpirationStrategy`, both TTLs apply. Set LRU `ttl` higher than your strategy TTL or use `isCachedForever` in the strategy.
|
|
375
|
-
|
|
376
|
-
#### RedisStorage
|
|
377
|
-
|
|
378
|
-
Redis storage using the legacy `redis` package (v3.x). For new projects, consider using `RedisIOStorage` instead.
|
|
379
|
-
|
|
380
|
-
```bash
|
|
381
|
-
npm install @node-ts-cache/redis-storage
|
|
382
|
-
```
|
|
383
|
-
|
|
384
|
-
```typescript
|
|
385
|
-
import { ExpirationStrategy } from '@node-ts-cache/core';
|
|
386
|
-
import RedisStorage from '@node-ts-cache/redis-storage';
|
|
387
|
-
|
|
388
|
-
const storage = new RedisStorage({
|
|
389
|
-
host: 'localhost',
|
|
390
|
-
port: 6379,
|
|
391
|
-
password: 'optional'
|
|
392
|
-
});
|
|
393
|
-
const strategy = new ExpirationStrategy(storage);
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
**Characteristics:**
|
|
397
|
-
|
|
398
|
-
- Asynchronous operations
|
|
399
|
-
- Uses legacy `redis` package with Bluebird promises
|
|
400
|
-
- Shared cache across multiple instances
|
|
401
|
-
- No compression support
|
|
402
|
-
|
|
403
|
-
#### RedisIOStorage
|
|
404
|
-
|
|
405
|
-
Modern Redis storage using [ioredis](https://github.com/redis/ioredis) with optional Snappy compression.
|
|
406
|
-
|
|
407
|
-
```bash
|
|
408
|
-
npm install @node-ts-cache/ioredis-storage
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
```typescript
|
|
412
|
-
import { ExpirationStrategy } from '@node-ts-cache/core';
|
|
413
|
-
import RedisIOStorage from '@node-ts-cache/ioredis-storage';
|
|
414
|
-
import Redis from 'ioredis';
|
|
415
|
-
|
|
416
|
-
const redisClient = new Redis({
|
|
417
|
-
host: 'localhost',
|
|
418
|
-
port: 6379
|
|
419
|
-
});
|
|
420
|
-
|
|
421
|
-
// Basic usage
|
|
422
|
-
const storage = new RedisIOStorage(
|
|
423
|
-
() => redisClient,
|
|
424
|
-
{ maxAge: 3600 } // TTL in seconds
|
|
425
|
-
);
|
|
426
|
-
|
|
427
|
-
// With compression (reduces bandwidth, increases CPU usage)
|
|
428
|
-
const compressedStorage = new RedisIOStorage(() => redisClient, { maxAge: 3600, compress: true });
|
|
429
|
-
|
|
430
|
-
// With error handler (non-blocking writes)
|
|
431
|
-
storage.onError(error => {
|
|
432
|
-
console.error('Redis error:', error);
|
|
433
|
-
});
|
|
434
|
-
|
|
435
|
-
const strategy = new ExpirationStrategy(storage);
|
|
436
|
-
```
|
|
437
|
-
|
|
438
|
-
**Characteristics:**
|
|
439
|
-
|
|
440
|
-
- Asynchronous operations
|
|
441
|
-
- Supports multi-get/set operations
|
|
442
|
-
- Optional Snappy compression
|
|
443
|
-
- Modern ioredis client
|
|
444
|
-
- Custom error handler support
|
|
445
|
-
- Can bypass ExpirationStrategy TTL (uses Redis native TTL)
|
|
446
|
-
|
|
447
|
-
**Constructor Options:**
|
|
448
|
-
| Option | Type | Default | Description |
|
|
449
|
-
|--------|------|---------|-------------|
|
|
450
|
-
| `maxAge` | `number` | `86400` | TTL in seconds (used by Redis SETEX) |
|
|
451
|
-
| `compress` | `boolean` | `false` | Enable Snappy compression |
|
|
452
|
-
|
|
453
|
-
#### LRUWithRedisStorage
|
|
454
|
-
|
|
455
|
-
Two-tier caching: fast local LRU cache with Redis fallback. Provides the best of both worlds.
|
|
456
|
-
|
|
457
|
-
```bash
|
|
458
|
-
npm install @node-ts-cache/lru-redis-storage
|
|
125
|
+
// Cache with eager expiration (auto-delete after TTL)
|
|
126
|
+
await strategy.setItem('key', value, { ttl: 10, isLazy: false });
|
|
459
127
|
```
|
|
460
128
|
|
|
461
|
-
```typescript
|
|
462
|
-
import { ExpirationStrategy } from '@node-ts-cache/core';
|
|
463
|
-
import LRUWithRedisStorage from '@node-ts-cache/lru-redis-storage';
|
|
464
|
-
import Redis from 'ioredis';
|
|
465
|
-
|
|
466
|
-
const redisClient = new Redis();
|
|
467
|
-
|
|
468
|
-
const storage = new LRUWithRedisStorage(
|
|
469
|
-
{ max: 1000 }, // LRU options
|
|
470
|
-
() => redisClient // Redis client factory
|
|
471
|
-
);
|
|
472
|
-
const strategy = new ExpirationStrategy(storage);
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
**Characteristics:**
|
|
476
|
-
|
|
477
|
-
- Asynchronous operations
|
|
478
|
-
- Local LRU for hot data
|
|
479
|
-
- Redis fallback for cache misses
|
|
480
|
-
- Reduces Redis round-trips
|
|
481
|
-
- Good for high-traffic applications
|
|
482
|
-
|
|
483
129
|
## Custom Key Strategies
|
|
484
130
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
You can implement custom key strategies for different needs:
|
|
488
|
-
|
|
489
|
-
### Synchronous Key Strategy
|
|
131
|
+
Override default key generation by implementing `ISyncKeyStrategy` or `IAsyncKeyStrategy`:
|
|
490
132
|
|
|
491
133
|
```typescript
|
|
492
|
-
import { Cache, ExpirationStrategy, MemoryStorage, ISyncKeyStrategy } from '@node-ts-cache/core';
|
|
493
|
-
|
|
494
134
|
class CustomKeyStrategy implements ISyncKeyStrategy {
|
|
495
135
|
getKey(className: string, methodName: string, args: any[]): string | undefined {
|
|
496
|
-
|
|
497
|
-
if (args[0] === 'skip') {
|
|
498
|
-
return undefined;
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
// Custom key format
|
|
136
|
+
if (args[0] === 'skip') return undefined; // Skip caching
|
|
502
137
|
return `${className}::${methodName}::${args.join('-')}`;
|
|
503
138
|
}
|
|
504
139
|
}
|
|
505
140
|
|
|
506
|
-
const strategy = new ExpirationStrategy(new MemoryStorage());
|
|
507
|
-
const keyStrategy = new CustomKeyStrategy();
|
|
508
|
-
|
|
509
141
|
class MyService {
|
|
510
|
-
@Cache(strategy, { ttl: 60 },
|
|
142
|
+
@Cache(strategy, { ttl: 60 }, new CustomKeyStrategy())
|
|
511
143
|
async getData(id: string): Promise<Data> {
|
|
512
144
|
return fetchData(id);
|
|
513
145
|
}
|
|
514
146
|
}
|
|
515
147
|
```
|
|
516
148
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
For key generation that requires async operations (e.g., fetching user context):
|
|
520
|
-
|
|
521
|
-
```typescript
|
|
522
|
-
import { Cache, ExpirationStrategy, MemoryStorage, IAsyncKeyStrategy } from '@node-ts-cache/core';
|
|
523
|
-
|
|
524
|
-
class AsyncKeyStrategy implements IAsyncKeyStrategy {
|
|
525
|
-
async getKey(className: string, methodName: string, args: any[]): Promise<string | undefined> {
|
|
526
|
-
// Async operation to build key
|
|
527
|
-
const userId = await getCurrentUserId();
|
|
528
|
-
return `${userId}:${className}:${methodName}:${JSON.stringify(args)}`;
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
```
|
|
532
|
-
|
|
533
|
-
## Interface Definitions
|
|
534
|
-
|
|
535
|
-
### Storage Interfaces
|
|
536
|
-
|
|
537
|
-
```typescript
|
|
538
|
-
/**
|
|
539
|
-
* Cache entry structure stored in backends
|
|
540
|
-
*/
|
|
541
|
-
interface ICacheEntry {
|
|
542
|
-
content: any; // The cached value
|
|
543
|
-
meta: any; // Metadata (e.g., TTL, createdAt)
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
/**
|
|
547
|
-
* Asynchronous storage for single items
|
|
548
|
-
*/
|
|
549
|
-
interface IAsynchronousCacheType<C = ICacheEntry> {
|
|
550
|
-
/** Retrieve an item by key. Returns undefined if not found. */
|
|
551
|
-
getItem<T>(key: string): Promise<T | undefined>;
|
|
552
|
-
|
|
553
|
-
/** Store an item. Pass undefined as content to delete. */
|
|
554
|
-
setItem(key: string, content: C | undefined, options?: any): Promise<void>;
|
|
555
|
-
|
|
556
|
-
/** Clear all items from the cache. */
|
|
557
|
-
clear(): Promise<void>;
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
/**
|
|
561
|
-
* Synchronous storage for single items
|
|
562
|
-
*/
|
|
563
|
-
interface ISynchronousCacheType<C = ICacheEntry> {
|
|
564
|
-
/** Retrieve an item by key. Returns undefined if not found. */
|
|
565
|
-
getItem<T>(key: string): T | undefined;
|
|
566
|
-
|
|
567
|
-
/** Store an item. Pass undefined as content to delete. */
|
|
568
|
-
setItem(key: string, content: C | undefined, options?: any): void;
|
|
569
|
-
|
|
570
|
-
/** Clear all items from the cache. */
|
|
571
|
-
clear(): void;
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
/**
|
|
575
|
-
* Asynchronous storage with batch operations
|
|
576
|
-
*/
|
|
577
|
-
interface IMultiIAsynchronousCacheType<C = ICacheEntry> {
|
|
578
|
-
/** Retrieve multiple items by keys. */
|
|
579
|
-
getItems<T>(keys: string[]): Promise<{ [key: string]: T | undefined }>;
|
|
580
|
-
|
|
581
|
-
/** Store multiple items at once. */
|
|
582
|
-
setItems(values: { key: string; content: C | undefined }[], options?: any): Promise<void>;
|
|
583
|
-
|
|
584
|
-
/** Clear all items from the cache. */
|
|
585
|
-
clear(): Promise<void>;
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
/**
|
|
589
|
-
* Synchronous storage with batch operations
|
|
590
|
-
*/
|
|
591
|
-
interface IMultiSynchronousCacheType<C = ICacheEntry> {
|
|
592
|
-
/** Retrieve multiple items by keys. */
|
|
593
|
-
getItems<T>(keys: string[]): { [key: string]: T | undefined };
|
|
594
|
-
|
|
595
|
-
/** Store multiple items at once. */
|
|
596
|
-
setItems(values: { key: string; content: C | undefined }[], options?: any): void;
|
|
597
|
-
|
|
598
|
-
/** Clear all items from the cache. */
|
|
599
|
-
clear(): void;
|
|
600
|
-
}
|
|
601
|
-
```
|
|
602
|
-
|
|
603
|
-
### Key Strategy Interfaces
|
|
604
|
-
|
|
605
|
-
```typescript
|
|
606
|
-
/**
|
|
607
|
-
* Synchronous key generation strategy
|
|
608
|
-
*/
|
|
609
|
-
interface ISyncKeyStrategy {
|
|
610
|
-
/**
|
|
611
|
-
* Generate a cache key from method context
|
|
612
|
-
* @param className - Name of the class containing the method
|
|
613
|
-
* @param methodName - Name of the cached method
|
|
614
|
-
* @param args - Arguments passed to the method
|
|
615
|
-
* @returns Cache key string, or undefined to skip caching
|
|
616
|
-
*/
|
|
617
|
-
getKey(className: string, methodName: string, args: any[]): string | undefined;
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
/**
|
|
621
|
-
* Asynchronous key generation strategy
|
|
622
|
-
*/
|
|
623
|
-
interface IAsyncKeyStrategy {
|
|
624
|
-
/**
|
|
625
|
-
* Generate a cache key from method context (can be async)
|
|
626
|
-
* @param className - Name of the class containing the method
|
|
627
|
-
* @param methodName - Name of the cached method
|
|
628
|
-
* @param args - Arguments passed to the method
|
|
629
|
-
* @returns Cache key string, or undefined to skip caching
|
|
630
|
-
*/
|
|
631
|
-
getKey(
|
|
632
|
-
className: string,
|
|
633
|
-
methodName: string,
|
|
634
|
-
args: any[]
|
|
635
|
-
): Promise<string | undefined> | string | undefined;
|
|
636
|
-
}
|
|
637
|
-
```
|
|
638
|
-
|
|
639
|
-
### ExpirationStrategy Options
|
|
640
|
-
|
|
641
|
-
```typescript
|
|
642
|
-
interface ExpirationOptions {
|
|
643
|
-
/** Time to live in seconds (default: 60) */
|
|
644
|
-
ttl?: number;
|
|
645
|
-
|
|
646
|
-
/** If true, delete on access after expiration. If false, delete via setTimeout (default: true) */
|
|
647
|
-
isLazy?: boolean;
|
|
648
|
-
|
|
649
|
-
/** If true, cache forever ignoring TTL (default: false) */
|
|
650
|
-
isCachedForever?: boolean;
|
|
651
|
-
}
|
|
652
|
-
```
|
|
653
|
-
|
|
654
|
-
## Advanced Usage
|
|
149
|
+
## Advanced Features
|
|
655
150
|
|
|
656
151
|
### Call Deduplication
|
|
657
152
|
|
|
658
|
-
|
|
153
|
+
Concurrent calls with the same cache key share the same pending promise:
|
|
659
154
|
|
|
660
155
|
```typescript
|
|
661
|
-
|
|
662
|
-
@Cache(strategy, { ttl: 60 })
|
|
663
|
-
async fetchData(id: string): Promise<Data> {
|
|
664
|
-
console.log('Fetching...'); // Only logged once
|
|
665
|
-
return await slowApiCall(id);
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
|
|
669
|
-
const service = new DataService();
|
|
670
|
-
|
|
671
|
-
// All three calls share the same pending promise
|
|
156
|
+
// All three calls share one database request
|
|
672
157
|
const [a, b, c] = await Promise.all([
|
|
673
158
|
service.fetchData('123'),
|
|
674
159
|
service.fetchData('123'),
|
|
675
160
|
service.fetchData('123')
|
|
676
161
|
]);
|
|
677
|
-
// "Fetching..." is logged only once, all three get the same result
|
|
678
162
|
```
|
|
679
163
|
|
|
680
|
-
###
|
|
681
|
-
|
|
682
|
-
The cache distinguishes between:
|
|
164
|
+
### Null vs Undefined
|
|
683
165
|
|
|
684
|
-
- `undefined`:
|
|
685
|
-
- `null`:
|
|
166
|
+
- `undefined`: Cache miss or skip caching
|
|
167
|
+
- `null`: Cached value (e.g., "not found" result)
|
|
686
168
|
|
|
687
169
|
```typescript
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
const user = await db.findUser(id);
|
|
692
|
-
// Return null for non-existent users to cache the "not found" result
|
|
693
|
-
// Return undefined would cause re-fetching on every call
|
|
694
|
-
return user ?? null;
|
|
695
|
-
}
|
|
170
|
+
async findUser(id: string): Promise<User | null> {
|
|
171
|
+
const user = await db.findUser(id);
|
|
172
|
+
return user ?? null; // Cache "not found" as null
|
|
696
173
|
}
|
|
697
174
|
```
|
|
698
175
|
|
|
699
|
-
### Error Handling
|
|
700
|
-
|
|
701
|
-
Cache errors are logged but don't break the application flow. If caching fails, the method executes normally:
|
|
702
|
-
|
|
703
|
-
```typescript
|
|
704
|
-
// Cache read/write failures are logged as warnings:
|
|
705
|
-
// "@node-ts-cache/core: reading cache failed [key] [error]"
|
|
706
|
-
// "@node-ts-cache/core: writing result to cache failed [key] [error]"
|
|
707
|
-
|
|
708
|
-
// For RedisIOStorage, you can add a custom error handler:
|
|
709
|
-
storage.onError(error => {
|
|
710
|
-
metrics.incrementCacheError();
|
|
711
|
-
logger.error('Cache error', error);
|
|
712
|
-
});
|
|
713
|
-
```
|
|
714
|
-
|
|
715
176
|
## Environment Variables
|
|
716
177
|
|
|
717
|
-
| Variable | Description
|
|
718
|
-
| ------------------------- |
|
|
719
|
-
| `DISABLE_CACHE_DECORATOR` | Set to any value to disable all `@Cache` decorators
|
|
720
|
-
|
|
721
|
-
## Testing
|
|
722
|
-
|
|
723
|
-
```bash
|
|
724
|
-
# Run all tests
|
|
725
|
-
npm test
|
|
726
|
-
|
|
727
|
-
# Run tests in watch mode
|
|
728
|
-
npm run tdd
|
|
729
|
-
|
|
730
|
-
# Run tests with debugger
|
|
731
|
-
npm run tdd-debug-brk
|
|
732
|
-
```
|
|
178
|
+
| Variable | Description |
|
|
179
|
+
| ------------------------- | --------------------------------------------------- |
|
|
180
|
+
| `DISABLE_CACHE_DECORATOR` | Set to any value to disable all `@Cache` decorators |
|
|
733
181
|
|
|
734
|
-
##
|
|
182
|
+
## More Documentation
|
|
735
183
|
|
|
736
|
-
|
|
184
|
+
See [ADVANCED.md](./ADVANCED.md) for:
|
|
737
185
|
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
export { MultiCache } from './decorator/multicache.decorator';
|
|
743
|
-
|
|
744
|
-
// Strategies
|
|
745
|
-
export { ExpirationStrategy } from './strategy/caching/expiration.strategy';
|
|
746
|
-
|
|
747
|
-
// Built-in Storages
|
|
748
|
-
export { MemoryStorage } from './storage/memory';
|
|
749
|
-
export { FsJsonStorage } from './storage/fs';
|
|
750
|
-
|
|
751
|
-
// Interfaces
|
|
752
|
-
export {
|
|
753
|
-
IAsynchronousCacheType,
|
|
754
|
-
ISynchronousCacheType,
|
|
755
|
-
IMultiIAsynchronousCacheType,
|
|
756
|
-
IMultiSynchronousCacheType
|
|
757
|
-
} from './types/cache.types';
|
|
758
|
-
export { ISyncKeyStrategy, IAsyncKeyStrategy } from './types/key.strategy.types';
|
|
759
|
-
```
|
|
186
|
+
- Interface definitions for implementing custom storages
|
|
187
|
+
- Detailed storage configuration examples
|
|
188
|
+
- @MultiCache in-depth usage
|
|
189
|
+
- Error handling patterns
|
|
760
190
|
|
|
761
191
|
## License
|
|
762
192
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { IAsyncKeyStrategy } from '../types/key.strategy.types.js';
|
|
2
2
|
import { IAsynchronousCacheType, ISynchronousCacheType, ICacheOptions } from '../types/cache.types.js';
|
|
3
|
-
export declare function Cache(cachingStrategy: IAsynchronousCacheType | ISynchronousCacheType, options?: ICacheOptions, keyStrategy?: IAsyncKeyStrategy): (target:
|
|
3
|
+
export declare function Cache(cachingStrategy: IAsynchronousCacheType | ISynchronousCacheType, options?: ICacheOptions, keyStrategy?: IAsyncKeyStrategy): (target: object & {
|
|
4
4
|
__cache_decarator_pending_results?: {
|
|
5
5
|
[key: string]: Promise<unknown> | undefined;
|
|
6
|
-
}
|
|
6
|
+
};
|
|
7
7
|
}, methodName: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { JSONStringifyKeyStrategy } from '../strategy/key/json.stringify.strategy.js';
|
|
2
2
|
const defaultKeyStrategy = new JSONStringifyKeyStrategy();
|
|
3
3
|
export function Cache(cachingStrategy, options, keyStrategy = defaultKeyStrategy) {
|
|
4
|
-
return function (
|
|
5
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
6
|
-
target, methodName, descriptor) {
|
|
4
|
+
return function (target, methodName, descriptor) {
|
|
7
5
|
const originalMethod = descriptor.value;
|
|
8
6
|
const className = target.constructor.name;
|
|
9
7
|
descriptor.value = async function (...args) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.decorator.js","sourceRoot":"","sources":["../../src/decorator/cache.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAQtF,MAAM,kBAAkB,GAAG,IAAI,wBAAwB,EAAE,CAAC;AAE1D,MAAM,UAAU,KAAK,CACpB,eAA+D,EAC/D,OAAuB,EACvB,cAAiC,kBAAkB;IAEnD,OAAO
|
|
1
|
+
{"version":3,"file":"cache.decorator.js","sourceRoot":"","sources":["../../src/decorator/cache.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAQtF,MAAM,kBAAkB,GAAG,IAAI,wBAAwB,EAAE,CAAC;AAE1D,MAAM,UAAU,KAAK,CACpB,eAA+D,EAC/D,OAAuB,EACvB,cAAiC,kBAAkB;IAEnD,OAAO,UACN,MAIC,EACD,UAAkB,EAClB,UAA8B;QAE9B,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;QAE1C,UAAU,CAAC,KAAK,GAAG,KAAK,WAAW,GAAG,IAAe;YACpD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAEvE,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;gBAC5B,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAEpD,IAAI,YAAY,CAAC;gBAEjB,MAAM,OAAO,GACZ,UAAU,EAAE,WAAW,EAAE,IAAI,KAAK,eAAe;oBACjD,UAAU,EAAE,WAAW,EAAE,IAAI,KAAK,SAAS,CAAC;gBAC7C,IAAI,OAAO,EAAE,CAAC;oBACb,YAAY,GAAG,MAAM,UAAU,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACP,YAAY,GAAG,UAAU,CAAC;gBAC3B,CAAC;gBACD,OAAO,YAAY,CAAC;YACrB,CAAC,CAAC;YAEF,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC;gBACtD,+CAA+C;gBAC/C,OAAO,SAAS,EAAE,CAAC;YACpB,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,iCAAiC,EAAE,CAAC;gBAC/C,MAAM,CAAC,iCAAiC,GAAG,EAAE,CAAC;YAC/C,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,iCAAiC,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzD,MAAM,CAAC,iCAAiC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;oBAChE,IAAI,CAAC;wBACJ,IAAI,CAAC;4BACJ,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,OAAO,CAAU,QAAQ,CAAC,CAAC;4BAC/D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gCACzB,OAAO,KAAK,CAAC;4BACd,CAAC;wBACF,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACd,OAAO,CAAC,IAAI,CAAC,2CAA2C,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;wBAC1E,CAAC;wBAED,MAAM,YAAY,GAAG,MAAM,SAAS,EAAE,CAAC;wBAEvC,IAAI,CAAC;4BACJ,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;wBAChE,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACd,OAAO,CAAC,IAAI,CAAC,qDAAqD,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;wBACpF,CAAC;wBACD,OAAO,YAAY,CAAC;oBACrB,CAAC;4BAAS,CAAC;wBACV,8BAA8B;wBAC9B,MAAM,CAAC,iCAAkC,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;oBACjE,CAAC;gBACF,CAAC,CAAC,EAAE,CAAC;YACN,CAAC;YAED,OAAO,MAAM,CAAC,iCAAiC,CAAC,QAAQ,CAAC,CAAC;QAC3D,CAAC,CAAC;QAEF,OAAO,UAAU,CAAC;IACnB,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -5,4 +5,4 @@ import { IMultiIAsynchronousCacheType, IMultiSynchronousCacheType } from '../typ
|
|
|
5
5
|
export interface IMultiCacheKeyStrategy {
|
|
6
6
|
getKey(className: string, methodName: string, parameter: unknown, args: unknown[], phase: 'read' | 'write'): string | undefined;
|
|
7
7
|
}
|
|
8
|
-
export declare function MultiCache(cachingStrategies: (IMultiIAsynchronousCacheType | IMultiSynchronousCacheType)[], parameterIndex?: number, keyStrategy?: IMultiCacheKeyStrategy): (target:
|
|
8
|
+
export declare function MultiCache(cachingStrategies: (IMultiIAsynchronousCacheType | IMultiSynchronousCacheType)[], parameterIndex?: number, keyStrategy?: IMultiCacheKeyStrategy): (target: object, methodName: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
|
@@ -4,9 +4,7 @@ const defaultKeyStrategy = {
|
|
|
4
4
|
}
|
|
5
5
|
};
|
|
6
6
|
export function MultiCache(cachingStrategies, parameterIndex = 0, keyStrategy = defaultKeyStrategy) {
|
|
7
|
-
return function (
|
|
8
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
9
|
-
target, methodName, descriptor) {
|
|
7
|
+
return function (target, methodName, descriptor) {
|
|
10
8
|
const originalMethod = descriptor.value;
|
|
11
9
|
const className = target.constructor.name;
|
|
12
10
|
descriptor.value = async function (...args) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multicache.decorator.js","sourceRoot":"","sources":["../../src/decorator/multicache.decorator.ts"],"names":[],"mappings":"AAeA,MAAM,kBAAkB,GAA2B;IAClD,MAAM,CACL,SAAiB,EACjB,UAAkB,EAClB,SAAkB,EAClB,IAAe,EACf,MAAwB;QAExB,OAAO,GAAG,SAAS,IAAI,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1F,CAAC;CACD,CAAC;AAEF,MAAM,UAAU,UAAU,CACzB,iBAAgF,EAChF,cAAc,GAAG,CAAC,EAClB,cAAsC,kBAAkB;IAExD,OAAO
|
|
1
|
+
{"version":3,"file":"multicache.decorator.js","sourceRoot":"","sources":["../../src/decorator/multicache.decorator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { ISyncKeyStrategy } from '../types/key.strategy.types.js';
|
|
2
2
|
import { ISynchronousCacheType, ICacheOptions } from '../types/cache.types.js';
|
|
3
|
-
export declare function SyncCache(cachingStrategy: ISynchronousCacheType, options?: ICacheOptions, keyStrategy?: ISyncKeyStrategy): (target:
|
|
3
|
+
export declare function SyncCache(cachingStrategy: ISynchronousCacheType, options?: ICacheOptions, keyStrategy?: ISyncKeyStrategy): (target: object, methodName: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { JSONStringifyKeyStrategy } from '../strategy/key/json.stringify.strategy.js';
|
|
2
2
|
const defaultKeyStrategy = new JSONStringifyKeyStrategy();
|
|
3
3
|
export function SyncCache(cachingStrategy, options, keyStrategy = defaultKeyStrategy) {
|
|
4
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
5
4
|
return function (target, methodName, descriptor) {
|
|
6
5
|
const originalMethod = descriptor.value;
|
|
7
6
|
const className = target.constructor.name;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synccache.decorator.js","sourceRoot":"","sources":["../../src/decorator/synccache.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAItF,MAAM,kBAAkB,GAAG,IAAI,wBAAwB,EAAE,CAAC;AAE1D,MAAM,UAAU,SAAS,CACxB,eAAsC,EACtC,OAAuB,EACvB,cAAgC,kBAAkB;IAElD,
|
|
1
|
+
{"version":3,"file":"synccache.decorator.js","sourceRoot":"","sources":["../../src/decorator/synccache.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAItF,MAAM,kBAAkB,GAAG,IAAI,wBAAwB,EAAE,CAAC;AAE1D,MAAM,UAAU,SAAS,CACxB,eAAsC,EACtC,OAAuB,EACvB,cAAgC,kBAAkB;IAElD,OAAO,UAAU,MAAc,EAAE,UAAkB,EAAE,UAA8B;QAClF,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;QAE1C,UAAU,CAAC,KAAK,GAAG,UAAU,GAAG,IAAe;YAC9C,MAAM,SAAS,GAAG,GAAG,EAAE;gBACtB,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAEtD,MAAM,OAAO,GACZ,YAAY,EAAE,WAAW,EAAE,IAAI,KAAK,eAAe;oBACnD,YAAY,EAAE,WAAW,EAAE,IAAI,KAAK,SAAS,CAAC;gBAE/C,IAAI,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBAChE,CAAC;gBAED,OAAO,YAAY,CAAC;YACrB,CAAC,CAAC;YAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAEjE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,OAAO,SAAS,EAAE,CAAC;YACpB,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAChD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,KAAK,CAAC;gBACd,CAAC;YACF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,2CAA2C,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC1E,CAAC;YACD,MAAM,YAAY,GAAG,SAAS,EAAE,CAAC;YAEjC,IAAI,CAAC;gBACJ,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAC1D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,qDAAqD,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YACpF,CAAC;YACD,OAAO,YAAY,CAAC;QACrB,CAAC,CAAC;QAEF,OAAO,UAAU,CAAC;IACnB,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.json.storage.js","sourceRoot":"","sources":["../../../src/storage/fs/fs.json.storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAKpE,MAAM,OAAO,aAAa;
|
|
1
|
+
{"version":3,"file":"fs.json.storage.js","sourceRoot":"","sources":["../../../src/storage/fs/fs.json.storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAKpE,MAAM,OAAO,aAAa;IACN;IAAnB,YAAmB,YAAoB;QAApB,iBAAY,GAAZ,YAAY,CAAQ;QACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzB,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,OAAO,CAAI,GAAW;QAClC,OAAO,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,CAAkB,CAAC;IAC5D,CAAC;IAEM,KAAK,CAAC,OAAO,CAAc,GAAW,EAAE,OAAsB;QACpE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;QACrB,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAEM,KAAK,CAAC,KAAK;QACjB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC/B,CAAC;IAEO,gBAAgB;QACvB,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,QAAqB;QAC3C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE;gBAC5D,IAAI,GAAG,EAAE,CAAC;oBACT,MAAM,CAAC,GAAG,CAAC,CAAC;oBACZ,OAAO;gBACR,CAAC;gBACD,OAAO,EAAE,CAAC;YACX,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc;QAC3B,MAAM,WAAW,GAAW,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBAC3C,IAAI,GAAG,EAAE,CAAC;oBACT,MAAM,CAAC,GAAG,CAAC,CAAC;oBACZ,OAAO;gBACR,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAgB,CAAC;IAC1D,CAAC;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.storage.js","sourceRoot":"","sources":["../../../src/storage/memory/memory.storage.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;
|
|
1
|
+
{"version":3,"file":"memory.storage.js","sourceRoot":"","sources":["../../../src/storage/memory/memory.storage.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IACjB,QAAQ,GAA4B,EAAE,CAAC;IAExC,OAAO,CAAI,GAAW;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAkB,CAAC;IAC5C,CAAC;IAEM,OAAO,CAAc,GAAW,EAAE,OAAsB;QAC9D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IAC9B,CAAC;IAEM,KAAK;QACX,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACpB,CAAC;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract.base.strategy.js","sourceRoot":"","sources":["../../../src/strategy/caching/abstract.base.strategy.ts"],"names":[],"mappings":"AAMA,MAAM,OAAgB,oBAAoB;
|
|
1
|
+
{"version":3,"file":"abstract.base.strategy.js","sourceRoot":"","sources":["../../../src/strategy/caching/abstract.base.strategy.ts"],"names":[],"mappings":"AAMA,MAAM,OAAgB,oBAAoB;IACnB;IAAtB,YAAsB,OAAuD;QAAvD,YAAO,GAAP,OAAO,CAAgD;IAAG,CAAC;CAWjF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expiration.strategy.js","sourceRoot":"","sources":["../../../src/strategy/caching/expiration.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAoBnE,MAAM,OAAO,kBAAmB,SAAQ,oBAAoB;IACpD,KAAK,CAAC,OAAO,CAAI,GAAW;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAwB,GAAG,CAAC,CAAC;QACpE,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"expiration.strategy.js","sourceRoot":"","sources":["../../../src/strategy/caching/expiration.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAoBnE,MAAM,OAAO,kBAAmB,SAAQ,oBAAoB;IACpD,KAAK,CAAC,OAAO,CAAI,GAAW;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAwB,GAAG,CAAC,CAAC;QACpE,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC3C,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACxC,CAAC;IAED,0DAA0D;IAClD,YAAY,CACnB,IAAiC;QAEjC,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC;IACjE,CAAC;IAEM,KAAK,CAAC,OAAO,CACnB,GAAW,EACX,OAAsB,EACtB,OAAuB;QAEvB,MAAM,aAAa,GAAuB;YACzC,GAAG,EAAE,EAAE;YACP,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,KAAK;YACtB,GAAG,OAAO;SACV,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,aAAa,CAAC,eAAe,IAAI;YAC9C,GAAG,EAAE,aAAa,CAAC,GAAG,GAAG,IAAI;YAC7B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC;QAEF,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YACnC,UAAU,CAAC,GAAG,EAAE;gBACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACd,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,KAAK;QACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAEO,aAAa,CAAC,IAAsC;QAC3D,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACzD,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,GAAW;QACjC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;CACD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@node-ts-cache/core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Simple and extensible caching module supporting decorators",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"node",
|
|
@@ -31,8 +31,12 @@
|
|
|
31
31
|
"Himmet Avsar <avsar.himmet1@gmail.com>"
|
|
32
32
|
],
|
|
33
33
|
"type": "module",
|
|
34
|
-
"
|
|
35
|
-
|
|
34
|
+
"exports": {
|
|
35
|
+
".": {
|
|
36
|
+
"types": "./dist/index.d.ts",
|
|
37
|
+
"import": "./dist/index.js"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
36
40
|
"files": [
|
|
37
41
|
"dist"
|
|
38
42
|
],
|
|
@@ -51,8 +55,6 @@
|
|
|
51
55
|
"build": "tsc -p .",
|
|
52
56
|
"clean": "git clean -fdx src",
|
|
53
57
|
"dev": "tsc -p . -w",
|
|
54
|
-
"
|
|
55
|
-
"tdd-debug-brk": "mocha --loader=ts-node/esm --inspect-brk",
|
|
56
|
-
"test": "mocha --loader=ts-node/esm test/**/*.test.ts"
|
|
58
|
+
"test": "vitest run"
|
|
57
59
|
}
|
|
58
60
|
}
|