@webex/plugin-meetings 2.60.0-next.1 → 2.60.0-next.10

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 (185) hide show
  1. package/dist/annotation/annotation.types.d.ts +42 -0
  2. package/dist/annotation/constants.d.ts +31 -0
  3. package/dist/annotation/index.d.ts +117 -0
  4. package/dist/breakouts/breakout.d.ts +8 -0
  5. package/dist/breakouts/breakout.js +1 -1
  6. package/dist/breakouts/collection.d.ts +5 -0
  7. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  8. package/dist/breakouts/events.d.ts +8 -0
  9. package/dist/breakouts/index.d.ts +5 -0
  10. package/dist/breakouts/index.js +1 -1
  11. package/dist/breakouts/request.d.ts +22 -0
  12. package/dist/breakouts/utils.d.ts +15 -0
  13. package/dist/common/browser-detection.d.ts +9 -0
  14. package/dist/common/collection.d.ts +48 -0
  15. package/dist/common/config.d.ts +2 -0
  16. package/dist/common/errors/captcha-error.d.ts +15 -0
  17. package/dist/common/errors/intent-to-join.d.ts +16 -0
  18. package/dist/common/errors/join-meeting.d.ts +17 -0
  19. package/dist/common/errors/media.d.ts +15 -0
  20. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  21. package/dist/common/errors/parameter.d.ts +15 -0
  22. package/dist/common/errors/password-error.d.ts +15 -0
  23. package/dist/common/errors/permission.d.ts +14 -0
  24. package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
  25. package/dist/common/errors/reconnection-in-progress.d.ts +9 -0
  26. package/dist/common/errors/reconnection.d.ts +15 -0
  27. package/dist/common/errors/stats.d.ts +15 -0
  28. package/dist/common/errors/webex-errors.d.ts +93 -0
  29. package/dist/common/errors/webex-meetings-error.d.ts +20 -0
  30. package/dist/common/events/events-scope.d.ts +17 -0
  31. package/dist/common/events/events.d.ts +12 -0
  32. package/dist/common/events/trigger-proxy.d.ts +2 -0
  33. package/dist/common/events/util.d.ts +2 -0
  34. package/dist/common/logs/logger-config.d.ts +2 -0
  35. package/dist/common/logs/logger-proxy.d.ts +2 -0
  36. package/dist/common/logs/request.d.ts +36 -0
  37. package/dist/common/queue.d.ts +34 -0
  38. package/dist/config.d.ts +71 -0
  39. package/dist/constants.d.ts +1072 -0
  40. package/dist/constants.js +1 -1
  41. package/dist/constants.js.map +1 -1
  42. package/dist/controls-options-manager/constants.d.ts +4 -0
  43. package/dist/controls-options-manager/enums.d.ts +15 -0
  44. package/dist/controls-options-manager/enums.js +2 -1
  45. package/dist/controls-options-manager/enums.js.map +1 -1
  46. package/dist/controls-options-manager/index.d.ts +136 -0
  47. package/dist/controls-options-manager/types.d.ts +43 -0
  48. package/dist/controls-options-manager/util.d.ts +1 -0
  49. package/dist/index.d.ts +7 -0
  50. package/dist/interpretation/collection.d.ts +5 -0
  51. package/dist/interpretation/index.d.ts +5 -0
  52. package/dist/interpretation/index.js +1 -1
  53. package/dist/interpretation/siLanguage.d.ts +5 -0
  54. package/dist/interpretation/siLanguage.js +1 -1
  55. package/dist/locus-info/controlsUtils.d.ts +2 -0
  56. package/dist/locus-info/embeddedAppsUtils.d.ts +2 -0
  57. package/dist/locus-info/fullState.d.ts +2 -0
  58. package/dist/locus-info/hostUtils.d.ts +2 -0
  59. package/dist/locus-info/index.d.ts +322 -0
  60. package/dist/locus-info/infoUtils.d.ts +2 -0
  61. package/dist/locus-info/mediaSharesUtils.d.ts +2 -0
  62. package/dist/locus-info/parser.d.ts +272 -0
  63. package/dist/locus-info/parser.js +5 -5
  64. package/dist/locus-info/parser.js.map +1 -1
  65. package/dist/locus-info/selfUtils.d.ts +2 -0
  66. package/dist/media/index.d.ts +34 -0
  67. package/dist/media/index.js +6 -5
  68. package/dist/media/index.js.map +1 -1
  69. package/dist/media/properties.d.ts +93 -0
  70. package/dist/media/util.d.ts +2 -0
  71. package/dist/mediaQualityMetrics/config.d.ts +237 -0
  72. package/dist/mediaQualityMetrics/config.js +1 -202
  73. package/dist/mediaQualityMetrics/config.js.map +1 -1
  74. package/dist/meeting/in-meeting-actions.d.ts +167 -0
  75. package/dist/meeting/in-meeting-actions.js +4 -0
  76. package/dist/meeting/in-meeting-actions.js.map +1 -1
  77. package/dist/meeting/index.d.ts +1719 -0
  78. package/dist/meeting/index.js +288 -155
  79. package/dist/meeting/index.js.map +1 -1
  80. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  81. package/dist/meeting/muteState.d.ts +184 -0
  82. package/dist/meeting/request.d.ts +290 -0
  83. package/dist/meeting/request.type.d.ts +11 -0
  84. package/dist/meeting/state.d.ts +9 -0
  85. package/dist/meeting/util.d.ts +103 -0
  86. package/dist/meeting-info/collection.d.ts +20 -0
  87. package/dist/meeting-info/index.d.ts +69 -0
  88. package/dist/meeting-info/meeting-info-v2.d.ts +123 -0
  89. package/dist/meeting-info/meeting-info-v2.js +3 -0
  90. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  91. package/dist/meeting-info/request.d.ts +22 -0
  92. package/dist/meeting-info/util.d.ts +2 -0
  93. package/dist/meeting-info/utilv2.d.ts +2 -0
  94. package/dist/meeting-info/utilv2.js +14 -29
  95. package/dist/meeting-info/utilv2.js.map +1 -1
  96. package/dist/meetings/collection.d.ts +40 -0
  97. package/dist/meetings/collection.js +17 -0
  98. package/dist/meetings/collection.js.map +1 -1
  99. package/dist/meetings/index.d.ts +378 -0
  100. package/dist/meetings/index.js +30 -9
  101. package/dist/meetings/index.js.map +1 -1
  102. package/dist/meetings/meetings.types.d.ts +4 -0
  103. package/dist/meetings/request.d.ts +27 -0
  104. package/dist/meetings/util.d.ts +18 -0
  105. package/dist/member/index.d.ts +160 -0
  106. package/dist/member/member.types.d.ts +11 -0
  107. package/dist/member/types.d.ts +32 -0
  108. package/dist/member/util.d.ts +2 -0
  109. package/dist/members/collection.d.ts +29 -0
  110. package/dist/members/index.d.ts +353 -0
  111. package/dist/members/request.d.ts +114 -0
  112. package/dist/members/types.d.ts +25 -0
  113. package/dist/members/util.d.ts +215 -0
  114. package/dist/metrics/constants.d.ts +68 -0
  115. package/dist/metrics/constants.js +3 -0
  116. package/dist/metrics/constants.js.map +1 -1
  117. package/dist/metrics/index.d.ts +45 -0
  118. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  119. package/dist/multistream/receiveSlot.d.ts +68 -0
  120. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  121. package/dist/multistream/remoteMedia.d.ts +72 -0
  122. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  123. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  124. package/dist/multistream/sendSlotManager.d.ts +61 -0
  125. package/dist/networkQualityMonitor/index.d.ts +70 -0
  126. package/dist/personal-meeting-room/index.d.ts +47 -0
  127. package/dist/personal-meeting-room/request.d.ts +14 -0
  128. package/dist/personal-meeting-room/util.d.ts +2 -0
  129. package/dist/reachability/index.d.ts +194 -0
  130. package/dist/reachability/request.d.ts +39 -0
  131. package/dist/reactions/constants.d.ts +3 -0
  132. package/dist/reactions/reactions.d.ts +4 -0
  133. package/dist/reactions/reactions.type.d.ts +52 -0
  134. package/dist/reconnection-manager/index.d.ts +136 -0
  135. package/dist/reconnection-manager/index.js +27 -28
  136. package/dist/reconnection-manager/index.js.map +1 -1
  137. package/dist/recording-controller/enums.d.ts +7 -0
  138. package/dist/recording-controller/index.d.ts +207 -0
  139. package/dist/recording-controller/util.d.ts +14 -0
  140. package/dist/roap/index.d.ts +78 -0
  141. package/dist/roap/request.d.ts +41 -0
  142. package/dist/roap/turnDiscovery.d.ts +92 -0
  143. package/dist/rtcMetrics/constants.d.ts +4 -0
  144. package/dist/rtcMetrics/index.d.ts +54 -0
  145. package/dist/rtcMetrics/index.js +25 -0
  146. package/dist/rtcMetrics/index.js.map +1 -1
  147. package/dist/statsAnalyzer/global.d.ts +36 -0
  148. package/dist/statsAnalyzer/index.d.ts +191 -0
  149. package/dist/statsAnalyzer/index.js +53 -146
  150. package/dist/statsAnalyzer/index.js.map +1 -1
  151. package/dist/statsAnalyzer/mqaUtil.d.ts +24 -0
  152. package/dist/statsAnalyzer/mqaUtil.js +11 -12
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/transcription/index.d.ts +64 -0
  155. package/dist/webinar/collection.d.ts +16 -0
  156. package/dist/webinar/index.d.ts +5 -0
  157. package/dist/webinar/index.js +1 -1
  158. package/package.json +26 -27
  159. package/src/constants.ts +10 -4
  160. package/src/controls-options-manager/enums.ts +2 -0
  161. package/src/locus-info/parser.ts +6 -6
  162. package/src/media/index.ts +5 -5
  163. package/src/mediaQualityMetrics/config.ts +0 -135
  164. package/src/meeting/in-meeting-actions.ts +8 -0
  165. package/src/meeting/index.ts +263 -125
  166. package/src/meeting-info/meeting-info-v2.ts +4 -0
  167. package/src/meeting-info/utilv2.ts +6 -19
  168. package/src/meetings/collection.ts +13 -0
  169. package/src/meetings/index.ts +28 -10
  170. package/src/metrics/constants.ts +3 -0
  171. package/src/reconnection-manager/index.ts +63 -68
  172. package/src/rtcMetrics/index.ts +24 -0
  173. package/src/statsAnalyzer/index.ts +68 -216
  174. package/src/statsAnalyzer/mqaUtil.ts +17 -22
  175. package/test/unit/spec/media/index.ts +20 -4
  176. package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
  177. package/test/unit/spec/meeting/index.js +1376 -189
  178. package/test/unit/spec/meeting/muteState.js +2 -1
  179. package/test/unit/spec/meeting-info/meetinginfov2.js +28 -0
  180. package/test/unit/spec/meetings/collection.js +12 -0
  181. package/test/unit/spec/meetings/index.js +382 -118
  182. package/test/unit/spec/member/util.js +0 -31
  183. package/test/unit/spec/reconnection-manager/index.js +42 -12
  184. package/test/unit/spec/rtcMetrics/index.ts +20 -0
  185. package/test/unit/spec/stats-analyzer/index.js +12 -2
@@ -152,6 +152,18 @@ export class StatsAnalyzer extends EventsScope {
152
152
  const newMqa = cloneDeep(emptyMqaInterval);
153
153
 
154
154
  Object.keys(this.statsResults).forEach((mediaType) => {
155
+ if (!this.lastMqaDataSent[mediaType]) {
156
+ this.lastMqaDataSent[mediaType] = {};
157
+ }
158
+
159
+ if (!this.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {
160
+ this.lastMqaDataSent[mediaType].send = {};
161
+ }
162
+
163
+ if (!this.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {
164
+ this.lastMqaDataSent[mediaType].recv = {};
165
+ }
166
+
155
167
  if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {
156
168
  const audioSender = cloneDeep(emptyAudioTransmit);
157
169
 
@@ -162,6 +174,8 @@ export class StatsAnalyzer extends EventsScope {
162
174
  mediaType,
163
175
  });
164
176
  newMqa.audioTransmit.push(audioSender);
177
+
178
+ this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);
165
179
  } else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {
166
180
  const audioReceiver = cloneDeep(emptyAudioReceive);
167
181
 
@@ -172,6 +186,8 @@ export class StatsAnalyzer extends EventsScope {
172
186
  mediaType,
173
187
  });
174
188
  newMqa.audioReceive.push(audioReceiver);
189
+
190
+ this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);
175
191
  } else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {
176
192
  const videoSender = cloneDeep(emptyVideoTransmit);
177
193
 
@@ -182,6 +198,8 @@ export class StatsAnalyzer extends EventsScope {
182
198
  mediaType,
183
199
  });
184
200
  newMqa.videoTransmit.push(videoSender);
201
+
202
+ this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);
185
203
  } else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {
186
204
  const videoReceiver = cloneDeep(emptyVideoReceive);
187
205
 
@@ -192,6 +210,8 @@ export class StatsAnalyzer extends EventsScope {
192
210
  mediaType,
193
211
  });
194
212
  newMqa.videoReceive.push(videoReceiver);
213
+
214
+ this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);
195
215
  }
196
216
  });
197
217
 
@@ -330,26 +350,6 @@ export class StatsAnalyzer extends EventsScope {
330
350
  this.statsResults[type].recv = cloneDeep(emptyReceiver);
331
351
  }
332
352
 
333
- if (!this.statsResults.resolutions[type]) {
334
- this.statsResults.resolutions[type] = {};
335
- }
336
-
337
- if (isSender && !this.statsResults.resolutions[type].send) {
338
- this.statsResults.resolutions[type].send = cloneDeep(emptySender);
339
- } else if (!isSender && !this.statsResults.resolutions[type].recv) {
340
- this.statsResults.resolutions[type].recv = cloneDeep(emptyReceiver);
341
- }
342
-
343
- if (!this.statsResults.internal[type]) {
344
- this.statsResults.internal[type] = {};
345
- }
346
-
347
- if (isSender && !this.statsResults.internal[type].send) {
348
- this.statsResults.internal[type].send = cloneDeep(emptySender);
349
- } else if (!isSender && !this.statsResults.internal[type].recv) {
350
- this.statsResults.internal[type].recv = cloneDeep(emptyReceiver);
351
- }
352
-
353
353
  switch (getStatsResult.type) {
354
354
  case 'outbound-rtp':
355
355
  this.processOutboundRTPResult(getStatsResult, type);
@@ -357,13 +357,9 @@ export class StatsAnalyzer extends EventsScope {
357
357
  case 'inbound-rtp':
358
358
  this.processInboundRTPResult(getStatsResult, type);
359
359
  break;
360
- case 'track':
361
- this.processTrackResult(getStatsResult, type);
362
- break;
363
360
  case 'remote-inbound-rtp':
364
361
  case 'remote-outbound-rtp':
365
- // @ts-ignore
366
- this.compareSentAndReceived(getStatsResult, type, isSender);
362
+ this.compareSentAndReceived(getStatsResult, type);
367
363
  break;
368
364
  case 'remotecandidate':
369
365
  case 'remote-candidate':
@@ -514,19 +510,6 @@ export class StatsAnalyzer extends EventsScope {
514
510
  .filter((key) => key.startsWith(keyPrefix))
515
511
  .reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);
516
512
 
517
- const getCurrentResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
518
- Object.keys(this.statsResults)
519
- .filter((key) => key.startsWith(keyPrefix))
520
- .reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]?.recv[value] || 0), 0);
521
-
522
- const getPreviousResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
523
- Object.keys(this.statsResults)
524
- .filter((key) => key.startsWith(keyPrefix))
525
- .reduce(
526
- (prev, cur) => prev + (this.lastStatsResults.resolutions[cur]?.recv[value] || 0),
527
- 0
528
- );
529
-
530
513
  if (this.meetingMediaStatus.expected.sendAudio && this.lastStatsResults['audio-send']) {
531
514
  // compare audio stats sent
532
515
  // NOTE: relies on there being only one sender.
@@ -623,13 +606,13 @@ export class StatsAnalyzer extends EventsScope {
623
606
  }
624
607
 
625
608
  if (
626
- this.statsResults.resolutions['video-send'].send.framesSent ===
627
- this.lastStatsResults.resolutions['video-send'].send.framesSent ||
628
- this.statsResults.resolutions['video-send'].send.framesSent === 0
609
+ this.statsResults['video-send'].send.framesSent ===
610
+ this.lastStatsResults['video-send'].send.framesSent ||
611
+ this.statsResults['video-send'].send.framesSent === 0
629
612
  ) {
630
613
  LoggerProxy.logger.info(
631
614
  `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,
632
- this.statsResults.resolutions['video-send'].send.framesSent
615
+ this.statsResults['video-send'].send.framesSent
633
616
  );
634
617
  }
635
618
  }
@@ -644,24 +627,12 @@ export class StatsAnalyzer extends EventsScope {
644
627
  'video-recv',
645
628
  'totalPacketsReceived'
646
629
  );
647
- const currentFramesReceived = getCurrentResolutionsStatsTotals(
648
- 'video-recv',
649
- 'framesReceived'
650
- );
651
- const previousFramesReceived = getPreviousResolutionsStatsTotals(
652
- 'video-recv',
653
- 'framesReceived'
654
- );
630
+ const currentFramesReceived = getCurrentStatsTotals('video-recv', 'framesReceived');
631
+ const previousFramesReceived = getPreviousStatsTotals('video-recv', 'framesReceived');
655
632
  const currentFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');
656
633
  const previousFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');
657
- const currentFramesDropped = getCurrentResolutionsStatsTotals(
658
- 'video-recv',
659
- 'framesDropped'
660
- );
661
- const previousFramesDropped = getPreviousResolutionsStatsTotals(
662
- 'video-recv',
663
- 'framesDropped'
664
- );
634
+ const currentFramesDropped = getCurrentStatsTotals('video-recv', 'framesDropped');
635
+ const previousFramesDropped = getPreviousStatsTotals('video-recv', 'framesDropped');
665
636
 
666
637
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
667
638
  LoggerProxy.logger.info(
@@ -720,13 +691,13 @@ export class StatsAnalyzer extends EventsScope {
720
691
  }
721
692
 
722
693
  if (
723
- this.statsResults.resolutions['video-share-send'].send.framesSent ===
724
- this.lastStatsResults.resolutions['video-share-send'].send.framesSent ||
725
- this.statsResults.resolutions['video-share-send'].send.framesSent === 0
694
+ this.statsResults['video-share-send'].send.framesSent ===
695
+ this.lastStatsResults['video-share-send'].send.framesSent ||
696
+ this.statsResults['video-share-send'].send.framesSent === 0
726
697
  ) {
727
698
  LoggerProxy.logger.info(
728
699
  `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,
729
- this.statsResults.resolutions['video-share-send'].send.framesSent
700
+ this.statsResults['video-share-send'].send.framesSent
730
701
  );
731
702
  }
732
703
  }
@@ -743,24 +714,12 @@ export class StatsAnalyzer extends EventsScope {
743
714
  'video-share-recv',
744
715
  'totalPacketsReceived'
745
716
  );
746
- const currentFramesReceived = getCurrentResolutionsStatsTotals(
747
- 'video-share-recv',
748
- 'framesReceived'
749
- );
750
- const previousFramesReceived = getPreviousResolutionsStatsTotals(
751
- 'video-share-recv',
752
- 'framesReceived'
753
- );
717
+ const currentFramesReceived = getCurrentStatsTotals('video-share-recv', 'framesReceived');
718
+ const previousFramesReceived = getPreviousStatsTotals('video-share-recv', 'framesReceived');
754
719
  const currentFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');
755
720
  const previousFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');
756
- const currentFramesDropped = getCurrentResolutionsStatsTotals(
757
- 'video-share-recv',
758
- 'framesDropped'
759
- );
760
- const previousFramesDropped = getPreviousResolutionsStatsTotals(
761
- 'video-share-recv',
762
- 'framesDropped'
763
- );
721
+ const currentFramesDropped = getCurrentStatsTotals('video-share-recv', 'framesDropped');
722
+ const previousFramesDropped = getPreviousStatsTotals('video-share-recv', 'framesDropped');
764
723
 
765
724
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
766
725
  LoggerProxy.logger.info(
@@ -884,51 +843,20 @@ export class StatsAnalyzer extends EventsScope {
884
843
  const sendrecvType = STATS.SEND_DIRECTION;
885
844
 
886
845
  if (result.bytesSent) {
887
- let kilobytes = 0;
846
+ const kilobytes = 0;
888
847
 
889
848
  if (result.frameWidth && result.frameHeight) {
890
- this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
891
- this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
892
- this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
893
- this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent =
894
- result.hugeFramesSent;
895
- }
896
-
897
- if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
898
- this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
899
- }
900
- if (!this.statsResults.internal[mediaType][sendrecvType].framesEncoded) {
901
- this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
902
- }
903
- if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {
904
- this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded =
905
- result.keyFramesEncoded;
849
+ this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
850
+ this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
851
+ this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;
852
+ this.statsResults[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
906
853
  }
907
854
 
908
- const bytes =
909
- result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;
910
-
911
- this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
912
-
913
- kilobytes = bytes / 1024;
914
-
915
855
  this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
916
- this.statsResults[mediaType].bytesSent = kilobytes;
917
-
918
- this.statsResults[mediaType][sendrecvType].framesEncoded =
919
- result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;
920
- this.statsResults[mediaType][sendrecvType].keyFramesEncoded =
921
- result.keyFramesEncoded -
922
- this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;
923
- this.statsResults.internal[mediaType].outboundRtpId = result.id;
924
856
 
925
- if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {
926
- this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
927
- }
928
-
929
- this.statsResults[mediaType][sendrecvType].packetsSent =
930
- result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;
931
- this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
857
+ this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
858
+ this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
859
+ this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent;
932
860
 
933
861
  // Data saved to send MQA metrics
934
862
 
@@ -972,74 +900,40 @@ export class StatsAnalyzer extends EventsScope {
972
900
  : '';
973
901
 
974
902
  if (result.frameWidth && result.frameHeight) {
975
- this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
976
- this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
977
- this.statsResults.resolutions[mediaType][sendrecvType].framesReceived =
978
- result.framesReceived;
979
- }
980
-
981
- if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
982
- this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
983
- result.bytesReceived;
984
- }
985
-
986
- if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {
987
- this.statsResults.internal[mediaType][sendrecvType].pliCount = result.pliCount;
988
- }
989
-
990
- if (!this.statsResults.internal[mediaType][sendrecvType].packetsLost) {
991
- this.statsResults.internal[mediaType][sendrecvType].packetsLost = result.packetsLost;
992
- }
993
-
994
- if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {
995
- this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
996
- result.packetsReceived;
997
- }
998
-
999
- if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {
1000
- this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp =
1001
- result.lastPacketReceivedTimestamp;
903
+ this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
904
+ this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
905
+ this.statsResults[mediaType][sendrecvType].framesReceived = result.framesReceived;
1002
906
  }
1003
907
 
1004
908
  const bytes =
1005
- result.bytesReceived -
1006
- this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived;
1007
-
1008
- this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
909
+ result.bytesReceived - this.statsResults[mediaType][sendrecvType].totalBytesReceived;
1009
910
 
1010
911
  kilobytes = bytes / 1024;
1011
912
  this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
1012
- this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);
1013
-
1014
- this.statsResults[mediaType][sendrecvType].pliCount =
1015
- result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;
1016
- this.statsResults[mediaType][sendrecvType].currentPacketsLost =
1017
- result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;
1018
- if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {
1019
- this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;
913
+
914
+ let currentPacketsLost =
915
+ result.packetsLost - this.statsResults[mediaType][sendrecvType].totalPacketsLost;
916
+ if (currentPacketsLost < 0) {
917
+ currentPacketsLost = 0;
1020
918
  }
1021
919
 
1022
- this.statsResults[mediaType][sendrecvType].packetsReceived =
1023
- result.packetsReceived -
1024
- this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;
1025
- this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
1026
- result.packetsReceived;
920
+ const currentPacketsReceived =
921
+ result.packetsReceived - this.statsResults[mediaType][sendrecvType].totalPacketsReceived;
922
+ this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
1027
923
 
1028
- if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
924
+ if (currentPacketsReceived === 0) {
1029
925
  if (receiveSlot) {
1030
926
  LoggerProxy.logger.info(
1031
927
  `StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,
1032
- this.statsResults[mediaType][sendrecvType].packetsReceived
928
+ currentPacketsReceived
1033
929
  );
1034
930
  }
1035
931
  }
1036
932
 
1037
933
  // Check the over all packet Lost ratio
1038
934
  this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =
1039
- this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0
1040
- ? this.statsResults[mediaType][sendrecvType].currentPacketsLost /
1041
- (this.statsResults[mediaType][sendrecvType].packetsReceived +
1042
- this.statsResults[mediaType][sendrecvType].currentPacketsLost)
935
+ currentPacketsLost > 0
936
+ ? currentPacketsLost / (currentPacketsReceived + currentPacketsLost)
1043
937
  : 0;
1044
938
  if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
1045
939
  LoggerProxy.logger.info(
@@ -1119,7 +1013,11 @@ export class StatsAnalyzer extends EventsScope {
1119
1013
  const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
1120
1014
  const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
1121
1015
 
1122
- this.statsResults.internal.candidates[result.id] = {
1016
+ if (!this.statsResults.candidates) {
1017
+ this.statsResults.candidates = {};
1018
+ }
1019
+
1020
+ this.statsResults.candidates[result.id] = {
1123
1021
  candidateType: result.candidateType,
1124
1022
  ipAddress: result.ip, // TODO: add ports
1125
1023
  portNumber: result.port,
@@ -1141,47 +1039,6 @@ export class StatsAnalyzer extends EventsScope {
1141
1039
  this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
1142
1040
  };
1143
1041
 
1144
- /**
1145
- * Process Track results
1146
- *
1147
- * @private
1148
- * @param {*} result
1149
- * @param {*} mediaType
1150
- * @returns {void}
1151
- * @memberof StatsAnalyzer
1152
- */
1153
- private processTrackResult(result: any, mediaType: any) {
1154
- if (!result || result.type !== 'track') {
1155
- return;
1156
- }
1157
-
1158
- const sendrecvType =
1159
- result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
1160
-
1161
- if (sendrecvType === STATS.RECEIVE_DIRECTION) {
1162
- this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
1163
- this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
1164
- this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
1165
- }
1166
-
1167
- if (result.trackIdentifier && !mediaType.includes('audio')) {
1168
- this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier =
1169
- result.trackIdentifier;
1170
-
1171
- const jitterBufferDelay = result && result.jitterBufferDelay;
1172
- const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;
1173
-
1174
- this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay =
1175
- jitterBufferEmittedCount && +jitterBufferDelay / +jitterBufferEmittedCount;
1176
-
1177
- // Used to calculate the jitter
1178
- this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay =
1179
- result.jitterBufferDelay;
1180
- this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount =
1181
- result.jitterBufferEmittedCount;
1182
- }
1183
- }
1184
-
1185
1042
  /**
1186
1043
  *
1187
1044
  * @private
@@ -1192,20 +1049,15 @@ export class StatsAnalyzer extends EventsScope {
1192
1049
  */
1193
1050
  compareSentAndReceived(result, type) {
1194
1051
  // Don't compare on transceivers without a sender.
1195
- if (!type || !this.statsResults.internal[type].send) {
1052
+ if (!type || !this.statsResults[type].send) {
1196
1053
  return;
1197
1054
  }
1198
1055
 
1199
1056
  const mediaType = type;
1200
1057
 
1201
- if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {
1202
- this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
1203
- }
1204
-
1205
1058
  const currentPacketLoss =
1206
- result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;
1059
+ result.packetsLost - this.statsResults[mediaType].send.totalPacketsLostOnReceiver;
1207
1060
 
1208
- this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
1209
1061
  this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;
1210
1062
  this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
1211
1063
 
@@ -173,7 +173,6 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
173
173
  mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
174
174
 
175
175
  videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;
176
- // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferEmittedCount) * 1000 || 0;
177
176
 
178
177
  // Calculate the outgoing bitrate
179
178
  const totalBytesReceivedInaMin =
@@ -186,23 +185,21 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
186
185
 
187
186
  // From tracks //TODO: calculate a proper one
188
187
  const totalFrameReceivedInaMin =
189
- statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastFramesReceived;
188
+ statsResults[mediaType][sendrecvType].framesReceived - lastFramesReceived;
190
189
  const totalFrameDecodedInaMin =
191
- statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
190
+ statsResults[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
192
191
 
193
- videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin
194
- ? (totalFrameReceivedInaMin * 100) / 60
195
- : 0;
196
- videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin
197
- ? (totalFrameDecodedInaMin * 100) / 60
198
- : 0;
192
+ videoReceiver.streams[0].common.receivedFrameRate = Math.round(
193
+ totalFrameReceivedInaMin ? totalFrameReceivedInaMin / 60 : 0
194
+ );
195
+ videoReceiver.streams[0].common.renderedFrameRate = Math.round(
196
+ totalFrameDecodedInaMin ? totalFrameDecodedInaMin / 60 : 0
197
+ );
199
198
 
200
199
  videoReceiver.streams[0].common.framesDropped =
201
- statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;
202
- videoReceiver.streams[0].receivedHeight =
203
- statsResults.resolutions[mediaType][sendrecvType].height || 0;
204
- videoReceiver.streams[0].receivedWidth =
205
- statsResults.resolutions[mediaType][sendrecvType].width || 0;
200
+ statsResults[mediaType][sendrecvType].framesDropped - lastFramesDropped;
201
+ videoReceiver.streams[0].receivedHeight = statsResults[mediaType][sendrecvType].height || 0;
202
+ videoReceiver.streams[0].receivedWidth = statsResults[mediaType][sendrecvType].width || 0;
206
203
  videoReceiver.streams[0].receivedFrameSize =
207
204
  (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;
208
205
 
@@ -278,15 +275,13 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
278
275
 
279
276
  // From tracks //TODO: calculate a proper one
280
277
  const totalFrameSentInaMin =
281
- statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
278
+ statsResults[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
282
279
 
283
- videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin
284
- ? (totalFrameSentInaMin * 100) / 60
285
- : 0;
286
- videoSender.streams[0].transmittedHeight =
287
- statsResults.resolutions[mediaType][sendrecvType].height || 0;
288
- videoSender.streams[0].transmittedWidth =
289
- statsResults.resolutions[mediaType][sendrecvType].width || 0;
280
+ videoSender.streams[0].common.transmittedFrameRate = Math.round(
281
+ totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0
282
+ );
283
+ videoSender.streams[0].transmittedHeight = statsResults[mediaType][sendrecvType].height || 0;
284
+ videoSender.streams[0].transmittedWidth = statsResults[mediaType][sendrecvType].width || 0;
290
285
  videoSender.streams[0].transmittedFrameSize =
291
286
  (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;
292
287
  };
@@ -16,16 +16,32 @@ describe('createMediaConnection', () => {
16
16
  id: 'any fake track'
17
17
  }
18
18
  const fakeAudioStream = {
19
- outputTrack: fakeTrack,
19
+ outputStream: {
20
+ getTracks: () => {
21
+ return [fakeTrack];
22
+ }
23
+ }
20
24
  };
21
25
  const fakeVideoStream = {
22
- outputTrack: fakeTrack,
26
+ outputStream: {
27
+ getTracks: () => {
28
+ return [fakeTrack];
29
+ }
30
+ }
23
31
  };
24
32
  const fakeShareVideoStream = {
25
- outputTrack: fakeTrack,
33
+ outputStream: {
34
+ getTracks: () => {
35
+ return [fakeTrack];
36
+ }
37
+ }
26
38
  };
27
39
  const fakeShareAudioStream = {
28
- outputTrack: fakeTrack,
40
+ outputStream: {
41
+ getTracks: () => {
42
+ return [fakeTrack];
43
+ }
44
+ }
29
45
  };
30
46
  afterEach(() => {
31
47
  sinon.restore();
@@ -67,12 +67,14 @@ describe('plugin-meetings', () => {
67
67
  canShareDesktop: null,
68
68
  canShareContent: null,
69
69
  canTransferFile: null,
70
+ canChat: null,
70
71
  canDoVideo: null,
71
72
  canAnnotate: null,
72
73
  canUseVoip: null,
73
74
  supportHQV: null,
74
75
  supportHDV: null,
75
76
  canShareWhiteBoard: null,
77
+ enforceVirtualBackground: null,
76
78
  ...expected,
77
79
  };
78
80
 
@@ -145,12 +147,14 @@ describe('plugin-meetings', () => {
145
147
  'canShareDesktop',
146
148
  'canShareContent',
147
149
  'canTransferFile',
150
+ 'canChat',
148
151
  'canDoVideo',
149
152
  'canAnnotate',
150
153
  'canUseVoip',
151
154
  'supportHQV',
152
155
  'supportHDV',
153
156
  'canShareWhiteBoard',
157
+ 'enforceVirtualBackground',
154
158
  ].forEach((key) => {
155
159
  it(`get and set for ${key} work as expected`, () => {
156
160
  const inMeetingActions = new InMeetingActions();