@webex/plugin-meetings 3.0.0-beta.21 → 3.0.0-beta.211

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 (422) hide show
  1. package/README.md +45 -7
  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 +114 -14
  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 +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +3 -2
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +3 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +179 -30
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +319 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +106 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +359 -64
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/infoUtils.js +7 -1
  53. package/dist/locus-info/infoUtils.js.map +1 -1
  54. package/dist/locus-info/mediaSharesUtils.js +43 -1
  55. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  56. package/dist/locus-info/parser.js +219 -63
  57. package/dist/locus-info/parser.js.map +1 -1
  58. package/dist/locus-info/selfUtils.js +89 -14
  59. package/dist/locus-info/selfUtils.js.map +1 -1
  60. package/dist/media/index.js +48 -135
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +29 -90
  63. package/dist/media/properties.js.map +1 -1
  64. package/dist/mediaQualityMetrics/config.js +505 -493
  65. package/dist/mediaQualityMetrics/config.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +90 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +2770 -2547
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +291 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +229 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +199 -193
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +532 -414
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +48 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +171 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/utilv2.js +20 -5
  83. package/dist/meeting-info/utilv2.js.map +1 -1
  84. package/dist/meetings/collection.js +22 -0
  85. package/dist/meetings/collection.js.map +1 -1
  86. package/dist/meetings/index.js +357 -66
  87. package/dist/meetings/index.js.map +1 -1
  88. package/dist/meetings/meetings.types.js +7 -0
  89. package/dist/meetings/meetings.types.js.map +1 -0
  90. package/dist/meetings/request.js +2 -0
  91. package/dist/meetings/request.js.map +1 -1
  92. package/dist/meetings/util.js +88 -1
  93. package/dist/meetings/util.js.map +1 -1
  94. package/dist/member/index.js +49 -0
  95. package/dist/member/index.js.map +1 -1
  96. package/dist/member/types.js +25 -0
  97. package/dist/member/types.js.map +1 -0
  98. package/dist/member/util.js +121 -25
  99. package/dist/member/util.js.map +1 -1
  100. package/dist/members/collection.js +10 -0
  101. package/dist/members/collection.js.map +1 -1
  102. package/dist/members/index.js +86 -5
  103. package/dist/members/index.js.map +1 -1
  104. package/dist/members/request.js +106 -38
  105. package/dist/members/request.js.map +1 -1
  106. package/dist/members/types.js +15 -0
  107. package/dist/members/types.js.map +1 -0
  108. package/dist/members/util.js +316 -233
  109. package/dist/members/util.js.map +1 -1
  110. package/dist/metrics/constants.js +3 -5
  111. package/dist/metrics/constants.js.map +1 -1
  112. package/dist/metrics/index.js +1 -468
  113. package/dist/metrics/index.js.map +1 -1
  114. package/dist/multistream/mediaRequestManager.js +238 -49
  115. package/dist/multistream/mediaRequestManager.js.map +1 -1
  116. package/dist/multistream/receiveSlot.js +49 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +52 -34
  119. package/dist/multistream/receiveSlotManager.js.map +1 -1
  120. package/dist/multistream/remoteMedia.js +44 -18
  121. package/dist/multistream/remoteMedia.js.map +1 -1
  122. package/dist/multistream/remoteMediaGroup.js +60 -3
  123. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  124. package/dist/multistream/remoteMediaManager.js +173 -59
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/networkQualityMonitor/index.js +4 -2
  127. package/dist/networkQualityMonitor/index.js.map +1 -1
  128. package/dist/reachability/index.js +72 -27
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +12 -5
  131. package/dist/reachability/request.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +196 -155
  133. package/dist/reconnection-manager/index.js.map +1 -1
  134. package/dist/recording-controller/index.js +21 -2
  135. package/dist/recording-controller/index.js.map +1 -1
  136. package/dist/recording-controller/util.js +9 -8
  137. package/dist/recording-controller/util.js.map +1 -1
  138. package/dist/roap/index.js +21 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +110 -89
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +93 -36
  143. package/dist/roap/turnDiscovery.js.map +1 -1
  144. package/dist/rtcMetrics/constants.js +12 -0
  145. package/dist/rtcMetrics/constants.js.map +1 -0
  146. package/dist/rtcMetrics/index.js +117 -0
  147. package/dist/rtcMetrics/index.js.map +1 -0
  148. package/dist/statsAnalyzer/global.js +1 -93
  149. package/dist/statsAnalyzer/global.js.map +1 -1
  150. package/dist/statsAnalyzer/index.js +326 -311
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  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/breakout.d.ts +8 -0
  158. package/dist/types/breakouts/collection.d.ts +5 -0
  159. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  160. package/dist/types/breakouts/events.d.ts +8 -0
  161. package/dist/types/breakouts/index.d.ts +5 -0
  162. package/dist/types/breakouts/request.d.ts +22 -0
  163. package/dist/types/breakouts/utils.d.ts +15 -0
  164. package/dist/types/common/browser-detection.d.ts +9 -0
  165. package/dist/types/common/collection.d.ts +48 -0
  166. package/dist/types/common/config.d.ts +2 -0
  167. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  168. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  169. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  170. package/dist/types/common/errors/media.d.ts +15 -0
  171. package/dist/types/common/errors/parameter.d.ts +15 -0
  172. package/dist/types/common/errors/password-error.d.ts +15 -0
  173. package/dist/types/common/errors/permission.d.ts +14 -0
  174. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  175. package/dist/types/common/errors/reconnection.d.ts +15 -0
  176. package/dist/types/common/errors/stats.d.ts +15 -0
  177. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  178. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  179. package/dist/types/common/events/events-scope.d.ts +17 -0
  180. package/dist/types/common/events/events.d.ts +12 -0
  181. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  182. package/dist/types/common/events/util.d.ts +2 -0
  183. package/dist/types/common/logs/logger-config.d.ts +2 -0
  184. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  185. package/dist/types/common/logs/request.d.ts +34 -0
  186. package/dist/types/common/queue.d.ts +34 -0
  187. package/dist/types/config.d.ts +72 -0
  188. package/dist/types/constants.d.ts +1020 -0
  189. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  190. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  191. package/dist/types/controls-options-manager/index.d.ts +136 -0
  192. package/dist/types/controls-options-manager/types.d.ts +43 -0
  193. package/dist/types/controls-options-manager/util.d.ts +1 -0
  194. package/dist/types/index.d.ts +7 -0
  195. package/dist/types/interpretation/collection.d.ts +5 -0
  196. package/dist/types/interpretation/index.d.ts +5 -0
  197. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  198. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  199. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  200. package/dist/types/locus-info/fullState.d.ts +2 -0
  201. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  202. package/dist/types/locus-info/index.d.ts +322 -0
  203. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  204. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  205. package/dist/types/locus-info/parser.d.ts +271 -0
  206. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  207. package/dist/types/media/index.d.ts +34 -0
  208. package/dist/types/media/properties.d.ts +93 -0
  209. package/dist/types/media/util.d.ts +2 -0
  210. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  211. package/dist/types/meeting/in-meeting-actions.d.ts +163 -0
  212. package/dist/types/meeting/index.d.ts +1482 -0
  213. package/dist/types/meeting/locusMediaRequest.d.ts +72 -0
  214. package/dist/types/meeting/muteState.d.ts +184 -0
  215. package/dist/types/meeting/request.d.ts +257 -0
  216. package/dist/types/meeting/request.type.d.ts +11 -0
  217. package/dist/types/meeting/state.d.ts +9 -0
  218. package/dist/types/meeting/util.d.ts +79 -0
  219. package/dist/types/meeting-info/collection.d.ts +20 -0
  220. package/dist/types/meeting-info/index.d.ts +62 -0
  221. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  222. package/dist/types/meeting-info/request.d.ts +22 -0
  223. package/dist/types/meeting-info/util.d.ts +2 -0
  224. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  225. package/dist/types/meetings/collection.d.ts +31 -0
  226. package/dist/types/meetings/index.d.ts +367 -0
  227. package/dist/types/meetings/meetings.types.d.ts +4 -0
  228. package/dist/types/meetings/request.d.ts +27 -0
  229. package/dist/types/meetings/util.d.ts +18 -0
  230. package/dist/types/member/index.d.ts +159 -0
  231. package/dist/types/member/types.d.ts +32 -0
  232. package/dist/types/member/util.d.ts +2 -0
  233. package/dist/types/members/collection.d.ts +29 -0
  234. package/dist/types/members/index.d.ts +353 -0
  235. package/dist/types/members/request.d.ts +114 -0
  236. package/dist/types/members/types.d.ts +24 -0
  237. package/dist/types/members/util.d.ts +210 -0
  238. package/dist/types/metrics/constants.d.ts +55 -0
  239. package/dist/types/metrics/index.d.ts +45 -0
  240. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  241. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  242. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  243. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  244. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  245. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  246. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  247. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  248. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  249. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  250. package/dist/types/reachability/index.d.ts +152 -0
  251. package/dist/types/reachability/request.d.ts +37 -0
  252. package/dist/types/reactions/constants.d.ts +3 -0
  253. package/dist/types/reactions/reactions.d.ts +4 -0
  254. package/dist/types/reactions/reactions.type.d.ts +52 -0
  255. package/dist/types/reconnection-manager/index.d.ts +126 -0
  256. package/dist/types/recording-controller/enums.d.ts +7 -0
  257. package/dist/types/recording-controller/index.d.ts +207 -0
  258. package/dist/types/recording-controller/util.d.ts +14 -0
  259. package/dist/types/roap/index.d.ts +77 -0
  260. package/dist/types/roap/request.d.ts +36 -0
  261. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  262. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  263. package/dist/types/rtcMetrics/index.d.ts +46 -0
  264. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  265. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  266. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  267. package/dist/types/transcription/index.d.ts +64 -0
  268. package/package.json +23 -20
  269. package/src/annotation/annotation.types.ts +50 -0
  270. package/src/annotation/constants.ts +36 -0
  271. package/src/annotation/index.ts +328 -0
  272. package/src/breakouts/README.md +44 -14
  273. package/src/breakouts/breakout.ts +87 -9
  274. package/src/breakouts/edit-lock-error.ts +25 -0
  275. package/src/breakouts/events.ts +56 -0
  276. package/src/breakouts/index.ts +710 -10
  277. package/src/breakouts/request.ts +55 -0
  278. package/src/breakouts/utils.ts +57 -0
  279. package/src/common/errors/webex-errors.ts +6 -2
  280. package/src/common/logs/logger-proxy.ts +1 -1
  281. package/src/common/queue.ts +22 -8
  282. package/src/config.ts +2 -7
  283. package/src/constants.ts +165 -21
  284. package/src/controls-options-manager/constants.ts +5 -0
  285. package/src/controls-options-manager/enums.ts +18 -0
  286. package/src/controls-options-manager/index.ts +278 -0
  287. package/src/controls-options-manager/types.ts +59 -0
  288. package/src/controls-options-manager/util.ts +300 -0
  289. package/src/index.ts +39 -0
  290. package/src/interpretation/README.md +60 -0
  291. package/src/interpretation/collection.ts +19 -0
  292. package/src/interpretation/index.ts +332 -0
  293. package/src/interpretation/siLanguage.ts +18 -0
  294. package/src/locus-info/controlsUtils.ts +108 -0
  295. package/src/locus-info/index.ts +383 -61
  296. package/src/locus-info/infoUtils.ts +10 -2
  297. package/src/locus-info/mediaSharesUtils.ts +48 -0
  298. package/src/locus-info/parser.ts +224 -39
  299. package/src/locus-info/selfUtils.ts +81 -5
  300. package/src/media/index.ts +87 -140
  301. package/src/media/properties.ts +49 -90
  302. package/src/mediaQualityMetrics/config.ts +379 -377
  303. package/src/meeting/in-meeting-actions.ts +179 -3
  304. package/src/meeting/index.ts +2099 -2083
  305. package/src/meeting/locusMediaRequest.ts +311 -0
  306. package/src/meeting/muteState.ts +228 -132
  307. package/src/meeting/request.ts +105 -115
  308. package/src/meeting/util.ts +511 -397
  309. package/src/meeting-info/index.ts +54 -8
  310. package/src/meeting-info/meeting-info-v2.ts +148 -14
  311. package/src/meeting-info/utilv2.ts +13 -3
  312. package/src/meetings/collection.ts +20 -0
  313. package/src/meetings/index.ts +392 -84
  314. package/src/meetings/meetings.types.ts +12 -0
  315. package/src/meetings/request.ts +2 -0
  316. package/src/meetings/util.ts +103 -4
  317. package/src/member/index.ts +49 -0
  318. package/src/member/types.ts +38 -0
  319. package/src/member/util.ts +127 -25
  320. package/src/members/collection.ts +8 -0
  321. package/src/members/index.ts +107 -6
  322. package/src/members/request.ts +97 -17
  323. package/src/members/types.ts +28 -0
  324. package/src/members/util.ts +319 -240
  325. package/src/metrics/constants.ts +2 -4
  326. package/src/metrics/index.ts +1 -490
  327. package/src/multistream/mediaRequestManager.ts +289 -79
  328. package/src/multistream/receiveSlot.ts +55 -18
  329. package/src/multistream/receiveSlotManager.ts +46 -24
  330. package/src/multistream/remoteMedia.ts +27 -2
  331. package/src/multistream/remoteMediaGroup.ts +59 -0
  332. package/src/multistream/remoteMediaManager.ts +113 -32
  333. package/src/networkQualityMonitor/index.ts +6 -6
  334. package/src/reachability/index.ts +62 -15
  335. package/src/reachability/request.ts +10 -5
  336. package/src/reconnection-manager/index.ts +68 -43
  337. package/src/recording-controller/index.ts +20 -3
  338. package/src/recording-controller/util.ts +26 -9
  339. package/src/roap/index.ts +21 -30
  340. package/src/roap/request.ts +101 -95
  341. package/src/roap/turnDiscovery.ts +47 -25
  342. package/src/rtcMetrics/constants.ts +3 -0
  343. package/src/rtcMetrics/index.ts +100 -0
  344. package/src/statsAnalyzer/global.ts +1 -94
  345. package/src/statsAnalyzer/index.ts +376 -386
  346. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  347. package/test/integration/spec/converged-space-meetings.js +233 -0
  348. package/test/integration/spec/journey.js +336 -259
  349. package/test/integration/spec/space-meeting.js +77 -4
  350. package/test/unit/spec/annotation/index.ts +418 -0
  351. package/test/unit/spec/breakouts/breakout.ts +142 -24
  352. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  353. package/test/unit/spec/breakouts/events.ts +89 -0
  354. package/test/unit/spec/breakouts/index.ts +1545 -48
  355. package/test/unit/spec/breakouts/request.ts +104 -0
  356. package/test/unit/spec/breakouts/utils.js +72 -0
  357. package/test/unit/spec/common/queue.js +31 -2
  358. package/test/unit/spec/controls-options-manager/index.js +287 -0
  359. package/test/unit/spec/controls-options-manager/util.js +582 -0
  360. package/test/unit/spec/fixture/locus.js +1 -0
  361. package/test/unit/spec/interpretation/collection.ts +15 -0
  362. package/test/unit/spec/interpretation/index.ts +589 -0
  363. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  364. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  365. package/test/unit/spec/locus-info/index.js +1169 -36
  366. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  367. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  368. package/test/unit/spec/locus-info/parser.js +62 -22
  369. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  370. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  371. package/test/unit/spec/media/index.ts +138 -28
  372. package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
  373. package/test/unit/spec/meeting/index.js +3573 -1663
  374. package/test/unit/spec/meeting/locusMediaRequest.ts +438 -0
  375. package/test/unit/spec/meeting/muteState.js +370 -208
  376. package/test/unit/spec/meeting/request.js +339 -44
  377. package/test/unit/spec/meeting/utils.js +456 -53
  378. package/test/unit/spec/meeting-info/index.js +181 -0
  379. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  380. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  381. package/test/unit/spec/meetings/collection.js +14 -0
  382. package/test/unit/spec/meetings/index.js +867 -125
  383. package/test/unit/spec/meetings/utils.js +206 -2
  384. package/test/unit/spec/member/index.js +58 -4
  385. package/test/unit/spec/member/util.js +479 -35
  386. package/test/unit/spec/members/index.js +319 -1
  387. package/test/unit/spec/members/request.js +206 -27
  388. package/test/unit/spec/members/utils.js +184 -0
  389. package/test/unit/spec/metrics/index.js +1 -50
  390. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  391. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  392. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  393. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  394. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  395. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  396. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  397. package/test/unit/spec/reachability/index.ts +125 -8
  398. package/test/unit/spec/reachability/request.js +66 -0
  399. package/test/unit/spec/reconnection-manager/index.js +59 -6
  400. package/test/unit/spec/recording-controller/index.js +294 -218
  401. package/test/unit/spec/recording-controller/util.js +223 -96
  402. package/test/unit/spec/roap/index.ts +26 -51
  403. package/test/unit/spec/roap/request.ts +196 -85
  404. package/test/unit/spec/roap/turnDiscovery.ts +30 -7
  405. package/test/unit/spec/rtcMetrics/index.ts +60 -0
  406. package/test/unit/spec/stats-analyzer/index.js +92 -41
  407. package/test/utils/constants.js +9 -0
  408. package/test/utils/integrationTestUtils.js +46 -0
  409. package/test/utils/testUtils.js +0 -45
  410. package/test/utils/webex-config.js +4 -0
  411. package/test/utils/webex-test-users.js +6 -3
  412. package/dist/meeting/effectsState.js +0 -262
  413. package/dist/meeting/effectsState.js.map +0 -1
  414. package/dist/metrics/config.js +0 -299
  415. package/dist/metrics/config.js.map +0 -1
  416. package/dist/multistream/multistreamMedia.js +0 -110
  417. package/dist/multistream/multistreamMedia.js.map +0 -1
  418. package/src/index.js +0 -16
  419. package/src/meeting/effectsState.ts +0 -211
  420. package/src/metrics/config.ts +0 -495
  421. package/src/multistream/multistreamMedia.ts +0 -97
  422. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -7,6 +7,7 @@ _Object$defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
9
  exports.StatsAnalyzer = exports.EVENTS = void 0;
10
+ var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
10
11
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
11
12
  var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
12
13
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
@@ -20,7 +21,7 @@ var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
20
21
  var _internalMediaCore = require("@webex/internal-media-core");
21
22
  var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
22
23
  var _constants = require("../constants");
23
- var _config = _interopRequireDefault(require("../mediaQualityMetrics/config"));
24
+ var _config = require("../mediaQualityMetrics/config");
24
25
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
25
26
  var _global = _interopRequireDefault(require("./global"));
26
27
  var _mqaUtil = require("./mqaUtil");
@@ -33,7 +34,21 @@ var EVENTS = {
33
34
  REMOTE_MEDIA_STARTED: 'REMOTE_MEDIA_STARTED',
34
35
  REMOTE_MEDIA_STOPPED: 'REMOTE_MEDIA_STOPPED'
35
36
  };
36
-
37
+ exports.EVENTS = EVENTS;
38
+ var emptySender = {
39
+ trackLabel: '',
40
+ maxPacketLossRatio: 0,
41
+ availableBandwidth: 0,
42
+ bytesSent: 0,
43
+ meanRemoteJitter: [],
44
+ meanRoundTripTime: []
45
+ };
46
+ var emptyReceiver = {
47
+ availableBandwidth: 0,
48
+ bytesReceived: 0,
49
+ meanRtpJitter: [],
50
+ meanRoundTripTime: []
51
+ };
37
52
  /**
38
53
  * Stats Analyzer class that will emit events based on detected quality
39
54
  *
@@ -41,7 +56,6 @@ var EVENTS = {
41
56
  * @class StatsAnalyzer
42
57
  * @extends {EventsScope}
43
58
  */
44
- exports.EVENTS = EVENTS;
45
59
  var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
46
60
  (0, _inherits2.default)(StatsAnalyzer, _EventsScope);
47
61
  var _super = _createSuper(StatsAnalyzer);
@@ -50,13 +64,17 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
50
64
  * @constructor
51
65
  * @public
52
66
  * @param {Object} config SDK Configuration Object
67
+ * @param {Function} receiveSlotCallback Callback used to access receive slots.
53
68
  * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
54
69
  * @param {Object} statsResults Default properties for stats
55
70
  */
56
71
  function StatsAnalyzer(config) {
57
72
  var _this;
58
- var networkQualityMonitor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
59
- var statsResults = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _global.default;
73
+ var receiveSlotCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
74
+ return undefined;
75
+ };
76
+ var networkQualityMonitor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
77
+ var statsResults = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _global.default;
60
78
  (0, _classCallCheck2.default)(this, StatsAnalyzer);
61
79
  _this = _super.call(this);
62
80
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "config", void 0);
@@ -64,7 +82,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
64
82
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "lastEmittedStartStopEvent", void 0);
65
83
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "lastMqaDataSent", void 0);
66
84
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "lastStatsResults", void 0);
67
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "localMQEStats", void 0);
68
85
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "meetingMediaStatus", void 0);
69
86
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mqaInterval", void 0);
70
87
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mqaSentCount", void 0);
@@ -73,6 +90,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
73
90
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "statsInterval", void 0);
74
91
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "statsResults", void 0);
75
92
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "statsStarted", void 0);
93
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "receiveSlotCallback", void 0);
76
94
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "emitStartStopEvents", function (mediaType, previousValue, currentValue, isLocal) {
77
95
  if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {
78
96
  throw new Error("Unsupported mediaType: ".concat(mediaType));
@@ -82,6 +100,9 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
82
100
  if (previousValue === undefined) previousValue = 0;
83
101
  // eslint-disable-next-line no-param-reassign
84
102
  if (currentValue === undefined) currentValue = 0;
103
+ if (!_this.lastEmittedStartStopEvent[mediaType]) {
104
+ _this.lastEmittedStartStopEvent[mediaType] = {};
105
+ }
85
106
  var lastEmittedEvent = isLocal ? _this.lastEmittedStartStopEvent[mediaType].local : _this.lastEmittedStartStopEvent[mediaType].remote;
86
107
  var newEvent;
87
108
  if (currentValue - previousValue > 0) {
@@ -163,141 +184,32 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
163
184
  _this.networkQualityMonitor = networkQualityMonitor;
164
185
  _this.correlationId = config.correlationId;
165
186
  _this.mqaSentCount = -1;
166
- _this.lastMqaDataSent = {
167
- resolutions: {
168
- video: {
169
- send: {},
170
- recv: {}
171
- },
172
- audio: {
173
- send: {},
174
- recv: {}
175
- },
176
- share: {
177
- send: {},
178
- recv: {}
179
- }
180
- },
181
- video: {
182
- send: {},
183
- recv: {}
184
- },
185
- audio: {
186
- send: {},
187
- recv: {}
188
- },
189
- share: {
190
- send: {},
191
- recv: {}
192
- }
193
- };
194
- _this.localMQEStats = {
195
- audio: {
196
- RX: {
197
- packetsLost: [],
198
- jitter: [],
199
- latency: [],
200
- bitRate: []
201
- },
202
- TX: {
203
- packetsLost: [],
204
- jitter: [],
205
- latency: [],
206
- bitRate: []
207
- }
208
- },
209
- video: {
210
- RX: {
211
- packetsLost: [],
212
- jitter: [],
213
- latency: [],
214
- bitRate: [],
215
- frameRate: [],
216
- resolutionWidth: [],
217
- resolutionHeight: [],
218
- requestedKeyFrame: [],
219
- receivedKeyFrame: []
220
- },
221
- TX: {
222
- packetsLost: [],
223
- jitter: [],
224
- latency: [],
225
- bitRate: [],
226
- frameRate: [],
227
- resolutionWidth: [],
228
- resolutionHeight: [],
229
- requestedKeyFrame: [],
230
- receivedKeyFrame: []
231
- }
232
- }
233
- };
234
- _this.lastEmittedStartStopEvent = {
235
- audio: {
236
- local: undefined,
237
- remote: undefined
238
- },
239
- video: {
240
- local: undefined,
241
- remote: undefined
242
- },
243
- share: {
244
- local: undefined,
245
- remote: undefined
246
- }
247
- };
187
+ _this.lastMqaDataSent = {};
188
+ _this.lastEmittedStartStopEvent = {};
189
+ _this.receiveSlotCallback = receiveSlotCallback;
248
190
  return _this;
249
191
  }
192
+
193
+ /**
194
+ * Resets cumulative stats arrays.
195
+ *
196
+ * @public
197
+ * @memberof StatsAnalyzer
198
+ * @returns {void}
199
+ */
250
200
  (0, _createClass2.default)(StatsAnalyzer, [{
251
- key: "populateResults",
252
- value: function populateResults(lastMqa) {
253
- // Audio
254
-
255
- this.localMQEStats.audio.RX.packetsLost.push(lastMqa.audioReceive[0].common.mediaHopByHopLost);
256
- this.localMQEStats.audio.RX.jitter.push(lastMqa.audioReceive[0].streams[0].common.rtpJitter);
257
- this.localMQEStats.audio.RX.latency.push(lastMqa.audioReceive[0].common.roundTripTime);
258
- this.localMQEStats.audio.RX.bitRate.push(lastMqa.audioReceive[0].streams[0].common.receivedBitrate);
259
- this.localMQEStats.audio.TX.packetsLost.push(lastMqa.audioTransmit[0].common.remoteLossRate);
260
- this.localMQEStats.audio.TX.jitter.push(lastMqa.audioTransmit[0].common.remoteJitter);
261
- this.localMQEStats.audio.TX.latency.push(lastMqa.audioTransmit[0].common.roundTripTime);
262
- this.localMQEStats.audio.TX.bitRate.push(lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate);
263
-
264
- // Video
265
-
266
- this.localMQEStats.video.RX.packetsLost.push(lastMqa.videoReceive[0].common.mediaHopByHopLost);
267
- this.localMQEStats.video.RX.jitter.push(lastMqa.videoReceive[0].streams[0].common.rtpJitter);
268
- this.localMQEStats.video.RX.latency.push(lastMqa.videoReceive[0].streams[0].common.roundTripTime);
269
- this.localMQEStats.video.RX.bitRate.push(lastMqa.videoReceive[0].streams[0].common.receivedBitrate);
270
- this.localMQEStats.video.RX.frameRate.push(lastMqa.videoReceive[0].streams[0].common.receivedFrameRate);
271
- this.localMQEStats.video.RX.resolutionWidth.push(lastMqa.videoReceive[0].streams[0].receivedWidth);
272
- this.localMQEStats.video.RX.resolutionHeight.push(lastMqa.videoReceive[0].streams[0].receivedHeight);
273
- this.localMQEStats.video.RX.requestedKeyFrame.push();
274
- this.localMQEStats.video.RX.receivedKeyFrame.push();
275
- this.localMQEStats.video.TX.packetsLost.push(lastMqa.videoTransmit[0].common.remoteLossRate);
276
- this.localMQEStats.video.TX.jitter.push(lastMqa.videoTransmit[0].common.remoteJitter);
277
- this.localMQEStats.video.TX.latency.push(lastMqa.videoTransmit[0].common.roundTripTime);
278
- this.localMQEStats.video.TX.bitRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate);
279
- this.localMQEStats.video.TX.frameRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate);
280
- this.localMQEStats.video.TX.resolutionWidth.push(lastMqa.videoTransmit[0].streams[0].transmittedWidth);
281
- this.localMQEStats.video.TX.resolutionHeight.push(lastMqa.videoTransmit[0].streams[0].transmittedHeight);
282
- this.localMQEStats.video.TX.requestedKeyFrame.push(lastMqa.videoTransmit[0].streams[0].requestedKeyFrames);
283
- this.localMQEStats.video.TX.receivedKeyFrame.push();
284
- }
285
- }, {
286
201
  key: "resetStatsResults",
287
202
  value: function resetStatsResults() {
288
- this.statsResults.audio.send.meanRemoteJitter = [];
289
- this.statsResults.video.send.meanRemoteJitter = [];
290
- this.statsResults.share.send.meanRemoteJitter = [];
291
- this.statsResults.audio.recv.meanRtpJitter = [];
292
-
293
- // TODO: currently no values are present
294
- this.statsResults.video.recv.meanRtpJitter = [];
295
- this.statsResults.share.recv.meanRtpJitter = [];
296
-
297
- // Reset the roundTripTime
298
- this.statsResults.audio.send.meanRoundTripTime = [];
299
- this.statsResults.video.send.meanRoundTripTime = [];
300
- this.statsResults.share.send.meanRoundTripTime = [];
203
+ var _this2 = this;
204
+ (0, _keys.default)(this.statsResults).forEach(function (mediaType) {
205
+ if (mediaType.includes('recv')) {
206
+ _this2.statsResults[mediaType].recv.meanRtpJitter = [];
207
+ }
208
+ if (mediaType.includes('send')) {
209
+ _this2.statsResults[mediaType].send.meanRemoteJitter = [];
210
+ _this2.statsResults[mediaType].send.meanRoundTripTime = [];
211
+ }
212
+ });
301
213
  }
302
214
 
303
215
  /**
@@ -324,80 +236,80 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
324
236
  }, {
325
237
  key: "sendMqaData",
326
238
  value: function sendMqaData() {
327
- var audioReceiver = _config.default.intervals[0].audioReceive[0];
328
- var audioSender = _config.default.intervals[0].audioTransmit[0];
329
- var videoReceiver = _config.default.intervals[0].videoReceive[0];
330
- var videoSender = _config.default.intervals[0].videoTransmit[0];
331
- var shareSender = _config.default.intervals[0].videoTransmit[1];
332
- var shareReceiver = _config.default.intervals[0].videoReceive[1];
333
- (0, _mqaUtil.getAudioSenderMqa)({
334
- audioSender: audioSender,
335
- statsResults: this.statsResults,
336
- lastMqaDataSent: this.lastMqaDataSent
337
- });
338
- (0, _mqaUtil.getAudioReceiverMqa)({
339
- audioReceiver: audioReceiver,
340
- statsResults: this.statsResults,
341
- lastMqaDataSent: this.lastMqaDataSent
342
- });
343
- (0, _mqaUtil.getVideoReceiverMqa)({
344
- videoReceiver: videoReceiver,
345
- statsResults: this.statsResults,
346
- lastMqaDataSent: this.lastMqaDataSent
347
- });
348
- (0, _mqaUtil.getVideoSenderMqa)({
349
- videoSender: videoSender,
350
- statsResults: this.statsResults,
351
- lastMqaDataSent: this.lastMqaDataSent
352
- });
353
-
354
- // Capture mqa for share scenario
355
-
356
- (0, _mqaUtil.getVideoSenderMqa)({
357
- videoSender: shareSender,
358
- statsResults: this.statsResults,
359
- lastMqaDataSent: this.lastMqaDataSent,
360
- isShareStream: true
361
- });
362
- (0, _mqaUtil.getVideoReceiverMqa)({
363
- videoReceiver: shareReceiver,
364
- statsResults: this.statsResults,
365
- lastMqaDataSent: this.lastMqaDataSent,
366
- isShareStream: true
239
+ var _this3 = this;
240
+ var newMqa = (0, _cloneDeep2.default)(_config.emptyMqaInterval);
241
+ (0, _keys.default)(this.statsResults).forEach(function (mediaType) {
242
+ if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {
243
+ var audioSender = (0, _cloneDeep2.default)(_config.emptyAudioTransmit);
244
+ (0, _mqaUtil.getAudioSenderMqa)({
245
+ audioSender: audioSender,
246
+ statsResults: _this3.statsResults,
247
+ lastMqaDataSent: _this3.lastMqaDataSent,
248
+ mediaType: mediaType
249
+ });
250
+ newMqa.audioTransmit.push(audioSender);
251
+ } else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {
252
+ var audioReceiver = (0, _cloneDeep2.default)(_config.emptyAudioReceive);
253
+ (0, _mqaUtil.getAudioReceiverMqa)({
254
+ audioReceiver: audioReceiver,
255
+ statsResults: _this3.statsResults,
256
+ lastMqaDataSent: _this3.lastMqaDataSent,
257
+ mediaType: mediaType
258
+ });
259
+ newMqa.audioReceive.push(audioReceiver);
260
+ } else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {
261
+ var videoSender = (0, _cloneDeep2.default)(_config.emptyVideoTransmit);
262
+ (0, _mqaUtil.getVideoSenderMqa)({
263
+ videoSender: videoSender,
264
+ statsResults: _this3.statsResults,
265
+ lastMqaDataSent: _this3.lastMqaDataSent,
266
+ mediaType: mediaType
267
+ });
268
+ newMqa.videoTransmit.push(videoSender);
269
+ } else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {
270
+ var videoReceiver = (0, _cloneDeep2.default)(_config.emptyVideoReceive);
271
+ (0, _mqaUtil.getVideoReceiverMqa)({
272
+ videoReceiver: videoReceiver,
273
+ statsResults: _this3.statsResults,
274
+ lastMqaDataSent: _this3.lastMqaDataSent,
275
+ mediaType: mediaType
276
+ });
277
+ newMqa.videoReceive.push(videoReceiver);
278
+ }
367
279
  });
368
- _config.default.intervals[0].intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];
280
+ newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];
369
281
 
370
282
  // Adding peripheral information
371
- _config.default.intervals[0].intervalMetadata.peripherals = [];
372
- _config.default.intervals[0].intervalMetadata.peripherals.push({
283
+ newMqa.intervalMetadata.peripherals = [];
284
+ newMqa.intervalMetadata.peripherals.push({
373
285
  information: _constants._UNKNOWN_,
374
286
  name: _constants.MEDIA_DEVICES.SPEAKER
375
287
  });
376
- _config.default.intervals[0].intervalMetadata.peripherals.push({
377
- information: this.statsResults[_constants.STATS.AUDIO_CORRELATE][_constants.STATS.SEND_DIRECTION].trackLabel || _constants._UNKNOWN_,
378
- name: _constants.MEDIA_DEVICES.MICROPHONE
379
- });
380
- _config.default.intervals[0].intervalMetadata.peripherals.push({
381
- information: this.statsResults[_constants.STATS.VIDEO_CORRELATE][_constants.STATS.SEND_DIRECTION].trackLabel || _constants._UNKNOWN_,
382
- name: _constants.MEDIA_DEVICES.CAMERA
383
- });
384
-
385
- // @ts-ignore
386
- _config.default.networkType = this.statsResults.connectionType.local.networkType;
288
+ if (this.statsResults['audio-send']) {
289
+ var _this$statsResults$au;
290
+ newMqa.intervalMetadata.peripherals.push({
291
+ information: (_this$statsResults$au = this.statsResults['audio-send']) === null || _this$statsResults$au === void 0 ? void 0 : _this$statsResults$au.trackLabel,
292
+ name: _constants.MEDIA_DEVICES.MICROPHONE
293
+ });
294
+ }
295
+ if (this.statsResults['video-send']) {
296
+ var _this$statsResults$vi;
297
+ newMqa.intervalMetadata.peripherals.push({
298
+ information: (_this$statsResults$vi = this.statsResults['video-send']) === null || _this$statsResults$vi === void 0 ? void 0 : _this$statsResults$vi.trackLabel,
299
+ name: _constants.MEDIA_DEVICES.CAMERA
300
+ });
301
+ }
302
+ newMqa.networkType = this.statsResults.connectionType.local.networkType;
387
303
  this.mqaSentCount += 1;
388
- _config.default.intervals[0].intervalNumber = this.mqaSentCount;
389
-
390
- // DO Deep copy, for some reason it takes the reference all the time rather then old value set
391
- this.lastMqaDataSent = (0, _cloneDeep2.default)(this.statsResults);
392
- this.populateResults(_config.default.intervals[0]);
304
+ newMqa.intervalNumber = this.mqaSentCount;
393
305
  this.resetStatsResults();
394
306
  this.emit({
395
307
  file: 'statsAnalyzer',
396
308
  function: 'sendMqaData'
397
309
  }, EVENTS.MEDIA_QUALITY, {
398
- data: _config.default.intervals[0],
310
+ data: newMqa,
399
311
  // @ts-ignore
400
- networkType: _config.default.networkType
312
+ networkType: newMqa.networkType
401
313
  });
402
314
  }
403
315
 
@@ -426,18 +338,18 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
426
338
  }, {
427
339
  key: "startAnalyzer",
428
340
  value: function startAnalyzer(mediaConnection) {
429
- var _this2 = this;
341
+ var _this4 = this;
430
342
  if (!this.statsStarted) {
431
343
  this.statsStarted = true;
432
344
  this.mediaConnection = mediaConnection;
433
345
  return this.getStatsAndParse().then(function () {
434
- _this2.statsInterval = setInterval(function () {
435
- _this2.getStatsAndParse();
436
- }, _this2.config.analyzerInterval);
346
+ _this4.statsInterval = setInterval(function () {
347
+ _this4.getStatsAndParse();
348
+ }, _this4.config.analyzerInterval);
437
349
  // Trigger initial fetch
438
- _this2.sendMqaData();
439
- _this2.mqaInterval = setInterval(function () {
440
- _this2.sendMqaData();
350
+ _this4.sendMqaData();
351
+ _this4.mqaInterval = setInterval(function () {
352
+ _this4.sendMqaData();
441
353
  }, _constants.MQA_INTEVAL);
442
354
  });
443
355
  }
@@ -454,7 +366,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
454
366
  }, {
455
367
  key: "stopAnalyzer",
456
368
  value: function stopAnalyzer() {
457
- var _this3 = this;
369
+ var _this5 = this;
458
370
  var sendOneLastMqa = this.mqaInterval && this.statsInterval;
459
371
  if (this.statsInterval) {
460
372
  clearInterval(this.statsInterval);
@@ -466,11 +378,10 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
466
378
  }
467
379
  if (sendOneLastMqa) {
468
380
  return this.getStatsAndParse().then(function () {
469
- _this3.sendMqaData();
470
- _this3.mediaConnection = null;
381
+ _this5.sendMqaData();
382
+ _this5.mediaConnection = null;
471
383
  });
472
384
  }
473
- this.mediaConnection = null;
474
385
  return _promise.default.resolve();
475
386
  }
476
387
 
@@ -490,6 +401,32 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
490
401
  if (!getStatsResult) {
491
402
  return;
492
403
  }
404
+
405
+ // Generate empty stats results
406
+ if (!this.statsResults[type]) {
407
+ this.statsResults[type] = {};
408
+ }
409
+ if (isSender && !this.statsResults[type].send) {
410
+ this.statsResults[type].send = (0, _cloneDeep2.default)(emptySender);
411
+ } else if (!isSender && !this.statsResults[type].recv) {
412
+ this.statsResults[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
413
+ }
414
+ if (!this.statsResults.resolutions[type]) {
415
+ this.statsResults.resolutions[type] = {};
416
+ }
417
+ if (isSender && !this.statsResults.resolutions[type].send) {
418
+ this.statsResults.resolutions[type].send = (0, _cloneDeep2.default)(emptySender);
419
+ } else if (!isSender && !this.statsResults.resolutions[type].recv) {
420
+ this.statsResults.resolutions[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
421
+ }
422
+ if (!this.statsResults.internal[type]) {
423
+ this.statsResults.internal[type] = {};
424
+ }
425
+ if (isSender && !this.statsResults.internal[type].send) {
426
+ this.statsResults.internal[type].send = (0, _cloneDeep2.default)(emptySender);
427
+ } else if (!isSender && !this.statsResults.internal[type].recv) {
428
+ this.statsResults.internal[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
429
+ }
493
430
  switch (getStatsResult.type) {
494
431
  case 'outbound-rtp':
495
432
  this.processOutboundRTPResult(getStatsResult, type);
@@ -524,21 +461,26 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
524
461
  /**
525
462
  * Filters the get stats results for types
526
463
  * @private
527
- * @param {Array} getStatsResults
464
+ * @param {Array} statsItem
528
465
  * @param {String} type
529
466
  * @param {boolean} isSender
530
467
  * @returns {void}
531
468
  */
532
469
  }, {
533
470
  key: "filterAndParseGetStatsResults",
534
- value: function filterAndParseGetStatsResults(getStatsResults, type, isSender) {
535
- var _this4 = this;
471
+ value: function filterAndParseGetStatsResults(statsItem, type, isSender) {
472
+ var _this6 = this;
536
473
  var types = _constants.DEFAULT_GET_STATS_FILTER.types;
537
- getStatsResults.forEach(function (result) {
474
+ statsItem.report.forEach(function (result) {
538
475
  if (types.includes(result.type)) {
539
- _this4.parseGetStatsResult(result, type, isSender);
476
+ _this6.parseGetStatsResult(result, type, isSender);
540
477
  }
541
478
  });
479
+ if (this.statsResults[type]) {
480
+ this.statsResults[type].direction = statsItem.currentDirection;
481
+ this.statsResults[type].trackLabel = statsItem.localTrackLabel;
482
+ this.statsResults[type].csi = statsItem.csi;
483
+ }
542
484
  }
543
485
 
544
486
  /**
@@ -553,7 +495,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
553
495
  if (!result) {
554
496
  return;
555
497
  }
556
- if (type === _constants.STATS.AUDIO_CORRELATE) {
498
+ if (type.includes('audio-send')) {
557
499
  this.statsResults[type].send.audioLevel = result.audioLevel;
558
500
  this.statsResults[type].send.totalAudioEnergy = result.totalAudioEnergy;
559
501
  }
@@ -584,106 +526,149 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
584
526
  * @returns {void}
585
527
  */
586
528
  function compareLastStatsResult() {
529
+ var _this7 = this;
587
530
  if (this.lastStatsResults !== null && this.meetingMediaStatus) {
588
- // compare audio stats sent
589
- var mediaType = _constants.STATS.AUDIO_CORRELATE;
590
- var currentStats = null;
591
- var previousStats = null;
592
- if (this.meetingMediaStatus.expected.sendAudio) {
593
- currentStats = this.statsResults[mediaType].send;
594
- previousStats = this.lastStatsResults[mediaType].send;
531
+ var getCurrentStatsTotals = function getCurrentStatsTotals(keyPrefix, value) {
532
+ return (0, _keys.default)(_this7.statsResults).filter(function (key) {
533
+ return key.startsWith(keyPrefix);
534
+ }).reduce(function (prev, cur) {
535
+ var _this7$statsResults$c;
536
+ return prev + (((_this7$statsResults$c = _this7.statsResults[cur]) === null || _this7$statsResults$c === void 0 ? void 0 : _this7$statsResults$c.recv[value]) || 0);
537
+ }, 0);
538
+ };
539
+ var getPreviousStatsTotals = function getPreviousStatsTotals(keyPrefix, value) {
540
+ return (0, _keys.default)(_this7.statsResults).filter(function (key) {
541
+ return key.startsWith(keyPrefix);
542
+ }).reduce(function (prev, cur) {
543
+ var _this7$lastStatsResul;
544
+ return prev + (((_this7$lastStatsResul = _this7.lastStatsResults[cur]) === null || _this7$lastStatsResul === void 0 ? void 0 : _this7$lastStatsResul.recv[value]) || 0);
545
+ }, 0);
546
+ };
547
+ var getCurrentResolutionsStatsTotals = function getCurrentResolutionsStatsTotals(keyPrefix, value) {
548
+ return (0, _keys.default)(_this7.statsResults).filter(function (key) {
549
+ return key.startsWith(keyPrefix);
550
+ }).reduce(function (prev, cur) {
551
+ var _this7$statsResults$r;
552
+ return prev + (((_this7$statsResults$r = _this7.statsResults.resolutions[cur]) === null || _this7$statsResults$r === void 0 ? void 0 : _this7$statsResults$r.recv[value]) || 0);
553
+ }, 0);
554
+ };
555
+ var getPreviousResolutionsStatsTotals = function getPreviousResolutionsStatsTotals(keyPrefix, value) {
556
+ return (0, _keys.default)(_this7.statsResults).filter(function (key) {
557
+ return key.startsWith(keyPrefix);
558
+ }).reduce(function (prev, cur) {
559
+ var _this7$lastStatsResul2;
560
+ return prev + (((_this7$lastStatsResul2 = _this7.lastStatsResults.resolutions[cur]) === null || _this7$lastStatsResul2 === void 0 ? void 0 : _this7$lastStatsResul2.recv[value]) || 0);
561
+ }, 0);
562
+ };
563
+ if (this.meetingMediaStatus.expected.sendAudio && this.lastStatsResults['audio-send']) {
564
+ // compare audio stats sent
565
+ // NOTE: relies on there being only one sender.
566
+ var currentStats = this.statsResults['audio-send'].send;
567
+ var previousStats = this.lastStatsResults['audio-send'].send;
595
568
  if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
596
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets sent"));
569
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent", currentStats.totalPacketsSent);
597
570
  } else {
598
571
  if (currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
599
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " Energy present"));
572
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present", currentStats.totalAudioEnergy);
600
573
  }
601
574
  if (currentStats.audioLevel === 0) {
602
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> ".concat(mediaType, " level is 0 for the user"));
575
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user");
603
576
  }
604
577
  }
605
- this.emitStartStopEvents(mediaType, previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);
578
+ this.emitStartStopEvents('audio', previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);
606
579
  }
607
580
  if (this.meetingMediaStatus.expected.receiveAudio) {
608
581
  // compare audio stats received
609
- currentStats = this.statsResults[mediaType].recv;
610
- previousStats = this.lastStatsResults[mediaType].recv;
611
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {
612
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets received"));
613
- } else if (currentStats.totalSamplesReceived === previousStats.totalSamplesReceived || currentStats.totalSamplesReceived === 0) {
614
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " samples received"));
582
+ var currentPacketsReceived = getCurrentStatsTotals('audio-recv', 'totalPacketsReceived');
583
+ var previousPacketsReceived = getPreviousStatsTotals('audio-recv', 'totalPacketsReceived');
584
+ var currentSamplesReceived = getCurrentStatsTotals('audio-recv', 'totalSamplesReceived');
585
+ var previousSamplesReceived = getPreviousStatsTotals('audio-recv', 'totalSamplesReceived');
586
+ if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
587
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received", currentPacketsReceived);
588
+ } else if (currentSamplesReceived === previousSamplesReceived || currentSamplesReceived === 0) {
589
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio samples received", currentSamplesReceived);
615
590
  }
616
- this.emitStartStopEvents(mediaType, previousStats.totalPacketsReceived, currentStats.totalPacketsReceived, false);
591
+ this.emitStartStopEvents('audio', previousPacketsReceived, currentPacketsReceived, false);
617
592
  }
618
- mediaType = _constants.STATS.VIDEO_CORRELATE;
619
- if (this.meetingMediaStatus.expected.sendVideo) {
593
+ if (this.meetingMediaStatus.expected.sendVideo && this.lastStatsResults['video-send']) {
620
594
  // compare video stats sent
621
- currentStats = this.statsResults[mediaType].send;
622
- previousStats = this.lastStatsResults[mediaType].send;
623
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
624
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets sent"));
595
+ var _currentStats = this.statsResults['video-send'].send;
596
+ var _previousStats = this.lastStatsResults['video-send'].send;
597
+ if (_currentStats.totalPacketsSent === _previousStats.totalPacketsSent || _currentStats.totalPacketsSent === 0) {
598
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent", _currentStats.totalPacketsSent);
625
599
  } else {
626
- if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {
627
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " Frames Encoded"));
600
+ if (_currentStats.framesEncoded === _previousStats.framesEncoded || _currentStats.framesEncoded === 0) {
601
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded", _currentStats.framesEncoded);
628
602
  }
629
- if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {
630
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " Frames sent"));
603
+ if (this.statsResults.resolutions['video-send'].send.framesSent === this.lastStatsResults.resolutions['video-send'].send.framesSent || this.statsResults.resolutions['video-send'].send.framesSent === 0) {
604
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent", this.statsResults.resolutions['video-send'].send.framesSent);
631
605
  }
632
606
  }
633
- this.emitStartStopEvents(mediaType, previousStats.framesSent, currentStats.framesSent, true);
607
+ this.emitStartStopEvents('video', _previousStats.framesSent, _currentStats.framesSent, true);
634
608
  }
635
609
  if (this.meetingMediaStatus.expected.receiveVideo) {
636
- // compare video stats reveived
637
-
638
- currentStats = this.statsResults[mediaType].recv;
639
- previousStats = this.lastStatsResults[mediaType].recv;
640
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {
641
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets received"));
610
+ // compare video stats received
611
+ var _currentPacketsReceived = getCurrentStatsTotals('video-recv', 'totalPacketsReceived');
612
+ var _previousPacketsReceived = getPreviousStatsTotals('video-recv', 'totalPacketsReceived');
613
+ var currentFramesReceived = getCurrentResolutionsStatsTotals('video-recv', 'framesReceived');
614
+ var previousFramesReceived = getPreviousResolutionsStatsTotals('video-recv', 'framesReceived');
615
+ var currentFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');
616
+ var previousFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');
617
+ var currentFramesDropped = getCurrentResolutionsStatsTotals('video-recv', 'framesDropped');
618
+ var previousFramesDropped = getPreviousResolutionsStatsTotals('video-recv', 'framesDropped');
619
+ if (_currentPacketsReceived === _previousPacketsReceived || _currentPacketsReceived === 0) {
620
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received", _currentPacketsReceived);
642
621
  } else {
643
- if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {
644
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames received"));
622
+ if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
623
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video frames received", currentFramesReceived);
645
624
  }
646
- if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {
647
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames decoded"));
625
+ if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
626
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded", currentFramesDecoded);
648
627
  }
649
- if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {
650
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> ".concat(mediaType, " frames are getting dropped"));
628
+ if (currentFramesDropped - previousFramesDropped > 10) {
629
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped", currentFramesDropped - previousFramesDropped);
651
630
  }
652
631
  }
653
- this.emitStartStopEvents(mediaType, previousStats.framesDecoded, currentStats.framesDecoded, false);
632
+ this.emitStartStopEvents('video', previousFramesDecoded, currentFramesDecoded, false);
654
633
  }
655
- mediaType = _constants.STATS.SHARE_CORRELATE;
656
- if (this.meetingMediaStatus.expected.sendShare) {
634
+ if (this.meetingMediaStatus.expected.sendShare && this.lastStatsResults['video-share-send']) {
657
635
  // compare share stats sent
658
636
 
659
- currentStats = this.statsResults[mediaType].send;
660
- previousStats = this.lastStatsResults[mediaType].send;
661
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
662
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets sent"));
637
+ var _currentStats2 = this.statsResults['video-share-send'].send;
638
+ var _previousStats2 = this.lastStatsResults['video-share-send'].send;
639
+ if (_currentStats2.totalPacketsSent === _previousStats2.totalPacketsSent || _currentStats2.totalPacketsSent === 0) {
640
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent", _currentStats2.totalPacketsSent);
663
641
  } else {
664
- if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {
665
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames getting encoded"));
642
+ if (_currentStats2.framesEncoded === _previousStats2.framesEncoded || _currentStats2.framesEncoded === 0) {
643
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded", _currentStats2.framesEncoded);
666
644
  }
667
- if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {
668
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames sent"));
645
+ if (this.statsResults.resolutions['video-share-send'].send.framesSent === this.lastStatsResults.resolutions['video-share-send'].send.framesSent || this.statsResults.resolutions['video-share-send'].send.framesSent === 0) {
646
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames sent", this.statsResults.resolutions['video-share-send'].send.framesSent);
669
647
  }
670
648
  }
671
-
649
+ }
650
+ if (this.meetingMediaStatus.expected.sendShare) {
672
651
  // TODO:need to check receive share value
673
- // compare share stats reveived
674
- currentStats = this.statsResults[mediaType].recv;
675
- previousStats = this.lastStatsResults[mediaType].recv;
676
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsSent === 0) {
677
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets received"));
652
+ // compare share stats received
653
+ var _currentPacketsReceived2 = getCurrentStatsTotals('video-share-recv', 'totalPacketsReceived');
654
+ var _previousPacketsReceived2 = getPreviousStatsTotals('video-share-recv', 'totalPacketsReceived');
655
+ var _currentFramesReceived = getCurrentResolutionsStatsTotals('video-share-recv', 'framesReceived');
656
+ var _previousFramesReceived = getPreviousResolutionsStatsTotals('video-share-recv', 'framesReceived');
657
+ var _currentFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');
658
+ var _previousFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');
659
+ var _currentFramesDropped = getCurrentResolutionsStatsTotals('video-share-recv', 'framesDropped');
660
+ var _previousFramesDropped = getPreviousResolutionsStatsTotals('video-share-recv', 'framesDropped');
661
+ if (_currentPacketsReceived2 === _previousPacketsReceived2 || _currentPacketsReceived2 === 0) {
662
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received", _currentPacketsReceived2);
678
663
  } else {
679
- if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {
680
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames received"));
664
+ if (_currentFramesReceived === _previousFramesReceived || _currentFramesReceived === 0) {
665
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames received", _currentFramesReceived);
681
666
  }
682
- if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {
683
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames decoded"));
667
+ if (_currentFramesDecoded === _previousFramesDecoded || _currentFramesDecoded === 0) {
668
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded", _currentFramesDecoded);
684
669
  }
685
- if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {
686
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> ".concat(mediaType, " frames are getting dropped"));
670
+ if (_currentFramesDropped - _previousFramesDropped > 10) {
671
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped", _currentFramesDropped - _previousFramesDropped);
687
672
  }
688
673
  }
689
674
 
@@ -704,7 +689,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
704
689
  }, {
705
690
  key: "getStatsAndParse",
706
691
  value: function getStatsAndParse() {
707
- var _this5 = this;
692
+ var _this8 = this;
708
693
  if (!this.mediaConnection) {
709
694
  return _promise.default.resolve();
710
695
  }
@@ -714,24 +699,47 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
714
699
  }
715
700
  _loggerProxy.default.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');
716
701
  return this.mediaConnection.getTransceiverStats().then(function (transceiverStats) {
717
- _this5.filterAndParseGetStatsResults(transceiverStats.video.sender, _constants.STATS.VIDEO_CORRELATE, true);
718
- _this5.filterAndParseGetStatsResults(transceiverStats.video.receiver, _constants.STATS.VIDEO_CORRELATE, false);
719
- _this5.filterAndParseGetStatsResults(transceiverStats.audio.sender, _constants.STATS.AUDIO_CORRELATE, true);
720
- _this5.filterAndParseGetStatsResults(transceiverStats.audio.receiver, _constants.STATS.AUDIO_CORRELATE, false);
721
- _this5.filterAndParseGetStatsResults(transceiverStats.screenShareVideo.sender, _constants.STATS.SHARE_CORRELATE, true);
722
- _this5.filterAndParseGetStatsResults(transceiverStats.screenShareVideo.receiver, _constants.STATS.SHARE_CORRELATE, false);
723
-
724
- // updates the current direction of media
725
- _this5.statsResults[_constants.STATS.AUDIO_CORRELATE].direction = transceiverStats.audio.currentDirection;
726
- _this5.statsResults[_constants.STATS.VIDEO_CORRELATE].direction = transceiverStats.video.currentDirection;
727
- _this5.statsResults[_constants.STATS.SHARE_CORRELATE].direction = transceiverStats.screenShareVideo.currentDirection;
728
- _this5.statsResults[_constants.STATS.AUDIO_CORRELATE][_constants.STATS.SEND_DIRECTION].trackLabel = transceiverStats.audio.localTrackLabel;
729
- _this5.statsResults[_constants.STATS.VIDEO_CORRELATE][_constants.STATS.SEND_DIRECTION].trackLabel = transceiverStats.video.localTrackLabel;
730
- _this5.compareLastStatsResult();
702
+ transceiverStats.video.receivers.forEach(function (receiver, i) {
703
+ return _this8.filterAndParseGetStatsResults(receiver, "video-recv-".concat(i), false);
704
+ });
705
+ transceiverStats.audio.receivers.forEach(function (receiver, i) {
706
+ return _this8.filterAndParseGetStatsResults(receiver, "audio-recv-".concat(i), false);
707
+ });
708
+ transceiverStats.screenShareVideo.receivers.forEach(function (receiver, i) {
709
+ return _this8.filterAndParseGetStatsResults(receiver, "video-share-recv-".concat(i), false);
710
+ });
711
+ transceiverStats.screenShareAudio.receivers.forEach(function (receiver, i) {
712
+ return _this8.filterAndParseGetStatsResults(receiver, "audio-share-recv-".concat(i), false);
713
+ });
714
+ transceiverStats.video.senders.forEach(function (sender, i) {
715
+ if (i > 0) {
716
+ throw new Error('Stats Analyzer does not support multiple senders.');
717
+ }
718
+ _this8.filterAndParseGetStatsResults(sender, 'video-send', true);
719
+ });
720
+ transceiverStats.audio.senders.forEach(function (sender, i) {
721
+ if (i > 0) {
722
+ throw new Error('Stats Analyzer does not support multiple senders.');
723
+ }
724
+ _this8.filterAndParseGetStatsResults(sender, 'audio-send', true);
725
+ });
726
+ transceiverStats.screenShareVideo.senders.forEach(function (sender, i) {
727
+ if (i > 0) {
728
+ throw new Error('Stats Analyzer does not support multiple senders.');
729
+ }
730
+ _this8.filterAndParseGetStatsResults(sender, 'video-share-send', true);
731
+ });
732
+ transceiverStats.screenShareAudio.senders.forEach(function (sender, i) {
733
+ if (i > 0) {
734
+ throw new Error('Stats Analyzer does not support multiple senders.');
735
+ }
736
+ _this8.filterAndParseGetStatsResults(sender, 'audio-share-send', true);
737
+ });
738
+ _this8.compareLastStatsResult();
731
739
 
732
740
  // Save the last results to compare with the current
733
741
  // DO Deep copy, for some reason it takes the reference all the time rather then old value set
734
- _this5.lastStatsResults = JSON.parse((0, _stringify.default)(_this5.statsResults));
742
+ _this8.lastStatsResults = JSON.parse((0, _stringify.default)(_this8.statsResults));
735
743
  _loggerProxy.default.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats');
736
744
  });
737
745
  }
@@ -740,16 +748,21 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
740
748
  * Processes OutboundRTP stats result and stores
741
749
  * @private
742
750
  * @param {*} result
743
- * @param {*} type
751
+ * @param {*} mediaType
744
752
  * @returns {void}
745
753
  */
746
754
  }, {
747
755
  key: "processOutboundRTPResult",
748
- value: function processOutboundRTPResult(result, type) {
749
- var mediaType = type || _constants.STATS.AUDIO_CORRELATE;
756
+ value: function processOutboundRTPResult(result, mediaType) {
750
757
  var sendrecvType = _constants.STATS.SEND_DIRECTION;
751
758
  if (result.bytesSent) {
752
759
  var kilobytes = 0;
760
+ if (result.frameWidth && result.frameHeight) {
761
+ this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
762
+ this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
763
+ this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
764
+ this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
765
+ }
753
766
  if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
754
767
  this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
755
768
  }
@@ -796,16 +809,22 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
796
809
  * Processes InboundRTP stats result and stores
797
810
  * @private
798
811
  * @param {*} result
799
- * @param {*} type
812
+ * @param {*} mediaType
800
813
  * @returns {void}
801
814
  */
802
815
  }, {
803
816
  key: "processInboundRTPResult",
804
- value: function processInboundRTPResult(result, type) {
805
- var mediaType = type || _constants.STATS.AUDIO_CORRELATE;
817
+ value: function processInboundRTPResult(result, mediaType) {
806
818
  var sendrecvType = _constants.STATS.RECEIVE_DIRECTION;
807
819
  if (result.bytesReceived) {
808
820
  var kilobytes = 0;
821
+ var receiveSlot = this.receiveSlotCallback(result.ssrc);
822
+ var idAndCsi = receiveSlot ? "id: \"".concat(receiveSlot.id || '', "\"").concat(receiveSlot.csi ? " and csi: ".concat(receiveSlot.csi) : '') : '';
823
+ if (result.frameWidth && result.frameHeight) {
824
+ this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
825
+ this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
826
+ this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
827
+ }
809
828
  if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
810
829
  this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
811
830
  }
@@ -834,13 +853,15 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
834
853
  this.statsResults[mediaType][sendrecvType].packetsReceived = result.packetsReceived - this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;
835
854
  this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
836
855
  if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
837
- _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No packets received for ".concat(mediaType, " "), this.statsResults[mediaType][sendrecvType].packetsReceived);
856
+ if (receiveSlot) {
857
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ".concat(idAndCsi), this.statsResults[mediaType][sendrecvType].packetsReceived);
858
+ }
838
859
  }
839
860
 
840
861
  // Check the over all packet Lost ratio
841
862
  this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0 ? this.statsResults[mediaType][sendrecvType].currentPacketsLost / (this.statsResults[mediaType][sendrecvType].packetsReceived + this.statsResults[mediaType][sendrecvType].currentPacketsLost) : 0;
842
863
  if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
843
- _loggerProxy.default.logger.info('StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ', this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);
864
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ".concat(idAndCsi), this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);
844
865
  }
845
866
 
846
867
  // TODO: check the packet loss value is negative values here
@@ -901,20 +922,13 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
901
922
  if (!result || result.type !== 'track') {
902
923
  return;
903
924
  }
904
- if (result.type !== 'track') return;
905
925
  var sendrecvType = result.remoteSource === true ? _constants.STATS.RECEIVE_DIRECTION : _constants.STATS.SEND_DIRECTION;
906
- if (result.frameWidth && result.frameHeight) {
907
- this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
908
- this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
909
- this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
910
- this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
911
- }
912
926
  if (sendrecvType === _constants.STATS.RECEIVE_DIRECTION) {
913
927
  this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
914
928
  this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
915
929
  this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
916
930
  }
917
- if (result.trackIdentifier && mediaType !== _constants.STATS.AUDIO_CORRELATE) {
931
+ if (result.trackIdentifier && !mediaType.includes('audio')) {
918
932
  this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier = result.trackIdentifier;
919
933
  var jitterBufferDelay = result && result.jitterBufferDelay;
920
934
  var jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;
@@ -937,7 +951,8 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
937
951
  }, {
938
952
  key: "compareSentAndReceived",
939
953
  value: function compareSentAndReceived(result, type) {
940
- if (!type) {
954
+ // Don't compare on transceivers without a sender.
955
+ if (!type || !this.statsResults.internal[type].send) {
941
956
  return;
942
957
  }
943
958
  var mediaType = type;