@pantheon-systems/nextjs-cache-handler 0.1.0 → 0.2.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 +110 -0
- package/dist/handlers/base.d.ts +9 -0
- package/dist/handlers/base.d.ts.map +1 -1
- package/dist/handlers/base.js +22 -0
- package/dist/handlers/base.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +2 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/surrogate-key.d.ts +29 -0
- package/dist/middleware/surrogate-key.d.ts.map +1 -0
- package/dist/middleware/surrogate-key.js +66 -0
- package/dist/middleware/surrogate-key.js.map +1 -0
- package/dist/use-cache/file-handler.d.ts +71 -0
- package/dist/use-cache/file-handler.d.ts.map +1 -0
- package/dist/use-cache/file-handler.js +366 -0
- package/dist/use-cache/file-handler.js.map +1 -0
- package/dist/use-cache/gcs-handler.d.ts +64 -0
- package/dist/use-cache/gcs-handler.d.ts.map +1 -0
- package/dist/use-cache/gcs-handler.js +406 -0
- package/dist/use-cache/gcs-handler.js.map +1 -0
- package/dist/use-cache/index.d.ts +58 -0
- package/dist/use-cache/index.d.ts.map +1 -0
- package/dist/use-cache/index.js +87 -0
- package/dist/use-cache/index.js.map +1 -0
- package/dist/use-cache/stream-serialization.d.ts +34 -0
- package/dist/use-cache/stream-serialization.d.ts.map +1 -0
- package/dist/use-cache/stream-serialization.js +96 -0
- package/dist/use-cache/stream-serialization.js.map +1 -0
- package/dist/use-cache/types.d.ts +202 -0
- package/dist/use-cache/types.d.ts.map +1 -0
- package/dist/use-cache/types.js +9 -0
- package/dist/use-cache/types.js.map +1 -0
- package/dist/utils/cache-tag-context.d.ts +66 -0
- package/dist/utils/cache-tag-context.d.ts.map +1 -0
- package/dist/utils/cache-tag-context.js +126 -0
- package/dist/utils/cache-tag-context.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/request-context.d.ts +28 -0
- package/dist/utils/request-context.d.ts.map +1 -0
- package/dist/utils/request-context.js +54 -0
- package/dist/utils/request-context.js.map +1 -0
- package/dist/utils/request-context.test.d.ts +2 -0
- package/dist/utils/request-context.test.d.ts.map +1 -0
- package/dist/utils/request-context.test.js +65 -0
- package/dist/utils/request-context.test.js.map +1 -0
- package/dist/utils/with-surrogate-key.d.ts +32 -0
- package/dist/utils/with-surrogate-key.d.ts.map +1 -0
- package/dist/utils/with-surrogate-key.js +113 -0
- package/dist/utils/with-surrogate-key.js.map +1 -0
- package/package.json +15 -1
package/README.md
CHANGED
|
@@ -150,6 +150,116 @@ await cacheHandler.revalidateTag('posts');
|
|
|
150
150
|
// All entries tagged with 'posts' are invalidated
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
+
## Surrogate-Key Header Propagation
|
|
154
|
+
|
|
155
|
+
The cache handler automatically propagates cache tags to `Surrogate-Key` HTTP response headers, enabling standard CDN cache invalidation workflows.
|
|
156
|
+
|
|
157
|
+
### Quick Setup
|
|
158
|
+
|
|
159
|
+
1. Create or update `middleware.ts` in your app root:
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
export { middleware, config } from '@pantheon-systems/nextjs-cache-handler/middleware';
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
2. That's it! Cache tags now appear in response headers:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# Request a cached page
|
|
169
|
+
curl -I https://your-app.com/blog/my-post
|
|
170
|
+
|
|
171
|
+
# Response includes:
|
|
172
|
+
# Surrogate-Key: blog-posts featured-content api-data
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### How It Works
|
|
176
|
+
|
|
177
|
+
When you use `cacheTag()` in your Next.js code:
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
import { cacheTag, cacheLife } from 'next/cache';
|
|
181
|
+
|
|
182
|
+
async function getBlogPost(slug: string) {
|
|
183
|
+
'use cache';
|
|
184
|
+
cacheLife('blog'); // 5min revalidation
|
|
185
|
+
cacheTag('blog-posts', `post-${slug}`);
|
|
186
|
+
|
|
187
|
+
return await fetchPost(slug);
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
The middleware automatically:
|
|
192
|
+
1. Captures tags from cache hits during page rendering
|
|
193
|
+
2. Aggregates all tags from multiple cache entries
|
|
194
|
+
3. Sets the `Surrogate-Key` header with space-separated tags
|
|
195
|
+
4. Merges with any existing Surrogate-Key headers
|
|
196
|
+
|
|
197
|
+
### Benefits
|
|
198
|
+
|
|
199
|
+
- **Standard CDN Integration**: Works with any CDN that supports Surrogate-Key headers
|
|
200
|
+
- **Redundant Purging**: Complements API-based cache clearing for reliability
|
|
201
|
+
- **Debugging**: Easily see which tags apply to each response
|
|
202
|
+
- **Zero Config**: Just re-export the middleware
|
|
203
|
+
|
|
204
|
+
### Advanced Configuration
|
|
205
|
+
|
|
206
|
+
Customize the middleware behavior:
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
import { createSurrogateKeyMiddleware } from '@pantheon-systems/nextjs-cache-handler/middleware';
|
|
210
|
+
|
|
211
|
+
export const middleware = createSurrogateKeyMiddleware({
|
|
212
|
+
debug: true, // Enable debug logging
|
|
213
|
+
fallbackKey: 'my-app', // Custom fallback when no tags
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
export const config = {
|
|
217
|
+
matcher: ['/app/*'], // Custom route matching
|
|
218
|
+
};
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Integration with Edge Cache
|
|
222
|
+
|
|
223
|
+
The Surrogate-Key headers work alongside the existing API-based edge cache clearing:
|
|
224
|
+
|
|
225
|
+
**When you call `revalidateTag('blog-posts')`:**
|
|
226
|
+
|
|
227
|
+
1. ✅ Origin cache entries deleted
|
|
228
|
+
2. ✅ Edge cache purged via API: `DELETE /cache/keys/blog-posts`
|
|
229
|
+
3. ✅ Edge cache validates via Surrogate-Key headers
|
|
230
|
+
|
|
231
|
+
This provides **dual-layer invalidation** for maximum reliability.
|
|
232
|
+
|
|
233
|
+
### Verification
|
|
234
|
+
|
|
235
|
+
Check that Surrogate-Key headers are being set:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# Development
|
|
239
|
+
curl -I http://localhost:3000/your-page
|
|
240
|
+
|
|
241
|
+
# Production
|
|
242
|
+
curl -I https://your-app.com/your-page
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Look for the `Surrogate-Key` header in the response.
|
|
246
|
+
|
|
247
|
+
### Troubleshooting
|
|
248
|
+
|
|
249
|
+
**No Surrogate-Key header appearing?**
|
|
250
|
+
|
|
251
|
+
1. Verify middleware is set up: Check `middleware.ts` exists and exports correctly
|
|
252
|
+
2. Check if page is using cache: Only cached pages have tags
|
|
253
|
+
3. Enable debug mode: Use `createSurrogateKeyMiddleware({ debug: true })`
|
|
254
|
+
4. Check logs: Look for tag capture messages in server logs
|
|
255
|
+
|
|
256
|
+
**Tags not matching expectations?**
|
|
257
|
+
|
|
258
|
+
- Tags are captured from **cache hits**, not cache misses
|
|
259
|
+
- First request to a page (cache miss) won't have tags
|
|
260
|
+
- Subsequent requests (cache hits) will include tags
|
|
261
|
+
- Use `cacheTag()` in 'use cache' blocks to ensure tags are stored
|
|
262
|
+
|
|
153
263
|
## Build Invalidation
|
|
154
264
|
|
|
155
265
|
On each new build, the handler automatically:
|
package/dist/handlers/base.d.ts
CHANGED
|
@@ -48,6 +48,15 @@ export declare abstract class BaseCacheHandler {
|
|
|
48
48
|
protected determineCacheType(ctx?: CacheHandlerParametersGet[1]): 'fetch' | 'route';
|
|
49
49
|
protected determineCacheTypeFromValue(incrementalCacheValue: CacheHandlerParametersSet[1]): 'fetch' | 'route';
|
|
50
50
|
get(cacheKey: CacheHandlerParametersGet[0], ctx?: CacheHandlerParametersGet[1]): Promise<CacheHandlerValue | null>;
|
|
51
|
+
/**
|
|
52
|
+
* Captures cache tags for propagation to response headers.
|
|
53
|
+
* Called during cache hits to track which tags apply to the current response.
|
|
54
|
+
*
|
|
55
|
+
* @param tags - Tags associated with the cache entry
|
|
56
|
+
* @param cacheKey - The cache key being accessed
|
|
57
|
+
* @param cacheType - Whether this is fetch or route cache
|
|
58
|
+
*/
|
|
59
|
+
protected captureTagsForResponse(tags: Readonly<string[]>, cacheKey: string, cacheType: 'fetch' | 'route'): void;
|
|
51
60
|
set(cacheKey: CacheHandlerParametersSet[0], incrementalCacheValue: CacheHandlerParametersSet[1], ctx: CacheHandlerParametersSet[2] & {
|
|
52
61
|
tags?: string[];
|
|
53
62
|
revalidate?: Revalidate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/handlers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,yBAAyB,EACzB,yBAAyB,EACzB,mCAAmC,EACnC,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/handlers/base.ts"],"names":[],"mappings":"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"}
|
package/dist/handlers/base.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { serializeForStorage, deserializeFromStorage } from '../utils/serialization.js';
|
|
2
2
|
import { getBuildId, isBuildPhase } from '../utils/build-detection.js';
|
|
3
3
|
import { createLogger } from '../utils/logger.js';
|
|
4
|
+
import { RequestContext } from '../utils/request-context.js';
|
|
4
5
|
// Global singleton to track if build invalidation has been checked for this process
|
|
5
6
|
let buildInvalidationChecked = false;
|
|
6
7
|
/**
|
|
@@ -165,6 +166,10 @@ export class BaseCacheHandler {
|
|
|
165
166
|
entryType: typeof entry,
|
|
166
167
|
hasValue: entry && typeof entry === 'object' && 'value' in entry,
|
|
167
168
|
});
|
|
169
|
+
// Capture tags for Surrogate-Key header propagation
|
|
170
|
+
if (entry.tags && entry.tags.length > 0) {
|
|
171
|
+
this.captureTagsForResponse(entry.tags, cacheKey, cacheType);
|
|
172
|
+
}
|
|
168
173
|
return entry;
|
|
169
174
|
}
|
|
170
175
|
catch (error) {
|
|
@@ -172,6 +177,23 @@ export class BaseCacheHandler {
|
|
|
172
177
|
return null;
|
|
173
178
|
}
|
|
174
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* Captures cache tags for propagation to response headers.
|
|
182
|
+
* Called during cache hits to track which tags apply to the current response.
|
|
183
|
+
*
|
|
184
|
+
* @param tags - Tags associated with the cache entry
|
|
185
|
+
* @param cacheKey - The cache key being accessed
|
|
186
|
+
* @param cacheType - Whether this is fetch or route cache
|
|
187
|
+
*/
|
|
188
|
+
captureTagsForResponse(tags, cacheKey, cacheType) {
|
|
189
|
+
if (!RequestContext.isActive()) {
|
|
190
|
+
// Not in a request context (e.g., during build)
|
|
191
|
+
// This is normal and expected - skip silently
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
RequestContext.addTags([...tags]);
|
|
195
|
+
this.log.debug(`Captured ${tags.length} tags for Surrogate-Key (${cacheType}/${cacheKey}): ${tags.join(', ')}`);
|
|
196
|
+
}
|
|
175
197
|
async set(cacheKey, incrementalCacheValue, ctx) {
|
|
176
198
|
const cacheType = this.determineCacheTypeFromValue(incrementalCacheValue);
|
|
177
199
|
this.log.debug(`SET: ${cacheKey} (${cacheType})`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/handlers/base.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/handlers/base.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,oFAAoF;AACpF,IAAI,wBAAwB,GAAG,KAAK,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,2BAA2B;IACzC,wBAAwB,GAAG,KAAK,CAAC;AACnC,CAAC;AAOD;;;GAGG;AACH,MAAM,OAAgB,gBAAgB;IAKpC,YAAY,OAA+B,EAAE,WAAmB;QAC9D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAErC,qFAAqF;QACrF,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,UAAU;QACxB,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAEnC,iDAAiD;QACjD,yEAAyE;QACzE,IAAI,CAAC,wBAAwB,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACpC,wBAAwB,GAAG,IAAI,CAAC;QAClC,CAAC;IACH,CAAC;IAkBD,+EAA+E;IAC/E,6BAA6B;IAC7B,+EAA+E;IAErE,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,IAAc,EAAE,QAAQ,GAAG,KAAK;QAClF,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAEjD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAES,KAAK,CAAC,2BAA2B,CACzC,iBAA2B,EAC3B,WAAqC;QAErC,IAAI,CAAC;YACH,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;YAC3D,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,qBAAqB,CAAC,WAAqC,EAAE,YAAsB;QACzF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAEtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,WAAW,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACvE,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,WAAqC,EAAE,QAAgB,EAAE,IAAc;QAC1F,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,qBAAqB;IACrB,+EAA+E;IAEvE,KAAK,CAAC,sBAAsB;QAClC,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAE7C,IAAI,SAAS,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;gBACzC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,SAAS,CAAC,OAAO,OAAO,cAAc,6BAA6B,CAAC,CAAC;gBAE1G,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAElC,MAAM,IAAI,CAAC,cAAc,CAAC;oBACxB,OAAO,EAAE,cAAc;oBACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;YACrE,MAAM,IAAI,CAAC,cAAc,CAAC;gBACxB,OAAO,EAAE,cAAc;gBACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,wBAAwB;IACxB,+EAA+E;IAErE,mBAAmB,CAAC,IAAe;QAC3C,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAES,sBAAsB,CAAC,IAAyB;QACxD,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,+EAA+E;IAC/E,2BAA2B;IAC3B,+EAA+E;IAErE,kBAAkB,CAAC,GAAkC;QAC7D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,YAAY,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YACnD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAES,2BAA2B,CAAC,qBAAmD;QACvF,IACE,qBAAqB;YACrB,OAAO,qBAAqB,KAAK,QAAQ;YACzC,MAAM,IAAI,qBAAqB;YAC/B,qBAAqB,CAAC,IAAI,KAAK,OAAO,EACtC,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,+EAA+E;IAC/E,wCAAwC;IACxC,+EAA+E;IAE/E,KAAK,CAAC,GAAG,CACP,QAAsC,EACtC,GAAkC;QAElC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,QAAQ,EAAE,CAAC,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAE7D,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,QAAQ,KAAK,SAAS,GAAG,CAAC,CAAC;gBACnD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,QAAQ,KAAK,SAAS,GAAG,EAAE;gBAChD,SAAS,EAAE,OAAO,KAAK;gBACvB,QAAQ,EAAE,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK;aACjE,CAAC,CAAC;YAEH,oDAAoD;YACpD,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC/D,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACO,sBAAsB,CAC9B,IAAwB,EACxB,QAAgB,EAChB,SAA4B;QAE5B,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC/B,gDAAgD;YAChD,8CAA8C;YAC9C,OAAO;QACT,CAAC;QAED,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,KAAK,CACZ,YAAY,IAAI,CAAC,MAAM,4BAA4B,SAAS,IAAI,QAAQ,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CACP,QAAsC,EACtC,qBAAmD,EACnD,GAGC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,2BAA2B,CAAC,qBAAqB,CAAC,CAAC;QAE1E,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,QAAQ,KAAK,SAAS,GAAG,EAAE;YAChD,SAAS,EAAE,OAAO,qBAAqB;YACvC,OAAO,EAAE,qBAAqB,IAAI,OAAO,qBAAqB,KAAK,QAAQ,IAAI,MAAM,IAAI,qBAAqB;SAC/G,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC;YAE1B,MAAM,iBAAiB,GAAsB;gBAC3C,KAAK,EAAE,qBAAqB;gBAC5B,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;gBACxB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;aAC1B,CAAC;YAEF,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;YAEnE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC7C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,QAAQ,aAAa,EAAE,IAAI,CAAC,CAAC;YAC1E,CAAC;YAED,iEAAiE;YACjE,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,QAAQ,OAAO,SAAS,QAAQ,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAA2C;QAC7D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAa,EAAE,CAAC;QAEjC,IAAI,WAAqC,CAAC;QAC1C,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;YAC1E,WAAW,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE,CAAC;YAClC,MAAM,eAAe,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAEtD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;gBAChE,SAAS;YACX,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,eAAe,CAAC,MAAM,2BAA2B,UAAU,EAAE,CAAC,CAAC;YAEvF,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;gBACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBACzD,IAAI,OAAO,EAAE,CAAC;oBACZ,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,2BAA2B,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACjE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uCAAuC,WAAW,CAAC,MAAM,UAAU,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,WAAW,CAAC,MAAM,sBAAsB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5F,gFAAgF;QAChF,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,oBAAoB,CAAC,KAAe,EAAE,YAAsB;QAC1E,sCAAsC;IACxC,CAAC;IAED;;;OAGG;IACO,eAAe,CAAC,SAAiB;QACzC,sCAAsC;IACxC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QAChD,wBAAwB;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACpE,uFAAuF;QACvF,kEAAkE;IACpE,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -43,5 +43,10 @@ export declare function getSharedCacheStats(): Promise<CacheStats>;
|
|
|
43
43
|
export declare function clearSharedCache(): Promise<number>;
|
|
44
44
|
export { FileCacheHandler } from './handlers/file.js';
|
|
45
45
|
export { GcsCacheHandler } from './handlers/gcs.js';
|
|
46
|
+
export { RequestContext } from './utils/request-context.js';
|
|
47
|
+
export { withSurrogateKey, type SurrogateKeyOptions } from './utils/with-surrogate-key.js';
|
|
48
|
+
export { createSurrogateKeyMiddleware, middleware as surrogateKeyMiddleware, config as surrogateKeyMiddlewareConfig, type SurrogateKeyMiddlewareConfig, } from './middleware/index.js';
|
|
46
49
|
export type { CacheHandlerConfig, CacheStats, CacheEntryInfo, CacheContext, CacheEntry, CacheData, CacheHandlerValue, CacheHandlerParametersGet, CacheHandlerParametersSet, CacheHandlerParametersRevalidateTag, FileSystemCacheContext, Revalidate, LifespanParameters, SerializedBuffer, SerializedMap, SerializableValue, SerializedCacheData, } from './types.js';
|
|
50
|
+
export { createUseCacheHandler, UseCacheFileHandler, UseCacheGcsHandler, streamToBytes, bytesToStream, serializeUseCacheEntry, deserializeUseCacheEntry, getUseCacheStats, } from './use-cache/index.js';
|
|
51
|
+
export type { UseCacheEntry, UseCacheHandler, UseCacheHandlerConfig, SerializedUseCacheEntry, UseCacheStats, UseCacheEntryInfo, } from './use-cache/index.js';
|
|
47
52
|
//# 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,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAgF,MAAM,oBAAoB,CAAC;AACpI,OAAO,EAAE,eAAe,EAA8E,MAAM,mBAAmB,CAAC;AAEhI;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,gBAAgB,GAAG,OAAO,eAAe,CAQhH;AAcD;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,UAAU,CAAC,CAK/D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAKxD;AAMD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMpD,YAAY,EACV,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,EACzB,mCAAmC,EACnC,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAgF,MAAM,oBAAoB,CAAC;AACpI,OAAO,EAAE,eAAe,EAA8E,MAAM,mBAAmB,CAAC;AAEhI;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,gBAAgB,GAAG,OAAO,eAAe,CAQhH;AAcD;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,UAAU,CAAC,CAK/D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAKxD;AAMD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAO5D,OAAO,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAG3F,OAAO,EACL,4BAA4B,EAC5B,UAAU,IAAI,sBAAsB,EACpC,MAAM,IAAI,4BAA4B,EACtC,KAAK,4BAA4B,GAClC,MAAM,uBAAuB,CAAC;AAM/B,YAAY,EACV,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,EACzB,mCAAmC,EACnC,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAMpB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -70,4 +70,19 @@ export async function clearSharedCache() {
|
|
|
70
70
|
// ============================================================================
|
|
71
71
|
export { FileCacheHandler } from './handlers/file.js';
|
|
72
72
|
export { GcsCacheHandler } from './handlers/gcs.js';
|
|
73
|
+
// ============================================================================
|
|
74
|
+
// Request context for tag tracking
|
|
75
|
+
// ============================================================================
|
|
76
|
+
export { RequestContext } from './utils/request-context.js';
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// Surrogate-Key header propagation utilities
|
|
79
|
+
// ============================================================================
|
|
80
|
+
// Route handler wrapper (recommended approach)
|
|
81
|
+
export { withSurrogateKey } from './utils/with-surrogate-key.js';
|
|
82
|
+
// Legacy middleware exports (Note: middleware runs before route, so tags may not be captured)
|
|
83
|
+
export { createSurrogateKeyMiddleware, middleware as surrogateKeyMiddleware, config as surrogateKeyMiddlewareConfig, } from './middleware/index.js';
|
|
84
|
+
// ============================================================================
|
|
85
|
+
// Next.js 16 'use cache' Handler Exports
|
|
86
|
+
// ============================================================================
|
|
87
|
+
export { createUseCacheHandler, UseCacheFileHandler, UseCacheGcsHandler, streamToBytes, bytesToStream, serializeUseCacheEntry, deserializeUseCacheEntry, getUseCacheStats, } from './use-cache/index.js';
|
|
73
88
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,IAAI,iBAAiB,EAAE,gBAAgB,IAAI,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpI,OAAO,EAAE,eAAe,EAAE,mBAAmB,IAAI,gBAAgB,EAAE,gBAAgB,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEhI;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA2B;IAC5D,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC;IAEpC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,IAA6B;IACjD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACpC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,iBAAiB,EAAE,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,aAAa,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAC/E,4CAA4C;AAC5C,+EAA+E;AAE/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,IAAI,iBAAiB,EAAE,gBAAgB,IAAI,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpI,OAAO,EAAE,eAAe,EAAE,mBAAmB,IAAI,gBAAgB,EAAE,gBAAgB,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEhI;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA2B;IAC5D,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC;IAEpC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,IAA6B;IACjD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACpC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,iBAAiB,EAAE,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,aAAa,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAC/E,4CAA4C;AAC5C,+EAA+E;AAE/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,+EAA+E;AAC/E,mCAAmC;AACnC,+EAA+E;AAE/E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,+EAA+E;AAC/E,6CAA6C;AAC7C,+EAA+E;AAE/E,+CAA+C;AAC/C,OAAO,EAAE,gBAAgB,EAA4B,MAAM,+BAA+B,CAAC;AAE3F,8FAA8F;AAC9F,OAAO,EACL,4BAA4B,EAC5B,UAAU,IAAI,sBAAsB,EACpC,MAAM,IAAI,4BAA4B,GAEvC,MAAM,uBAAuB,CAAC;AA0B/B,+EAA+E;AAC/E,yCAAyC;AACzC,+EAA+E;AAE/E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,UAAU,EACV,MAAM,EACN,KAAK,4BAA4B,GAClC,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,UAAU,EACV,MAAM,GAEP,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server.js';
|
|
2
|
+
export interface SurrogateKeyMiddlewareConfig {
|
|
3
|
+
/** Enable debug logging for middleware operations */
|
|
4
|
+
debug?: boolean;
|
|
5
|
+
/** Fallback Surrogate-Key when no tags are captured */
|
|
6
|
+
fallbackKey?: string;
|
|
7
|
+
/** Custom matcher pattern for middleware */
|
|
8
|
+
matcher?: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Creates middleware that propagates cache tags to Surrogate-Key headers.
|
|
12
|
+
*
|
|
13
|
+
* @param config - Optional configuration
|
|
14
|
+
* @returns Next.js middleware function
|
|
15
|
+
*/
|
|
16
|
+
export declare function createSurrogateKeyMiddleware(config?: SurrogateKeyMiddlewareConfig): (request: NextRequest) => NextResponse<unknown>;
|
|
17
|
+
/**
|
|
18
|
+
* Default middleware instance with standard configuration.
|
|
19
|
+
* Import and re-export from your app's middleware.ts for zero-config setup.
|
|
20
|
+
*/
|
|
21
|
+
export declare const middleware: (request: NextRequest) => NextResponse<unknown>;
|
|
22
|
+
/**
|
|
23
|
+
* Default matcher that excludes static assets and Next.js internals.
|
|
24
|
+
* Can be customized by passing config to createSurrogateKeyMiddleware.
|
|
25
|
+
*/
|
|
26
|
+
export declare const config: {
|
|
27
|
+
matcher: string[];
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=surrogate-key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surrogate-key.d.ts","sourceRoot":"","sources":["../../src/middleware/surrogate-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM3D,MAAM,WAAW,4BAA4B;IAC3C,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,GAAE,4BAAiC,IAOzD,SAAS,WAAW,2BA6ChD;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,YAnDe,WAAW,0BAmDO,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,MAAM;;CAIlB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server.js';
|
|
2
|
+
import { RequestContext } from '../utils/request-context.js';
|
|
3
|
+
import { createLogger } from '../utils/logger.js';
|
|
4
|
+
const log = createLogger('SurrogateKeyMiddleware');
|
|
5
|
+
/**
|
|
6
|
+
* Creates middleware that propagates cache tags to Surrogate-Key headers.
|
|
7
|
+
*
|
|
8
|
+
* @param config - Optional configuration
|
|
9
|
+
* @returns Next.js middleware function
|
|
10
|
+
*/
|
|
11
|
+
export function createSurrogateKeyMiddleware(config = {}) {
|
|
12
|
+
const { debug = false, fallbackKey = 'page-content', matcher, } = config;
|
|
13
|
+
return function middleware(request) {
|
|
14
|
+
const { pathname } = request.nextUrl;
|
|
15
|
+
if (debug) {
|
|
16
|
+
log.debug(`Processing request: ${pathname}`);
|
|
17
|
+
}
|
|
18
|
+
// Initialize request context for tag tracking
|
|
19
|
+
return RequestContext.run(() => {
|
|
20
|
+
const response = NextResponse.next();
|
|
21
|
+
// Get all tags accumulated during request (from cache hits)
|
|
22
|
+
const capturedTags = RequestContext.getTags();
|
|
23
|
+
// Merge with any existing Surrogate-Key from next.config.mjs or other sources
|
|
24
|
+
const existingKey = response.headers.get('Surrogate-Key');
|
|
25
|
+
const existingTags = existingKey && existingKey !== 'unknown'
|
|
26
|
+
? existingKey.split(/\s+/).filter(Boolean)
|
|
27
|
+
: [];
|
|
28
|
+
// Combine and deduplicate all tags
|
|
29
|
+
const allTags = [...new Set([...existingTags, ...capturedTags])];
|
|
30
|
+
if (allTags.length > 0) {
|
|
31
|
+
// Set Surrogate-Key header with space-separated tags
|
|
32
|
+
const surrogateKey = allTags.join(' ');
|
|
33
|
+
response.headers.set('Surrogate-Key', surrogateKey);
|
|
34
|
+
if (debug) {
|
|
35
|
+
log.debug(`Set Surrogate-Key: ${surrogateKey}`);
|
|
36
|
+
response.headers.set('x-cache-tags-count', String(capturedTags.length));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else if (fallbackKey) {
|
|
40
|
+
// No tags captured - use fallback if provided
|
|
41
|
+
if (!existingKey) {
|
|
42
|
+
response.headers.set('Surrogate-Key', fallbackKey);
|
|
43
|
+
}
|
|
44
|
+
if (debug) {
|
|
45
|
+
log.debug(`No cache tags captured, using fallback: ${fallbackKey}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return response;
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Default middleware instance with standard configuration.
|
|
54
|
+
* Import and re-export from your app's middleware.ts for zero-config setup.
|
|
55
|
+
*/
|
|
56
|
+
export const middleware = createSurrogateKeyMiddleware();
|
|
57
|
+
/**
|
|
58
|
+
* Default matcher that excludes static assets and Next.js internals.
|
|
59
|
+
* Can be customized by passing config to createSurrogateKeyMiddleware.
|
|
60
|
+
*/
|
|
61
|
+
export const config = {
|
|
62
|
+
matcher: [
|
|
63
|
+
'/((?!_next/static|_next/image|favicon.ico|.*\\.png|.*\\.jpg|.*\\.jpeg|.*\\.gif|.*\\.svg).*)',
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=surrogate-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surrogate-key.js","sourceRoot":"","sources":["../../src/middleware/surrogate-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AAWnD;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,SAAuC,EAAE;IACpF,MAAM,EACJ,KAAK,GAAG,KAAK,EACb,WAAW,GAAG,cAAc,EAC5B,OAAO,GACR,GAAG,MAAM,CAAC;IAEX,OAAO,SAAS,UAAU,CAAC,OAAoB;QAC7C,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;QAErC,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,CAAC,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,8CAA8C;QAC9C,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE;YAC7B,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;YAErC,4DAA4D;YAC5D,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC;YAE9C,8EAA8E;YAC9E,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC1D,MAAM,YAAY,GAAG,WAAW,IAAI,WAAW,KAAK,SAAS;gBAC3D,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC1C,CAAC,CAAC,EAAE,CAAC;YAEP,mCAAmC;YACnC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAEjE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,qDAAqD;gBACrD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACvC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;gBAEpD,IAAI,KAAK,EAAE,CAAC;oBACV,GAAG,CAAC,KAAK,CAAC,sBAAsB,YAAY,EAAE,CAAC,CAAC;oBAChD,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;iBAAM,IAAI,WAAW,EAAE,CAAC;gBACvB,8CAA8C;gBAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;gBACrD,CAAC;gBACD,IAAI,KAAK,EAAE,CAAC;oBACV,GAAG,CAAC,KAAK,CAAC,2CAA2C,WAAW,EAAE,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,4BAA4B,EAAE,CAAC;AAEzD;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE;QACP,6FAA6F;KAC9F;CACF,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { UseCacheEntry, UseCacheHandler, UseCacheStats } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for UseCacheFileHandler.
|
|
4
|
+
*/
|
|
5
|
+
export interface UseCacheFileHandlerConfig {
|
|
6
|
+
/**
|
|
7
|
+
* Directory to store cache files.
|
|
8
|
+
* Defaults to .next/cache/use-cache
|
|
9
|
+
*/
|
|
10
|
+
cacheDir?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* File-based cache handler for Next.js 16 'use cache' directive.
|
|
14
|
+
* Implements the cacheHandlers (plural) interface.
|
|
15
|
+
*
|
|
16
|
+
* Suitable for:
|
|
17
|
+
* - Local development
|
|
18
|
+
* - Single-instance deployments
|
|
19
|
+
* - Testing
|
|
20
|
+
*/
|
|
21
|
+
export declare class UseCacheFileHandler implements UseCacheHandler {
|
|
22
|
+
private readonly cacheDir;
|
|
23
|
+
private readonly tagsFile;
|
|
24
|
+
private tagTimestamps;
|
|
25
|
+
private pathToSurrogateKeys;
|
|
26
|
+
private readonly edgeCacheClearer;
|
|
27
|
+
constructor(config?: UseCacheFileHandlerConfig);
|
|
28
|
+
private ensureCacheDir;
|
|
29
|
+
private loadTagTimestamps;
|
|
30
|
+
private saveTagTimestamps;
|
|
31
|
+
private getCacheFilePath;
|
|
32
|
+
/**
|
|
33
|
+
* Check if an entry is expired based on revalidate time.
|
|
34
|
+
*/
|
|
35
|
+
private isExpired;
|
|
36
|
+
/**
|
|
37
|
+
* Retrieve a cache entry.
|
|
38
|
+
*/
|
|
39
|
+
get(cacheKey: string, softTags: string[]): Promise<UseCacheEntry | undefined>;
|
|
40
|
+
/**
|
|
41
|
+
* Store a cache entry.
|
|
42
|
+
* CRITICAL: Must await pendingEntry before storing.
|
|
43
|
+
*/
|
|
44
|
+
set(cacheKey: string, pendingEntry: Promise<UseCacheEntry>): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Synchronize tag state from external source.
|
|
47
|
+
* For file-based handler, this reloads from disk.
|
|
48
|
+
*/
|
|
49
|
+
refreshTags(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Return maximum revalidation timestamp for given tags.
|
|
52
|
+
*/
|
|
53
|
+
getExpiration(tags: string[]): Promise<number>;
|
|
54
|
+
/**
|
|
55
|
+
* Register the surrogate keys associated with a path.
|
|
56
|
+
* Called by withSurrogateKey via globalThis Symbol.
|
|
57
|
+
*/
|
|
58
|
+
registerPathTags(path: string, surrogateKeys: string[]): void;
|
|
59
|
+
/**
|
|
60
|
+
* Invalidate cache entries with matching tags.
|
|
61
|
+
* Also triggers CDN edge cache clearing via Surrogate-Key if configured.
|
|
62
|
+
*/
|
|
63
|
+
updateTags(tags: string[], durations: number[]): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Get cache statistics for the use-cache entries.
|
|
66
|
+
* Returns information about all valid (non-expired) cache entries.
|
|
67
|
+
*/
|
|
68
|
+
getStats(): Promise<UseCacheStats>;
|
|
69
|
+
}
|
|
70
|
+
export default UseCacheFileHandler;
|
|
71
|
+
//# sourceMappingURL=file-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-handler.d.ts","sourceRoot":"","sources":["../../src/use-cache/file-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAC;AA6EnG;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAwB;gBAE7C,MAAM,GAAE,yBAA8B;IAoBlD,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,SAAS;IAqBjB;;OAEG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAiDnF;;;OAGG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAyChF;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAcpD;;;OAGG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI;IAK7D;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0DpE;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC;CAmEzC;AAED,eAAe,mBAAmB,CAAC"}
|