@webex/plugin-meetings 2.36.1 → 2.37.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- package/dist/common/browser-detection.js +1 -20
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +5 -20
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +0 -7
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +5 -26
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +5 -26
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +6 -27
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +5 -26
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -33
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +5 -26
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +4 -25
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js +0 -17
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +5 -26
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +5 -26
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +7 -46
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -24
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +0 -22
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +0 -23
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +0 -12
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +0 -15
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +0 -4
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -8
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +35 -61
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +4 -14
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +1 -5
- package/dist/config.js.map +1 -1
- package/dist/constants.js +46 -42
- package/dist/constants.js.map +1 -1
- package/dist/index.js +1 -17
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +10 -28
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -26
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +0 -15
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +4 -12
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +101 -193
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +0 -37
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +12 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +87 -123
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +16 -81
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +74 -137
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +64 -110
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +3 -17
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +10 -12
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.js +120 -192
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +0 -13
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +812 -1487
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +31 -78
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +157 -227
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/state.js +21 -31
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +25 -169
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +3 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +10 -33
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +179 -268
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -16
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +98 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +137 -228
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +3 -21
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +451 -570
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +7 -30
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +94 -148
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +49 -89
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js +17 -68
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +2 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +68 -184
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +21 -56
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js +9 -38
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +0 -2
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +1 -2
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +48 -136
- package/dist/metrics/index.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +28 -57
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/peer-connection-manager/index.js +60 -190
- package/dist/peer-connection-manager/index.js.map +1 -1
- package/dist/peer-connection-manager/util.js +10 -24
- package/dist/peer-connection-manager/util.js.map +1 -1
- package/dist/personal-meeting-room/index.js +10 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -33
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +0 -13
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js +100 -166
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +2 -18
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/reactions.js +0 -2
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +0 -5
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +294 -468
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/collection.js +1 -12
- package/dist/roap/collection.js.map +1 -1
- package/dist/roap/handler.js +15 -85
- package/dist/roap/handler.js.map +1 -1
- package/dist/roap/index.js +42 -94
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +81 -148
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/state.js +2 -39
- package/dist/roap/state.js.map +1 -1
- package/dist/roap/turnDiscovery.js +8 -52
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/roap/util.js +0 -26
- package/dist/roap/util.js.map +1 -1
- package/dist/statsAnalyzer/global.js +0 -2
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +68 -168
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +54 -53
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +13 -45
- package/dist/transcription/index.js.map +1 -1
- package/internal-README.md +7 -6
- package/package.json +17 -17
- package/src/common/browser-detection.ts +9 -6
- package/src/common/collection.ts +3 -1
- package/src/common/errors/captcha-error.ts +6 -6
- package/src/common/errors/intent-to-join.ts +6 -6
- package/src/common/errors/join-meeting.ts +12 -8
- package/src/common/errors/media.ts +6 -6
- package/src/common/errors/parameter.ts +9 -6
- package/src/common/errors/password-error.ts +6 -6
- package/src/common/errors/permission.ts +5 -5
- package/src/common/errors/reconnection.ts +6 -6
- package/src/common/errors/stats.ts +6 -6
- package/src/common/errors/webex-errors.ts +7 -5
- package/src/common/errors/webex-meetings-error.ts +1 -1
- package/src/common/events/events-scope.ts +5 -1
- package/src/common/events/events.ts +5 -1
- package/src/common/events/trigger-proxy.ts +8 -3
- package/src/common/events/util.ts +1 -2
- package/src/common/logs/logger-proxy.ts +21 -10
- package/src/common/logs/request.ts +11 -8
- package/src/config.ts +11 -11
- package/src/constants.ts +138 -119
- package/src/index.js +1 -1
- package/src/locus-info/controlsUtils.ts +34 -24
- package/src/locus-info/fullState.ts +15 -11
- package/src/locus-info/hostUtils.ts +4 -3
- package/src/locus-info/index.ts +25 -34
- package/src/locus-info/infoUtils.ts +12 -4
- package/src/locus-info/mediaSharesUtils.ts +4 -4
- package/src/locus-info/parser.ts +45 -68
- package/src/locus-info/selfUtils.ts +106 -57
- package/src/media/index.ts +118 -109
- package/src/media/properties.ts +26 -20
- package/src/media/util.ts +2 -2
- package/src/mediaQualityMetrics/config.ts +46 -46
- package/src/meeting/effectsState.ts +35 -35
- package/src/meeting/in-meeting-actions.ts +7 -3
- package/src/meeting/index.ts +1435 -1210
- package/src/meeting/muteState.ts +62 -31
- package/src/meeting/request.ts +160 -113
- package/src/meeting/state.ts +45 -30
- package/src/meeting/util.ts +131 -90
- package/src/meeting-info/collection.ts +2 -1
- package/src/meeting-info/index.ts +32 -30
- package/src/meeting-info/meeting-info-v2.ts +106 -108
- package/src/meeting-info/request.ts +9 -3
- package/src/meeting-info/util.ts +54 -46
- package/src/meeting-info/utilv2.ts +59 -53
- package/src/meetings/collection.ts +1 -1
- package/src/meetings/index.ts +513 -441
- package/src/meetings/request.ts +26 -24
- package/src/meetings/util.ts +26 -23
- package/src/member/index.ts +55 -49
- package/src/member/util.ts +26 -13
- package/src/members/collection.ts +0 -1
- package/src/members/index.ts +172 -121
- package/src/members/request.ts +46 -14
- package/src/members/util.ts +44 -42
- package/src/metrics/config.ts +254 -81
- package/src/metrics/constants.ts +0 -2
- package/src/metrics/index.ts +84 -71
- package/src/networkQualityMonitor/index.ts +20 -23
- package/src/peer-connection-manager/index.ts +321 -241
- package/src/peer-connection-manager/util.ts +4 -2
- package/src/personal-meeting-room/index.ts +12 -16
- package/src/personal-meeting-room/request.ts +10 -3
- package/src/personal-meeting-room/util.ts +3 -3
- package/src/reachability/index.ts +61 -59
- package/src/reachability/request.ts +36 -32
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +2 -3
- package/src/reconnection-manager/index.ts +159 -98
- package/src/roap/collection.ts +2 -4
- package/src/roap/handler.ts +63 -32
- package/src/roap/index.ts +78 -58
- package/src/roap/request.ts +69 -54
- package/src/roap/state.ts +17 -11
- package/src/roap/turnDiscovery.ts +60 -31
- package/src/roap/util.ts +39 -31
- package/src/statsAnalyzer/global.ts +30 -33
- package/src/statsAnalyzer/index.ts +397 -169
- package/src/statsAnalyzer/mqaUtil.ts +178 -72
- package/src/transcription/index.ts +34 -32
- package/test/integration/spec/journey.js +666 -462
- package/test/integration/spec/space-meeting.js +318 -203
- package/test/integration/spec/transcription.js +6 -7
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/fixture/locus.js +92 -90
- package/test/unit/spec/locus-info/controlsUtils.js +5 -5
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +1 -2
- package/test/unit/spec/locus-info/infoUtils.js +24 -31
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +72 -103
- package/test/unit/spec/locus-info/selfUtils.js +21 -12
- package/test/unit/spec/meeting/effectsState.js +33 -45
- package/test/unit/spec/meeting/in-meeting-actions.ts +2 -3
- package/test/unit/spec/meeting/index.js +1141 -649
- package/test/unit/spec/meeting/muteState.js +42 -33
- package/test/unit/spec/meeting/request.js +56 -45
- package/test/unit/spec/meeting/utils.js +66 -49
- package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +110 -74
- package/test/unit/spec/meetings/collection.js +1 -1
- package/test/unit/spec/meetings/index.js +438 -257
- package/test/unit/spec/meetings/utils.js +14 -12
- package/test/unit/spec/member/index.js +0 -1
- package/test/unit/spec/member/util.js +5 -6
- package/test/unit/spec/members/index.js +84 -35
- package/test/unit/spec/members/request.js +29 -20
- package/test/unit/spec/members/utils.js +8 -5
- package/test/unit/spec/metrics/index.js +16 -21
- package/test/unit/spec/networkQualityMonitor/index.js +21 -15
- package/test/unit/spec/peerconnection-manager/index.js +88 -58
- package/test/unit/spec/peerconnection-manager/utils.js +5 -4
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +7 -8
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +9 -11
- package/test/unit/spec/reconnection-manager/index.js +14 -17
- package/test/unit/spec/roap/index.ts +18 -8
- package/test/unit/spec/roap/turnDiscovery.ts +22 -19
- package/test/unit/spec/roap/util.js +3 -3
- package/test/unit/spec/stats-analyzer/index.js +29 -24
- package/test/utils/cmr.js +44 -42
- package/test/utils/testUtils.js +83 -74
- package/test/utils/webex-config.js +18 -18
- package/test/utils/webex-test-users.js +53 -50
|
@@ -1,7 +1,17 @@
|
|
|
1
|
+
/* eslint-disable prefer-destructuring */
|
|
2
|
+
|
|
1
3
|
import {cloneDeep} from 'lodash';
|
|
2
4
|
|
|
3
5
|
import EventsScope from '../common/events/events-scope';
|
|
4
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
DEFAULT_GET_STATS_FILTER,
|
|
8
|
+
CONNECTION_STATE,
|
|
9
|
+
STATS,
|
|
10
|
+
MQA_INTEVAL,
|
|
11
|
+
NETWORK_TYPE,
|
|
12
|
+
MEDIA_DEVICES,
|
|
13
|
+
_UNKNOWN_,
|
|
14
|
+
} from '../constants';
|
|
5
15
|
import mqaData from '../mediaQualityMetrics/config';
|
|
6
16
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
7
17
|
|
|
@@ -10,7 +20,7 @@ import {
|
|
|
10
20
|
getAudioSenderMqa,
|
|
11
21
|
getAudioReceiverMqa,
|
|
12
22
|
getVideoSenderMqa,
|
|
13
|
-
getVideoReceiverMqa
|
|
23
|
+
getVideoReceiverMqa,
|
|
14
24
|
} from './mqaUtil';
|
|
15
25
|
|
|
16
26
|
export const EVENTS = {
|
|
@@ -52,7 +62,11 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
52
62
|
* @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
|
|
53
63
|
* @param {Object} statsResults Default properties for stats
|
|
54
64
|
*/
|
|
55
|
-
constructor(
|
|
65
|
+
constructor(
|
|
66
|
+
config: any,
|
|
67
|
+
networkQualityMonitor: object = {},
|
|
68
|
+
statsResults: object = defaultStats
|
|
69
|
+
) {
|
|
56
70
|
super();
|
|
57
71
|
this.statsStarted = false;
|
|
58
72
|
this.statsResults = statsResults;
|
|
@@ -62,10 +76,14 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
62
76
|
this.correlationId = config.correlationId;
|
|
63
77
|
this.mqaSentCount = -1;
|
|
64
78
|
this.lastMqaDataSent = {
|
|
65
|
-
resolutions: {
|
|
79
|
+
resolutions: {
|
|
80
|
+
video: {send: {}, recv: {}},
|
|
81
|
+
audio: {send: {}, recv: {}},
|
|
82
|
+
share: {send: {}, recv: {}},
|
|
83
|
+
},
|
|
66
84
|
video: {send: {}, recv: {}},
|
|
67
85
|
audio: {send: {}, recv: {}},
|
|
68
|
-
share: {send: {}, recv: {}}
|
|
86
|
+
share: {send: {}, recv: {}},
|
|
69
87
|
};
|
|
70
88
|
this.localMQEStats = {
|
|
71
89
|
audio: {
|
|
@@ -73,14 +91,14 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
73
91
|
packetsLost: [],
|
|
74
92
|
jitter: [],
|
|
75
93
|
latency: [],
|
|
76
|
-
bitRate: []
|
|
94
|
+
bitRate: [],
|
|
77
95
|
},
|
|
78
96
|
TX: {
|
|
79
97
|
packetsLost: [],
|
|
80
98
|
jitter: [],
|
|
81
99
|
latency: [],
|
|
82
|
-
bitRate: []
|
|
83
|
-
}
|
|
100
|
+
bitRate: [],
|
|
101
|
+
},
|
|
84
102
|
},
|
|
85
103
|
video: {
|
|
86
104
|
RX: {
|
|
@@ -92,7 +110,7 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
92
110
|
resolutionWidth: [],
|
|
93
111
|
resolutionHeight: [],
|
|
94
112
|
requestedKeyFrame: [],
|
|
95
|
-
receivedKeyFrame: []
|
|
113
|
+
receivedKeyFrame: [],
|
|
96
114
|
},
|
|
97
115
|
TX: {
|
|
98
116
|
packetsLost: [],
|
|
@@ -103,9 +121,9 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
103
121
|
resolutionWidth: [],
|
|
104
122
|
resolutionHeight: [],
|
|
105
123
|
requestedKeyFrame: [],
|
|
106
|
-
receivedKeyFrame: []
|
|
107
|
-
}
|
|
108
|
-
}
|
|
124
|
+
receivedKeyFrame: [],
|
|
125
|
+
},
|
|
126
|
+
},
|
|
109
127
|
};
|
|
110
128
|
this.lastEmittedStartStopEvent = {
|
|
111
129
|
audio: {
|
|
@@ -129,37 +147,60 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
129
147
|
this.localMQEStats.audio.RX.packetsLost.push(lastMqa.audioReceive[0].common.mediaHopByHopLost);
|
|
130
148
|
this.localMQEStats.audio.RX.jitter.push(lastMqa.audioReceive[0].streams[0].common.rtpJitter);
|
|
131
149
|
this.localMQEStats.audio.RX.latency.push(lastMqa.audioReceive[0].common.roundTripTime);
|
|
132
|
-
this.localMQEStats.audio.RX.bitRate.push(
|
|
150
|
+
this.localMQEStats.audio.RX.bitRate.push(
|
|
151
|
+
lastMqa.audioReceive[0].streams[0].common.receivedBitrate
|
|
152
|
+
);
|
|
133
153
|
|
|
134
154
|
this.localMQEStats.audio.TX.packetsLost.push(lastMqa.audioTransmit[0].common.remoteLossRate);
|
|
135
155
|
this.localMQEStats.audio.TX.jitter.push(lastMqa.audioTransmit[0].common.remoteJitter);
|
|
136
156
|
this.localMQEStats.audio.TX.latency.push(lastMqa.audioTransmit[0].common.roundTripTime);
|
|
137
|
-
this.localMQEStats.audio.TX.bitRate.push(
|
|
157
|
+
this.localMQEStats.audio.TX.bitRate.push(
|
|
158
|
+
lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate
|
|
159
|
+
);
|
|
138
160
|
|
|
139
161
|
// Video
|
|
140
162
|
|
|
141
163
|
this.localMQEStats.video.RX.packetsLost.push(lastMqa.videoReceive[0].common.mediaHopByHopLost);
|
|
142
164
|
this.localMQEStats.video.RX.jitter.push(lastMqa.videoReceive[0].streams[0].common.rtpJitter);
|
|
143
|
-
this.localMQEStats.video.RX.latency.push(
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
this.localMQEStats.video.RX.
|
|
147
|
-
|
|
165
|
+
this.localMQEStats.video.RX.latency.push(
|
|
166
|
+
lastMqa.videoReceive[0].streams[0].common.roundTripTime
|
|
167
|
+
);
|
|
168
|
+
this.localMQEStats.video.RX.bitRate.push(
|
|
169
|
+
lastMqa.videoReceive[0].streams[0].common.receivedBitrate
|
|
170
|
+
);
|
|
171
|
+
this.localMQEStats.video.RX.frameRate.push(
|
|
172
|
+
lastMqa.videoReceive[0].streams[0].common.receivedFrameRate
|
|
173
|
+
);
|
|
174
|
+
this.localMQEStats.video.RX.resolutionWidth.push(
|
|
175
|
+
lastMqa.videoReceive[0].streams[0].receivedWidth
|
|
176
|
+
);
|
|
177
|
+
this.localMQEStats.video.RX.resolutionHeight.push(
|
|
178
|
+
lastMqa.videoReceive[0].streams[0].receivedHeight
|
|
179
|
+
);
|
|
148
180
|
this.localMQEStats.video.RX.requestedKeyFrame.push();
|
|
149
181
|
this.localMQEStats.video.RX.receivedKeyFrame.push();
|
|
150
182
|
|
|
151
183
|
this.localMQEStats.video.TX.packetsLost.push(lastMqa.videoTransmit[0].common.remoteLossRate);
|
|
152
184
|
this.localMQEStats.video.TX.jitter.push(lastMqa.videoTransmit[0].common.remoteJitter);
|
|
153
185
|
this.localMQEStats.video.TX.latency.push(lastMqa.videoTransmit[0].common.roundTripTime);
|
|
154
|
-
this.localMQEStats.video.TX.bitRate.push(
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
this.localMQEStats.video.TX.
|
|
158
|
-
|
|
186
|
+
this.localMQEStats.video.TX.bitRate.push(
|
|
187
|
+
lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate
|
|
188
|
+
);
|
|
189
|
+
this.localMQEStats.video.TX.frameRate.push(
|
|
190
|
+
lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate
|
|
191
|
+
);
|
|
192
|
+
this.localMQEStats.video.TX.resolutionWidth.push(
|
|
193
|
+
lastMqa.videoTransmit[0].streams[0].transmittedWidth
|
|
194
|
+
);
|
|
195
|
+
this.localMQEStats.video.TX.resolutionHeight.push(
|
|
196
|
+
lastMqa.videoTransmit[0].streams[0].transmittedHeight
|
|
197
|
+
);
|
|
198
|
+
this.localMQEStats.video.TX.requestedKeyFrame.push(
|
|
199
|
+
lastMqa.videoTransmit[0].streams[0].requestedKeyFrames
|
|
200
|
+
);
|
|
159
201
|
this.localMQEStats.video.TX.receivedKeyFrame.push();
|
|
160
202
|
}
|
|
161
203
|
|
|
162
|
-
|
|
163
204
|
resetStatsResults() {
|
|
164
205
|
this.statsResults.audio.send.meanRemoteJitter = [];
|
|
165
206
|
this.statsResults.video.send.meanRemoteJitter = [];
|
|
@@ -207,23 +248,23 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
207
248
|
getAudioSenderMqa({
|
|
208
249
|
audioSender,
|
|
209
250
|
statsResults: this.statsResults,
|
|
210
|
-
lastMqaDataSent: this.lastMqaDataSent
|
|
251
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
211
252
|
});
|
|
212
253
|
getAudioReceiverMqa({
|
|
213
254
|
audioReceiver,
|
|
214
255
|
statsResults: this.statsResults,
|
|
215
|
-
lastMqaDataSent: this.lastMqaDataSent
|
|
256
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
216
257
|
});
|
|
217
258
|
|
|
218
259
|
getVideoReceiverMqa({
|
|
219
260
|
videoReceiver,
|
|
220
261
|
statsResults: this.statsResults,
|
|
221
|
-
lastMqaDataSent: this.lastMqaDataSent
|
|
262
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
222
263
|
});
|
|
223
264
|
getVideoSenderMqa({
|
|
224
265
|
videoSender,
|
|
225
266
|
statsResults: this.statsResults,
|
|
226
|
-
lastMqaDataSent: this.lastMqaDataSent
|
|
267
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
227
268
|
});
|
|
228
269
|
|
|
229
270
|
// Capture mqa for share scenario
|
|
@@ -232,24 +273,32 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
232
273
|
videoSender: shareSender,
|
|
233
274
|
statsResults: this.statsResults,
|
|
234
275
|
lastMqaDataSent: this.lastMqaDataSent,
|
|
235
|
-
isShareStream: true
|
|
276
|
+
isShareStream: true,
|
|
236
277
|
});
|
|
237
278
|
|
|
238
279
|
getVideoReceiverMqa({
|
|
239
280
|
videoReceiver: shareReceiver,
|
|
240
281
|
statsResults: this.statsResults,
|
|
241
282
|
lastMqaDataSent: this.lastMqaDataSent,
|
|
242
|
-
isShareStream: true
|
|
283
|
+
isShareStream: true,
|
|
243
284
|
});
|
|
244
|
-
|
|
245
|
-
|
|
285
|
+
mqaData.intervals[0].intervalMetadata.peerReflexiveIP =
|
|
286
|
+
this.statsResults.connectionType.local.ipAddress[0];
|
|
246
287
|
|
|
247
288
|
// Adding peripheral information
|
|
248
289
|
mqaData.intervals[0].intervalMetadata.peripherals = [];
|
|
249
|
-
mqaData.intervals[0].intervalMetadata.peripherals.push({
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
290
|
+
mqaData.intervals[0].intervalMetadata.peripherals.push({
|
|
291
|
+
information: _UNKNOWN_,
|
|
292
|
+
name: MEDIA_DEVICES.SPEAKER,
|
|
293
|
+
});
|
|
294
|
+
mqaData.intervals[0].intervalMetadata.peripherals.push({
|
|
295
|
+
information: this.peerConnection?.audioTransceiver?.sender?.track?.label || _UNKNOWN_,
|
|
296
|
+
name: MEDIA_DEVICES.MICROPHONE,
|
|
297
|
+
});
|
|
298
|
+
mqaData.intervals[0].intervalMetadata.peripherals.push({
|
|
299
|
+
information: this.peerConnection?.videoTransceiver?.sender?.track?.label || _UNKNOWN_,
|
|
300
|
+
name: MEDIA_DEVICES.CAMERA,
|
|
301
|
+
});
|
|
253
302
|
|
|
254
303
|
// @ts-ignore
|
|
255
304
|
mqaData.networkType = this.statsResults.connectionType.local.networkType;
|
|
@@ -268,13 +317,13 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
268
317
|
this.emit(
|
|
269
318
|
{
|
|
270
319
|
file: 'statsAnalyzer',
|
|
271
|
-
function: 'sendMqaData'
|
|
320
|
+
function: 'sendMqaData',
|
|
272
321
|
},
|
|
273
322
|
EVENTS.MEDIA_QUALITY,
|
|
274
323
|
{
|
|
275
324
|
data: mqaData.intervals[0],
|
|
276
325
|
// @ts-ignore
|
|
277
|
-
networkType: mqaData.networkType
|
|
326
|
+
networkType: mqaData.networkType,
|
|
278
327
|
}
|
|
279
328
|
);
|
|
280
329
|
}
|
|
@@ -304,17 +353,16 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
304
353
|
this.statsStarted = true;
|
|
305
354
|
this.peerConnection = peerConnection;
|
|
306
355
|
|
|
307
|
-
return this.getStatsAndParse()
|
|
308
|
-
.
|
|
309
|
-
this.
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
356
|
+
return this.getStatsAndParse().then(() => {
|
|
357
|
+
this.statsInterval = setInterval(() => {
|
|
358
|
+
this.getStatsAndParse();
|
|
359
|
+
}, this.config.analyzerInterval);
|
|
360
|
+
// Trigger initial fetch
|
|
361
|
+
this.sendMqaData();
|
|
362
|
+
this.mqaInterval = setInterval(() => {
|
|
313
363
|
this.sendMqaData();
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
}, MQA_INTEVAL);
|
|
317
|
-
});
|
|
364
|
+
}, MQA_INTEVAL);
|
|
365
|
+
});
|
|
318
366
|
}
|
|
319
367
|
|
|
320
368
|
return Promise.resolve();
|
|
@@ -405,7 +453,11 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
405
453
|
* @param {boolean} isSender
|
|
406
454
|
* @returns {void}
|
|
407
455
|
*/
|
|
408
|
-
private filterAndParseGetStatsResults(
|
|
456
|
+
private filterAndParseGetStatsResults(
|
|
457
|
+
getStatsResults: Array<any>,
|
|
458
|
+
type: string,
|
|
459
|
+
isSender: boolean
|
|
460
|
+
) {
|
|
409
461
|
const {types} = DEFAULT_GET_STATS_FILTER;
|
|
410
462
|
|
|
411
463
|
getStatsResults.forEach((result) => {
|
|
@@ -446,7 +498,12 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
446
498
|
* @memberof StatsAnalyzer
|
|
447
499
|
* @returns {void}
|
|
448
500
|
*/
|
|
449
|
-
emitStartStopEvents = (
|
|
501
|
+
emitStartStopEvents = (
|
|
502
|
+
mediaType: string,
|
|
503
|
+
previousValue: number,
|
|
504
|
+
currentValue: number,
|
|
505
|
+
isLocal: boolean
|
|
506
|
+
) => {
|
|
450
507
|
if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {
|
|
451
508
|
throw new Error(`Unsupported mediaType: ${mediaType}`);
|
|
452
509
|
}
|
|
@@ -456,32 +513,32 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
456
513
|
// eslint-disable-next-line no-param-reassign
|
|
457
514
|
if (currentValue === undefined) currentValue = 0;
|
|
458
515
|
|
|
459
|
-
const lastEmittedEvent = isLocal
|
|
516
|
+
const lastEmittedEvent = isLocal
|
|
517
|
+
? this.lastEmittedStartStopEvent[mediaType].local
|
|
518
|
+
: this.lastEmittedStartStopEvent[mediaType].remote;
|
|
460
519
|
|
|
461
520
|
let newEvent;
|
|
462
521
|
|
|
463
|
-
if (
|
|
522
|
+
if (currentValue - previousValue > 0) {
|
|
464
523
|
newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;
|
|
465
|
-
}
|
|
466
|
-
else if ((currentValue === previousValue) && currentValue > 0) {
|
|
524
|
+
} else if (currentValue === previousValue && currentValue > 0) {
|
|
467
525
|
newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;
|
|
468
526
|
}
|
|
469
527
|
|
|
470
528
|
if (newEvent && lastEmittedEvent !== newEvent) {
|
|
471
529
|
if (isLocal) {
|
|
472
530
|
this.lastEmittedStartStopEvent[mediaType].local = newEvent;
|
|
473
|
-
}
|
|
474
|
-
else {
|
|
531
|
+
} else {
|
|
475
532
|
this.lastEmittedStartStopEvent[mediaType].remote = newEvent;
|
|
476
533
|
}
|
|
477
534
|
this.emit(
|
|
478
535
|
{
|
|
479
536
|
file: 'statsAnalyzer/index',
|
|
480
|
-
function: 'compareLastStatsResult'
|
|
537
|
+
function: 'compareLastStatsResult',
|
|
481
538
|
},
|
|
482
539
|
newEvent,
|
|
483
540
|
{
|
|
484
|
-
type: mediaType
|
|
541
|
+
type: mediaType,
|
|
485
542
|
}
|
|
486
543
|
);
|
|
487
544
|
}
|
|
@@ -505,54 +562,98 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
505
562
|
currentStats = this.statsResults[mediaType].send;
|
|
506
563
|
previousStats = this.lastStatsResults[mediaType].send;
|
|
507
564
|
|
|
508
|
-
if (
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
565
|
+
if (
|
|
566
|
+
currentStats.totalPacketsSent === previousStats.totalPacketsSent ||
|
|
567
|
+
currentStats.totalPacketsSent === 0
|
|
568
|
+
) {
|
|
569
|
+
LoggerProxy.logger.info(
|
|
570
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`
|
|
571
|
+
);
|
|
572
|
+
} else {
|
|
573
|
+
if (
|
|
574
|
+
currentStats.totalAudioEnergy === previousStats.totalAudioEnergy ||
|
|
575
|
+
currentStats.totalAudioEnergy === 0
|
|
576
|
+
) {
|
|
577
|
+
LoggerProxy.logger.info(
|
|
578
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Energy present`
|
|
579
|
+
);
|
|
514
580
|
}
|
|
515
581
|
|
|
516
582
|
if (currentStats.audioLevel === 0) {
|
|
517
|
-
LoggerProxy.logger.info(
|
|
583
|
+
LoggerProxy.logger.info(
|
|
584
|
+
`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} level is 0 for the user`
|
|
585
|
+
);
|
|
518
586
|
}
|
|
519
587
|
}
|
|
520
588
|
|
|
521
|
-
this.emitStartStopEvents(
|
|
589
|
+
this.emitStartStopEvents(
|
|
590
|
+
mediaType,
|
|
591
|
+
previousStats.totalPacketsSent,
|
|
592
|
+
currentStats.totalPacketsSent,
|
|
593
|
+
true
|
|
594
|
+
);
|
|
522
595
|
}
|
|
523
596
|
|
|
524
597
|
if (this.meetingMediaStatus.expected.receiveAudio) {
|
|
525
|
-
|
|
598
|
+
// compare audio stats received
|
|
526
599
|
currentStats = this.statsResults[mediaType].recv;
|
|
527
600
|
previousStats = this.lastStatsResults[mediaType].recv;
|
|
528
601
|
|
|
529
|
-
if (
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
602
|
+
if (
|
|
603
|
+
currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||
|
|
604
|
+
currentStats.totalPacketsReceived === 0
|
|
605
|
+
) {
|
|
606
|
+
LoggerProxy.logger.info(
|
|
607
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`
|
|
608
|
+
);
|
|
609
|
+
} else if (
|
|
610
|
+
currentStats.totalSamplesReceived === previousStats.totalSamplesReceived ||
|
|
611
|
+
currentStats.totalSamplesReceived === 0
|
|
612
|
+
) {
|
|
613
|
+
LoggerProxy.logger.info(
|
|
614
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} samples received`
|
|
615
|
+
);
|
|
535
616
|
}
|
|
536
617
|
|
|
537
|
-
this.emitStartStopEvents(
|
|
618
|
+
this.emitStartStopEvents(
|
|
619
|
+
mediaType,
|
|
620
|
+
previousStats.totalPacketsReceived,
|
|
621
|
+
currentStats.totalPacketsReceived,
|
|
622
|
+
false
|
|
623
|
+
);
|
|
538
624
|
}
|
|
539
625
|
|
|
540
626
|
mediaType = STATS.VIDEO_CORRELATE;
|
|
541
627
|
if (this.meetingMediaStatus.expected.sendVideo) {
|
|
542
|
-
|
|
628
|
+
// compare video stats sent
|
|
543
629
|
currentStats = this.statsResults[mediaType].send;
|
|
544
630
|
previousStats = this.lastStatsResults[mediaType].send;
|
|
545
631
|
|
|
546
|
-
if (
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
632
|
+
if (
|
|
633
|
+
currentStats.totalPacketsSent === previousStats.totalPacketsSent ||
|
|
634
|
+
currentStats.totalPacketsSent === 0
|
|
635
|
+
) {
|
|
636
|
+
LoggerProxy.logger.info(
|
|
637
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`
|
|
638
|
+
);
|
|
639
|
+
} else {
|
|
640
|
+
if (
|
|
641
|
+
currentStats.framesEncoded === previousStats.framesEncoded ||
|
|
642
|
+
currentStats.framesEncoded === 0
|
|
643
|
+
) {
|
|
644
|
+
LoggerProxy.logger.info(
|
|
645
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames Encoded`
|
|
646
|
+
);
|
|
552
647
|
}
|
|
553
648
|
|
|
554
|
-
if (
|
|
555
|
-
|
|
649
|
+
if (
|
|
650
|
+
this.statsResults.resolutions[mediaType].send.framesSent ===
|
|
651
|
+
this.lastStatsResults.resolutions[mediaType].send.framesSent ||
|
|
652
|
+
this.statsResults.resolutions[mediaType].send.framesSent === 0
|
|
653
|
+
) {
|
|
654
|
+
LoggerProxy.logger.info(
|
|
655
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames sent`
|
|
656
|
+
);
|
|
556
657
|
}
|
|
557
658
|
}
|
|
558
659
|
|
|
@@ -564,27 +665,48 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
564
665
|
);
|
|
565
666
|
}
|
|
566
667
|
|
|
567
|
-
|
|
568
668
|
if (this.meetingMediaStatus.expected.receiveVideo) {
|
|
569
|
-
|
|
669
|
+
// compare video stats reveived
|
|
570
670
|
|
|
571
671
|
currentStats = this.statsResults[mediaType].recv;
|
|
572
672
|
previousStats = this.lastStatsResults[mediaType].recv;
|
|
573
673
|
|
|
574
|
-
if (
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
674
|
+
if (
|
|
675
|
+
currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||
|
|
676
|
+
currentStats.totalPacketsReceived === 0
|
|
677
|
+
) {
|
|
678
|
+
LoggerProxy.logger.info(
|
|
679
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`
|
|
680
|
+
);
|
|
681
|
+
} else {
|
|
682
|
+
if (
|
|
683
|
+
this.statsResults.resolutions[mediaType].recv.framesReceived ===
|
|
684
|
+
this.lastStatsResults.resolutions[mediaType].recv.framesReceived ||
|
|
685
|
+
this.statsResults.resolutions[mediaType].recv.framesReceived === 0
|
|
686
|
+
) {
|
|
687
|
+
LoggerProxy.logger.info(
|
|
688
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`
|
|
689
|
+
);
|
|
580
690
|
}
|
|
581
691
|
|
|
582
|
-
if (
|
|
583
|
-
|
|
692
|
+
if (
|
|
693
|
+
this.statsResults[mediaType].recv.framesDecoded ===
|
|
694
|
+
this.lastStatsResults[mediaType].recv.framesDecoded ||
|
|
695
|
+
this.statsResults.resolutions[mediaType].send.framesDecoded === 0
|
|
696
|
+
) {
|
|
697
|
+
LoggerProxy.logger.info(
|
|
698
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`
|
|
699
|
+
);
|
|
584
700
|
}
|
|
585
701
|
|
|
586
|
-
if (
|
|
587
|
-
|
|
702
|
+
if (
|
|
703
|
+
this.statsResults.resolutions[mediaType].recv.framesDropped -
|
|
704
|
+
this.lastStatsResults.resolutions[mediaType].recv.framesDropped >
|
|
705
|
+
10
|
|
706
|
+
) {
|
|
707
|
+
LoggerProxy.logger.info(
|
|
708
|
+
`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`
|
|
709
|
+
);
|
|
588
710
|
}
|
|
589
711
|
}
|
|
590
712
|
|
|
@@ -598,21 +720,36 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
598
720
|
|
|
599
721
|
mediaType = STATS.SHARE_CORRELATE;
|
|
600
722
|
if (this.meetingMediaStatus.expected.sendShare) {
|
|
601
|
-
|
|
723
|
+
// compare share stats sent
|
|
602
724
|
|
|
603
725
|
currentStats = this.statsResults[mediaType].send;
|
|
604
726
|
previousStats = this.lastStatsResults[mediaType].send;
|
|
605
727
|
|
|
606
|
-
if (
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
728
|
+
if (
|
|
729
|
+
currentStats.totalPacketsSent === previousStats.totalPacketsSent ||
|
|
730
|
+
currentStats.totalPacketsSent === 0
|
|
731
|
+
) {
|
|
732
|
+
LoggerProxy.logger.info(
|
|
733
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`
|
|
734
|
+
);
|
|
735
|
+
} else {
|
|
736
|
+
if (
|
|
737
|
+
currentStats.framesEncoded === previousStats.framesEncoded ||
|
|
738
|
+
currentStats.framesEncoded === 0
|
|
739
|
+
) {
|
|
740
|
+
LoggerProxy.logger.info(
|
|
741
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames getting encoded`
|
|
742
|
+
);
|
|
612
743
|
}
|
|
613
744
|
|
|
614
|
-
if (
|
|
615
|
-
|
|
745
|
+
if (
|
|
746
|
+
this.statsResults.resolutions[mediaType].send.framesSent ===
|
|
747
|
+
this.lastStatsResults.resolutions[mediaType].send.framesSent ||
|
|
748
|
+
this.statsResults.resolutions[mediaType].send.framesSent === 0
|
|
749
|
+
) {
|
|
750
|
+
LoggerProxy.logger.info(
|
|
751
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames sent`
|
|
752
|
+
);
|
|
616
753
|
}
|
|
617
754
|
}
|
|
618
755
|
|
|
@@ -621,20 +758,42 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
621
758
|
currentStats = this.statsResults[mediaType].recv;
|
|
622
759
|
previousStats = this.lastStatsResults[mediaType].recv;
|
|
623
760
|
|
|
624
|
-
if (
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
761
|
+
if (
|
|
762
|
+
currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||
|
|
763
|
+
currentStats.totalPacketsSent === 0
|
|
764
|
+
) {
|
|
765
|
+
LoggerProxy.logger.info(
|
|
766
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`
|
|
767
|
+
);
|
|
768
|
+
} else {
|
|
769
|
+
if (
|
|
770
|
+
this.statsResults.resolutions[mediaType].recv.framesReceived ===
|
|
771
|
+
this.lastStatsResults.resolutions[mediaType].recv.framesReceived ||
|
|
772
|
+
this.statsResults.resolutions[mediaType].recv.framesReceived === 0
|
|
773
|
+
) {
|
|
774
|
+
LoggerProxy.logger.info(
|
|
775
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`
|
|
776
|
+
);
|
|
630
777
|
}
|
|
631
778
|
|
|
632
|
-
if (
|
|
633
|
-
|
|
779
|
+
if (
|
|
780
|
+
this.statsResults[mediaType].recv.framesDecoded ===
|
|
781
|
+
this.lastStatsResults[mediaType].recv.framesDecoded ||
|
|
782
|
+
this.statsResults.resolutions[mediaType].send.framesDecoded === 0
|
|
783
|
+
) {
|
|
784
|
+
LoggerProxy.logger.info(
|
|
785
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`
|
|
786
|
+
);
|
|
634
787
|
}
|
|
635
788
|
|
|
636
|
-
if (
|
|
637
|
-
|
|
789
|
+
if (
|
|
790
|
+
this.statsResults.resolutions[mediaType].recv.framesDropped -
|
|
791
|
+
this.lastStatsResults.resolutions[mediaType].recv.framesDropped >
|
|
792
|
+
10
|
|
793
|
+
) {
|
|
794
|
+
LoggerProxy.logger.info(
|
|
795
|
+
`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`
|
|
796
|
+
);
|
|
638
797
|
}
|
|
639
798
|
}
|
|
640
799
|
|
|
@@ -658,7 +817,9 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
658
817
|
}
|
|
659
818
|
|
|
660
819
|
if (this.peerConnection && this.peerConnection.connectionState === CONNECTION_STATE.FAILED) {
|
|
661
|
-
LoggerProxy.logger.trace(
|
|
820
|
+
LoggerProxy.logger.trace(
|
|
821
|
+
'StatsAnalyzer:index#getStatsAndParse --> PeerConnection is in failed state'
|
|
822
|
+
);
|
|
662
823
|
|
|
663
824
|
return Promise.resolve();
|
|
664
825
|
}
|
|
@@ -690,11 +851,13 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
690
851
|
this.peerConnection.shareTransceiver.receiver.getStats().then((res) => {
|
|
691
852
|
this.filterAndParseGetStatsResults(res, STATS.SHARE_CORRELATE, false);
|
|
692
853
|
}),
|
|
693
|
-
|
|
694
854
|
]).then(() => {
|
|
695
|
-
this.statsResults[STATS.AUDIO_CORRELATE].direction =
|
|
696
|
-
|
|
697
|
-
this.statsResults[STATS.
|
|
855
|
+
this.statsResults[STATS.AUDIO_CORRELATE].direction =
|
|
856
|
+
this.peerConnection.audioTransceiver.currentDirection;
|
|
857
|
+
this.statsResults[STATS.VIDEO_CORRELATE].direction =
|
|
858
|
+
this.peerConnection.videoTransceiver.currentDirection;
|
|
859
|
+
this.statsResults[STATS.SHARE_CORRELATE].direction =
|
|
860
|
+
this.peerConnection.shareTransceiver.currentDirection;
|
|
698
861
|
|
|
699
862
|
// Process Stats results every 5 seconds
|
|
700
863
|
this.compareLastStatsResult();
|
|
@@ -702,7 +865,9 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
702
865
|
// Save the last results to compare with the current
|
|
703
866
|
this.lastStatsResults = JSON.parse(JSON.stringify(this.statsResults));
|
|
704
867
|
|
|
705
|
-
LoggerProxy.logger.trace(
|
|
868
|
+
LoggerProxy.logger.trace(
|
|
869
|
+
'StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats'
|
|
870
|
+
);
|
|
706
871
|
});
|
|
707
872
|
}
|
|
708
873
|
|
|
@@ -727,10 +892,12 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
727
892
|
this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
|
|
728
893
|
}
|
|
729
894
|
if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {
|
|
730
|
-
this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded =
|
|
895
|
+
this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded =
|
|
896
|
+
result.keyFramesEncoded;
|
|
731
897
|
}
|
|
732
898
|
|
|
733
|
-
const bytes =
|
|
899
|
+
const bytes =
|
|
900
|
+
result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;
|
|
734
901
|
|
|
735
902
|
this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
|
|
736
903
|
|
|
@@ -739,15 +906,19 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
739
906
|
this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
|
|
740
907
|
this.statsResults[mediaType].bytesSent = kilobytes;
|
|
741
908
|
|
|
742
|
-
this.statsResults[mediaType][sendrecvType].framesEncoded =
|
|
743
|
-
|
|
909
|
+
this.statsResults[mediaType][sendrecvType].framesEncoded =
|
|
910
|
+
result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;
|
|
911
|
+
this.statsResults[mediaType][sendrecvType].keyFramesEncoded =
|
|
912
|
+
result.keyFramesEncoded -
|
|
913
|
+
this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;
|
|
744
914
|
this.statsResults.internal[mediaType].outboundRtpId = result.id;
|
|
745
915
|
|
|
746
916
|
if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {
|
|
747
917
|
this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
|
|
748
918
|
}
|
|
749
919
|
|
|
750
|
-
this.statsResults[mediaType][sendrecvType].packetsSent =
|
|
920
|
+
this.statsResults[mediaType][sendrecvType].packetsSent =
|
|
921
|
+
result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;
|
|
751
922
|
this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
|
|
752
923
|
|
|
753
924
|
// Data saved to send MQA metrics
|
|
@@ -759,17 +930,21 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
759
930
|
this.statsResults[mediaType][sendrecvType].totalFirCount = result.firCount;
|
|
760
931
|
this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;
|
|
761
932
|
this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
|
|
762
|
-
this.statsResults[mediaType][sendrecvType].encoderImplementation =
|
|
763
|
-
|
|
764
|
-
this.statsResults[mediaType][sendrecvType].
|
|
765
|
-
|
|
933
|
+
this.statsResults[mediaType][sendrecvType].encoderImplementation =
|
|
934
|
+
result.encoderImplementation;
|
|
935
|
+
this.statsResults[mediaType][sendrecvType].qualityLimitationReason =
|
|
936
|
+
result.qualityLimitationReason;
|
|
937
|
+
this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges =
|
|
938
|
+
result.qualityLimitationResolutionChanges;
|
|
939
|
+
this.statsResults[mediaType][sendrecvType].retransmittedPacketsSent =
|
|
940
|
+
result.retransmittedPacketsSent;
|
|
766
941
|
this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;
|
|
767
942
|
this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;
|
|
768
|
-
this.statsResults[mediaType][sendrecvType].retransmittedBytesSent =
|
|
943
|
+
this.statsResults[mediaType][sendrecvType].retransmittedBytesSent =
|
|
944
|
+
result.retransmittedBytesSent;
|
|
769
945
|
}
|
|
770
946
|
}
|
|
771
947
|
|
|
772
|
-
|
|
773
948
|
/**
|
|
774
949
|
* Processes InboundRTP stats result and stores
|
|
775
950
|
* @private
|
|
@@ -785,7 +960,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
785
960
|
let kilobytes = 0;
|
|
786
961
|
|
|
787
962
|
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
|
|
788
|
-
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
|
|
963
|
+
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
|
|
964
|
+
result.bytesReceived;
|
|
789
965
|
}
|
|
790
966
|
|
|
791
967
|
if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {
|
|
@@ -797,14 +973,18 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
797
973
|
}
|
|
798
974
|
|
|
799
975
|
if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {
|
|
800
|
-
this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
|
|
976
|
+
this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
|
|
977
|
+
result.packetsReceived;
|
|
801
978
|
}
|
|
802
979
|
|
|
803
980
|
if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {
|
|
804
|
-
this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp =
|
|
981
|
+
this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp =
|
|
982
|
+
result.lastPacketReceivedTimestamp;
|
|
805
983
|
}
|
|
806
984
|
|
|
807
|
-
const bytes =
|
|
985
|
+
const bytes =
|
|
986
|
+
result.bytesReceived -
|
|
987
|
+
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived;
|
|
808
988
|
|
|
809
989
|
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
|
|
810
990
|
|
|
@@ -812,35 +992,52 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
812
992
|
this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
|
|
813
993
|
this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);
|
|
814
994
|
|
|
815
|
-
this.statsResults[mediaType][sendrecvType].pliCount =
|
|
816
|
-
|
|
995
|
+
this.statsResults[mediaType][sendrecvType].pliCount =
|
|
996
|
+
result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;
|
|
997
|
+
this.statsResults[mediaType][sendrecvType].currentPacketsLost =
|
|
998
|
+
result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;
|
|
817
999
|
if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {
|
|
818
1000
|
this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;
|
|
819
1001
|
}
|
|
820
1002
|
|
|
821
|
-
this.statsResults[mediaType][sendrecvType].packetsReceived =
|
|
822
|
-
|
|
1003
|
+
this.statsResults[mediaType][sendrecvType].packetsReceived =
|
|
1004
|
+
result.packetsReceived -
|
|
1005
|
+
this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;
|
|
1006
|
+
this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
|
|
1007
|
+
result.packetsReceived;
|
|
823
1008
|
|
|
824
1009
|
if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
|
|
825
|
-
LoggerProxy.logger.info(
|
|
1010
|
+
LoggerProxy.logger.info(
|
|
1011
|
+
`StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `,
|
|
1012
|
+
this.statsResults[mediaType][sendrecvType].packetsReceived
|
|
1013
|
+
);
|
|
826
1014
|
}
|
|
827
1015
|
|
|
828
1016
|
// Check the over all packet Lost ratio
|
|
829
|
-
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =
|
|
1017
|
+
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =
|
|
1018
|
+
this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0
|
|
1019
|
+
? this.statsResults[mediaType][sendrecvType].currentPacketsLost /
|
|
1020
|
+
(this.statsResults[mediaType][sendrecvType].packetsReceived +
|
|
1021
|
+
this.statsResults[mediaType][sendrecvType].currentPacketsLost)
|
|
1022
|
+
: 0;
|
|
830
1023
|
if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
|
|
831
|
-
LoggerProxy.logger.info(
|
|
1024
|
+
LoggerProxy.logger.info(
|
|
1025
|
+
'StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ',
|
|
1026
|
+
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio
|
|
1027
|
+
);
|
|
832
1028
|
}
|
|
833
1029
|
|
|
834
1030
|
// TODO: check the packet loss value is negative values here
|
|
835
1031
|
|
|
836
1032
|
if (result.packetsLost) {
|
|
837
|
-
this.statsResults[mediaType][sendrecvType].totalPacketsLost =
|
|
838
|
-
|
|
839
|
-
else {
|
|
1033
|
+
this.statsResults[mediaType][sendrecvType].totalPacketsLost =
|
|
1034
|
+
result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;
|
|
1035
|
+
} else {
|
|
840
1036
|
this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;
|
|
841
1037
|
}
|
|
842
1038
|
|
|
843
|
-
this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp =
|
|
1039
|
+
this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp =
|
|
1040
|
+
result.lastPacketReceivedTimestamp;
|
|
844
1041
|
|
|
845
1042
|
// From Thin
|
|
846
1043
|
this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;
|
|
@@ -848,10 +1045,10 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
848
1045
|
this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
|
|
849
1046
|
this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;
|
|
850
1047
|
|
|
851
|
-
this.statsResults[mediaType][sendrecvType].decoderImplementation =
|
|
1048
|
+
this.statsResults[mediaType][sendrecvType].decoderImplementation =
|
|
1049
|
+
result.decoderImplementation;
|
|
852
1050
|
this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
|
|
853
1051
|
|
|
854
|
-
|
|
855
1052
|
this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;
|
|
856
1053
|
this.statsResults[mediaType][sendrecvType].fecPacketsReceived = result.fecPacketsReceived;
|
|
857
1054
|
this.statsResults[mediaType][sendrecvType].totalBytesReceived = result.bytesReceived;
|
|
@@ -863,8 +1060,10 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
863
1060
|
|
|
864
1061
|
this.statsResults[mediaType][sendrecvType].audioLevel = result.audioLevel;
|
|
865
1062
|
this.statsResults[mediaType][sendrecvType].totalAudioEnergy = result.totalAudioEnergy;
|
|
866
|
-
this.statsResults[mediaType][sendrecvType].totalSamplesReceived =
|
|
867
|
-
|
|
1063
|
+
this.statsResults[mediaType][sendrecvType].totalSamplesReceived =
|
|
1064
|
+
result.totalSamplesReceived || 0;
|
|
1065
|
+
this.statsResults[mediaType][sendrecvType].totalSamplesDecoded =
|
|
1066
|
+
result.totalSamplesDecoded || 0;
|
|
868
1067
|
this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;
|
|
869
1068
|
}
|
|
870
1069
|
}
|
|
@@ -908,7 +1107,10 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
908
1107
|
RemoteNetworkType[result.id] = [];
|
|
909
1108
|
}
|
|
910
1109
|
|
|
911
|
-
if (
|
|
1110
|
+
if (
|
|
1111
|
+
result.candidateType &&
|
|
1112
|
+
RemoteCandidateType[result.id].indexOf(result.candidateType) === -1
|
|
1113
|
+
) {
|
|
912
1114
|
RemoteCandidateType[result.id].push(result.candidateType);
|
|
913
1115
|
}
|
|
914
1116
|
|
|
@@ -916,7 +1118,10 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
916
1118
|
RemoteTransport[result.id].push(result.protocol.toUpperCase());
|
|
917
1119
|
}
|
|
918
1120
|
|
|
919
|
-
if (
|
|
1121
|
+
if (
|
|
1122
|
+
result.ip &&
|
|
1123
|
+
RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1
|
|
1124
|
+
) {
|
|
920
1125
|
RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports
|
|
921
1126
|
}
|
|
922
1127
|
|
|
@@ -933,13 +1138,16 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
933
1138
|
transport: RemoteTransport[result.id],
|
|
934
1139
|
timestamp: result.time,
|
|
935
1140
|
id: result.id,
|
|
936
|
-
type: result.type
|
|
1141
|
+
type: result.type,
|
|
937
1142
|
};
|
|
938
1143
|
|
|
939
1144
|
this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];
|
|
940
1145
|
this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];
|
|
941
1146
|
|
|
942
|
-
this.statsResults.connectionType[ipType].networkType =
|
|
1147
|
+
this.statsResults.connectionType[ipType].networkType =
|
|
1148
|
+
RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN
|
|
1149
|
+
? NETWORK_TYPE.UNKNOWN
|
|
1150
|
+
: RemoteNetworkType[result.id][0];
|
|
943
1151
|
this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
|
|
944
1152
|
|
|
945
1153
|
this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
|
|
@@ -960,7 +1168,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
960
1168
|
}
|
|
961
1169
|
if (result.type !== 'track') return;
|
|
962
1170
|
|
|
963
|
-
const sendrecvType =
|
|
1171
|
+
const sendrecvType =
|
|
1172
|
+
result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
|
|
964
1173
|
|
|
965
1174
|
if (result.frameWidth && result.frameHeight) {
|
|
966
1175
|
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
@@ -975,18 +1184,21 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
975
1184
|
this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
|
|
976
1185
|
}
|
|
977
1186
|
|
|
978
|
-
|
|
979
1187
|
if (result.trackIdentifier && mediaType !== STATS.AUDIO_CORRELATE) {
|
|
980
|
-
this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier =
|
|
1188
|
+
this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier =
|
|
1189
|
+
result.trackIdentifier;
|
|
981
1190
|
|
|
982
1191
|
const jitterBufferDelay = result && result.jitterBufferDelay;
|
|
983
1192
|
const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;
|
|
984
1193
|
|
|
985
|
-
this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay =
|
|
1194
|
+
this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay =
|
|
1195
|
+
jitterBufferEmittedCount && +jitterBufferDelay / +jitterBufferEmittedCount;
|
|
986
1196
|
|
|
987
1197
|
// Used to calculate the jitter
|
|
988
|
-
this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay =
|
|
989
|
-
|
|
1198
|
+
this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay =
|
|
1199
|
+
result.jitterBufferDelay;
|
|
1200
|
+
this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount =
|
|
1201
|
+
result.jitterBufferEmittedCount;
|
|
990
1202
|
}
|
|
991
1203
|
}
|
|
992
1204
|
|
|
@@ -1005,9 +1217,12 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1005
1217
|
|
|
1006
1218
|
const mediaType = type;
|
|
1007
1219
|
|
|
1008
|
-
if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {
|
|
1220
|
+
if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {
|
|
1221
|
+
this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
|
|
1222
|
+
}
|
|
1009
1223
|
|
|
1010
|
-
const currentPacketLoss =
|
|
1224
|
+
const currentPacketLoss =
|
|
1225
|
+
result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;
|
|
1011
1226
|
|
|
1012
1227
|
this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
|
|
1013
1228
|
this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;
|
|
@@ -1021,18 +1236,31 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1021
1236
|
this.statsResults[mediaType].send.reportsReceived = result.reportsReceived;
|
|
1022
1237
|
|
|
1023
1238
|
// Total packloss ratio on this video section of the call
|
|
1024
|
-
this.statsResults[mediaType].send.overAllPacketLossRatio =
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1239
|
+
this.statsResults[mediaType].send.overAllPacketLossRatio =
|
|
1240
|
+
this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0
|
|
1241
|
+
? this.statsResults[mediaType].send.totalPacketsLostOnReceiver /
|
|
1242
|
+
this.statsResults[mediaType].send.totalPacketsSent
|
|
1243
|
+
: 0;
|
|
1244
|
+
this.statsResults[mediaType].send.currentPacketLossRatio =
|
|
1245
|
+
this.statsResults[mediaType].send.packetsLostOnReceiver > 0
|
|
1246
|
+
? (this.statsResults[mediaType].send.packetsLostOnReceiver * 100) /
|
|
1247
|
+
(this.statsResults[mediaType].send.packetsSent +
|
|
1248
|
+
this.statsResults[mediaType].send.packetsLostOnReceiver)
|
|
1249
|
+
: 0;
|
|
1250
|
+
|
|
1251
|
+
if (
|
|
1252
|
+
this.statsResults[mediaType].send.maxPacketLossRatio <
|
|
1253
|
+
this.statsResults[mediaType].send.currentPacketLossRatio
|
|
1254
|
+
) {
|
|
1255
|
+
this.statsResults[mediaType].send.maxPacketLossRatio =
|
|
1256
|
+
this.statsResults[mediaType].send.currentPacketLossRatio;
|
|
1029
1257
|
}
|
|
1030
1258
|
|
|
1031
1259
|
if (result.type === 'remote-inbound-rtp') {
|
|
1032
1260
|
this.networkQualityMonitor.determineUplinkNetworkQuality({
|
|
1033
1261
|
mediaType,
|
|
1034
1262
|
remoteRtpResults: result,
|
|
1035
|
-
statsAnalyzerCurrentStats: this.statsResults
|
|
1263
|
+
statsAnalyzerCurrentStats: this.statsResults,
|
|
1036
1264
|
});
|
|
1037
1265
|
}
|
|
1038
1266
|
}
|