From dabca52f77799bcdedb6b0ec44b1f6297483a46d Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Wed, 14 Oct 2020 21:03:11 -0700 Subject: [PATCH] Stop calling RCTNetworking.(add|remove)Listeners? Summary: RCTNetworking.startObserving and RCTNetworking.stopObserving don't exist. The main purpose of RCTEventEmitter.addListener is to call these methods, and increment the `_listeners` counter, so that we can start dispatching events when `_listeners > 0`. In D24272560, I made RCTEventEmitter dispatch events even when _listeners <= 0. This is sufficient for us to stop calling these two RCTNetworking methods entirely. Changelog: [Internal] Reviewed By: fkgozali Differential Revision: D24272663 fbshipit-source-id: de9c968bc71e6e6d69a22b934644e6dfa3266b3f --- Libraries/EventEmitter/NativeEventEmitter.js | 22 ++++++++++++++++---- Libraries/Network/RCTNetworking.ios.js | 9 +++++++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Libraries/EventEmitter/NativeEventEmitter.js b/Libraries/EventEmitter/NativeEventEmitter.js index e04bc5f95d0..298a3eea2f8 100644 --- a/Libraries/EventEmitter/NativeEventEmitter.js +++ b/Libraries/EventEmitter/NativeEventEmitter.js @@ -22,15 +22,29 @@ type NativeModule = { ... }; +type NativeEventEmitterOptions = $ReadOnly<{| + __SECRET_DISABLE_CALLS_INTO_MODULE_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: boolean, +|}>; + +const DEFAULT_NATIVE_EVENT_EMITTER_OPTIONS = { + __SECRET_DISABLE_CALLS_INTO_MODULE_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: false, +}; + /** * Abstract base class for implementing event-emitting modules. This implements * a subset of the standard EventEmitter node module API. */ export default class NativeEventEmitter extends EventEmitter { _nativeModule: ?NativeModule; + _disableCallsIntoModule: boolean; - constructor(nativeModule: ?NativeModule) { + constructor( + nativeModule: ?NativeModule, + options: NativeEventEmitterOptions = DEFAULT_NATIVE_EVENT_EMITTER_OPTIONS, + ) { super(RCTDeviceEventEmitter.sharedSubscriber); + this._disableCallsIntoModule = + options.__SECRET_DISABLE_CALLS_INTO_MODULE_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; if (Platform.OS === 'ios') { invariant(nativeModule, 'Native module cannot be null.'); this._nativeModule = nativeModule; @@ -42,7 +56,7 @@ export default class NativeEventEmitter extends EventEmitter { listener: Function, context: ?Object, ): EventSubscription { - if (this._nativeModule != null) { + if (this._nativeModule != null && !this._disableCallsIntoModule) { this._nativeModule.addListener(eventType); } return super.addListener(eventType, listener, context); @@ -51,14 +65,14 @@ export default class NativeEventEmitter extends EventEmitter { removeAllListeners(eventType: string) { invariant(eventType, 'eventType argument is required.'); const count = this.listenerCount(eventType); - if (this._nativeModule != null) { + if (this._nativeModule != null && !this._disableCallsIntoModule) { this._nativeModule.removeListeners(count); } super.removeAllListeners(eventType); } removeSubscription(subscription: EventSubscription) { - if (this._nativeModule != null) { + if (this._nativeModule != null && !this._disableCallsIntoModule) { this._nativeModule.removeListeners(1); } super.removeSubscription(subscription); diff --git a/Libraries/Network/RCTNetworking.ios.js b/Libraries/Network/RCTNetworking.ios.js index 92ef3339431..bc1081aab35 100644 --- a/Libraries/Network/RCTNetworking.ios.js +++ b/Libraries/Network/RCTNetworking.ios.js @@ -18,7 +18,14 @@ import type {RequestBody} from './convertRequestBody'; class RCTNetworking extends NativeEventEmitter { constructor() { - super(NativeNetworkingIOS); + const disableCallsIntoModule = + typeof global.__disableRCTNetworkingExtraneousModuleCalls === 'function' + ? global.__disableRCTNetworkingExtraneousModuleCalls() + : false; + + super(NativeNetworkingIOS, { + __SECRET_DISABLE_CALLS_INTO_MODULE_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: disableCallsIntoModule, + }); } sendRequest(