From 5487354b5123dbe7fe5676733f43321ddfc9e09d Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Wed, 12 Oct 2022 12:25:31 +0200 Subject: [PATCH 1/3] lazy evla headers --- packages/next/client/components/hooks-server.ts | 2 +- packages/next/client/components/request-async-storage.ts | 2 +- packages/next/server/app-render.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/next/client/components/hooks-server.ts b/packages/next/client/components/hooks-server.ts index 63a906e03f5e5..beb0ad95414c7 100644 --- a/packages/next/client/components/hooks-server.ts +++ b/packages/next/client/components/hooks-server.ts @@ -24,7 +24,7 @@ export function headers(): Headers { ? requestAsyncStorage.getStore()! : requestAsyncStorage - return requestStore.headers + return requestStore.headers() } export function previewData() { diff --git a/packages/next/client/components/request-async-storage.ts b/packages/next/client/components/request-async-storage.ts index fc1fff6841c9e..470ca75d90513 100644 --- a/packages/next/client/components/request-async-storage.ts +++ b/packages/next/client/components/request-async-storage.ts @@ -2,7 +2,7 @@ import type { AsyncLocalStorage } from 'async_hooks' import { Cookies } from '../../server/web/spec-extension/cookies' export interface RequestStore { - headers: Headers + headers: () => Headers cookies: Cookies previewData: any } diff --git a/packages/next/server/app-render.tsx b/packages/next/server/app-render.tsx index 45fbb227e6d4d..44501a9dcdc42 100644 --- a/packages/next/server/app-render.tsx +++ b/packages/next/server/app-render.tsx @@ -1572,7 +1572,7 @@ export async function renderToHTMLOrFlight( ) const requestStore = { - headers: new ReadonlyHeaders(headersWithoutFlight(req.headers)), + headers: () => new ReadonlyHeaders(headersWithoutFlight(req.headers)), cookies: new ReadonlyNextCookies({ headers: { get: (key) => { From 65da9a95593796c6834ff5b8a6ce9edc110e61c5 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Wed, 12 Oct 2022 12:34:04 +0200 Subject: [PATCH 2/3] actually make lazy --- packages/next/server/app-render.tsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/next/server/app-render.tsx b/packages/next/server/app-render.tsx index 44501a9dcdc42..e6b601b8287e5 100644 --- a/packages/next/server/app-render.tsx +++ b/packages/next/server/app-render.tsx @@ -83,6 +83,17 @@ const INTERNAL_COOKIES_INSTANCE = Symbol('internal for cookies readonly') function readonlyCookiesError() { return new Error('ReadonlyCookies cannot be modified') } + +function lazy(fn: () => T) { + let value: any + return () => { + if (!value) { + value = fn() + } + return value + } +} + class ReadonlyNextCookies { [INTERNAL_COOKIES_INSTANCE]: NextCookies @@ -1572,7 +1583,7 @@ export async function renderToHTMLOrFlight( ) const requestStore = { - headers: () => new ReadonlyHeaders(headersWithoutFlight(req.headers)), + headers: lazy(() => new ReadonlyHeaders(headersWithoutFlight(req.headers))), cookies: new ReadonlyNextCookies({ headers: { get: (key) => { From 315cca25282bc01236a418156b234cce48398588 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Wed, 12 Oct 2022 15:36:11 +0200 Subject: [PATCH 3/3] switch to getter --- .../next/client/components/hooks-server.ts | 2 +- .../components/request-async-storage.ts | 2 +- packages/next/server/app-render.tsx | 47 ++++++++++--------- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/packages/next/client/components/hooks-server.ts b/packages/next/client/components/hooks-server.ts index beb0ad95414c7..63a906e03f5e5 100644 --- a/packages/next/client/components/hooks-server.ts +++ b/packages/next/client/components/hooks-server.ts @@ -24,7 +24,7 @@ export function headers(): Headers { ? requestAsyncStorage.getStore()! : requestAsyncStorage - return requestStore.headers() + return requestStore.headers } export function previewData() { diff --git a/packages/next/client/components/request-async-storage.ts b/packages/next/client/components/request-async-storage.ts index 470ca75d90513..fc1fff6841c9e 100644 --- a/packages/next/client/components/request-async-storage.ts +++ b/packages/next/client/components/request-async-storage.ts @@ -2,7 +2,7 @@ import type { AsyncLocalStorage } from 'async_hooks' import { Cookies } from '../../server/web/spec-extension/cookies' export interface RequestStore { - headers: () => Headers + headers: Headers cookies: Cookies previewData: any } diff --git a/packages/next/server/app-render.tsx b/packages/next/server/app-render.tsx index e6b601b8287e5..b5c912a51fefe 100644 --- a/packages/next/server/app-render.tsx +++ b/packages/next/server/app-render.tsx @@ -84,16 +84,6 @@ function readonlyCookiesError() { return new Error('ReadonlyCookies cannot be modified') } -function lazy(fn: () => T) { - let value: any - return () => { - if (!value) { - value = fn() - } - return value - } -} - class ReadonlyNextCookies { [INTERNAL_COOKIES_INSTANCE]: NextCookies @@ -1582,18 +1572,33 @@ export async function renderToHTMLOrFlight( (renderOpts as any).previewProps ) + let cachedHeadersInstance: ReadonlyHeaders | undefined + let cachedCookiesInstance: ReadonlyNextCookies | undefined + const requestStore = { - headers: lazy(() => new ReadonlyHeaders(headersWithoutFlight(req.headers))), - cookies: new ReadonlyNextCookies({ - headers: { - get: (key) => { - if (key !== 'cookie') { - throw new Error('Only cookie header is supported') - } - return req.headers.cookie - }, - }, - }), + get headers() { + if (!cachedHeadersInstance) { + cachedHeadersInstance = new ReadonlyHeaders( + headersWithoutFlight(req.headers) + ) + } + return cachedHeadersInstance + }, + get cookies() { + if (!cachedCookiesInstance) { + cachedCookiesInstance = new ReadonlyNextCookies({ + headers: { + get: (key) => { + if (key !== 'cookie') { + throw new Error('Only cookie header is supported') + } + return req.headers.cookie + }, + }, + }) + } + return cachedCookiesInstance + }, previewData, }