@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.
Files changed (126) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +7 -2
  3. package/dist/breakouts/index.js.map +1 -1
  4. package/dist/constants.js +11 -4
  5. package/dist/constants.js.map +1 -1
  6. package/dist/interpretation/index.js +1 -1
  7. package/dist/interpretation/siLanguage.js +1 -1
  8. package/dist/locus-info/selfUtils.js +0 -5
  9. package/dist/locus-info/selfUtils.js.map +1 -1
  10. package/dist/media/MediaConnectionAwaiter.js +70 -15
  11. package/dist/media/MediaConnectionAwaiter.js.map +1 -1
  12. package/dist/media/index.js +12 -0
  13. package/dist/media/index.js.map +1 -1
  14. package/dist/meeting/connectionStateHandler.js +67 -0
  15. package/dist/meeting/connectionStateHandler.js.map +1 -0
  16. package/dist/meeting/index.js +552 -357
  17. package/dist/meeting/index.js.map +1 -1
  18. package/dist/meeting/locusMediaRequest.js +7 -0
  19. package/dist/meeting/locusMediaRequest.js.map +1 -1
  20. package/dist/meeting/muteState.js +6 -1
  21. package/dist/meeting/muteState.js.map +1 -1
  22. package/dist/meeting/util.js +1 -0
  23. package/dist/meeting/util.js.map +1 -1
  24. package/dist/meeting-info/index.js +4 -4
  25. package/dist/meeting-info/index.js.map +1 -1
  26. package/dist/meeting-info/meeting-info-v2.js +2 -2
  27. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  28. package/dist/meeting-info/util.js +17 -17
  29. package/dist/meeting-info/util.js.map +1 -1
  30. package/dist/meeting-info/utilv2.js +16 -16
  31. package/dist/meeting-info/utilv2.js.map +1 -1
  32. package/dist/meetings/collection.js +1 -1
  33. package/dist/meetings/collection.js.map +1 -1
  34. package/dist/meetings/index.js +37 -33
  35. package/dist/meetings/index.js.map +1 -1
  36. package/dist/meetings/meetings.types.js +8 -0
  37. package/dist/meetings/meetings.types.js.map +1 -1
  38. package/dist/meetings/util.js +3 -2
  39. package/dist/meetings/util.js.map +1 -1
  40. package/dist/metrics/constants.js +2 -1
  41. package/dist/metrics/constants.js.map +1 -1
  42. package/dist/metrics/index.js +57 -0
  43. package/dist/metrics/index.js.map +1 -1
  44. package/dist/personal-meeting-room/index.js +1 -1
  45. package/dist/personal-meeting-room/index.js.map +1 -1
  46. package/dist/reachability/clusterReachability.js +108 -53
  47. package/dist/reachability/clusterReachability.js.map +1 -1
  48. package/dist/reachability/index.js +415 -56
  49. package/dist/reachability/index.js.map +1 -1
  50. package/dist/types/constants.d.ts +11 -3
  51. package/dist/types/media/MediaConnectionAwaiter.d.ts +24 -4
  52. package/dist/types/meeting/connectionStateHandler.d.ts +30 -0
  53. package/dist/types/meeting/index.d.ts +27 -7
  54. package/dist/types/meeting/locusMediaRequest.d.ts +2 -0
  55. package/dist/types/meeting-info/index.d.ts +3 -2
  56. package/dist/types/meeting-info/meeting-info-v2.d.ts +3 -2
  57. package/dist/types/meeting-info/util.d.ts +5 -4
  58. package/dist/types/meeting-info/utilv2.d.ts +3 -2
  59. package/dist/types/meetings/collection.d.ts +3 -2
  60. package/dist/types/meetings/index.d.ts +4 -3
  61. package/dist/types/meetings/meetings.types.d.ts +9 -0
  62. package/dist/types/metrics/constants.d.ts +1 -0
  63. package/dist/types/metrics/index.d.ts +15 -0
  64. package/dist/types/reachability/clusterReachability.d.ts +31 -3
  65. package/dist/types/reachability/index.d.ts +93 -2
  66. package/dist/webinar/index.js +1 -1
  67. package/package.json +23 -23
  68. package/src/breakouts/index.ts +7 -1
  69. package/src/constants.ts +13 -17
  70. package/src/locus-info/selfUtils.ts +0 -5
  71. package/src/media/MediaConnectionAwaiter.ts +89 -14
  72. package/src/media/index.ts +13 -0
  73. package/src/meeting/connectionStateHandler.ts +65 -0
  74. package/src/meeting/index.ts +526 -292
  75. package/src/meeting/locusMediaRequest.ts +5 -0
  76. package/src/meeting/muteState.ts +6 -1
  77. package/src/meeting/util.ts +1 -0
  78. package/src/meeting-info/index.ts +9 -6
  79. package/src/meeting-info/meeting-info-v2.ts +4 -4
  80. package/src/meeting-info/util.ts +23 -28
  81. package/src/meeting-info/utilv2.ts +18 -24
  82. package/src/meetings/collection.ts +3 -3
  83. package/src/meetings/index.ts +39 -40
  84. package/src/meetings/meetings.types.ts +11 -0
  85. package/src/meetings/util.ts +5 -4
  86. package/src/metrics/constants.ts +1 -0
  87. package/src/metrics/index.ts +44 -0
  88. package/src/personal-meeting-room/index.ts +2 -2
  89. package/src/reachability/clusterReachability.ts +86 -25
  90. package/src/reachability/index.ts +316 -27
  91. package/test/unit/spec/breakouts/index.ts +51 -32
  92. package/test/unit/spec/locus-info/selfUtils.js +25 -23
  93. package/test/unit/spec/media/MediaConnectionAwaiter.ts +131 -32
  94. package/test/unit/spec/media/index.ts +42 -27
  95. package/test/unit/spec/meeting/connectionStateHandler.ts +102 -0
  96. package/test/unit/spec/meeting/index.js +758 -179
  97. package/test/unit/spec/meeting/locusMediaRequest.ts +7 -0
  98. package/test/unit/spec/meeting/muteState.js +24 -0
  99. package/test/unit/spec/meeting-info/index.js +4 -4
  100. package/test/unit/spec/meeting-info/meetinginfov2.js +24 -28
  101. package/test/unit/spec/meeting-info/request.js +2 -2
  102. package/test/unit/spec/meeting-info/utilv2.js +41 -49
  103. package/test/unit/spec/meetings/index.js +14 -0
  104. package/test/unit/spec/metrics/index.js +126 -0
  105. package/test/unit/spec/multistream/mediaRequestManager.ts +2 -2
  106. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -2
  107. package/test/unit/spec/reachability/clusterReachability.ts +116 -22
  108. package/test/unit/spec/reachability/index.ts +1153 -84
  109. package/test/unit/spec/rtcMetrics/index.ts +1 -0
  110. package/dist/mediaQualityMetrics/config.js +0 -321
  111. package/dist/mediaQualityMetrics/config.js.map +0 -1
  112. package/dist/statsAnalyzer/global.js +0 -44
  113. package/dist/statsAnalyzer/global.js.map +0 -1
  114. package/dist/statsAnalyzer/index.js +0 -1072
  115. package/dist/statsAnalyzer/index.js.map +0 -1
  116. package/dist/statsAnalyzer/mqaUtil.js +0 -368
  117. package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
  118. package/dist/types/mediaQualityMetrics/config.d.ts +0 -247
  119. package/dist/types/statsAnalyzer/global.d.ts +0 -36
  120. package/dist/types/statsAnalyzer/index.d.ts +0 -217
  121. package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
  122. package/src/mediaQualityMetrics/config.ts +0 -255
  123. package/src/statsAnalyzer/global.ts +0 -37
  124. package/src/statsAnalyzer/index.ts +0 -1318
  125. package/src/statsAnalyzer/mqaUtil.ts +0 -463
  126. 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
- };