Skip to content

Commit a0e594c

Browse files
authored
Merge pull request #23 from netlify/kitop/revalidate-tag
FRA-62 Cache Revalidate tag
2 parents 3f74114 + f108461 commit a0e594c

File tree

3 files changed

+42
-30
lines changed

3 files changed

+42
-30
lines changed

package-lock.json

+7-29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"homepage": "https://github.com/netlify/next-runtime-minimal#readme",
3636
"dependencies": {
3737
"@fastly/http-compute-js": "1.1.1",
38-
"@netlify/blobs": "^1.6.0",
38+
"@netlify/blobs": "^3.2.0",
3939
"@netlify/build": "^29.20.6",
4040
"@netlify/functions": "^2.0.1",
4141
"@vercel/nft": "^0.24.3",

src/handlers/cache.cts

+34
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
1+
import { getStore } from '@netlify/blobs'
2+
import { purgeCache } from '@netlify/functions'
13
import type { CacheHandler, CacheHandlerContext } from 'next/dist/server/lib/incremental-cache/index.js'
24

5+
type TagManifest = { revalidatedAt: number }
6+
7+
const tagsManifestPath = '_netlify-cache/tags'
8+
const blobStore = getStore('TODO')
9+
310
/**
411
* Netlify Cache Handler
512
* (CJS format because Next.js doesn't support ESM yet)
613
*/
714
export default class NetlifyCacheHandler implements CacheHandler {
815
options: CacheHandlerContext
16+
revalidatedTags: string[]
917

1018
constructor(options: CacheHandlerContext) {
1119
this.options = options
20+
this.revalidatedTags = options.revalidatedTags
1221
}
1322

1423
// eslint-disable-next-line require-await, class-methods-use-this
@@ -25,5 +34,30 @@ export default class NetlifyCacheHandler implements CacheHandler {
2534
// eslint-disable-next-line class-methods-use-this, require-await
2635
public async revalidateTag(tag: string) {
2736
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('/')
2862
}
2963
}

0 commit comments

Comments
 (0)