@webex/plugin-meetings 3.0.0-beta.33 → 3.0.0-beta.331

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 (378) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +94 -15
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +709 -35
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/utils.js +45 -1
  17. package/dist/breakouts/utils.js.map +1 -1
  18. package/dist/common/errors/no-meeting-info.js +51 -0
  19. package/dist/common/errors/no-meeting-info.js.map +1 -0
  20. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  21. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +48 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/logs/request.js +5 -1
  27. package/dist/common/logs/request.js.map +1 -1
  28. package/dist/common/queue.js +24 -9
  29. package/dist/common/queue.js.map +1 -1
  30. package/dist/config.js +4 -10
  31. package/dist/config.js.map +1 -1
  32. package/dist/constants.js +233 -29
  33. package/dist/constants.js.map +1 -1
  34. package/dist/controls-options-manager/enums.js +14 -2
  35. package/dist/controls-options-manager/enums.js.map +1 -1
  36. package/dist/controls-options-manager/index.js +109 -15
  37. package/dist/controls-options-manager/index.js.map +1 -1
  38. package/dist/controls-options-manager/types.js +7 -0
  39. package/dist/controls-options-manager/types.js.map +1 -0
  40. package/dist/controls-options-manager/util.js +309 -18
  41. package/dist/controls-options-manager/util.js.map +1 -1
  42. package/dist/index.js +112 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/interpretation/collection.js +23 -0
  45. package/dist/interpretation/collection.js.map +1 -0
  46. package/dist/interpretation/index.js +366 -0
  47. package/dist/interpretation/index.js.map +1 -0
  48. package/dist/interpretation/siLanguage.js +25 -0
  49. package/dist/interpretation/siLanguage.js.map +1 -0
  50. package/dist/locus-info/controlsUtils.js +91 -2
  51. package/dist/locus-info/controlsUtils.js.map +1 -1
  52. package/dist/locus-info/index.js +383 -62
  53. package/dist/locus-info/index.js.map +1 -1
  54. package/dist/locus-info/infoUtils.js +7 -1
  55. package/dist/locus-info/infoUtils.js.map +1 -1
  56. package/dist/locus-info/mediaSharesUtils.js +57 -1
  57. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  58. package/dist/locus-info/parser.js +249 -72
  59. package/dist/locus-info/parser.js.map +1 -1
  60. package/dist/locus-info/selfUtils.js +89 -14
  61. package/dist/locus-info/selfUtils.js.map +1 -1
  62. package/dist/media/index.js +61 -116
  63. package/dist/media/index.js.map +1 -1
  64. package/dist/media/properties.js +73 -124
  65. package/dist/media/properties.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +86 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +3917 -2960
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +292 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +230 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +260 -196
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +601 -417
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +73 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +192 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/util.js +1 -1
  83. package/dist/meeting-info/util.js.map +1 -1
  84. package/dist/meeting-info/utilv2.js +36 -36
  85. package/dist/meeting-info/utilv2.js.map +1 -1
  86. package/dist/meetings/collection.js +39 -0
  87. package/dist/meetings/collection.js.map +1 -1
  88. package/dist/meetings/index.js +424 -116
  89. package/dist/meetings/index.js.map +1 -1
  90. package/dist/meetings/meetings.types.js +7 -0
  91. package/dist/meetings/meetings.types.js.map +1 -0
  92. package/dist/meetings/request.js +2 -0
  93. package/dist/meetings/request.js.map +1 -1
  94. package/dist/meetings/util.js +72 -6
  95. package/dist/meetings/util.js.map +1 -1
  96. package/dist/member/index.js +58 -0
  97. package/dist/member/index.js.map +1 -1
  98. package/dist/member/types.js +25 -0
  99. package/dist/member/types.js.map +1 -0
  100. package/dist/member/util.js +132 -25
  101. package/dist/member/util.js.map +1 -1
  102. package/dist/members/collection.js +10 -0
  103. package/dist/members/collection.js.map +1 -1
  104. package/dist/members/index.js +102 -6
  105. package/dist/members/index.js.map +1 -1
  106. package/dist/members/request.js +106 -38
  107. package/dist/members/request.js.map +1 -1
  108. package/dist/members/types.js +15 -0
  109. package/dist/members/types.js.map +1 -0
  110. package/dist/members/util.js +326 -232
  111. package/dist/members/util.js.map +1 -1
  112. package/dist/metrics/constants.js +16 -5
  113. package/dist/metrics/constants.js.map +1 -1
  114. package/dist/metrics/index.js +1 -468
  115. package/dist/metrics/index.js.map +1 -1
  116. package/dist/multistream/mediaRequestManager.js +228 -58
  117. package/dist/multistream/mediaRequestManager.js.map +1 -1
  118. package/dist/multistream/receiveSlot.js +29 -16
  119. package/dist/multistream/receiveSlot.js.map +1 -1
  120. package/dist/multistream/receiveSlotManager.js +39 -36
  121. package/dist/multistream/receiveSlotManager.js.map +1 -1
  122. package/dist/multistream/remoteMedia.js +44 -18
  123. package/dist/multistream/remoteMedia.js.map +1 -1
  124. package/dist/multistream/remoteMediaGroup.js +60 -3
  125. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  126. package/dist/multistream/remoteMediaManager.js +209 -59
  127. package/dist/multistream/remoteMediaManager.js.map +1 -1
  128. package/dist/multistream/sendSlotManager.js +233 -0
  129. package/dist/multistream/sendSlotManager.js.map +1 -0
  130. package/dist/reachability/index.js +225 -59
  131. package/dist/reachability/index.js.map +1 -1
  132. package/dist/reachability/request.js +17 -8
  133. package/dist/reachability/request.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +214 -170
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -2
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +62 -32
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +112 -97
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +95 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +142 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/index.js +107 -79
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +27 -26
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  158. package/dist/types/breakouts/events.d.ts +8 -0
  159. package/dist/types/breakouts/utils.d.ts +14 -0
  160. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  161. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  162. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  163. package/dist/types/common/logs/request.d.ts +2 -0
  164. package/dist/types/common/queue.d.ts +9 -7
  165. package/dist/types/config.d.ts +1 -7
  166. package/dist/types/constants.d.ts +201 -30
  167. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  168. package/dist/types/controls-options-manager/index.d.ts +17 -1
  169. package/dist/types/controls-options-manager/types.d.ts +43 -0
  170. package/dist/types/controls-options-manager/util.d.ts +1 -7
  171. package/dist/types/index.d.ts +6 -4
  172. package/dist/types/interpretation/collection.d.ts +5 -0
  173. package/dist/types/interpretation/index.d.ts +5 -0
  174. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  175. package/dist/types/locus-info/index.d.ts +57 -4
  176. package/dist/types/locus-info/parser.d.ts +67 -6
  177. package/dist/types/media/index.d.ts +2 -0
  178. package/dist/types/media/properties.d.ts +34 -48
  179. package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
  180. package/dist/types/meeting/index.d.ts +502 -512
  181. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  182. package/dist/types/meeting/muteState.d.ts +99 -23
  183. package/dist/types/meeting/request.d.ts +72 -43
  184. package/dist/types/meeting/util.d.ts +101 -1
  185. package/dist/types/meeting-info/index.d.ts +13 -1
  186. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  187. package/dist/types/meetings/collection.d.ts +17 -0
  188. package/dist/types/meetings/index.d.ts +101 -21
  189. package/dist/types/meetings/meetings.types.d.ts +4 -0
  190. package/dist/types/member/index.d.ts +14 -0
  191. package/dist/types/member/types.d.ts +32 -0
  192. package/dist/types/members/collection.d.ts +5 -0
  193. package/dist/types/members/index.d.ts +35 -2
  194. package/dist/types/members/request.d.ts +73 -9
  195. package/dist/types/members/types.d.ts +25 -0
  196. package/dist/types/members/util.d.ts +214 -1
  197. package/dist/types/metrics/constants.d.ts +15 -4
  198. package/dist/types/metrics/index.d.ts +4 -119
  199. package/dist/types/multistream/mediaRequestManager.d.ts +72 -5
  200. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  201. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  202. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  203. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  204. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  205. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  206. package/dist/types/reachability/index.d.ts +61 -7
  207. package/dist/types/reachability/request.d.ts +7 -3
  208. package/dist/types/reconnection-manager/index.d.ts +19 -0
  209. package/dist/types/recording-controller/index.d.ts +15 -1
  210. package/dist/types/recording-controller/util.d.ts +5 -4
  211. package/dist/types/roap/index.d.ts +2 -1
  212. package/dist/types/roap/request.d.ts +15 -11
  213. package/dist/types/roap/turnDiscovery.d.ts +21 -3
  214. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  215. package/dist/types/rtcMetrics/index.d.ts +54 -0
  216. package/dist/types/statsAnalyzer/index.d.ts +7 -1
  217. package/dist/types/webinar/collection.d.ts +16 -0
  218. package/dist/types/webinar/index.d.ts +5 -0
  219. package/dist/webinar/collection.js +44 -0
  220. package/dist/webinar/collection.js.map +1 -0
  221. package/dist/webinar/index.js +69 -0
  222. package/dist/webinar/index.js.map +1 -0
  223. package/package.json +24 -20
  224. package/src/annotation/annotation.types.ts +50 -0
  225. package/src/annotation/constants.ts +36 -0
  226. package/src/annotation/index.ts +328 -0
  227. package/src/breakouts/README.md +42 -12
  228. package/src/breakouts/breakout.ts +67 -9
  229. package/src/breakouts/edit-lock-error.ts +25 -0
  230. package/src/breakouts/events.ts +56 -0
  231. package/src/breakouts/index.ts +592 -20
  232. package/src/breakouts/utils.ts +42 -0
  233. package/src/common/errors/no-meeting-info.ts +24 -0
  234. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  235. package/src/common/errors/webex-errors.ts +44 -2
  236. package/src/common/logs/logger-proxy.ts +1 -1
  237. package/src/common/logs/request.ts +5 -1
  238. package/src/common/queue.ts +22 -8
  239. package/src/config.ts +3 -9
  240. package/src/constants.ts +224 -20
  241. package/src/controls-options-manager/enums.ts +12 -0
  242. package/src/controls-options-manager/index.ts +116 -21
  243. package/src/controls-options-manager/types.ts +59 -0
  244. package/src/controls-options-manager/util.ts +294 -14
  245. package/src/index.ts +40 -0
  246. package/src/interpretation/README.md +60 -0
  247. package/src/interpretation/collection.ts +19 -0
  248. package/src/interpretation/index.ts +332 -0
  249. package/src/interpretation/siLanguage.ts +18 -0
  250. package/src/locus-info/controlsUtils.ts +108 -0
  251. package/src/locus-info/index.ts +413 -59
  252. package/src/locus-info/infoUtils.ts +10 -2
  253. package/src/locus-info/mediaSharesUtils.ts +64 -0
  254. package/src/locus-info/parser.ts +258 -47
  255. package/src/locus-info/selfUtils.ts +81 -5
  256. package/src/media/index.ts +102 -122
  257. package/src/media/properties.ts +87 -110
  258. package/src/meeting/in-meeting-actions.ts +171 -3
  259. package/src/meeting/index.ts +3267 -2555
  260. package/src/meeting/locusMediaRequest.ts +313 -0
  261. package/src/meeting/muteState.ts +229 -131
  262. package/src/meeting/request.ts +177 -121
  263. package/src/meeting/util.ts +588 -394
  264. package/src/meeting-info/index.ts +81 -8
  265. package/src/meeting-info/meeting-info-v2.ts +170 -14
  266. package/src/meeting-info/util.ts +1 -1
  267. package/src/meeting-info/utilv2.ts +23 -23
  268. package/src/meetings/collection.ts +33 -0
  269. package/src/meetings/index.ts +454 -125
  270. package/src/meetings/meetings.types.ts +12 -0
  271. package/src/meetings/request.ts +2 -0
  272. package/src/meetings/util.ts +80 -11
  273. package/src/member/index.ts +58 -0
  274. package/src/member/types.ts +38 -0
  275. package/src/member/util.ts +141 -25
  276. package/src/members/collection.ts +8 -0
  277. package/src/members/index.ts +134 -8
  278. package/src/members/request.ts +97 -17
  279. package/src/members/types.ts +29 -0
  280. package/src/members/util.ts +333 -240
  281. package/src/metrics/constants.ts +15 -4
  282. package/src/metrics/index.ts +1 -490
  283. package/src/multistream/mediaRequestManager.ts +277 -82
  284. package/src/multistream/receiveSlot.ts +31 -17
  285. package/src/multistream/receiveSlotManager.ts +34 -24
  286. package/src/multistream/remoteMedia.ts +27 -2
  287. package/src/multistream/remoteMediaGroup.ts +59 -0
  288. package/src/multistream/remoteMediaManager.ts +148 -30
  289. package/src/multistream/sendSlotManager.ts +170 -0
  290. package/src/reachability/index.ts +228 -37
  291. package/src/reachability/request.ts +17 -8
  292. package/src/reconnection-manager/index.ts +128 -106
  293. package/src/recording-controller/index.ts +20 -3
  294. package/src/recording-controller/util.ts +26 -9
  295. package/src/roap/index.ts +63 -32
  296. package/src/roap/request.ts +100 -104
  297. package/src/roap/turnDiscovery.ts +48 -26
  298. package/src/rtcMetrics/constants.ts +3 -0
  299. package/src/rtcMetrics/index.ts +124 -0
  300. package/src/statsAnalyzer/index.ts +135 -92
  301. package/src/statsAnalyzer/mqaUtil.ts +30 -28
  302. package/src/webinar/collection.ts +31 -0
  303. package/src/webinar/index.ts +62 -0
  304. package/test/integration/spec/converged-space-meetings.js +60 -3
  305. package/test/integration/spec/journey.js +320 -261
  306. package/test/integration/spec/space-meeting.js +76 -3
  307. package/test/unit/spec/annotation/index.ts +418 -0
  308. package/test/unit/spec/breakouts/breakout.ts +118 -28
  309. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  310. package/test/unit/spec/breakouts/events.ts +89 -0
  311. package/test/unit/spec/breakouts/index.ts +1395 -69
  312. package/test/unit/spec/breakouts/utils.js +52 -1
  313. package/test/unit/spec/common/queue.js +31 -2
  314. package/test/unit/spec/controls-options-manager/index.js +163 -0
  315. package/test/unit/spec/controls-options-manager/util.js +576 -60
  316. package/test/unit/spec/fixture/locus.js +1 -0
  317. package/test/unit/spec/interpretation/collection.ts +15 -0
  318. package/test/unit/spec/interpretation/index.ts +589 -0
  319. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  320. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  321. package/test/unit/spec/locus-info/index.js +1304 -33
  322. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  323. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  324. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  325. package/test/unit/spec/locus-info/parser.js +116 -35
  326. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  327. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  328. package/test/unit/spec/media/index.ts +104 -37
  329. package/test/unit/spec/media/properties.ts +2 -2
  330. package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
  331. package/test/unit/spec/meeting/index.js +5750 -2023
  332. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  333. package/test/unit/spec/meeting/muteState.js +408 -208
  334. package/test/unit/spec/meeting/request.js +483 -49
  335. package/test/unit/spec/meeting/utils.js +679 -64
  336. package/test/unit/spec/meeting-info/index.js +300 -0
  337. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  338. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  339. package/test/unit/spec/meetings/collection.js +26 -0
  340. package/test/unit/spec/meetings/index.js +1231 -212
  341. package/test/unit/spec/meetings/utils.js +202 -2
  342. package/test/unit/spec/member/index.js +61 -6
  343. package/test/unit/spec/member/util.js +510 -34
  344. package/test/unit/spec/members/index.js +432 -1
  345. package/test/unit/spec/members/request.js +206 -27
  346. package/test/unit/spec/members/utils.js +210 -0
  347. package/test/unit/spec/metrics/index.js +1 -50
  348. package/test/unit/spec/multistream/mediaRequestManager.ts +776 -162
  349. package/test/unit/spec/multistream/receiveSlot.ts +28 -20
  350. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  351. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  352. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  353. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  354. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  355. package/test/unit/spec/reachability/index.ts +549 -9
  356. package/test/unit/spec/reachability/request.js +68 -0
  357. package/test/unit/spec/reconnection-manager/index.js +117 -11
  358. package/test/unit/spec/recording-controller/index.js +294 -218
  359. package/test/unit/spec/recording-controller/util.js +223 -96
  360. package/test/unit/spec/roap/index.ts +178 -64
  361. package/test/unit/spec/roap/request.ts +203 -85
  362. package/test/unit/spec/roap/turnDiscovery.ts +82 -36
  363. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  364. package/test/unit/spec/stats-analyzer/index.js +147 -3
  365. package/test/unit/spec/webinar/collection.ts +13 -0
  366. package/test/unit/spec/webinar/index.ts +60 -0
  367. package/test/utils/integrationTestUtils.js +46 -0
  368. package/test/utils/testUtils.js +0 -52
  369. package/dist/meeting/effectsState.js +0 -262
  370. package/dist/meeting/effectsState.js.map +0 -1
  371. package/dist/metrics/config.js +0 -299
  372. package/dist/metrics/config.js.map +0 -1
  373. package/dist/types/meeting/effectsState.d.ts +0 -42
  374. package/dist/types/metrics/config.d.ts +0 -178
  375. package/src/index.js +0 -16
  376. package/src/meeting/effectsState.ts +0 -211
  377. package/src/metrics/config.ts +0 -495
  378. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -28,6 +28,7 @@ import {
28
28
  getVideoSenderMqa,
29
29
  getVideoReceiverMqa,
30
30
  } from './mqaUtil';
31
+ import {ReceiveSlot} from '../multistream/receiveSlot';
31
32
 
32
33
  export const EVENTS = {
33
34
  MEDIA_QUALITY: 'MEDIA_QUALITY',
@@ -53,6 +54,8 @@ const emptyReceiver = {
53
54
  meanRoundTripTime: [],
54
55
  };
55
56
 
57
+ type ReceiveSlotCallback = (csi: number) => ReceiveSlot | undefined;
58
+
56
59
  /**
57
60
  * Stats Analyzer class that will emit events based on detected quality
58
61
  *
@@ -74,17 +77,21 @@ export class StatsAnalyzer extends EventsScope {
74
77
  statsInterval: NodeJS.Timeout;
75
78
  statsResults: any;
76
79
  statsStarted: any;
80
+ successfulCandidatePair: any;
81
+ receiveSlotCallback: ReceiveSlotCallback;
77
82
 
78
83
  /**
79
84
  * Creates a new instance of StatsAnalyzer
80
85
  * @constructor
81
86
  * @public
82
87
  * @param {Object} config SDK Configuration Object
88
+ * @param {Function} receiveSlotCallback Callback used to access receive slots.
83
89
  * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
84
90
  * @param {Object} statsResults Default properties for stats
85
91
  */
86
92
  constructor(
87
93
  config: any,
94
+ receiveSlotCallback: ReceiveSlotCallback = () => undefined,
88
95
  networkQualityMonitor: object = {},
89
96
  statsResults: object = defaultStats
90
97
  ) {
@@ -96,8 +103,10 @@ export class StatsAnalyzer extends EventsScope {
96
103
  this.networkQualityMonitor = networkQualityMonitor;
97
104
  this.correlationId = config.correlationId;
98
105
  this.mqaSentCount = -1;
99
- this.lastMqaDataSent = {};
106
+ this.lastMqaDataSent = {resolutions: {}};
100
107
  this.lastEmittedStartStopEvent = {};
108
+ this.receiveSlotCallback = receiveSlotCallback;
109
+ this.successfulCandidatePair = {};
101
110
  }
102
111
 
103
112
  /**
@@ -143,6 +152,21 @@ export class StatsAnalyzer extends EventsScope {
143
152
  const newMqa = cloneDeep(emptyMqaInterval);
144
153
 
145
154
  Object.keys(this.statsResults).forEach((mediaType) => {
155
+ if (!this.lastMqaDataSent[mediaType]) {
156
+ this.lastMqaDataSent[mediaType] = {};
157
+ this.lastMqaDataSent.resolutions[mediaType] = {};
158
+ }
159
+
160
+ if (!this.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {
161
+ this.lastMqaDataSent[mediaType].send = {};
162
+ this.lastMqaDataSent.resolutions[mediaType].send = {};
163
+ }
164
+
165
+ if (!this.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {
166
+ this.lastMqaDataSent[mediaType].recv = {};
167
+ this.lastMqaDataSent.resolutions[mediaType].recv = {};
168
+ }
169
+
146
170
  if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {
147
171
  const audioSender = cloneDeep(emptyAudioTransmit);
148
172
 
@@ -153,6 +177,8 @@ export class StatsAnalyzer extends EventsScope {
153
177
  mediaType,
154
178
  });
155
179
  newMqa.audioTransmit.push(audioSender);
180
+
181
+ this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);
156
182
  } else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {
157
183
  const audioReceiver = cloneDeep(emptyAudioReceive);
158
184
 
@@ -163,6 +189,8 @@ export class StatsAnalyzer extends EventsScope {
163
189
  mediaType,
164
190
  });
165
191
  newMqa.audioReceive.push(audioReceiver);
192
+
193
+ this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);
166
194
  } else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {
167
195
  const videoSender = cloneDeep(emptyVideoTransmit);
168
196
 
@@ -173,6 +201,11 @@ export class StatsAnalyzer extends EventsScope {
173
201
  mediaType,
174
202
  });
175
203
  newMqa.videoTransmit.push(videoSender);
204
+
205
+ this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);
206
+ this.lastMqaDataSent.resolutions[mediaType].send = cloneDeep(
207
+ this.statsResults.resolutions[mediaType].send
208
+ );
176
209
  } else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {
177
210
  const videoReceiver = cloneDeep(emptyVideoReceive);
178
211
 
@@ -183,24 +216,27 @@ export class StatsAnalyzer extends EventsScope {
183
216
  mediaType,
184
217
  });
185
218
  newMqa.videoReceive.push(videoReceiver);
219
+
220
+ this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);
221
+ this.lastMqaDataSent.resolutions[mediaType].recv = cloneDeep(
222
+ this.statsResults.resolutions[mediaType].recv
223
+ );
186
224
  }
187
225
  });
188
226
 
189
- newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];
227
+ newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
190
228
 
191
229
  // Adding peripheral information
192
- newMqa.intervalMetadata.peripherals = [];
193
-
194
230
  newMqa.intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});
195
231
  if (this.statsResults['audio-send']) {
196
232
  newMqa.intervalMetadata.peripherals.push({
197
- information: this.statsResults['audio-send']?.trackLabel,
233
+ information: this.statsResults['audio-send'].trackLabel || _UNKNOWN_,
198
234
  name: MEDIA_DEVICES.MICROPHONE,
199
235
  });
200
236
  }
201
237
  if (this.statsResults['video-send']) {
202
238
  newMqa.intervalMetadata.peripherals.push({
203
- information: this.statsResults['video-send']?.trackLabel,
239
+ information: this.statsResults['video-send'].trackLabel || _UNKNOWN_,
204
240
  name: MEDIA_DEVICES.CAMERA,
205
241
  });
206
242
  }
@@ -293,7 +329,6 @@ export class StatsAnalyzer extends EventsScope {
293
329
  this.mediaConnection = null;
294
330
  });
295
331
  }
296
- this.mediaConnection = null;
297
332
 
298
333
  return Promise.resolve();
299
334
  }
@@ -386,6 +421,13 @@ export class StatsAnalyzer extends EventsScope {
386
421
  filterAndParseGetStatsResults(statsItem: any, type: string, isSender: boolean) {
387
422
  const {types} = DEFAULT_GET_STATS_FILTER;
388
423
 
424
+ // get the successful candidate pair before parsing stats.
425
+ statsItem.report.forEach((report) => {
426
+ if (report.type === 'candidate-pair' && report.state === 'succeeded') {
427
+ this.successfulCandidatePair = report;
428
+ }
429
+ });
430
+
389
431
  statsItem.report.forEach((result) => {
390
432
  if (types.includes(result.type)) {
391
433
  this.parseGetStatsResult(result, type, isSender);
@@ -396,6 +438,8 @@ export class StatsAnalyzer extends EventsScope {
396
438
  this.statsResults[type].direction = statsItem.currentDirection;
397
439
  this.statsResults[type].trackLabel = statsItem.localTrackLabel;
398
440
  this.statsResults[type].csi = statsItem.csi;
441
+ // reset the successful candidate pair.
442
+ this.successfulCandidatePair = {};
399
443
  }
400
444
  }
401
445
 
@@ -492,23 +536,23 @@ export class StatsAnalyzer extends EventsScope {
492
536
  const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>
493
537
  Object.keys(this.statsResults)
494
538
  .filter((key) => key.startsWith(keyPrefix))
495
- .reduce((prev, cur) => prev + (this.statsResults[cur].recv[value] || 0), 0);
539
+ .reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);
496
540
 
497
541
  const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>
498
542
  Object.keys(this.statsResults)
499
543
  .filter((key) => key.startsWith(keyPrefix))
500
- .reduce((prev, cur) => prev + (this.lastStatsResults[cur].recv[value] || 0), 0);
544
+ .reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);
501
545
 
502
546
  const getCurrentResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
503
547
  Object.keys(this.statsResults)
504
548
  .filter((key) => key.startsWith(keyPrefix))
505
- .reduce((prev, cur) => prev + (this.statsResults.resolutions[cur].recv[value] || 0), 0);
549
+ .reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]?.recv[value] || 0), 0);
506
550
 
507
551
  const getPreviousResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
508
552
  Object.keys(this.statsResults)
509
553
  .filter((key) => key.startsWith(keyPrefix))
510
554
  .reduce(
511
- (prev, cur) => prev + (this.lastStatsResults.resolutions[cur].recv[value] || 0),
555
+ (prev, cur) => prev + (this.lastStatsResults.resolutions[cur]?.recv[value] || 0),
512
556
  0
513
557
  );
514
558
 
@@ -523,7 +567,8 @@ export class StatsAnalyzer extends EventsScope {
523
567
  currentStats.totalPacketsSent === 0
524
568
  ) {
525
569
  LoggerProxy.logger.info(
526
- `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`
570
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,
571
+ currentStats.totalPacketsSent
527
572
  );
528
573
  } else {
529
574
  if (
@@ -531,7 +576,8 @@ export class StatsAnalyzer extends EventsScope {
531
576
  currentStats.totalAudioEnergy === 0
532
577
  ) {
533
578
  LoggerProxy.logger.info(
534
- `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`
579
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,
580
+ currentStats.totalAudioEnergy
535
581
  );
536
582
  }
537
583
 
@@ -565,14 +611,16 @@ export class StatsAnalyzer extends EventsScope {
565
611
 
566
612
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
567
613
  LoggerProxy.logger.info(
568
- `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`
614
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`,
615
+ currentPacketsReceived
569
616
  );
570
617
  } else if (
571
618
  currentSamplesReceived === previousSamplesReceived ||
572
619
  currentSamplesReceived === 0
573
620
  ) {
574
621
  LoggerProxy.logger.info(
575
- `StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`
622
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`,
623
+ currentSamplesReceived
576
624
  );
577
625
  }
578
626
 
@@ -589,7 +637,8 @@ export class StatsAnalyzer extends EventsScope {
589
637
  currentStats.totalPacketsSent === 0
590
638
  ) {
591
639
  LoggerProxy.logger.info(
592
- `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`
640
+ `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,
641
+ currentStats.totalPacketsSent
593
642
  );
594
643
  } else {
595
644
  if (
@@ -597,7 +646,8 @@ export class StatsAnalyzer extends EventsScope {
597
646
  currentStats.framesEncoded === 0
598
647
  ) {
599
648
  LoggerProxy.logger.info(
600
- `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`
649
+ `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,
650
+ currentStats.framesEncoded
601
651
  );
602
652
  }
603
653
 
@@ -607,7 +657,8 @@ export class StatsAnalyzer extends EventsScope {
607
657
  this.statsResults.resolutions['video-send'].send.framesSent === 0
608
658
  ) {
609
659
  LoggerProxy.logger.info(
610
- `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`
660
+ `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,
661
+ this.statsResults.resolutions['video-send'].send.framesSent
611
662
  );
612
663
  }
613
664
  }
@@ -643,24 +694,28 @@ export class StatsAnalyzer extends EventsScope {
643
694
 
644
695
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
645
696
  LoggerProxy.logger.info(
646
- `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`
697
+ `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`,
698
+ currentPacketsReceived
647
699
  );
648
700
  } else {
649
701
  if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
650
702
  LoggerProxy.logger.info(
651
- `StatsAnalyzer:index#compareLastStatsResult --> No video frames received`
703
+ `StatsAnalyzer:index#compareLastStatsResult --> No video frames received`,
704
+ currentFramesReceived
652
705
  );
653
706
  }
654
707
 
655
708
  if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
656
709
  LoggerProxy.logger.info(
657
- `StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`
710
+ `StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`,
711
+ currentFramesDecoded
658
712
  );
659
713
  }
660
714
 
661
715
  if (currentFramesDropped - previousFramesDropped > 10) {
662
716
  LoggerProxy.logger.info(
663
- `StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`
717
+ `StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`,
718
+ currentFramesDropped - previousFramesDropped
664
719
  );
665
720
  }
666
721
  }
@@ -679,7 +734,8 @@ export class StatsAnalyzer extends EventsScope {
679
734
  currentStats.totalPacketsSent === 0
680
735
  ) {
681
736
  LoggerProxy.logger.info(
682
- `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`
737
+ `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,
738
+ currentStats.totalPacketsSent
683
739
  );
684
740
  } else {
685
741
  if (
@@ -687,7 +743,8 @@ export class StatsAnalyzer extends EventsScope {
687
743
  currentStats.framesEncoded === 0
688
744
  ) {
689
745
  LoggerProxy.logger.info(
690
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`
746
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,
747
+ currentStats.framesEncoded
691
748
  );
692
749
  }
693
750
 
@@ -697,7 +754,8 @@ export class StatsAnalyzer extends EventsScope {
697
754
  this.statsResults.resolutions['video-share-send'].send.framesSent === 0
698
755
  ) {
699
756
  LoggerProxy.logger.info(
700
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`
757
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,
758
+ this.statsResults.resolutions['video-share-send'].send.framesSent
701
759
  );
702
760
  }
703
761
  }
@@ -735,24 +793,28 @@ export class StatsAnalyzer extends EventsScope {
735
793
 
736
794
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
737
795
  LoggerProxy.logger.info(
738
- `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`
796
+ `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`,
797
+ currentPacketsReceived
739
798
  );
740
799
  } else {
741
800
  if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
742
801
  LoggerProxy.logger.info(
743
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames received`
802
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames received`,
803
+ currentFramesReceived
744
804
  );
745
805
  }
746
806
 
747
807
  if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
748
808
  LoggerProxy.logger.info(
749
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`
809
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`,
810
+ currentFramesDecoded
750
811
  );
751
812
  }
752
813
 
753
814
  if (currentFramesDropped - previousFramesDropped > 10) {
754
815
  LoggerProxy.logger.info(
755
- `StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`
816
+ `StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`,
817
+ currentFramesDropped - previousFramesDropped
756
818
  );
757
819
  }
758
820
  }
@@ -853,6 +915,14 @@ export class StatsAnalyzer extends EventsScope {
853
915
  if (result.bytesSent) {
854
916
  let kilobytes = 0;
855
917
 
918
+ if (result.frameWidth && result.frameHeight) {
919
+ this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
920
+ this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
921
+ this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
922
+ this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent =
923
+ result.hugeFramesSent;
924
+ }
925
+
856
926
  if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
857
927
  this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
858
928
  }
@@ -925,6 +995,17 @@ export class StatsAnalyzer extends EventsScope {
925
995
 
926
996
  if (result.bytesReceived) {
927
997
  let kilobytes = 0;
998
+ const receiveSlot = this.receiveSlotCallback(result.ssrc);
999
+ const idAndCsi = receiveSlot
1000
+ ? `id: "${receiveSlot.id || ''}"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`
1001
+ : '';
1002
+
1003
+ if (result.frameWidth && result.frameHeight) {
1004
+ this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
1005
+ this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
1006
+ this.statsResults.resolutions[mediaType][sendrecvType].framesReceived =
1007
+ result.framesReceived;
1008
+ }
928
1009
 
929
1010
  if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
930
1011
  this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
@@ -974,10 +1055,12 @@ export class StatsAnalyzer extends EventsScope {
974
1055
  result.packetsReceived;
975
1056
 
976
1057
  if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
977
- LoggerProxy.logger.info(
978
- `StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `,
979
- this.statsResults[mediaType][sendrecvType].packetsReceived
980
- );
1058
+ if (receiveSlot) {
1059
+ LoggerProxy.logger.info(
1060
+ `StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,
1061
+ this.statsResults[mediaType][sendrecvType].packetsReceived
1062
+ );
1063
+ }
981
1064
  }
982
1065
 
983
1066
  // Check the over all packet Lost ratio
@@ -989,7 +1072,7 @@ export class StatsAnalyzer extends EventsScope {
989
1072
  : 0;
990
1073
  if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
991
1074
  LoggerProxy.logger.info(
992
- 'StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ',
1075
+ `StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,
993
1076
  this.statsResults[mediaType][sendrecvType].currentPacketLossRatio
994
1077
  );
995
1078
  }
@@ -1049,73 +1132,40 @@ export class StatsAnalyzer extends EventsScope {
1049
1132
  if (!result || !result.id) {
1050
1133
  return;
1051
1134
  }
1052
- const RemoteCandidateType = {};
1053
- const RemoteTransport = {};
1054
- const RemoteIpAddress = {};
1055
- const RemoteNetworkType = {};
1056
-
1057
- if (!result.id) return;
1058
-
1059
- const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
1060
- const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
1061
-
1062
- if (!RemoteCandidateType[result.id]) {
1063
- RemoteCandidateType[result.id] = [];
1064
- }
1065
-
1066
- if (!RemoteTransport[result.id]) {
1067
- RemoteTransport[result.id] = [];
1068
- }
1069
-
1070
- if (!RemoteIpAddress[result.id]) {
1071
- RemoteIpAddress[result.id] = [];
1072
- }
1073
- if (!RemoteNetworkType[result.id]) {
1074
- RemoteNetworkType[result.id] = [];
1075
- }
1076
1135
 
1077
- if (
1078
- result.candidateType &&
1079
- RemoteCandidateType[result.id].indexOf(result.candidateType) === -1
1080
- ) {
1081
- RemoteCandidateType[result.id].push(result.candidateType);
1082
- }
1083
-
1084
- if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {
1085
- RemoteTransport[result.id].push(result.protocol.toUpperCase());
1136
+ // We only care about the successful local candidate
1137
+ if (this.successfulCandidatePair?.localCandidateId !== result.id) {
1138
+ return;
1086
1139
  }
1087
1140
 
1088
- if (
1089
- result.ip &&
1090
- RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1
1091
- ) {
1092
- RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports
1141
+ let transport;
1142
+ if (result.relayProtocol) {
1143
+ transport = result.relayProtocol.toUpperCase();
1144
+ } else if (result.protocol) {
1145
+ transport = result.protocol.toUpperCase();
1093
1146
  }
1094
1147
 
1095
- if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {
1096
- RemoteNetworkType[result.id].push(result.networkType);
1097
- }
1148
+ const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
1149
+ const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
1098
1150
 
1099
1151
  this.statsResults.internal.candidates[result.id] = {
1100
- candidateType: RemoteCandidateType[result.id],
1101
- ipAddress: RemoteIpAddress[result.id],
1152
+ candidateType: result.candidateType,
1153
+ ipAddress: result.ip, // TODO: add ports
1102
1154
  portNumber: result.port,
1103
- networkType: RemoteNetworkType[result.id],
1155
+ networkType: result.networkType,
1104
1156
  priority: result.priority,
1105
- transport: RemoteTransport[result.id],
1157
+ transport,
1106
1158
  timestamp: result.time,
1107
1159
  id: result.id,
1108
1160
  type: result.type,
1109
1161
  };
1110
1162
 
1111
- this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];
1112
- this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];
1163
+ this.statsResults.connectionType[ipType].candidateType = result.candidateType;
1164
+ this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
1113
1165
 
1114
1166
  this.statsResults.connectionType[ipType].networkType =
1115
- RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN
1116
- ? NETWORK_TYPE.UNKNOWN
1117
- : RemoteNetworkType[result.id][0];
1118
- this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
1167
+ result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;
1168
+ this.statsResults.connectionType[ipType].transport = transport;
1119
1169
 
1120
1170
  this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
1121
1171
  };
@@ -1137,13 +1187,6 @@ export class StatsAnalyzer extends EventsScope {
1137
1187
  const sendrecvType =
1138
1188
  result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
1139
1189
 
1140
- if (result.frameWidth && result.frameHeight) {
1141
- this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
1142
- this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
1143
- this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
1144
- this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
1145
- }
1146
-
1147
1190
  if (sendrecvType === STATS.RECEIVE_DIRECTION) {
1148
1191
  this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
1149
1192
  this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
@@ -23,7 +23,7 @@ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSen
23
23
  }
24
24
 
25
25
  audioReceiver.common.common.direction = statsResults[mediaType].direction;
26
- audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
26
+ audioReceiver.common.transportType = statsResults.connectionType.local.transport;
27
27
 
28
28
  // add rtpPacket info inside common as also for call analyzer
29
29
  audioReceiver.common.rtpPackets =
@@ -83,7 +83,7 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, m
83
83
  }
84
84
 
85
85
  audioSender.common.common.direction = statsResults[mediaType].direction;
86
- audioSender.common.transportType = statsResults.connectionType.local.transport[0];
86
+ audioSender.common.transportType = statsResults.connectionType.local.transport;
87
87
 
88
88
  audioSender.common.maxRemoteJitter =
89
89
  // @ts-ignore
@@ -134,9 +134,12 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
134
134
  const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;
135
135
  const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;
136
136
  const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;
137
- const lastFramesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].framesReceived || 0;
138
- const lastFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].framesDecoded || 0;
139
- const lastFramesDropped = lastMqaDataSent[mediaType]?.[sendrecvType].framesDropped || 0;
137
+ const lastFramesReceived =
138
+ lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesReceived || 0;
139
+ const lastFramesDecoded =
140
+ lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesDecoded || 0;
141
+ const lastFramesDropped =
142
+ lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesDropped || 0;
140
143
  const lastKeyFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].keyFramesDecoded || 0;
141
144
  const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;
142
145
 
@@ -146,7 +149,8 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
146
149
  }
147
150
 
148
151
  videoReceiver.common.common.direction = statsResults[mediaType].direction;
149
- videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
152
+ videoReceiver.common.transportType = statsResults.connectionType.local.transport;
153
+
150
154
  // collect the packets received for the last min
151
155
  videoReceiver.common.rtpPackets =
152
156
  statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
@@ -189,22 +193,21 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
189
193
  const totalFrameDecodedInaMin =
190
194
  statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
191
195
 
192
- videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin
193
- ? (totalFrameReceivedInaMin * 100) / 60
194
- : 0;
195
- videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin
196
- ? (totalFrameDecodedInaMin * 100) / 60
197
- : 0;
196
+ videoReceiver.streams[0].common.receivedFrameRate = Math.round(
197
+ totalFrameReceivedInaMin ? totalFrameReceivedInaMin / 60 : 0
198
+ );
199
+ videoReceiver.streams[0].common.renderedFrameRate = Math.round(
200
+ totalFrameDecodedInaMin ? totalFrameDecodedInaMin / 60 : 0
201
+ );
198
202
 
199
203
  videoReceiver.streams[0].common.framesDropped =
200
204
  statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;
201
205
  videoReceiver.streams[0].receivedHeight =
202
- statsResults.resolutions[mediaType][sendrecvType].height;
203
- videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width;
206
+ statsResults.resolutions[mediaType][sendrecvType].height || 0;
207
+ videoReceiver.streams[0].receivedWidth =
208
+ statsResults.resolutions[mediaType][sendrecvType].width || 0;
204
209
  videoReceiver.streams[0].receivedFrameSize =
205
- (statsResults.resolutions[mediaType][sendrecvType].height *
206
- statsResults.resolutions[mediaType][sendrecvType].height) /
207
- 256;
210
+ (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;
208
211
 
209
212
  videoReceiver.streams[0].receivedKeyFrames =
210
213
  statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;
@@ -220,16 +223,16 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
220
223
  lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;
221
224
  const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;
222
225
  const lastKeyFramesEncoded =
223
- lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
226
+ lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
224
227
  const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
225
- const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;
228
+ const lastFramesSent = lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesSent || 0;
226
229
  const {csi} = statsResults[mediaType];
227
230
  if (csi && !videoSender.streams[0].common.csi.includes(csi)) {
228
231
  videoSender.streams[0].common.csi.push(csi);
229
232
  }
230
233
 
231
234
  videoSender.common.common.direction = statsResults[mediaType].direction;
232
- videoSender.common.transportType = statsResults.connectionType.local.transport[0];
235
+ videoSender.common.transportType = statsResults.connectionType.local.transport;
233
236
 
234
237
  // @ts-ignore
235
238
  videoSender.common.maxRemoteJitter =
@@ -280,14 +283,13 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
280
283
  const totalFrameSentInaMin =
281
284
  statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
282
285
 
283
- videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin
284
- ? (totalFrameSentInaMin * 100) / 60
285
- : 0;
286
+ videoSender.streams[0].common.transmittedFrameRate = Math.round(
287
+ totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0
288
+ );
286
289
  videoSender.streams[0].transmittedHeight =
287
- statsResults.resolutions[mediaType][sendrecvType].height;
288
- videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width;
290
+ statsResults.resolutions[mediaType][sendrecvType].height || 0;
291
+ videoSender.streams[0].transmittedWidth =
292
+ statsResults.resolutions[mediaType][sendrecvType].width || 0;
289
293
  videoSender.streams[0].transmittedFrameSize =
290
- (statsResults.resolutions[mediaType][sendrecvType].height *
291
- statsResults.resolutions[mediaType][sendrecvType].width) /
292
- 254;
294
+ (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;
293
295
  };
@@ -0,0 +1,31 @@
1
+ /*!
2
+ * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.
3
+ */
4
+
5
+ import {MEETINGS} from '../constants';
6
+
7
+ class WebinarCollection {
8
+ webinarInfo: any;
9
+
10
+ namespace = MEETINGS;
11
+
12
+ mainIndex = 'sessionId';
13
+
14
+ constructor() {
15
+ this.webinarInfo = {};
16
+ }
17
+
18
+ set(id, info) {
19
+ this.webinarInfo[id] = info;
20
+ }
21
+
22
+ /**
23
+ * @param {String} id
24
+ * @returns {Member}
25
+ */
26
+ get(id: string) {
27
+ return this.webinarInfo[id];
28
+ }
29
+ }
30
+
31
+ export default WebinarCollection;