diff --git a/packages/react-client/src/ReactFlightClient.js b/packages/react-client/src/ReactFlightClient.js index 3d06c5e0ded10..dc9503037d922 100644 --- a/packages/react-client/src/ReactFlightClient.js +++ b/packages/react-client/src/ReactFlightClient.js @@ -28,7 +28,6 @@ import { dispatchHint, readPartialStringChunk, readFinalStringChunk, - supportsBinaryStreams, createStringDecoder, } from './ReactFlightClientConfig'; @@ -667,12 +666,9 @@ export function createResponse( _callServer: callServer !== undefined ? callServer : missingCall, _chunks: chunks, _partialRow: '', - _stringDecoder: (null: any), + _stringDecoder: createStringDecoder(), _fromJSON: (null: any), }; - if (supportsBinaryStreams) { - response._stringDecoder = createStringDecoder(); - } // Don't inline this call because it causes closure to outline the call above. response._fromJSON = createFromJSONCallback(response); return response; @@ -854,29 +850,10 @@ function processFullRow(response: Response, row: string): void { } } -export function processStringChunk( - response: Response, - chunk: string, - offset: number, -): void { - let linebreak = chunk.indexOf('\n', offset); - while (linebreak > -1) { - const fullrow = response._partialRow + chunk.slice(offset, linebreak); - processFullRow(response, fullrow); - response._partialRow = ''; - offset = linebreak + 1; - linebreak = chunk.indexOf('\n', offset); - } - response._partialRow += chunk.slice(offset); -} - export function processBinaryChunk( response: Response, chunk: Uint8Array, ): void { - if (!supportsBinaryStreams) { - throw new Error("This environment don't support binary chunks."); - } const stringDecoder = response._stringDecoder; let linebreak = chunk.indexOf(10); // newline while (linebreak > -1) { diff --git a/packages/react-client/src/ReactFlightClientConfigBrowser.js b/packages/react-client/src/ReactFlightClientConfigBrowser.js index 7114ac1223ce3..5aaee08f627c6 100644 --- a/packages/react-client/src/ReactFlightClientConfigBrowser.js +++ b/packages/react-client/src/ReactFlightClientConfigBrowser.js @@ -9,8 +9,6 @@ export type StringDecoder = TextDecoder; -export const supportsBinaryStreams = true; - export function createStringDecoder(): StringDecoder { return new TextDecoder(); } diff --git a/packages/react-client/src/ReactFlightClientConfigNode.js b/packages/react-client/src/ReactFlightClientConfigNode.js index 16d3e75316ac2..f544759ccce1c 100644 --- a/packages/react-client/src/ReactFlightClientConfigNode.js +++ b/packages/react-client/src/ReactFlightClientConfigNode.js @@ -11,8 +11,6 @@ import {TextDecoder} from 'util'; export type StringDecoder = TextDecoder; -export const supportsBinaryStreams = true; - export function createStringDecoder(): StringDecoder { return new TextDecoder(); } diff --git a/packages/react-client/src/forks/ReactFlightClientConfig.custom.js b/packages/react-client/src/forks/ReactFlightClientConfig.custom.js index 477ecd6e15b0c..9d00b3afa10ad 100644 --- a/packages/react-client/src/forks/ReactFlightClientConfig.custom.js +++ b/packages/react-client/src/forks/ReactFlightClientConfig.custom.js @@ -40,7 +40,6 @@ export opaque type Source = mixed; export opaque type StringDecoder = mixed; // eslint-disable-line no-undef -export const supportsBinaryStreams = $$$config.supportsBinaryStreams; export const createStringDecoder = $$$config.createStringDecoder; export const readPartialStringChunk = $$$config.readPartialStringChunk; export const readFinalStringChunk = $$$config.readFinalStringChunk; diff --git a/packages/react-noop-renderer/src/ReactNoopFlightClient.js b/packages/react-noop-renderer/src/ReactNoopFlightClient.js index 5cb6e20e532f3..013c663cb0c4e 100644 --- a/packages/react-noop-renderer/src/ReactNoopFlightClient.js +++ b/packages/react-noop-renderer/src/ReactNoopFlightClient.js @@ -18,10 +18,20 @@ import {readModule} from 'react-noop-renderer/flight-modules'; import ReactFlightClient from 'react-client/flight'; -type Source = Array; +type Source = Array; -const {createResponse, processStringChunk, getRoot, close} = ReactFlightClient({ - supportsBinaryStreams: false, +const decoderOptions = {stream: true}; + +const {createResponse, processBinaryChunk, getRoot, close} = ReactFlightClient({ + createStringDecoder() { + return new TextDecoder(); + }, + readPartialStringChunk(decoder: TextDecoder, buffer: Uint8Array): string { + return decoder.decode(buffer, decoderOptions); + }, + readFinalStringChunk(decoder: TextDecoder, buffer: Uint8Array): string { + return decoder.decode(buffer); + }, resolveClientReference(bundlerConfig: null, idx: string) { return idx; }, @@ -37,7 +47,7 @@ const {createResponse, processStringChunk, getRoot, close} = ReactFlightClient({ function read(source: Source): Thenable { const response = createResponse(source, null); for (let i = 0; i < source.length; i++) { - processStringChunk(response, source[i], 0); + processBinaryChunk(response, source[i], 0); } close(response); return getRoot(response); diff --git a/packages/react-noop-renderer/src/ReactNoopFlightServer.js b/packages/react-noop-renderer/src/ReactNoopFlightServer.js index 32b3aa2c4f21e..9faab3cdfa110 100644 --- a/packages/react-noop-renderer/src/ReactNoopFlightServer.js +++ b/packages/react-noop-renderer/src/ReactNoopFlightServer.js @@ -21,7 +21,9 @@ import {saveModule} from 'react-noop-renderer/flight-modules'; import ReactFlightServer from 'react-server/flight'; -type Destination = Array; +type Destination = Array; + +const textEncoder = new TextEncoder(); const ReactNoopFlightServer = ReactFlightServer({ scheduleWork(callback: () => void) { @@ -39,13 +41,13 @@ const ReactNoopFlightServer = ReactFlightServer({ close(destination: Destination): void {}, closeWithError(destination: Destination, error: mixed): void {}, flushBuffered(destination: Destination): void {}, - stringToChunk(content: string): string { - return content; + stringToChunk(content: string): Uint8Array { + return textEncoder.encode(content); }, - stringToPrecomputedChunk(content: string): string { - return content; + stringToPrecomputedChunk(content: string): Uint8Array { + return textEncoder.encode(content); }, - clonePrecomputedChunk(chunk: string): string { + clonePrecomputedChunk(chunk: Uint8Array): Uint8Array { return chunk; }, isClientReference(reference: Object): boolean { diff --git a/packages/react-server-dom-esm/src/ReactFlightDOMClientNode.js b/packages/react-server-dom-esm/src/ReactFlightDOMClientNode.js index d673c9d6e419d..2ef274f9e5d97 100644 --- a/packages/react-server-dom-esm/src/ReactFlightDOMClientNode.js +++ b/packages/react-server-dom-esm/src/ReactFlightDOMClientNode.js @@ -20,7 +20,6 @@ import { processBinaryChunk, close, } from 'react-client/src/ReactFlightClient'; -import {processStringChunk} from '../../react-client/src/ReactFlightClient'; function noServerCall() { throw new Error( @@ -44,11 +43,7 @@ function createFromNodeStream( ): Thenable { const response: Response = createResponse(moduleRootPath, noServerCall); stream.on('data', chunk => { - if (typeof chunk === 'string') { - processStringChunk(response, chunk, 0); - } else { - processBinaryChunk(response, chunk); - } + processBinaryChunk(response, chunk); }); stream.on('error', error => { reportGlobalError(response, error); diff --git a/packages/react-server-dom-webpack/src/ReactFlightDOMClientNode.js b/packages/react-server-dom-webpack/src/ReactFlightDOMClientNode.js index 75005208a1b15..de4734d38fcc8 100644 --- a/packages/react-server-dom-webpack/src/ReactFlightDOMClientNode.js +++ b/packages/react-server-dom-webpack/src/ReactFlightDOMClientNode.js @@ -22,7 +22,6 @@ import { processBinaryChunk, close, } from 'react-client/src/ReactFlightClient'; -import {processStringChunk} from '../../react-client/src/ReactFlightClient'; function noServerCall() { throw new Error( @@ -45,11 +44,7 @@ function createFromNodeStream( ): Thenable { const response: Response = createResponse(moduleMap, noServerCall); stream.on('data', chunk => { - if (typeof chunk === 'string') { - processStringChunk(response, chunk, 0); - } else { - processBinaryChunk(response, chunk); - } + processBinaryChunk(response, chunk); }); stream.on('error', error => { reportGlobalError(response, error);