1
+ import { getStore } from '@netlify/blobs'
2
+ import { purgeCache } from '@netlify/functions'
1
3
import type { CacheHandler , CacheHandlerContext } from 'next/dist/server/lib/incremental-cache/index.js'
2
4
5
+ type TagManifest = { revalidatedAt : number }
6
+
7
+ const tagsManifestPath = '_netlify-cache/tags'
8
+ const blobStore = getStore ( 'TODO' )
9
+
3
10
/**
4
11
* Netlify Cache Handler
5
12
* (CJS format because Next.js doesn't support ESM yet)
6
13
*/
7
14
export default class NetlifyCacheHandler implements CacheHandler {
8
15
options : CacheHandlerContext
16
+ revalidatedTags : string [ ]
9
17
10
18
constructor ( options : CacheHandlerContext ) {
11
19
this . options = options
20
+ this . revalidatedTags = options . revalidatedTags
12
21
}
13
22
14
23
// eslint-disable-next-line require-await, class-methods-use-this
@@ -25,5 +34,30 @@ export default class NetlifyCacheHandler implements CacheHandler {
25
34
// eslint-disable-next-line class-methods-use-this, require-await
26
35
public async revalidateTag ( tag : string ) {
27
36
console . log ( 'NetlifyCacheHandler.revalidateTag' , tag )
37
+
38
+ const data : TagManifest = {
39
+ revalidatedAt : Date . now ( )
40
+ }
41
+
42
+ try {
43
+ blobStore . setJSON ( this . tagManifestPath ( tag ) , data )
44
+ } catch ( error : any ) {
45
+ console . warn ( `Failed to update tag manifest for ${ tag } ` , error )
46
+ }
47
+
48
+ purgeCache ( { tags : [ tag ] } )
49
+ }
50
+
51
+ private async loadTagManifest ( tag : string ) {
52
+ try {
53
+ return await blobStore . get ( this . tagManifestPath ( tag ) , { type : 'json' } )
54
+ } catch ( error : any ) {
55
+ console . warn ( `Failed to fetch tag manifest for ${ tag } ` , error )
56
+ }
57
+ }
58
+
59
+ // eslint-disable-next-line class-methods-use-this
60
+ private tagManifestPath ( tag : string ) {
61
+ return [ tagsManifestPath , tag ] . join ( '/' )
28
62
}
29
63
}
0 commit comments