diff --git a/ios/RCTWebRTC/WebRTCModule.h b/ios/RCTWebRTC/WebRTCModule.h index f16f1973d..c6effbd01 100644 --- a/ios/RCTWebRTC/WebRTCModule.h +++ b/ios/RCTWebRTC/WebRTCModule.h @@ -30,7 +30,6 @@ static NSString *const kEventPeerConnectionDidOpenDataChannel = @"peerConnection static NSString *const kEventDataChannelStateChanged = @"dataChannelStateChanged"; static NSString *const kEventDataChannelReceiveMessage = @"dataChannelReceiveMessage"; static NSString *const kEventMediaStreamTrackMuteChanged = @"mediaStreamTrackMuteChanged"; -static NSString *const kEventTransceiverOnError = @"transceiverOnError"; static NSString *const kEventPeerConnectionOnRemoveTrack = @"peerConnectionOnRemoveTrack"; static NSString *const kEventPeerConnectionOnTrack = @"peerConnectionOnTrack"; diff --git a/ios/RCTWebRTC/WebRTCModule.m b/ios/RCTWebRTC/WebRTCModule.m index f08e89043..b3bac65fe 100644 --- a/ios/RCTWebRTC/WebRTCModule.m +++ b/ios/RCTWebRTC/WebRTCModule.m @@ -113,7 +113,6 @@ - (dispatch_queue_t)methodQueue kEventDataChannelStateChanged, kEventDataChannelReceiveMessage, kEventMediaStreamTrackMuteChanged, - kEventTransceiverOnError, kEventPeerConnectionOnRemoveTrack, kEventPeerConnectionOnTrack ]; diff --git a/src/EventEmitter.ts b/src/EventEmitter.ts index 81d48df7c..9db5d2c39 100644 --- a/src/EventEmitter.ts +++ b/src/EventEmitter.ts @@ -1,10 +1,40 @@ import { NativeModules, NativeEventEmitter, EmitterSubscription } from 'react-native'; +// @ts-ignore +import EventEmitter from 'react-native/Libraries/vendor/emitter/EventEmitter'; const { WebRTCModule } = NativeModules; -const EventEmitter = new NativeEventEmitter(WebRTCModule); - -export default EventEmitter; +// This emitter is going to be used to listen to all the native events (once) and then +// re-emit them on a JS-only emitter. +const nativeEmitter = new NativeEventEmitter(WebRTCModule); + +const NATIVE_EVENTS = [ + 'peerConnectionSignalingStateChanged', + 'peerConnectionStateChanged', + 'peerConnectionOnRenegotiationNeeded', + 'peerConnectionIceConnectionChanged', + 'peerConnectionIceGatheringChanged', + 'peerConnectionGotICECandidate', + 'peerConnectionDidOpenDataChannel', + 'peerConnectionOnRemoveTrack', + 'peerConnectionOnTrack', + 'dataChannelStateChanged', + 'dataChannelReceiveMessage', + 'mediaStreamTrackMuteChanged', +]; + +const eventEmitter = new EventEmitter(); + +// TODO: migrate RTCDataChannel to the new API and stop exporting this. +export default eventEmitter; + +export function setupNativeEvents() { + for (const eventName of NATIVE_EVENTS) { + nativeEmitter.addListener(eventName, (...args) => { + eventEmitter.emit(eventName, ...args); + }); + } +} type EventHandler = (event: unknown) => void; type Listener = unknown; @@ -12,11 +42,15 @@ type Listener = unknown; const _subscriptions: Map = new Map(); export function addListener(listener: Listener, eventName: string, eventHandler: EventHandler): void { + if (!NATIVE_EVENTS.includes(eventName)) { + throw new Error(`Invalid event: ${eventName}`); + } + if (!_subscriptions.has(listener)) { _subscriptions.set(listener, []); } - _subscriptions.get(listener)?.push(EventEmitter.addListener(eventName, eventHandler)); + _subscriptions.get(listener)?.push(eventEmitter.addListener(eventName, eventHandler)); } export function removeListener(listener: Listener): void { diff --git a/src/index.ts b/src/index.ts index 81010f294..3c0d7d2a4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,4 @@ +import { setupNativeEvents } from './EventEmitter'; import Logger from './Logger'; import mediaDevices from './MediaDevices'; import MediaStream from './MediaStream'; @@ -17,6 +18,9 @@ import ScreenCapturePickerView from './ScreenCapturePickerView'; Logger.enable('*'); // Logger.enable(`*,-${Logger.ROOT_PREFIX}:*:DEBUG`); +// Add listeners for the native events early, since they are added asynchronously. +setupNativeEvents(); + export { RTCIceCandidate, RTCPeerConnection,