@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
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { RequestContext } from './request-context';
|
|
3
|
+
describe('RequestContext', () => {
|
|
4
|
+
it('should isolate tags between contexts', () => {
|
|
5
|
+
RequestContext.run(() => {
|
|
6
|
+
RequestContext.addTags(['tag1', 'tag2']);
|
|
7
|
+
expect(RequestContext.getTags()).toEqual(['tag1', 'tag2']);
|
|
8
|
+
});
|
|
9
|
+
// Outside context, should be empty
|
|
10
|
+
expect(RequestContext.getTags()).toEqual([]);
|
|
11
|
+
});
|
|
12
|
+
it('should deduplicate tags', () => {
|
|
13
|
+
RequestContext.run(() => {
|
|
14
|
+
RequestContext.addTags(['tag1', 'tag2']);
|
|
15
|
+
RequestContext.addTags(['tag2', 'tag3']);
|
|
16
|
+
expect(RequestContext.getTags()).toEqual(['tag1', 'tag2', 'tag3']);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
it('should handle nested contexts independently', async () => {
|
|
20
|
+
const results = [];
|
|
21
|
+
await Promise.all([
|
|
22
|
+
RequestContext.run(async () => {
|
|
23
|
+
RequestContext.addTags(['context1']);
|
|
24
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
25
|
+
results.push(RequestContext.getTags());
|
|
26
|
+
}),
|
|
27
|
+
RequestContext.run(async () => {
|
|
28
|
+
RequestContext.addTags(['context2']);
|
|
29
|
+
await new Promise(resolve => setTimeout(resolve, 5));
|
|
30
|
+
results.push(RequestContext.getTags());
|
|
31
|
+
}),
|
|
32
|
+
]);
|
|
33
|
+
expect(results).toContainEqual(['context1']);
|
|
34
|
+
expect(results).toContainEqual(['context2']);
|
|
35
|
+
});
|
|
36
|
+
it('should detect when context is active', () => {
|
|
37
|
+
expect(RequestContext.isActive()).toBe(false);
|
|
38
|
+
RequestContext.run(() => {
|
|
39
|
+
expect(RequestContext.isActive()).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
expect(RequestContext.isActive()).toBe(false);
|
|
42
|
+
});
|
|
43
|
+
it('should handle empty tag arrays', () => {
|
|
44
|
+
RequestContext.run(() => {
|
|
45
|
+
RequestContext.addTags([]);
|
|
46
|
+
expect(RequestContext.getTags()).toEqual([]);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
it('should accumulate multiple tag additions', () => {
|
|
50
|
+
RequestContext.run(() => {
|
|
51
|
+
RequestContext.addTags(['tag1']);
|
|
52
|
+
RequestContext.addTags(['tag2']);
|
|
53
|
+
RequestContext.addTags(['tag3', 'tag4']);
|
|
54
|
+
expect(RequestContext.getTags()).toEqual(['tag1', 'tag2', 'tag3', 'tag4']);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
it('should warn when adding tags outside context', () => {
|
|
58
|
+
// This test verifies that adding tags outside a context doesn't throw
|
|
59
|
+
// The actual warning is logged, but we can't easily test console output
|
|
60
|
+
expect(() => {
|
|
61
|
+
RequestContext.addTags(['tag1']);
|
|
62
|
+
}).not.toThrow();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=request-context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-context.test.js","sourceRoot":"","sources":["../../src/utils/request-context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server.js';
|
|
2
|
+
export interface SurrogateKeyOptions {
|
|
3
|
+
/** Fallback Surrogate-Key when no tags are captured */
|
|
4
|
+
fallbackKey?: string;
|
|
5
|
+
/** Enable debug logging */
|
|
6
|
+
debug?: boolean;
|
|
7
|
+
}
|
|
8
|
+
type RouteHandler = (request: NextRequest, context?: {
|
|
9
|
+
params?: Promise<Record<string, string>>;
|
|
10
|
+
}) => Promise<NextResponse> | NextResponse;
|
|
11
|
+
/**
|
|
12
|
+
* Wraps a route handler to automatically set Surrogate-Key headers.
|
|
13
|
+
*
|
|
14
|
+
* Tags are captured from cache hits during request processing and
|
|
15
|
+
* added to the response as a Surrogate-Key header for CDN integration.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // app/api/posts/route.ts
|
|
20
|
+
* import { withSurrogateKey } from '@pantheon-systems/nextjs-cache-handler';
|
|
21
|
+
*
|
|
22
|
+
* async function handler(request: NextRequest) {
|
|
23
|
+
* const posts = await getCachedPosts(); // Tags captured from cache hits
|
|
24
|
+
* return NextResponse.json(posts);
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* export const GET = withSurrogateKey(handler);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function withSurrogateKey(handler: RouteHandler, options?: SurrogateKeyOptions): RouteHandler;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=with-surrogate-key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-surrogate-key.d.ts","sourceRoot":"","sources":["../../src/utils/with-surrogate-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAa3D,MAAM,WAAW,mBAAmB;IAClC,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,KAAK,YAAY,GAAG,CAClB,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,KACnD,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAE1C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,mBAAwB,GAChC,YAAY,CAoGd"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server.js';
|
|
2
|
+
import { CacheTagContext } from './cache-tag-context.js';
|
|
3
|
+
import { createLogger } from './logger.js';
|
|
4
|
+
const log = createLogger('withSurrogateKey');
|
|
5
|
+
/**
|
|
6
|
+
* Symbol for registering path→surrogate-key mappings with the use-cache handler.
|
|
7
|
+
* When withSurrogateKey captures tags, it registers them so revalidatePath
|
|
8
|
+
* can resolve _N_T_ path tags to the correct CDN surrogate keys.
|
|
9
|
+
*/
|
|
10
|
+
const PATH_TAGS_REGISTRY_SYMBOL = Symbol.for('@nextjs-cache-handler/path-tags-registry');
|
|
11
|
+
/**
|
|
12
|
+
* Wraps a route handler to automatically set Surrogate-Key headers.
|
|
13
|
+
*
|
|
14
|
+
* Tags are captured from cache hits during request processing and
|
|
15
|
+
* added to the response as a Surrogate-Key header for CDN integration.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // app/api/posts/route.ts
|
|
20
|
+
* import { withSurrogateKey } from '@pantheon-systems/nextjs-cache-handler';
|
|
21
|
+
*
|
|
22
|
+
* async function handler(request: NextRequest) {
|
|
23
|
+
* const posts = await getCachedPosts(); // Tags captured from cache hits
|
|
24
|
+
* return NextResponse.json(posts);
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* export const GET = withSurrogateKey(handler);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function withSurrogateKey(handler, options = {}) {
|
|
31
|
+
const { fallbackKey = 'page-content', debug = false } = options;
|
|
32
|
+
return async (request, context) => {
|
|
33
|
+
// Clear any stale global tags before starting request
|
|
34
|
+
// This is kept as a last-resort fallback for environments where Symbol.for doesn't propagate
|
|
35
|
+
const globalTags = globalThis.__pantheonSurrogateKeyTags;
|
|
36
|
+
if (globalTags) {
|
|
37
|
+
globalTags.length = 0;
|
|
38
|
+
}
|
|
39
|
+
// Run handler within CacheTagContext (uses Symbol.for pattern for cross-context propagation)
|
|
40
|
+
return CacheTagContext.run(async () => {
|
|
41
|
+
const requestId = CacheTagContext.getRequestId();
|
|
42
|
+
if (debug) {
|
|
43
|
+
log.debug(`Starting request ${requestId}`);
|
|
44
|
+
}
|
|
45
|
+
// Execute the original handler
|
|
46
|
+
const response = await handler(request, context);
|
|
47
|
+
// Primary: Get captured tags from CacheTagContext (Symbol.for pattern)
|
|
48
|
+
let capturedTags = CacheTagContext.getTags();
|
|
49
|
+
let tagSource = 'CacheTagContext';
|
|
50
|
+
if (debug && capturedTags.length > 0) {
|
|
51
|
+
log.debug(`CacheTagContext captured ${capturedTags.length} tags: ${capturedTags.join(', ')}`);
|
|
52
|
+
}
|
|
53
|
+
// Fallback: check global store for cross-context tag propagation
|
|
54
|
+
// This handles cases where even the Symbol.for pattern doesn't propagate
|
|
55
|
+
if (capturedTags.length === 0) {
|
|
56
|
+
const globalStoreTags = globalThis.__pantheonSurrogateKeyTags;
|
|
57
|
+
if (globalStoreTags && globalStoreTags.length > 0) {
|
|
58
|
+
capturedTags = [...new Set(globalStoreTags)];
|
|
59
|
+
tagSource = 'globalStore';
|
|
60
|
+
if (debug) {
|
|
61
|
+
log.debug(`Using global store fallback: ${capturedTags.length} tags`);
|
|
62
|
+
}
|
|
63
|
+
// Clear global tags after reading
|
|
64
|
+
globalStoreTags.length = 0;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (debug) {
|
|
68
|
+
log.debug(`Captured ${capturedTags.length} tags from ${tagSource}: ${capturedTags.join(', ')}`);
|
|
69
|
+
}
|
|
70
|
+
// Register path→surrogate-key mapping for revalidatePath CDN clearing
|
|
71
|
+
if (capturedTags.length > 0) {
|
|
72
|
+
const requestPath = new URL(request.url).pathname;
|
|
73
|
+
const registerFn = globalThis[PATH_TAGS_REGISTRY_SYMBOL];
|
|
74
|
+
if (registerFn) {
|
|
75
|
+
registerFn(requestPath, capturedTags);
|
|
76
|
+
if (debug) {
|
|
77
|
+
log.debug(`Registered path tags: ${requestPath} → [${capturedTags.join(', ')}]`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Clone response to modify headers
|
|
82
|
+
const newResponse = new NextResponse(response.body, {
|
|
83
|
+
status: response.status,
|
|
84
|
+
statusText: response.statusText,
|
|
85
|
+
headers: new Headers(response.headers),
|
|
86
|
+
});
|
|
87
|
+
// Set Surrogate-Key header
|
|
88
|
+
if (capturedTags.length > 0) {
|
|
89
|
+
const surrogateKey = capturedTags.join(' ');
|
|
90
|
+
newResponse.headers.set('Surrogate-Key', surrogateKey);
|
|
91
|
+
if (debug) {
|
|
92
|
+
log.debug(`Set Surrogate-Key: ${surrogateKey}`);
|
|
93
|
+
// TODO: Remove these debug headers before production release
|
|
94
|
+
// These are temporary headers to validate tag capture while Surrogate-Key
|
|
95
|
+
// is being stripped by the proxy layer. Remove once proxy issue is resolved.
|
|
96
|
+
newResponse.headers.set('x-cache-tags-count', String(capturedTags.length));
|
|
97
|
+
newResponse.headers.set('x-cache-tags-source', tagSource);
|
|
98
|
+
newResponse.headers.set('x-surrogate-key-debug', surrogateKey);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (fallbackKey) {
|
|
102
|
+
newResponse.headers.set('Surrogate-Key', fallbackKey);
|
|
103
|
+
if (debug) {
|
|
104
|
+
log.debug(`No tags captured, using fallback: ${fallbackKey}`);
|
|
105
|
+
// TODO: Remove this debug header before production release
|
|
106
|
+
newResponse.headers.set('x-surrogate-key-debug', fallbackKey);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return newResponse;
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=with-surrogate-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-surrogate-key.js","sourceRoot":"","sources":["../../src/utils/with-surrogate-key.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pantheon-systems/nextjs-cache-handler",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Custom cache handler for Next.js with support for Google Cloud Storage and file-based caching",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -9,6 +9,18 @@
|
|
|
9
9
|
".": {
|
|
10
10
|
"import": "./dist/index.js",
|
|
11
11
|
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./use-cache": {
|
|
14
|
+
"import": "./dist/use-cache/index.js",
|
|
15
|
+
"types": "./dist/use-cache/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./utils": {
|
|
18
|
+
"import": "./dist/utils/index.js",
|
|
19
|
+
"types": "./dist/utils/index.d.ts"
|
|
20
|
+
},
|
|
21
|
+
"./middleware": {
|
|
22
|
+
"import": "./dist/middleware/index.js",
|
|
23
|
+
"types": "./dist/middleware/index.d.ts"
|
|
12
24
|
}
|
|
13
25
|
},
|
|
14
26
|
"files": [
|
|
@@ -16,6 +28,7 @@
|
|
|
16
28
|
],
|
|
17
29
|
"scripts": {
|
|
18
30
|
"build": "tsc",
|
|
31
|
+
"prepare": "npm run build",
|
|
19
32
|
"prepublishOnly": "npm run build",
|
|
20
33
|
"clean": "rm -rf dist",
|
|
21
34
|
"test": "vitest run",
|
|
@@ -41,6 +54,7 @@
|
|
|
41
54
|
"devDependencies": {
|
|
42
55
|
"@types/node": "^20",
|
|
43
56
|
"@vitest/coverage-v8": "^4.0.18",
|
|
57
|
+
"next": "^16.1.6",
|
|
44
58
|
"typescript": "^5.0.0",
|
|
45
59
|
"vitest": "^4.0.18"
|
|
46
60
|
},
|