From 2024c886cc8cade8ccdf5012f1aac31d43516aae Mon Sep 17 00:00:00 2001 From: Josh Larson Date: Thu, 26 May 2022 10:48:44 -0500 Subject: [PATCH 1/2] Explicitly set highWaterMark to 0 for ReadableStreams This is because not all streaming implementations respect the default behavior of settings highWaterMark to 0 for byte streams. Being explicit guarantees the intended behavior across runtimes. --- .../src/server/ReactDOMFizzServerBrowser.js | 20 +++++++++++------ .../src/ReactFlightDOMServerBrowser.js | 22 ++++++++++++------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/packages/react-dom/src/server/ReactDOMFizzServerBrowser.js b/packages/react-dom/src/server/ReactDOMFizzServerBrowser.js index 1ae511ede561..b83e63236b30 100644 --- a/packages/react-dom/src/server/ReactDOMFizzServerBrowser.js +++ b/packages/react-dom/src/server/ReactDOMFizzServerBrowser.js @@ -53,15 +53,21 @@ function renderToReadableStream( }); function onShellReady() { - const stream: ReactDOMServerReadableStream = (new ReadableStream({ - type: 'bytes', - pull(controller) { - startFlowing(request, controller); + const stream: ReactDOMServerReadableStream = (new ReadableStream( + { + type: 'bytes', + pull(controller) { + startFlowing(request, controller); + }, + cancel(reason) { + abort(request); + }, }, - cancel(reason) { - abort(request); + { + highWaterMark: 0, + size: () => 1, }, - }): any); + ): any); // TODO: Move to sub-classing ReadableStream. stream.allReady = allReady; resolve(stream); diff --git a/packages/react-server-dom-webpack/src/ReactFlightDOMServerBrowser.js b/packages/react-server-dom-webpack/src/ReactFlightDOMServerBrowser.js index aeee2d24806d..78f1e9ce84d7 100644 --- a/packages/react-server-dom-webpack/src/ReactFlightDOMServerBrowser.js +++ b/packages/react-server-dom-webpack/src/ReactFlightDOMServerBrowser.js @@ -33,16 +33,22 @@ function renderToReadableStream( options ? options.onError : undefined, context, ); - const stream = new ReadableStream({ - type: 'bytes', - start(controller) { - startWork(request); + const stream = new ReadableStream( + { + type: 'bytes', + start(controller) { + startWork(request); + }, + pull(controller) { + startFlowing(request, controller); + }, + cancel(reason) {}, }, - pull(controller) { - startFlowing(request, controller); + { + highWaterMark: 0, + size: () => 1, }, - cancel(reason) {}, - }); + ); return stream; } From fff3966ad4142f7d8d1535e6733de4c392af8507 Mon Sep 17 00:00:00 2001 From: Josh Larson Date: Tue, 31 May 2022 14:36:03 -0500 Subject: [PATCH 2/2] Remove size methods and add FlowFixMe instead --- packages/react-dom/src/server/ReactDOMFizzServerBrowser.js | 6 ++---- .../src/ReactFlightDOMServerBrowser.js | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/react-dom/src/server/ReactDOMFizzServerBrowser.js b/packages/react-dom/src/server/ReactDOMFizzServerBrowser.js index b83e63236b30..530139715e84 100644 --- a/packages/react-dom/src/server/ReactDOMFizzServerBrowser.js +++ b/packages/react-dom/src/server/ReactDOMFizzServerBrowser.js @@ -63,10 +63,8 @@ function renderToReadableStream( abort(request); }, }, - { - highWaterMark: 0, - size: () => 1, - }, + // $FlowFixMe size() methods are not allowed on byte streams. + {highWaterMark: 0}, ): any); // TODO: Move to sub-classing ReadableStream. stream.allReady = allReady; diff --git a/packages/react-server-dom-webpack/src/ReactFlightDOMServerBrowser.js b/packages/react-server-dom-webpack/src/ReactFlightDOMServerBrowser.js index 78f1e9ce84d7..a00eb8c44106 100644 --- a/packages/react-server-dom-webpack/src/ReactFlightDOMServerBrowser.js +++ b/packages/react-server-dom-webpack/src/ReactFlightDOMServerBrowser.js @@ -44,10 +44,8 @@ function renderToReadableStream( }, cancel(reason) {}, }, - { - highWaterMark: 0, - size: () => 1, - }, + // $FlowFixMe size() methods are not allowed on byte streams. + {highWaterMark: 0}, ); return stream; }