Skip to content

Commit a7b4bbf

Browse files
feat: updated building cache key for page revalidation
1 parent 1adee84 commit a7b4bbf

File tree

9 files changed

+30
-32
lines changed

9 files changed

+30
-32
lines changed

packages/cache-core/__tests__/fileSystem.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,14 @@ describe('FileSystemCache', () => {
8383
expect(result1).toEqual(mockCacheEntry)
8484
expect(result2).toEqual(mockCacheEntry)
8585

86-
await fileSystemCache.deleteAllByKeyMatch(cacheKey, [], mockCacheStrategyContext)
86+
await fileSystemCache.deleteAllByKeyMatch(cacheKey, '', mockCacheStrategyContext)
8787
expect(mockRm).toHaveBeenCalledTimes(1)
8888
expect(mockRm).toHaveBeenNthCalledWith(1, cacheFilePath)
8989

9090
expect(await fileSystemCache.get(cacheKey, cacheKey, mockCacheStrategyContext)).toBeNull()
9191
expect(await fileSystemCache.get(cacheKey2, cacheKey2, mockCacheStrategyContext)).toEqual(mockCacheEntry)
9292

93-
await fileSystemCache.deleteAllByKeyMatch(cacheKey2, [], mockCacheStrategyContext)
93+
await fileSystemCache.deleteAllByKeyMatch(cacheKey2, '', mockCacheStrategyContext)
9494
expect(await fileSystemCache.get(cacheKey2, cacheKey2, mockCacheStrategyContext)).toBeNull()
9595
})
9696

@@ -120,7 +120,7 @@ describe('FileSystemCache', () => {
120120
expect(mockReadFile).toHaveBeenCalledTimes(1)
121121
expect(mockReadFile).toHaveBeenCalledWith(cacheFilePath, 'utf-8')
122122

123-
await fileSystemCache.deleteAllByKeyMatch(cacheKey, [], mockCacheStrategyContext)
123+
await fileSystemCache.deleteAllByKeyMatch(cacheKey, '', mockCacheStrategyContext)
124124
const updatedResult = await fileSystemCache.get(cacheKey, cacheKey, mockCacheStrategyContext)
125125
expect(updatedResult).toBeNull()
126126
})

packages/cache-core/__tests__/memory.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ describe('MemoryCache', () => {
2727
expect(memoryCache.get(cacheKey, cacheKey)).toEqual(mockCacheEntry)
2828
expect(memoryCache.get(cacheKey2, cacheKey2)).toEqual(mockCacheEntry)
2929

30-
memoryCache.deleteAllByKeyMatch(cacheKey, [])
30+
memoryCache.deleteAllByKeyMatch(cacheKey, '')
3131

3232
expect(memoryCache.get(cacheKey, cacheKey)).toBeFalsy()
3333
expect(memoryCache.get(cacheKey2, cacheKey2)).toEqual(mockCacheEntry)
3434

35-
memoryCache.deleteAllByKeyMatch(cacheKey2, [])
35+
memoryCache.deleteAllByKeyMatch(cacheKey2, '')
3636
expect(memoryCache.get(cacheKey2, cacheKey2)).toBeFalsy()
3737
})
3838

@@ -74,11 +74,11 @@ describe('MemoryCache', () => {
7474
expect(memoryCache.get(cacheKey, cacheKey)).toEqual(mockCacheEntry)
7575
expect(memoryCache.get(cacheKey2, cacheKey2)).toEqual(mockCacheEntry)
7676

77-
await memoryCache.deleteAllByKeyMatch(cacheKey, [])
77+
await memoryCache.deleteAllByKeyMatch(cacheKey, '')
7878
expect(memoryCache.get(cacheKey, cacheKey)).toBeFalsy()
7979
expect(memoryCache.get(cacheKey2, cacheKey2)).toEqual(mockCacheEntry)
8080

81-
await memoryCache.deleteAllByKeyMatch(cacheKey2, [])
81+
await memoryCache.deleteAllByKeyMatch(cacheKey2, '')
8282
expect(memoryCache.get(cacheKey2, cacheKey2)).toBeFalsy()
8383
})
8484
})

packages/cache-core/src/cacheHandler.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,6 @@ export class Cache implements CacheHandler {
109109
}
110110
}
111111

112-
getCurrentCacheKey(): string[] {
113-
const currentCacheKey = this.nextOptions._requestHeaders[CURRENT_CACHE_KEY_HEADER_NAME] || []
114-
return typeof currentCacheKey === 'string' ? currentCacheKey.split(', ') : currentCacheKey
115-
}
116-
117112
getCurrentDeviceType() {
118113
if (!Cache.enableDeviceSplit) return ''
119114
const headers = this.nextOptions._requestHeaders
@@ -228,13 +223,22 @@ export class Cache implements CacheHandler {
228223
if (tag.startsWith(NEXT_CACHE_IMPLICIT_TAG_ID)) {
229224
const path = tag.slice(NEXT_CACHE_IMPLICIT_TAG_ID.length)
230225
Cache.logger.info(`Revalidate by path ${path}`)
226+
try {
227+
console.log('Building cache key from path')
228+
const urlParams = new URL(path, 'https://fakedomain.com')
229+
const query = Object.fromEntries(urlParams.searchParams)
230+
this.queryCacheKey = this.buildCacheKey(Cache.cacheQueries.toSorted(), query, 'query')
231+
} catch (err) {
232+
console.log('Error building cache key from path', err)
233+
}
231234
const pageKey = this.removeSlashFromStart(path)
232-
await Cache.cache.deleteAllByKeyMatch(!pageKey.length ? 'index' : pageKey, this.getCurrentCacheKey(), {
235+
await Cache.cache.deleteAllByKeyMatch(!pageKey.length ? 'index' : pageKey, this.buildPageCacheKey(), {
233236
serverCacheDirPath: this.serverCacheDirPath
234237
})
235238
} else {
236239
Cache.logger.info(`Revalidate by tag ${tag}`)
237-
await Cache.cache.revalidateTag(tag, this.getCurrentCacheKey(), {
240+
// TODO: (ISSUE-1650)
241+
await Cache.cache.revalidateTag(tag, [], {
238242
serverCacheDirPath: this.serverCacheDirPath
239243
})
240244
}

packages/cache-core/src/strategies/fileSystem.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,14 @@ export class FileSystemCache implements CacheStrategy {
5454
await fs.rm(path.join(ctx.serverCacheDirPath, pageKey, `${cacheKey}.json`))
5555
}
5656

57-
async deleteAllByKeyMatch(pageKey: string, allowCacheKeys: string[], ctx: CacheContext) {
57+
async deleteAllByKeyMatch(pageKey: string, cacheKey: string, ctx: CacheContext) {
5858
if (!ctx || !existsSync(ctx.serverCacheDirPath)) return
5959

6060
const pathToCacheFolder = path.join(ctx.serverCacheDirPath, ...pageKey.split('/'))
6161
if (!existsSync(pathToCacheFolder)) return
6262

6363
const cacheDir = await fs.readdir(pathToCacheFolder, { withFileTypes: true })
64-
const filesToDelete = cacheDir.filter(
65-
(cacheItem) =>
66-
!cacheItem.isDirectory() &&
67-
(!allowCacheKeys.length || allowCacheKeys.includes(cacheItem.name.replace('.json', '')))
68-
)
64+
const filesToDelete = cacheDir.filter((cacheItem) => !cacheItem.isDirectory() && cacheItem.name.includes(cacheKey))
6965

7066
if (cacheDir.length === filesToDelete.length) {
7167
await fs.rm(pathToCacheFolder, { recursive: true })

packages/cache-core/src/strategies/memory.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,12 @@ export class MemoryCache implements CacheStrategy {
6363
mapCache.delete(cacheKey)
6464
}
6565

66-
async deleteAllByKeyMatch(pageKey: string, allowCacheKeys: string[]) {
66+
async deleteAllByKeyMatch(pageKey: string, cacheKey: string) {
6767
const allKeys: string[] = [...mapCache.keys()]
6868

6969
const relatedKeys = allKeys.filter(
7070
(key) =>
71-
key.startsWith(pageKey) &&
72-
key.replace(`${pageKey}/`, '').split('/').length === 1 &&
73-
(!allowCacheKeys.length || allowCacheKeys.some((allowKey) => key.endsWith(allowKey)))
71+
key.startsWith(pageKey) && key.replace(`${pageKey}/`, '').split('/').length === 1 && key.includes(cacheKey)
7472
)
7573

7674
relatedKeys.forEach((cacheKey) => {

packages/cache-core/src/types/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export interface CacheStrategy {
2020
set(pageKey: string, cacheKey: string, data: CacheEntry, ctx: CacheContext): Promise<void>
2121
delete(pageKey: string, cacheKey: string, ctx: CacheContext): Promise<void>
2222
revalidateTag(tag: string, allowCacheKeys: string[], ctx: CacheContext): Promise<void>
23-
deleteAllByKeyMatch(pageKey: string, allowCacheKeys: string[], ctx: CacheContext): Promise<void>
23+
deleteAllByKeyMatch(pageKey: string, cacheKey: string, ctx: CacheContext): Promise<void>
2424
}
2525

2626
export interface CacheHandlerContext {

packages/redis-cache/__tests__/redis-stack.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ describe('RedisCache', () => {
9191
const result1 = await redisCache.get(cacheKey, cacheKey)
9292
expect(result1).toEqual(mockedCacheEntry)
9393

94-
await redisCache.deleteAllByKeyMatch(cacheKey, [])
94+
await redisCache.deleteAllByKeyMatch(cacheKey, '')
9595
expect(redisClient.unlink).toHaveBeenCalledTimes(1)
9696
expect(redisClient.unlink).toHaveBeenNthCalledWith(1, [`${cacheKey}//${cacheKey}`])
9797

@@ -118,7 +118,7 @@ describe('RedisCache', () => {
118118

119119
expect(await redisCache.get(cacheKey, cacheKey)).toEqual(mockedCacheEntry)
120120

121-
await redisCache.deleteAllByKeyMatch(cacheKey, [])
121+
await redisCache.deleteAllByKeyMatch(cacheKey, '')
122122
expect(redisClient.unlink).toHaveBeenCalledTimes(1)
123123
expect(redisClient.unlink).toHaveBeenNthCalledWith(1, [`${cacheKey}//${cacheKey}`])
124124

packages/redis-cache/__tests__/redis-string.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ describe('RedisCache', () => {
6767
const result1 = await redisCache.get(cacheKey, cacheKey)
6868
expect(result1).toEqual(mockCacheEntry)
6969

70-
await redisCache.deleteAllByKeyMatch(cacheKey, [])
70+
await redisCache.deleteAllByKeyMatch(cacheKey, '')
7171
expect(redisCache.redisAdapter.client.unlink).toHaveBeenCalledTimes(1)
7272
expect(redisCache.redisAdapter.client.unlink).toHaveBeenNthCalledWith(1, [`${cacheKey}//${cacheKey}`])
7373

@@ -92,7 +92,7 @@ describe('RedisCache', () => {
9292

9393
expect(await redisCache.get(cacheKey, cacheKey)).toEqual(mockCacheEntry)
9494

95-
await redisCache.deleteAllByKeyMatch(cacheKey, [])
95+
await redisCache.deleteAllByKeyMatch(cacheKey, '')
9696
expect(redisCache.redisAdapter.client.unlink).toHaveBeenCalledTimes(1)
9797
expect(redisCache.redisAdapter.client.unlink).toHaveBeenNthCalledWith(1, [`${cacheKey}//${cacheKey}`])
9898

packages/redis-cache/src/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ export class RedisCache implements CacheStrategy {
3434
await this.redisAdapter.client.unlink(`${pageKey}//${cacheKey}`)
3535
}
3636

37-
async deleteAllByKeyMatch(key: string, allowCacheKeys: string[]): Promise<void> {
38-
if (allowCacheKeys.length) {
39-
await this.redisAdapter.client.unlink(allowCacheKeys.map((allowKey) => `${key}//${allowKey}`))
37+
async deleteAllByKeyMatch(key: string, cacheKey: string): Promise<void> {
38+
if (cacheKey) {
39+
await this.redisAdapter.client.unlink(`${key}//${cacheKey}`)
4040
return
4141
}
4242

0 commit comments

Comments
 (0)