瀏覽代碼

Merge pull request #399 from isymchych/callstats-error-reporting

Callstats error reporting. Ivan is going to publish another PR about earlier failures that would apply on top of this one.
master
yanas 10 年之前
父節點
當前提交
071fbfbd0d

+ 2
- 2
modules/RTC/RTC.js 查看文件

@@ -177,7 +177,7 @@ var RTC = {
177 177
                 null, null, getMediaStreamUsage());
178 178
         };
179 179
 
180
-        this.rtcUtils = new RTCUtils(this, onReady);
180
+        this.rtcUtils = new RTCUtils(this, eventEmitter, onReady);
181 181
 
182 182
         // Call onReady() if Temasys plugin is not used
183 183
         if (!RTCBrowserType.isTemasysPluginUsed()) {
@@ -210,7 +210,7 @@ var RTC = {
210 210
                 APP.xmpp.setVideoMute(false, function(mute) {
211 211
                     eventEmitter.emit(RTCEvents.VIDEO_MUTE, mute);
212 212
                 });
213
-                
213
+
214 214
                 callback();
215 215
             };
216 216
         }

+ 5
- 1
modules/RTC/RTCUtils.js 查看文件

@@ -5,6 +5,7 @@
5 5
 var MediaStreamType = require("../../service/RTC/MediaStreamTypes");
6 6
 var RTCBrowserType = require("./RTCBrowserType");
7 7
 var Resolutions = require("../../service/RTC/Resolutions");
8
+var RTCEvents = require("../../service/RTC/RTCEvents");
8 9
 var AdapterJS = require("./adapter.screenshare");
9 10
 
10 11
 var currentResolution = null;
@@ -153,10 +154,11 @@ function getConstraints(um, resolution, bandwidth, fps, desktopStream) {
153 154
 }
154 155
 
155 156
 
156
-function RTCUtils(RTCService, onTemasysPluginReady)
157
+function RTCUtils(RTCService, eventEmitter, onTemasysPluginReady)
157 158
 {
158 159
     var self = this;
159 160
     this.service = RTCService;
161
+    this.eventEmitter = eventEmitter;
160 162
     if (RTCBrowserType.isFirefox()) {
161 163
         var FFversion = RTCBrowserType.getFirefoxVersion();
162 164
         if (FFversion >= 40) {
@@ -322,12 +324,14 @@ RTCUtils.prototype.getUserMediaWithConstraints = function(
322 324
                 self.setAvailableDevices(um, false);
323 325
                 console.warn('Failed to get access to local media. Error ',
324 326
                     error, constraints);
327
+                self.eventEmitter.emit(RTCEvents.GET_USER_MEDIA_FAILED, error);
325 328
                 if (failure_callback) {
326 329
                     failure_callback(error);
327 330
                 }
328 331
             });
329 332
     } catch (e) {
330 333
         console.error('GUM failed: ', e);
334
+        self.eventEmitter.emit(RTCEvents.GET_USER_MEDIA_FAILED, e);
331 335
         if(failure_callback) {
332 336
             failure_callback(e);
333 337
         }

+ 98
- 4
modules/statistics/CallStats.js 查看文件

@@ -5,6 +5,11 @@ var jsSHA = require('jssha');
5 5
 var io = require('socket.io-client');
6 6
 var callStats = null;
7 7
 
8
+// getUserMedia calls happen before CallStats init
9
+// so if there are any getUserMedia errors, we store them in this array
10
+// and send them to callstats on init
11
+var pendingUserMediaErrors = [];
12
+
8 13
 function initCallback (err, msg) {
9 14
     console.log("Initializing Status: err="+err+" msg="+msg);
10 15
 }
@@ -38,17 +43,25 @@ var CallStats = {
38 43
             usage,
39 44
             this.confID,
40 45
             this.pcCallback.bind(this));
46
+
47
+        // notify callstats about getUserMedia failures if there were any
48
+        if (pendingUserMediaErrors.length) {
49
+            pendingUserMediaErrors.forEach(this.sendGetUserMediaFailed, this);
50
+            pendingUserMediaErrors.length = 0;
51
+        }
41 52
     },
42 53
     pcCallback: function (err, msg) {
43
-        if (!callStats)
54
+        if (!callStats) {
44 55
             return;
56
+        }
45 57
         console.log("Monitoring status: "+ err + " msg: " + msg);
46 58
         callStats.sendFabricEvent(this.peerconnection,
47 59
             callStats.fabricEvent.fabricSetup, this.confID);
48 60
     },
49 61
     sendMuteEvent: function (mute, type) {
50
-        if (!callStats)
62
+        if (!callStats) {
51 63
             return;
64
+        }
52 65
         var event = null;
53 66
         if (type === "video") {
54 67
             event = (mute? callStats.fabricEvent.videoPause :
@@ -74,7 +87,8 @@ var CallStats = {
74 87
         callStats.sendFabricEvent(this.peerconnection,
75 88
             callStats.fabricEvent.fabricSetupFailed, this.confID);
76 89
     },
77
-    /**
90
+
91
+   /**
78 92
      * Sends the given feedback through CallStats.
79 93
      *
80 94
      * @param overallFeedback an integer between 1 and 5 indicating the
@@ -93,6 +107,86 @@ var CallStats = {
93 107
 
94 108
         callStats.sendUserFeedback(
95 109
             this.confID, feedbackJSON);
110
+    },
111
+
112
+    /**
113
+     * Notifies CallStats that getUserMedia failed.
114
+     *
115
+     * @param {Error} e error to send
116
+     */
117
+    sendGetUserMediaFailed: function (e) {
118
+        if(!callStats) {
119
+            pendingUserMediaErrors.push(e);
120
+            return;
121
+        }
122
+        callStats.reportError(this.peerconnection, this.confID,
123
+                              callStats.webRTCFunctions.getUserMedia, e);
124
+    },
125
+
126
+    /**
127
+     * Notifies CallStats that peer connection failed to create offer.
128
+     *
129
+     * @param {Error} e error to send
130
+     */
131
+    sendCreateOfferFailed: function (e) {
132
+        if(!callStats) {
133
+            return;
134
+        }
135
+        callStats.reportError(this.peerconnection, this.confID,
136
+                              callStats.webRTCFunctions.createOffer, e);
137
+    },
138
+
139
+    /**
140
+     * Notifies CallStats that peer connection failed to create answer.
141
+     *
142
+     * @param {Error} e error to send
143
+     */
144
+    sendCreateAnswerFailed: function (e) {
145
+        if(!callStats) {
146
+            return;
147
+        }
148
+        callStats.reportError(this.peerconnection, this.confID,
149
+                              callStats.webRTCFunctions.createAnswer, e);
150
+    },
151
+
152
+    /**
153
+     * Notifies CallStats that peer connection failed to set local description.
154
+     *
155
+     * @param {Error} e error to send
156
+     */
157
+    sendSetLocalDescFailed: function (e) {
158
+        if(!callStats) {
159
+            return;
160
+        }
161
+        callStats.reportError(this.peerconnection, this.confID,
162
+                              callStats.webRTCFunctions.setLocalDescription, e);
163
+    },
164
+
165
+    /**
166
+     * Notifies CallStats that peer connection failed to set remote description.
167
+     *
168
+     * @param {Error} e error to send
169
+     */
170
+    sendSetRemoteDescFailed: function (e) {
171
+        if(!callStats) {
172
+            return;
173
+        }
174
+        callStats.reportError(
175
+            this.peerconnection, this.confID,
176
+            callStats.webRTCFunctions.setRemoteDescription, e);
177
+    },
178
+
179
+    /**
180
+     * Notifies CallStats that peer connection failed to add ICE candidate.
181
+     *
182
+     * @param {Error} e error to send
183
+     */
184
+    sendAddIceCandidateFailed: function (e) {
185
+        if(!callStats) {
186
+            return;
187
+        }
188
+        callStats.reportError(this.peerconnection, this.confID,
189
+                              callStats.webRTCFunctions.addIceCandidate, e);
96 190
     }
97 191
 };
98
-module.exports = CallStats;
192
+module.exports = CallStats;

+ 19
- 0
modules/statistics/statistics.js 查看文件

@@ -109,6 +109,25 @@ var statistics = {
109 109
         APP.RTC.addListener(RTCEvents.VIDEO_MUTE, function (mute) {
110 110
             CallStats.sendMuteEvent(mute, "video");
111 111
         });
112
+
113
+        APP.RTC.addListener(RTCEvents.GET_USER_MEDIA_FAILED, function (e) {
114
+            CallStats.sendGetUserMediaFailed(e);
115
+        });
116
+        APP.xmpp.addListener(RTCEvents.CREATE_OFFER_FAILED, function (e) {
117
+            CallStats.sendCreateOfferFailed(e);
118
+        });
119
+        APP.xmpp.addListener(RTCEvents.CREATE_ANSWER_FAILED, function (e) {
120
+            CallStats.sendCreateAnswerFailed(e);
121
+        });
122
+        APP.xmpp.addListener(RTCEvents.SET_LOCAL_DESCRIPTION_FAILED, function (e) {
123
+            CallStats.sendSetLocalDescFailed(e);
124
+        });
125
+        APP.xmpp.addListener(RTCEvents.SET_REMOTE_DESCRIPTION_FAILED, function (e) {
126
+            CallStats.sendSetRemoteDescFailed(e);
127
+        });
128
+        APP.xmpp.addListener(RTCEvents.ADD_ICE_CANDIDATE_FAILED, function (e) {
129
+            CallStats.sendAddIceCandidateFailed(e);
130
+        });
112 131
     }
113 132
 };
114 133
 

+ 2
- 0
modules/xmpp/JingleSessionPC.js 查看文件

@@ -8,6 +8,7 @@ var SDP = require("./SDP");
8 8
 var async = require("async");
9 9
 var transform = require("sdp-transform");
10 10
 var XMPPEvents = require("../../service/xmpp/XMPPEvents");
11
+var RTCEvents = require("../../service/RTC/RTCEvents");
11 12
 var RTCBrowserType = require("../RTC/RTCBrowserType");
12 13
 var SSRCReplacement = require("./LocalSSRCReplacement");
13 14
 
@@ -719,6 +720,7 @@ JingleSessionPC.prototype.addIceCandidate = function (elem) {
719 720
                 self.peerconnection.addIceCandidate(candidate);
720 721
             } catch (e) {
721 722
                 console.error('addIceCandidate failed', e.toString(), line);
723
+                self.eventEmitter.emit(RTCEvents.ADD_ICE_CANDIDATE_FAILED, err);
722 724
             }
723 725
         });
724 726
     });

+ 8
- 4
modules/xmpp/TraceablePeerConnection.js 查看文件

@@ -2,8 +2,8 @@
2 2
     webkitRTCPeerConnection, RTCSessionDescription */
3 3
 /* jshint -W101 */
4 4
 var RTC = require('../RTC/RTC');
5
-var RTCBrowserType = require("../RTC/RTCBrowserType.js");
6
-var XMPPEvents = require("../../service/xmpp/XMPPEvents");
5
+var RTCBrowserType = require("../RTC/RTCBrowserType");
6
+var RTCEvents = require("../../service/RTC/RTCEvents");
7 7
 var SSRCReplacement = require("./LocalSSRCReplacement");
8 8
 
9 9
 function TraceablePeerConnection(ice_config, constraints, session) {
@@ -16,6 +16,7 @@ function TraceablePeerConnection(ice_config, constraints, session) {
16 16
     } else {
17 17
         RTCPeerConnectionType = webkitRTCPeerConnection;
18 18
     }
19
+    self.eventEmitter = session.eventEmitter;
19 20
     this.peerconnection = new RTCPeerConnectionType(ice_config, constraints);
20 21
     this.updateLog = [];
21 22
     this.stats = {};
@@ -218,7 +219,7 @@ if (TraceablePeerConnection.prototype.__defineGetter__ !== undefined) {
218 219
             var desc = this.peerconnection.localDescription;
219 220
 
220 221
             desc = SSRCReplacement.mungeLocalVideoSSRC(desc);
221
-            
222
+
222 223
             this.trace('getLocalDescription::preTransform', dumpSDP(desc));
223 224
 
224 225
             // if we're running on FF, transform to Plan B first.
@@ -292,6 +293,7 @@ TraceablePeerConnection.prototype.setLocalDescription
292 293
         },
293 294
         function (err) {
294 295
             self.trace('setLocalDescriptionOnFailure', err);
296
+            self.eventEmitter.emit(RTCEvents.SET_LOCAL_DESCRIPTION_FAILED, err);
295 297
             failureCallback(err);
296 298
         }
297 299
     );
@@ -327,6 +329,7 @@ TraceablePeerConnection.prototype.setRemoteDescription
327 329
         },
328 330
         function (err) {
329 331
             self.trace('setRemoteDescriptionOnFailure', err);
332
+            self.eventEmitter.emit(RTCEvents.SET_REMOTE_DESCRIPTION_FAILED, err);
330 333
             failureCallback(err);
331 334
         }
332 335
     );
@@ -372,6 +375,7 @@ TraceablePeerConnection.prototype.createOffer
372 375
         },
373 376
         function(err) {
374 377
             self.trace('createOfferOnFailure', err);
378
+            self.eventEmitter.emit(RTCEvents.CREATE_OFFER_FAILED, err);
375 379
             failureCallback(err);
376 380
         },
377 381
         constraints
@@ -402,6 +406,7 @@ TraceablePeerConnection.prototype.createAnswer
402 406
         },
403 407
         function(err) {
404 408
             self.trace('createAnswerOnFailure', err);
409
+            self.eventEmitter.emit(RTCEvents.CREATE_ANSWER_FAILED, err);
405 410
             failureCallback(err);
406 411
         },
407 412
         constraints
@@ -440,4 +445,3 @@ TraceablePeerConnection.prototype.getStats = function(callback, errback) {
440 445
 };
441 446
 
442 447
 module.exports = TraceablePeerConnection;
443
-

+ 6
- 0
service/RTC/RTCEvents.js 查看文件

@@ -1,6 +1,12 @@
1 1
 var RTCEvents = {
2 2
     RTC_READY: "rtc.ready",
3 3
     DATA_CHANNEL_OPEN: "rtc.data_channel_open",
4
+    CREATE_OFFER_FAILED: "rtc.create_offer_failed",
5
+    CREATE_ANSWER_FAILED: "rtc.create_answer_failed",
6
+    SET_LOCAL_DESCRIPTION_FAILED: "rtc.set_local_description_failed",
7
+    SET_REMOTE_DESCRIPTION_FAILED: "rtc.set_remote_description_failed",
8
+    ADD_ICE_CANDIDATE_FAILED: "rtc.add_ice_candidate_failed",
9
+    GET_USER_MEDIA_FAILED: "rtc.get_user_media_failed",
4 10
     LASTN_CHANGED: "rtc.lastn_changed",
5 11
     DOMINANTSPEAKER_CHANGED: "rtc.dominantspeaker_changed",
6 12
     LASTN_ENDPOINT_CHANGED: "rtc.lastn_endpoint_changed",

Loading…
取消
儲存