From 3af0c84aa5d1633f058ea3e7aef0d125fe33e01d Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Wed, 17 Feb 2021 12:15:20 -0800 Subject: [PATCH] RN: Simplify `RCTDeviceEventEmitter` Summary: Simplifies `RCTDeviceEventEmitter` to simply be an `EventEmitter`. The only thing special about it is that all native events are emitted on it and that `NativeEventEmitter` composes it. Changelog: [General][Removed] - Removed `RCTDeviceEventEmitter.sharedSubscribers`. Reviewed By: RSNara Differential Revision: D26163660 fbshipit-source-id: aedff8323d86947220fc293a74a19a3981fd875a --- .../EventEmitter/RCTDeviceEventEmitter.js | 40 +++++-------------- .../__mocks__/NativeEventEmitter.js | 39 ++++++++++++++---- Libraries/vendor/emitter/EventEmitter.js | 2 +- 3 files changed, 41 insertions(+), 40 deletions(-) diff --git a/Libraries/EventEmitter/RCTDeviceEventEmitter.js b/Libraries/EventEmitter/RCTDeviceEventEmitter.js index cffeb8fc638e3f..f4e57ef40f765d 100644 --- a/Libraries/EventEmitter/RCTDeviceEventEmitter.js +++ b/Libraries/EventEmitter/RCTDeviceEventEmitter.js @@ -4,41 +4,19 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * + * @flow strict * @format - * @flow */ -import EventEmitter from '../vendor/emitter/EventEmitter'; -import type EmitterSubscription from '../vendor/emitter/_EmitterSubscription'; -import EventSubscriptionVendor from '../vendor/emitter/_EventSubscriptionVendor'; - -/** - * Deprecated - subclass NativeEventEmitter to create granular event modules instead of - * adding all event listeners directly to RCTDeviceEventEmitter. - */ -class RCTDeviceEventEmitter< - EventDefinitions: {...}, -> extends EventEmitter { - sharedSubscriber: EventSubscriptionVendor; - - constructor() { - const sharedSubscriber = new EventSubscriptionVendor(); - super(sharedSubscriber); - this.sharedSubscriber = sharedSubscriber; - } - - removeSubscription>( - subscription: EmitterSubscription, - ): void { - if (subscription.emitter !== this) { - subscription.emitter.removeSubscription(subscription); - } else { - super.removeSubscription(subscription); - } - } -} +import EventEmitter, {type IEventEmitter} from '../vendor/emitter/EventEmitter'; // FIXME: use typed events type RCTDeviceEventDefinitions = $FlowFixMe; -export default (new RCTDeviceEventEmitter(): RCTDeviceEventEmitter); +/** + * Global EventEmitter used by the native platform to emit events to JavaScript. + * Events are identified by globally unique event names. + * + * NativeModules that emit events should instead subclass `NativeEventEmitter`. + */ +export default (new EventEmitter(): IEventEmitter); diff --git a/Libraries/EventEmitter/__mocks__/NativeEventEmitter.js b/Libraries/EventEmitter/__mocks__/NativeEventEmitter.js index fc0108651384d8..6863f81ef5f677 100644 --- a/Libraries/EventEmitter/__mocks__/NativeEventEmitter.js +++ b/Libraries/EventEmitter/__mocks__/NativeEventEmitter.js @@ -5,19 +5,42 @@ * LICENSE file in the root directory of this source tree. * * @format - * @flow + * @flow strict-local */ -import EventEmitter from '../../vendor/emitter/EventEmitter'; +import { + type EventSubscription, + type IEventEmitter, +} from '../../vendor/emitter/EventEmitter'; import RCTDeviceEventEmitter from '../RCTDeviceEventEmitter'; /** - * Mock the NativeEventEmitter as a normal JS EventEmitter. + * Mock `NativeEventEmitter` to ignore Native Modules. */ -export default class NativeEventEmitter< - EventDefinitions: {...}, -> extends EventEmitter { - constructor() { - super(RCTDeviceEventEmitter.sharedSubscriber); +export default class NativeEventEmitter + implements IEventEmitter { + addListener>( + eventType: TEvent, + listener: (...args: $ElementType) => mixed, + context?: mixed, + ): EventSubscription { + return RCTDeviceEventEmitter.addListener(eventType, listener, context); + } + + emit>( + eventType: TEvent, + ...args: $ElementType + ): void { + RCTDeviceEventEmitter.emit(eventType, ...args); + } + + removeAllListeners>( + eventType?: ?TEvent, + ): void { + RCTDeviceEventEmitter.removeAllListeners(eventType); + } + + listenerCount>(eventType: TEvent): number { + return RCTDeviceEventEmitter.listenerCount(eventType); } } diff --git a/Libraries/vendor/emitter/EventEmitter.js b/Libraries/vendor/emitter/EventEmitter.js index 18e91bbba19258..c2ebd9c54e0c94 100644 --- a/Libraries/vendor/emitter/EventEmitter.js +++ b/Libraries/vendor/emitter/EventEmitter.js @@ -28,7 +28,7 @@ export interface IEventEmitter { */ addListener>( eventType: TEvent, - listener: (...args: $ElementType) => void, + listener: (...args: $ElementType) => mixed, context?: mixed, ): EventSubscription;