Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf: lazy eval headers from the requestStore #41353

Merged
merged 5 commits into from Oct 13, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/next/client/components/hooks-server.ts
Expand Up @@ -24,7 +24,7 @@ export function headers(): Headers {
? requestAsyncStorage.getStore()!
: requestAsyncStorage

return requestStore.headers
return requestStore.headers()
}

export function previewData() {
Expand Down
2 changes: 1 addition & 1 deletion packages/next/client/components/request-async-storage.ts
Expand Up @@ -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
}
Expand Down
13 changes: 12 additions & 1 deletion packages/next/server/app-render.tsx
Expand Up @@ -83,6 +83,17 @@ const INTERNAL_COOKIES_INSTANCE = Symbol('internal for cookies readonly')
function readonlyCookiesError() {
return new Error('ReadonlyCookies cannot be modified')
}

function lazy<T>(fn: () => T) {
let value: any
return () => {
if (!value) {
value = fn()
}
return value
}
}

feedthejim marked this conversation as resolved.
Show resolved Hide resolved
class ReadonlyNextCookies {
[INTERNAL_COOKIES_INSTANCE]: NextCookies

Expand Down Expand Up @@ -1572,7 +1583,7 @@ export async function renderToHTMLOrFlight(
)

const requestStore = {
headers: new ReadonlyHeaders(headersWithoutFlight(req.headers)),
headers: lazy(() => new ReadonlyHeaders(headersWithoutFlight(req.headers))),
feedthejim marked this conversation as resolved.
Show resolved Hide resolved
cookies: new ReadonlyNextCookies({
headers: {
get: (key) => {
Expand Down