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
This commit is contained in:
Jesse Watts-Russell
2023-08-22 07:29:19 -07:00
committed by Facebook GitHub Bot
parent f4f6c58172
commit 08f0cda867
@@ -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<void> {
const requestUrl = buildUrlForBundle(bundlePathAndQuery);
let loadPromise = cachedPromisesByUrl.get(requestUrl);
if (loadPromise) {