Skip to content

Commit 3c985b0

Browse files
committed
[Cache Components] do not cache request API promises in dev/request
1 parent e0f676b commit 3c985b0

File tree

4 files changed

+101
-26
lines changed

4 files changed

+101
-26
lines changed

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

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,11 @@ function makeHangingCookies(
171171
function makeUntrackedCookies(
172172
underlyingCookies: ReadonlyRequestCookies
173173
): Promise<ReadonlyRequestCookies> {
174+
// If CC is enabled, don't cache the promise.
175+
if (process.env.__NEXT_CACHE_COMPONENTS) {
176+
return Promise.resolve(underlyingCookies)
177+
}
178+
174179
const cachedCookies = CachedCookies.get(underlyingCookies)
175180
if (cachedCookies) {
176181
return cachedCookies
@@ -186,14 +191,29 @@ function makeUntrackedCookiesWithDevWarnings(
186191
underlyingCookies: ReadonlyRequestCookies,
187192
route?: string
188193
): Promise<ReadonlyRequestCookies> {
189-
const cachedCookies = CachedCookies.get(underlyingCookies)
190-
if (cachedCookies) {
194+
// If CC is enabled, don't cache the promise.
195+
if (process.env.__NEXT_CACHE_COMPONENTS) {
196+
return makeUntrackedCookiesWithDevWarningsImpl(underlyingCookies, route)
197+
} else {
198+
let cachedCookies = CachedCookies.get(underlyingCookies)
199+
if (!cachedCookies) {
200+
cachedCookies = makeUntrackedCookiesWithDevWarningsImpl(
201+
underlyingCookies,
202+
route
203+
)
204+
CachedCookies.set(underlyingCookies, cachedCookies)
205+
}
191206
return cachedCookies
192207
}
208+
}
193209

210+
function makeUntrackedCookiesWithDevWarningsImpl(
211+
underlyingCookies: ReadonlyRequestCookies,
212+
route?: string
213+
): Promise<ReadonlyRequestCookies> {
194214
const promise = makeDevtoolsIOAwarePromise(underlyingCookies)
195215

196-
const proxiedPromise = new Proxy(promise, {
216+
return new Proxy(promise, {
197217
get(target, prop, receiver) {
198218
switch (prop) {
199219
case Symbol.iterator: {
@@ -219,10 +239,6 @@ function makeUntrackedCookiesWithDevWarnings(
219239
return ReflectAdapter.get(target, prop, receiver)
220240
},
221241
})
222-
223-
CachedCookies.set(underlyingCookies, proxiedPromise)
224-
225-
return proxiedPromise
226242
}
227243

228244
const warnForSyncAccess = createDedupedByCallsiteServerErrorLoggerDev(

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

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,11 @@ function makeHangingHeaders(
180180
function makeUntrackedHeaders(
181181
underlyingHeaders: ReadonlyHeaders
182182
): Promise<ReadonlyHeaders> {
183+
// If CC is enabled, don't cache the promise.
184+
if (process.env.__NEXT_CACHE_COMPONENTS) {
185+
return Promise.resolve(underlyingHeaders)
186+
}
187+
183188
const cachedHeaders = CachedHeaders.get(underlyingHeaders)
184189
if (cachedHeaders) {
185190
return cachedHeaders
@@ -195,14 +200,29 @@ function makeUntrackedHeadersWithDevWarnings(
195200
underlyingHeaders: ReadonlyHeaders,
196201
route?: string
197202
): Promise<ReadonlyHeaders> {
198-
const cachedHeaders = CachedHeaders.get(underlyingHeaders)
199-
if (cachedHeaders) {
203+
// If CC is enabled, don't cache the promise.
204+
if (process.env.__NEXT_CACHE_COMPONENTS) {
205+
return makeUntrackedHeadersWithDevWarningsImpl(underlyingHeaders, route)
206+
} else {
207+
let cachedHeaders = CachedHeaders.get(underlyingHeaders)
208+
if (!cachedHeaders) {
209+
cachedHeaders = makeUntrackedHeadersWithDevWarningsImpl(
210+
underlyingHeaders,
211+
route
212+
)
213+
CachedHeaders.set(underlyingHeaders, cachedHeaders)
214+
}
200215
return cachedHeaders
201216
}
217+
}
202218

219+
function makeUntrackedHeadersWithDevWarningsImpl(
220+
underlyingHeaders: ReadonlyHeaders,
221+
route?: string
222+
): Promise<ReadonlyHeaders> {
203223
const promise = makeDevtoolsIOAwarePromise(underlyingHeaders)
204224

205-
const proxiedPromise = new Proxy(promise, {
225+
return new Proxy(promise, {
206226
get(target, prop, receiver) {
207227
switch (prop) {
208228
case Symbol.iterator: {
@@ -230,10 +250,6 @@ function makeUntrackedHeadersWithDevWarnings(
230250
return ReflectAdapter.get(target, prop, receiver)
231251
},
232252
})
233-
234-
CachedHeaders.set(underlyingHeaders, proxiedPromise)
235-
236-
return proxiedPromise
237253
}
238254

239255
const warnForSyncAccess = createDedupedByCallsiteServerErrorLoggerDev(

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

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,11 @@ function makeErroringParams(
431431
}
432432

433433
function makeUntrackedParams(underlyingParams: Params): Promise<Params> {
434+
// If CC is enabled, don't cache the promise.
435+
if (process.env.__NEXT_CACHE_COMPONENTS) {
436+
return Promise.resolve(underlyingParams)
437+
}
438+
434439
const cachedParams = CachedParams.get(underlyingParams)
435440
if (cachedParams) {
436441
return cachedParams
@@ -447,11 +452,32 @@ function makeDynamicallyTrackedParamsWithDevWarnings(
447452
hasFallbackParams: boolean,
448453
store: WorkStore
449454
): Promise<Params> {
450-
const cachedParams = CachedParams.get(underlyingParams)
451-
if (cachedParams) {
455+
// If CC is enabled, don't cache the promise.
456+
if (process.env.__NEXT_CACHE_COMPONENTS) {
457+
return makeDynamicallyTrackedParamsWithDevWarningsImpl(
458+
underlyingParams,
459+
hasFallbackParams,
460+
store
461+
)
462+
} else {
463+
let cachedParams = CachedParams.get(underlyingParams)
464+
if (!cachedParams) {
465+
cachedParams = makeDynamicallyTrackedParamsWithDevWarningsImpl(
466+
underlyingParams,
467+
hasFallbackParams,
468+
store
469+
)
470+
CachedParams.set(underlyingParams, cachedParams)
471+
}
452472
return cachedParams
453473
}
474+
}
454475

476+
function makeDynamicallyTrackedParamsWithDevWarningsImpl(
477+
underlyingParams: Params,
478+
hasFallbackParams: boolean,
479+
store: WorkStore
480+
): Promise<Params> {
455481
// We don't use makeResolvedReactPromise here because params
456482
// supports copying with spread and we don't want to unnecessarily
457483
// instrument the promise with spreadable properties of ReactPromise.
@@ -472,7 +498,7 @@ function makeDynamicallyTrackedParamsWithDevWarnings(
472498
}
473499
})
474500

475-
const proxiedPromise = new Proxy(promise, {
501+
return new Proxy(promise, {
476502
get(target, prop, receiver) {
477503
if (typeof prop === 'string') {
478504
if (
@@ -497,9 +523,6 @@ function makeDynamicallyTrackedParamsWithDevWarnings(
497523
return Reflect.ownKeys(target)
498524
},
499525
})
500-
501-
CachedParams.set(underlyingParams, proxiedPromise)
502-
return proxiedPromise
503526
}
504527

505528
const warnForSyncAccess = createDedupedByCallsiteServerErrorLoggerDev(

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

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,11 @@ export function makeErroringSearchParamsForUseCache(
358358
function makeUntrackedSearchParams(
359359
underlyingSearchParams: SearchParams
360360
): Promise<SearchParams> {
361+
// If CC is enabled, don't cache the promise.
362+
if (process.env.__NEXT_CACHE_COMPONENTS) {
363+
return Promise.resolve(underlyingSearchParams)
364+
}
365+
361366
const cachedSearchParams = CachedSearchParams.get(underlyingSearchParams)
362367
if (cachedSearchParams) {
363368
return cachedSearchParams
@@ -373,11 +378,29 @@ function makeUntrackedSearchParamsWithDevWarnings(
373378
underlyingSearchParams: SearchParams,
374379
store: WorkStore
375380
): Promise<SearchParams> {
376-
const cachedSearchParams = CachedSearchParams.get(underlyingSearchParams)
377-
if (cachedSearchParams) {
381+
// If CC is enabled, don't cache the promise.
382+
if (process.env.__NEXT_CACHE_COMPONENTS) {
383+
return makeUntrackedSearchParamsWithDevWarningsImpl(
384+
underlyingSearchParams,
385+
store
386+
)
387+
} else {
388+
let cachedSearchParams = CachedSearchParams.get(underlyingSearchParams)
389+
if (!cachedSearchParams) {
390+
cachedSearchParams = makeUntrackedSearchParamsWithDevWarningsImpl(
391+
underlyingSearchParams,
392+
store
393+
)
394+
CachedSearchParams.set(underlyingSearchParams, cachedSearchParams)
395+
}
378396
return cachedSearchParams
379397
}
398+
}
380399

400+
function makeUntrackedSearchParamsWithDevWarningsImpl(
401+
underlyingSearchParams: SearchParams,
402+
store: WorkStore
403+
): Promise<SearchParams> {
381404
// Track which properties we should warn for.
382405
const proxiedProperties = new Set<string>()
383406

@@ -446,7 +469,7 @@ function makeUntrackedSearchParamsWithDevWarnings(
446469
}
447470
})
448471

449-
const proxiedPromise = new Proxy(promise, {
472+
return new Proxy(promise, {
450473
get(target, prop, receiver) {
451474
if (prop === 'then' && store.dynamicShouldError) {
452475
const expression = '`searchParams.then`'
@@ -499,9 +522,6 @@ function makeUntrackedSearchParamsWithDevWarnings(
499522
return Reflect.ownKeys(target)
500523
},
501524
})
502-
503-
CachedSearchParams.set(underlyingSearchParams, proxiedPromise)
504-
return proxiedPromise
505525
}
506526

507527
const warnForSyncAccess = createDedupedByCallsiteServerErrorLoggerDev(

0 commit comments

Comments
 (0)