Skip to content

Commit 4035157

Browse files
authored
Split writeChunk into void and return value (#23343)
This function was modeled after Node streams where write returns a boolean whether to keep writing or not. I think we should probably switch this up and read desired size explicitly in appropriate places. However, in the meantime, we don't have to return a value where we're not going to use it. So I split this so that we call writeChunkAndReturn if we're going to return the boolean. This should help with the compilation so that they can be inlined.
1 parent 2c693b2 commit 4035157

14 files changed

+130
-61
lines changed

packages/react-dom/src/server/ReactDOMLegacyServerStreamConfig.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ let prevWasCommentSegmenter = false;
2828
export function writeChunk(
2929
destination: Destination,
3030
chunk: Chunk | PrecomputedChunk,
31+
): void {
32+
writeChunkAndReturn(destination, chunk);
33+
}
34+
35+
export function writeChunkAndReturn(
36+
destination: Destination,
37+
chunk: Chunk | PrecomputedChunk,
3138
): boolean {
3239
if (prevWasCommentSegmenter) {
3340
prevWasCommentSegmenter = false;

packages/react-dom/src/server/ReactDOMServerFormatConfig.js

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import type {
3030

3131
import {
3232
writeChunk,
33+
writeChunkAndReturn,
3334
stringToChunk,
3435
stringToPrecomputedChunk,
3536
} from 'react-server/src/ReactServerStreamConfig';
@@ -1427,11 +1428,14 @@ export function writeCompletedRoot(
14271428
responseState: ResponseState,
14281429
): boolean {
14291430
const bootstrapChunks = responseState.bootstrapChunks;
1430-
let result = true;
1431-
for (let i = 0; i < bootstrapChunks.length; i++) {
1432-
result = writeChunk(destination, bootstrapChunks[i]);
1431+
let i = 0;
1432+
for (; i < bootstrapChunks.length - 1; i++) {
1433+
writeChunk(destination, bootstrapChunks[i]);
14331434
}
1434-
return result;
1435+
if (i < bootstrapChunks.length) {
1436+
return writeChunkAndReturn(destination, bootstrapChunks[i]);
1437+
}
1438+
return true;
14351439
}
14361440

14371441
// Structural Nodes
@@ -1450,7 +1454,7 @@ export function writePlaceholder(
14501454
writeChunk(destination, responseState.placeholderPrefix);
14511455
const formattedID = stringToChunk(id.toString(16));
14521456
writeChunk(destination, formattedID);
1453-
return writeChunk(destination, placeholder2);
1457+
return writeChunkAndReturn(destination, placeholder2);
14541458
}
14551459

14561460
// Suspense boundaries are encoded as comments.
@@ -1480,7 +1484,7 @@ export function writeStartCompletedSuspenseBoundary(
14801484
destination: Destination,
14811485
responseState: ResponseState,
14821486
): boolean {
1483-
return writeChunk(destination, startCompletedSuspenseBoundary);
1487+
return writeChunkAndReturn(destination, startCompletedSuspenseBoundary);
14841488
}
14851489
export function writeStartPendingSuspenseBoundary(
14861490
destination: Destination,
@@ -1496,31 +1500,31 @@ export function writeStartPendingSuspenseBoundary(
14961500
}
14971501

14981502
writeChunk(destination, id);
1499-
return writeChunk(destination, startPendingSuspenseBoundary2);
1503+
return writeChunkAndReturn(destination, startPendingSuspenseBoundary2);
15001504
}
15011505
export function writeStartClientRenderedSuspenseBoundary(
15021506
destination: Destination,
15031507
responseState: ResponseState,
15041508
): boolean {
1505-
return writeChunk(destination, startClientRenderedSuspenseBoundary);
1509+
return writeChunkAndReturn(destination, startClientRenderedSuspenseBoundary);
15061510
}
15071511
export function writeEndCompletedSuspenseBoundary(
15081512
destination: Destination,
15091513
responseState: ResponseState,
15101514
): boolean {
1511-
return writeChunk(destination, endSuspenseBoundary);
1515+
return writeChunkAndReturn(destination, endSuspenseBoundary);
15121516
}
15131517
export function writeEndPendingSuspenseBoundary(
15141518
destination: Destination,
15151519
responseState: ResponseState,
15161520
): boolean {
1517-
return writeChunk(destination, endSuspenseBoundary);
1521+
return writeChunkAndReturn(destination, endSuspenseBoundary);
15181522
}
15191523
export function writeEndClientRenderedSuspenseBoundary(
15201524
destination: Destination,
15211525
responseState: ResponseState,
15221526
): boolean {
1523-
return writeChunk(destination, endSuspenseBoundary);
1527+
return writeChunkAndReturn(destination, endSuspenseBoundary);
15241528
}
15251529

15261530
const startSegmentHTML = stringToPrecomputedChunk('<div hidden id="');
@@ -1571,25 +1575,25 @@ export function writeStartSegment(
15711575
writeChunk(destination, startSegmentHTML);
15721576
writeChunk(destination, responseState.segmentPrefix);
15731577
writeChunk(destination, stringToChunk(id.toString(16)));
1574-
return writeChunk(destination, startSegmentHTML2);
1578+
return writeChunkAndReturn(destination, startSegmentHTML2);
15751579
}
15761580
case SVG_MODE: {
15771581
writeChunk(destination, startSegmentSVG);
15781582
writeChunk(destination, responseState.segmentPrefix);
15791583
writeChunk(destination, stringToChunk(id.toString(16)));
1580-
return writeChunk(destination, startSegmentSVG2);
1584+
return writeChunkAndReturn(destination, startSegmentSVG2);
15811585
}
15821586
case MATHML_MODE: {
15831587
writeChunk(destination, startSegmentMathML);
15841588
writeChunk(destination, responseState.segmentPrefix);
15851589
writeChunk(destination, stringToChunk(id.toString(16)));
1586-
return writeChunk(destination, startSegmentMathML2);
1590+
return writeChunkAndReturn(destination, startSegmentMathML2);
15871591
}
15881592
case HTML_TABLE_MODE: {
15891593
writeChunk(destination, startSegmentTable);
15901594
writeChunk(destination, responseState.segmentPrefix);
15911595
writeChunk(destination, stringToChunk(id.toString(16)));
1592-
return writeChunk(destination, startSegmentTable2);
1596+
return writeChunkAndReturn(destination, startSegmentTable2);
15931597
}
15941598
// TODO: For the rest of these, there will be extra wrapper nodes that never
15951599
// get deleted from the document. We need to delete the table too as part
@@ -1599,19 +1603,19 @@ export function writeStartSegment(
15991603
writeChunk(destination, startSegmentTableBody);
16001604
writeChunk(destination, responseState.segmentPrefix);
16011605
writeChunk(destination, stringToChunk(id.toString(16)));
1602-
return writeChunk(destination, startSegmentTableBody2);
1606+
return writeChunkAndReturn(destination, startSegmentTableBody2);
16031607
}
16041608
case HTML_TABLE_ROW_MODE: {
16051609
writeChunk(destination, startSegmentTableRow);
16061610
writeChunk(destination, responseState.segmentPrefix);
16071611
writeChunk(destination, stringToChunk(id.toString(16)));
1608-
return writeChunk(destination, startSegmentTableRow2);
1612+
return writeChunkAndReturn(destination, startSegmentTableRow2);
16091613
}
16101614
case HTML_COLGROUP_MODE: {
16111615
writeChunk(destination, startSegmentColGroup);
16121616
writeChunk(destination, responseState.segmentPrefix);
16131617
writeChunk(destination, stringToChunk(id.toString(16)));
1614-
return writeChunk(destination, startSegmentColGroup2);
1618+
return writeChunkAndReturn(destination, startSegmentColGroup2);
16151619
}
16161620
default: {
16171621
throw new Error('Unknown insertion mode. This is a bug in React.');
@@ -1625,25 +1629,25 @@ export function writeEndSegment(
16251629
switch (formatContext.insertionMode) {
16261630
case ROOT_HTML_MODE:
16271631
case HTML_MODE: {
1628-
return writeChunk(destination, endSegmentHTML);
1632+
return writeChunkAndReturn(destination, endSegmentHTML);
16291633
}
16301634
case SVG_MODE: {
1631-
return writeChunk(destination, endSegmentSVG);
1635+
return writeChunkAndReturn(destination, endSegmentSVG);
16321636
}
16331637
case MATHML_MODE: {
1634-
return writeChunk(destination, endSegmentMathML);
1638+
return writeChunkAndReturn(destination, endSegmentMathML);
16351639
}
16361640
case HTML_TABLE_MODE: {
1637-
return writeChunk(destination, endSegmentTable);
1641+
return writeChunkAndReturn(destination, endSegmentTable);
16381642
}
16391643
case HTML_TABLE_BODY_MODE: {
1640-
return writeChunk(destination, endSegmentTableBody);
1644+
return writeChunkAndReturn(destination, endSegmentTableBody);
16411645
}
16421646
case HTML_TABLE_ROW_MODE: {
1643-
return writeChunk(destination, endSegmentTableRow);
1647+
return writeChunkAndReturn(destination, endSegmentTableRow);
16441648
}
16451649
case HTML_COLGROUP_MODE: {
1646-
return writeChunk(destination, endSegmentColGroup);
1650+
return writeChunkAndReturn(destination, endSegmentColGroup);
16471651
}
16481652
default: {
16491653
throw new Error('Unknown insertion mode. This is a bug in React.');
@@ -1790,7 +1794,7 @@ export function writeCompletedSegmentInstruction(
17901794
writeChunk(destination, completeSegmentScript2);
17911795
writeChunk(destination, responseState.placeholderPrefix);
17921796
writeChunk(destination, formattedID);
1793-
return writeChunk(destination, completeSegmentScript3);
1797+
return writeChunkAndReturn(destination, completeSegmentScript3);
17941798
}
17951799

17961800
const completeBoundaryScript1Full = stringToPrecomputedChunk(
@@ -1827,7 +1831,7 @@ export function writeCompletedBoundaryInstruction(
18271831
writeChunk(destination, completeBoundaryScript2);
18281832
writeChunk(destination, responseState.segmentPrefix);
18291833
writeChunk(destination, formattedContentID);
1830-
return writeChunk(destination, completeBoundaryScript3);
1834+
return writeChunkAndReturn(destination, completeBoundaryScript3);
18311835
}
18321836

18331837
const clientRenderScript1Full = stringToPrecomputedChunk(
@@ -1858,5 +1862,5 @@ export function writeClientRenderBoundaryInstruction(
18581862
}
18591863

18601864
writeChunk(destination, boundaryID);
1861-
return writeChunk(destination, clientRenderScript2);
1865+
return writeChunkAndReturn(destination, clientRenderScript2);
18621866
}

packages/react-native-renderer/src/server/ReactNativeServerFormatConfig.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import type {
1717

1818
import {
1919
writeChunk,
20+
writeChunkAndReturn,
2021
stringToChunk,
2122
stringToPrecomputedChunk,
2223
} from 'react-server/src/ReactServerStreamConfig';
@@ -185,15 +186,15 @@ export function writePlaceholder(
185186
id: number,
186187
): boolean {
187188
writeChunk(destination, PLACEHOLDER);
188-
return writeChunk(destination, formatID(id));
189+
return writeChunkAndReturn(destination, formatID(id));
189190
}
190191

191192
// Suspense boundaries are encoded as comments.
192193
export function writeStartCompletedSuspenseBoundary(
193194
destination: Destination,
194195
responseState: ResponseState,
195196
): boolean {
196-
return writeChunk(destination, SUSPENSE_COMPLETE);
197+
return writeChunkAndReturn(destination, SUSPENSE_COMPLETE);
197198
}
198199

199200
export function pushStartCompletedSuspenseBoundary(
@@ -208,19 +209,19 @@ export function writeStartPendingSuspenseBoundary(
208209
id: SuspenseBoundaryID,
209210
): boolean {
210211
writeChunk(destination, SUSPENSE_PENDING);
211-
return writeChunk(destination, formatID(id));
212+
return writeChunkAndReturn(destination, formatID(id));
212213
}
213214
export function writeStartClientRenderedSuspenseBoundary(
214215
destination: Destination,
215216
responseState: ResponseState,
216217
): boolean {
217-
return writeChunk(destination, SUSPENSE_CLIENT_RENDER);
218+
return writeChunkAndReturn(destination, SUSPENSE_CLIENT_RENDER);
218219
}
219220
export function writeEndCompletedSuspenseBoundary(
220221
destination: Destination,
221222
responseState: ResponseState,
222223
): boolean {
223-
return writeChunk(destination, END);
224+
return writeChunkAndReturn(destination, END);
224225
}
225226
export function pushEndCompletedSuspenseBoundary(
226227
target: Array<Chunk | PrecomputedChunk>,
@@ -231,13 +232,13 @@ export function writeEndPendingSuspenseBoundary(
231232
destination: Destination,
232233
responseState: ResponseState,
233234
): boolean {
234-
return writeChunk(destination, END);
235+
return writeChunkAndReturn(destination, END);
235236
}
236237
export function writeEndClientRenderedSuspenseBoundary(
237238
destination: Destination,
238239
responseState: ResponseState,
239240
): boolean {
240-
return writeChunk(destination, END);
241+
return writeChunkAndReturn(destination, END);
241242
}
242243

243244
export function writeStartSegment(
@@ -247,13 +248,13 @@ export function writeStartSegment(
247248
id: number,
248249
): boolean {
249250
writeChunk(destination, SEGMENT);
250-
return writeChunk(destination, formatID(id));
251+
return writeChunkAndReturn(destination, formatID(id));
251252
}
252253
export function writeEndSegment(
253254
destination: Destination,
254255
formatContext: FormatContext,
255256
): boolean {
256-
return writeChunk(destination, END);
257+
return writeChunkAndReturn(destination, END);
257258
}
258259

259260
// Instruction Set
@@ -276,7 +277,7 @@ export function writeCompletedBoundaryInstruction(
276277
): boolean {
277278
writeChunk(destination, SUSPENSE_UPDATE_TO_COMPLETE);
278279
writeChunk(destination, formatID(boundaryID));
279-
return writeChunk(destination, formatID(contentSegmentID));
280+
return writeChunkAndReturn(destination, formatID(contentSegmentID));
280281
}
281282

282283
export function writeClientRenderBoundaryInstruction(
@@ -285,5 +286,5 @@ export function writeClientRenderBoundaryInstruction(
285286
boundaryID: SuspenseBoundaryID,
286287
): boolean {
287288
writeChunk(destination, SUSPENSE_UPDATE_TO_CLIENT_RENDER);
288-
return writeChunk(destination, formatID(boundaryID));
289+
return writeChunkAndReturn(destination, formatID(boundaryID));
289290
}

packages/react-noop-renderer/src/ReactNoopFlightServer.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ const ReactNoopFlightServer = ReactFlightServer({
3030
writeChunk(destination: Destination, chunk: string): void {
3131
destination.push(chunk);
3232
},
33+
writeChunkAndReturn(destination: Destination, chunk: string): boolean {
34+
destination.push(chunk);
35+
return true;
36+
},
3337
completeWriting(destination: Destination): void {},
3438
close(destination: Destination): void {},
3539
closeWithError(destination: Destination, error: mixed): void {},

packages/react-noop-renderer/src/ReactNoopServer.js

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -53,26 +53,34 @@ type Destination = {
5353

5454
const POP = Buffer.from('/', 'utf8');
5555

56+
function write(destination: Destination, buffer: Uint8Array): void {
57+
const stack = destination.stack;
58+
if (buffer === POP) {
59+
stack.pop();
60+
return;
61+
}
62+
// We assume one chunk is one instance.
63+
const instance = JSON.parse(Buffer.from((buffer: any)).toString('utf8'));
64+
if (stack.length === 0) {
65+
destination.root = instance;
66+
} else {
67+
const parent = stack[stack.length - 1];
68+
parent.children.push(instance);
69+
}
70+
stack.push(instance);
71+
}
72+
5673
const ReactNoopServer = ReactFizzServer({
5774
scheduleWork(callback: () => void) {
5875
callback();
5976
},
6077
beginWriting(destination: Destination): void {},
6178
writeChunk(destination: Destination, buffer: Uint8Array): void {
62-
const stack = destination.stack;
63-
if (buffer === POP) {
64-
stack.pop();
65-
return;
66-
}
67-
// We assume one chunk is one instance.
68-
const instance = JSON.parse(Buffer.from((buffer: any)).toString('utf8'));
69-
if (stack.length === 0) {
70-
destination.root = instance;
71-
} else {
72-
const parent = stack[stack.length - 1];
73-
parent.children.push(instance);
74-
}
75-
stack.push(instance);
79+
write(destination, buffer);
80+
},
81+
writeChunkAndReturn(destination: Destination, buffer: Uint8Array): boolean {
82+
write(destination, buffer);
83+
return true;
7684
},
7785
completeWriting(destination: Destination): void {},
7886
close(destination: Destination): void {},

packages/react-server-dom-relay/src/ReactFlightDOMRelayServerHostConfig.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,14 @@ export function flushBuffered(destination: Destination) {}
141141

142142
export function beginWriting(destination: Destination) {}
143143

144-
export function writeChunk(destination: Destination, chunk: Chunk): boolean {
144+
export function writeChunk(destination: Destination, chunk: Chunk): void {
145+
emitRow(destination, chunk);
146+
}
147+
148+
export function writeChunkAndReturn(
149+
destination: Destination,
150+
chunk: Chunk,
151+
): boolean {
145152
emitRow(destination, chunk);
146153
return true;
147154
}

packages/react-server-dom-relay/src/ReactServerStreamConfigFB.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ export function beginWriting(destination: Destination) {}
2828
export function writeChunk(
2929
destination: Destination,
3030
chunk: Chunk | PrecomputedChunk,
31+
): void {
32+
destination.buffer += chunk;
33+
}
34+
35+
export function writeChunkAndReturn(
36+
destination: Destination,
37+
chunk: Chunk | PrecomputedChunk,
3138
): boolean {
3239
destination.buffer += chunk;
3340
return true;

0 commit comments

Comments
 (0)