From 4f395f5678eeb0b9dcc0c19cb48377ab9c0fcfd4 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 10 Oct 2024 14:53:19 -0400 Subject: [PATCH] Fix clone response backport (#71115) Follow-up to https://github.com/vercel/next.js/pull/70649 this tweaks the backport to properly clone and return original response so that pending revalidates aren't sharing an already used response. --- packages/next/src/server/lib/patch-fetch.ts | 32 ++++++++++++++------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/next/src/server/lib/patch-fetch.ts b/packages/next/src/server/lib/patch-fetch.ts index 3382c3d6526e1..63a4dccd74920 100644 --- a/packages/next/src/server/lib/patch-fetch.ts +++ b/packages/next/src/server/lib/patch-fetch.ts @@ -737,16 +737,28 @@ function createPatchedFetcher( const res: Response = await pendingRevalidate return res.clone() } - return (staticGenerationStore.pendingRevalidates[cacheKey] = - doOriginalFetch(true, cacheReasonOverride) - .then((res) => { - return res.clone() - }) - .finally(async () => { - staticGenerationStore.pendingRevalidates ??= {} - delete staticGenerationStore.pendingRevalidates[cacheKey || ''] - await handleUnlock() - })) + const pendingResponse = doOriginalFetch(true, cacheReasonOverride) + const nextRevalidate = pendingResponse + .then((res) => res.clone()) + .finally(() => { + if (cacheKey) { + // If the pending revalidate is not present in the store, then + // we have nothing to delete. + if (!staticGenerationStore.pendingRevalidates?.[cacheKey]) { + return + } + + delete staticGenerationStore.pendingRevalidates[cacheKey] + } + }) + + // Attach the empty catch here so we don't get a "unhandled promise + // rejection" warning + nextRevalidate.catch(() => {}) + + staticGenerationStore.pendingRevalidates[cacheKey] = nextRevalidate + + return pendingResponse } else { return doOriginalFetch(false, cacheReasonOverride).finally( handleUnlock