Skip to content

Commit fb427ef

Browse files
committed
always return non-exotic promises in cacheComponents
1 parent 7b80a1f commit fb427ef

File tree

6 files changed

+110
-71
lines changed

6 files changed

+110
-71
lines changed

packages/next/errors.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -770,5 +770,9 @@
770770
"769": "createSearchParamsFromClient should not be called in a runtime prerender.",
771771
"770": "createParamsFromClient should not be called in a runtime prerender.",
772772
"771": "\\`%s\\` was called during a runtime prerender. Next.js should be preventing %s from being included in server components statically, but did not in this case.",
773-
"772": "FetchStrategy.PPRRuntime should never be used when `experimental.clientSegmentCache` is disabled"
773+
"772": "FetchStrategy.PPRRuntime should never be used when `experimental.clientSegmentCache` is disabled",
774+
"773": "createParamsFromClient should not be called in a server prerender.",
775+
"774": "createServerParamsForRoute should not be called in a client prerender.",
776+
"775": "createServerParamsForServerSegment should not be called in a client prerender.",
777+
"776": "createPrerenderParamsForClientSegment should not be called in a server prerender."
774778
}

packages/next/src/server/request/cookies.ts

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,19 @@ export function cookies(): Promise<ReadonlyRequestCookies> {
116116
)
117117
case 'prerender-runtime':
118118
case 'private-cache':
119-
return makeUntrackedExoticCookies(workUnitStore.cookies)
119+
if (process.env.__NEXT_CACHE_COMPONENTS) {
120+
if (process.env.NODE_ENV === 'development') {
121+
return makeUntrackedCookiesWithDevWarnings(workUnitStore.cookies)
122+
}
123+
return makeUntrackedCookies(workUnitStore.cookies)
124+
} else {
125+
if (process.env.NODE_ENV === 'development') {
126+
return makeUntrackedExoticCookiesWithDevWarnings(
127+
workUnitStore.cookies
128+
)
129+
}
130+
return makeUntrackedExoticCookies(workUnitStore.cookies)
131+
}
120132
case 'request':
121133
trackDynamicDataInDynamicRender(workUnitStore)
122134

@@ -131,24 +143,24 @@ export function cookies(): Promise<ReadonlyRequestCookies> {
131143
underlyingCookies = workUnitStore.cookies
132144
}
133145

134-
if (
135-
process.env.NODE_ENV === 'development' &&
136-
!workStore?.isPrefetchRequest
137-
) {
138-
if (process.env.__NEXT_CACHE_COMPONENTS) {
146+
if (process.env.__NEXT_CACHE_COMPONENTS) {
147+
if (process.env.NODE_ENV === 'development') {
139148
return makeUntrackedCookiesWithDevWarnings(
140149
underlyingCookies,
141150
workStore?.route
142151
)
143152
}
144-
145-
return makeUntrackedExoticCookiesWithDevWarnings(
146-
underlyingCookies,
147-
workStore?.route
148-
)
153+
return makeUntrackedCookies(underlyingCookies)
149154
} else {
155+
if (process.env.NODE_ENV === 'development') {
156+
return makeUntrackedExoticCookiesWithDevWarnings(
157+
underlyingCookies,
158+
workStore?.route
159+
)
160+
}
150161
return makeUntrackedExoticCookies(underlyingCookies)
151162
}
163+
152164
default:
153165
workUnitStore satisfies never
154166
}
@@ -186,6 +198,15 @@ function makeHangingCookies(
186198
return promise
187199
}
188200

201+
function makeUntrackedCookies(underlyingCookies: ReadonlyRequestCookies) {
202+
let promise = CachedCookies.get(underlyingCookies)
203+
if (!promise) {
204+
promise = Promise.resolve(underlyingCookies)
205+
CachedCookies.set(underlyingCookies, promise)
206+
}
207+
return promise
208+
}
209+
189210
function makeUntrackedExoticCookies(
190211
underlyingCookies: ReadonlyRequestCookies
191212
): Promise<ReadonlyRequestCookies> {

packages/next/src/server/request/draft-mode.ts

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -93,32 +93,31 @@ function createOrGetCachedDraftMode(
9393
workStore: WorkStore | undefined
9494
): Promise<DraftMode> {
9595
const cacheKey = draftModeProvider ?? NullDraftMode
96-
const cachedDraftMode = CachedDraftModes.get(cacheKey)
97-
98-
if (cachedDraftMode) {
99-
return cachedDraftMode
100-
}
101-
102-
let promise: Promise<DraftMode>
103-
104-
if (process.env.NODE_ENV === 'development' && !workStore?.isPrefetchRequest) {
105-
const route = workStore?.route
96+
let promise = CachedDraftModes.get(cacheKey)
10697

98+
if (!promise) {
10799
if (process.env.__NEXT_CACHE_COMPONENTS) {
108-
return createDraftModeWithDevWarnings(draftModeProvider, route)
109-
}
110-
111-
promise = createExoticDraftModeWithDevWarnings(draftModeProvider, route)
112-
} else {
113-
if (process.env.__NEXT_CACHE_COMPONENTS) {
114-
return Promise.resolve(new DraftMode(draftModeProvider))
100+
if (process.env.NODE_ENV === 'development') {
101+
promise = createDraftModeWithDevWarnings(
102+
draftModeProvider,
103+
workStore?.route
104+
)
105+
} else {
106+
promise = Promise.resolve(new DraftMode(draftModeProvider))
107+
}
108+
} else {
109+
if (process.env.NODE_ENV === 'development') {
110+
promise = createExoticDraftModeWithDevWarnings(
111+
draftModeProvider,
112+
workStore?.route
113+
)
114+
} else {
115+
promise = createExoticDraftMode(draftModeProvider)
116+
}
115117
}
116-
117-
promise = createExoticDraftMode(draftModeProvider)
118+
CachedDraftModes.set(cacheKey, promise)
118119
}
119120

120-
CachedDraftModes.set(cacheKey, promise)
121-
122121
return promise
123122
}
124123

packages/next/src/server/request/headers.ts

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -150,25 +150,24 @@ export function headers(): Promise<ReadonlyHeaders> {
150150
case 'request':
151151
trackDynamicDataInDynamicRender(workUnitStore)
152152

153-
if (
154-
process.env.NODE_ENV === 'development' &&
155-
!workStore?.isPrefetchRequest
156-
) {
157-
if (process.env.__NEXT_CACHE_COMPONENTS) {
153+
if (process.env.__NEXT_CACHE_COMPONENTS) {
154+
if (process.env.NODE_ENV === 'development') {
158155
return makeUntrackedHeadersWithDevWarnings(
159156
workUnitStore.headers,
160157
workStore?.route
161158
)
162159
}
163-
164-
return makeUntrackedExoticHeadersWithDevWarnings(
165-
workUnitStore.headers,
166-
workStore?.route
167-
)
160+
return makeUntrackedHeaders(workUnitStore.headers)
168161
} else {
162+
if (process.env.NODE_ENV === 'development') {
163+
return makeUntrackedExoticHeadersWithDevWarnings(
164+
workUnitStore.headers,
165+
workStore?.route
166+
)
167+
}
169168
return makeUntrackedExoticHeaders(workUnitStore.headers)
170169
}
171-
break
170+
172171
default:
173172
workUnitStore satisfies never
174173
}
@@ -199,6 +198,17 @@ function makeHangingHeaders(
199198
return promise
200199
}
201200

201+
function makeUntrackedHeaders(
202+
underlyingHeaders: ReadonlyHeaders
203+
): Promise<ReadonlyHeaders> {
204+
let promise = CachedHeaders.get(underlyingHeaders)
205+
if (!promise) {
206+
promise = Promise.resolve(underlyingHeaders)
207+
CachedHeaders.set(underlyingHeaders, promise)
208+
}
209+
return promise
210+
}
211+
202212
function makeUntrackedExoticHeaders(
203213
underlyingHeaders: ReadonlyHeaders
204214
): Promise<ReadonlyHeaders> {

packages/next/src/server/request/params.ts

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,14 @@ export function createParamsFromClient(
6363
const workUnitStore = workUnitAsyncStorage.getStore()
6464
if (workUnitStore) {
6565
switch (workUnitStore.type) {
66-
case 'prerender':
6766
case 'prerender-client':
6867
case 'prerender-ppr':
6968
case 'prerender-legacy':
7069
return createPrerenderParams(underlyingParams, workStore, workUnitStore)
70+
case 'prerender':
71+
throw new InvariantError(
72+
'createParamsFromClient should not be called in a server prerender.'
73+
)
7174
case 'cache':
7275
case 'private-cache':
7376
case 'unstable-cache':
@@ -100,10 +103,13 @@ export function createServerParamsForRoute(
100103
if (workUnitStore) {
101104
switch (workUnitStore.type) {
102105
case 'prerender':
103-
case 'prerender-client':
104106
case 'prerender-ppr':
105107
case 'prerender-legacy':
106108
return createPrerenderParams(underlyingParams, workStore, workUnitStore)
109+
case 'prerender-client':
110+
throw new InvariantError(
111+
'createServerParamsForRoute should not be called in a client prerender.'
112+
)
107113
case 'cache':
108114
case 'private-cache':
109115
case 'unstable-cache':
@@ -128,10 +134,13 @@ export function createServerParamsForServerSegment(
128134
if (workUnitStore) {
129135
switch (workUnitStore.type) {
130136
case 'prerender':
131-
case 'prerender-client':
132137
case 'prerender-ppr':
133138
case 'prerender-legacy':
134139
return createPrerenderParams(underlyingParams, workStore, workUnitStore)
140+
case 'prerender-client':
141+
throw new InvariantError(
142+
'createServerParamsForServerSegment should not be called in a client prerender.'
143+
)
135144
case 'cache':
136145
case 'private-cache':
137146
case 'unstable-cache':
@@ -154,7 +163,6 @@ export function createPrerenderParamsForClientSegment(
154163
const workUnitStore = workUnitAsyncStorage.getStore()
155164
if (workUnitStore) {
156165
switch (workUnitStore.type) {
157-
case 'prerender':
158166
case 'prerender-client':
159167
const fallbackParams = workUnitStore.fallbackRouteParams
160168
if (fallbackParams) {
@@ -169,6 +177,10 @@ export function createPrerenderParamsForClientSegment(
169177
}
170178
}
171179
break
180+
case 'prerender':
181+
throw new InvariantError(
182+
'createPrerenderParamsForClientSegment should not be called in a server prerender.'
183+
)
172184
case 'cache':
173185
case 'private-cache':
174186
case 'unstable-cache':
@@ -245,23 +257,21 @@ function createRenderParams(
245257
underlyingParams: Params,
246258
workStore: WorkStore
247259
): Promise<Params> {
248-
if (process.env.NODE_ENV === 'development' && !workStore.isPrefetchRequest) {
249-
if (process.env.__NEXT_CACHE_COMPONENTS) {
260+
if (process.env.__NEXT_CACHE_COMPONENTS) {
261+
if (process.env.NODE_ENV === 'development') {
250262
return makeDynamicallyTrackedParamsWithDevWarnings(
251263
underlyingParams,
252264
workStore
253265
)
254266
}
255-
256-
return makeDynamicallyTrackedExoticParamsWithDevWarnings(
257-
underlyingParams,
258-
workStore
259-
)
267+
return makeUntrackedParams(underlyingParams)
260268
} else {
261-
if (process.env.__NEXT_CACHE_COMPONENTS) {
262-
return makeUntrackedParams(underlyingParams)
269+
if (process.env.NODE_ENV === 'development') {
270+
return makeDynamicallyTrackedExoticParamsWithDevWarnings(
271+
underlyingParams,
272+
workStore
273+
)
263274
}
264-
265275
return makeUntrackedExoticParams(underlyingParams)
266276
}
267277
}

packages/next/src/server/request/search-params.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -198,26 +198,21 @@ function createRenderSearchParams(
198198
// dictionary object.
199199
return Promise.resolve({})
200200
} else {
201-
if (
202-
process.env.NODE_ENV === 'development' &&
203-
!workStore.isPrefetchRequest
204-
) {
205-
if (process.env.__NEXT_CACHE_COMPONENTS) {
201+
if (process.env.__NEXT_CACHE_COMPONENTS) {
202+
if (process.env.NODE_ENV === 'development') {
206203
return makeUntrackedSearchParamsWithDevWarnings(
207204
underlyingSearchParams,
208205
workStore
209206
)
210207
}
211-
212-
return makeDynamicallyTrackedExoticSearchParamsWithDevWarnings(
213-
underlyingSearchParams,
214-
workStore
215-
)
208+
return makeUntrackedSearchParams(underlyingSearchParams)
216209
} else {
217-
if (process.env.__NEXT_CACHE_COMPONENTS) {
218-
return makeUntrackedSearchParams(underlyingSearchParams)
210+
if (process.env.NODE_ENV === 'development') {
211+
return makeDynamicallyTrackedExoticSearchParamsWithDevWarnings(
212+
underlyingSearchParams,
213+
workStore
214+
)
219215
}
220-
221216
return makeUntrackedExoticSearchParams(underlyingSearchParams)
222217
}
223218
}

0 commit comments

Comments
 (0)