Skip to content

Commit 0e9a4e2

Browse files
Unify events and output single TypeScript declaration (#2407)
* fix(events): unify events to a single EventManager type, add support for single typescript declaration * fix(lint): fix lint * fix(events): fix incorrect instatiation * fix(events): clean up redundant methods * fix(events): keep EventEmitter name, alias NodeEventEmitter * fix(events): fix loose reference * fix(EventEmitter): remove on/off alias as redundant * fix(RTCUtils): bring event handlers under class to use same event emitter * fix(RTCUtils): fix lint
1 parent 7e34520 commit 0e9a4e2

21 files changed

+135
-148
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ npm-*.log
1414
stats.json
1515
.vscode
1616
dist
17+
index.d.ts
1718
types/auto
1819
types/types-comparer/auto.json
1920
types/types-comparer/hand-crafted.json

JitsiConference.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { getLogger } from '@jitsi/logger';
2-
import EventEmitter from 'events';
32
import $ from 'jquery';
43
import isEqual from 'lodash.isequal';
54
import { Strophe } from 'strophe.js';
@@ -38,6 +37,7 @@ import AvgRTPStatsReporter from './modules/statistics/AvgRTPStatsReporter';
3837
import LocalStatsCollector from './modules/statistics/LocalStatsCollector';
3938
import SpeakerStatsCollector from './modules/statistics/SpeakerStatsCollector';
4039
import Statistics from './modules/statistics/statistics';
40+
import EventEmitter from './modules/util/EventEmitter';
4141
import { safeSubtract } from './modules/util/MathUtil';
4242
import RandomUtil from './modules/util/RandomUtil';
4343
import ComponentsVersions from './modules/version/ComponentsVersions';

JitsiMediaDevices.js

+5-32
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import EventEmitter from 'events';
2-
31
import * as JitsiMediaDevicesEvents from './JitsiMediaDevicesEvents';
42
import RTC from './modules/RTC/RTC';
53
import browser from './modules/browser';
4+
import Listenable from './modules/util/Listenable';
65
import { MediaType } from './service/RTC/MediaType';
76
import RTCEvents from './service/RTC/RTCEvents';
87

@@ -13,19 +12,19 @@ const VIDEO_PERMISSION_NAME = 'camera';
1312
/**
1413
* Media devices utilities for Jitsi.
1514
*/
16-
class JitsiMediaDevices {
15+
class JitsiMediaDevices extends Listenable {
1716
/**
1817
* Initializes a {@code JitsiMediaDevices} object. There will be a single
1918
* instance of this class.
2019
*/
2120
constructor() {
22-
this._eventEmitter = new EventEmitter();
21+
super();
2322
this._permissions = {};
2423

2524
RTC.addListener(
2625
RTCEvents.DEVICE_LIST_CHANGED,
2726
devices =>
28-
this._eventEmitter.emit(
27+
this.eventEmitter.emit(
2928
JitsiMediaDevicesEvents.DEVICE_LIST_CHANGED,
3029
devices));
3130

@@ -128,7 +127,7 @@ class JitsiMediaDevices {
128127
...this._permissions,
129128
...permissions
130129
};
131-
this._eventEmitter.emit(JitsiMediaDevicesEvents.PERMISSIONS_CHANGED, this._permissions);
130+
this.eventEmitter.emit(JitsiMediaDevicesEvents.PERMISSIONS_CHANGED, this._permissions);
132131

133132
if (this._permissions[MediaType.AUDIO] || this._permissions[MediaType.VIDEO]) {
134133
// Triggering device list update when the permissiions are granted in order to update
@@ -265,32 +264,6 @@ class JitsiMediaDevices {
265264
setAudioOutputDevice(deviceId) {
266265
return RTC.setAudioOutputDevice(deviceId);
267266
}
268-
269-
/**
270-
* Adds an event handler.
271-
* @param {string} event - event name
272-
* @param {function} handler - event handler
273-
*/
274-
addEventListener(event, handler) {
275-
this._eventEmitter.addListener(event, handler);
276-
}
277-
278-
/**
279-
* Removes event handler.
280-
* @param {string} event - event name
281-
* @param {function} handler - event handler
282-
*/
283-
removeEventListener(event, handler) {
284-
this._eventEmitter.removeListener(event, handler);
285-
}
286-
287-
/**
288-
* Emits an event.
289-
* @param {string} event - event name
290-
*/
291-
emitEvent(event, ...args) {
292-
this._eventEmitter.emit(event, ...args);
293-
}
294267
}
295268

296269
export default new JitsiMediaDevices();

JitsiMeetJS.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -318,11 +318,11 @@ export default {
318318

319319
if (firePermissionPrompt && !RTC.arePermissionsGrantedForAvailableDevices()) {
320320
// @ts-ignore
321-
JitsiMediaDevices.emitEvent(JitsiMediaDevicesEvents.PERMISSION_PROMPT_IS_SHOWN, browser.getName());
321+
JitsiMediaDevices.emit(JitsiMediaDevicesEvents.PERMISSION_PROMPT_IS_SHOWN, browser.getName());
322322
} else if (fireSlowPromiseEvent) {
323323
window.setTimeout(() => {
324324
if (!promiseFulfilled) {
325-
JitsiMediaDevices.emitEvent(JitsiMediaDevicesEvents.SLOW_GET_USER_MEDIA);
325+
JitsiMediaDevices.emit(JitsiMediaDevicesEvents.SLOW_GET_USER_MEDIA);
326326
}
327327
}, USER_MEDIA_SLOW_PROMISE_TIMEOUT);
328328
}

modules/RTC/CodecSelection.spec.js

-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import EventEmitter from 'events';
2-
31
import * as JitsiConferenceEvents from '../../JitsiConferenceEvents.ts';
42
import Listenable from '../util/Listenable.js';
53
import JingleSessionPC from '../xmpp/JingleSessionPC.js';
@@ -42,7 +40,6 @@ class MockConference extends Listenable {
4240
};
4341

4442
this.activeMediaSession = undefined;
45-
this.eventEmitter = new EventEmitter();
4643
this.mediaSessions = [];
4744
this.participants = [];
4845
this._signalingLayer = new MockSignalingLayerImpl();

modules/RTC/JitsiTrack.js

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { getLogger } from '@jitsi/logger';
2-
import EventEmitter from 'events';
32

43
import * as JitsiTrackEvents from '../../JitsiTrackEvents';
54
import { MediaType } from '../../service/RTC/MediaType';
65
import browser from '../browser';
6+
import EventEmitter from '../util/EventEmitter';
77

88
import RTCUtils from './RTCUtils';
99

@@ -44,10 +44,6 @@ export default class JitsiTrack extends EventEmitter {
4444
videoType) {
4545
super();
4646

47-
// aliases for addListener/removeListener
48-
this.addEventListener = this.addListener;
49-
this.removeEventListener = this.off = this.removeListener;
50-
5147
/**
5248
* Array with the HTML elements that are displaying the streams.
5349
* @type {Array}

modules/RTC/RTCUtils.js

+65-74
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { getLogger } from '@jitsi/logger';
2-
import EventEmitter from 'events';
32
import clonedeep from 'lodash.clonedeep';
43
import 'webrtc-adapter';
54

@@ -18,8 +17,6 @@ import screenObtainer from './ScreenObtainer';
1817

1918
const logger = getLogger(__filename);
2019

21-
const eventEmitter = new EventEmitter();
22-
2320
const AVAILABLE_DEVICES_POLL_INTERVAL_TIME = 3000; // ms
2421

2522
/**
@@ -157,29 +154,6 @@ function getConstraints(um = [], options = {}) {
157154
return constraints;
158155
}
159156

160-
/**
161-
* Updates the granted permissions based on the options we requested and the
162-
* streams we received.
163-
* @param um the options we requested to getUserMedia.
164-
* @param stream the stream we received from calling getUserMedia.
165-
*/
166-
function updateGrantedPermissions(um, stream) {
167-
const audioTracksReceived
168-
= Boolean(stream) && stream.getAudioTracks().length > 0;
169-
const videoTracksReceived
170-
= Boolean(stream) && stream.getVideoTracks().length > 0;
171-
const grantedPermissions = {};
172-
173-
if (um.indexOf('video') !== -1) {
174-
grantedPermissions.video = videoTracksReceived;
175-
}
176-
if (um.indexOf('audio') !== -1) {
177-
grantedPermissions.audio = audioTracksReceived;
178-
}
179-
180-
eventEmitter.emit(RTCEvents.PERMISSIONS_CHANGED, grantedPermissions);
181-
}
182-
183157
/**
184158
* Checks if new list of available media devices differs from previous one.
185159
* @param {MediaDeviceInfo[]} newDevices - list of new devices.
@@ -247,52 +221,10 @@ function sendDeviceListToAnalytics(deviceList) {
247221
});
248222
}
249223

250-
251-
/**
252-
* Update known devices.
253-
*
254-
* @param {Array<Object>} pds - The new devices.
255-
* @returns {void}
256-
*
257-
* NOTE: Use this function as a shared callback to handle both the devicechange event and the polling implementations.
258-
* This prevents duplication and works around a chrome bug (verified to occur on 68) where devicechange fires twice in
259-
* a row, which can cause async post devicechange processing to collide.
260-
*/
261-
function updateKnownDevices(pds) {
262-
if (compareAvailableMediaDevices(pds)) {
263-
onMediaDevicesListChanged(pds);
264-
}
265-
}
266-
267-
/**
268-
* Event handler for the 'devicechange' event.
269-
*
270-
* @param {MediaDeviceInfo[]} devices - list of media devices.
271-
* @emits RTCEvents.DEVICE_LIST_CHANGED
272-
*/
273-
function onMediaDevicesListChanged(devicesReceived) {
274-
availableDevices = devicesReceived.slice(0);
275-
logger.info('list of media devices has changed:', availableDevices);
276-
277-
sendDeviceListToAnalytics(availableDevices);
278-
279-
// Used by tracks to update the real device id before the consumer of lib-jitsi-meet receives the new device list.
280-
eventEmitter.emit(RTCEvents.DEVICE_LIST_WILL_CHANGE, availableDevices);
281-
282-
eventEmitter.emit(RTCEvents.DEVICE_LIST_CHANGED, availableDevices);
283-
}
284-
285224
/**
286225
*
287226
*/
288227
class RTCUtils extends Listenable {
289-
/**
290-
*
291-
*/
292-
constructor() {
293-
super(eventEmitter);
294-
}
295-
296228
/**
297229
* Depending on the browser, sets difference instance methods for
298230
* interacting with user media and adds methods to native WebRTC-related
@@ -347,7 +279,7 @@ class RTCUtils extends Listenable {
347279
logger.debug('Available devices: ', availableDevices);
348280
sendDeviceListToAnalytics(availableDevices);
349281

350-
eventEmitter.emit(
282+
this.eventEmitter.emit(
351283
RTCEvents.DEVICE_LIST_AVAILABLE,
352284
availableDevices);
353285

@@ -373,12 +305,12 @@ class RTCUtils extends Listenable {
373305
enumerateDevices(callback) {
374306
navigator.mediaDevices.enumerateDevices()
375307
.then(devices => {
376-
updateKnownDevices(devices);
308+
this._updateKnownDevices(devices);
377309
callback(devices);
378310
})
379311
.catch(error => {
380312
logger.warn(`Failed to enumerate devices. ${error}`);
381-
updateKnownDevices([]);
313+
this._updateKnownDevices([]);
382314
callback([]);
383315
});
384316
}
@@ -407,7 +339,7 @@ class RTCUtils extends Listenable {
407339
navigator.mediaDevices.getUserMedia(constraints)
408340
.then(stream => {
409341
logger.log('onUserMediaSuccess');
410-
updateGrantedPermissions(umDevices, stream);
342+
this._updateGrantedPermissions(umDevices, stream);
411343
if (!timeoutExpired) {
412344
if (typeof gumTimeout !== 'undefined') {
413345
clearTimeout(gumTimeout);
@@ -427,7 +359,7 @@ class RTCUtils extends Listenable {
427359
}
428360

429361
if (jitsiError.name === JitsiTrackErrors.PERMISSION_DENIED) {
430-
updateGrantedPermissions(umDevices, undefined);
362+
this._updateGrantedPermissions(umDevices, undefined);
431363
}
432364

433365
// else {
@@ -497,6 +429,65 @@ class RTCUtils extends Listenable {
497429
return missingDevices;
498430
}
499431

432+
/**
433+
* Event handler for the 'devicechange' event.
434+
*
435+
* @param {MediaDeviceInfo[]} devices - list of media devices.
436+
* @emits RTCEvents.DEVICE_LIST_CHANGED
437+
*/
438+
_onMediaDevicesListChanged(devicesReceived) {
439+
availableDevices = devicesReceived.slice(0);
440+
logger.info('list of media devices has changed:', availableDevices);
441+
442+
sendDeviceListToAnalytics(availableDevices);
443+
444+
// Used by tracks to update the real device id before the consumer of lib-jitsi-meet receives the
445+
// new device list.
446+
this.eventEmitter.emit(RTCEvents.DEVICE_LIST_WILL_CHANGE, availableDevices);
447+
448+
this.eventEmitter.emit(RTCEvents.DEVICE_LIST_CHANGED, availableDevices);
449+
}
450+
451+
/**
452+
* Update known devices.
453+
*
454+
* @param {Array<Object>} pds - The new devices.
455+
* @returns {void}
456+
*
457+
* NOTE: Use this function as a shared callback to handle both the devicechange event and the
458+
* polling implementations.
459+
* This prevents duplication and works around a chrome bug (verified to occur on 68) where devicechange
460+
* fires twice in a row, which can cause async post devicechange processing to collide.
461+
*/
462+
_updateKnownDevices(pds) {
463+
if (compareAvailableMediaDevices(pds)) {
464+
this._onMediaDevicesListChanged(pds);
465+
}
466+
}
467+
468+
/**
469+
* Updates the granted permissions based on the options we requested and the
470+
* streams we received.
471+
* @param um the options we requested to getUserMedia.
472+
* @param stream the stream we received from calling getUserMedia.
473+
*/
474+
_updateGrantedPermissions(um, stream) {
475+
const audioTracksReceived
476+
= Boolean(stream) && stream.getAudioTracks().length > 0;
477+
const videoTracksReceived
478+
= Boolean(stream) && stream.getVideoTracks().length > 0;
479+
const grantedPermissions = {};
480+
481+
if (um.indexOf('video') !== -1) {
482+
grantedPermissions.video = videoTracksReceived;
483+
}
484+
if (um.indexOf('audio') !== -1) {
485+
grantedPermissions.audio = audioTracksReceived;
486+
}
487+
488+
this.eventEmitter.emit(RTCEvents.PERMISSIONS_CHANGED, grantedPermissions);
489+
}
490+
500491
/**
501492
* Gets streams from specified device types. This function intentionally
502493
* ignores errors for upstream to catch and handle instead.
@@ -792,7 +783,7 @@ class RTCUtils extends Listenable {
792783

793784
logger.log(`Audio output device set to ${deviceId}`);
794785

795-
eventEmitter.emit(RTCEvents.AUDIO_OUTPUT_DEVICE_CHANGED,
786+
this.eventEmitter.emit(RTCEvents.AUDIO_OUTPUT_DEVICE_CHANGED,
796787
deviceId);
797788
});
798789
}

modules/RTCStats/RTCStats.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { getLogger } from '@jitsi/logger';
22

33
import rtcstatsInit from '@jitsi/rtcstats/rtcstats';
44
import traceInit from '@jitsi/rtcstats/trace-ws';
5-
import EventEmitter from 'events';
65

76
import {
87
CONFERENCE_JOINED,
@@ -12,6 +11,7 @@ import {
1211
import JitsiConference from '../../JitsiConference';
1312
import { IRTCStatsConfiguration } from './interfaces';
1413
import { RTC_STATS_PC_EVENT, RTC_STATS_WC_DISCONNECTED } from './RTCStatsEvents';
14+
import EventEmitter from '../util/EventEmitter';
1515

1616
const logger = getLogger(__filename);
1717

modules/detection/NoAudioSignalDetection.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import EventEmitter from 'events';
2-
31
import * as JitsiConferenceEvents from '../../JitsiConferenceEvents';
42
import * as JitsiTrackEvents from '../../JitsiTrackEvents';
3+
import EventEmitter from '../util/EventEmitter';
54

65
import * as DetectionEvents from './DetectionEvents';
76

modules/detection/TrackVADEmitter.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import EventEmitter from 'events';
2-
31
import RTC from '../RTC/RTC';
2+
import EventEmitter from '../util/EventEmitter';
43
import { createAudioContext } from '../webaudio/WebAudioUtils';
54

65
import { VAD_SCORE_PUBLISHED } from './DetectionEvents';

0 commit comments

Comments
 (0)