Skip to content

Commit 0d721b6

Browse files
authored
[Flight] Don't hang after resolving cyclic references (#34988)
1 parent d3d0ce3 commit 0d721b6

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

‎packages/react-client/src/ReactFlightClient.js‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,22 @@ function wakeChunkIfInitialized<T>(
624624
rejectListeners.splice(rejectionIdx, 1);
625625
}
626626
}
627+
// The status might have changed after fulfilling the reference.
628+
switch ((chunk: SomeChunk<T>).status) {
629+
case INITIALIZED:
630+
const initializedChunk: InitializedChunk<T> = (chunk: any);
631+
wakeChunk(
632+
resolveListeners,
633+
initializedChunk.value,
634+
initializedChunk,
635+
);
636+
return;
637+
case ERRORED:
638+
if (rejectListeners !== null) {
639+
rejectChunk(rejectListeners, chunk.reason);
640+
}
641+
return;
642+
}
627643
}
628644
}
629645
}

‎packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2196,4 +2196,29 @@ describe('ReactFlightDOMEdge', () => {
21962196
'Switched to client rendering because the server rendering errored:\n\nssr-throw',
21972197
);
21982198
});
2199+
2200+
it('should properly resolve with deduped objects', async () => {
2201+
const obj = {foo: 'hi'};
2202+
2203+
function Test(props) {
2204+
return props.obj.foo;
2205+
}
2206+
2207+
const root = {
2208+
obj: obj,
2209+
node: <Test obj={obj} />,
2210+
};
2211+
2212+
const stream = ReactServerDOMServer.renderToReadableStream(root);
2213+
2214+
const response = ReactServerDOMClient.createFromReadableStream(stream, {
2215+
serverConsumerManifest: {
2216+
moduleMap: null,
2217+
moduleLoading: null,
2218+
},
2219+
});
2220+
2221+
const result = await response;
2222+
expect(result).toEqual({obj: obj, node: 'hi'});
2223+
});
21992224
});

0 commit comments

Comments
 (0)