@webex/plugin-meetings 3.0.0-beta.11 → 3.0.0-beta.110

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