@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
@@ -1,114 +1,225 @@
1
- import {assert} from '@webex/test-helper-chai';
2
1
  import sinon from 'sinon';
2
+ import {assert} from '@webex/test-helper-chai';
3
3
  import MockWebex from '@webex/test-helper-mock-webex';
4
- import Metrics from '@webex/plugin-meetings/src/metrics';
5
-
4
+ import Meetings from '@webex/plugin-meetings';
6
5
  import RoapRequest from '@webex/plugin-meetings/src/roap/request';
7
-
8
-
9
- describe('RoapRequest', () => {
10
- describe('attachRechabilityData', () => {
11
- let webex;
12
-
13
- beforeEach(() => {
14
- webex = new MockWebex();
6
+ import {REACHABILITY} from '@webex/plugin-meetings/src/constants';
7
+
8
+ describe('plugin-meetings/roap', () => {
9
+ let roapRequest;
10
+ let webex;
11
+ const locusUrl = 'locusUrl';
12
+
13
+ beforeEach(async () => {
14
+ webex = new MockWebex({
15
+ children: {
16
+ meetings: Meetings,
17
+ },
15
18
  });
16
-
17
- it('attaches the reachability data when it exists', async () => {
18
- // @ts-ignore
19
- const roapRequest = new RoapRequest({}, {parent: webex});
20
-
21
- const sdp = {some: 'attribute'};
22
19
 
23
- const reachabilitData = {reachability: 'data'};
20
+ webex.meetings.clientRegion = {
21
+ countryCode: 'US',
22
+ regionCode: 'WEST-COAST',
23
+ };
24
+
25
+ webex.internal = {
26
+ services: {
27
+ get: sinon.mock().returns(locusUrl),
28
+ waitForCatalog: sinon.mock().returns(Promise.resolve({})),
29
+ },
30
+ device: {
31
+ url: 'url',
32
+ },
33
+ newMetrics: {
34
+ submitClientEvent: sinon.stub()
35
+ },
36
+ };
37
+
38
+ // @ts-ignore
39
+ roapRequest = new RoapRequest({webex});
40
+
41
+ roapRequest.request = sinon.mock().returns(
42
+ Promise.resolve({
43
+ body: {
44
+ locus: {
45
+ roapSeq: '',
46
+ id: '',
47
+ url: 'url/path',
48
+ fullState: {
49
+ lastActive: 'lastActive',
50
+ },
51
+ },
52
+ },
53
+ })
54
+ );
24
55
 
25
- await webex.boundedStorage.put(
26
- 'Reachability',
27
- 'reachability.result',
28
- JSON.stringify(reachabilitData)
29
- );
56
+ await webex.boundedStorage.put(
57
+ REACHABILITY.namespace,
58
+ REACHABILITY.localStorageJoinCookie,
59
+ JSON.stringify({
60
+ anycastEntryPoint: 'aws-eu-west-1',
61
+ })
62
+ );
63
+ await webex.boundedStorage.put(
64
+ REACHABILITY.namespace,
65
+ REACHABILITY.localStorageResult,
66
+ JSON.stringify({
67
+ clusterId: {
68
+ udp: 'test',
69
+ },
70
+ })
71
+ );
72
+ });
30
73
 
31
- const newSdp = await roapRequest.attachRechabilityData(sdp);
74
+ describe('#attachReachabilityData', () => {
75
+ it('returns the correct reachability data', async () => {
76
+ const res = await roapRequest.attachReachabilityData({});
32
77
 
33
- assert.deepEqual(newSdp, {
34
- some: 'attribute',
35
- reachability: reachabilitData
36
- })
78
+ assert.deepEqual(res.localSdp, {
79
+ reachability: {
80
+ clusterId: {
81
+ udp: 'test',
82
+ },
83
+ },
84
+ });
85
+ assert.deepEqual(res.joinCookie, {
86
+ anycastEntryPoint: 'aws-eu-west-1',
87
+ });
37
88
  });
38
-
39
- it('handles the case when realiability data does not exist', async () => {
40
- // @ts-ignore
41
- const roapRequest = new RoapRequest({}, {parent: webex});
42
89
 
43
- const sdp = {some: 'attribute'};
90
+ it('handles the case when reachability data does not exist', async () => {
91
+ await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie);
44
92
 
45
- const newSdp = await roapRequest.attachRechabilityData(sdp);
93
+ await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageResult);
94
+ const sdp = {
95
+ some: 'attribute',
96
+ };
97
+
98
+ const result = await roapRequest.attachReachabilityData(sdp);
46
99
 
47
- assert.deepEqual(newSdp, sdp);
100
+ assert.deepEqual(result, {
101
+ joinCookie: undefined,
102
+ localSdp: {
103
+ some: 'attribute',
104
+ },
105
+ });
48
106
  });
49
107
  });
50
108
 
51
109
  describe('sendRoap', () => {
52
- let webex;
53
-
54
- beforeEach(() => {
55
- webex = new MockWebex();
56
- });
110
+ it('includes joinCookie in the request correctly', async () => {
111
+ const locusMediaRequest = {send: sinon.stub().resolves({body: {locus: {}}})};
57
112
 
58
- it('calls attachReliabilityData', async () => {
59
- Metrics.postEvent = sinon.stub();
60
-
61
- // @ts-ignore
62
- const roapRequest = new RoapRequest({}, {parent: webex});
113
+ await roapRequest.sendRoap({
114
+ locusSelfUrl: locusUrl,
115
+ mediaId: 'mediaId',
116
+ roapMessage: {
117
+ seq: 'seq',
118
+ },
119
+ meetingId: 'meeting-id',
120
+ locusMediaRequest,
121
+ });
63
122
 
64
- const newSdp = {new: 'sdp'}
123
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
124
+ name: 'client.locus.media.request',
125
+ options: {
126
+ meetingId: 'meeting-id',
127
+ },
128
+ });
65
129
 
66
- roapRequest.attachRechabilityData = sinon.stub().returns(Promise.resolve(newSdp));
67
- webex.request.returns(Promise.resolve({
68
- body: {
69
- locus: {}
70
- }
71
- }))
130
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
131
+ name: 'client.locus.media.response',
132
+ options: {
133
+ meetingId: 'meeting-id',
134
+ },
135
+ });
72
136
 
73
- const result = await roapRequest.sendRoap({
74
- roapMessage: {seq: 1},
75
- locusSelfUrl: 'locusSelfUrl',
137
+ const requestParams = locusMediaRequest.send.getCall(0).args[0];
138
+ assert.deepEqual(requestParams, {
139
+ type: 'RoapMessage',
140
+ selfUrl: locusUrl,
141
+ joinCookie: {
142
+ anycastEntryPoint: 'aws-eu-west-1',
143
+ },
76
144
  mediaId: 'mediaId',
77
- correlationId: 'correlationId',
78
- audioMuted: true,
79
- videoMuted: true,
80
- meetingId: 'meetingId',
81
- preferTranscoding: true
145
+ roapMessage: {
146
+ seq: 'seq',
147
+ },
148
+ reachability: {clusterId: {udp: 'test'}},
82
149
  });
150
+ });
83
151
 
84
- assert.calledOnceWithExactly(webex.request, {
85
- uri: 'locusSelfUrl/media',
86
- method: 'PUT',
87
- body: {
88
- device: {
89
- url: undefined,
90
- deviceType: undefined,
152
+ it('sends correct client event when fails', async () => {
153
+ const locusMediaRequest = {send: sinon.stub().rejects({code: 300, message: 'error'})};
154
+ try {
155
+ await roapRequest.sendRoap({
156
+ locusSelfUrl: locusUrl,
157
+ mediaId: 'mediaId',
158
+ roapMessage: {
159
+ seq: 'seq',
91
160
  },
92
- correlationId: 'correlationId',
93
- localMedias: [{
94
- localSdp: JSON.stringify(newSdp),
95
- mediaId: 'mediaId'
96
- }],
97
- clientMediaPreferences: {preferTranscoding: true}
98
- },
99
- });
161
+ meetingId: 'meeting-id',
162
+ locusMediaRequest,
163
+ });
164
+ } catch (err) {
165
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
166
+ name: 'client.locus.media.response',
167
+ options: {
168
+ meetingId: 'meeting-id',
169
+ rawError: {code: 300, message: 'error'},
170
+ },
171
+ });
172
+ }
173
+ });
174
+ });
100
175
 
101
- assert.calledOnceWithExactly(roapRequest.attachRechabilityData, {
102
- roapMessage: {seq: 1},
103
- audioMuted: true,
104
- videoMuted: true
176
+ it('calls attachReachabilityData when sendRoap', async () => {
177
+ const locusMediaRequest = { send: sinon.stub().resolves({body: {locus: {}}})};
178
+
179
+ const newSdp = {
180
+ new: 'sdp',
181
+ reachability: { someResult: 'whatever' }
182
+ };
183
+
184
+ roapRequest.attachReachabilityData = sinon.stub().returns(
185
+ Promise.resolve({
186
+ localSdp: newSdp,
187
+ joinCookie: {
188
+ anycastEntryPoint: 'aws-eu-west-1',
189
+ },
105
190
  })
191
+ );
192
+
193
+ await roapRequest.sendRoap({
194
+ roapMessage: {
195
+ seq: 1,
196
+ },
197
+ locusSelfUrl: 'locusSelfUrl',
198
+ mediaId: 'mediaId',
199
+ meetingId: 'meetingId',
200
+ preferTranscoding: true,
201
+ locusMediaRequest
202
+ });
106
203
 
107
- assert.deepEqual(result, {
108
- locus: {
109
- roapSeq: 1
110
- }
111
- });
204
+ const requestParams = locusMediaRequest.send.getCall(0).args[0];
205
+
206
+ assert.deepEqual(requestParams, {
207
+ type: 'RoapMessage',
208
+ selfUrl: 'locusSelfUrl',
209
+ joinCookie: {
210
+ anycastEntryPoint: 'aws-eu-west-1',
211
+ },
212
+ mediaId: 'mediaId',
213
+ roapMessage: {
214
+ seq: 1,
215
+ },
216
+ reachability: { someResult: 'whatever' },
112
217
  });
113
- })
218
+
219
+ assert.calledOnceWithExactly(roapRequest.attachReachabilityData, {
220
+ roapMessage: {
221
+ seq: 1,
222
+ },
223
+ });
224
+ });
114
225
  });
@@ -40,14 +40,19 @@ describe('TurnDiscovery', () => {
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
53
  webex: {meetings: {reachability: {isAnyClusterReachable: () => Promise.resolve(false)}}},
50
- isMultistream: false
54
+ isMultistream: false,
55
+ locusMediaRequest: { fake: true },
51
56
  };
52
57
  });
53
58
 
@@ -70,13 +75,10 @@ describe('TurnDiscovery', () => {
70
75
  version: '2',
71
76
  seq: expectedSeq,
72
77
  },
73
- correlationId: testMeeting.correlationId,
74
78
  locusSelfUrl: testMeeting.selfUrl,
75
79
  mediaId: expectedMediaId,
76
- audioMuted: testMeeting.isAudioMuted(),
77
- videoMuted: testMeeting.isVideoMuted(),
78
80
  meetingId: testMeeting.id,
79
- preferTranscoding: !testMeeting.isMultistream
81
+ locusMediaRequest: testMeeting.locusMediaRequest
80
82
  });
81
83
 
82
84
  if (messageType === 'TURN_DISCOVERY_REQUEST') {
@@ -363,6 +365,27 @@ describe('TurnDiscovery', () => {
363
365
  });
364
366
  });
365
367
 
368
+ describe('isSkipped', () => {
369
+ [
370
+ {enabledInConfig: true, isAnyClusterReachable: true, expectedIsSkipped: true},
371
+ {enabledInConfig: true, isAnyClusterReachable: false, expectedIsSkipped: false},
372
+ {enabledInConfig: false, isAnyClusterReachable: true, expectedIsSkipped: true},
373
+ {enabledInConfig: false, isAnyClusterReachable: false, expectedIsSkipped: true},
374
+ ].forEach(({enabledInConfig, isAnyClusterReachable, expectedIsSkipped}) => {
375
+ it(`returns ${expectedIsSkipped} when TURN discovery is ${enabledInConfig ? '' : 'not '} enabled in config and isAnyClusterReachable() returns ${isAnyClusterReachable ? 'true' : 'false'}`, async () => {
376
+ testMeeting.config.experimental.enableTurnDiscovery = enabledInConfig;
377
+
378
+ sinon.stub(testMeeting.webex.meetings.reachability, 'isAnyClusterReachable').resolves(isAnyClusterReachable);
379
+
380
+ const td = new TurnDiscovery(mockRoapRequest);
381
+
382
+ const isSkipped = await td.isSkipped(testMeeting);
383
+
384
+ assert.equal(isSkipped, expectedIsSkipped);
385
+ })
386
+ })
387
+ })
388
+
366
389
  describe('handleTurnDiscoveryResponse', () => {
367
390
  it("doesn't do anything if turn discovery was not started", () => {
368
391
  const td = new TurnDiscovery(mockRoapRequest);
@@ -0,0 +1,60 @@
1
+ import RtcMetrics from '@webex/plugin-meetings/src/rtcMetrics';
2
+ import MockWebex from '@webex/test-helper-mock-webex';
3
+ import {assert} from '@webex/test-helper-chai';
4
+ import sinon from 'sinon';
5
+
6
+ const FAKE_METRICS_ITEM = {payload: ['fake-metrics']};
7
+
8
+ describe('RtcMetrics', () => {
9
+ let metrics: RtcMetrics;
10
+ let webex: MockWebex;
11
+ let clock;
12
+
13
+ beforeEach(() => {
14
+ clock = sinon.useFakeTimers();
15
+ webex = new MockWebex();
16
+ metrics = new RtcMetrics(webex, 'mock-meeting-id');
17
+ });
18
+
19
+ it('sendMetrics should send a webex request', () => {
20
+ assert.notCalled(webex.request);
21
+
22
+ metrics.addMetrics(FAKE_METRICS_ITEM);
23
+ (metrics as any).sendMetrics();
24
+
25
+ assert.callCount(webex.request, 1);
26
+ });
27
+
28
+ it('should send metrics requests over time', () => {
29
+ assert.notCalled(webex.request);
30
+
31
+ metrics.addMetrics(FAKE_METRICS_ITEM);
32
+ assert.deepEqual(metrics.metricsQueue, [FAKE_METRICS_ITEM]);
33
+ clock.tick(60 * 1000);
34
+
35
+ assert.callCount(webex.request, 1);
36
+ });
37
+
38
+ it('should not send requests with no items in the queue', () => {
39
+ clock.tick(60 * 1000);
40
+ assert.notCalled(webex.request);
41
+ });
42
+
43
+ it('checkMetrics should send metrics if any exist in the queue', () => {
44
+ assert.notCalled(webex.request);
45
+
46
+ metrics.addMetrics(FAKE_METRICS_ITEM);
47
+ (metrics as any).checkMetrics();
48
+
49
+ assert.callCount(webex.request, 1);
50
+ });
51
+
52
+ it('should clear out metrics on close', () => {
53
+ assert.notCalled(webex.request);
54
+
55
+ metrics.addMetrics(FAKE_METRICS_ITEM);
56
+ metrics.closeMetrics();
57
+
58
+ assert.callCount(webex.request, 1);
59
+ });
60
+ });
@@ -24,14 +24,15 @@ describe('plugin-meetings', () => {
24
24
  };
25
25
 
26
26
  const defaultStats = {
27
+ resolutions: {},
27
28
  internal: {
28
- video: {
29
+ 'video-send-1': {
29
30
  send: {
30
31
  totalPacketsLostOnReceiver: 10,
31
32
  },
32
33
  },
33
34
  },
34
- video: {
35
+ 'video-send-1': {
35
36
  send: {
36
37
  packetsSent: 2,
37
38
  meanRemoteJitter: [],
@@ -52,7 +53,12 @@ describe('plugin-meetings', () => {
52
53
  beforeEach(() => {
53
54
  const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
54
55
 
55
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor, defaultStats);
56
+ statsAnalyzer = new StatsAnalyzer(
57
+ initialConfig,
58
+ () => ({}),
59
+ networkQualityMonitor,
60
+ defaultStats
61
+ );
56
62
 
57
63
  sandBoxSpy = sandbox.spy(
58
64
  statsAnalyzer.networkQualityMonitor,
@@ -65,12 +71,12 @@ describe('plugin-meetings', () => {
65
71
  });
66
72
 
67
73
  it('should trigger determineUplinkNetworkQuality with specific arguments', async () => {
68
- await statsAnalyzer.parseGetStatsResult(statusResult, 'video');
74
+ await statsAnalyzer.parseGetStatsResult(statusResult, 'video-send-1', true);
69
75
 
70
76
  assert.calledOnce(statsAnalyzer.networkQualityMonitor.determineUplinkNetworkQuality);
71
77
  assert(
72
78
  sandBoxSpy.calledWith({
73
- mediaType: 'video',
79
+ mediaType: 'video-send-1',
74
80
  remoteRtpResults: statusResult,
75
81
  statsAnalyzerCurrentStats: statsAnalyzer.statsResults,
76
82
  })
@@ -83,6 +89,7 @@ describe('plugin-meetings', () => {
83
89
  let pc;
84
90
  let networkQualityMonitor;
85
91
  let statsAnalyzer;
92
+ let mqeData;
86
93
 
87
94
  let receivedEventsData = {
88
95
  local: {},
@@ -110,28 +117,55 @@ describe('plugin-meetings', () => {
110
117
  // bytesReceived and bytesSent need to be non-zero in order for StatsAnalyzer to parse any other values
111
118
  fakeStats = {
112
119
  audio: {
113
- receiver: {
114
- type: 'inbound-rtp',
115
- packetsReceived: 0,
116
- bytesReceived: 1,
117
- },
118
- sender: {
119
- type: 'outbound-rtp',
120
- packetsSent: 0,
121
- bytesSent: 1,
122
- },
120
+ senders: [
121
+ {
122
+ report: [
123
+ {
124
+ type: 'outbound-rtp',
125
+ packetsSent: 0,
126
+ bytesSent: 1,
127
+ },
128
+ ],
129
+ },
130
+ ],
131
+ receivers: [
132
+ {
133
+ report: [
134
+ {
135
+ type: 'inbound-rtp',
136
+ packetsReceived: 0,
137
+ bytesReceived: 1,
138
+ },
139
+ ],
140
+ },
141
+ ],
123
142
  },
124
143
  video: {
125
- receiver: {
126
- type: 'inbound-rtp',
127
- framesDecoded: 0,
128
- bytesReceived: 1,
129
- },
130
- sender: {
131
- type: 'outbound-rtp',
132
- framesSent: 0,
133
- bytesSent: 1,
134
- },
144
+ senders: [
145
+ {
146
+ report: [
147
+ {
148
+ type: 'outbound-rtp',
149
+ framesSent: 0,
150
+ bytesSent: 1,
151
+ },
152
+ ],
153
+ },
154
+ ],
155
+ receivers: [
156
+ {
157
+ report: [
158
+ {
159
+ type: 'inbound-rtp',
160
+ framesDecoded: 0,
161
+ bytesReceived: 1,
162
+ frameHeight: 720,
163
+ frameWidth: 1280,
164
+ framesReceived: 1,
165
+ },
166
+ ],
167
+ },
168
+ ],
135
169
  },
136
170
  };
137
171
 
@@ -139,28 +173,27 @@ describe('plugin-meetings', () => {
139
173
  getConnectionState: sinon.stub().returns(ConnectionState.Connected),
140
174
  getTransceiverStats: sinon.stub().resolves({
141
175
  audio: {
142
- sender: [fakeStats.audio.sender],
143
- receiver: [fakeStats.audio.receiver],
144
- currentDirection: 'sendrecv',
145
- localTrackLabel: 'fake mic',
176
+ senders: [fakeStats.audio.senders[0]],
177
+ receivers: [fakeStats.audio.receivers[0]],
146
178
  },
147
179
  video: {
148
- sender: [fakeStats.video.sender],
149
- receiver: [fakeStats.video.receiver],
150
- currentDirection: 'sendrecv',
151
- localTrackLabel: 'fake camera',
180
+ senders: [fakeStats.video.senders[0]],
181
+ receivers: [fakeStats.video.receivers[0]],
182
+ },
183
+ screenShareAudio: {
184
+ senders: [],
185
+ receivers: [],
152
186
  },
153
187
  screenShareVideo: {
154
- sender: [],
155
- receiver: [],
156
- currentDirection: 'sendrecv',
188
+ senders: [],
189
+ receivers: [],
157
190
  },
158
191
  }),
159
192
  };
160
193
 
161
194
  networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
162
195
 
163
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
196
+ statsAnalyzer = new StatsAnalyzer(initialConfig, () => ({}), networkQualityMonitor);
164
197
 
165
198
  statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
166
199
  receivedEventsData.local.started = data;
@@ -174,6 +207,9 @@ describe('plugin-meetings', () => {
174
207
  statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
175
208
  receivedEventsData.remote.stopped = data;
176
209
  });
210
+ statsAnalyzer.on(EVENTS.MEDIA_QUALITY, ({data}) => {
211
+ mqeData = data;
212
+ });
177
213
  });
178
214
 
179
215
  afterEach(() => {
@@ -200,6 +236,12 @@ describe('plugin-meetings', () => {
200
236
  assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
201
237
  };
202
238
 
239
+ const checkMqeData = () => {
240
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedFrameSize, 3600);
241
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedHeight, 720);
242
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedWidth, 1280);
243
+ };
244
+
203
245
  it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
204
246
  await startStatsAnalyzer({expected: {sendAudio: true}});
205
247
 
@@ -207,7 +249,7 @@ describe('plugin-meetings', () => {
207
249
  checkReceivedEvent({expected: {}});
208
250
 
209
251
  // setup a mock to return some values higher the previous ones
210
- fakeStats.audio.sender.packetsSent += 10;
252
+ fakeStats.audio.senders[0].report[0].packetsSent += 10;
211
253
 
212
254
  await progressTime();
213
255
 
@@ -227,7 +269,7 @@ describe('plugin-meetings', () => {
227
269
  checkReceivedEvent({expected: {}});
228
270
 
229
271
  // setup a mock to return some values higher the previous ones
230
- fakeStats.video.sender.framesSent += 1;
272
+ fakeStats.video.senders[0].report[0].framesSent += 1;
231
273
 
232
274
  await progressTime();
233
275
 
@@ -247,7 +289,7 @@ describe('plugin-meetings', () => {
247
289
  checkReceivedEvent({expected: {}});
248
290
 
249
291
  // setup a mock to return some values higher the previous ones
250
- fakeStats.audio.receiver.packetsReceived += 5;
292
+ fakeStats.audio.receivers[0].report[0].packetsReceived += 5;
251
293
 
252
294
  await progressTime();
253
295
  // check that we got the REMOTE_MEDIA_STARTED event for audio
@@ -267,7 +309,7 @@ describe('plugin-meetings', () => {
267
309
  checkReceivedEvent({expected: {}});
268
310
 
269
311
  // setup a mock to return some values higher the previous ones
270
- fakeStats.video.receiver.framesDecoded += 1;
312
+ fakeStats.video.receivers[0].report[0].framesDecoded += 1;
271
313
 
272
314
  await progressTime();
273
315
  // check that we got the REMOTE_MEDIA_STARTED event for video
@@ -279,6 +321,15 @@ describe('plugin-meetings', () => {
279
321
 
280
322
  checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
281
323
  });
324
+
325
+ it('emits the correct MEDIA_QUALITY events', async () => {
326
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
327
+
328
+ await progressTime();
329
+
330
+ // Check that the mqe data has been emitted and is correctly computed.
331
+ checkMqeData();
332
+ });
282
333
  });
283
334
  });
284
335
  });
@@ -0,0 +1,9 @@
1
+ // MOVE TO TEST CONSTANTS
2
+ export const MEDIA_SERVERS = {
3
+ // The homer media server for converged multistream meetings.
4
+ HOMER: 'homer',
5
+ // The linus media server
6
+ LINUS: 'linus',
7
+ // The calliope media server for transcoded meetings
8
+ CALLIOPE: 'calliope',
9
+ };