Skip to content

Commit 7675a43

Browse files
committed
attempt at revalidateTag
1 parent 3f74114 commit 7675a43

File tree

3 files changed

+48
-30
lines changed

3 files changed

+48
-30
lines changed

package-lock.json

Lines changed: 7 additions & 29 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
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 TagsManifest = {
6+
version: 1
7+
items: { [tag: string]: { revalidatedAt: number } }
8+
}
9+
10+
let tagsManifest: TagsManifest | undefined
11+
const tagsManifestPath = '_netlify/tags-manifest.json'
12+
const blobStore = getStore('TODO')
13+
314
/**
415
* Netlify Cache Handler
516
* (CJS format because Next.js doesn't support ESM yet)
@@ -9,6 +20,8 @@ export default class NetlifyCacheHandler implements CacheHandler {
920

1021
constructor(options: CacheHandlerContext) {
1122
this.options = options
23+
24+
this.loadTagsManifest()
1225
}
1326

1427
// eslint-disable-next-line require-await, class-methods-use-this
@@ -25,5 +38,32 @@ export default class NetlifyCacheHandler implements CacheHandler {
2538
// eslint-disable-next-line class-methods-use-this, require-await
2639
public async revalidateTag(tag: string) {
2740
console.log('NetlifyCacheHandler.revalidateTag', tag)
41+
42+
await this.loadTagsManifest()
43+
if (!tagsManifest) {
44+
return
45+
}
46+
47+
const data = tagsManifest.items[tag] || {}
48+
data.revalidatedAt = Date.now()
49+
tagsManifest.items[tag] = data
50+
51+
try {
52+
blobStore.setJSON(tagsManifestPath, tagsManifest)
53+
} catch (error: any) {
54+
console.warn('Failed to update tags manifest.', error)
55+
}
56+
57+
purgeCache({ tags: [tag] })
58+
}
59+
60+
// eslint-disable-next-line class-methods-use-this
61+
private async loadTagsManifest() {
62+
try {
63+
tagsManifest = await blobStore.get(tagsManifestPath, {type: 'json'})
64+
} catch (error: any) {
65+
console.warn('Failed to fetch tags manifest.', error)
66+
tagsManifest = { version: 1, items: {} }
67+
}
2868
}
2969
}

0 commit comments

Comments
 (0)