@webex/plugin-meetings 3.0.0-beta.7 → 3.0.0-beta.71

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 (506) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +178 -0
  4. package/dist/breakouts/breakout.js.map +1 -0
  5. package/dist/breakouts/collection.js +23 -0
  6. package/dist/breakouts/collection.js.map +1 -0
  7. package/dist/breakouts/edit-lock-error.js +52 -0
  8. package/dist/breakouts/edit-lock-error.js.map +1 -0
  9. package/dist/breakouts/index.js +843 -0
  10. package/dist/breakouts/index.js.map +1 -0
  11. package/dist/breakouts/request.js +78 -0
  12. package/dist/breakouts/request.js.map +1 -0
  13. package/dist/breakouts/utils.js +56 -0
  14. package/dist/breakouts/utils.js.map +1 -0
  15. package/dist/common/browser-detection.js +1 -20
  16. package/dist/common/browser-detection.js.map +1 -1
  17. package/dist/common/collection.js +5 -20
  18. package/dist/common/collection.js.map +1 -1
  19. package/dist/common/config.js +0 -7
  20. package/dist/common/config.js.map +1 -1
  21. package/dist/common/errors/captcha-error.js +10 -24
  22. package/dist/common/errors/captcha-error.js.map +1 -1
  23. package/dist/common/errors/intent-to-join.js +11 -24
  24. package/dist/common/errors/intent-to-join.js.map +1 -1
  25. package/dist/common/errors/join-meeting.js +12 -25
  26. package/dist/common/errors/join-meeting.js.map +1 -1
  27. package/dist/common/errors/media.js +10 -24
  28. package/dist/common/errors/media.js.map +1 -1
  29. package/dist/common/errors/parameter.js +5 -33
  30. package/dist/common/errors/parameter.js.map +1 -1
  31. package/dist/common/errors/password-error.js +10 -24
  32. package/dist/common/errors/password-error.js.map +1 -1
  33. package/dist/common/errors/permission.js +9 -23
  34. package/dist/common/errors/permission.js.map +1 -1
  35. package/dist/common/errors/reconnection-in-progress.js +0 -17
  36. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  37. package/dist/common/errors/reconnection.js +10 -24
  38. package/dist/common/errors/reconnection.js.map +1 -1
  39. package/dist/common/errors/stats.js +10 -24
  40. package/dist/common/errors/stats.js.map +1 -1
  41. package/dist/common/errors/webex-errors.js +6 -41
  42. package/dist/common/errors/webex-errors.js.map +1 -1
  43. package/dist/common/errors/webex-meetings-error.js +5 -25
  44. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  45. package/dist/common/events/events-scope.js +0 -22
  46. package/dist/common/events/events-scope.js.map +1 -1
  47. package/dist/common/events/events.js +0 -23
  48. package/dist/common/events/events.js.map +1 -1
  49. package/dist/common/events/trigger-proxy.js +0 -12
  50. package/dist/common/events/trigger-proxy.js.map +1 -1
  51. package/dist/common/events/util.js +0 -15
  52. package/dist/common/events/util.js.map +1 -1
  53. package/dist/common/logs/logger-config.js +0 -4
  54. package/dist/common/logs/logger-config.js.map +1 -1
  55. package/dist/common/logs/logger-proxy.js +1 -8
  56. package/dist/common/logs/logger-proxy.js.map +1 -1
  57. package/dist/common/logs/request.js +37 -60
  58. package/dist/common/logs/request.js.map +1 -1
  59. package/dist/common/queue.js +4 -14
  60. package/dist/common/queue.js.map +1 -1
  61. package/dist/config.js +6 -6
  62. package/dist/config.js.map +1 -1
  63. package/dist/constants.js +143 -52
  64. package/dist/constants.js.map +1 -1
  65. package/dist/controls-options-manager/constants.js +14 -0
  66. package/dist/controls-options-manager/constants.js.map +1 -0
  67. package/dist/controls-options-manager/enums.js +16 -0
  68. package/dist/controls-options-manager/enums.js.map +1 -0
  69. package/dist/controls-options-manager/index.js +261 -0
  70. package/dist/controls-options-manager/index.js.map +1 -0
  71. package/dist/controls-options-manager/util.js +39 -0
  72. package/dist/controls-options-manager/util.js.map +1 -0
  73. package/dist/index.js +11 -18
  74. package/dist/index.js.map +1 -1
  75. package/dist/locus-info/controlsUtils.js +31 -29
  76. package/dist/locus-info/controlsUtils.js.map +1 -1
  77. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  78. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  79. package/dist/locus-info/fullState.js +0 -15
  80. package/dist/locus-info/fullState.js.map +1 -1
  81. package/dist/locus-info/hostUtils.js +4 -12
  82. package/dist/locus-info/hostUtils.js.map +1 -1
  83. package/dist/locus-info/index.js +237 -198
  84. package/dist/locus-info/index.js.map +1 -1
  85. package/dist/locus-info/infoUtils.js +3 -37
  86. package/dist/locus-info/infoUtils.js.map +1 -1
  87. package/dist/locus-info/mediaSharesUtils.js +12 -38
  88. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  89. package/dist/locus-info/parser.js +92 -118
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +80 -89
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.js +56 -146
  94. package/dist/media/index.js.map +1 -1
  95. package/dist/media/properties.js +83 -117
  96. package/dist/media/properties.js.map +1 -1
  97. package/dist/media/util.js +2 -9
  98. package/dist/media/util.js.map +1 -1
  99. package/dist/mediaQualityMetrics/config.js +505 -495
  100. package/dist/mediaQualityMetrics/config.js.map +1 -1
  101. package/dist/meeting/in-meeting-actions.js +31 -14
  102. package/dist/meeting/in-meeting-actions.js.map +1 -1
  103. package/dist/meeting/index.js +2225 -2244
  104. package/dist/meeting/index.js.map +1 -1
  105. package/dist/meeting/muteState.js +102 -100
  106. package/dist/meeting/muteState.js.map +1 -1
  107. package/dist/meeting/request.js +308 -264
  108. package/dist/meeting/request.js.map +1 -1
  109. package/dist/meeting/request.type.js +7 -0
  110. package/dist/meeting/request.type.js.map +1 -0
  111. package/dist/meeting/state.js +21 -31
  112. package/dist/meeting/state.js.map +1 -1
  113. package/dist/meeting/util.js +63 -217
  114. package/dist/meeting/util.js.map +1 -1
  115. package/dist/meeting-info/collection.js +6 -25
  116. package/dist/meeting-info/collection.js.map +1 -1
  117. package/dist/meeting-info/index.js +14 -32
  118. package/dist/meeting-info/index.js.map +1 -1
  119. package/dist/meeting-info/meeting-info-v2.js +193 -268
  120. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  121. package/dist/meeting-info/request.js +3 -15
  122. package/dist/meeting-info/request.js.map +1 -1
  123. package/dist/meeting-info/util.js +98 -183
  124. package/dist/meeting-info/util.js.map +1 -1
  125. package/dist/meeting-info/utilv2.js +137 -228
  126. package/dist/meeting-info/utilv2.js.map +1 -1
  127. package/dist/meetings/collection.js +26 -19
  128. package/dist/meetings/collection.js.map +1 -1
  129. package/dist/meetings/index.js +565 -552
  130. package/dist/meetings/index.js.map +1 -1
  131. package/dist/meetings/request.js +26 -41
  132. package/dist/meetings/request.js.map +1 -1
  133. package/dist/meetings/util.js +151 -155
  134. package/dist/meetings/util.js.map +1 -1
  135. package/dist/member/index.js +100 -85
  136. package/dist/member/index.js.map +1 -1
  137. package/dist/member/types.js +15 -0
  138. package/dist/member/types.js.map +1 -0
  139. package/dist/member/util.js +90 -68
  140. package/dist/member/util.js.map +1 -1
  141. package/dist/members/collection.js +13 -12
  142. package/dist/members/collection.js.map +1 -1
  143. package/dist/members/index.js +152 -204
  144. package/dist/members/index.js.map +1 -1
  145. package/dist/members/request.js +35 -39
  146. package/dist/members/request.js.map +1 -1
  147. package/dist/members/types.js +15 -0
  148. package/dist/members/types.js.map +1 -0
  149. package/dist/members/util.js +76 -46
  150. package/dist/members/util.js.map +1 -1
  151. package/dist/metrics/config.js +4 -14
  152. package/dist/metrics/config.js.map +1 -1
  153. package/dist/metrics/constants.js +1 -6
  154. package/dist/metrics/constants.js.map +1 -1
  155. package/dist/metrics/index.js +59 -156
  156. package/dist/metrics/index.js.map +1 -1
  157. package/dist/multistream/mediaRequestManager.js +116 -52
  158. package/dist/multistream/mediaRequestManager.js.map +1 -1
  159. package/dist/multistream/receiveSlot.js +58 -65
  160. package/dist/multistream/receiveSlot.js.map +1 -1
  161. package/dist/multistream/receiveSlotManager.js +58 -93
  162. package/dist/multistream/receiveSlotManager.js.map +1 -1
  163. package/dist/multistream/remoteMedia.js +55 -74
  164. package/dist/multistream/remoteMedia.js.map +1 -1
  165. package/dist/multistream/remoteMediaGroup.js +6 -40
  166. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  167. package/dist/multistream/remoteMediaManager.js +466 -442
  168. package/dist/multistream/remoteMediaManager.js.map +1 -1
  169. package/dist/networkQualityMonitor/index.js +40 -59
  170. package/dist/networkQualityMonitor/index.js.map +1 -1
  171. package/dist/personal-meeting-room/index.js +21 -45
  172. package/dist/personal-meeting-room/index.js.map +1 -1
  173. package/dist/personal-meeting-room/request.js +1 -31
  174. package/dist/personal-meeting-room/request.js.map +1 -1
  175. package/dist/personal-meeting-room/util.js +0 -13
  176. package/dist/personal-meeting-room/util.js.map +1 -1
  177. package/dist/reachability/index.js +192 -191
  178. package/dist/reachability/index.js.map +1 -1
  179. package/dist/reachability/request.js +15 -23
  180. package/dist/reachability/request.js.map +1 -1
  181. package/dist/reactions/constants.js +13 -0
  182. package/dist/reactions/constants.js.map +1 -0
  183. package/dist/reactions/reactions.js +109 -0
  184. package/dist/reactions/reactions.js.map +1 -0
  185. package/dist/reactions/reactions.type.js +36 -0
  186. package/dist/reactions/reactions.type.js.map +1 -0
  187. package/dist/reconnection-manager/index.js +342 -460
  188. package/dist/reconnection-manager/index.js.map +1 -1
  189. package/dist/recording-controller/enums.js +17 -0
  190. package/dist/recording-controller/enums.js.map +1 -0
  191. package/dist/recording-controller/index.js +343 -0
  192. package/dist/recording-controller/index.js.map +1 -0
  193. package/dist/recording-controller/util.js +63 -0
  194. package/dist/recording-controller/util.js.map +1 -0
  195. package/dist/roap/index.js +48 -70
  196. package/dist/roap/index.js.map +1 -1
  197. package/dist/roap/request.js +143 -131
  198. package/dist/roap/request.js.map +1 -1
  199. package/dist/roap/turnDiscovery.js +91 -98
  200. package/dist/roap/turnDiscovery.js.map +1 -1
  201. package/dist/statsAnalyzer/global.js +1 -95
  202. package/dist/statsAnalyzer/global.js.map +1 -1
  203. package/dist/statsAnalyzer/index.js +372 -455
  204. package/dist/statsAnalyzer/index.js.map +1 -1
  205. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  206. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  207. package/dist/transcription/index.js +22 -47
  208. package/dist/transcription/index.js.map +1 -1
  209. package/dist/types/breakouts/breakout.d.ts +8 -0
  210. package/dist/types/breakouts/collection.d.ts +5 -0
  211. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  212. package/dist/types/breakouts/index.d.ts +5 -0
  213. package/dist/types/breakouts/request.d.ts +22 -0
  214. package/dist/types/breakouts/utils.d.ts +8 -0
  215. package/dist/types/common/browser-detection.d.ts +9 -0
  216. package/dist/types/common/collection.d.ts +48 -0
  217. package/dist/types/common/config.d.ts +2 -0
  218. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  219. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  220. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  221. package/dist/types/common/errors/media.d.ts +15 -0
  222. package/dist/types/common/errors/parameter.d.ts +15 -0
  223. package/dist/types/common/errors/password-error.d.ts +15 -0
  224. package/dist/types/common/errors/permission.d.ts +14 -0
  225. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  226. package/dist/types/common/errors/reconnection.d.ts +15 -0
  227. package/dist/types/common/errors/stats.d.ts +15 -0
  228. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  229. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  230. package/dist/types/common/events/events-scope.d.ts +17 -0
  231. package/dist/types/common/events/events.d.ts +12 -0
  232. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  233. package/dist/types/common/events/util.d.ts +2 -0
  234. package/dist/types/common/logs/logger-config.d.ts +2 -0
  235. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  236. package/dist/types/common/logs/request.d.ts +34 -0
  237. package/dist/types/common/queue.d.ts +32 -0
  238. package/dist/types/config.d.ts +77 -0
  239. package/dist/types/constants.d.ts +944 -0
  240. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  241. package/dist/types/controls-options-manager/enums.d.ts +6 -0
  242. package/dist/types/controls-options-manager/index.d.ts +128 -0
  243. package/dist/types/controls-options-manager/util.d.ts +9 -0
  244. package/dist/types/index.d.ts +6 -0
  245. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  246. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  247. package/dist/types/locus-info/fullState.d.ts +2 -0
  248. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  249. package/dist/types/locus-info/index.d.ts +276 -0
  250. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  251. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  252. package/dist/types/locus-info/parser.d.ts +212 -0
  253. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  254. package/dist/types/media/index.d.ts +32 -0
  255. package/dist/types/media/properties.d.ts +108 -0
  256. package/dist/types/media/util.d.ts +2 -0
  257. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  258. package/dist/types/meeting/in-meeting-actions.d.ts +101 -0
  259. package/dist/types/meeting/index.d.ts +1720 -0
  260. package/dist/types/meeting/muteState.d.ts +132 -0
  261. package/dist/types/meeting/request.d.ts +271 -0
  262. package/dist/types/meeting/request.type.d.ts +11 -0
  263. package/dist/types/meeting/state.d.ts +9 -0
  264. package/dist/types/meeting/util.d.ts +2 -0
  265. package/dist/types/meeting-info/collection.d.ts +20 -0
  266. package/dist/types/meeting-info/index.d.ts +57 -0
  267. package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
  268. package/dist/types/meeting-info/request.d.ts +22 -0
  269. package/dist/types/meeting-info/util.d.ts +2 -0
  270. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  271. package/dist/types/meetings/collection.d.ts +31 -0
  272. package/dist/types/meetings/index.d.ts +315 -0
  273. package/dist/types/meetings/request.d.ts +27 -0
  274. package/dist/types/meetings/util.d.ts +18 -0
  275. package/dist/types/member/index.d.ts +156 -0
  276. package/dist/types/member/types.d.ts +21 -0
  277. package/dist/types/member/util.d.ts +2 -0
  278. package/dist/types/members/collection.d.ts +29 -0
  279. package/dist/types/members/index.d.ts +343 -0
  280. package/dist/types/members/request.d.ts +58 -0
  281. package/dist/types/members/types.d.ts +24 -0
  282. package/dist/types/members/util.d.ts +2 -0
  283. package/dist/types/metrics/config.d.ts +171 -0
  284. package/dist/types/metrics/constants.d.ts +53 -0
  285. package/dist/types/metrics/index.d.ts +152 -0
  286. package/dist/types/multistream/mediaRequestManager.d.ts +68 -0
  287. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  288. package/dist/types/multistream/receiveSlotManager.d.ts +49 -0
  289. package/dist/types/multistream/remoteMedia.d.ts +100 -0
  290. package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
  291. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  292. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  293. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  294. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  295. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  296. package/dist/types/reachability/index.d.ts +152 -0
  297. package/dist/types/reachability/request.d.ts +37 -0
  298. package/dist/types/reactions/constants.d.ts +3 -0
  299. package/dist/types/reactions/reactions.d.ts +4 -0
  300. package/dist/types/reactions/reactions.type.d.ts +52 -0
  301. package/dist/types/reconnection-manager/index.d.ts +126 -0
  302. package/dist/types/recording-controller/enums.d.ts +7 -0
  303. package/dist/types/recording-controller/index.d.ts +193 -0
  304. package/dist/types/recording-controller/util.d.ts +13 -0
  305. package/dist/types/roap/index.d.ts +77 -0
  306. package/dist/types/roap/request.d.ts +38 -0
  307. package/dist/types/roap/turnDiscovery.d.ts +74 -0
  308. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  309. package/dist/types/statsAnalyzer/index.d.ts +195 -0
  310. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  311. package/dist/types/transcription/index.d.ts +64 -0
  312. package/internal-README.md +7 -6
  313. package/package.json +27 -21
  314. package/src/breakouts/README.md +219 -0
  315. package/src/breakouts/breakout.ts +153 -0
  316. package/src/breakouts/collection.ts +19 -0
  317. package/src/breakouts/edit-lock-error.ts +25 -0
  318. package/src/breakouts/index.ts +745 -0
  319. package/src/breakouts/request.ts +55 -0
  320. package/src/breakouts/utils.ts +44 -0
  321. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  322. package/src/common/collection.ts +9 -7
  323. package/src/common/{config.js → config.ts} +1 -1
  324. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  325. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  326. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  327. package/src/common/errors/{media.js → media.ts} +11 -7
  328. package/src/common/errors/parameter.ts +11 -7
  329. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  330. package/src/common/errors/{permission.js → permission.ts} +10 -6
  331. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  332. package/src/common/errors/{stats.js → stats.ts} +11 -7
  333. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  334. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  335. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  336. package/src/common/events/{events.js → events.ts} +5 -1
  337. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  338. package/src/common/events/{util.js → util.ts} +2 -3
  339. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  340. package/src/common/logs/logger-proxy.ts +44 -0
  341. package/src/common/logs/{request.js → request.ts} +22 -9
  342. package/src/common/queue.ts +1 -2
  343. package/src/{config.js → config.ts} +17 -12
  344. package/src/constants.ts +92 -5
  345. package/src/controls-options-manager/constants.ts +5 -0
  346. package/src/controls-options-manager/enums.ts +7 -0
  347. package/src/controls-options-manager/index.ts +240 -0
  348. package/src/controls-options-manager/util.ts +30 -0
  349. package/src/index.js +4 -1
  350. package/src/locus-info/controlsUtils.ts +141 -0
  351. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  352. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  353. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  354. package/src/locus-info/{index.js → index.ts} +211 -71
  355. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  356. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  357. package/src/locus-info/{parser.js → parser.ts} +67 -79
  358. package/src/locus-info/{selfUtils.js → selfUtils.ts} +183 -67
  359. package/src/media/{index.js → index.ts} +179 -176
  360. package/src/media/{properties.js → properties.ts} +60 -37
  361. package/src/media/{util.js → util.ts} +2 -2
  362. package/src/mediaQualityMetrics/config.ts +384 -0
  363. package/src/meeting/in-meeting-actions.ts +67 -3
  364. package/src/meeting/{index.js → index.ts} +2605 -1605
  365. package/src/meeting/{muteState.js → muteState.ts} +138 -73
  366. package/src/meeting/{request.js → request.ts} +326 -142
  367. package/src/meeting/request.type.ts +13 -0
  368. package/src/meeting/{state.js → state.ts} +50 -35
  369. package/src/meeting/{util.js → util.ts} +131 -115
  370. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  371. package/src/meeting-info/{index.js → index.ts} +42 -36
  372. package/src/meeting-info/meeting-info-v2.ts +273 -0
  373. package/src/meeting-info/{request.js → request.ts} +14 -4
  374. package/src/meeting-info/{util.js → util.ts} +60 -51
  375. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  376. package/src/meetings/{collection.js → collection.ts} +26 -3
  377. package/src/meetings/index.ts +1275 -0
  378. package/src/meetings/{request.js → request.ts} +34 -25
  379. package/src/meetings/{util.js → util.ts} +99 -33
  380. package/src/member/{index.js → index.ts} +124 -56
  381. package/src/member/types.ts +24 -0
  382. package/src/member/{util.js → util.ts} +105 -25
  383. package/src/members/{collection.js → collection.ts} +10 -2
  384. package/src/members/{index.js → index.ts} +281 -144
  385. package/src/members/{request.js → request.ts} +80 -16
  386. package/src/members/types.ts +28 -0
  387. package/src/members/{util.js → util.ts} +108 -55
  388. package/src/metrics/{config.js → config.ts} +255 -92
  389. package/src/metrics/{constants.js → constants.ts} +0 -6
  390. package/src/metrics/{index.js → index.ts} +110 -94
  391. package/src/multistream/mediaRequestManager.ts +144 -40
  392. package/src/multistream/receiveSlot.ts +69 -26
  393. package/src/multistream/receiveSlotManager.ts +50 -38
  394. package/src/multistream/remoteMedia.ts +30 -4
  395. package/src/multistream/remoteMediaGroup.ts +4 -3
  396. package/src/multistream/remoteMediaManager.ts +230 -66
  397. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  398. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  399. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  400. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  401. package/src/reachability/{index.js → index.ts} +157 -94
  402. package/src/reachability/request.ts +46 -35
  403. package/src/reactions/constants.ts +4 -0
  404. package/src/reactions/reactions.ts +104 -0
  405. package/src/reactions/reactions.type.ts +62 -0
  406. package/src/reconnection-manager/{index.js → index.ts} +228 -120
  407. package/src/recording-controller/enums.ts +8 -0
  408. package/src/recording-controller/index.ts +315 -0
  409. package/src/recording-controller/util.ts +58 -0
  410. package/src/roap/{index.js → index.ts} +77 -60
  411. package/src/roap/request.ts +172 -0
  412. package/src/roap/turnDiscovery.ts +81 -41
  413. package/src/statsAnalyzer/global.ts +37 -0
  414. package/src/statsAnalyzer/index.ts +1242 -0
  415. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  416. package/src/transcription/{index.js → index.ts} +46 -39
  417. package/test/integration/spec/converged-space-meetings.js +176 -0
  418. package/test/integration/spec/journey.js +665 -464
  419. package/test/integration/spec/space-meeting.js +320 -206
  420. package/test/integration/spec/transcription.js +7 -8
  421. package/test/unit/spec/breakouts/breakout.ts +178 -0
  422. package/test/unit/spec/breakouts/collection.ts +15 -0
  423. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  424. package/test/unit/spec/breakouts/index.ts +1252 -0
  425. package/test/unit/spec/breakouts/request.ts +104 -0
  426. package/test/unit/spec/breakouts/utils.js +54 -0
  427. package/test/unit/spec/common/browser-detection.js +9 -28
  428. package/test/unit/spec/controls-options-manager/index.js +204 -0
  429. package/test/unit/spec/controls-options-manager/util.js +86 -0
  430. package/test/unit/spec/fixture/locus.js +92 -90
  431. package/test/unit/spec/locus-info/controlsUtils.js +133 -34
  432. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  433. package/test/unit/spec/locus-info/index.js +303 -2
  434. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  435. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  436. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  437. package/test/unit/spec/locus-info/parser.js +3 -9
  438. package/test/unit/spec/locus-info/selfConstant.js +101 -103
  439. package/test/unit/spec/locus-info/selfUtils.js +165 -12
  440. package/test/unit/spec/media/index.ts +72 -8
  441. package/test/unit/spec/media/properties.ts +9 -9
  442. package/test/unit/spec/meeting/in-meeting-actions.ts +29 -2
  443. package/test/unit/spec/meeting/index.js +2503 -802
  444. package/test/unit/spec/meeting/muteState.js +146 -61
  445. package/test/unit/spec/meeting/request.js +141 -43
  446. package/test/unit/spec/meeting/utils.js +135 -164
  447. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  448. package/test/unit/spec/meeting-info/request.js +7 -9
  449. package/test/unit/spec/meeting-info/util.js +11 -12
  450. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  451. package/test/unit/spec/meetings/collection.js +15 -1
  452. package/test/unit/spec/meetings/index.js +622 -263
  453. package/test/unit/spec/meetings/utils.js +65 -14
  454. package/test/unit/spec/member/index.js +24 -1
  455. package/test/unit/spec/member/util.js +359 -32
  456. package/test/unit/spec/members/index.js +294 -54
  457. package/test/unit/spec/members/request.js +50 -20
  458. package/test/unit/spec/members/utils.js +147 -4
  459. package/test/unit/spec/metrics/index.js +16 -21
  460. package/test/unit/spec/multistream/mediaRequestManager.ts +369 -68
  461. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  462. package/test/unit/spec/multistream/receiveSlotManager.ts +60 -38
  463. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  464. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  465. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  466. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  467. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  468. package/test/unit/spec/reachability/index.ts +176 -27
  469. package/test/unit/spec/reachability/request.js +66 -0
  470. package/test/unit/spec/reconnection-manager/index.js +58 -30
  471. package/test/unit/spec/recording-controller/index.js +231 -0
  472. package/test/unit/spec/recording-controller/util.js +102 -0
  473. package/test/unit/spec/roap/index.ts +12 -8
  474. package/test/unit/spec/roap/request.ts +217 -0
  475. package/test/unit/spec/roap/turnDiscovery.ts +72 -49
  476. package/test/unit/spec/stats-analyzer/index.js +108 -57
  477. package/test/utils/cmr.js +44 -42
  478. package/test/utils/constants.js +9 -0
  479. package/test/utils/testUtils.js +98 -77
  480. package/test/utils/webex-config.js +22 -18
  481. package/test/utils/webex-test-users.js +57 -50
  482. package/tsconfig.json +6 -0
  483. package/dist/media/internal-media-core-wrapper.js +0 -22
  484. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  485. package/dist/meeting/effectsState.js +0 -327
  486. package/dist/meeting/effectsState.js.map +0 -1
  487. package/dist/multistream/multistreamMedia.js +0 -116
  488. package/dist/multistream/multistreamMedia.js.map +0 -1
  489. package/dist/peer-connection-manager/util.js +0 -124
  490. package/dist/peer-connection-manager/util.js.map +0 -1
  491. package/src/common/logs/logger-proxy.js +0 -33
  492. package/src/locus-info/controlsUtils.js +0 -102
  493. package/src/media/internal-media-core-wrapper.ts +0 -9
  494. package/src/mediaQualityMetrics/config.js +0 -382
  495. package/src/meeting/effectsState.js +0 -205
  496. package/src/meeting-info/meeting-info-v2.js +0 -255
  497. package/src/meetings/index.js +0 -1015
  498. package/src/multistream/multistreamMedia.ts +0 -92
  499. package/src/peer-connection-manager/util.ts +0 -117
  500. package/src/roap/request.js +0 -127
  501. package/src/statsAnalyzer/global.js +0 -133
  502. package/src/statsAnalyzer/index.js +0 -1006
  503. package/src/statsAnalyzer/mqaUtil.js +0 -173
  504. package/test/unit/spec/meeting/effectsState.js +0 -291
  505. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  506. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -25,28 +25,33 @@ describe('TurnDiscovery', () => {
25
25
  sinon.stub(Metrics, 'sendBehavioralMetric');
26
26
 
27
27
  mockRoapRequest = {
28
- sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS})
28
+ sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS}),
29
29
  } as unknown as RoapRequest;
30
30
 
31
31
  testMeeting = {
32
32
  id: 'fake meeting id',
33
33
  config: {
34
34
  experimental: {
35
- enableTurnDiscovery: true
36
- }
35
+ enableTurnDiscovery: true,
36
+ },
37
37
  },
38
38
  correlationId: 'fake correlation id',
39
39
  selfUrl: 'fake self url',
40
40
  mediaId: 'fake media id',
41
41
  locusUrl: `https://locus-a.wbx2.com/locus/api/v1/loci/${FAKE_LOCUS_ID}`,
42
42
  roapSeq: -1,
43
- isAudioMuted: () => true,
44
- isVideoMuted: () => false,
43
+ audio:{
44
+ isLocallyMuted: () => true,
45
+ },
46
+ video:{
47
+ isLocallyMuted: () => false,
48
+ },
45
49
  setRoapSeq: sinon.fake((newSeq) => {
46
50
  testMeeting.roapSeq = newSeq;
47
51
  }),
48
52
  updateMediaConnections: sinon.stub(),
49
- webex: {meetings: {reachability: {isAnyClusterReachable: () => false}}}
53
+ webex: {meetings: {reachability: {isAnyClusterReachable: () => Promise.resolve(false)}}},
54
+ isMultistream: false
50
55
  };
51
56
  });
52
57
 
@@ -55,7 +60,11 @@ describe('TurnDiscovery', () => {
55
60
  sinon.restore();
56
61
  });
57
62
 
58
- const checkRoapMessageSent = async (messageType, expectedSeq, expectedMediaId = testMeeting.mediaId) => {
63
+ const checkRoapMessageSent = async (
64
+ messageType,
65
+ expectedSeq,
66
+ expectedMediaId = testMeeting.mediaId
67
+ ) => {
59
68
  await testUtils.flushPromises();
60
69
 
61
70
  assert.calledOnce(mockRoapRequest.sendRoap);
@@ -68,9 +77,10 @@ describe('TurnDiscovery', () => {
68
77
  correlationId: testMeeting.correlationId,
69
78
  locusSelfUrl: testMeeting.selfUrl,
70
79
  mediaId: expectedMediaId,
71
- audioMuted: testMeeting.isAudioMuted(),
72
- videoMuted: testMeeting.isVideoMuted(),
73
- meetingId: testMeeting.id
80
+ audioMuted: testMeeting.audio?.isLocallyMuted(),
81
+ videoMuted: testMeeting.video?.isLocallyMuted(),
82
+ meetingId: testMeeting.id,
83
+ preferTranscoding: !testMeeting.isMultistream
74
84
  });
75
85
 
76
86
  if (messageType === 'TURN_DISCOVERY_REQUEST') {
@@ -93,39 +103,44 @@ describe('TurnDiscovery', () => {
93
103
  };
94
104
 
95
105
  describe('doTurnDiscovery', () => {
96
- it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK', async () => {
97
- const td = new TurnDiscovery(mockRoapRequest);
106
+ [false, true].forEach(function (enabledMultistream ) {
107
+ it('sends TURN_DISCOVERY_REQUEST'+ (enabledMultistream ? ' when enable Multistream':'') + ', waits for response and sends OK', async () => {
108
+ testMeeting.isMultistream = enabledMultistream;
98
109
 
99
- const result = td.doTurnDiscovery(testMeeting, false);
110
+ const td = new TurnDiscovery(mockRoapRequest);
100
111
 
101
- // check that TURN_DISCOVERY_REQUEST was sent
102
- await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
112
+ const result = td.doTurnDiscovery(testMeeting, false);
103
113
 
104
- mockRoapRequest.sendRoap.resetHistory();
114
+ // check that TURN_DISCOVERY_REQUEST was sent
115
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
105
116
 
106
- // simulate the response
107
- td.handleTurnDiscoveryResponse({
108
- headers: [
109
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
110
- `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
111
- `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
112
- ]
113
- });
117
+ // @ts-ignore
118
+ mockRoapRequest.sendRoap.resetHistory();
114
119
 
115
- await testUtils.flushPromises();
120
+ // simulate the response
121
+ td.handleTurnDiscoveryResponse({
122
+ headers: [
123
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
124
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
125
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
126
+ ]
127
+ });
116
128
 
117
- // check that we've sent OK
118
- await checkRoapMessageSent('OK', 0);
129
+ await testUtils.flushPromises();
119
130
 
120
- const {turnServerInfo, turnDiscoverySkippedReason} = await result;
131
+ // check that we've sent OK
132
+ await checkRoapMessageSent('OK', 0);
121
133
 
122
- assert.deepEqual(turnServerInfo, {
123
- url: FAKE_TURN_URL,
124
- username: FAKE_TURN_USERNAME,
125
- password: FAKE_TURN_PASSWORD
126
- });
134
+ const {turnServerInfo, turnDiscoverySkippedReason} = await result;
127
135
 
128
- assert.isUndefined(turnDiscoverySkippedReason);
136
+ assert.deepEqual(turnServerInfo, {
137
+ url: FAKE_TURN_URL,
138
+ username: FAKE_TURN_USERNAME,
139
+ password: FAKE_TURN_PASSWORD
140
+ });
141
+
142
+ assert.isUndefined(turnDiscoverySkippedReason);
143
+ });
129
144
  });
130
145
 
131
146
  it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
@@ -137,6 +152,7 @@ describe('TurnDiscovery', () => {
137
152
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0, '');
138
153
 
139
154
  // the main part of the test is complete now, checking the remaining part of the flow just for completeness
155
+ // @ts-ignore
140
156
  mockRoapRequest.sendRoap.resetHistory();
141
157
 
142
158
  // simulate the response
@@ -145,7 +161,7 @@ describe('TurnDiscovery', () => {
145
161
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
146
162
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
147
163
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
148
- ]
164
+ ],
149
165
  });
150
166
 
151
167
  await testUtils.flushPromises();
@@ -158,7 +174,7 @@ describe('TurnDiscovery', () => {
158
174
  assert.deepEqual(turnServerInfo, {
159
175
  url: FAKE_TURN_URL,
160
176
  username: FAKE_TURN_USERNAME,
161
- password: FAKE_TURN_PASSWORD
177
+ password: FAKE_TURN_PASSWORD,
162
178
  });
163
179
  assert.isUndefined(turnDiscoverySkippedReason);
164
180
  });
@@ -169,7 +185,7 @@ describe('TurnDiscovery', () => {
169
185
 
170
186
  // check that TURN_DISCOVERY_REQUEST was sent
171
187
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
172
-
188
+ // @ts-ignore
173
189
  mockRoapRequest.sendRoap.resetHistory();
174
190
 
175
191
  // simulate the response with some extra headers
@@ -181,7 +197,7 @@ describe('TurnDiscovery', () => {
181
197
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
182
198
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
183
199
  'another-header-at-the-end=12345',
184
- ]
200
+ ],
185
201
  });
186
202
 
187
203
  await testUtils.flushPromises();
@@ -193,7 +209,7 @@ describe('TurnDiscovery', () => {
193
209
  assert.deepEqual(turnServerInfo, {
194
210
  url: FAKE_TURN_URL,
195
211
  username: FAKE_TURN_USERNAME,
196
- password: FAKE_TURN_PASSWORD
212
+ password: FAKE_TURN_PASSWORD,
197
213
  });
198
214
  assert.isUndefined(turnDiscoverySkippedReason);
199
215
  });
@@ -202,7 +218,7 @@ describe('TurnDiscovery', () => {
202
218
  const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
203
219
 
204
220
  testMeeting.config.experimental.enableTurnDiscovery = false;
205
-
221
+ // @ts-ignore
206
222
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
207
223
 
208
224
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -232,7 +248,7 @@ describe('TurnDiscovery', () => {
232
248
 
233
249
  it('resolves with undefined when cluster is reachable', async () => {
234
250
  const prev = testMeeting.webex.meetings.reachability.isAnyClusterReachable;
235
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => true;
251
+ testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => Promise.resolve(true);
236
252
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
237
253
 
238
254
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -242,10 +258,9 @@ describe('TurnDiscovery', () => {
242
258
  assert.notCalled(mockRoapRequest.sendRoap);
243
259
  assert.notCalled(Metrics.sendBehavioralMetric);
244
260
  testMeeting.webex.meetings.reachability.isAnyClusterReachable = prev;
245
-
246
261
  });
247
262
 
248
- it('resolves with undefined if we don\'t get a response within 10s', async () => {
263
+ it("resolves with undefined if we don't get a response within 10s", async () => {
249
264
  const td = new TurnDiscovery(mockRoapRequest);
250
265
 
251
266
  const promise = td.doTurnDiscovery(testMeeting, false);
@@ -264,12 +279,14 @@ describe('TurnDiscovery', () => {
264
279
  const td = new TurnDiscovery(mockRoapRequest);
265
280
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
266
281
 
282
+ await testUtils.flushPromises();
283
+
267
284
  // simulate the response without the password
268
285
  td.handleTurnDiscoveryResponse({
269
286
  headers: [
270
287
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
271
288
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
272
- ]
289
+ ],
273
290
  });
274
291
  await testUtils.flushPromises();
275
292
  const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
@@ -283,6 +300,8 @@ describe('TurnDiscovery', () => {
283
300
  const td = new TurnDiscovery(mockRoapRequest);
284
301
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
285
302
 
303
+ await testUtils.flushPromises();
304
+
286
305
  // simulate the response without the headers
287
306
  td.handleTurnDiscoveryResponse({});
288
307
 
@@ -298,11 +317,13 @@ describe('TurnDiscovery', () => {
298
317
  const td = new TurnDiscovery(mockRoapRequest);
299
318
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
300
319
 
320
+ await testUtils.flushPromises();
321
+
301
322
  // simulate the response without the headers
302
323
  td.handleTurnDiscoveryResponse({headers: []});
303
324
 
304
325
  await testUtils.flushPromises();
305
- const {turnServerInfo, turnDiscoverySkippedReason}= await turnDiscoveryPromise;
326
+ const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
306
327
 
307
328
  assert.isUndefined(turnServerInfo);
308
329
  assert.isUndefined(turnDiscoverySkippedReason);
@@ -314,9 +335,11 @@ describe('TurnDiscovery', () => {
314
335
 
315
336
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
316
337
 
338
+ await testUtils.flushPromises();
339
+
317
340
  // check that TURN_DISCOVERY_REQUEST was sent
318
341
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
319
-
342
+ // @ts-ignore
320
343
  mockRoapRequest.sendRoap.resetHistory();
321
344
 
322
345
  // setup the mock so that sending of OK fails
@@ -328,7 +351,7 @@ describe('TurnDiscovery', () => {
328
351
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
329
352
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
330
353
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
331
- ]
354
+ ],
332
355
  });
333
356
 
334
357
  await testUtils.flushPromises();
@@ -345,7 +368,7 @@ describe('TurnDiscovery', () => {
345
368
  });
346
369
 
347
370
  describe('handleTurnDiscoveryResponse', () => {
348
- it('doesn\'t do anything if turn discovery was not started', () => {
371
+ it("doesn't do anything if turn discovery was not started", () => {
349
372
  const td = new TurnDiscovery(mockRoapRequest);
350
373
 
351
374
  // there is not much we can check, but we mainly want to make
@@ -355,7 +378,7 @@ describe('TurnDiscovery', () => {
355
378
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
356
379
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
357
380
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
358
- ]
381
+ ],
359
382
  });
360
383
 
361
384
  assert.notCalled(mockRoapRequest.sendRoap);
@@ -2,7 +2,7 @@ import 'jsdom-global/register';
2
2
  import chai from 'chai';
3
3
  import chaiAsPromised from 'chai-as-promised';
4
4
  import sinon from 'sinon';
5
- import {MediaConnection as MC} from '@webex/internal-media-core';
5
+ import {ConnectionState} from '@webex/internal-media-core';
6
6
 
7
7
  import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
8
8
  import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
@@ -20,31 +20,32 @@ describe('plugin-meetings', () => {
20
20
  let sandBoxSpy;
21
21
 
22
22
  const initialConfig = {
23
- videoPacketLossRatioThreshold: 9
23
+ videoPacketLossRatioThreshold: 9,
24
24
  };
25
25
 
26
26
  const defaultStats = {
27
+ resolutions: {},
27
28
  internal: {
28
- video: {
29
+ 'video-send-1': {
29
30
  send: {
30
- totalPacketsLostOnReceiver: 10
31
- }
32
- }
31
+ totalPacketsLostOnReceiver: 10,
32
+ },
33
+ },
33
34
  },
34
- video: {
35
+ 'video-send-1': {
35
36
  send: {
36
37
  packetsSent: 2,
37
38
  meanRemoteJitter: [],
38
- meanRoundTripTime: []
39
- }
40
- }
39
+ meanRoundTripTime: [],
40
+ },
41
+ },
41
42
  };
42
43
 
43
44
  const statusResult = {
44
45
  type: 'remote-inbound-rtp',
45
46
  packetsLost: 11,
46
47
  rttThreshold: 501,
47
- jitterThreshold: 501
48
+ jitterThreshold: 501,
48
49
  };
49
50
 
50
51
  const sandbox = sinon.createSandbox();
@@ -54,7 +55,10 @@ describe('plugin-meetings', () => {
54
55
 
55
56
  statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor, defaultStats);
56
57
 
57
- sandBoxSpy = sandbox.spy(statsAnalyzer.networkQualityMonitor, 'determineUplinkNetworkQuality');
58
+ sandBoxSpy = sandbox.spy(
59
+ statsAnalyzer.networkQualityMonitor,
60
+ 'determineUplinkNetworkQuality'
61
+ );
58
62
  });
59
63
 
60
64
  afterEach(() => {
@@ -62,14 +66,16 @@ describe('plugin-meetings', () => {
62
66
  });
63
67
 
64
68
  it('should trigger determineUplinkNetworkQuality with specific arguments', async () => {
65
- await statsAnalyzer.parseGetStatsResult(statusResult, 'video');
69
+ await statsAnalyzer.parseGetStatsResult(statusResult, 'video-send-1', true);
66
70
 
67
71
  assert.calledOnce(statsAnalyzer.networkQualityMonitor.determineUplinkNetworkQuality);
68
- assert(sandBoxSpy.calledWith({
69
- mediaType: 'video',
70
- remoteRtpResults: statusResult,
71
- statsAnalyzerCurrentStats: statsAnalyzer.statsResults
72
- }));
72
+ assert(
73
+ sandBoxSpy.calledWith({
74
+ mediaType: 'video-send-1',
75
+ remoteRtpResults: statusResult,
76
+ statsAnalyzerCurrentStats: statsAnalyzer.statsResults,
77
+ })
78
+ );
73
79
  });
74
80
  });
75
81
 
@@ -78,6 +84,7 @@ describe('plugin-meetings', () => {
78
84
  let pc;
79
85
  let networkQualityMonitor;
80
86
  let statsAnalyzer;
87
+ let mqeData;
81
88
 
82
89
  let receivedEventsData = {
83
90
  local: {},
@@ -105,52 +112,78 @@ describe('plugin-meetings', () => {
105
112
  // bytesReceived and bytesSent need to be non-zero in order for StatsAnalyzer to parse any other values
106
113
  fakeStats = {
107
114
  audio: {
108
- receiver: {
109
- type: 'inbound-rtp',
110
- packetsReceived: 0,
111
- bytesReceived: 1,
112
- },
113
- sender: {
114
- type: 'outbound-rtp',
115
- packetsSent: 0,
116
- bytesSent: 1,
117
- }
115
+ senders: [
116
+ {
117
+ report: [
118
+ {
119
+ type: 'outbound-rtp',
120
+ packetsSent: 0,
121
+ bytesSent: 1,
122
+ },
123
+ ],
124
+ },
125
+ ],
126
+ receivers: [
127
+ {
128
+ report: [
129
+ {
130
+ type: 'inbound-rtp',
131
+ packetsReceived: 0,
132
+ bytesReceived: 1,
133
+ },
134
+ ],
135
+ },
136
+ ],
118
137
  },
119
138
  video: {
120
- receiver: {
121
- type: 'inbound-rtp',
122
- framesDecoded: 0,
123
- bytesReceived: 1,
124
- },
125
- sender: {
126
- type: 'outbound-rtp',
127
- framesSent: 0,
128
- bytesSent: 1,
129
- }
130
- }
139
+ senders: [
140
+ {
141
+ report: [
142
+ {
143
+ type: 'outbound-rtp',
144
+ framesSent: 0,
145
+ bytesSent: 1,
146
+ },
147
+ ],
148
+ },
149
+ ],
150
+ receivers: [
151
+ {
152
+ report: [
153
+ {
154
+ type: 'inbound-rtp',
155
+ framesDecoded: 0,
156
+ bytesReceived: 1,
157
+ frameHeight: 720,
158
+ frameWidth: 1280,
159
+ framesReceived: 1,
160
+ },
161
+ ],
162
+ },
163
+ ],
164
+ },
131
165
  };
132
166
 
133
167
  pc = {
134
- getConnectionState: sinon.stub().returns(MC.ConnectionState.Connected),
168
+ getConnectionState: sinon.stub().returns(ConnectionState.Connected),
135
169
  getTransceiverStats: sinon.stub().resolves({
136
170
  audio: {
137
- sender: [fakeStats.audio.sender],
138
- receiver: [fakeStats.audio.receiver],
139
- currentDirection: 'sendrecv',
140
- localTrackLabel: 'fake mic',
171
+ senders: [fakeStats.audio.senders[0]],
172
+ receivers: [fakeStats.audio.receivers[0]],
141
173
  },
142
174
  video: {
143
- sender: [fakeStats.video.sender],
144
- receiver: [fakeStats.video.receiver],
145
- currentDirection: 'sendrecv',
146
- localTrackLabel: 'fake camera',
175
+ senders: [fakeStats.video.senders[0]],
176
+ receivers: [fakeStats.video.receivers[0]],
177
+ },
178
+ screenShareAudio: {
179
+ senders: [],
180
+ receivers: [],
147
181
  },
148
182
  screenShareVideo: {
149
- sender: [],
150
- receiver: [],
151
- currentDirection: 'sendrecv'
152
- }
153
- })
183
+ senders: [],
184
+ receivers: [],
185
+ },
186
+ }),
154
187
  };
155
188
 
156
189
  networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
@@ -169,6 +202,9 @@ describe('plugin-meetings', () => {
169
202
  statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
170
203
  receivedEventsData.remote.stopped = data;
171
204
  });
205
+ statsAnalyzer.on(EVENTS.MEDIA_QUALITY, ({data}) => {
206
+ mqeData = data;
207
+ });
172
208
  });
173
209
 
174
210
  afterEach(() => {
@@ -195,6 +231,12 @@ describe('plugin-meetings', () => {
195
231
  assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
196
232
  };
197
233
 
234
+ const checkMqeData = () => {
235
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedFrameSize, 3600);
236
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedHeight, 720);
237
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedWidth, 1280);
238
+ };
239
+
198
240
  it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
199
241
  await startStatsAnalyzer({expected: {sendAudio: true}});
200
242
 
@@ -202,7 +244,7 @@ describe('plugin-meetings', () => {
202
244
  checkReceivedEvent({expected: {}});
203
245
 
204
246
  // setup a mock to return some values higher the previous ones
205
- fakeStats.audio.sender.packetsSent += 10;
247
+ fakeStats.audio.senders[0].report[0].packetsSent += 10;
206
248
 
207
249
  await progressTime();
208
250
 
@@ -222,7 +264,7 @@ describe('plugin-meetings', () => {
222
264
  checkReceivedEvent({expected: {}});
223
265
 
224
266
  // setup a mock to return some values higher the previous ones
225
- fakeStats.video.sender.framesSent += 1;
267
+ fakeStats.video.senders[0].report[0].framesSent += 1;
226
268
 
227
269
  await progressTime();
228
270
 
@@ -242,7 +284,7 @@ describe('plugin-meetings', () => {
242
284
  checkReceivedEvent({expected: {}});
243
285
 
244
286
  // setup a mock to return some values higher the previous ones
245
- fakeStats.audio.receiver.packetsReceived += 5;
287
+ fakeStats.audio.receivers[0].report[0].packetsReceived += 5;
246
288
 
247
289
  await progressTime();
248
290
  // check that we got the REMOTE_MEDIA_STARTED event for audio
@@ -262,7 +304,7 @@ describe('plugin-meetings', () => {
262
304
  checkReceivedEvent({expected: {}});
263
305
 
264
306
  // setup a mock to return some values higher the previous ones
265
- fakeStats.video.receiver.framesDecoded += 1;
307
+ fakeStats.video.receivers[0].report[0].framesDecoded += 1;
266
308
 
267
309
  await progressTime();
268
310
  // check that we got the REMOTE_MEDIA_STARTED event for video
@@ -274,6 +316,15 @@ describe('plugin-meetings', () => {
274
316
 
275
317
  checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
276
318
  });
319
+
320
+ it('emits the correct MEDIA_QUALITY events', async () => {
321
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
322
+
323
+ await progressTime();
324
+
325
+ // Check that the mqe data has been emitted and is correctly computed.
326
+ checkMqeData();
327
+ });
277
328
  });
278
329
  });
279
330
  });