From 9b8dba61be89a08952f698e7a442cddd59e54005 Mon Sep 17 00:00:00 2001 From: Jude Gao Date: Wed, 5 Feb 2025 21:41:40 -0500 Subject: [PATCH] fix infinite loop --- .../internal/helpers/get-error-by-type.ts | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/next/src/client/components/react-dev-overlay/internal/helpers/get-error-by-type.ts b/packages/next/src/client/components/react-dev-overlay/internal/helpers/get-error-by-type.ts index 1f51cda5d016d9..7a3875b04e00f6 100644 --- a/packages/next/src/client/components/react-dev-overlay/internal/helpers/get-error-by-type.ts +++ b/packages/next/src/client/components/react-dev-overlay/internal/helpers/get-error-by-type.ts @@ -29,12 +29,14 @@ export function getErrorByType( runtime: true, error: event.reason, // createMemoizedPromise dedups calls to getOriginalStackFrames - frames: createMemoizedPromise(async () => - getOriginalStackFrames( - event.frames, - getErrorSource(event.reason), - isAppDir - ) + frames: createMemoizedPromise( + async () => + getOriginalStackFrames( + event.frames, + getErrorSource(event.reason), + isAppDir + ), + event ), } if (event.type === ACTION_UNHANDLED_ERROR) { @@ -52,19 +54,21 @@ export function getErrorByType( } function createMemoizedPromise( - promiseFactory: () => Promise + promiseFactory: () => Promise, + key: any = '' ): () => Promise { - let cachedPromise: Promise | null = null + const cache = new Map>() return function (): Promise { - // If no promise is cached, create one. - if (!cachedPromise) { - cachedPromise = promiseFactory().catch((error: Error) => { - // Clear the cache on failure so that subsequent calls can retry. - cachedPromise = null + // If no promise is cached for this key, create one + if (!cache.has(key)) { + const promise = promiseFactory().catch((error: Error) => { + // Clear the cache on failure so that subsequent calls can retry + cache.delete(key) throw error }) + cache.set(key, promise) } - return cachedPromise + return cache.get(key)! } }