Browse Source

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 years ago
parent
commit
071fbfbd0d

+ 2
- 2
modules/RTC/RTC.js View File

177
                 null, null, getMediaStreamUsage());
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
         // Call onReady() if Temasys plugin is not used
182
         // Call onReady() if Temasys plugin is not used
183
         if (!RTCBrowserType.isTemasysPluginUsed()) {
183
         if (!RTCBrowserType.isTemasysPluginUsed()) {
210
                 APP.xmpp.setVideoMute(false, function(mute) {
210
                 APP.xmpp.setVideoMute(false, function(mute) {
211
                     eventEmitter.emit(RTCEvents.VIDEO_MUTE, mute);
211
                     eventEmitter.emit(RTCEvents.VIDEO_MUTE, mute);
212
                 });
212
                 });
213
-                
213
+
214
                 callback();
214
                 callback();
215
             };
215
             };
216
         }
216
         }

+ 5
- 1
modules/RTC/RTCUtils.js View File

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

+ 98
- 4
modules/statistics/CallStats.js View File

5
 var io = require('socket.io-client');
5
 var io = require('socket.io-client');
6
 var callStats = null;
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
 function initCallback (err, msg) {
13
 function initCallback (err, msg) {
9
     console.log("Initializing Status: err="+err+" msg="+msg);
14
     console.log("Initializing Status: err="+err+" msg="+msg);
10
 }
15
 }
38
             usage,
43
             usage,
39
             this.confID,
44
             this.confID,
40
             this.pcCallback.bind(this));
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
     pcCallback: function (err, msg) {
53
     pcCallback: function (err, msg) {
43
-        if (!callStats)
54
+        if (!callStats) {
44
             return;
55
             return;
56
+        }
45
         console.log("Monitoring status: "+ err + " msg: " + msg);
57
         console.log("Monitoring status: "+ err + " msg: " + msg);
46
         callStats.sendFabricEvent(this.peerconnection,
58
         callStats.sendFabricEvent(this.peerconnection,
47
             callStats.fabricEvent.fabricSetup, this.confID);
59
             callStats.fabricEvent.fabricSetup, this.confID);
48
     },
60
     },
49
     sendMuteEvent: function (mute, type) {
61
     sendMuteEvent: function (mute, type) {
50
-        if (!callStats)
62
+        if (!callStats) {
51
             return;
63
             return;
64
+        }
52
         var event = null;
65
         var event = null;
53
         if (type === "video") {
66
         if (type === "video") {
54
             event = (mute? callStats.fabricEvent.videoPause :
67
             event = (mute? callStats.fabricEvent.videoPause :
74
         callStats.sendFabricEvent(this.peerconnection,
87
         callStats.sendFabricEvent(this.peerconnection,
75
             callStats.fabricEvent.fabricSetupFailed, this.confID);
88
             callStats.fabricEvent.fabricSetupFailed, this.confID);
76
     },
89
     },
77
-    /**
90
+
91
+   /**
78
      * Sends the given feedback through CallStats.
92
      * Sends the given feedback through CallStats.
79
      *
93
      *
80
      * @param overallFeedback an integer between 1 and 5 indicating the
94
      * @param overallFeedback an integer between 1 and 5 indicating the
93
 
107
 
94
         callStats.sendUserFeedback(
108
         callStats.sendUserFeedback(
95
             this.confID, feedbackJSON);
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 View File

109
         APP.RTC.addListener(RTCEvents.VIDEO_MUTE, function (mute) {
109
         APP.RTC.addListener(RTCEvents.VIDEO_MUTE, function (mute) {
110
             CallStats.sendMuteEvent(mute, "video");
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 View File

8
 var async = require("async");
8
 var async = require("async");
9
 var transform = require("sdp-transform");
9
 var transform = require("sdp-transform");
10
 var XMPPEvents = require("../../service/xmpp/XMPPEvents");
10
 var XMPPEvents = require("../../service/xmpp/XMPPEvents");
11
+var RTCEvents = require("../../service/RTC/RTCEvents");
11
 var RTCBrowserType = require("../RTC/RTCBrowserType");
12
 var RTCBrowserType = require("../RTC/RTCBrowserType");
12
 var SSRCReplacement = require("./LocalSSRCReplacement");
13
 var SSRCReplacement = require("./LocalSSRCReplacement");
13
 
14
 
719
                 self.peerconnection.addIceCandidate(candidate);
720
                 self.peerconnection.addIceCandidate(candidate);
720
             } catch (e) {
721
             } catch (e) {
721
                 console.error('addIceCandidate failed', e.toString(), line);
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 View File

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

+ 6
- 0
service/RTC/RTCEvents.js View File

1
 var RTCEvents = {
1
 var RTCEvents = {
2
     RTC_READY: "rtc.ready",
2
     RTC_READY: "rtc.ready",
3
     DATA_CHANNEL_OPEN: "rtc.data_channel_open",
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
     LASTN_CHANGED: "rtc.lastn_changed",
10
     LASTN_CHANGED: "rtc.lastn_changed",
5
     DOMINANTSPEAKER_CHANGED: "rtc.dominantspeaker_changed",
11
     DOMINANTSPEAKER_CHANGED: "rtc.dominantspeaker_changed",
6
     LASTN_ENDPOINT_CHANGED: "rtc.lastn_endpoint_changed",
12
     LASTN_ENDPOINT_CHANGED: "rtc.lastn_endpoint_changed",

Loading…
Cancel
Save