diff --git a/packages/react-client/src/ReactFlightClient.js b/packages/react-client/src/ReactFlightClient.js index fbeba4f6c65e2..6cb9dee4d15de 100644 --- a/packages/react-client/src/ReactFlightClient.js +++ b/packages/react-client/src/ReactFlightClient.js @@ -46,6 +46,7 @@ import { enableRefAsProp, enableFlightReadableStream, enableOwnerStacks, + enableHalt, } from 'shared/ReactFeatureFlags'; import { @@ -1193,6 +1194,10 @@ function parseModelString( } case '@': { // Promise + if (value.length === 2) { + // Infinite promise that never resolves. + return new Promise(() => {}); + } const id = parseInt(value.slice(2), 16); const chunk = getChunk(response, id); return chunk; @@ -2633,8 +2638,10 @@ function processFullStringRow( } // Fallthrough case 35 /* "#" */: { - resolveBlocked(response, id); - return; + if (enableHalt) { + resolveBlocked(response, id); + return; + } } // Fallthrough default: /* """ "{" "[" "t" "f" "n" "0" - "9" */ { diff --git a/packages/react-client/src/__tests__/ReactFlight-test.js b/packages/react-client/src/__tests__/ReactFlight-test.js index ef457631e3a8c..0c3b8798dc8c3 100644 --- a/packages/react-client/src/__tests__/ReactFlight-test.js +++ b/packages/react-client/src/__tests__/ReactFlight-test.js @@ -3026,7 +3026,6 @@ describe('ReactFlight', () => { const promise = mockConsoleLog.mock.calls[0][1].promise; expect(promise).toBeInstanceOf(Promise); - expect(promise.status).toBe('blocked'); expect(ownerStacks).toEqual(['\n in App (at **)']); }); diff --git a/packages/react-server/src/ReactFlightServer.js b/packages/react-server/src/ReactFlightServer.js index 3680cc715adba..c9fe9e3434bb7 100644 --- a/packages/react-server/src/ReactFlightServer.js +++ b/packages/react-server/src/ReactFlightServer.js @@ -1817,6 +1817,10 @@ function serializeLazyID(id: number): string { return '$L' + id.toString(16); } +function serializeInfinitePromise(): string { + return '$@'; +} + function serializePromiseID(id: number): string { return '$@' + id.toString(16); } @@ -3269,10 +3273,7 @@ function renderConsoleValue( } // If it hasn't already resolved (and been instrumented) we just encode an infinite // promise that will never resolve. - request.pendingChunks++; - const blockedId = request.nextChunkId++; - emitBlockedChunk(request, blockedId); - return serializePromiseID(blockedId); + return serializeInfinitePromise(); } if (existingReference !== undefined) {