From a81b7d18fa65a727539c6c7ea17f787673d3c889 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Mon, 1 Feb 2021 10:59:45 -0800 Subject: [PATCH] RN: Cleanup RCTNetworking (iOS) Summary: Refactors `RCTNeworking.ios.js` so that event registration does not get passed along to `NativeNetworkingIOS`. Instead, we go straight to `RCTDeviceEventEmitter` (which is what `NativeEventEmitter` ultimately does when `nativeModule` is not supplied). This optimization reduces overhead of making network requests, and it is made possible because `NativeNetworkingIOS` does not actually do any meaningful work when `startObserving` is invoked. Changelog: [iOS][Removed] - Removed event methods except `addListener` from `Networking` Reviewed By: lunaleaps Differential Revision: D26137965 fbshipit-source-id: b6e0288689459ddb8ecf8d34dce6250d3b0ecb59 --- Libraries/Network/RCTNetworking.ios.js | 84 +++++++++++++++++++------- 1 file changed, 63 insertions(+), 21 deletions(-) diff --git a/Libraries/Network/RCTNetworking.ios.js b/Libraries/Network/RCTNetworking.ios.js index 125f5cf3ecc259..67db8dd88dacbd 100644 --- a/Libraries/Network/RCTNetworking.ios.js +++ b/Libraries/Network/RCTNetworking.ios.js @@ -4,30 +4,72 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @format * @flow strict-local + * @format */ 'use strict'; -import NativeEventEmitter from '../EventEmitter/NativeEventEmitter'; +import RCTDeviceEventEmitter from '../EventEmitter/RCTDeviceEventEmitter'; import NativeNetworkingIOS from './NativeNetworkingIOS'; -import type {NativeResponseType} from './XMLHttpRequest'; -import convertRequestBody from './convertRequestBody'; -import type {RequestBody} from './convertRequestBody'; +import {type NativeResponseType} from './XMLHttpRequest'; +import convertRequestBody, {type RequestBody} from './convertRequestBody'; +import {type EventSubscription} from '../vendor/emitter/EventEmitter'; -// FIXME: use typed events -class RCTNetworking extends NativeEventEmitter<$FlowFixMe> { - constructor() { - const disableCallsIntoModule = - typeof global.__disableRCTNetworkingExtraneousModuleCalls === 'function' - ? global.__disableRCTNetworkingExtraneousModuleCalls() - : false; +type RCTNetworkingEventDefinitions = $ReadOnly<{ + didSendNetworkData: [ + [ + number, // requestId + number, // progress + number, // total + ], + ], + didReceiveNetworkResponse: [ + [ + number, // requestId + number, // status + ?{[string]: string}, // responseHeaders + ?string, // responseURL + ], + ], + didReceiveNetworkData: [ + [ + number, // requestId + string, // response + ], + ], + didReceiveNetworkIncrementalData: [ + [ + number, // requestId + string, // responseText + number, // progress + number, // total + ], + ], + didReceiveNetworkDataProgress: [ + [ + number, // requestId + number, // loaded + number, // total + ], + ], + didCompleteNetworkResponse: [ + [ + number, // requestId + string, // error + boolean, // timeOutError + ], + ], +}>; - super(NativeNetworkingIOS, { - __SECRET_DISABLE_CALLS_INTO_MODULE_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: disableCallsIntoModule, - }); - } +const RCTNetworking = { + addListener>( + eventType: K, + listener: (...$ElementType) => mixed, + context?: mixed, + ): EventSubscription { + return RCTDeviceEventEmitter.addListener(eventType, listener, context); + }, sendRequest( method: string, @@ -55,15 +97,15 @@ class RCTNetworking extends NativeEventEmitter<$FlowFixMe> { }, callback, ); - } + }, abortRequest(requestId: number) { NativeNetworkingIOS.abortRequest(requestId); - } + }, clearCookies(callback: (result: boolean) => void) { NativeNetworkingIOS.clearCookies(callback); - } -} + }, +}; -module.exports = (new RCTNetworking(): RCTNetworking); +module.exports = RCTNetworking;