From 18ff594d5486d6478d5474317e6cd3de86a38b19 Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Sat, 3 Jun 2023 19:45:28 -0400 Subject: [PATCH] Delete processStringChunk These can't include binary data and we don't really have any use cases that really require these to already be strings. When the stream is encoded inside another protocol - such as HTML we need a different format that encode binary offsets and binary data. --- .../react-client/src/ReactFlightClient.js | 25 +------------------ .../src/ReactFlightClientConfigBrowser.js | 2 -- .../src/ReactFlightClientConfigNode.js | 2 -- .../forks/ReactFlightClientConfig.custom.js | 1 - .../src/ReactNoopFlightClient.js | 18 ++++++++++--- .../src/ReactNoopFlightServer.js | 14 ++++++----- .../src/ReactFlightDOMClientNode.js | 7 +----- .../src/ReactFlightDOMClientNode.js | 7 +----- 8 files changed, 25 insertions(+), 51 deletions(-) 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);