Skip to content

Commit b352918

Browse files
authored
refactor: remove unnecessary handling of Durable Cache feature flag after it was fully rolled out (#2571)
* test: update assertions for fully rolled out durable cache * fix: remove feature flag from code as it's fully rolled out
1 parent c993184 commit b352918

19 files changed

+81
-253
lines changed

src/run/handlers/server.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,7 @@ export default async (request: Request, context: FutureContext) => {
112112

113113
await adjustDateHeader({ headers: response.headers, request, span, tracer, requestContext })
114114

115-
const useDurableCache =
116-
context.flags.get('serverless_functions_nextjs_durable_cache_disable') !== true
117-
setCacheControlHeaders(response.headers, request, requestContext, useDurableCache)
115+
setCacheControlHeaders(response.headers, request, requestContext)
118116
setCacheTagsHeaders(response.headers, requestContext)
119117
setVaryHeaders(response.headers, request, nextConfig)
120118
setCacheStatusHeader(response.headers)

src/run/headers.test.ts

+17-107
Original file line numberDiff line numberDiff line change
@@ -194,96 +194,6 @@ describe('headers', () => {
194194
describe('setCacheControlHeaders', () => {
195195
const defaultUrl = 'https://example.com'
196196

197-
describe('Durable Cache feature flag disabled', () => {
198-
test('should set permanent, non-durable "netlify-cdn-cache-control" if "cache-control" is not set and "requestContext.usedFsRead" is truthy', () => {
199-
const headers = new Headers()
200-
const request = new Request(defaultUrl)
201-
vi.spyOn(headers, 'set')
202-
203-
const requestContext = createRequestContext()
204-
requestContext.usedFsRead = true
205-
206-
setCacheControlHeaders(headers, request, requestContext, false)
207-
208-
expect(headers.set).toHaveBeenNthCalledWith(
209-
1,
210-
'cache-control',
211-
'public, max-age=0, must-revalidate',
212-
)
213-
expect(headers.set).toHaveBeenNthCalledWith(
214-
2,
215-
'netlify-cdn-cache-control',
216-
'max-age=31536000',
217-
)
218-
})
219-
220-
describe('route handler responses with a specified `revalidate` value', () => {
221-
test('should set non-durable SWC=1yr with 1yr TTL if "{netlify-,}cdn-cache-control" is not present and `revalidate` is `false` (GET)', () => {
222-
const headers = new Headers()
223-
const request = new Request(defaultUrl)
224-
vi.spyOn(headers, 'set')
225-
226-
const ctx: RequestContext = { ...createRequestContext(), routeHandlerRevalidate: false }
227-
setCacheControlHeaders(headers, request, ctx, false)
228-
229-
expect(headers.set).toHaveBeenCalledTimes(1)
230-
expect(headers.set).toHaveBeenNthCalledWith(
231-
1,
232-
'netlify-cdn-cache-control',
233-
's-maxage=31536000, stale-while-revalidate=31536000',
234-
)
235-
})
236-
237-
test('should set non-durable SWC=1yr with 1yr TTL if "{netlify-,}cdn-cache-control" is not present and `revalidate` is `false` (HEAD)', () => {
238-
const headers = new Headers()
239-
const request = new Request(defaultUrl, { method: 'HEAD' })
240-
vi.spyOn(headers, 'set')
241-
242-
const ctx: RequestContext = { ...createRequestContext(), routeHandlerRevalidate: false }
243-
setCacheControlHeaders(headers, request, ctx, false)
244-
245-
expect(headers.set).toHaveBeenCalledTimes(1)
246-
expect(headers.set).toHaveBeenNthCalledWith(
247-
1,
248-
'netlify-cdn-cache-control',
249-
's-maxage=31536000, stale-while-revalidate=31536000',
250-
)
251-
})
252-
253-
test('should set non-durable SWC=1yr with given TTL if "{netlify-,}cdn-cache-control" is not present and `revalidate` is a number (GET)', () => {
254-
const headers = new Headers()
255-
const request = new Request(defaultUrl)
256-
vi.spyOn(headers, 'set')
257-
258-
const ctx: RequestContext = { ...createRequestContext(), routeHandlerRevalidate: 7200 }
259-
setCacheControlHeaders(headers, request, ctx, false)
260-
261-
expect(headers.set).toHaveBeenCalledTimes(1)
262-
expect(headers.set).toHaveBeenNthCalledWith(
263-
1,
264-
'netlify-cdn-cache-control',
265-
's-maxage=7200, stale-while-revalidate=31536000',
266-
)
267-
})
268-
269-
test('should set non-durable SWC=1yr with 1yr TTL if "{netlify-,}cdn-cache-control" is not present and `revalidate` is a number (HEAD)', () => {
270-
const headers = new Headers()
271-
const request = new Request(defaultUrl, { method: 'HEAD' })
272-
vi.spyOn(headers, 'set')
273-
274-
const ctx: RequestContext = { ...createRequestContext(), routeHandlerRevalidate: 7200 }
275-
setCacheControlHeaders(headers, request, ctx, false)
276-
277-
expect(headers.set).toHaveBeenCalledTimes(1)
278-
expect(headers.set).toHaveBeenNthCalledWith(
279-
1,
280-
'netlify-cdn-cache-control',
281-
's-maxage=7200, stale-while-revalidate=31536000',
282-
)
283-
})
284-
})
285-
})
286-
287197
describe('route handler responses with a specified `revalidate` value', () => {
288198
test('should not set any headers if "cdn-cache-control" is present', () => {
289199
const givenHeaders = {
@@ -294,7 +204,7 @@ describe('headers', () => {
294204
vi.spyOn(headers, 'set')
295205

296206
const ctx: RequestContext = { ...createRequestContext(), routeHandlerRevalidate: false }
297-
setCacheControlHeaders(headers, request, ctx, true)
207+
setCacheControlHeaders(headers, request, ctx)
298208

299209
expect(headers.set).toHaveBeenCalledTimes(0)
300210
})
@@ -308,7 +218,7 @@ describe('headers', () => {
308218
vi.spyOn(headers, 'set')
309219

310220
const ctx: RequestContext = { ...createRequestContext(), routeHandlerRevalidate: false }
311-
setCacheControlHeaders(headers, request, ctx, true)
221+
setCacheControlHeaders(headers, request, ctx)
312222

313223
expect(headers.set).toHaveBeenCalledTimes(0)
314224
})
@@ -322,7 +232,7 @@ describe('headers', () => {
322232
vi.spyOn(headers, 'set')
323233

324234
const ctx: RequestContext = { ...createRequestContext(), routeHandlerRevalidate: false }
325-
setCacheControlHeaders(headers, request, ctx, true)
235+
setCacheControlHeaders(headers, request, ctx)
326236

327237
expect(headers.set).toHaveBeenCalledTimes(1)
328238
expect(headers.set).toHaveBeenNthCalledWith(
@@ -341,7 +251,7 @@ describe('headers', () => {
341251
vi.spyOn(headers, 'set')
342252

343253
const ctx: RequestContext = { ...createRequestContext(), routeHandlerRevalidate: false }
344-
setCacheControlHeaders(headers, request, ctx, true)
254+
setCacheControlHeaders(headers, request, ctx)
345255

346256
expect(headers.set).toHaveBeenCalledTimes(1)
347257
expect(headers.set).toHaveBeenNthCalledWith(
@@ -357,7 +267,7 @@ describe('headers', () => {
357267
vi.spyOn(headers, 'set')
358268

359269
const ctx: RequestContext = { ...createRequestContext(), routeHandlerRevalidate: false }
360-
setCacheControlHeaders(headers, request, ctx, true)
270+
setCacheControlHeaders(headers, request, ctx)
361271

362272
expect(headers.set).toHaveBeenCalledTimes(1)
363273
expect(headers.set).toHaveBeenNthCalledWith(
@@ -373,7 +283,7 @@ describe('headers', () => {
373283
vi.spyOn(headers, 'set')
374284

375285
const ctx: RequestContext = { ...createRequestContext(), routeHandlerRevalidate: 7200 }
376-
setCacheControlHeaders(headers, request, ctx, true)
286+
setCacheControlHeaders(headers, request, ctx)
377287

378288
expect(headers.set).toHaveBeenCalledTimes(1)
379289
expect(headers.set).toHaveBeenNthCalledWith(
@@ -389,7 +299,7 @@ describe('headers', () => {
389299
vi.spyOn(headers, 'set')
390300

391301
const ctx: RequestContext = { ...createRequestContext(), routeHandlerRevalidate: 7200 }
392-
setCacheControlHeaders(headers, request, ctx, true)
302+
setCacheControlHeaders(headers, request, ctx)
393303

394304
expect(headers.set).toHaveBeenCalledTimes(1)
395305
expect(headers.set).toHaveBeenNthCalledWith(
@@ -405,7 +315,7 @@ describe('headers', () => {
405315
vi.spyOn(headers, 'set')
406316

407317
const ctx: RequestContext = { ...createRequestContext(), routeHandlerRevalidate: false }
408-
setCacheControlHeaders(headers, request, ctx, true)
318+
setCacheControlHeaders(headers, request, ctx)
409319

410320
expect(headers.set).toHaveBeenCalledTimes(0)
411321
})
@@ -416,7 +326,7 @@ describe('headers', () => {
416326
const request = new Request(defaultUrl)
417327
vi.spyOn(headers, 'set')
418328

419-
setCacheControlHeaders(headers, request, createRequestContext(), true)
329+
setCacheControlHeaders(headers, request, createRequestContext())
420330

421331
expect(headers.set).toHaveBeenCalledTimes(0)
422332
})
@@ -452,7 +362,7 @@ describe('headers', () => {
452362
const request = new Request(defaultUrl)
453363
vi.spyOn(headers, 'set')
454364

455-
setCacheControlHeaders(headers, request, createRequestContext(), true)
365+
setCacheControlHeaders(headers, request, createRequestContext())
456366

457367
expect(headers.set).toHaveBeenCalledTimes(0)
458368
})
@@ -466,7 +376,7 @@ describe('headers', () => {
466376
const request = new Request(defaultUrl)
467377
vi.spyOn(headers, 'set')
468378

469-
setCacheControlHeaders(headers, request, createRequestContext(), true)
379+
setCacheControlHeaders(headers, request, createRequestContext())
470380

471381
expect(headers.set).toHaveBeenCalledTimes(0)
472382
})
@@ -479,7 +389,7 @@ describe('headers', () => {
479389
const request = new Request(defaultUrl)
480390
vi.spyOn(headers, 'set')
481391

482-
setCacheControlHeaders(headers, request, createRequestContext(), true)
392+
setCacheControlHeaders(headers, request, createRequestContext())
483393

484394
expect(headers.set).toHaveBeenNthCalledWith(
485395
1,
@@ -501,7 +411,7 @@ describe('headers', () => {
501411
const request = new Request(defaultUrl, { method: 'HEAD' })
502412
vi.spyOn(headers, 'set')
503413

504-
setCacheControlHeaders(headers, request, createRequestContext(), true)
414+
setCacheControlHeaders(headers, request, createRequestContext())
505415

506416
expect(headers.set).toHaveBeenNthCalledWith(
507417
1,
@@ -523,7 +433,7 @@ describe('headers', () => {
523433
const request = new Request(defaultUrl, { method: 'POST' })
524434
vi.spyOn(headers, 'set')
525435

526-
setCacheControlHeaders(headers, request, createRequestContext(), true)
436+
setCacheControlHeaders(headers, request, createRequestContext())
527437

528438
expect(headers.set).toHaveBeenCalledTimes(0)
529439
})
@@ -536,7 +446,7 @@ describe('headers', () => {
536446
const request = new Request(defaultUrl)
537447
vi.spyOn(headers, 'set')
538448

539-
setCacheControlHeaders(headers, request, createRequestContext(), true)
449+
setCacheControlHeaders(headers, request, createRequestContext())
540450

541451
expect(headers.set).toHaveBeenNthCalledWith(1, 'cache-control', 'public')
542452
expect(headers.set).toHaveBeenNthCalledWith(
@@ -554,7 +464,7 @@ describe('headers', () => {
554464
const request = new Request(defaultUrl)
555465
vi.spyOn(headers, 'set')
556466

557-
setCacheControlHeaders(headers, request, createRequestContext(), true)
467+
setCacheControlHeaders(headers, request, createRequestContext())
558468

559469
expect(headers.set).toHaveBeenNthCalledWith(1, 'cache-control', 'max-age=604800')
560470
expect(headers.set).toHaveBeenNthCalledWith(
@@ -572,7 +482,7 @@ describe('headers', () => {
572482
const request = new Request(defaultUrl)
573483
vi.spyOn(headers, 'set')
574484

575-
setCacheControlHeaders(headers, request, createRequestContext(), true)
485+
setCacheControlHeaders(headers, request, createRequestContext())
576486

577487
expect(headers.set).toHaveBeenNthCalledWith(
578488
1,

src/run/headers.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,7 @@ export const setCacheControlHeaders = (
213213
headers: Headers,
214214
request: Request,
215215
requestContext: RequestContext,
216-
useDurableCache: boolean,
217216
) => {
218-
const durableCacheDirective = useDurableCache ? ', durable' : ''
219217
if (
220218
typeof requestContext.routeHandlerRevalidate !== 'undefined' &&
221219
['GET', 'HEAD'].includes(request.method) &&
@@ -227,7 +225,7 @@ export const setCacheControlHeaders = (
227225
// if we are serving already stale response, instruct edge to not attempt to cache that response
228226
headers.get('x-nextjs-cache') === 'STALE'
229227
? 'public, max-age=0, must-revalidate'
230-
: `s-maxage=${requestContext.routeHandlerRevalidate === false ? 31536000 : requestContext.routeHandlerRevalidate}, stale-while-revalidate=31536000${durableCacheDirective}`
228+
: `s-maxage=${requestContext.routeHandlerRevalidate === false ? 31536000 : requestContext.routeHandlerRevalidate}, stale-while-revalidate=31536000, durable`
231229

232230
headers.set('netlify-cdn-cache-control', cdnCacheControl)
233231
return
@@ -253,7 +251,7 @@ export const setCacheControlHeaders = (
253251
...getHeaderValueArray(cacheControl).map((value) =>
254252
value === 'stale-while-revalidate' ? 'stale-while-revalidate=31536000' : value,
255253
),
256-
...(useDurableCache ? ['durable'] : []),
254+
'durable',
257255
].join(', ')
258256

259257
headers.set('cache-control', browserCacheControl || 'public, max-age=0, must-revalidate')
@@ -269,7 +267,7 @@ export const setCacheControlHeaders = (
269267
) {
270268
// handle CDN Cache Control on static files
271269
headers.set('cache-control', 'public, max-age=0, must-revalidate')
272-
headers.set('netlify-cdn-cache-control', `max-age=31536000${durableCacheDirective}`)
270+
headers.set('netlify-cdn-cache-control', `max-age=31536000, durable`)
273271
}
274272
}
275273

tests/e2e/cli-before-regional-blobs-support.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ test('should serve 404 page when requesting non existing page (no matching route
1919
expect(await page.textContent('h1')).toBe('404')
2020

2121
expect(headers['netlify-cdn-cache-control']).toBe(
22-
'no-cache, no-store, max-age=0, must-revalidate',
22+
'no-cache, no-store, max-age=0, must-revalidate, durable',
2323
)
2424
expect(headers['cache-control']).toBe('no-cache,no-store,max-age=0,must-revalidate')
2525
})

tests/e2e/durable-cache.test.ts

-19
This file was deleted.

tests/e2e/on-demand-app.test.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ test.describe('app router on-demand revalidation', () => {
7676
expect(response1?.status()).toBe(200)
7777
expect(headers1['x-nextjs-cache']).toBeUndefined()
7878
expect(headers1['netlify-cdn-cache-control']).toBe(
79-
's-maxage=31536000, stale-while-revalidate=31536000',
79+
's-maxage=31536000, stale-while-revalidate=31536000, durable',
8080
)
8181

8282
const date1 = await page.textContent('[data-testid="date-now"]')
@@ -104,7 +104,7 @@ test.describe('app router on-demand revalidation', () => {
104104
expect(headers2['cache-status']).toMatch(/"Next.js"; hit/m)
105105
}
106106
expect(headers2['netlify-cdn-cache-control']).toBe(
107-
's-maxage=31536000, stale-while-revalidate=31536000',
107+
's-maxage=31536000, stale-while-revalidate=31536000, durable',
108108
)
109109

110110
// the page is cached
@@ -134,7 +134,7 @@ test.describe('app router on-demand revalidation', () => {
134134
expect(response3?.status()).toBe(200)
135135
expect(headers3?.['x-nextjs-cache']).toBeUndefined()
136136
expect(headers3['netlify-cdn-cache-control']).toBe(
137-
's-maxage=31536000, stale-while-revalidate=31536000',
137+
's-maxage=31536000, stale-while-revalidate=31536000, durable',
138138
)
139139

140140
// the page has now an updated date
@@ -161,7 +161,7 @@ test.describe('app router on-demand revalidation', () => {
161161
expect(headers4['cache-status']).toMatch(/"Next.js"; hit/m)
162162
}
163163
expect(headers4['netlify-cdn-cache-control']).toBe(
164-
's-maxage=31536000, stale-while-revalidate=31536000',
164+
's-maxage=31536000, stale-while-revalidate=31536000, durable',
165165
)
166166

167167
// the page is cached

0 commit comments

Comments
 (0)