diff --git a/packages/next/server/base-server.ts b/packages/next/server/base-server.ts index 6daf2ff74739313..1a941cfa2ad0702 100644 --- a/packages/next/server/base-server.ts +++ b/packages/next/server/base-server.ts @@ -16,6 +16,7 @@ import type { CacheFs } from '../shared/lib/utils' import type { PreviewData } from 'next/types' import type { PagesManifest } from '../build/webpack/plugins/pages-manifest-plugin' import type { BaseNextRequest, BaseNextResponse } from './base-http' +import type { PayloadOptions } from './send-payload' import { join, resolve } from 'path' import { parse as parseQs } from 'querystring' @@ -42,7 +43,7 @@ import * as envConfig from '../shared/lib/runtime-config' import { DecodeError, normalizeRepeatedSlashes } from '../shared/lib/utils' import { isTargetLikeServerless } from './utils' import Router, { replaceBasePath, route } from './router' -import { PayloadOptions, setRevalidateHeaders } from './send-payload' +import { setRevalidateHeaders } from './send-payload/revalidate-headers' import { IncrementalCache } from './incremental-cache' import { execOnce } from '../shared/lib/utils' import { isBlockedPage, isBot } from './utils' diff --git a/packages/next/server/send-payload.ts b/packages/next/server/send-payload/index.ts similarity index 68% rename from packages/next/server/send-payload.ts rename to packages/next/server/send-payload/index.ts index ccc702b69e1c774..e344a61c7aeccb8 100644 --- a/packages/next/server/send-payload.ts +++ b/packages/next/server/send-payload/index.ts @@ -1,42 +1,17 @@ import type { IncomingMessage, ServerResponse } from 'http' -import type { BaseNextResponse } from './base-http' -import { isResSent } from '../shared/lib/utils' +import { isResSent } from '../../shared/lib/utils' import generateETag from 'next/dist/compiled/etag' import fresh from 'next/dist/compiled/fresh' -import RenderResult from './render-result' +import RenderResult from '../render-result' +import { setRevalidateHeaders } from './revalidate-headers' export type PayloadOptions = | { private: true } | { private: boolean; stateful: true } | { private: boolean; stateful: false; revalidate: number | false } -export function setRevalidateHeaders( - res: ServerResponse | BaseNextResponse, - options: PayloadOptions -) { - if (options.private || options.stateful) { - if (options.private || !res.hasHeader('Cache-Control')) { - res.setHeader( - 'Cache-Control', - `private, no-cache, no-store, max-age=0, must-revalidate` - ) - } - } else if (typeof options.revalidate === 'number') { - if (options.revalidate < 1) { - throw new Error( - `invariant: invalid Cache-Control duration provided: ${options.revalidate} < 1` - ) - } - - res.setHeader( - 'Cache-Control', - `s-maxage=${options.revalidate}, stale-while-revalidate` - ) - } else if (options.revalidate === false) { - res.setHeader('Cache-Control', `s-maxage=31536000, stale-while-revalidate`) - } -} +export { setRevalidateHeaders } export async function sendRenderResult({ req, diff --git a/packages/next/server/send-payload/revalidate-headers.ts b/packages/next/server/send-payload/revalidate-headers.ts new file mode 100644 index 000000000000000..1f74b12533c9324 --- /dev/null +++ b/packages/next/server/send-payload/revalidate-headers.ts @@ -0,0 +1,30 @@ +import type { ServerResponse } from 'http' +import type { BaseNextResponse } from '../base-http' +import type { PayloadOptions } from './index' + +export function setRevalidateHeaders( + res: ServerResponse | BaseNextResponse, + options: PayloadOptions +) { + if (options.private || options.stateful) { + if (options.private || !res.hasHeader('Cache-Control')) { + res.setHeader( + 'Cache-Control', + `private, no-cache, no-store, max-age=0, must-revalidate` + ) + } + } else if (typeof options.revalidate === 'number') { + if (options.revalidate < 1) { + throw new Error( + `invariant: invalid Cache-Control duration provided: ${options.revalidate} < 1` + ) + } + + res.setHeader( + 'Cache-Control', + `s-maxage=${options.revalidate}, stale-while-revalidate` + ) + } else if (options.revalidate === false) { + res.setHeader('Cache-Control', `s-maxage=31536000, stale-while-revalidate`) + } +} diff --git a/test/integration/production-swcminify/test/index.test.js b/test/integration/production-swcminify/test/index.test.js index c538a3a0f63af82..6fa1b211e1abaf8 100644 --- a/test/integration/production-swcminify/test/index.test.js +++ b/test/integration/production-swcminify/test/index.test.js @@ -75,7 +75,7 @@ describe.skip('Production Usage with swcMinify', () => { expect(serverTrace.version).toBe(1) expect( serverTrace.files.some((file) => - file.includes('next/dist/server/send-payload.js') + file.includes('next/dist/server/send-payload/index.js') ) ).toBe(true) expect( diff --git a/test/integration/production/test/index.test.js b/test/integration/production/test/index.test.js index fded13b7b530e36..07fd1e826a4d3ed 100644 --- a/test/integration/production/test/index.test.js +++ b/test/integration/production/test/index.test.js @@ -95,7 +95,7 @@ describe('Production Usage', () => { expect(serverTrace.version).toBe(1) expect( serverTrace.files.some((file) => - file.includes('next/dist/server/send-payload.js') + file.includes('next/dist/server/send-payload/index.js') ) ).toBe(true) expect(