Skip to content

Commit

Permalink
events: refactor native event handling
Browse files Browse the repository at this point in the history
Add listeners for the native events early, so they are setup by the time
we need them, since they are added asynchronously.

Then use a JS event emitter for re-emitting them.
  • Loading branch information
saghul committed Dec 11, 2022
1 parent f78f3e6 commit 4071c66
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 6 deletions.
1 change: 0 additions & 1 deletion ios/RCTWebRTC/WebRTCModule.h
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down
1 change: 0 additions & 1 deletion ios/RCTWebRTC/WebRTCModule.m
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ - (dispatch_queue_t)methodQueue
kEventDataChannelStateChanged,
kEventDataChannelReceiveMessage,
kEventMediaStreamTrackMuteChanged,
kEventTransceiverOnError,
kEventPeerConnectionOnRemoveTrack,
kEventPeerConnectionOnTrack
];
Expand Down
42 changes: 38 additions & 4 deletions src/EventEmitter.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,56 @@
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;

const _subscriptions: Map<Listener, EmitterSubscription[]> = 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 {
Expand Down
4 changes: 4 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { setupNativeEvents } from './EventEmitter';
import Logger from './Logger';
import mediaDevices from './MediaDevices';
import MediaStream from './MediaStream';
Expand All @@ -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,
Expand Down

0 comments on commit 4071c66

Please sign in to comment.