Skip to content

Commit 3af0c84

Browse files
yungstersfacebook-github-bot
authored andcommitted
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
1 parent 34d3efe commit 3af0c84

File tree

3 files changed

+41
-40
lines changed

3 files changed

+41
-40
lines changed

Libraries/EventEmitter/RCTDeviceEventEmitter.js

+9-31
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,19 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7+
* @flow strict
78
* @format
8-
* @flow
99
*/
1010

11-
import EventEmitter from '../vendor/emitter/EventEmitter';
12-
import type EmitterSubscription from '../vendor/emitter/_EmitterSubscription';
13-
import EventSubscriptionVendor from '../vendor/emitter/_EventSubscriptionVendor';
14-
15-
/**
16-
* Deprecated - subclass NativeEventEmitter to create granular event modules instead of
17-
* adding all event listeners directly to RCTDeviceEventEmitter.
18-
*/
19-
class RCTDeviceEventEmitter<
20-
EventDefinitions: {...},
21-
> extends EventEmitter<EventDefinitions> {
22-
sharedSubscriber: EventSubscriptionVendor<EventDefinitions>;
23-
24-
constructor() {
25-
const sharedSubscriber = new EventSubscriptionVendor<EventDefinitions>();
26-
super(sharedSubscriber);
27-
this.sharedSubscriber = sharedSubscriber;
28-
}
29-
30-
removeSubscription<K: $Keys<EventDefinitions>>(
31-
subscription: EmitterSubscription<EventDefinitions, K>,
32-
): void {
33-
if (subscription.emitter !== this) {
34-
subscription.emitter.removeSubscription(subscription);
35-
} else {
36-
super.removeSubscription(subscription);
37-
}
38-
}
39-
}
11+
import EventEmitter, {type IEventEmitter} from '../vendor/emitter/EventEmitter';
4012

4113
// FIXME: use typed events
4214
type RCTDeviceEventDefinitions = $FlowFixMe;
4315

44-
export default (new RCTDeviceEventEmitter(): RCTDeviceEventEmitter<RCTDeviceEventDefinitions>);
16+
/**
17+
* Global EventEmitter used by the native platform to emit events to JavaScript.
18+
* Events are identified by globally unique event names.
19+
*
20+
* NativeModules that emit events should instead subclass `NativeEventEmitter`.
21+
*/
22+
export default (new EventEmitter(): IEventEmitter<RCTDeviceEventDefinitions>);

Libraries/EventEmitter/__mocks__/NativeEventEmitter.js

+31-8
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,42 @@
55
* LICENSE file in the root directory of this source tree.
66
*
77
* @format
8-
* @flow
8+
* @flow strict-local
99
*/
1010

11-
import EventEmitter from '../../vendor/emitter/EventEmitter';
11+
import {
12+
type EventSubscription,
13+
type IEventEmitter,
14+
} from '../../vendor/emitter/EventEmitter';
1215
import RCTDeviceEventEmitter from '../RCTDeviceEventEmitter';
1316

1417
/**
15-
* Mock the NativeEventEmitter as a normal JS EventEmitter.
18+
* Mock `NativeEventEmitter` to ignore Native Modules.
1619
*/
17-
export default class NativeEventEmitter<
18-
EventDefinitions: {...},
19-
> extends EventEmitter<EventDefinitions> {
20-
constructor() {
21-
super(RCTDeviceEventEmitter.sharedSubscriber);
20+
export default class NativeEventEmitter<TEventToArgsMap: {...}>
21+
implements IEventEmitter<TEventToArgsMap> {
22+
addListener<TEvent: $Keys<TEventToArgsMap>>(
23+
eventType: TEvent,
24+
listener: (...args: $ElementType<TEventToArgsMap, TEvent>) => mixed,
25+
context?: mixed,
26+
): EventSubscription {
27+
return RCTDeviceEventEmitter.addListener(eventType, listener, context);
28+
}
29+
30+
emit<TEvent: $Keys<TEventToArgsMap>>(
31+
eventType: TEvent,
32+
...args: $ElementType<TEventToArgsMap, TEvent>
33+
): void {
34+
RCTDeviceEventEmitter.emit(eventType, ...args);
35+
}
36+
37+
removeAllListeners<TEvent: $Keys<TEventToArgsMap>>(
38+
eventType?: ?TEvent,
39+
): void {
40+
RCTDeviceEventEmitter.removeAllListeners(eventType);
41+
}
42+
43+
listenerCount<TEvent: $Keys<TEventToArgsMap>>(eventType: TEvent): number {
44+
return RCTDeviceEventEmitter.listenerCount(eventType);
2245
}
2346
}

Libraries/vendor/emitter/EventEmitter.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export interface IEventEmitter<TEventToArgsMap: {...}> {
2828
*/
2929
addListener<TEvent: $Keys<TEventToArgsMap>>(
3030
eventType: TEvent,
31-
listener: (...args: $ElementType<TEventToArgsMap, TEvent>) => void,
31+
listener: (...args: $ElementType<TEventToArgsMap, TEvent>) => mixed,
3232
context?: mixed,
3333
): EventSubscription;
3434

0 commit comments

Comments
 (0)