diff --git a/Libraries/EventEmitter/RCTDeviceEventEmitter.js b/Libraries/EventEmitter/RCTDeviceEventEmitter.js index cffeb8fc638..f4e57ef40f7 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 fc010865138..6863f81ef5f 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 18e91bbba19..c2ebd9c54e0 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;