@mrjasonroy/cache-components-cache-handler 16.0.1 → 16.0.4
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 +136 -364
- package/dist/handlers/composite.d.ts +2 -2
- package/dist/handlers/composite.d.ts.map +1 -1
- package/dist/handlers/composite.js +3 -3
- package/dist/handlers/composite.js.map +1 -1
- package/dist/handlers/memory.d.ts +2 -2
- package/dist/handlers/memory.d.ts.map +1 -1
- package/dist/handlers/memory.js +6 -1
- package/dist/handlers/memory.js.map +1 -1
- package/dist/handlers/redis.d.ts +2 -2
- package/dist/handlers/redis.d.ts.map +1 -1
- package/dist/handlers/redis.js +6 -1
- package/dist/handlers/redis.js.map +1 -1
- package/dist/types.d.ts +24 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,442 +1,214 @@
|
|
|
1
1
|
# @mrjasonroy/cache-components-cache-handler
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Cache handler for Next.js 16+ with support for Cache Components and "use cache" directive.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
> Why another cache handler? I was originally going to contribute to [fortedigital/nextjs-cache-handler](https://github.com/fortedigital/nextjs-cache-handler) but that project is focused on backwards compatibility and carries a lot of legacy baggage. This repo is a ground-up rewrite that:
|
|
6
|
+
> - Targets **Next.js 16+ only** (Cache Components, `"use cache"`, `cacheLife`, etc.)
|
|
7
|
+
> - Ships with **true E2E coverage** (Playwright + Next 16) for every backend
|
|
8
|
+
> - Keeps the surface area small: zero-config memory handler for dev, Redis/Valkey/ElastiCache factory for prod
|
|
9
|
+
> - Provides an AI-first workflow so contributors (human or agent) can ship confidently
|
|
6
10
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
- ✅ **TTL support** - Time-based expiration
|
|
13
|
-
- ✅ **Zero dependencies** - Lightweight and fast
|
|
14
|
-
- ✅ **Comprehensive tests** - 31 tests, 100% coverage
|
|
11
|
+
[](https://www.npmjs.com/package/@mrjasonroy/cache-components-cache-handler)
|
|
12
|
+
[](https://opensource.org/licenses/MIT)
|
|
13
|
+
[](https://www.typescriptlang.org/)
|
|
14
|
+
[](https://nextjs.org/)
|
|
15
|
+
[](https://github.com/mrjasonroy/cache-components-cache-handler/tree/main/apps/e2e-test-app)
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
**📦 [View on npm](https://www.npmjs.com/package/@mrjasonroy/cache-components-cache-handler) | 🚀 [Releases](https://github.com/mrjasonroy/cache-components-cache-handler/releases)**
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
npm install @mrjasonroy/cache-components-cache-handler
|
|
20
|
-
# or
|
|
21
|
-
pnpm add @mrjasonroy/cache-components-cache-handler
|
|
22
|
-
# or
|
|
23
|
-
yarn add @mrjasonroy/cache-components-cache-handler
|
|
24
|
-
```
|
|
19
|
+
## What This Does
|
|
25
20
|
|
|
26
|
-
|
|
21
|
+
Implements Next.js 16+ caching APIs:
|
|
22
|
+
- `"use cache"` directive
|
|
23
|
+
- `cacheLife()` - Configure cache lifetime
|
|
24
|
+
- `cacheTag()` - Tag cache entries
|
|
25
|
+
- `revalidateTag()` - Invalidate by tags
|
|
26
|
+
- `updateTag()` - Update tags
|
|
27
|
+
- `revalidatePath()` - Invalidate by path
|
|
28
|
+
- Cache Components and PPR
|
|
27
29
|
|
|
28
|
-
|
|
30
|
+
## Supported Backends
|
|
29
31
|
|
|
30
|
-
Next.js 16
|
|
31
|
-
1. **ISR Cache** (`cacheHandler`) - For Incremental Static Regeneration
|
|
32
|
-
2. **Data Cache** (`cacheHandlers`) - For `"use cache"` and `"use cache: remote"`
|
|
32
|
+
All backends are **integration tested** with Next.js 16+ in CI so you can trust a release tag.
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
| Backend | Use Case | Key Features |
|
|
35
|
+
|---------|----------|--------------|
|
|
36
|
+
| **Memory** | Development, Single-instance | Zero config, fast, no external dependencies |
|
|
37
|
+
| **Redis** | Production, Distributed | Industry standard, high performance, clustering |
|
|
38
|
+
| **Valkey** | Production, Open Source | Redis-compatible, LGPL licensed, drop-in replacement |
|
|
39
|
+
| **AWS ElastiCache** | Production, Managed | Fully managed, IAM auth, auto-scaling, high availability |
|
|
35
40
|
|
|
36
|
-
|
|
37
|
-
// next.config.mjs
|
|
38
|
-
import { createCacheConfig } from "@mrjasonroy/cache-components-cache-handler";
|
|
39
|
-
import { resolve } from "path";
|
|
41
|
+
## Install
|
|
40
42
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
dataCacheHandlerPath: resolve(process.cwd(), "./data-cache-handler.mjs"),
|
|
44
|
-
});
|
|
43
|
+
```bash
|
|
44
|
+
npm install @mrjasonroy/cache-components-cache-handler
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
...cacheConfig,
|
|
49
|
-
// Rest of your Next.js config
|
|
50
|
-
};
|
|
46
|
+
# For Redis/Valkey/ElastiCache, also install ioredis
|
|
47
|
+
npm install ioredis
|
|
51
48
|
```
|
|
52
49
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
```javascript
|
|
56
|
-
// cache-handler.mjs (ISR Cache)
|
|
57
|
-
import { createMemoryCacheHandler } from "@mrjasonroy/cache-components-cache-handler";
|
|
50
|
+
## Quick Start
|
|
58
51
|
|
|
59
|
-
|
|
60
|
-
maxItemsNumber: 1000,
|
|
61
|
-
maxItemSizeBytes: 100 * 1024 * 1024, // 100MB
|
|
62
|
-
});
|
|
63
|
-
```
|
|
52
|
+
### Zero-Config (Recommended)
|
|
64
53
|
|
|
65
54
|
```javascript
|
|
66
|
-
// data-cache-handler.mjs
|
|
55
|
+
// data-cache-handler.mjs
|
|
67
56
|
import { createCacheHandler } from "@mrjasonroy/cache-components-cache-handler";
|
|
68
57
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
url: process.env.REDIS_URL,
|
|
72
|
-
password: process.env.REDIS_PASSWORD,
|
|
73
|
-
debug: process.env.NODE_ENV === "development",
|
|
74
|
-
});
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### Multi-Tier Caching
|
|
58
|
+
// Memory (dev)
|
|
59
|
+
export default createCacheHandler({ type: "memory" });
|
|
78
60
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
import {
|
|
82
|
-
createCompositeHandler,
|
|
83
|
-
createMemoryCacheHandler,
|
|
84
|
-
RedisCacheHandler,
|
|
85
|
-
} from "@mrjasonroy/cache-components-cache-handler";
|
|
86
|
-
|
|
87
|
-
const memoryHandler = createMemoryCacheHandler({
|
|
88
|
-
maxItemsNumber: 100, // Small L1 cache
|
|
89
|
-
});
|
|
61
|
+
// Redis (production)
|
|
62
|
+
export default createCacheHandler({ type: "redis" });
|
|
90
63
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
defaultTTL: 3600,
|
|
94
|
-
});
|
|
64
|
+
// Valkey (production)
|
|
65
|
+
export default createCacheHandler({ type: "valkey" });
|
|
95
66
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
handlers: [memoryHandler, redisHandler],
|
|
99
|
-
// Optional: route based on tags
|
|
100
|
-
setStrategy: (data) => {
|
|
101
|
-
if (data.tags.includes("memory-only")) {
|
|
102
|
-
return 0; // Use memory handler
|
|
103
|
-
}
|
|
104
|
-
return 1; // Use Redis handler
|
|
105
|
-
},
|
|
106
|
-
}),
|
|
107
|
-
};
|
|
67
|
+
// ElastiCache (AWS)
|
|
68
|
+
export default createCacheHandler({ type: "elasticache" });
|
|
108
69
|
```
|
|
109
70
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
### `createCacheConfig(options)`
|
|
113
|
-
|
|
114
|
-
Helper function to generate Next.js 16 cache configuration for both ISR and Data Cache.
|
|
115
|
-
|
|
116
|
-
**Options:**
|
|
117
|
-
|
|
118
|
-
| Option | Type | Required | Description |
|
|
119
|
-
|--------|------|----------|-------------|
|
|
120
|
-
| `isrHandlerPath` | `string` | Yes | Path to ISR cache handler file |
|
|
121
|
-
| `dataCacheHandlerPath` | `string` | Yes | Path to data cache handler file |
|
|
122
|
-
| `disableDefaultMemoryCache` | `boolean` | No | Disable Next.js default memory cache (default: `true`) |
|
|
123
|
-
|
|
124
|
-
**Returns:**
|
|
125
|
-
|
|
126
|
-
```typescript
|
|
127
|
-
{
|
|
128
|
-
cacheHandler: string; // ISR cache handler path
|
|
129
|
-
cacheHandlers: {
|
|
130
|
-
default: string; // "use cache" handler path
|
|
131
|
-
remote: string; // "use cache: remote" handler path
|
|
132
|
-
};
|
|
133
|
-
cacheMaxMemorySize?: number; // 0 if disableDefaultMemoryCache is true
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
**Example:**
|
|
138
|
-
|
|
139
|
-
```typescript
|
|
140
|
-
import { createCacheConfig } from "@mrjasonroy/cache-components-cache-handler";
|
|
141
|
-
import { resolve } from "path";
|
|
142
|
-
|
|
143
|
-
const cacheConfig = createCacheConfig({
|
|
144
|
-
isrHandlerPath: resolve(process.cwd(), "./cache-handler.mjs"),
|
|
145
|
-
dataCacheHandlerPath: resolve(process.cwd(), "./data-cache-handler.mjs"),
|
|
146
|
-
});
|
|
147
|
-
|
|
71
|
+
```javascript
|
|
72
|
+
// next.config.js
|
|
148
73
|
export default {
|
|
149
74
|
cacheComponents: true,
|
|
150
|
-
|
|
75
|
+
cacheHandlers: {
|
|
76
|
+
default: "./data-cache-handler.mjs",
|
|
77
|
+
remote: "./data-cache-handler.mjs",
|
|
78
|
+
},
|
|
79
|
+
cacheMaxMemorySize: 0, // Disable Next's built-in in-memory handler
|
|
151
80
|
};
|
|
152
81
|
```
|
|
153
82
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
83
|
+
**Environment Variables:**
|
|
84
|
+
- `REDIS_URL` / `VALKEY_URL` - Primary connection string for Redis-compatible stores (Valkey works with the same URI format, e.g. `redis://localhost:6380` when using the provided docker-compose service)
|
|
85
|
+
- `REDIS_PASSWORD` - Password/token used when your URL lacks credentials (works for every backend)
|
|
86
|
+
- `ELASTICACHE_ENDPOINT` / `ELASTICACHE_PORT` - AWS ElastiCache hostname + port
|
|
87
|
+
- `ELASTICACHE_TLS` - `"true"`/`"false"` toggle (defaults to `true` for ElastiCache)
|
|
88
|
+
- `ELASTICACHE_AUTH_TOKEN` - Password/token for IAM-authenticated ElastiCache clusters
|
|
157
89
|
|
|
158
|
-
|
|
90
|
+
### Advanced: Custom Configuration
|
|
159
91
|
|
|
160
|
-
|
|
161
|
-
|--------|------|----------|-------------|
|
|
162
|
-
| `isrHandlerPath` | `string` | Yes | Path to ISR cache handler file |
|
|
163
|
-
| `defaultDataCacheHandlerPath` | `string` | Yes | Path for "use cache" (fast, local) |
|
|
164
|
-
| `remoteDataCacheHandlerPath` | `string` | Yes | Path for "use cache: remote" (DB, API) |
|
|
165
|
-
| `disableDefaultMemoryCache` | `boolean` | No | Disable Next.js default memory cache (default: `true`) |
|
|
92
|
+
Need more control? You can override any option:
|
|
166
93
|
|
|
167
|
-
|
|
94
|
+
```javascript
|
|
95
|
+
// data-cache-handler.mjs
|
|
96
|
+
import { createCacheHandler } from "@mrjasonroy/cache-components-cache-handler";
|
|
168
97
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
98
|
+
export default createCacheHandler({
|
|
99
|
+
type: "elasticache",
|
|
100
|
+
endpoint: "cache.prod-cluster.cache.amazonaws.com",
|
|
101
|
+
port: 6380,
|
|
102
|
+
tls: true,
|
|
103
|
+
password: process.env.CACHE_AUTH_TOKEN,
|
|
104
|
+
keyPrefix: "myapp:cache:",
|
|
105
|
+
tagPrefix: "myapp:tags:",
|
|
106
|
+
debug: process.env.NODE_ENV === "development",
|
|
174
107
|
});
|
|
175
108
|
```
|
|
176
109
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
Creates an in-memory LRU cache handler.
|
|
180
|
-
|
|
181
|
-
**Options:**
|
|
182
|
-
|
|
183
|
-
| Option | Type | Default | Description |
|
|
184
|
-
|--------|------|---------|-------------|
|
|
185
|
-
| `maxItemsNumber` | `number` | `1000` | Maximum number of items to store |
|
|
186
|
-
| `maxItemSizeBytes` | `number` | `104857600` (100MB) | Maximum size per item |
|
|
187
|
-
| `defaultTTL` | `number` | `undefined` | Default TTL in seconds |
|
|
188
|
-
|
|
189
|
-
**Features:**
|
|
190
|
-
|
|
191
|
-
- LRU eviction when max size exceeded
|
|
192
|
-
- Automatic expiration based on TTL
|
|
193
|
-
- Tag-based revalidation (explicit and implicit)
|
|
194
|
-
- Size-based rejection of oversized entries
|
|
195
|
-
|
|
196
|
-
**Example:**
|
|
110
|
+
## Usage
|
|
197
111
|
|
|
198
112
|
```typescript
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
### `createCompositeHandler(options)`
|
|
207
|
-
|
|
208
|
-
Creates a composite handler that orchestrates multiple cache handlers.
|
|
209
|
-
|
|
210
|
-
**Options:**
|
|
211
|
-
|
|
212
|
-
| Option | Type | Required | Description |
|
|
213
|
-
|--------|------|----------|-------------|
|
|
214
|
-
| `handlers` | `CacheHandler[]` | Yes | Array of handlers (ordered by priority) |
|
|
215
|
-
| `setStrategy` | `(data) => number` | No | Function to choose which handler to use for writes |
|
|
216
|
-
|
|
217
|
-
**Features:**
|
|
218
|
-
|
|
219
|
-
- First-match read strategy (tries handlers in order)
|
|
220
|
-
- Configurable write strategy
|
|
221
|
-
- Fault tolerance with `Promise.allSettled()`
|
|
222
|
-
- Parallel revalidation across all handlers
|
|
223
|
-
|
|
224
|
-
**Example:**
|
|
113
|
+
// Basic caching
|
|
114
|
+
async function ProductList() {
|
|
115
|
+
"use cache";
|
|
116
|
+
const products = await db.products.findMany();
|
|
117
|
+
return <ProductGrid products={products} />;
|
|
118
|
+
}
|
|
225
119
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
handlers: [memoryHandler, redisHandler],
|
|
229
|
-
setStrategy: (data) => {
|
|
230
|
-
// Cache small items in memory, large items in Redis
|
|
231
|
-
const size = JSON.stringify(data).length;
|
|
232
|
-
return size < 10000 ? 0 : 1;
|
|
233
|
-
},
|
|
234
|
-
});
|
|
235
|
-
```
|
|
120
|
+
// With cache lifetime
|
|
121
|
+
import { cacheLife } from "next/cache";
|
|
236
122
|
|
|
237
|
-
|
|
123
|
+
async function BlogPost({ id }: { id: string }) {
|
|
124
|
+
"use cache";
|
|
125
|
+
cacheLife("hours"); // 1 hour
|
|
126
|
+
const post = await db.posts.findUnique({ where: { id } });
|
|
127
|
+
return <Article post={post} />;
|
|
128
|
+
}
|
|
238
129
|
|
|
239
|
-
|
|
130
|
+
// With tags for selective invalidation
|
|
131
|
+
import { cacheTag } from "next/cache";
|
|
240
132
|
|
|
241
|
-
|
|
242
|
-
// app/page.tsx
|
|
243
|
-
export default async function Page() {
|
|
133
|
+
async function UserProfile({ userId }: { userId: string }) {
|
|
244
134
|
"use cache";
|
|
245
|
-
|
|
246
|
-
|
|
135
|
+
cacheTag("user-profile", `user:${userId}`);
|
|
136
|
+
const user = await db.user.findUnique({ where: { id: userId } });
|
|
137
|
+
return <Profile user={user} />;
|
|
247
138
|
}
|
|
248
139
|
|
|
249
|
-
//
|
|
140
|
+
// Invalidate from API route
|
|
250
141
|
import { revalidateTag } from "next/cache";
|
|
251
142
|
|
|
252
143
|
export async function POST(request: Request) {
|
|
253
|
-
const {
|
|
254
|
-
revalidateTag(
|
|
144
|
+
const { userId } = await request.json();
|
|
145
|
+
revalidateTag(`user:${userId}`);
|
|
255
146
|
return Response.json({ revalidated: true });
|
|
256
147
|
}
|
|
257
148
|
```
|
|
258
149
|
|
|
259
|
-
|
|
150
|
+
## Cache Handler API
|
|
260
151
|
|
|
261
|
-
|
|
262
|
-
// app/page.tsx
|
|
263
|
-
export default async function Page() {
|
|
264
|
-
"use cache";
|
|
265
|
-
export const revalidate = 3600; // Revalidate after 1 hour
|
|
266
|
-
|
|
267
|
-
return <div>Cached for 1 hour</div>;
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
### Custom Cache Tags
|
|
152
|
+
This library implements the Next.js 16+ `DataCacheHandler` interface:
|
|
272
153
|
|
|
273
154
|
```typescript
|
|
274
|
-
|
|
275
|
-
|
|
155
|
+
interface DataCacheHandler {
|
|
156
|
+
// Retrieve cached entry for a cache key
|
|
157
|
+
get(cacheKey: string, softTags: string[]): Promise<DataCacheEntry | undefined>;
|
|
276
158
|
|
|
277
|
-
|
|
159
|
+
// Store a cache entry (handles streaming responses)
|
|
160
|
+
set(cacheKey: string, pendingEntry: Promise<DataCacheEntry>): Promise<void>;
|
|
278
161
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
return fetch("https://api.example.com/data").then((res) => res.json());
|
|
282
|
-
},
|
|
283
|
-
["api-data"],
|
|
284
|
-
{
|
|
285
|
-
tags: ["api-data", "user-data"],
|
|
286
|
-
revalidate: 3600,
|
|
287
|
-
},
|
|
288
|
-
);
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
## How It Works
|
|
292
|
-
|
|
293
|
-
### Implicit vs Explicit Tags
|
|
294
|
-
|
|
295
|
-
Next.js 16 uses two types of tags:
|
|
296
|
-
|
|
297
|
-
1. **Explicit tags** - User-defined tags (e.g., `["user-123", "posts"]`)
|
|
298
|
-
2. **Implicit tags** - System-generated tags with `_N_T_` prefix for ISR
|
|
299
|
-
|
|
300
|
-
The handler tracks both types separately for efficient revalidation.
|
|
301
|
-
|
|
302
|
-
### LRU Eviction
|
|
303
|
-
|
|
304
|
-
When the cache reaches `maxItemsNumber`:
|
|
305
|
-
|
|
306
|
-
1. The oldest (least recently used) entry is evicted
|
|
307
|
-
2. Entries are moved to the end on each access
|
|
308
|
-
3. New entries are always added at the end
|
|
309
|
-
|
|
310
|
-
### TTL Expiration
|
|
311
|
-
|
|
312
|
-
Entries can expire based on:
|
|
313
|
-
|
|
314
|
-
1. `revalidate` value in cache context (seconds)
|
|
315
|
-
2. `defaultTTL` if no revalidate specified
|
|
316
|
-
3. Never expire if `revalidate: false`
|
|
317
|
-
|
|
318
|
-
Expiration is checked on every `get()` call (lazy expiration).
|
|
319
|
-
|
|
320
|
-
## Type Definitions
|
|
321
|
-
|
|
322
|
-
```typescript
|
|
323
|
-
interface CacheHandler {
|
|
324
|
-
name: string;
|
|
325
|
-
get(key: string, meta?: CacheHandlerGetMeta): Promise<CacheValue | null>;
|
|
326
|
-
set(key: string, value: CacheValue, context?: CacheHandlerContext): Promise<void>;
|
|
327
|
-
revalidateTag(tag: string): Promise<void>;
|
|
328
|
-
delete?(key: string): Promise<void>;
|
|
329
|
-
}
|
|
162
|
+
// Called periodically to refresh local tag manifest
|
|
163
|
+
refreshTags(): Promise<void>;
|
|
330
164
|
|
|
331
|
-
|
|
332
|
-
tags
|
|
333
|
-
revalidate?: number | false;
|
|
334
|
-
softTags?: string[];
|
|
335
|
-
}
|
|
165
|
+
// Get maximum revalidation timestamp for tags
|
|
166
|
+
getExpiration(tags: string[]): Promise<Timestamp>;
|
|
336
167
|
|
|
337
|
-
|
|
338
|
-
|
|
168
|
+
// Called when revalidateTag() invalidates tags
|
|
169
|
+
updateTags(tags: string[], durations?: { expire?: number }): Promise<void>;
|
|
339
170
|
}
|
|
340
171
|
```
|
|
341
172
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
```bash
|
|
345
|
-
# Run tests
|
|
346
|
-
pnpm test
|
|
347
|
-
|
|
348
|
-
# Run tests in watch mode
|
|
349
|
-
pnpm test:watch
|
|
350
|
-
|
|
351
|
-
# Run with coverage
|
|
352
|
-
pnpm test --coverage
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
## Performance
|
|
173
|
+
When you call `revalidateTag('my-tag')` in your application, Next.js internally calls our `updateTags(['my-tag'])` implementation, which marks all cache entries with that tag as stale.
|
|
356
174
|
|
|
357
|
-
|
|
175
|
+
## Documentation
|
|
358
176
|
|
|
359
|
-
-
|
|
360
|
-
-
|
|
361
|
-
-
|
|
362
|
-
-
|
|
363
|
-
- Efficient LRU implementation
|
|
177
|
+
- [GitHub Repository](https://github.com/mrjasonroy/cache-components-cache-handler)
|
|
178
|
+
- [Redis Configuration](https://github.com/mrjasonroy/cache-components-cache-handler/blob/main/docs/redis.md)
|
|
179
|
+
- [Valkey & ElastiCache Setup](https://github.com/mrjasonroy/cache-components-cache-handler/blob/main/docs/redis.md#valkey)
|
|
180
|
+
- [Contributing](https://github.com/mrjasonroy/cache-components-cache-handler/blob/main/CONTRIBUTING.md)
|
|
364
181
|
|
|
365
|
-
|
|
182
|
+
## CI & Test Matrix
|
|
366
183
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
### From Next.js Built-in Cache
|
|
374
|
-
|
|
375
|
-
```diff
|
|
376
|
-
// next.config.js
|
|
377
|
-
+ import { createMemoryCacheHandler } from "@mrjasonroy/cache-components-cache-handler";
|
|
378
|
-
|
|
379
|
-
export default {
|
|
380
|
-
+ cacheHandler: createMemoryCacheHandler(),
|
|
381
|
-
};
|
|
382
|
-
```
|
|
184
|
+
| Workflow | What it Verifies |
|
|
185
|
+
|----------|------------------|
|
|
186
|
+
| **CI** | Biome lint + format check, typecheck, Vitest, and Playwright e2e suites against Memory, Redis, Valkey, and ElastiCache-mode backends |
|
|
187
|
+
| **Next.js Canary Test** | Daily compatibility runs against Next.js canary/rc/latest to catch upstream breakage |
|
|
188
|
+
| **Next.js Version Check** | Nightly scan for new Next.js releases, opens PRs to bump peer deps |
|
|
189
|
+
| **Publish** | Trusted publishing with provenance – release tags must pass the full matrix before npm sees them |
|
|
383
190
|
|
|
384
|
-
|
|
191
|
+
## Development
|
|
385
192
|
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
import { createRedisHandler } from "./redis-handler";
|
|
393
|
-
|
|
394
|
-
export default {
|
|
395
|
-
- cacheHandler: createRedisHandler(),
|
|
396
|
-
+ cacheHandler: createCompositeHandler({
|
|
397
|
-
+ handlers: [
|
|
398
|
-
+ createMemoryCacheHandler({ maxItemsNumber: 100 }), // L1 cache
|
|
399
|
-
+ createRedisHandler(), // L2 cache
|
|
400
|
-
+ ],
|
|
401
|
-
+ }),
|
|
402
|
-
};
|
|
193
|
+
```bash
|
|
194
|
+
git clone https://github.com/mrjasonroy/cache-components-cache-handler
|
|
195
|
+
cd cache-components-cache-handler
|
|
196
|
+
pnpm install
|
|
197
|
+
pnpm build
|
|
198
|
+
pnpm test
|
|
403
199
|
```
|
|
404
200
|
|
|
405
|
-
## Troubleshooting
|
|
406
|
-
|
|
407
|
-
### Cache not working
|
|
408
|
-
|
|
409
|
-
1. Check Next.js version (requires 16.0.0+)
|
|
410
|
-
2. Verify `"use cache"` directive is at top of component/function
|
|
411
|
-
3. Check browser/server console for errors
|
|
412
|
-
|
|
413
|
-
### Memory usage too high
|
|
414
|
-
|
|
415
|
-
1. Reduce `maxItemsNumber`
|
|
416
|
-
2. Reduce `maxItemSizeBytes`
|
|
417
|
-
3. Add TTL with `defaultTTL`
|
|
418
|
-
4. Use composite handler with Redis for large caches
|
|
419
|
-
|
|
420
|
-
### Revalidation not working
|
|
421
|
-
|
|
422
|
-
1. Verify tags are correctly defined
|
|
423
|
-
2. Check `revalidateTag()` is called on server
|
|
424
|
-
3. Ensure implicit tags are passed to `get()`
|
|
425
|
-
|
|
426
201
|
## Contributing
|
|
427
202
|
|
|
428
|
-
This project is
|
|
429
|
-
|
|
430
|
-
## License
|
|
203
|
+
This project is AI-friendly and contributor-friendly.
|
|
431
204
|
|
|
432
|
-
|
|
205
|
+
- **For AI Agents:** See [CLAUDE.md](https://github.com/mrjasonroy/cache-components-cache-handler/blob/main/CLAUDE.md) for instructions
|
|
206
|
+
- **For Humans:** See [CONTRIBUTING.md](https://github.com/mrjasonroy/cache-components-cache-handler/blob/main/CONTRIBUTING.md)
|
|
433
207
|
|
|
434
|
-
##
|
|
208
|
+
## License
|
|
435
209
|
|
|
436
|
-
|
|
437
|
-
- [Documentation](https://github.com/mrjasonroy/cache-components-cache-handler)
|
|
210
|
+
MIT © [Jason Roy](https://github.com/mrjasonroy)
|
|
438
211
|
|
|
439
|
-
##
|
|
212
|
+
## Acknowledgments
|
|
440
213
|
|
|
441
|
-
|
|
442
|
-
- [@mrjasonroy/cache-components-cache-handler-redis](../cache-handler-redis) - Redis implementation
|
|
214
|
+
Forked from/Inspired by [@fortedigital/nextjs-cache-handler](https://github.com/fortedigital/nextjs-cache-handler), but focusing only on supporting Next.js 16+ and the new caching system.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CacheHandler, CacheHandlerContext, CacheHandlerGetMeta, CacheHandlerOptions, CacheHandlerValue, CacheValue } from "../types.js";
|
|
1
|
+
import type { CacheHandler, CacheHandlerContext, CacheHandlerGetMeta, CacheHandlerGetResult, CacheHandlerOptions, CacheHandlerValue, CacheValue } from "../types.js";
|
|
2
2
|
export interface CompositeHandlerOptions extends CacheHandlerOptions {
|
|
3
3
|
/**
|
|
4
4
|
* Array of cache handlers to use (ordered by priority)
|
|
@@ -41,7 +41,7 @@ export declare class CompositeHandler implements CacheHandler {
|
|
|
41
41
|
private readonly handlers;
|
|
42
42
|
private readonly setStrategy?;
|
|
43
43
|
constructor(options: CompositeHandlerOptions);
|
|
44
|
-
get(key: string, meta?: CacheHandlerGetMeta): Promise<
|
|
44
|
+
get(key: string, meta?: CacheHandlerGetMeta): Promise<CacheHandlerGetResult | null>;
|
|
45
45
|
set(key: string, value: CacheValue, context?: CacheHandlerContext): Promise<void>;
|
|
46
46
|
revalidateTag(tag: string, profile?: string | {
|
|
47
47
|
expire?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composite.d.ts","sourceRoot":"","sources":["../../src/handlers/composite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAClE;;;OAGG;IACH,QAAQ,EAAE,YAAY,EAAE,CAAC;IAEzB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,MAAM,CAAC;CACnD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACnD,SAAgB,IAAI,eAAe;IAEnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAsC;gBAEvD,OAAO,EAAE,uBAAuB;IAStC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"composite.d.ts","sourceRoot":"","sources":["../../src/handlers/composite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAClE;;;OAGG;IACH,QAAQ,EAAE,YAAY,EAAE,CAAC;IAEzB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,MAAM,CAAC;CACnD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACnD,SAAgB,IAAI,eAAe;IAEnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAsC;gBAEvD,OAAO,EAAE,uBAAuB;IAStC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAiBnF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BjF,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAezC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,gBAAgB,CAEzF"}
|
|
@@ -36,9 +36,9 @@ export class CompositeHandler {
|
|
|
36
36
|
// Try handlers in order, return first hit
|
|
37
37
|
for (const handler of this.handlers) {
|
|
38
38
|
try {
|
|
39
|
-
const
|
|
40
|
-
if (
|
|
41
|
-
return
|
|
39
|
+
const result = await handler.get(key, meta);
|
|
40
|
+
if (result !== null) {
|
|
41
|
+
return result;
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composite.js","sourceRoot":"","sources":["../../src/handlers/composite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"composite.js","sourceRoot":"","sources":["../../src/handlers/composite.ts"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,gBAAgB;IACX,IAAI,GAAG,WAAW,CAAC;IAElB,QAAQ,CAAiB;IACzB,WAAW,CAAuC;IAEnE,YAAY,OAAgC;QAC1C,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,IAA0B;QAC/C,0CAA0C;QAC1C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC5C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,yCAAyC;gBACzC,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,CAAC,IAAI,UAAU,EAAE,KAAK,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAiB,EAAE,OAA6B;QACrE,2DAA2D;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,iBAAiB,GAAsB;YAC3C,YAAY,EAAE,GAAG;YACjB,QAAQ,EAAE,IAAI,EAAE,iDAAiD;YACjE,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE;YACzB,KAAK;SACN,CAAC;QAEF,yCAAyC;QACzC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;YACzD,IAAI,YAAY,IAAI,CAAC,IAAI,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC7D,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,sDAAsD;YACtD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CACjE,CAAC;YAEF,iDAAiD;YACjD,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAChC,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBACjC,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAW,EAAE,OAAsC;QACrE,8DAA8D;QAC9D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CACpE,CAAC;QAEF,+BAA+B;QAC/B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAChC,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjC,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,wBAAwB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,2CAA2C;QAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ;aACjC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC;aACzD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAEzD,+BAA+B;QAC/B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAChC,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjC,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACtF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgC;IACrE,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CacheHandler, CacheHandlerContext, CacheHandlerGetMeta, CacheHandlerOptions, CacheValue } from "../types.js";
|
|
1
|
+
import type { CacheHandler, CacheHandlerContext, CacheHandlerGetMeta, CacheHandlerGetResult, CacheHandlerOptions, CacheValue } from "../types.js";
|
|
2
2
|
export interface MemoryCacheHandlerOptions extends CacheHandlerOptions {
|
|
3
3
|
/**
|
|
4
4
|
* Maximum number of items to store (LRU eviction when exceeded)
|
|
@@ -43,7 +43,7 @@ export declare class MemoryCacheHandler implements CacheHandler {
|
|
|
43
43
|
private readonly maxItemSizeBytes;
|
|
44
44
|
private readonly defaultTTL?;
|
|
45
45
|
constructor(options?: MemoryCacheHandlerOptions);
|
|
46
|
-
get(key: string, meta?: CacheHandlerGetMeta): Promise<
|
|
46
|
+
get(key: string, meta?: CacheHandlerGetMeta): Promise<CacheHandlerGetResult | null>;
|
|
47
47
|
set(key: string, value: CacheValue, context?: CacheHandlerContext): Promise<void>;
|
|
48
48
|
revalidateTag(tag: string, _profile?: string | {
|
|
49
49
|
expire?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/handlers/memory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EAEnB,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACrD,SAAgB,IAAI,eAAe;IAEnC,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;gBAEzB,OAAO,GAAE,yBAA8B;IAQ7C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/handlers/memory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EAEnB,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACrD,SAAgB,IAAI,eAAe;IAEnC,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;gBAEzB,OAAO,GAAE,yBAA8B;IAQ7C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAsCnF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjF,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BlF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACH,QAAQ;;;;;CAOT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,kBAAkB,CAEhG"}
|
package/dist/handlers/memory.js
CHANGED
|
@@ -56,7 +56,12 @@ export class MemoryCacheHandler {
|
|
|
56
56
|
// Move to end for LRU (delete and re-add)
|
|
57
57
|
this.cache.delete(key);
|
|
58
58
|
this.cache.set(key, entry);
|
|
59
|
-
|
|
59
|
+
// Return the cache handler result with value and metadata
|
|
60
|
+
return {
|
|
61
|
+
value: entry.value,
|
|
62
|
+
lastModified: entry.lastModified,
|
|
63
|
+
age: Date.now() - entry.lastModified,
|
|
64
|
+
};
|
|
60
65
|
}
|
|
61
66
|
async set(key, value, context) {
|
|
62
67
|
// Calculate size of the entry
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/handlers/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/handlers/memory.ts"],"names":[],"mappings":"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"}
|
package/dist/handlers/redis.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type RedisOptions } from "ioredis";
|
|
2
|
-
import type { CacheHandler, CacheHandlerContext, CacheHandlerGetMeta, CacheHandlerOptions, CacheValue } from "../types.js";
|
|
2
|
+
import type { CacheHandler, CacheHandlerContext, CacheHandlerGetMeta, CacheHandlerGetResult, CacheHandlerOptions, CacheValue } from "../types.js";
|
|
3
3
|
export interface RedisCacheHandlerOptions extends CacheHandlerOptions {
|
|
4
4
|
/**
|
|
5
5
|
* Redis connection options (ioredis)
|
|
@@ -65,7 +65,7 @@ export declare class RedisCacheHandler implements CacheHandler {
|
|
|
65
65
|
private log;
|
|
66
66
|
private getCacheKey;
|
|
67
67
|
private getTagKey;
|
|
68
|
-
get(key: string, meta?: CacheHandlerGetMeta): Promise<
|
|
68
|
+
get(key: string, meta?: CacheHandlerGetMeta): Promise<CacheHandlerGetResult | null>;
|
|
69
69
|
set(key: string, value: CacheValue, context?: CacheHandlerContext): Promise<void>;
|
|
70
70
|
revalidateTag(tag: string, _profile?: string | {
|
|
71
71
|
expire?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/handlers/redis.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EAEnB,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAE9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,SAAgB,IAAI,WAAW;IAE/B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;gBAEpB,OAAO,GAAE,wBAA6B;IA2BlD,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,SAAS;IAIX,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/handlers/redis.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EAEnB,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAE9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,SAAgB,IAAI,WAAW;IAE/B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;gBAEpB,OAAO,GAAE,wBAA6B;IA2BlD,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,SAAS;IAIX,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAoDnF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2DjF,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BlF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}
|
package/dist/handlers/redis.js
CHANGED
|
@@ -100,7 +100,12 @@ export class RedisCacheHandler {
|
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
this.log("GET", cacheKey, "HIT");
|
|
103
|
-
|
|
103
|
+
// Return the cache handler result with value and metadata
|
|
104
|
+
return {
|
|
105
|
+
value: entry.value,
|
|
106
|
+
lastModified: entry.lastModified,
|
|
107
|
+
age: Date.now() - entry.lastModified,
|
|
108
|
+
};
|
|
104
109
|
}
|
|
105
110
|
catch (error) {
|
|
106
111
|
console.error("[RedisCacheHandler] GET error:", error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/handlers/redis.ts"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/handlers/redis.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -116,6 +116,28 @@ export interface CacheHandlerGetMeta {
|
|
|
116
116
|
*/
|
|
117
117
|
implicitTags: string[];
|
|
118
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Return type for cache handler get() method
|
|
121
|
+
* Matches Next.js CacheHandlerValue structure
|
|
122
|
+
*/
|
|
123
|
+
export interface CacheHandlerGetResult {
|
|
124
|
+
/**
|
|
125
|
+
* The actual cache value (ROUTE, PAGE, FETCH, or IMAGE)
|
|
126
|
+
*/
|
|
127
|
+
value: CacheValue | null;
|
|
128
|
+
/**
|
|
129
|
+
* Timestamp of last modification (milliseconds since epoch)
|
|
130
|
+
*/
|
|
131
|
+
lastModified?: number;
|
|
132
|
+
/**
|
|
133
|
+
* Age of the cache entry in milliseconds
|
|
134
|
+
*/
|
|
135
|
+
age?: number;
|
|
136
|
+
/**
|
|
137
|
+
* Cache state metadata (for debugging)
|
|
138
|
+
*/
|
|
139
|
+
cacheState?: string;
|
|
140
|
+
}
|
|
119
141
|
/**
|
|
120
142
|
* Cache handler interface that must be implemented
|
|
121
143
|
*/
|
|
@@ -126,8 +148,9 @@ export interface CacheHandler {
|
|
|
126
148
|
name: string;
|
|
127
149
|
/**
|
|
128
150
|
* Get a cache entry by key
|
|
151
|
+
* Returns an object with the cache value and metadata
|
|
129
152
|
*/
|
|
130
|
-
get(key: string, meta?: CacheHandlerGetMeta): Promise<
|
|
153
|
+
get(key: string, meta?: CacheHandlerGetMeta): Promise<CacheHandlerGetResult | null>;
|
|
131
154
|
/**
|
|
132
155
|
* Set a cache entry
|
|
133
156
|
*/
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CAC7C,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACpC,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEN;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAEpC;;OAEG;IACH,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAExB;;OAEG;IACH,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED