diff --git a/packages/react-client/src/ReactFlightClient.js b/packages/react-client/src/ReactFlightClient.js index c7506a13e5941..503f79e4cc582 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 a47c9b086a18c..9e024107fc5dd 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'}); + }); });