diff --git a/packages/react-dom-bindings/src/server/ReactDOMLegacyServerStreamConfig.js b/packages/react-dom-bindings/src/server/ReactDOMLegacyServerStreamConfig.js index 0791791a148e0..5fa0c88d13181 100644 --- a/packages/react-dom-bindings/src/server/ReactDOMLegacyServerStreamConfig.js +++ b/packages/react-dom-bindings/src/server/ReactDOMLegacyServerStreamConfig.js @@ -58,12 +58,6 @@ export function typedArrayToBinaryChunk( throw new Error('Not implemented.'); } -export function clonePrecomputedChunk( - chunk: PrecomputedChunk, -): PrecomputedChunk { - return chunk; -} - export function byteLengthOfChunk(chunk: Chunk | PrecomputedChunk): number { throw new Error('Not implemented.'); } diff --git a/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js b/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js index 411e81180d9cf..ac6c24a64bceb 100644 --- a/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js +++ b/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js @@ -48,7 +48,6 @@ import { writeChunkAndReturn, stringToChunk, stringToPrecomputedChunk, - clonePrecomputedChunk, } from 'react-server/src/ReactServerStreamConfig'; import { resolveRequest, @@ -4227,15 +4226,13 @@ export function writeCompletedBoundaryInstruction( ) { resumableState.instructions |= SentStyleInsertionFunction | SentCompleteBoundaryFunction; - writeChunk( - destination, - clonePrecomputedChunk(completeBoundaryWithStylesScript1FullBoth), - ); + writeChunk(destination, completeBoundaryWithStylesScript1FullBoth); } else if ( (resumableState.instructions & SentStyleInsertionFunction) === NothingSent ) { resumableState.instructions |= SentStyleInsertionFunction; + writeChunk(destination, completeBoundaryWithStylesScript1FullPartial); } else { writeChunk(destination, completeBoundaryWithStylesScript1Partial); diff --git a/packages/react-dom/src/__tests__/ReactDOMFloat-test.js b/packages/react-dom/src/__tests__/ReactDOMFloat-test.js index 31c1607cc149c..779506094813c 100644 --- a/packages/react-dom/src/__tests__/ReactDOMFloat-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMFloat-test.js @@ -731,6 +731,65 @@ describe('ReactDOMFloat', () => { ).toEqual(['']); }); + // @gate enableFloat + it('can send style insertion implementation independent of boundary commpletion instruction implementation', async () => { + await act(() => { + renderToPipeableStream( + + + + foo + + + + + bar + + + + , + ).pipe(writable); + }); + + expect(getMeaningfulChildren(document)).toEqual( + + + + {'loading foo...'} + {'loading bar...'} + + , + ); + + await act(() => { + resolveText('foo'); + }); + expect(getMeaningfulChildren(document)).toEqual( + + + + foo + {'loading bar...'} + + , + ); + await act(() => { + resolveText('bar'); + }); + expect(getMeaningfulChildren(document)).toEqual( + + + + + + foo + {'loading bar...'} + + + , + ); + }); + // @gate enableFloat it('can avoid inserting a late stylesheet if it already rendered on the client', async () => { await act(() => { diff --git a/packages/react-noop-renderer/src/ReactNoopFlightServer.js b/packages/react-noop-renderer/src/ReactNoopFlightServer.js index 3d46f7694c798..bb2dbafba2d07 100644 --- a/packages/react-noop-renderer/src/ReactNoopFlightServer.js +++ b/packages/react-noop-renderer/src/ReactNoopFlightServer.js @@ -46,9 +46,6 @@ const ReactNoopFlightServer = ReactFlightServer({ stringToPrecomputedChunk(content: string): Uint8Array { return textEncoder.encode(content); }, - clonePrecomputedChunk(chunk: Uint8Array): Uint8Array { - return chunk; - }, isClientReference(reference: Object): boolean { return reference.$$typeof === Symbol.for('react.client.reference'); }, diff --git a/packages/react-server/src/ReactServerStreamConfigBrowser.js b/packages/react-server/src/ReactServerStreamConfigBrowser.js index da1a56f813303..f9371303844fa 100644 --- a/packages/react-server/src/ReactServerStreamConfigBrowser.js +++ b/packages/react-server/src/ReactServerStreamConfigBrowser.js @@ -22,7 +22,7 @@ export function flushBuffered(destination: Destination) { // transform streams. https://github.com/whatwg/streams/issues/960 } -const VIEW_SIZE = 512; +const VIEW_SIZE = 2048; let currentView = null; let writtenBytes = 0; @@ -40,15 +40,6 @@ export function writeChunk( } if (chunk.byteLength > VIEW_SIZE) { - if (__DEV__) { - if (precomputedChunkSet.has(chunk)) { - console.error( - 'A large precomputed chunk was passed to writeChunk without being copied.' + - ' Large chunks get enqueued directly and are not copied. This is incompatible with precomputed chunks because you cannot enqueue the same precomputed chunk twice.' + - ' Use "cloneChunk" to make a copy of this large precomputed chunk before writing it. This is a bug in React.', - ); - } - } // this chunk may overflow a single view which implies it was not // one that is cached by the streaming renderer. We will enqueu // it directly and expect it is not re-used @@ -120,15 +111,15 @@ export function stringToChunk(content: string): Chunk { return textEncoder.encode(content); } -const precomputedChunkSet: Set = __DEV__ - ? new Set() - : (null: any); - export function stringToPrecomputedChunk(content: string): PrecomputedChunk { const precomputedChunk = textEncoder.encode(content); if (__DEV__) { - precomputedChunkSet.add(precomputedChunk); + if (precomputedChunk.byteLength > VIEW_SIZE) { + console.error( + 'precomputed chunks must be smaller than the view size configured for this host. This is a bug in React.', + ); + } } return precomputedChunk; @@ -151,14 +142,6 @@ export function typedArrayToBinaryChunk( return content.byteLength > VIEW_SIZE ? buffer.slice() : buffer; } -export function clonePrecomputedChunk( - precomputedChunk: PrecomputedChunk, -): PrecomputedChunk { - return precomputedChunk.byteLength > VIEW_SIZE - ? precomputedChunk.slice() - : precomputedChunk; -} - export function byteLengthOfChunk(chunk: Chunk | PrecomputedChunk): number { return chunk.byteLength; } diff --git a/packages/react-server/src/ReactServerStreamConfigBun.js b/packages/react-server/src/ReactServerStreamConfigBun.js index 276c7f59e490a..ac8ae3f1a52eb 100644 --- a/packages/react-server/src/ReactServerStreamConfigBun.js +++ b/packages/react-server/src/ReactServerStreamConfigBun.js @@ -70,12 +70,6 @@ export function typedArrayToBinaryChunk( return content; } -export function clonePrecomputedChunk( - chunk: PrecomputedChunk, -): PrecomputedChunk { - return chunk; -} - export function byteLengthOfChunk(chunk: Chunk | PrecomputedChunk): number { return Buffer.byteLength(chunk, 'utf8'); } diff --git a/packages/react-server/src/ReactServerStreamConfigEdge.js b/packages/react-server/src/ReactServerStreamConfigEdge.js index 1bc9d7655a087..e77dc28284a18 100644 --- a/packages/react-server/src/ReactServerStreamConfigEdge.js +++ b/packages/react-server/src/ReactServerStreamConfigEdge.js @@ -22,7 +22,7 @@ export function flushBuffered(destination: Destination) { // transform streams. https://github.com/whatwg/streams/issues/960 } -const VIEW_SIZE = 512; +const VIEW_SIZE = 2048; let currentView = null; let writtenBytes = 0; @@ -40,15 +40,6 @@ export function writeChunk( } if (chunk.byteLength > VIEW_SIZE) { - if (__DEV__) { - if (precomputedChunkSet.has(chunk)) { - console.error( - 'A large precomputed chunk was passed to writeChunk without being copied.' + - ' Large chunks get enqueued directly and are not copied. This is incompatible with precomputed chunks because you cannot enqueue the same precomputed chunk twice.' + - ' Use "cloneChunk" to make a copy of this large precomputed chunk before writing it. This is a bug in React.', - ); - } - } // this chunk may overflow a single view which implies it was not // one that is cached by the streaming renderer. We will enqueu // it directly and expect it is not re-used @@ -120,15 +111,15 @@ export function stringToChunk(content: string): Chunk { return textEncoder.encode(content); } -const precomputedChunkSet: Set = __DEV__ - ? new Set() - : (null: any); - export function stringToPrecomputedChunk(content: string): PrecomputedChunk { const precomputedChunk = textEncoder.encode(content); if (__DEV__) { - precomputedChunkSet.add(precomputedChunk); + if (precomputedChunk.byteLength > VIEW_SIZE) { + console.error( + 'precomputed chunks must be smaller than the view size configured for this host. This is a bug in React.', + ); + } } return precomputedChunk; @@ -151,14 +142,6 @@ export function typedArrayToBinaryChunk( return content.byteLength > VIEW_SIZE ? buffer.slice() : buffer; } -export function clonePrecomputedChunk( - precomputedChunk: PrecomputedChunk, -): PrecomputedChunk { - return precomputedChunk.byteLength > VIEW_SIZE - ? precomputedChunk.slice() - : precomputedChunk; -} - export function byteLengthOfChunk(chunk: Chunk | PrecomputedChunk): number { return chunk.byteLength; } diff --git a/packages/react-server/src/ReactServerStreamConfigFB.js b/packages/react-server/src/ReactServerStreamConfigFB.js index c763bde102bf7..2257d0b3b78b2 100644 --- a/packages/react-server/src/ReactServerStreamConfigFB.js +++ b/packages/react-server/src/ReactServerStreamConfigFB.js @@ -60,12 +60,6 @@ export function typedArrayToBinaryChunk( throw new Error('Not implemented.'); } -export function clonePrecomputedChunk( - chunk: PrecomputedChunk, -): PrecomputedChunk { - return chunk; -} - export function byteLengthOfChunk(chunk: Chunk | PrecomputedChunk): number { throw new Error('Not implemented.'); } diff --git a/packages/react-server/src/ReactServerStreamConfigNode.js b/packages/react-server/src/ReactServerStreamConfigNode.js index 5d5c6b4fab3b6..cbd366ab54ba3 100644 --- a/packages/react-server/src/ReactServerStreamConfigNode.js +++ b/packages/react-server/src/ReactServerStreamConfigNode.js @@ -99,15 +99,6 @@ function writeViewChunk( return; } if (chunk.byteLength > VIEW_SIZE) { - if (__DEV__) { - if (precomputedChunkSet && precomputedChunkSet.has(chunk)) { - console.error( - 'A large precomputed chunk was passed to writeChunk without being copied.' + - ' Large chunks get enqueued directly and are not copied. This is incompatible with precomputed chunks because you cannot enqueue the same precomputed chunk twice.' + - ' Use "cloneChunk" to make a copy of this large precomputed chunk before writing it. This is a bug in React.', - ); - } - } // this chunk may overflow a single view which implies it was not // one that is cached by the streaming renderer. We will enqueu // it directly and expect it is not re-used @@ -201,14 +192,14 @@ export function stringToChunk(content: string): Chunk { return content; } -const precomputedChunkSet = __DEV__ ? new Set() : null; - export function stringToPrecomputedChunk(content: string): PrecomputedChunk { const precomputedChunk = textEncoder.encode(content); if (__DEV__) { - if (precomputedChunkSet) { - precomputedChunkSet.add(precomputedChunk); + if (precomputedChunk.byteLength > VIEW_SIZE) { + console.error( + 'precomputed chunks must be smaller than the view size configured for this host. This is a bug in React.', + ); } } @@ -222,14 +213,6 @@ export function typedArrayToBinaryChunk( return new Uint8Array(content.buffer, content.byteOffset, content.byteLength); } -export function clonePrecomputedChunk( - precomputedChunk: PrecomputedChunk, -): PrecomputedChunk { - return precomputedChunk.length > VIEW_SIZE - ? precomputedChunk.slice() - : precomputedChunk; -} - export function byteLengthOfChunk(chunk: Chunk | PrecomputedChunk): number { return typeof chunk === 'string' ? Buffer.byteLength(chunk, 'utf8') diff --git a/packages/react-server/src/forks/ReactServerStreamConfig.custom.js b/packages/react-server/src/forks/ReactServerStreamConfig.custom.js index cc92a88b01e79..e372e8903f856 100644 --- a/packages/react-server/src/forks/ReactServerStreamConfig.custom.js +++ b/packages/react-server/src/forks/ReactServerStreamConfig.custom.js @@ -41,7 +41,6 @@ export const closeWithError = $$$config.closeWithError; export const stringToChunk = $$$config.stringToChunk; export const stringToPrecomputedChunk = $$$config.stringToPrecomputedChunk; export const typedArrayToBinaryChunk = $$$config.typedArrayToBinaryChunk; -export const clonePrecomputedChunk = $$$config.clonePrecomputedChunk; export const byteLengthOfChunk = $$$config.byteLengthOfChunk; export const byteLengthOfBinaryChunk = $$$config.byteLengthOfBinaryChunk; export const createFastHash = $$$config.createFastHash;