From 0d721b60c2b0447f85f20f457e908a494acb28b0 Mon Sep 17 00:00:00 2001 From: Hendrik Liebau Date: Mon, 27 Oct 2025 22:06:28 +0100 Subject: [PATCH] [Flight] Don't hang after resolving cyclic references (#34988) --- .../react-client/src/ReactFlightClient.js | 16 ++++++++++++ .../src/__tests__/ReactFlightDOMEdge-test.js | 25 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/packages/react-client/src/ReactFlightClient.js b/packages/react-client/src/ReactFlightClient.js index c7506a13e5..503f79e4cc 100644 --- a/packages/react-client/src/ReactFlightClient.js +++ b/packages/react-client/src/ReactFlightClient.js @@ -624,6 +624,22 @@ function wakeChunkIfInitialized( rejectListeners.splice(rejectionIdx, 1); } } + // The status might have changed after fulfilling the reference. + switch ((chunk: SomeChunk).status) { + case INITIALIZED: + const initializedChunk: InitializedChunk = (chunk: any); + wakeChunk( + resolveListeners, + initializedChunk.value, + initializedChunk, + ); + return; + case ERRORED: + if (rejectListeners !== null) { + rejectChunk(rejectListeners, chunk.reason); + } + return; + } } } } diff --git a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js index a47c9b086a..9e024107fc 100644 --- a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js +++ b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js @@ -2196,4 +2196,29 @@ describe('ReactFlightDOMEdge', () => { 'Switched to client rendering because the server rendering errored:\n\nssr-throw', ); }); + + it('should properly resolve with deduped objects', async () => { + const obj = {foo: 'hi'}; + + function Test(props) { + return props.obj.foo; + } + + const root = { + obj: obj, + node: , + }; + + const stream = ReactServerDOMServer.renderToReadableStream(root); + + const response = ReactServerDOMClient.createFromReadableStream(stream, { + serverConsumerManifest: { + moduleMap: null, + moduleLoading: null, + }, + }); + + const result = await response; + expect(result).toEqual({obj: obj, node: 'hi'}); + }); });