|
@@ -6,6 +6,7 @@ import * as MediaType from '../../service/RTC/MediaType';
|
6
|
6
|
import browser from '../browser';
|
7
|
7
|
import RTCEvents from '../../service/RTC/RTCEvents';
|
8
|
8
|
import Statistics from '../statistics/statistics';
|
|
9
|
+import { createParticipantConnectionStatusEvent } from '../../service/statistics/AnalyticsEvents';
|
9
|
10
|
|
10
|
11
|
const logger = getLogger(__filename);
|
11
|
12
|
|
|
@@ -264,6 +265,14 @@ export default class ParticipantConnectionStatusHandler {
|
264
|
265
|
* @type {Map<string, number>}
|
265
|
266
|
*/
|
266
|
267
|
this.restoringTimers = new Map();
|
|
268
|
+
|
|
269
|
+ /**
|
|
270
|
+ * A map that holds the current connection status (along with all the internal events that happen
|
|
271
|
+ * while in that state).
|
|
272
|
+ *
|
|
273
|
+ * The goal is to send this information to the analytics backend for post-mortem analysis.
|
|
274
|
+ */
|
|
275
|
+ this.peerConnStatusMap = new Map();
|
267
|
276
|
}
|
268
|
277
|
|
269
|
278
|
/**
|
|
@@ -429,6 +438,7 @@ export default class ParticipantConnectionStatusHandler {
|
429
|
438
|
status: newStatus
|
430
|
439
|
}));
|
431
|
440
|
|
|
441
|
+
|
432
|
442
|
this.conference.eventEmitter.emit(
|
433
|
443
|
JitsiConferenceEvents.PARTICIPANT_CONN_STATUS_CHANGED,
|
434
|
444
|
endpointId, newStatus);
|
|
@@ -614,6 +624,37 @@ export default class ParticipantConnectionStatusHandler {
|
614
|
624
|
isInLastN} currentStatus => newStatus: ${
|
615
|
625
|
participant.getConnectionStatus()} => ${newState}`);
|
616
|
626
|
|
|
627
|
+ const nowMs = new Date().getTime();
|
|
628
|
+ const internalState = {
|
|
629
|
+ 'instantMs': nowMs,
|
|
630
|
+ 'isVideoMuted': isVideoMuted,
|
|
631
|
+ 'isConnActiveByJvb': isConnActiveByJvb,
|
|
632
|
+ 'isVideoTrackFrozen': isVideoTrackFrozen,
|
|
633
|
+ 'inP2PMode': inP2PMode,
|
|
634
|
+ 'inInLastN': isInLastN
|
|
635
|
+ };
|
|
636
|
+
|
|
637
|
+ if (!this.peerConnStatusMap[id] || this.peerConnStatusMap[id].state !== newState) {
|
|
638
|
+ // The peer connection status has changed. Compute the duration of the current
|
|
639
|
+ // connection status and send it as an analytics event.
|
|
640
|
+ if (this.peerConnStatusMap[id]) {
|
|
641
|
+ this.peerConnStatusMap[id].value = nowMs - this.peerConnStatusMap[id].startedMs;
|
|
642
|
+ Statistics.sendAnalytics(
|
|
643
|
+ createParticipantConnectionStatusEvent(this.peerConnStatusMap[id]));
|
|
644
|
+ }
|
|
645
|
+
|
|
646
|
+ // And start a new status for the participant.
|
|
647
|
+ this.peerConnStatusMap[id] = {
|
|
648
|
+ 'internalStates': [ internalState ],
|
|
649
|
+ 'state': newState,
|
|
650
|
+ 'startedMs': nowMs
|
|
651
|
+ };
|
|
652
|
+ } else {
|
|
653
|
+ // The connection status hasn't changed, but there was an internal state change.
|
|
654
|
+ // Register the internal state.
|
|
655
|
+ this.peerConnStatusMap[id].internalStates.push(internalState);
|
|
656
|
+ }
|
|
657
|
+
|
617
|
658
|
this._changeConnectionStatus(participant, newState);
|
618
|
659
|
}
|
619
|
660
|
|