GT2/Ejectable/node_modules/@unimodules/react-native-adapter/build/EventEmitter.js

58 lines
2.6 KiB
JavaScript
Raw Normal View History

2021-08-16 00:14:59 +00:00
import invariant from 'invariant';
import { NativeEventEmitter, Platform } from 'react-native';
const nativeEmitterSubscriptionKey = '@@nativeEmitterSubscription@@';
export class EventEmitter {
constructor(nativeModule) {
this._listenerCount = 0;
this._nativeModule = nativeModule;
this._eventEmitter = new NativeEventEmitter(nativeModule);
}
addListener(eventName, listener) {
if (!this._listenerCount && Platform.OS !== 'ios' && this._nativeModule.startObserving) {
this._nativeModule.startObserving();
}
this._listenerCount++;
const nativeEmitterSubscription = this._eventEmitter.addListener(eventName, listener);
const subscription = {
[nativeEmitterSubscriptionKey]: nativeEmitterSubscription,
remove: () => {
this.removeSubscription(subscription);
},
};
return subscription;
}
removeAllListeners(eventName) {
// @ts-ignore: the EventEmitter interface has been changed in react-native@0.64.0
const removedListenerCount = this._eventEmitter.listenerCount
? // @ts-ignore: this is available since 0.64
this._eventEmitter.listenerCount(eventName)
: // @ts-ignore: this is available in older versions
this._eventEmitter.listeners(eventName).length;
this._eventEmitter.removeAllListeners(eventName);
this._listenerCount -= removedListenerCount;
invariant(this._listenerCount >= 0, `EventEmitter must have a non-negative number of listeners`);
if (!this._listenerCount && Platform.OS !== 'ios' && this._nativeModule.stopObserving) {
this._nativeModule.stopObserving();
}
}
removeSubscription(subscription) {
const nativeEmitterSubscription = subscription[nativeEmitterSubscriptionKey];
if (!nativeEmitterSubscription) {
return;
}
this._eventEmitter.removeSubscription(nativeEmitterSubscription);
this._listenerCount--;
// Ensure that the emitter's internal state remains correct even if `removeSubscription` is
// called again with the same subscription
delete subscription[nativeEmitterSubscriptionKey];
// Release closed-over references to the emitter
subscription.remove = () => { };
if (!this._listenerCount && Platform.OS !== 'ios' && this._nativeModule.stopObserving) {
this._nativeModule.stopObserving();
}
}
emit(eventName, ...params) {
this._eventEmitter.emit(eventName, ...params);
}
}
//# sourceMappingURL=EventEmitter.js.map