From 08f0cda867a153f183d01e9f9458b5fc1d4d2ec4 Mon Sep 17 00:00:00 2001 From: Jesse Watts-Russell Date: Tue, 22 Aug 2023 07:29:19 -0700 Subject: [PATCH] Allow incremental payloads from Native->JS (#39109) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/39109 Changelog: [Internal][Added] - Allowed metro to also receive incremental data payloads from the native side bit by bit, offloading memory to the JS side (which would have been used anyways when the final copy was done). Reviewed By: motiz88 Differential Revision: D48449495 fbshipit-source-id: 8cb2b43c35cce28e4b82d3f0e993c0f6d5f9c008 --- .../Core/Devtools/loadBundleFromServer.js | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/packages/react-native/Libraries/Core/Devtools/loadBundleFromServer.js b/packages/react-native/Libraries/Core/Devtools/loadBundleFromServer.js index 222320b22bd..f8387cd1861 100644 --- a/packages/react-native/Libraries/Core/Devtools/loadBundleFromServer.js +++ b/packages/react-native/Libraries/Core/Devtools/loadBundleFromServer.js @@ -29,6 +29,7 @@ function asyncRequest( let dataListener; let completeListener; let responseListener; + let incrementalDataListener; return new Promise<{body: string, headers: {[string]: string}}>( (resolve, reject) => { dataListener = Networking.addListener( @@ -39,6 +40,18 @@ function asyncRequest( } }, ); + incrementalDataListener = Networking.addListener( + 'didReceiveNetworkIncrementalData', + ([requestId, data]) => { + if (requestId === id) { + if (responseText != null) { + responseText += data; + } else { + responseText = data; + } + } + }, + ); responseListener = Networking.addListener( 'didReceiveNetworkResponse', ([requestId, status, responseHeaders]) => { @@ -67,7 +80,7 @@ function asyncRequest( {}, '', 'text', - false, + true, 0, requestId => { id = requestId; @@ -76,9 +89,10 @@ function asyncRequest( ); }, ).finally(() => { - dataListener && dataListener.remove(); - completeListener && completeListener.remove(); - responseListener && responseListener.remove(); + dataListener?.remove(); + completeListener?.remove(); + responseListener?.remove(); + incrementalDataListener?.remove(); }); } @@ -91,7 +105,6 @@ function buildUrlForBundle(bundlePathAndQuery: string) { module.exports = function (bundlePathAndQuery: string): Promise { const requestUrl = buildUrlForBundle(bundlePathAndQuery); - let loadPromise = cachedPromisesByUrl.get(requestUrl); if (loadPromise) {