|
|
@@ -36,15 +36,12 @@ const ConnectionErrors = JitsiMeetJS.errors.connection;
|
|
36
|
36
|
const ConferenceEvents = JitsiMeetJS.events.conference;
|
|
37
|
37
|
const ConferenceErrors = JitsiMeetJS.errors.conference;
|
|
38
|
38
|
|
|
39
|
|
-const TrackEvents = JitsiMeetJS.events.track;
|
|
40
|
|
-const TrackErrors = JitsiMeetJS.errors.track;
|
|
41
|
|
-
|
|
42
|
39
|
let localVideo, localAudio;
|
|
43
|
40
|
|
|
44
|
41
|
const Commands = {
|
|
45
|
42
|
CONNECTION_QUALITY: "connectionQuality",
|
|
46
|
43
|
EMAIL: "email",
|
|
47
|
|
- VIDEO_TYPE: "videoType"
|
|
|
44
|
+ VIDEO_TYPE: "videoType",
|
|
48
|
45
|
ETHERPAD: "etherpad",
|
|
49
|
46
|
PREZI: "prezi",
|
|
50
|
47
|
STOP_PREZI: "stop-prezi"
|
|
|
@@ -88,6 +85,18 @@ const APP = {
|
|
88
|
85
|
statistics,
|
|
89
|
86
|
settings,
|
|
90
|
87
|
|
|
|
88
|
+ createLocalTracks (...devices) {
|
|
|
89
|
+ return JitsiMeetJS.createLocalTracks({
|
|
|
90
|
+ // copy array to avoid mutations inside library
|
|
|
91
|
+ devices: devices.slice(0),
|
|
|
92
|
+ resolution: config.resolution
|
|
|
93
|
+ }).catch(function (err) {
|
|
|
94
|
+ console.error('failed to create local tracks', ...devices, err);
|
|
|
95
|
+ APP.statistics.onGetUserMediaFailed(err);
|
|
|
96
|
+ return [];
|
|
|
97
|
+ });
|
|
|
98
|
+ },
|
|
|
99
|
+
|
|
91
|
100
|
init () {
|
|
92
|
101
|
let roomName = buildRoomName();
|
|
93
|
102
|
this.conference = {
|
|
|
@@ -137,8 +146,10 @@ function initConference(localTracks, connection) {
|
|
137
|
146
|
|
|
138
|
147
|
const addTrack = (track) => {
|
|
139
|
148
|
room.addTrack(track);
|
|
140
|
|
- if(track.getType() === "audio")
|
|
|
149
|
+ if (track.isAudioTrack()) {
|
|
141
|
150
|
return;
|
|
|
151
|
+ }
|
|
|
152
|
+
|
|
142
|
153
|
room.removeCommand(Commands.VIDEO_TYPE);
|
|
143
|
154
|
room.sendCommand(Commands.VIDEO_TYPE, {
|
|
144
|
155
|
value: track.videoType,
|
|
|
@@ -161,40 +172,6 @@ function initConference(localTracks, connection) {
|
|
161
|
172
|
APP.conference.listMembersIds = function () {
|
|
162
|
173
|
return room.getParticipants().map(p => p.getId());
|
|
163
|
174
|
};
|
|
164
|
|
- /**
|
|
165
|
|
- * Creates video track (desktop or camera).
|
|
166
|
|
- * @param type "camera" or "video"
|
|
167
|
|
- * @param endedHandler onended function
|
|
168
|
|
- * @returns Promise
|
|
169
|
|
- */
|
|
170
|
|
- APP.conference.createVideoTrack = (type, endedHandler) => {
|
|
171
|
|
- return JitsiMeetJS.createLocalTracks({
|
|
172
|
|
- devices: [type], resolution: config.resolution
|
|
173
|
|
- }).then((tracks) => {
|
|
174
|
|
- tracks[0].on(TrackEvents.TRACK_STOPPED, endedHandler);
|
|
175
|
|
- return tracks;
|
|
176
|
|
- });
|
|
177
|
|
- };
|
|
178
|
|
-
|
|
179
|
|
- APP.conference.changeLocalVideo = (track, callback) => {
|
|
180
|
|
- const localCallback = (newTrack) => {
|
|
181
|
|
- if (newTrack.isLocal() && newTrack === localVideo) {
|
|
182
|
|
- if(localVideo.isMuted() &&
|
|
183
|
|
- localVideo.videoType !== track.videoType) {
|
|
184
|
|
- localVideo.mute();
|
|
185
|
|
- }
|
|
186
|
|
- callback();
|
|
187
|
|
- room.off(ConferenceEvents.TRACK_ADDED, localCallback);
|
|
188
|
|
- }
|
|
189
|
|
- };
|
|
190
|
|
-
|
|
191
|
|
- room.on(ConferenceEvents.TRACK_ADDED, localCallback);
|
|
192
|
|
-
|
|
193
|
|
- localVideo.stop();
|
|
194
|
|
- localVideo = track;
|
|
195
|
|
- addTrack(track);
|
|
196
|
|
- APP.UI.addLocalStream(track);
|
|
197
|
|
- };
|
|
198
|
175
|
|
|
199
|
176
|
APP.conference.sipGatewayEnabled = () => {
|
|
200
|
177
|
return room.isSIPCallingSupported();
|
|
|
@@ -205,7 +182,7 @@ function initConference(localTracks, connection) {
|
|
205
|
182
|
return APP.settings.getDisplayName();
|
|
206
|
183
|
}
|
|
207
|
184
|
|
|
208
|
|
- var participant = room.getParticipantById(id);
|
|
|
185
|
+ let participant = room.getParticipantById(id);
|
|
209
|
186
|
if (participant && participant.getDisplayName()) {
|
|
210
|
187
|
return participant.getDisplayName();
|
|
211
|
188
|
}
|
|
|
@@ -214,10 +191,10 @@ function initConference(localTracks, connection) {
|
|
214
|
191
|
// add local streams when joined to the conference
|
|
215
|
192
|
room.on(ConferenceEvents.CONFERENCE_JOINED, function () {
|
|
216
|
193
|
localTracks.forEach(function (track) {
|
|
217
|
|
- if(track.getType() === "audio") {
|
|
|
194
|
+ if(track.isAudioTrack()) {
|
|
218
|
195
|
localAudio = track;
|
|
219
|
196
|
}
|
|
220
|
|
- else if (track.getType() === "video") {
|
|
|
197
|
+ else if (track.isVideoTrack()) {
|
|
221
|
198
|
localVideo = track;
|
|
222
|
199
|
}
|
|
223
|
200
|
addTrack(track);
|
|
|
@@ -246,7 +223,7 @@ function initConference(localTracks, connection) {
|
|
246
|
223
|
APP.conference.isModerator = room.isModerator();
|
|
247
|
224
|
APP.UI.updateLocalRole(room.isModerator());
|
|
248
|
225
|
} else {
|
|
249
|
|
- var user = room.getParticipantById(id);
|
|
|
226
|
+ let user = room.getParticipantById(id);
|
|
250
|
227
|
if (user) {
|
|
251
|
228
|
APP.UI.updateUserRole(user);
|
|
252
|
229
|
}
|
|
|
@@ -401,8 +378,8 @@ function initConference(localTracks, connection) {
|
|
401
|
378
|
});
|
|
402
|
379
|
});
|
|
403
|
380
|
|
|
404
|
|
- room.addCommandListener(Commands.VIDEO_TYPE, (data, from) => {
|
|
405
|
|
- APP.UI.onPeerVideoTypeChanged(from, data.value);
|
|
|
381
|
+ room.addCommandListener(Commands.VIDEO_TYPE, ({value}, from) => {
|
|
|
382
|
+ APP.UI.onPeerVideoTypeChanged(from, value);
|
|
406
|
383
|
});
|
|
407
|
384
|
|
|
408
|
385
|
|
|
|
@@ -416,7 +393,7 @@ function initConference(localTracks, connection) {
|
|
416
|
393
|
});
|
|
417
|
394
|
}
|
|
418
|
395
|
|
|
419
|
|
- var email = APP.settings.getEmail();
|
|
|
396
|
+ let email = APP.settings.getEmail();
|
|
420
|
397
|
email && sendEmail(email);
|
|
421
|
398
|
APP.UI.addListener(UIEvents.EMAIL_CHANGED, function (email) {
|
|
422
|
399
|
APP.settings.setEmail(email);
|
|
|
@@ -534,6 +511,29 @@ function initConference(localTracks, connection) {
|
|
534
|
511
|
APP.UI.updateDTMFSupport(isDTMFSupported);
|
|
535
|
512
|
});
|
|
536
|
513
|
|
|
|
514
|
+ APP.desktopsharing.addListener(
|
|
|
515
|
+ DesktopSharingEventTypes.NEW_STREAM_CREATED,
|
|
|
516
|
+ (track, callback) => {
|
|
|
517
|
+ const localCallback = (newTrack) => {
|
|
|
518
|
+ if (newTrack.isLocal() && newTrack === localVideo) {
|
|
|
519
|
+ if(localVideo.isMuted() &&
|
|
|
520
|
+ localVideo.videoType !== track.videoType) {
|
|
|
521
|
+ localVideo.mute();
|
|
|
522
|
+ }
|
|
|
523
|
+ callback();
|
|
|
524
|
+ room.off(ConferenceEvents.TRACK_ADDED, localCallback);
|
|
|
525
|
+ }
|
|
|
526
|
+ };
|
|
|
527
|
+
|
|
|
528
|
+ room.on(ConferenceEvents.TRACK_ADDED, localCallback);
|
|
|
529
|
+
|
|
|
530
|
+ localVideo.stop();
|
|
|
531
|
+ localVideo = track;
|
|
|
532
|
+ addTrack(track);
|
|
|
533
|
+ APP.UI.addLocalStream(track);
|
|
|
534
|
+ }
|
|
|
535
|
+ );
|
|
|
536
|
+
|
|
537
|
537
|
$(window).bind('beforeunload', function () {
|
|
538
|
538
|
room.leave();
|
|
539
|
539
|
});
|
|
|
@@ -603,16 +603,6 @@ function initConference(localTracks, connection) {
|
|
603
|
603
|
});
|
|
604
|
604
|
}
|
|
605
|
605
|
|
|
606
|
|
-function createLocalTracks () {
|
|
607
|
|
- return JitsiMeetJS.createLocalTracks({
|
|
608
|
|
- devices: ['audio', 'video']
|
|
609
|
|
- }).catch(function (err) {
|
|
610
|
|
- console.error('failed to create local tracks', err);
|
|
611
|
|
- APP.statistics.onGetUserMediaFailed(err);
|
|
612
|
|
- return [];
|
|
613
|
|
- });
|
|
614
|
|
-}
|
|
615
|
|
-
|
|
616
|
606
|
function connect() {
|
|
617
|
607
|
return openConnection({retry: true}).catch(function (err) {
|
|
618
|
608
|
if (err === ConnectionErrors.PASSWORD_REQUIRED) {
|
|
|
@@ -630,7 +620,10 @@ function init() {
|
|
630
|
620
|
JitsiMeetJS.setLogLevel(JitsiMeetJS.logLevels.TRACE);
|
|
631
|
621
|
|
|
632
|
622
|
JitsiMeetJS.init(config).then(function () {
|
|
633
|
|
- return Promise.all([createLocalTracks(), connect()]);
|
|
|
623
|
+ return Promise.all([
|
|
|
624
|
+ APP.createLocalTracks('audio', 'video'),
|
|
|
625
|
+ connect()
|
|
|
626
|
+ ]);
|
|
634
|
627
|
}).then(function ([tracks, connection]) {
|
|
635
|
628
|
console.log('initialized with %s local tracks', tracks.length);
|
|
636
|
629
|
return initConference(tracks, connection);
|
|
|
@@ -642,12 +635,6 @@ function init() {
|
|
642
|
635
|
APP.settings.setLanguage(language);
|
|
643
|
636
|
});
|
|
644
|
637
|
|
|
645
|
|
- APP.desktopsharing.addListener(
|
|
646
|
|
- DesktopSharingEventTypes.NEW_STREAM_CREATED,
|
|
647
|
|
- (stream, callback) => {
|
|
648
|
|
- APP.conference.changeLocalVideo(stream,
|
|
649
|
|
- callback);
|
|
650
|
|
- });
|
|
651
|
638
|
APP.desktopsharing.init(JitsiMeetJS.isDesktopSharingEnabled());
|
|
652
|
639
|
APP.statistics.start();
|
|
653
|
640
|
APP.connectionquality.init();
|