@samitouri / QOS-React-2 / commits / 4e62fd2712

clone json obj in relay flight client host config parser (#20465)

When `parseModel` suspends because of missing dependencies, it will exit and retry to parse later. However, in the relay implementation, the model is an object that we modify in place when we parse it, so when we we retry, part of the model might be parsed already into React elements, which will error because the parsing code expect a Flight model. This diff clones instead of mutating the original model, which fixes this error.

Luna Ruan committed Dec 15, 2020 at 15:33 UTC 4e62fd2712fc279cc01a65a73ac7e7866489c654
1 file changed +10 -3
packages/react-server-dom-relay/src/ReactFlightDOMRelayClientHostConfig.js
+10 -3
@@ -36,18 +36,25 @@ function parseModelRecursively(response: Response, parentObj, value) {
36 }
37 if (typeof value === 'object' && value !== null) {
38 if (Array.isArray(value)) {
39 + const parsedValue = [];
40 for (let i = 0; i < value.length; i++) {
40 - (value: any)[i] = parseModelRecursively(response, value, value[i]);
41 + (parsedValue: any)[i] = parseModelRecursively(
42 + response,
43 + value,
44 + value[i],
45 + );
46 }
42 - return parseModelTuple(response, value);
47 + return parseModelTuple(response, parsedValue);
48 } else {
49 + const parsedValue = {};
50 for (const innerKey in value) {
45 - (value: any)[innerKey] = parseModelRecursively(
51 + (parsedValue: any)[innerKey] = parseModelRecursively(
52 response,
53 value,
54 value[innerKey],
55 );
56 }
57 + return parsedValue;
58 }
59 }
60 return value;