Browse Source

Start callStats as soon as second participant join the room, maybe even without established jingle session and peer connection

master
tsareg 9 years ago
parent
commit
f8ed717be6
4 changed files with 44 additions and 16 deletions
  1. 6
    8
      JitsiConference.js
  2. 5
    0
      JitsiMeetJS.js
  3. 4
    8
      JitsiTrackError.js
  4. 29
    0
      modules/statistics/statistics.js

+ 6
- 8
JitsiConference.js View File

@@ -944,8 +944,12 @@ function setupListeners(conference) {
944 944
                         "Failed to accept incoming Jingle session", error);
945 945
                 }
946 946
             );
947
-            conference.statistics.startRemoteStats(
948
-                    jingleSession.peerconnection);
947
+            // Start callstats as soon as peerconnection is initialized,
948
+            // do not wait for XMPPEvents.PEERCONNECTION_READY, as it may never
949
+            // happen in case if user doesn't have or denied permission to
950
+            // both camera and microphone.
951
+            conference.statistics.startCallStats(jingleSession, conference.settings);
952
+            conference.statistics.startRemoteStats(jingleSession.peerconnection);
949 953
         } else {
950 954
             // Error cause this should never happen unless something is wrong!
951 955
             var errmsg
@@ -1296,12 +1300,6 @@ function setupListeners(conference) {
1296 1300
                 conference.statistics.dispose();
1297 1301
             });
1298 1302
 
1299
-        conference.room.addListener(XMPPEvents.PEERCONNECTION_READY,
1300
-            function (session) {
1301
-                conference.statistics.startCallStats(
1302
-                    session, conference.settings);
1303
-            });
1304
-
1305 1303
         conference.room.addListener(XMPPEvents.CONNECTION_ICE_FAILED,
1306 1304
             function (pc) {
1307 1305
                 conference.statistics.sendIceConnectionFailedEvent(pc);

+ 5
- 0
JitsiMeetJS.js View File

@@ -8,6 +8,7 @@ var JitsiConnectionErrors = require("./JitsiConnectionErrors");
8 8
 var JitsiConferenceErrors = require("./JitsiConferenceErrors");
9 9
 var JitsiTrackEvents = require("./JitsiTrackEvents");
10 10
 var JitsiTrackErrors = require("./JitsiTrackErrors");
11
+var JitsiTrackError = require("./JitsiTrackError");
11 12
 var JitsiRecorderErrors = require("./JitsiRecorderErrors");
12 13
 var Logger = require("jitsi-meet-logger");
13 14
 var MediaType = require("./service/RTC/MediaType");
@@ -219,6 +220,10 @@ var LibJitsiMeet = {
219 220
 // JitsiConnection.
220 221
 LibJitsiMeet.JitsiConnection = JitsiConnection.bind(null, LibJitsiMeet);
221 222
 
223
+// expose JitsiTrackError this way to give library consumers to do checks like
224
+// if (error instanceof JitsiMeetJS.JitsiTrackError) { }
225
+LibJitsiMeet.JitsiTrackError = JitsiTrackError;
226
+
222 227
 //Setups the promise object.
223 228
 window.Promise = window.Promise || require("es6-promise").Promise;
224 229
 

+ 4
- 8
JitsiTrackError.js View File

@@ -62,17 +62,13 @@ function JitsiTrackError(error, options, devices) {
62 62
                 this.message = error.message
63 63
                     || TRACK_ERROR_TO_MESSAGE_MAP[
64 64
                         JitsiTrackErrors.PERMISSION_DENIED]
65
-                        + Object.keys(options || {}).filter(function (k) {
66
-                            return !!options[k];
67
-                        }).join(", ");
65
+                        + (this.gum.devices || []).join(", ");
68 66
                 break;
69 67
             case "NotFoundError":
70 68
                 this.name = JitsiTrackErrors.NOT_FOUND;
71
-                this.message = error.message
72
-                    || TRACK_ERROR_TO_MESSAGE_MAP[JitsiTrackErrors.NOT_FOUND]
73
-                        + Object.keys(options || {}).filter(function (k) {
74
-                            return !!options[k];
75
-                        }).join(", ");
69
+                this.message = TRACK_ERROR_TO_MESSAGE_MAP[
70
+                        JitsiTrackErrors.NOT_FOUND]
71
+                        + (this.gum.devices || []).join(", ");
76 72
                 break;
77 73
             case "ConstraintNotSatisfiedError":
78 74
             case "OverconstrainedError":

+ 29
- 0
modules/statistics/statistics.js View File

@@ -28,6 +28,35 @@ function loadCallStatsAPI() {
28 28
  */
29 29
 var LOG_INTERVAL = 60000;
30 30
 
31
+/**
32
+ * callstats strips any additional fields from Error except for "name", "stack",
33
+ * "message" and "constraintName". So we need to bundle additional information
34
+ * from JitsiTrackError into error passed to callstats to preserve valuable
35
+ * information about error.
36
+ * @param {JitsiTrackError} error
37
+ */
38
+function formatJitsiTrackErrorForCallStats(error) {
39
+    var err = new Error();
40
+
41
+    // Just copy original stack from error
42
+    err.stack = error.stack;
43
+
44
+    // Combine name from error's name plus (possibly) name of original GUM error
45
+    err.name = (error.name || "Unknown error") + (error.gum && error.gum.error
46
+        && error.gum.error.name ? " - " + error.gum.error.name : "");
47
+
48
+    // Put all constraints into this field. For constraint failed errors we will
49
+    // still know which exactly constraint failed as it will be a part of
50
+    // message.
51
+    err.constraintName = error.gum && error.gum.constraints
52
+        ? JSON.stringify(error.gum.constraints) : "";
53
+
54
+    // Just copy error's message.
55
+    err.message = error.message;
56
+
57
+    return err;
58
+}
59
+
31 60
 function Statistics(xmpp, options) {
32 61
     this.rtpStats = null;
33 62
     this.eventEmitter = new EventEmitter();

Loading…
Cancel
Save