@webex/plugin-meetings 3.3.1 → 3.4.0
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/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +7 -2
- package/dist/breakouts/index.js.map +1 -1
- package/dist/constants.js +11 -4
- package/dist/constants.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/selfUtils.js +0 -5
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/MediaConnectionAwaiter.js +70 -15
- package/dist/media/MediaConnectionAwaiter.js.map +1 -1
- package/dist/media/index.js +12 -0
- package/dist/media/index.js.map +1 -1
- package/dist/meeting/connectionStateHandler.js +67 -0
- package/dist/meeting/connectionStateHandler.js.map +1 -0
- package/dist/meeting/index.js +552 -357
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +7 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/muteState.js +6 -1
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/util.js +1 -0
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +4 -4
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +2 -2
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +17 -17
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +16 -16
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +1 -1
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +37 -33
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +8 -0
- package/dist/meetings/meetings.types.js.map +1 -1
- package/dist/meetings/util.js +3 -2
- package/dist/meetings/util.js.map +1 -1
- package/dist/metrics/constants.js +2 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +57 -0
- package/dist/metrics/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +1 -1
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/reachability/clusterReachability.js +108 -53
- package/dist/reachability/clusterReachability.js.map +1 -1
- package/dist/reachability/index.js +415 -56
- package/dist/reachability/index.js.map +1 -1
- package/dist/types/constants.d.ts +11 -3
- package/dist/types/media/MediaConnectionAwaiter.d.ts +24 -4
- package/dist/types/meeting/connectionStateHandler.d.ts +30 -0
- package/dist/types/meeting/index.d.ts +27 -7
- package/dist/types/meeting/locusMediaRequest.d.ts +2 -0
- package/dist/types/meeting-info/index.d.ts +3 -2
- package/dist/types/meeting-info/meeting-info-v2.d.ts +3 -2
- package/dist/types/meeting-info/util.d.ts +5 -4
- package/dist/types/meeting-info/utilv2.d.ts +3 -2
- package/dist/types/meetings/collection.d.ts +3 -2
- package/dist/types/meetings/index.d.ts +4 -3
- package/dist/types/meetings/meetings.types.d.ts +9 -0
- package/dist/types/metrics/constants.d.ts +1 -0
- package/dist/types/metrics/index.d.ts +15 -0
- package/dist/types/reachability/clusterReachability.d.ts +31 -3
- package/dist/types/reachability/index.d.ts +93 -2
- package/dist/webinar/index.js +1 -1
- package/package.json +23 -23
- package/src/breakouts/index.ts +7 -1
- package/src/constants.ts +13 -17
- package/src/locus-info/selfUtils.ts +0 -5
- package/src/media/MediaConnectionAwaiter.ts +89 -14
- package/src/media/index.ts +13 -0
- package/src/meeting/connectionStateHandler.ts +65 -0
- package/src/meeting/index.ts +526 -292
- package/src/meeting/locusMediaRequest.ts +5 -0
- package/src/meeting/muteState.ts +6 -1
- package/src/meeting/util.ts +1 -0
- package/src/meeting-info/index.ts +9 -6
- package/src/meeting-info/meeting-info-v2.ts +4 -4
- package/src/meeting-info/util.ts +23 -28
- package/src/meeting-info/utilv2.ts +18 -24
- package/src/meetings/collection.ts +3 -3
- package/src/meetings/index.ts +39 -40
- package/src/meetings/meetings.types.ts +11 -0
- package/src/meetings/util.ts +5 -4
- package/src/metrics/constants.ts +1 -0
- package/src/metrics/index.ts +44 -0
- package/src/personal-meeting-room/index.ts +2 -2
- package/src/reachability/clusterReachability.ts +86 -25
- package/src/reachability/index.ts +316 -27
- package/test/unit/spec/breakouts/index.ts +51 -32
- package/test/unit/spec/locus-info/selfUtils.js +25 -23
- package/test/unit/spec/media/MediaConnectionAwaiter.ts +131 -32
- package/test/unit/spec/media/index.ts +42 -27
- package/test/unit/spec/meeting/connectionStateHandler.ts +102 -0
- package/test/unit/spec/meeting/index.js +758 -179
- package/test/unit/spec/meeting/locusMediaRequest.ts +7 -0
- package/test/unit/spec/meeting/muteState.js +24 -0
- package/test/unit/spec/meeting-info/index.js +4 -4
- package/test/unit/spec/meeting-info/meetinginfov2.js +24 -28
- package/test/unit/spec/meeting-info/request.js +2 -2
- package/test/unit/spec/meeting-info/utilv2.js +41 -49
- package/test/unit/spec/meetings/index.js +14 -0
- package/test/unit/spec/metrics/index.js +126 -0
- package/test/unit/spec/multistream/mediaRequestManager.ts +2 -2
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -2
- package/test/unit/spec/reachability/clusterReachability.ts +116 -22
- package/test/unit/spec/reachability/index.ts +1153 -84
- package/test/unit/spec/rtcMetrics/index.ts +1 -0
- package/dist/mediaQualityMetrics/config.js +0 -321
- package/dist/mediaQualityMetrics/config.js.map +0 -1
- package/dist/statsAnalyzer/global.js +0 -44
- package/dist/statsAnalyzer/global.js.map +0 -1
- package/dist/statsAnalyzer/index.js +0 -1072
- package/dist/statsAnalyzer/index.js.map +0 -1
- package/dist/statsAnalyzer/mqaUtil.js +0 -368
- package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
- package/dist/types/mediaQualityMetrics/config.d.ts +0 -247
- package/dist/types/statsAnalyzer/global.d.ts +0 -36
- package/dist/types/statsAnalyzer/index.d.ts +0 -217
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
- package/src/mediaQualityMetrics/config.ts +0 -255
- package/src/statsAnalyzer/global.ts +0 -37
- package/src/statsAnalyzer/index.ts +0 -1318
- package/src/statsAnalyzer/mqaUtil.ts +0 -463
- package/test/unit/spec/stats-analyzer/index.js +0 -1819
|
@@ -1,463 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-param-reassign, prefer-destructuring */
|
|
2
|
-
|
|
3
|
-
import {mean, max} from 'lodash';
|
|
4
|
-
|
|
5
|
-
import {STATS} from '../constants';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Get the totals of a certain value from a certain media type.
|
|
9
|
-
*
|
|
10
|
-
* @param {object} stats - The large stats object.
|
|
11
|
-
* @param {string} sendrecvType - "send" or "recv".
|
|
12
|
-
* @param {string} baseMediaType - audio or video _and_ share or non-share.
|
|
13
|
-
* @param {string} value - The value we want to get the totals of.
|
|
14
|
-
* @returns {number}
|
|
15
|
-
*/
|
|
16
|
-
const getTotalValueFromBaseType = (
|
|
17
|
-
stats: object,
|
|
18
|
-
sendrecvType: string,
|
|
19
|
-
baseMediaType: string,
|
|
20
|
-
value: string
|
|
21
|
-
): number =>
|
|
22
|
-
Object.keys(stats)
|
|
23
|
-
.filter((mt) => mt.includes(baseMediaType))
|
|
24
|
-
.reduce((acc, mt) => acc + (stats[mt]?.[sendrecvType]?.[value] || 0), 0);
|
|
25
|
-
|
|
26
|
-
export const getAudioReceiverMqa = ({
|
|
27
|
-
audioReceiver,
|
|
28
|
-
statsResults,
|
|
29
|
-
lastMqaDataSent,
|
|
30
|
-
baseMediaType,
|
|
31
|
-
}) => {
|
|
32
|
-
const sendrecvType = STATS.RECEIVE_DIRECTION;
|
|
33
|
-
|
|
34
|
-
const getLastTotalValue = (value: string) =>
|
|
35
|
-
getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, value);
|
|
36
|
-
const getTotalValue = (value: string) =>
|
|
37
|
-
getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, value);
|
|
38
|
-
|
|
39
|
-
const lastPacketsReceived = getLastTotalValue('totalPacketsReceived');
|
|
40
|
-
const lastPacketsLost = getLastTotalValue('totalPacketsLost');
|
|
41
|
-
const lastBytesReceived = getLastTotalValue('totalBytesReceived');
|
|
42
|
-
const lastFecPacketsReceived = getLastTotalValue('fecPacketsReceived');
|
|
43
|
-
const lastFecPacketsDiscarded = getLastTotalValue('fecPacketsDiscarded');
|
|
44
|
-
|
|
45
|
-
const totalPacketsReceived = getTotalValue('totalPacketsReceived');
|
|
46
|
-
const packetsLost = getTotalValue('totalPacketsLost');
|
|
47
|
-
const totalBytesReceived = getTotalValue('totalBytesReceived');
|
|
48
|
-
const totalFecPacketsReceived = getTotalValue('fecPacketsReceived');
|
|
49
|
-
const totalFecPacketsDiscarded = getTotalValue('fecPacketsDiscarded');
|
|
50
|
-
|
|
51
|
-
audioReceiver.common.common.direction =
|
|
52
|
-
statsResults[Object.keys(statsResults).find((mediaType) => mediaType.includes(baseMediaType))]
|
|
53
|
-
?.direction || 'inactive';
|
|
54
|
-
audioReceiver.common.common.isMain = !baseMediaType.includes('-share');
|
|
55
|
-
audioReceiver.common.transportType = statsResults.connectionType.local.transport;
|
|
56
|
-
|
|
57
|
-
// add rtpPacket info inside common as also for call analyzer
|
|
58
|
-
audioReceiver.common.rtpPackets = totalPacketsReceived - lastPacketsReceived;
|
|
59
|
-
|
|
60
|
-
// Hop by hop are numbers and not percentage so we compare on what we sent the last min
|
|
61
|
-
// collect the packets received for the last min
|
|
62
|
-
const totalPacketsLost = packetsLost - lastPacketsLost;
|
|
63
|
-
audioReceiver.common.mediaHopByHopLost = totalPacketsLost;
|
|
64
|
-
audioReceiver.common.rtpHopByHopLost = totalPacketsLost;
|
|
65
|
-
|
|
66
|
-
const fecRecovered =
|
|
67
|
-
totalFecPacketsReceived -
|
|
68
|
-
lastFecPacketsReceived -
|
|
69
|
-
(totalFecPacketsDiscarded - lastFecPacketsDiscarded);
|
|
70
|
-
audioReceiver.common.fecPackets = fecRecovered;
|
|
71
|
-
|
|
72
|
-
audioReceiver.common.rtpBitrate = ((totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
export const getAudioReceiverStreamMqa = ({
|
|
76
|
-
audioReceiverStream,
|
|
77
|
-
statsResults,
|
|
78
|
-
lastMqaDataSent,
|
|
79
|
-
mediaType,
|
|
80
|
-
}) => {
|
|
81
|
-
const sendrecvType = STATS.RECEIVE_DIRECTION;
|
|
82
|
-
|
|
83
|
-
const lastPacketsDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesDecoded || 0;
|
|
84
|
-
const lastSamplesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesReceived || 0;
|
|
85
|
-
const lastConcealedSamples = lastMqaDataSent[mediaType]?.[sendrecvType].concealedSamples || 0;
|
|
86
|
-
const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;
|
|
87
|
-
const lastFecPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsReceived || 0;
|
|
88
|
-
const lastFecPacketsDiscarded =
|
|
89
|
-
lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsDiscarded || 0;
|
|
90
|
-
const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;
|
|
91
|
-
const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;
|
|
92
|
-
|
|
93
|
-
const {csi} = statsResults[mediaType];
|
|
94
|
-
if (csi && !audioReceiverStream.common.csi.includes(csi)) {
|
|
95
|
-
audioReceiverStream.common.csi.push(csi);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
audioReceiverStream.common.rtpPackets =
|
|
99
|
-
statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
|
|
100
|
-
|
|
101
|
-
audioReceiverStream.common.maxRtpJitter =
|
|
102
|
-
// @ts-ignore
|
|
103
|
-
max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
|
|
104
|
-
audioReceiverStream.common.meanRtpJitter =
|
|
105
|
-
mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
|
|
106
|
-
audioReceiverStream.common.rtpJitter = audioReceiverStream.common.maxRtpJitter;
|
|
107
|
-
|
|
108
|
-
// Fec packets do come in as part of the FEC only for audio
|
|
109
|
-
const fecRecovered =
|
|
110
|
-
statsResults[mediaType][sendrecvType].fecPacketsReceived -
|
|
111
|
-
lastFecPacketsReceived -
|
|
112
|
-
(statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastFecPacketsDiscarded);
|
|
113
|
-
|
|
114
|
-
audioReceiverStream.common.rtpEndToEndLost =
|
|
115
|
-
statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost - fecRecovered || 0;
|
|
116
|
-
|
|
117
|
-
audioReceiverStream.common.framesDropped =
|
|
118
|
-
statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastPacketsDecoded || 0;
|
|
119
|
-
audioReceiverStream.common.renderedFrameRate =
|
|
120
|
-
(audioReceiverStream.common.framesDropped * 100) / 60 || 0;
|
|
121
|
-
|
|
122
|
-
audioReceiverStream.common.framesReceived =
|
|
123
|
-
statsResults[mediaType][sendrecvType].totalSamplesReceived - lastSamplesReceived || 0;
|
|
124
|
-
audioReceiverStream.common.concealedFrames =
|
|
125
|
-
statsResults[mediaType][sendrecvType].concealedSamples - lastConcealedSamples || 0;
|
|
126
|
-
audioReceiverStream.common.receivedBitrate =
|
|
127
|
-
((statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, baseMediaType}) => {
|
|
131
|
-
const sendrecvType = STATS.SEND_DIRECTION;
|
|
132
|
-
|
|
133
|
-
const getLastTotalValue = (value: string) =>
|
|
134
|
-
getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, value);
|
|
135
|
-
const getTotalValue = (value: string) =>
|
|
136
|
-
getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, value);
|
|
137
|
-
|
|
138
|
-
const lastPacketsSent = getLastTotalValue('totalPacketsSent');
|
|
139
|
-
const lastPacketsLostTotal = getLastTotalValue('totalPacketsLostOnReceiver');
|
|
140
|
-
|
|
141
|
-
const totalPacketsLostOnReceiver = getTotalValue('totalPacketsLostOnReceiver');
|
|
142
|
-
const totalPacketsSent = getTotalValue('totalPacketsSent');
|
|
143
|
-
|
|
144
|
-
const meanRemoteJitter = Object.keys(statsResults)
|
|
145
|
-
.filter((mt) => mt.includes(baseMediaType))
|
|
146
|
-
.reduce((acc, mt) => acc.concat(statsResults[mt][sendrecvType].meanRemoteJitter), []);
|
|
147
|
-
const meanRoundTripTime = Object.keys(statsResults)
|
|
148
|
-
.filter((mt) => mt.includes(baseMediaType))
|
|
149
|
-
.reduce((acc, mt) => acc.concat(statsResults[mt][sendrecvType].meanRoundTripTime), []);
|
|
150
|
-
|
|
151
|
-
audioSender.common.common.direction =
|
|
152
|
-
statsResults[Object.keys(statsResults).find((mediaType) => mediaType.includes(baseMediaType))]
|
|
153
|
-
?.direction || 'inactive';
|
|
154
|
-
audioSender.common.common.isMain = !baseMediaType.includes('-share');
|
|
155
|
-
audioSender.common.transportType = statsResults.connectionType.local.transport;
|
|
156
|
-
|
|
157
|
-
audioSender.common.maxRemoteJitter = max(meanRemoteJitter) * 1000 || 0;
|
|
158
|
-
audioSender.common.meanRemoteJitter = mean(meanRemoteJitter) * 1000 || 0;
|
|
159
|
-
|
|
160
|
-
audioSender.common.rtpPackets = totalPacketsSent - lastPacketsSent || 0;
|
|
161
|
-
// audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;
|
|
162
|
-
// From candidate-pair
|
|
163
|
-
audioSender.common.availableBitrate = getTotalValueFromBaseType(
|
|
164
|
-
statsResults,
|
|
165
|
-
sendrecvType,
|
|
166
|
-
baseMediaType,
|
|
167
|
-
'availableOutgoingBitrate'
|
|
168
|
-
);
|
|
169
|
-
// Calculate based on how much packets lost of received compated to how to the client sent
|
|
170
|
-
|
|
171
|
-
const totalPacketsLostForaMin = totalPacketsLostOnReceiver - lastPacketsLostTotal;
|
|
172
|
-
audioSender.common.remoteLossRate =
|
|
173
|
-
totalPacketsSent - lastPacketsSent > 0
|
|
174
|
-
? (totalPacketsLostForaMin * 100) / (totalPacketsSent - lastPacketsSent)
|
|
175
|
-
: 0; // This is the packets sent with in last min
|
|
176
|
-
|
|
177
|
-
audioSender.common.maxRoundTripTime = max(meanRoundTripTime) * 1000 || 0;
|
|
178
|
-
audioSender.common.meanRoundTripTime = mean(meanRoundTripTime) * 1000 || 0;
|
|
179
|
-
audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;
|
|
180
|
-
|
|
181
|
-
// Calculate the outgoing bitrate
|
|
182
|
-
const totalBytesSentInaMin =
|
|
183
|
-
getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, 'totalBytesSent') -
|
|
184
|
-
getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, 'totalBytesSent');
|
|
185
|
-
|
|
186
|
-
audioSender.common.rtpBitrate = totalBytesSentInaMin ? (totalBytesSentInaMin * 8) / 60 : 0;
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
export const getAudioSenderStreamMqa = ({
|
|
190
|
-
audioSenderStream,
|
|
191
|
-
statsResults,
|
|
192
|
-
lastMqaDataSent,
|
|
193
|
-
mediaType,
|
|
194
|
-
}) => {
|
|
195
|
-
const sendrecvType = STATS.SEND_DIRECTION;
|
|
196
|
-
|
|
197
|
-
const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;
|
|
198
|
-
const lastFramesEncoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
|
|
199
|
-
const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
|
|
200
|
-
const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;
|
|
201
|
-
|
|
202
|
-
const {csi} = statsResults[mediaType];
|
|
203
|
-
if (csi && !audioSenderStream.common.csi.includes(csi)) {
|
|
204
|
-
audioSenderStream.common.csi.push(csi);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
audioSenderStream.common.rtpPackets =
|
|
208
|
-
statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
|
|
209
|
-
|
|
210
|
-
const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
|
|
211
|
-
audioSenderStream.common.transmittedBitrate = totalBytesSentInaMin
|
|
212
|
-
? (totalBytesSentInaMin * 8) / 60
|
|
213
|
-
: 0;
|
|
214
|
-
|
|
215
|
-
audioSenderStream.transmittedKeyFrames =
|
|
216
|
-
statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastFramesEncoded || 0;
|
|
217
|
-
audioSenderStream.requestedKeyFrames =
|
|
218
|
-
statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
|
|
219
|
-
|
|
220
|
-
audioSenderStream.requestedBitrate = statsResults[mediaType][sendrecvType].requestedBitrate || 0;
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
export const getVideoReceiverMqa = ({
|
|
224
|
-
videoReceiver,
|
|
225
|
-
statsResults,
|
|
226
|
-
lastMqaDataSent,
|
|
227
|
-
baseMediaType,
|
|
228
|
-
}) => {
|
|
229
|
-
const sendrecvType = STATS.RECEIVE_DIRECTION;
|
|
230
|
-
|
|
231
|
-
const getLastTotalValue = (value: string) =>
|
|
232
|
-
getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, value);
|
|
233
|
-
const getTotalValue = (value: string) =>
|
|
234
|
-
getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, value);
|
|
235
|
-
|
|
236
|
-
const lastPacketsReceived = getLastTotalValue('totalPacketsReceived');
|
|
237
|
-
const lastPacketsLost = getLastTotalValue('totalPacketsLost');
|
|
238
|
-
const lastBytesReceived = getLastTotalValue('totalBytesReceived');
|
|
239
|
-
|
|
240
|
-
const lastRtxPacketsReceived = getLastTotalValue('totalRtxPacketsReceived');
|
|
241
|
-
const lastRtxBytesReceived = getLastTotalValue('totalRtxBytesReceived');
|
|
242
|
-
|
|
243
|
-
const packetsLost = getTotalValue('totalPacketsLost');
|
|
244
|
-
const totalPacketsReceived = getTotalValue('totalPacketsReceived');
|
|
245
|
-
const totalBytesReceived = getTotalValue('totalBytesReceived');
|
|
246
|
-
|
|
247
|
-
const totalRtxPacketsReceived = getTotalValue('totalRtxPacketsReceived');
|
|
248
|
-
const totalRtxBytesReceived = getTotalValue('totalRtxBytesReceived');
|
|
249
|
-
|
|
250
|
-
const meanRemoteJitter = Object.keys(statsResults)
|
|
251
|
-
.filter((mt) => mt.includes(baseMediaType))
|
|
252
|
-
.reduce((acc, mt) => acc.concat(statsResults[mt][sendrecvType].meanRemoteJitter), []);
|
|
253
|
-
|
|
254
|
-
videoReceiver.common.common.direction =
|
|
255
|
-
statsResults[Object.keys(statsResults).find((mediaType) => mediaType.includes(baseMediaType))]
|
|
256
|
-
?.direction || 'inactive';
|
|
257
|
-
videoReceiver.common.common.isMain = !baseMediaType.includes('-share');
|
|
258
|
-
videoReceiver.common.transportType = statsResults.connectionType.local.transport;
|
|
259
|
-
|
|
260
|
-
// collect the packets received for the last min
|
|
261
|
-
videoReceiver.common.rtpPackets = totalPacketsReceived - lastPacketsReceived || 0;
|
|
262
|
-
|
|
263
|
-
// Hop by hop are numbers and not percentage so we compare on what we sent the last min
|
|
264
|
-
// this is including packet lost
|
|
265
|
-
const totalPacketsLost = packetsLost - lastPacketsLost;
|
|
266
|
-
videoReceiver.common.mediaHopByHopLost = totalPacketsLost;
|
|
267
|
-
videoReceiver.common.rtpHopByHopLost = totalPacketsLost;
|
|
268
|
-
|
|
269
|
-
// calculate this values
|
|
270
|
-
videoReceiver.common.maxRemoteJitter = max(meanRemoteJitter) * 1000 || 0;
|
|
271
|
-
videoReceiver.common.meanRemoteJitter = mean(meanRemoteJitter) * 1000 || 0;
|
|
272
|
-
|
|
273
|
-
// Calculate the outgoing bitrate
|
|
274
|
-
const totalBytesReceivedInaMin = totalBytesReceived - lastBytesReceived;
|
|
275
|
-
const totalRtxBytesReceivedInaMin = totalRtxBytesReceived - lastRtxBytesReceived;
|
|
276
|
-
|
|
277
|
-
videoReceiver.common.rtpBitrate = totalBytesReceivedInaMin
|
|
278
|
-
? (totalBytesReceivedInaMin * 8) / 60
|
|
279
|
-
: 0;
|
|
280
|
-
videoReceiver.common.rtxPackets = totalRtxPacketsReceived - lastRtxPacketsReceived;
|
|
281
|
-
videoReceiver.common.rtxBitrate = totalRtxBytesReceivedInaMin
|
|
282
|
-
? (totalRtxBytesReceivedInaMin * 8) / 60
|
|
283
|
-
: 0;
|
|
284
|
-
};
|
|
285
|
-
|
|
286
|
-
export const getVideoReceiverStreamMqa = ({
|
|
287
|
-
videoReceiverStream,
|
|
288
|
-
statsResults,
|
|
289
|
-
lastMqaDataSent,
|
|
290
|
-
mediaType,
|
|
291
|
-
}) => {
|
|
292
|
-
const sendrecvType = STATS.RECEIVE_DIRECTION;
|
|
293
|
-
|
|
294
|
-
const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;
|
|
295
|
-
const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;
|
|
296
|
-
const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;
|
|
297
|
-
const lastFramesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].framesReceived || 0;
|
|
298
|
-
const lastFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].framesDecoded || 0;
|
|
299
|
-
const lastFramesDropped = lastMqaDataSent[mediaType]?.[sendrecvType].framesDropped || 0;
|
|
300
|
-
const lastKeyFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].keyFramesDecoded || 0;
|
|
301
|
-
const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;
|
|
302
|
-
|
|
303
|
-
const {csi} = statsResults[mediaType];
|
|
304
|
-
if (csi && !videoReceiverStream.common.csi.includes(csi)) {
|
|
305
|
-
videoReceiverStream.common.csi.push(csi);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
videoReceiverStream.common.rtpPackets =
|
|
309
|
-
statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
|
|
310
|
-
|
|
311
|
-
const totalPacketLoss =
|
|
312
|
-
statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;
|
|
313
|
-
|
|
314
|
-
// End to end packetloss is after recovery
|
|
315
|
-
videoReceiverStream.common.rtpEndToEndLost = totalPacketLoss;
|
|
316
|
-
|
|
317
|
-
videoReceiverStream.common.rtpJitter =
|
|
318
|
-
// @ts-ignore
|
|
319
|
-
max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
|
|
320
|
-
|
|
321
|
-
const totalBytesReceivedInaMin =
|
|
322
|
-
statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived;
|
|
323
|
-
videoReceiverStream.common.receivedBitrate = totalBytesReceivedInaMin
|
|
324
|
-
? (totalBytesReceivedInaMin * 8) / 60
|
|
325
|
-
: 0;
|
|
326
|
-
|
|
327
|
-
const totalFrameReceivedInaMin =
|
|
328
|
-
statsResults[mediaType][sendrecvType].framesReceived - lastFramesReceived;
|
|
329
|
-
const totalFrameDecodedInaMin =
|
|
330
|
-
statsResults[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
|
|
331
|
-
|
|
332
|
-
videoReceiverStream.common.receivedFrameRate = Math.round(
|
|
333
|
-
totalFrameReceivedInaMin ? totalFrameReceivedInaMin / 60 : 0
|
|
334
|
-
);
|
|
335
|
-
videoReceiverStream.common.renderedFrameRate = Math.round(
|
|
336
|
-
totalFrameDecodedInaMin ? totalFrameDecodedInaMin / 60 : 0
|
|
337
|
-
);
|
|
338
|
-
|
|
339
|
-
videoReceiverStream.common.framesDropped =
|
|
340
|
-
statsResults[mediaType][sendrecvType].framesDropped - lastFramesDropped || 0;
|
|
341
|
-
videoReceiverStream.receivedHeight = statsResults[mediaType][sendrecvType].height || 0;
|
|
342
|
-
videoReceiverStream.receivedWidth = statsResults[mediaType][sendrecvType].width || 0;
|
|
343
|
-
videoReceiverStream.receivedFrameSize =
|
|
344
|
-
(videoReceiverStream.receivedHeight * videoReceiverStream.receivedWidth) / 256;
|
|
345
|
-
|
|
346
|
-
videoReceiverStream.receivedKeyFrames =
|
|
347
|
-
statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;
|
|
348
|
-
videoReceiverStream.requestedKeyFrames =
|
|
349
|
-
statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;
|
|
350
|
-
};
|
|
351
|
-
|
|
352
|
-
export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, baseMediaType}) => {
|
|
353
|
-
const sendrecvType = STATS.SEND_DIRECTION;
|
|
354
|
-
|
|
355
|
-
const getLastTotalValue = (value: string) =>
|
|
356
|
-
getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, value);
|
|
357
|
-
const getTotalValue = (value: string) =>
|
|
358
|
-
getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, value);
|
|
359
|
-
|
|
360
|
-
const lastPacketsSent = getLastTotalValue('totalPacketsSent');
|
|
361
|
-
const lastBytesSent = getLastTotalValue('totalBytesSent');
|
|
362
|
-
const lastPacketsLostTotal = getLastTotalValue('totalPacketsLostOnReceiver');
|
|
363
|
-
const lastRtxPacketsSent = getLastTotalValue('totalRtxPacketsSent');
|
|
364
|
-
const lastRtxBytesSent = getLastTotalValue('totalRtxBytesSent');
|
|
365
|
-
|
|
366
|
-
const totalPacketsLostOnReceiver = getTotalValue('totalPacketsLostOnReceiver');
|
|
367
|
-
const totalPacketsSent = getTotalValue('totalPacketsSent');
|
|
368
|
-
const totalBytesSent = getTotalValue('totalBytesSent');
|
|
369
|
-
const availableOutgoingBitrate = getTotalValue('availableOutgoingBitrate');
|
|
370
|
-
const totalRtxPacketsSent = getTotalValue('totalRtxPacketsSent');
|
|
371
|
-
const totalRtxBytesSent = getTotalValue('totalRtxBytesSent');
|
|
372
|
-
|
|
373
|
-
videoSender.common.common.direction =
|
|
374
|
-
statsResults[Object.keys(statsResults).find((mediaType) => mediaType.includes(baseMediaType))]
|
|
375
|
-
?.direction || 'inactive';
|
|
376
|
-
videoSender.common.common.isMain = !baseMediaType.includes('-share');
|
|
377
|
-
videoSender.common.transportType = statsResults.connectionType.local.transport;
|
|
378
|
-
|
|
379
|
-
const meanRemoteJitter = Object.keys(statsResults)
|
|
380
|
-
.filter((mt) => mt.includes(baseMediaType))
|
|
381
|
-
.reduce((acc, mt) => acc.concat(statsResults[mt][sendrecvType].meanRemoteJitter), []);
|
|
382
|
-
const meanRoundTripTime = Object.keys(statsResults)
|
|
383
|
-
.filter((mt) => mt.includes(baseMediaType))
|
|
384
|
-
.reduce((acc, mt) => acc.concat(statsResults[mt][sendrecvType].meanRoundTripTime), []);
|
|
385
|
-
|
|
386
|
-
// @ts-ignore
|
|
387
|
-
videoSender.common.maxRemoteJitter = max(meanRemoteJitter) * 1000 || 0;
|
|
388
|
-
videoSender.common.meanRemoteJitter = mean(meanRemoteJitter) * 1000 || 0;
|
|
389
|
-
|
|
390
|
-
videoSender.common.rtpPackets = totalPacketsSent - lastPacketsSent;
|
|
391
|
-
videoSender.common.availableBitrate = availableOutgoingBitrate;
|
|
392
|
-
|
|
393
|
-
// Calculate based on how much packets lost of received compated to how to the client sent
|
|
394
|
-
const totalPacketsLostForaMin = totalPacketsLostOnReceiver - lastPacketsLostTotal;
|
|
395
|
-
|
|
396
|
-
videoSender.common.remoteLossRate =
|
|
397
|
-
totalPacketsSent - lastPacketsSent > 0
|
|
398
|
-
? (totalPacketsLostForaMin * 100) / (totalPacketsSent - lastPacketsSent)
|
|
399
|
-
: 0; // This is the packets sent with in last min || 0;
|
|
400
|
-
|
|
401
|
-
videoSender.common.maxRoundTripTime = max(meanRoundTripTime) * 1000 || 0;
|
|
402
|
-
videoSender.common.meanRoundTripTime = mean(meanRoundTripTime) * 1000 || 0;
|
|
403
|
-
videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;
|
|
404
|
-
|
|
405
|
-
// Calculate the outgoing bitrate
|
|
406
|
-
const totalBytesSentInaMin = totalBytesSent - lastBytesSent;
|
|
407
|
-
const totalRtxBytesSentInaMin = totalRtxBytesSent - lastRtxBytesSent;
|
|
408
|
-
|
|
409
|
-
videoSender.common.rtpBitrate = totalBytesSentInaMin ? (totalBytesSentInaMin * 8) / 60 : 0;
|
|
410
|
-
videoSender.common.rtxPackets = totalRtxPacketsSent - lastRtxPacketsSent;
|
|
411
|
-
videoSender.common.rtxBitrate = totalRtxBytesSentInaMin ? (totalRtxBytesSentInaMin * 8) / 60 : 0;
|
|
412
|
-
};
|
|
413
|
-
|
|
414
|
-
export const getVideoSenderStreamMqa = ({
|
|
415
|
-
videoSenderStream,
|
|
416
|
-
statsResults,
|
|
417
|
-
lastMqaDataSent,
|
|
418
|
-
mediaType,
|
|
419
|
-
}) => {
|
|
420
|
-
const sendrecvType = STATS.SEND_DIRECTION;
|
|
421
|
-
|
|
422
|
-
const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;
|
|
423
|
-
const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;
|
|
424
|
-
const lastKeyFramesEncoded =
|
|
425
|
-
lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
|
|
426
|
-
const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
|
|
427
|
-
const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;
|
|
428
|
-
|
|
429
|
-
const {csi} = statsResults[mediaType];
|
|
430
|
-
if (csi && !videoSenderStream.common.csi.includes(csi)) {
|
|
431
|
-
videoSenderStream.common.csi.push(csi);
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
videoSenderStream.common.rtpPackets =
|
|
435
|
-
statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
|
|
436
|
-
|
|
437
|
-
// Calculate the outgoing bitrate
|
|
438
|
-
const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
|
|
439
|
-
|
|
440
|
-
videoSenderStream.common.transmittedBitrate = totalBytesSentInaMin
|
|
441
|
-
? (totalBytesSentInaMin * 8) / 60
|
|
442
|
-
: 0;
|
|
443
|
-
|
|
444
|
-
videoSenderStream.transmittedKeyFrames =
|
|
445
|
-
statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;
|
|
446
|
-
videoSenderStream.requestedKeyFrames =
|
|
447
|
-
statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
|
|
448
|
-
|
|
449
|
-
// From tracks //TODO: calculate a proper one
|
|
450
|
-
const totalFrameSentInaMin =
|
|
451
|
-
statsResults[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
|
|
452
|
-
|
|
453
|
-
videoSenderStream.common.transmittedFrameRate = Math.round(
|
|
454
|
-
totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0
|
|
455
|
-
);
|
|
456
|
-
videoSenderStream.transmittedHeight = statsResults[mediaType][sendrecvType].height || 0;
|
|
457
|
-
videoSenderStream.transmittedWidth = statsResults[mediaType][sendrecvType].width || 0;
|
|
458
|
-
videoSenderStream.transmittedFrameSize =
|
|
459
|
-
(videoSenderStream.transmittedHeight * videoSenderStream.transmittedWidth) / 256;
|
|
460
|
-
videoSenderStream.requestedBitrate = statsResults[mediaType][sendrecvType].requestedBitrate || 0;
|
|
461
|
-
videoSenderStream.requestedFrameSize =
|
|
462
|
-
statsResults[mediaType][sendrecvType].requestedFrameSize || 0;
|
|
463
|
-
};
|