Selaa lähdekoodia

JitsiMeetJS.init returns Promise.

dev1
hristoterezov 9 vuotta sitten
vanhempi
commit
6772975134
7 muutettua tiedostoa jossa 419 lisäystä ja 369 poistoa
  1. 3
    3
      JitsiConferenceEvents.js
  2. 7
    3
      JitsiMeetJS.js
  3. 5
    6
      JitsiTrackErrors.js
  4. 16
    0
      JitsiTrackEvents.js
  5. 10
    6
      doc/example/example.js
  6. 257
    233
      lib-jitsi-meet.js
  7. 121
    118
      modules/RTC/RTCUtils.js

+ 3
- 3
JitsiConferenceEvents.js Näytä tiedosto

8
      */
8
      */
9
     TRACK_ADDED: "conference.trackAdded",
9
     TRACK_ADDED: "conference.trackAdded",
10
     /**
10
     /**
11
-     * The media track was removed to the conference.
11
+     * The media track was removed from the conference.
12
      */
12
      */
13
     TRACK_REMOVED: "conference.trackRemoved",
13
     TRACK_REMOVED: "conference.trackRemoved",
14
     /**
14
     /**
48
      */
48
      */
49
     IN_LAST_N_CHANGED: "conference.lastNEndpointsChanged",
49
     IN_LAST_N_CHANGED: "conference.lastNEndpointsChanged",
50
     /**
50
     /**
51
-     * A media track mute status was changed.
51
+     * A media track ( attached to the conference) mute status was changed.
52
      */
52
      */
53
     TRACK_MUTE_CHANGED: "conference.trackMuteChanged",
53
     TRACK_MUTE_CHANGED: "conference.trackMuteChanged",
54
     /**
54
     /**
55
-     * Audio levels of a media track was changed.
55
+     * Audio levels of a media track ( attached to the conference) was changed.
56
      */
56
      */
57
     TRACK_AUDIO_LEVEL_CHANGED: "conference.audioLevelsChanged",
57
     TRACK_AUDIO_LEVEL_CHANGED: "conference.audioLevelsChanged",
58
     /**
58
     /**

+ 7
- 3
JitsiMeetJS.js Näytä tiedosto

3
 var JitsiConnectionEvents = require("./JitsiConnectionEvents");
3
 var JitsiConnectionEvents = require("./JitsiConnectionEvents");
4
 var JitsiConnectionErrors = require("./JitsiConnectionErrors");
4
 var JitsiConnectionErrors = require("./JitsiConnectionErrors");
5
 var JitsiConferenceErrors = require("./JitsiConferenceErrors");
5
 var JitsiConferenceErrors = require("./JitsiConferenceErrors");
6
+var JitsiTrackEvents = require("./JitsiTrackEvents");
7
+var JitsiTrackErrors = require("./JitsiTrackErrors");
6
 var Logger = require("jitsi-meet-logger");
8
 var Logger = require("jitsi-meet-logger");
7
 var RTC = require("./modules/RTC/RTC");
9
 var RTC = require("./modules/RTC/RTC");
8
 
10
 
14
     JitsiConnection: JitsiConnection,
16
     JitsiConnection: JitsiConnection,
15
     events: {
17
     events: {
16
         conference: JitsiConferenceEvents,
18
         conference: JitsiConferenceEvents,
17
-        connection: JitsiConnectionEvents
19
+        connection: JitsiConnectionEvents,
20
+        track: JitsiTrackEvents
18
     },
21
     },
19
     errors: {
22
     errors: {
20
         conference: JitsiConferenceErrors,
23
         conference: JitsiConferenceErrors,
21
-        connection: JitsiConnectionErrors
24
+        connection: JitsiConnectionErrors,
25
+        track: JitsiTrackErrors
22
     },
26
     },
23
     logLevels: Logger.levels,
27
     logLevels: Logger.levels,
24
     init: function (options) {
28
     init: function (options) {
25
-        RTC.init(options || {});
29
+        return RTC.init(options || {});
26
     },
30
     },
27
     setLogLevel: function (level) {
31
     setLogLevel: function (level) {
28
         Logger.setLogLevel(level);
32
         Logger.setLogLevel(level);

JitsiMeetJSErrors.js → JitsiTrackErrors.js Näytä tiedosto

1
 module.exports = {
1
 module.exports = {
2
     /**
2
     /**
3
-     * Returns JitsiMeetJSError based on the error object passed by GUM
4
-     * @param error the error
3
+     * Returns JitsiTrackErrors based on the error object passed by GUM * @param error the error
5
      * @param {Object} options the options object given to GUM.
4
      * @param {Object} options the options object given to GUM.
6
      */
5
      */
7
     parseError: function (error, options) {
6
     parseError: function (error, options) {
14
             error.constraintName == "minHeight" ||
13
             error.constraintName == "minHeight" ||
15
             error.constraintName == "maxHeight") &&
14
             error.constraintName == "maxHeight") &&
16
             options.devices.indexOf("video") !== -1) {
15
             options.devices.indexOf("video") !== -1) {
17
-                return this.GET_TRACKS_RESOLUTION;
16
+                return this.UNSUPPORTED_RESOLUTION;
18
         } else {
17
         } else {
19
-            return this.GET_TRACKS_GENERAL;
18
+            return this.GENERAL;
20
         }
19
         }
21
     },
20
     },
22
-    GET_TRACKS_RESOLUTION: "gum.get_tracks_resolution",
23
-    GET_TRACKS_GENERAL: "gum.get_tracks_general"
21
+    UNSUPPORTED_RESOLUTION: "gum.unsupported_resolution",
22
+    GENERAL: "gum.general"
24
 };
23
 };

+ 16
- 0
JitsiTrackEvents.js Näytä tiedosto

1
+var JitsiTrackEvents = {
2
+    /**
3
+     * A media track mute status was changed.
4
+     */
5
+    TRACK_MUTE_CHANGED: "track.trackMuteChanged",
6
+    /**
7
+     * Audio levels of a this track was changed.
8
+     */
9
+    TRACK_AUDIO_LEVEL_CHANGED: "track.audioLevelsChanged",
10
+    /**
11
+     * The media track was removed to the conference.
12
+     */
13
+    TRACK_STOPPED: "track.TRACK_STOPPED",
14
+};
15
+
16
+module.exports = JitsiTrackEvents;

+ 10
- 6
doc/example/example.js Näytä tiedosto

29
             $("body").append("<audio autoplay='1' id='localAudio" + i + "' />");
29
             $("body").append("<audio autoplay='1' id='localAudio" + i + "' />");
30
             localTracks[i].attach($("#localAudio" + i ));
30
             localTracks[i].attach($("#localAudio" + i ));
31
         }
31
         }
32
-
33
-            room.addTrack(localTracks[i]);
34
         console.log(localTracks[i]);
32
         console.log(localTracks[i]);
35
     }
33
     }
36
 }
34
 }
58
  */
56
  */
59
 function onConferenceJoined () {
57
 function onConferenceJoined () {
60
     console.log("conference joined!");
58
     console.log("conference joined!");
61
-    JitsiMeetJS.createLocalTracks({devices: ["audio", "video", "desktop"]}).then(onLocalTracks).catch(function (error) {
62
-        console.log(error);
63
-    });
59
+    for(var i = 0; i < localTracks.length; i++)
60
+        room.addTrack(localTracks[i]);
64
 }
61
 }
65
 
62
 
66
 function onUserLeft(id) {
63
 function onUserLeft(id) {
147
     // The URL to the Firefox extension for desktop sharing.
144
     // The URL to the Firefox extension for desktop sharing.
148
     desktopSharingFirefoxExtensionURL: null
145
     desktopSharingFirefoxExtensionURL: null
149
 }
146
 }
150
-JitsiMeetJS.init(initOptions);
147
+JitsiMeetJS.init(initOptions).then(function(){
148
+    JitsiMeetJS.createLocalTracks({devices: ["audio", "video"]}).
149
+        then(onLocalTracks).catch(function (error) {
150
+            console.log(error);
151
+        });
152
+    }).catch(function (error) {
153
+        console.log(error);
154
+    });
151
 
155
 
152
 var connection = null;
156
 var connection = null;
153
 var room = null;
157
 var room = null;

+ 257
- 233
lib-jitsi-meet.js
File diff suppressed because it is too large
Näytä tiedosto


+ 121
- 118
modules/RTC/RTCUtils.js Näytä tiedosto

8
 var SDPUtil = require("../xmpp/SDPUtil");
8
 var SDPUtil = require("../xmpp/SDPUtil");
9
 var EventEmitter = require("events");
9
 var EventEmitter = require("events");
10
 var screenObtainer = require("./ScreenObtainer");
10
 var screenObtainer = require("./ScreenObtainer");
11
-var JitsiMeetJSError = require("../../JitsiMeetJSErrors");
11
+var JitsiTrackErrors = require("../../JitsiTrackErrors");
12
 
12
 
13
 var eventEmitter = new EventEmitter();
13
 var eventEmitter = new EventEmitter();
14
 
14
 
335
         function (error) {
335
         function (error) {
336
             logger.error(
336
             logger.error(
337
                 "failed to obtain " + device + " stream - stop", error);
337
                 "failed to obtain " + device + " stream - stop", error);
338
-            options.errorCallback(JitsiMeetJSError.parseError(error));
338
+            options.errorCallback(JitsiTrackErrors.parseError(error));
339
         });
339
         });
340
 }
340
 }
341
 
341
 
396
 //Options parameter is to pass config options. Currently uses only "useIPv6".
396
 //Options parameter is to pass config options. Currently uses only "useIPv6".
397
 var RTCUtils = {
397
 var RTCUtils = {
398
     init: function (options) {
398
     init: function (options) {
399
-        var self = this;
400
-        if (RTCBrowserType.isFirefox()) {
401
-            var FFversion = RTCBrowserType.getFirefoxVersion();
402
-            if (FFversion >= 40) {
399
+        return new Promise(function(resolve, reject) {
400
+            if (RTCBrowserType.isFirefox()) {
401
+                var FFversion = RTCBrowserType.getFirefoxVersion();
402
+                if (FFversion < 40) {
403
+                    logger.error(
404
+                            "Firefox version too old: " + FFversion +
405
+                            ". Required >= 40.");
406
+                    reject(new Error("Firefox version too old: " + FFversion +
407
+                    ". Required >= 40."));
408
+                    return;
409
+                }
403
                 this.peerconnection = mozRTCPeerConnection;
410
                 this.peerconnection = mozRTCPeerConnection;
404
                 this.getUserMedia = wrapGetUserMedia(navigator.mozGetUserMedia.bind(navigator));
411
                 this.getUserMedia = wrapGetUserMedia(navigator.mozGetUserMedia.bind(navigator));
405
                 this.enumerateDevices = wrapEnumerateDevices(
412
                 this.enumerateDevices = wrapEnumerateDevices(
441
                 };
448
                 };
442
                 RTCSessionDescription = mozRTCSessionDescription;
449
                 RTCSessionDescription = mozRTCSessionDescription;
443
                 RTCIceCandidate = mozRTCIceCandidate;
450
                 RTCIceCandidate = mozRTCIceCandidate;
444
-            } else {
445
-                logger.error(
446
-                        "Firefox version too old: " + FFversion + ". Required >= 40.");
447
-                window.location.href = 'unsupported_browser.html';
448
-                return;
449
-            }
450
-
451
-        } else if (RTCBrowserType.isChrome() || RTCBrowserType.isOpera()) {
452
-            this.peerconnection = webkitRTCPeerConnection;
453
-            var getUserMedia = navigator.webkitGetUserMedia.bind(navigator);
454
-            if (navigator.mediaDevices) {
455
-                this.getUserMedia = wrapGetUserMedia(getUserMedia);
456
-                this.enumerateDevices = wrapEnumerateDevices(
457
-                    navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices)
458
-                );
459
-            } else {
460
-                this.getUserMedia = getUserMedia;
461
-                this.enumerateDevices = enumerateDevicesThroughMediaStreamTrack;
462
-            }
463
-            this.attachMediaStream = function (element, stream) {
464
-                element.attr('src', webkitURL.createObjectURL(stream));
465
-            };
466
-            this.getStreamID = function (stream) {
467
-                // streams from FF endpoints have the characters '{' and '}'
468
-                // that make jQuery choke.
469
-                return SDPUtil.filter_special_chars(stream.id);
470
-            };
471
-            this.getVideoSrc = function (element) {
472
-                if (!element)
473
-                    return null;
474
-                return element.getAttribute("src");
475
-            };
476
-            this.setVideoSrc = function (element, src) {
477
-                if (element)
478
-                    element.setAttribute("src", src);
479
-            };
480
-            // DTLS should now be enabled by default but..
481
-            this.pc_constraints = {'optional': [
482
-                {'DtlsSrtpKeyAgreement': 'true'}
483
-            ]};
484
-            if (options.useIPv6) {
485
-                // https://code.google.com/p/webrtc/issues/detail?id=2828
486
-                this.pc_constraints.optional.push({googIPv6: true});
487
-            }
488
-            if (RTCBrowserType.isAndroid()) {
489
-                this.pc_constraints = {}; // disable DTLS on Android
490
-            }
491
-            if (!webkitMediaStream.prototype.getVideoTracks) {
492
-                webkitMediaStream.prototype.getVideoTracks = function () {
493
-                    return this.videoTracks;
451
+            } else if (RTCBrowserType.isChrome() || RTCBrowserType.isOpera()) {
452
+                this.peerconnection = webkitRTCPeerConnection;
453
+                var getUserMedia = navigator.webkitGetUserMedia.bind(navigator);
454
+                if (navigator.mediaDevices) {
455
+                    this.getUserMedia = wrapGetUserMedia(getUserMedia);
456
+                    this.enumerateDevices = wrapEnumerateDevices(
457
+                        navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices)
458
+                    );
459
+                } else {
460
+                    this.getUserMedia = getUserMedia;
461
+                    this.enumerateDevices = enumerateDevicesThroughMediaStreamTrack;
462
+                }
463
+                this.attachMediaStream = function (element, stream) {
464
+                    element.attr('src', webkitURL.createObjectURL(stream));
494
                 };
465
                 };
495
-            }
496
-            if (!webkitMediaStream.prototype.getAudioTracks) {
497
-                webkitMediaStream.prototype.getAudioTracks = function () {
498
-                    return this.audioTracks;
466
+                this.getStreamID = function (stream) {
467
+                    // streams from FF endpoints have the characters '{' and '}'
468
+                    // that make jQuery choke.
469
+                    return SDPUtil.filter_special_chars(stream.id);
499
                 };
470
                 };
471
+                this.getVideoSrc = function (element) {
472
+                    if (!element)
473
+                        return null;
474
+                    return element.getAttribute("src");
475
+                };
476
+                this.setVideoSrc = function (element, src) {
477
+                    if (element)
478
+                        element.setAttribute("src", src);
479
+                };
480
+                // DTLS should now be enabled by default but..
481
+                this.pc_constraints = {'optional': [
482
+                    {'DtlsSrtpKeyAgreement': 'true'}
483
+                ]};
484
+                if (options.useIPv6) {
485
+                    // https://code.google.com/p/webrtc/issues/detail?id=2828
486
+                    this.pc_constraints.optional.push({googIPv6: true});
487
+                }
488
+                if (RTCBrowserType.isAndroid()) {
489
+                    this.pc_constraints = {}; // disable DTLS on Android
490
+                }
491
+                if (!webkitMediaStream.prototype.getVideoTracks) {
492
+                    webkitMediaStream.prototype.getVideoTracks = function () {
493
+                        return this.videoTracks;
494
+                    };
495
+                }
496
+                if (!webkitMediaStream.prototype.getAudioTracks) {
497
+                    webkitMediaStream.prototype.getAudioTracks = function () {
498
+                        return this.audioTracks;
499
+                    };
500
+                }
500
             }
501
             }
501
-        }
502
-        // Detect IE/Safari
503
-        else if (RTCBrowserType.isTemasysPluginUsed()) {
502
+            // Detect IE/Safari
503
+            else if (RTCBrowserType.isTemasysPluginUsed()) {
504
 
504
 
505
-            //AdapterJS.WebRTCPlugin.setLogLevel(
506
-            //    AdapterJS.WebRTCPlugin.PLUGIN_LOG_LEVELS.VERBOSE);
505
+                //AdapterJS.WebRTCPlugin.setLogLevel(
506
+                //    AdapterJS.WebRTCPlugin.PLUGIN_LOG_LEVELS.VERBOSE);
507
 
507
 
508
-            AdapterJS.webRTCReady(function (isPlugin) {
508
+                AdapterJS.webRTCReady(function (isPlugin) {
509
 
509
 
510
-                self.peerconnection = RTCPeerConnection;
511
-                self.getUserMedia = window.getUserMedia;
512
-                self.enumerateDevices = enumerateDevicesThroughMediaStreamTrack;
513
-                self.attachMediaStream = function (elSel, stream) {
510
+                    self.peerconnection = RTCPeerConnection;
511
+                    self.getUserMedia = window.getUserMedia;
512
+                    self.enumerateDevices = enumerateDevicesThroughMediaStreamTrack;
513
+                    self.attachMediaStream = function (elSel, stream) {
514
 
514
 
515
-                    if (stream.id === "dummyAudio" || stream.id === "dummyVideo") {
516
-                        return;
517
-                    }
515
+                        if (stream.id === "dummyAudio" || stream.id === "dummyVideo") {
516
+                            return;
517
+                        }
518
 
518
 
519
-                    attachMediaStream(elSel[0], stream);
520
-                };
521
-                self.getStreamID = function (stream) {
522
-                    var id = SDPUtil.filter_special_chars(stream.label);
523
-                    return id;
524
-                };
525
-                self.getVideoSrc = function (element) {
526
-                    if (!element) {
527
-                        logger.warn("Attempt to get video SRC of null element");
519
+                        attachMediaStream(elSel[0], stream);
520
+                    };
521
+                    self.getStreamID = function (stream) {
522
+                        var id = SDPUtil.filter_special_chars(stream.label);
523
+                        return id;
524
+                    };
525
+                    self.getVideoSrc = function (element) {
526
+                        if (!element) {
527
+                            logger.warn("Attempt to get video SRC of null element");
528
+                            return null;
529
+                        }
530
+                        var children = element.children;
531
+                        for (var i = 0; i !== children.length; ++i) {
532
+                            if (children[i].name === 'streamId') {
533
+                                return children[i].value;
534
+                            }
535
+                        }
536
+                        //logger.info(element.id + " SRC: " + src);
528
                         return null;
537
                         return null;
529
-                    }
530
-                    var children = element.children;
531
-                    for (var i = 0; i !== children.length; ++i) {
532
-                        if (children[i].name === 'streamId') {
533
-                            return children[i].value;
538
+                    };
539
+                    self.setVideoSrc = function (element, src) {
540
+                        //logger.info("Set video src: ", element, src);
541
+                        if (!src) {
542
+                            logger.warn("Not attaching video stream, 'src' is null");
543
+                            return;
534
                         }
544
                         }
535
-                    }
536
-                    //logger.info(element.id + " SRC: " + src);
537
-                    return null;
538
-                };
539
-                self.setVideoSrc = function (element, src) {
540
-                    //logger.info("Set video src: ", element, src);
541
-                    if (!src) {
542
-                        logger.warn("Not attaching video stream, 'src' is null");
543
-                        return;
544
-                    }
545
-                    AdapterJS.WebRTCPlugin.WaitForPluginReady();
546
-                    var stream = AdapterJS.WebRTCPlugin.plugin
547
-                        .getStreamWithId(AdapterJS.WebRTCPlugin.pageId, src);
548
-                    attachMediaStream(element, stream);
549
-                };
545
+                        AdapterJS.WebRTCPlugin.WaitForPluginReady();
546
+                        var stream = AdapterJS.WebRTCPlugin.plugin
547
+                            .getStreamWithId(AdapterJS.WebRTCPlugin.pageId, src);
548
+                        attachMediaStream(element, stream);
549
+                    };
550
+
551
+                    onReady(options, self.getUserMediaWithConstraints);
552
+                    resolve();
553
+                });
554
+            } else {
555
+                try {
556
+                    logger.error('Browser does not appear to be WebRTC-capable');
557
+                } catch (e) {
558
+                }
559
+                reject('Browser does not appear to be WebRTC-capable');
560
+                return;
561
+            }
550
 
562
 
563
+            // Call onReady() if Temasys plugin is not used
564
+            if (!RTCBrowserType.isTemasysPluginUsed()) {
551
                 onReady(options, self.getUserMediaWithConstraints);
565
                 onReady(options, self.getUserMediaWithConstraints);
552
-            });
553
-        } else {
554
-            try {
555
-                logger.error('Browser does not appear to be WebRTC-capable');
556
-            } catch (e) {
566
+                resolve();
557
             }
567
             }
558
-            return;
559
-        }
560
-
561
-        // Call onReady() if Temasys plugin is not used
562
-        if (!RTCBrowserType.isTemasysPluginUsed()) {
563
-            onReady(options, self.getUserMediaWithConstraints);
564
-        }
565
-
568
+        }.bind(this));
566
     },
569
     },
567
     /**
570
     /**
568
     * @param {string[]} um required user media types
571
     * @param {string[]} um required user media types
674
                                             desktopStream: desktopStream});
677
                                             desktopStream: desktopStream});
675
                                     }, function (error) {
678
                                     }, function (error) {
676
                                         reject(
679
                                         reject(
677
-                                            JitsiMeetJSError.parseError(error));
680
+                                            JitsiTrackErrors.parseError(error));
678
                                     });
681
                                     });
679
                             } else {
682
                             } else {
680
                                 successCallback({audioVideo: stream});
683
                                 successCallback({audioVideo: stream});
681
                             }
684
                             }
682
                         },
685
                         },
683
                         function (error) {
686
                         function (error) {
684
-                            reject(JitsiMeetJSError.parseError(error));
687
+                            reject(JitsiTrackErrors.parseError(error));
685
                         },
688
                         },
686
                         options);
689
                         options);
687
                 } else if (hasDesktop) {
690
                 } else if (hasDesktop) {
690
                             successCallback({desktopStream: stream});
693
                             successCallback({desktopStream: stream});
691
                         }, function (error) {
694
                         }, function (error) {
692
                             reject(
695
                             reject(
693
-                                JitsiMeetJSError.parseError(error));
696
+                                JitsiTrackErrors.parseError(error));
694
                         });
697
                         });
695
                 }
698
                 }
696
             }
699
             }

Loading…
Peruuta
Tallenna