@webex/plugin-meetings 2.59.8 → 2.60.0-next.10

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 (517) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.d.ts +42 -0
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.d.ts +31 -0
  6. package/dist/annotation/constants.js +41 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.d.ts +117 -0
  9. package/dist/annotation/index.js +357 -0
  10. package/dist/annotation/index.js.map +1 -0
  11. package/dist/breakouts/breakout.d.ts +8 -0
  12. package/dist/breakouts/breakout.js +215 -0
  13. package/dist/breakouts/breakout.js.map +1 -0
  14. package/dist/breakouts/collection.d.ts +5 -0
  15. package/dist/breakouts/collection.js +22 -0
  16. package/dist/breakouts/collection.js.map +1 -0
  17. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  18. package/dist/breakouts/edit-lock-error.js +51 -0
  19. package/dist/breakouts/edit-lock-error.js.map +1 -0
  20. package/dist/breakouts/events.d.ts +8 -0
  21. package/dist/breakouts/events.js +44 -0
  22. package/dist/breakouts/events.js.map +1 -0
  23. package/dist/breakouts/index.d.ts +5 -0
  24. package/dist/breakouts/index.js +1047 -0
  25. package/dist/breakouts/index.js.map +1 -0
  26. package/dist/breakouts/request.d.ts +22 -0
  27. package/dist/breakouts/request.js +77 -0
  28. package/dist/breakouts/request.js.map +1 -0
  29. package/dist/breakouts/utils.d.ts +15 -0
  30. package/dist/breakouts/utils.js +64 -0
  31. package/dist/breakouts/utils.js.map +1 -0
  32. package/dist/common/browser-detection.js +2 -3
  33. package/dist/common/browser-detection.js.map +1 -1
  34. package/dist/common/collection.js +3 -4
  35. package/dist/common/collection.js.map +1 -1
  36. package/dist/common/config.js +1 -2
  37. package/dist/common/config.js.map +1 -1
  38. package/dist/common/errors/captcha-error.js +1 -2
  39. package/dist/common/errors/captcha-error.js.map +1 -1
  40. package/dist/common/errors/intent-to-join.js +1 -2
  41. package/dist/common/errors/intent-to-join.js.map +1 -1
  42. package/dist/common/errors/join-meeting.js +1 -2
  43. package/dist/common/errors/join-meeting.js.map +1 -1
  44. package/dist/common/errors/media.js +1 -2
  45. package/dist/common/errors/media.js.map +1 -1
  46. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  47. package/dist/common/errors/no-meeting-info.js +50 -0
  48. package/dist/common/errors/no-meeting-info.js.map +1 -0
  49. package/dist/common/errors/parameter.js +3 -4
  50. package/dist/common/errors/parameter.js.map +1 -1
  51. package/dist/common/errors/password-error.js +1 -2
  52. package/dist/common/errors/password-error.js.map +1 -1
  53. package/dist/common/errors/permission.js +1 -2
  54. package/dist/common/errors/permission.js.map +1 -1
  55. package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
  56. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  57. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  58. package/dist/common/errors/reconnection-in-progress.js +1 -2
  59. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  60. package/dist/common/errors/reconnection.js +1 -2
  61. package/dist/common/errors/reconnection.js.map +1 -1
  62. package/dist/common/errors/stats.js +1 -2
  63. package/dist/common/errors/stats.js.map +1 -1
  64. package/dist/common/errors/webex-errors.d.ts +20 -8
  65. package/dist/common/errors/webex-errors.js +48 -28
  66. package/dist/common/errors/webex-errors.js.map +1 -1
  67. package/dist/common/errors/webex-meetings-error.js +1 -2
  68. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  69. package/dist/common/events/events-scope.js +1 -2
  70. package/dist/common/events/events-scope.js.map +1 -1
  71. package/dist/common/events/events.js +1 -2
  72. package/dist/common/events/events.js.map +1 -1
  73. package/dist/common/events/trigger-proxy.js +1 -2
  74. package/dist/common/events/trigger-proxy.js.map +1 -1
  75. package/dist/common/events/util.js +1 -2
  76. package/dist/common/events/util.js.map +1 -1
  77. package/dist/common/logs/logger-config.js +1 -2
  78. package/dist/common/logs/logger-config.js.map +1 -1
  79. package/dist/common/logs/logger-proxy.js +2 -3
  80. package/dist/common/logs/logger-proxy.js.map +1 -1
  81. package/dist/common/logs/request.d.ts +3 -1
  82. package/dist/common/logs/request.js +8 -5
  83. package/dist/common/logs/request.js.map +1 -1
  84. package/dist/common/queue.d.ts +9 -7
  85. package/dist/common/queue.js +22 -9
  86. package/dist/common/queue.js.map +1 -1
  87. package/dist/config.d.ts +5 -7
  88. package/dist/config.js +8 -11
  89. package/dist/config.js.map +1 -1
  90. package/dist/constants.d.ts +243 -97
  91. package/dist/constants.js +437 -435
  92. package/dist/constants.js.map +1 -1
  93. package/dist/controls-options-manager/constants.js +3 -6
  94. package/dist/controls-options-manager/constants.js.map +1 -1
  95. package/dist/controls-options-manager/enums.d.ts +11 -1
  96. package/dist/controls-options-manager/enums.js +15 -6
  97. package/dist/controls-options-manager/enums.js.map +1 -1
  98. package/dist/controls-options-manager/index.d.ts +17 -1
  99. package/dist/controls-options-manager/index.js +127 -38
  100. package/dist/controls-options-manager/index.js.map +1 -1
  101. package/dist/controls-options-manager/types.d.ts +43 -0
  102. package/dist/controls-options-manager/types.js +7 -0
  103. package/dist/controls-options-manager/types.js.map +1 -0
  104. package/dist/controls-options-manager/util.d.ts +1 -7
  105. package/dist/controls-options-manager/util.js +309 -19
  106. package/dist/controls-options-manager/util.js.map +1 -1
  107. package/dist/index.d.ts +6 -3
  108. package/dist/index.js +116 -4
  109. package/dist/index.js.map +1 -1
  110. package/dist/interpretation/collection.d.ts +5 -0
  111. package/dist/interpretation/collection.js +22 -0
  112. package/dist/interpretation/collection.js.map +1 -0
  113. package/dist/interpretation/index.d.ts +5 -0
  114. package/dist/interpretation/index.js +365 -0
  115. package/dist/interpretation/index.js.map +1 -0
  116. package/dist/interpretation/siLanguage.d.ts +5 -0
  117. package/dist/interpretation/siLanguage.js +24 -0
  118. package/dist/interpretation/siLanguage.js.map +1 -0
  119. package/dist/locus-info/controlsUtils.js +100 -11
  120. package/dist/locus-info/controlsUtils.js.map +1 -1
  121. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  122. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  123. package/dist/locus-info/fullState.js +1 -2
  124. package/dist/locus-info/fullState.js.map +1 -1
  125. package/dist/locus-info/hostUtils.js +1 -2
  126. package/dist/locus-info/hostUtils.js.map +1 -1
  127. package/dist/locus-info/index.d.ts +57 -4
  128. package/dist/locus-info/index.js +425 -84
  129. package/dist/locus-info/index.js.map +1 -1
  130. package/dist/locus-info/infoUtils.js +13 -5
  131. package/dist/locus-info/infoUtils.js.map +1 -1
  132. package/dist/locus-info/mediaSharesUtils.js +58 -3
  133. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  134. package/dist/locus-info/parser.d.ts +66 -6
  135. package/dist/locus-info/parser.js +253 -80
  136. package/dist/locus-info/parser.js.map +1 -1
  137. package/dist/locus-info/selfUtils.js +97 -13
  138. package/dist/locus-info/selfUtils.js.map +1 -1
  139. package/dist/media/index.d.ts +2 -0
  140. package/dist/media/index.js +107 -319
  141. package/dist/media/index.js.map +1 -1
  142. package/dist/media/properties.d.ts +38 -53
  143. package/dist/media/properties.js +96 -153
  144. package/dist/media/properties.js.map +1 -1
  145. package/dist/media/util.js +1 -22
  146. package/dist/media/util.js.map +1 -1
  147. package/dist/mediaQualityMetrics/config.d.ts +234 -230
  148. package/dist/mediaQualityMetrics/config.js +302 -498
  149. package/dist/mediaQualityMetrics/config.js.map +1 -1
  150. package/dist/meeting/in-meeting-actions.d.ts +88 -0
  151. package/dist/meeting/in-meeting-actions.js +94 -3
  152. package/dist/meeting/in-meeting-actions.js.map +1 -1
  153. package/dist/meeting/index.d.ts +591 -494
  154. package/dist/meeting/index.js +4728 -2990
  155. package/dist/meeting/index.js.map +1 -1
  156. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  157. package/dist/meeting/locusMediaRequest.js +291 -0
  158. package/dist/meeting/locusMediaRequest.js.map +1 -0
  159. package/dist/meeting/muteState.d.ts +93 -25
  160. package/dist/meeting/muteState.js +224 -133
  161. package/dist/meeting/muteState.js.map +1 -1
  162. package/dist/meeting/request.d.ts +82 -47
  163. package/dist/meeting/request.js +297 -199
  164. package/dist/meeting/request.js.map +1 -1
  165. package/dist/meeting/request.type.d.ts +11 -0
  166. package/dist/meeting/request.type.js +7 -0
  167. package/dist/meeting/request.type.js.map +1 -0
  168. package/dist/meeting/state.js +1 -2
  169. package/dist/meeting/state.js.map +1 -1
  170. package/dist/meeting/util.d.ts +102 -1
  171. package/dist/meeting/util.js +605 -435
  172. package/dist/meeting/util.js.map +1 -1
  173. package/dist/meeting-info/collection.js +3 -4
  174. package/dist/meeting-info/collection.js.map +1 -1
  175. package/dist/meeting-info/index.d.ts +13 -1
  176. package/dist/meeting-info/index.js +74 -7
  177. package/dist/meeting-info/index.js.map +1 -1
  178. package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
  179. package/dist/meeting-info/meeting-info-v2.js +200 -63
  180. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  181. package/dist/meeting-info/request.js +1 -2
  182. package/dist/meeting-info/request.js.map +1 -1
  183. package/dist/meeting-info/util.js +2 -3
  184. package/dist/meeting-info/util.js.map +1 -1
  185. package/dist/meeting-info/utilv2.js +39 -41
  186. package/dist/meeting-info/utilv2.js.map +1 -1
  187. package/dist/meetings/collection.d.ts +17 -0
  188. package/dist/meetings/collection.js +42 -4
  189. package/dist/meetings/collection.js.map +1 -1
  190. package/dist/meetings/index.d.ts +103 -21
  191. package/dist/meetings/index.js +486 -124
  192. package/dist/meetings/index.js.map +1 -1
  193. package/dist/meetings/meetings.types.d.ts +4 -0
  194. package/dist/meetings/meetings.types.js +7 -0
  195. package/dist/meetings/meetings.types.js.map +1 -0
  196. package/dist/meetings/request.js +4 -3
  197. package/dist/meetings/request.js.map +1 -1
  198. package/dist/meetings/util.js +107 -6
  199. package/dist/meetings/util.js.map +1 -1
  200. package/dist/member/index.d.ts +14 -1
  201. package/dist/member/index.js +54 -2
  202. package/dist/member/index.js.map +1 -1
  203. package/dist/member/member.types.js +3 -4
  204. package/dist/member/member.types.js.map +1 -1
  205. package/dist/member/types.d.ts +32 -0
  206. package/dist/member/types.js +23 -0
  207. package/dist/member/types.js.map +1 -0
  208. package/dist/member/util.js +131 -29
  209. package/dist/member/util.js.map +1 -1
  210. package/dist/members/collection.d.ts +5 -0
  211. package/dist/members/collection.js +11 -2
  212. package/dist/members/collection.js.map +1 -1
  213. package/dist/members/index.d.ts +57 -2
  214. package/dist/members/index.js +174 -10
  215. package/dist/members/index.js.map +1 -1
  216. package/dist/members/request.d.ts +73 -9
  217. package/dist/members/request.js +108 -41
  218. package/dist/members/request.js.map +1 -1
  219. package/dist/members/types.d.ts +25 -0
  220. package/dist/members/types.js +14 -0
  221. package/dist/members/types.js.map +1 -0
  222. package/dist/members/util.d.ts +214 -1
  223. package/dist/members/util.js +327 -234
  224. package/dist/members/util.js.map +1 -1
  225. package/dist/metrics/constants.d.ts +15 -6
  226. package/dist/metrics/constants.js +17 -9
  227. package/dist/metrics/constants.js.map +1 -1
  228. package/dist/metrics/index.d.ts +4 -111
  229. package/dist/metrics/index.js +4 -452
  230. package/dist/metrics/index.js.map +1 -1
  231. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  232. package/dist/multistream/mediaRequestManager.js +344 -0
  233. package/dist/multistream/mediaRequestManager.js.map +1 -0
  234. package/dist/multistream/receiveSlot.d.ts +68 -0
  235. package/dist/multistream/receiveSlot.js +200 -0
  236. package/dist/multistream/receiveSlot.js.map +1 -0
  237. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  238. package/dist/multistream/receiveSlotManager.js +174 -0
  239. package/dist/multistream/receiveSlotManager.js.map +1 -0
  240. package/dist/multistream/remoteMedia.d.ts +72 -0
  241. package/dist/multistream/remoteMedia.js +268 -0
  242. package/dist/multistream/remoteMedia.js.map +1 -0
  243. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  244. package/dist/multistream/remoteMediaGroup.js +267 -0
  245. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  246. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  247. package/dist/multistream/remoteMediaManager.js +1211 -0
  248. package/dist/multistream/remoteMediaManager.js.map +1 -0
  249. package/dist/multistream/sendSlotManager.d.ts +61 -0
  250. package/dist/multistream/sendSlotManager.js +236 -0
  251. package/dist/multistream/sendSlotManager.js.map +1 -0
  252. package/dist/networkQualityMonitor/index.js +5 -4
  253. package/dist/networkQualityMonitor/index.js.map +1 -1
  254. package/dist/personal-meeting-room/index.js +2 -3
  255. package/dist/personal-meeting-room/index.js.map +1 -1
  256. package/dist/personal-meeting-room/request.js +2 -3
  257. package/dist/personal-meeting-room/request.js.map +1 -1
  258. package/dist/personal-meeting-room/util.js +1 -2
  259. package/dist/personal-meeting-room/util.js.map +1 -1
  260. package/dist/reachability/index.d.ts +62 -7
  261. package/dist/reachability/index.js +265 -72
  262. package/dist/reachability/index.js.map +1 -1
  263. package/dist/reachability/request.d.ts +7 -3
  264. package/dist/reachability/request.js +18 -10
  265. package/dist/reachability/request.js.map +1 -1
  266. package/dist/reactions/constants.d.ts +3 -0
  267. package/dist/reactions/constants.js +12 -0
  268. package/dist/reactions/constants.js.map +1 -0
  269. package/dist/reactions/reactions.d.ts +2 -2
  270. package/dist/reactions/reactions.js +4 -6
  271. package/dist/reactions/reactions.js.map +1 -1
  272. package/dist/reactions/reactions.type.d.ts +23 -3
  273. package/dist/reactions/reactions.type.js +21 -23
  274. package/dist/reactions/reactions.type.js.map +1 -1
  275. package/dist/reconnection-manager/index.d.ts +32 -8
  276. package/dist/reconnection-manager/index.js +282 -231
  277. package/dist/reconnection-manager/index.js.map +1 -1
  278. package/dist/recording-controller/enums.js +4 -5
  279. package/dist/recording-controller/enums.js.map +1 -1
  280. package/dist/recording-controller/index.d.ts +15 -1
  281. package/dist/recording-controller/index.js +57 -46
  282. package/dist/recording-controller/index.js.map +1 -1
  283. package/dist/recording-controller/util.d.ts +5 -4
  284. package/dist/recording-controller/util.js +10 -10
  285. package/dist/recording-controller/util.js.map +1 -1
  286. package/dist/roap/index.d.ts +9 -47
  287. package/dist/roap/index.js +101 -235
  288. package/dist/roap/index.js.map +1 -1
  289. package/dist/roap/request.d.ts +18 -12
  290. package/dist/roap/request.js +126 -180
  291. package/dist/roap/request.js.map +1 -1
  292. package/dist/roap/turnDiscovery.d.ts +27 -16
  293. package/dist/roap/turnDiscovery.js +115 -105
  294. package/dist/roap/turnDiscovery.js.map +1 -1
  295. package/dist/rtcMetrics/constants.d.ts +4 -0
  296. package/dist/rtcMetrics/constants.js +11 -0
  297. package/dist/rtcMetrics/constants.js.map +1 -0
  298. package/dist/rtcMetrics/index.d.ts +54 -0
  299. package/dist/rtcMetrics/index.js +140 -0
  300. package/dist/rtcMetrics/index.js.map +1 -0
  301. package/dist/statsAnalyzer/global.d.ts +1 -83
  302. package/dist/statsAnalyzer/global.js +2 -85
  303. package/dist/statsAnalyzer/global.js.map +1 -1
  304. package/dist/statsAnalyzer/index.d.ts +28 -30
  305. package/dist/statsAnalyzer/index.js +374 -509
  306. package/dist/statsAnalyzer/index.js.map +1 -1
  307. package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
  308. package/dist/statsAnalyzer/mqaUtil.js +116 -83
  309. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  310. package/dist/transcription/index.js +1 -2
  311. package/dist/transcription/index.js.map +1 -1
  312. package/dist/webinar/collection.d.ts +16 -0
  313. package/dist/webinar/collection.js +43 -0
  314. package/dist/webinar/collection.js.map +1 -0
  315. package/dist/webinar/index.d.ts +5 -0
  316. package/dist/webinar/index.js +68 -0
  317. package/dist/webinar/index.js.map +1 -0
  318. package/package.json +35 -26
  319. package/src/annotation/annotation.types.ts +50 -0
  320. package/src/annotation/constants.ts +36 -0
  321. package/src/annotation/index.ts +328 -0
  322. package/src/breakouts/README.md +220 -0
  323. package/src/breakouts/breakout.ts +188 -0
  324. package/src/breakouts/collection.ts +19 -0
  325. package/src/breakouts/edit-lock-error.ts +25 -0
  326. package/src/breakouts/events.ts +56 -0
  327. package/src/breakouts/index.ts +925 -0
  328. package/src/breakouts/request.ts +55 -0
  329. package/src/breakouts/utils.ts +57 -0
  330. package/src/common/errors/no-meeting-info.ts +24 -0
  331. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  332. package/src/common/errors/webex-errors.ts +36 -12
  333. package/src/common/logs/logger-proxy.ts +1 -1
  334. package/src/common/logs/request.ts +5 -1
  335. package/src/common/queue.ts +22 -8
  336. package/src/config.ts +5 -7
  337. package/src/constants.ts +271 -93
  338. package/src/controls-options-manager/enums.ts +12 -0
  339. package/src/controls-options-manager/index.ts +116 -21
  340. package/src/controls-options-manager/types.ts +59 -0
  341. package/src/controls-options-manager/util.ts +294 -14
  342. package/src/index.ts +40 -0
  343. package/src/interpretation/README.md +60 -0
  344. package/src/interpretation/collection.ts +19 -0
  345. package/src/interpretation/index.ts +332 -0
  346. package/src/interpretation/siLanguage.ts +18 -0
  347. package/src/locus-info/controlsUtils.ts +110 -0
  348. package/src/locus-info/index.ts +449 -61
  349. package/src/locus-info/infoUtils.ts +14 -2
  350. package/src/locus-info/mediaSharesUtils.ts +64 -0
  351. package/src/locus-info/parser.ts +258 -47
  352. package/src/locus-info/selfUtils.ts +85 -2
  353. package/src/media/index.ts +153 -370
  354. package/src/media/properties.ts +106 -136
  355. package/src/media/util.ts +0 -21
  356. package/src/mediaQualityMetrics/config.ts +244 -377
  357. package/src/meeting/in-meeting-actions.ts +176 -0
  358. package/src/meeting/index.ts +3895 -2448
  359. package/src/meeting/locusMediaRequest.ts +313 -0
  360. package/src/meeting/muteState.ts +224 -138
  361. package/src/meeting/request.ts +207 -127
  362. package/src/meeting/request.type.ts +13 -0
  363. package/src/meeting/util.ts +590 -423
  364. package/src/meeting-info/index.ts +81 -8
  365. package/src/meeting-info/meeting-info-v2.ts +163 -13
  366. package/src/meeting-info/util.ts +1 -1
  367. package/src/meeting-info/utilv2.ts +28 -28
  368. package/src/meetings/collection.ts +33 -0
  369. package/src/meetings/index.ts +486 -126
  370. package/src/meetings/meetings.types.ts +12 -0
  371. package/src/meetings/request.ts +2 -0
  372. package/src/meetings/util.ts +116 -5
  373. package/src/member/index.ts +52 -1
  374. package/src/member/types.ts +38 -0
  375. package/src/member/util.ts +139 -28
  376. package/src/members/collection.ts +8 -0
  377. package/src/members/index.ts +196 -7
  378. package/src/members/request.ts +97 -17
  379. package/src/members/types.ts +29 -0
  380. package/src/members/util.ts +333 -240
  381. package/src/metrics/constants.ts +15 -6
  382. package/src/metrics/index.ts +1 -471
  383. package/src/multistream/mediaRequestManager.ts +440 -0
  384. package/src/multistream/receiveSlot.ts +184 -0
  385. package/src/multistream/receiveSlotManager.ts +166 -0
  386. package/src/multistream/remoteMedia.ts +254 -0
  387. package/src/multistream/remoteMediaGroup.ts +284 -0
  388. package/src/multistream/remoteMediaManager.ts +1145 -0
  389. package/src/multistream/sendSlotManager.ts +170 -0
  390. package/src/networkQualityMonitor/index.ts +6 -6
  391. package/src/reachability/index.ts +238 -45
  392. package/src/reachability/request.ts +17 -8
  393. package/src/reactions/constants.ts +4 -0
  394. package/src/reactions/reactions.ts +4 -4
  395. package/src/reactions/reactions.type.ts +30 -4
  396. package/src/reconnection-manager/index.ts +168 -156
  397. package/src/recording-controller/index.ts +20 -3
  398. package/src/recording-controller/util.ts +26 -9
  399. package/src/roap/index.ts +98 -241
  400. package/src/roap/request.ts +74 -148
  401. package/src/roap/turnDiscovery.ts +62 -56
  402. package/src/rtcMetrics/constants.ts +3 -0
  403. package/src/rtcMetrics/index.ts +124 -0
  404. package/src/statsAnalyzer/global.ts +1 -84
  405. package/src/statsAnalyzer/index.ts +413 -642
  406. package/src/statsAnalyzer/mqaUtil.ts +111 -114
  407. package/src/webinar/collection.ts +31 -0
  408. package/src/webinar/index.ts +62 -0
  409. package/test/integration/spec/converged-space-meetings.js +233 -0
  410. package/test/integration/spec/journey.js +320 -264
  411. package/test/integration/spec/space-meeting.js +77 -4
  412. package/test/unit/spec/annotation/index.ts +418 -0
  413. package/test/unit/spec/breakouts/breakout.ts +237 -0
  414. package/test/unit/spec/breakouts/collection.ts +15 -0
  415. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  416. package/test/unit/spec/breakouts/events.ts +89 -0
  417. package/test/unit/spec/breakouts/index.ts +1790 -0
  418. package/test/unit/spec/breakouts/request.ts +104 -0
  419. package/test/unit/spec/breakouts/utils.js +72 -0
  420. package/test/unit/spec/common/queue.js +31 -2
  421. package/test/unit/spec/controls-options-manager/index.js +163 -0
  422. package/test/unit/spec/controls-options-manager/util.js +576 -60
  423. package/test/unit/spec/fixture/locus.js +1 -0
  424. package/test/unit/spec/interpretation/collection.ts +15 -0
  425. package/test/unit/spec/interpretation/index.ts +589 -0
  426. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  427. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  428. package/test/unit/spec/locus-info/index.js +1390 -16
  429. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  430. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  431. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  432. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  433. package/test/unit/spec/locus-info/parser.js +116 -35
  434. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  435. package/test/unit/spec/media/index.ts +290 -0
  436. package/test/unit/spec/media/properties.ts +75 -84
  437. package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
  438. package/test/unit/spec/meeting/index.js +8181 -2770
  439. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  440. package/test/unit/spec/meeting/muteState.js +409 -213
  441. package/test/unit/spec/meeting/request.js +512 -42
  442. package/test/unit/spec/meeting/utils.js +741 -24
  443. package/test/unit/spec/meeting-info/index.js +300 -0
  444. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  445. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  446. package/test/unit/spec/meetings/collection.js +26 -0
  447. package/test/unit/spec/meetings/index.js +1284 -217
  448. package/test/unit/spec/meetings/utils.js +202 -2
  449. package/test/unit/spec/member/index.js +38 -8
  450. package/test/unit/spec/member/util.js +499 -29
  451. package/test/unit/spec/members/index.js +597 -3
  452. package/test/unit/spec/members/request.js +206 -27
  453. package/test/unit/spec/members/utils.js +210 -0
  454. package/test/unit/spec/metrics/index.js +1 -50
  455. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  456. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  457. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  458. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  459. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  460. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  461. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  462. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  463. package/test/unit/spec/reachability/index.ts +598 -24
  464. package/test/unit/spec/reachability/request.js +68 -0
  465. package/test/unit/spec/reconnection-manager/index.js +162 -24
  466. package/test/unit/spec/recording-controller/index.js +293 -218
  467. package/test/unit/spec/recording-controller/util.js +223 -96
  468. package/test/unit/spec/roap/index.ts +200 -76
  469. package/test/unit/spec/roap/request.ts +232 -0
  470. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  471. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  472. package/test/unit/spec/stats-analyzer/index.js +188 -174
  473. package/test/unit/spec/webinar/collection.ts +13 -0
  474. package/test/unit/spec/webinar/index.ts +60 -0
  475. package/test/utils/constants.js +9 -0
  476. package/test/utils/integrationTestUtils.js +46 -0
  477. package/test/utils/testUtils.js +0 -45
  478. package/test/utils/webex-config.js +4 -0
  479. package/test/utils/webex-test-users.js +7 -3
  480. package/dist/meeting/effectsState.d.ts +0 -42
  481. package/dist/meeting/effectsState.js +0 -260
  482. package/dist/meeting/effectsState.js.map +0 -1
  483. package/dist/metrics/config.d.ts +0 -169
  484. package/dist/metrics/config.js +0 -289
  485. package/dist/metrics/config.js.map +0 -1
  486. package/dist/peer-connection-manager/index.d.ts +0 -6
  487. package/dist/peer-connection-manager/index.js +0 -671
  488. package/dist/peer-connection-manager/index.js.map +0 -1
  489. package/dist/peer-connection-manager/util.d.ts +0 -6
  490. package/dist/peer-connection-manager/util.js +0 -110
  491. package/dist/peer-connection-manager/util.js.map +0 -1
  492. package/dist/roap/collection.d.ts +0 -10
  493. package/dist/roap/collection.js +0 -63
  494. package/dist/roap/collection.js.map +0 -1
  495. package/dist/roap/handler.d.ts +0 -47
  496. package/dist/roap/handler.js +0 -279
  497. package/dist/roap/handler.js.map +0 -1
  498. package/dist/roap/state.d.ts +0 -9
  499. package/dist/roap/state.js +0 -127
  500. package/dist/roap/state.js.map +0 -1
  501. package/dist/roap/util.d.ts +0 -2
  502. package/dist/roap/util.js +0 -76
  503. package/dist/roap/util.js.map +0 -1
  504. package/src/index.js +0 -15
  505. package/src/meeting/effectsState.ts +0 -209
  506. package/src/metrics/config.ts +0 -485
  507. package/src/peer-connection-manager/index.ts +0 -847
  508. package/src/peer-connection-manager/util.ts +0 -119
  509. package/src/roap/collection.ts +0 -62
  510. package/src/roap/handler.ts +0 -294
  511. package/src/roap/state.ts +0 -156
  512. package/src/roap/util.ts +0 -100
  513. package/test/unit/spec/meeting/effectsState.js +0 -281
  514. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  515. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  516. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  517. package/test/unit/spec/roap/util.js +0 -30
@@ -2,10 +2,12 @@ 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 {ConnectionState} from '@webex/internal-media-core';
5
6
 
6
7
  import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
7
8
  import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
8
9
  import testUtils from '../../../utils/testUtils';
10
+ import {MEDIA_DEVICES, _UNKNOWN_} from '@webex/plugin-meetings/src/constants';
9
11
 
10
12
  const {assert} = chai;
11
13
 
@@ -23,14 +25,15 @@ describe('plugin-meetings', () => {
23
25
  };
24
26
 
25
27
  const defaultStats = {
28
+ resolutions: {},
26
29
  internal: {
27
- video: {
30
+ 'video-send-1': {
28
31
  send: {
29
32
  totalPacketsLostOnReceiver: 10,
30
33
  },
31
34
  },
32
35
  },
33
- video: {
36
+ 'video-send-1': {
34
37
  send: {
35
38
  packetsSent: 2,
36
39
  meanRemoteJitter: [],
@@ -51,7 +54,12 @@ describe('plugin-meetings', () => {
51
54
  beforeEach(() => {
52
55
  const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
53
56
 
54
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor, defaultStats);
57
+ statsAnalyzer = new StatsAnalyzer(
58
+ initialConfig,
59
+ () => ({}),
60
+ networkQualityMonitor,
61
+ defaultStats
62
+ );
55
63
 
56
64
  sandBoxSpy = sandbox.spy(
57
65
  statsAnalyzer.networkQualityMonitor,
@@ -64,12 +72,12 @@ describe('plugin-meetings', () => {
64
72
  });
65
73
 
66
74
  it('should trigger determineUplinkNetworkQuality with specific arguments', async () => {
67
- await statsAnalyzer.parseGetStatsResult(statusResult, 'video');
75
+ await statsAnalyzer.parseGetStatsResult(statusResult, 'video-send-1', true);
68
76
 
69
77
  assert.calledOnce(statsAnalyzer.networkQualityMonitor.determineUplinkNetworkQuality);
70
78
  assert(
71
79
  sandBoxSpy.calledWith({
72
- mediaType: 'video',
80
+ mediaType: 'video-send-1',
73
81
  remoteRtpResults: statusResult,
74
82
  statsAnalyzerCurrentStats: statsAnalyzer.statsResults,
75
83
  })
@@ -82,22 +90,7 @@ describe('plugin-meetings', () => {
82
90
  let pc;
83
91
  let networkQualityMonitor;
84
92
  let statsAnalyzer;
85
- const statusResultOutboundRTP = {
86
- type: 'outbound-rtp',
87
- frameHeight: 720,
88
- frameWidth: 1280,
89
- packetsLost: 11,
90
- framesSent: 105,
91
- hugeFramesSent: 1,
92
- framesEncoded: 102,
93
- rttThreshold: 501,
94
- jitterThreshold: 501,
95
- jitterBufferDelay: 288.131459,
96
- jitterBufferEmittedCount: 4013,
97
- trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
98
- bytesSent: 1233,
99
- totalPacketsSent: 100,
100
- };
93
+ let mqeData;
101
94
 
102
95
  let receivedEventsData = {
103
96
  local: {},
@@ -125,61 +118,145 @@ describe('plugin-meetings', () => {
125
118
  // bytesReceived and bytesSent need to be non-zero in order for StatsAnalyzer to parse any other values
126
119
  fakeStats = {
127
120
  audio: {
128
- receiver: {
129
- type: 'inbound-rtp',
130
- packetsReceived: 0,
131
- bytesReceived: 1,
132
- },
133
- sender: {
134
- type: 'outbound-rtp',
135
- packetsSent: 0,
136
- bytesSent: 1,
137
- },
121
+ senders: [
122
+ {
123
+ localTrackLabel: 'fake-microphone',
124
+ report: [
125
+ {
126
+ type: 'outbound-rtp',
127
+ packetsSent: 0,
128
+ bytesSent: 1,
129
+ },
130
+ {
131
+ type: 'candidate-pair',
132
+ state: 'succeeded',
133
+ localCandidateId: 'fake-candidate-id'
134
+ },
135
+ {
136
+ type: 'candidate-pair',
137
+ state: 'failed',
138
+ localCandidateId: 'bad-candidate-id'
139
+ },
140
+ {
141
+ type: 'local-candidate',
142
+ id: 'fake-candidate-id',
143
+ protocol: 'tcp'
144
+ },
145
+ ],
146
+ },
147
+ ],
148
+ receivers: [
149
+ {
150
+ report: [
151
+ {
152
+ type: 'inbound-rtp',
153
+ packetsReceived: 0,
154
+ bytesReceived: 1,
155
+ },
156
+ {
157
+ type: 'candidate-pair',
158
+ state: 'succeeded',
159
+ localCandidateId: 'fake-candidate-id'
160
+ },
161
+ {
162
+ type: 'candidate-pair',
163
+ state: 'failed',
164
+ localCandidateId: 'bad-candidate-id'
165
+ },
166
+ {
167
+ type: 'local-candidate',
168
+ id: 'fake-candidate-id',
169
+ protocol: 'tcp'
170
+ },
171
+ ],
172
+ },
173
+ ],
138
174
  },
139
175
  video: {
140
- receiver: {
141
- type: 'inbound-rtp',
142
- framesDecoded: 0,
143
- bytesReceived: 1,
144
- },
145
- sender: {
146
- type: 'outbound-rtp',
147
- framesSent: 0,
148
- bytesSent: 1,
149
- },
176
+ senders: [
177
+ {
178
+ localTrackLabel: 'fake-camera',
179
+ report: [
180
+ {
181
+ type: 'outbound-rtp',
182
+ framesSent: 1500,
183
+ bytesSent: 1,
184
+ },
185
+ {
186
+ type: 'candidate-pair',
187
+ state: 'succeeded',
188
+ localCandidateId: 'fake-candidate-id'
189
+ },
190
+ {
191
+ type: 'candidate-pair',
192
+ state: 'failed',
193
+ localCandidateId: 'bad-candidate-id'
194
+ },
195
+ {
196
+ type: 'local-candidate',
197
+ id: 'fake-candidate-id',
198
+ protocol: 'tcp'
199
+ },
200
+ ],
201
+ },
202
+ ],
203
+ receivers: [
204
+ {
205
+ report: [
206
+ {
207
+ type: 'inbound-rtp',
208
+ framesDecoded: 0,
209
+ bytesReceived: 1,
210
+ frameHeight: 720,
211
+ frameWidth: 1280,
212
+ framesReceived: 1500,
213
+ },
214
+ {
215
+ type: 'candidate-pair',
216
+ state: 'succeeded',
217
+ localCandidateId: 'fake-candidate-id'
218
+ },
219
+ {
220
+ type: 'candidate-pair',
221
+ state: 'failed',
222
+ localCandidateId: 'bad-candidate-id'
223
+ },
224
+ {
225
+ type: 'local-candidate',
226
+ id: 'fake-candidate-id',
227
+ protocol: 'tcp'
228
+ },
229
+ ],
230
+ },
231
+ ],
150
232
  },
151
233
  };
152
234
 
153
235
  pc = {
154
- audioTransceiver: {
155
- sender: {
156
- getStats: sinon.stub().resolves([fakeStats.audio.sender]),
236
+ getConnectionState: sinon.stub().returns(ConnectionState.Connected),
237
+ getTransceiverStats: sinon.stub().resolves({
238
+ audio: {
239
+ senders: [fakeStats.audio.senders[0]],
240
+ receivers: [fakeStats.audio.receivers[0]],
157
241
  },
158
- receiver: {
159
- getStats: sinon.stub().resolves([fakeStats.audio.receiver]),
242
+ video: {
243
+ senders: [fakeStats.video.senders[0]],
244
+ receivers: [fakeStats.video.receivers[0]],
160
245
  },
161
- },
162
- videoTransceiver: {
163
- sender: {
164
- getStats: sinon.stub().resolves([fakeStats.video.sender]),
165
- },
166
- receiver: {
167
- getStats: sinon.stub().resolves([fakeStats.video.receiver]),
246
+ screenShareAudio: {
247
+ senders: [],
248
+ receivers: [],
168
249
  },
169
- },
170
- shareTransceiver: {
171
- sender: {
172
- getStats: sinon.stub().resolves([]),
250
+ screenShareVideo: {
251
+ senders: [],
252
+ receivers: [],
173
253
  },
174
- receiver: {
175
- getStats: sinon.stub().resolves([]),
176
- },
177
- },
254
+ }),
178
255
  };
179
256
 
180
257
  networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
181
258
 
182
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
259
+ statsAnalyzer = new StatsAnalyzer(initialConfig, () => ({}), networkQualityMonitor);
183
260
 
184
261
  statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
185
262
  receivedEventsData.local.started = data;
@@ -193,11 +270,8 @@ describe('plugin-meetings', () => {
193
270
  statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
194
271
  receivedEventsData.remote.stopped = data;
195
272
  });
196
- statsAnalyzer.on(EVENTS.NO_FRAMES_SENT, (data) => {
197
- receivedEventsData.noFramesSent = data;
198
- });
199
- statsAnalyzer.on(EVENTS.NO_VIDEO_ENCODED, (data) => {
200
- receivedEventsData.noVideoEncoded = data;
273
+ statsAnalyzer.on(EVENTS.MEDIA_QUALITY, ({data}) => {
274
+ mqeData = data;
201
275
  });
202
276
  });
203
277
 
@@ -225,6 +299,12 @@ describe('plugin-meetings', () => {
225
299
  assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
226
300
  };
227
301
 
302
+ const checkMqeData = () => {
303
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedFrameSize, 3600);
304
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedHeight, 720);
305
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedWidth, 1280);
306
+ };
307
+
228
308
  it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
229
309
  await startStatsAnalyzer({expected: {sendAudio: true}});
230
310
 
@@ -232,7 +312,7 @@ describe('plugin-meetings', () => {
232
312
  checkReceivedEvent({expected: {}});
233
313
 
234
314
  // setup a mock to return some values higher the previous ones
235
- fakeStats.audio.sender.packetsSent += 10;
315
+ fakeStats.audio.senders[0].report[0].packetsSent += 10;
236
316
 
237
317
  await progressTime();
238
318
 
@@ -252,7 +332,7 @@ describe('plugin-meetings', () => {
252
332
  checkReceivedEvent({expected: {}});
253
333
 
254
334
  // setup a mock to return some values higher the previous ones
255
- fakeStats.video.sender.framesSent += 1;
335
+ fakeStats.video.senders[0].report[0].framesSent += 1;
256
336
 
257
337
  await progressTime();
258
338
 
@@ -272,7 +352,7 @@ describe('plugin-meetings', () => {
272
352
  checkReceivedEvent({expected: {}});
273
353
 
274
354
  // setup a mock to return some values higher the previous ones
275
- fakeStats.audio.receiver.packetsReceived += 5;
355
+ fakeStats.audio.receivers[0].report[0].packetsReceived += 5;
276
356
 
277
357
  await progressTime();
278
358
  // check that we got the REMOTE_MEDIA_STARTED event for audio
@@ -292,7 +372,7 @@ describe('plugin-meetings', () => {
292
372
  checkReceivedEvent({expected: {}});
293
373
 
294
374
  // setup a mock to return some values higher the previous ones
295
- fakeStats.video.receiver.framesDecoded += 1;
375
+ fakeStats.video.receivers[0].report[0].framesDecoded += 1;
296
376
 
297
377
  await progressTime();
298
378
  // check that we got the REMOTE_MEDIA_STARTED event for video
@@ -305,133 +385,67 @@ describe('plugin-meetings', () => {
305
385
  checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
306
386
  });
307
387
 
308
- const checkStats = (type) => {
309
- const statsResult = {
310
- height: 720,
311
- width: 1280,
312
- jitterBufferDelay: 288.131459,
313
- jitterBufferEmittedCount: 4013,
314
- trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
315
- avgJitterDelay: 0.07179951632195365,
316
- };
317
- if (type === 'inbound-rtp') {
318
- statsResult.framesDecoded = 4013;
319
- statsResult.framesDropped = 0;
320
- statsResult.framesReceived = 4016;
321
- assert.deepEqual(statsAnalyzer.statsResults.resolutions.video.recv, statsResult);
322
- } else if (type === 'outbound-rtp') {
323
- statsResult.framesSent = 105;
324
- statsResult.hugeFramesSent = 1;
325
- assert.deepEqual(statsAnalyzer.statsResults.resolutions.video.send, statsResult);
326
- }
327
- };
328
-
329
- it('processes track results and populate statsResults.resolutions object when type is inbound-rtp with video', async () => {
330
- await startStatsAnalyzer({expected: {receiveVideo: true}});
331
- const statusResultInboundRTP = {
332
- type: 'inbound-rtp',
333
- frameHeight: 720,
334
- frameWidth: 1280,
335
- packetsLost: 11,
336
- rttThreshold: 501,
337
- jitterThreshold: 501,
338
- framesDecoded: 4013,
339
- framesDropped: 0,
340
- framesReceived: 4016,
341
- jitterBufferDelay: 288.131459,
342
- jitterBufferEmittedCount: 4013,
343
- trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
344
- };
345
- await statsAnalyzer.parseGetStatsResult(statusResultInboundRTP, 'video');
346
- checkStats('inbound-rtp');
347
- });
348
- it('processes track results and populate statsResults.resolutions object when type is outbound-rtp with video', async () => {
388
+ it('emits the correct MEDIA_QUALITY events', async () => {
349
389
  await startStatsAnalyzer({expected: {receiveVideo: true}});
350
390
 
351
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
352
- checkStats('outbound-rtp');
353
- });
391
+ await progressTime();
354
392
 
355
- it('doesnot processes track results with audio', async () => {
356
- await startStatsAnalyzer({expected: {receiveAudio: true}});
357
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'audio');
358
- assert.deepEqual(statsAnalyzer.statsResults.resolutions.audio, undefined);
393
+ // Check that the mqe data has been emitted and is correctly computed.
394
+ checkMqeData();
359
395
  });
360
396
 
361
- it('emits NO_FRAMES_ENCODED when frames are not being encoded', async () => {
362
- const expected = {mediaType: 'video'};
363
- await startStatsAnalyzer({expected: {sendVideo: true}});
364
-
365
- statsAnalyzer.lastStatsResults.video.send = {framesEncoded: 102, totalPacketsSent: 106};
397
+ it('emits the correct transportType in MEDIA_QUALITY events', async () => {
398
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
366
399
 
367
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
400
+ await progressTime();
368
401
 
369
- statsAnalyzer.compareLastStatsResult();
370
- assert.deepEqual(receivedEventsData.noVideoEncoded, expected);
402
+ assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TCP');
403
+ assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TCP');
371
404
  });
372
405
 
373
- it('emits NO_FRAMES_SENT when frames are not being sent but frames are being encoded', async () => {
374
- await startStatsAnalyzer({expected: {sendVideo: true}});
406
+ it('emits the correct transportType in MEDIA_QUALITY events when using a TURN server', async () => {
407
+ fakeStats.audio.senders[0].report[3].relayProtocol = 'tls';
408
+ fakeStats.video.senders[0].report[3].relayProtocol = 'tls';
409
+ fakeStats.audio.receivers[0].report[3].relayProtocol = 'tls';
410
+ fakeStats.video.receivers[0].report[3].relayProtocol = 'tls';
375
411
 
376
- const expected = {mediaType: 'video'};
377
-
378
- statsAnalyzer.lastStatsResults.video.send = {
379
- framesEncoded: 10,
380
- framesSent: 105,
381
- totalPacketsSent: 106,
382
- };
383
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
384
-
385
- statsAnalyzer.compareLastStatsResult();
386
- assert.deepEqual(receivedEventsData.noFramesSent, expected);
387
- });
388
-
389
- it('doesnot emits NO_FRAMES_SENT when last emitted event is LOCAL_MEDIA_STOPPED', async () => {
390
- statsAnalyzer.lastEmittedStartStopEvent.video.local = EVENTS.LOCAL_MEDIA_STOPPED;
412
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
391
413
 
392
- await startStatsAnalyzer({expected: {sendVideo: true}});
393
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
414
+ await progressTime();
394
415
 
395
- statsAnalyzer.compareLastStatsResult();
396
- assert.deepEqual(receivedEventsData.noFramesSent, undefined);
416
+ assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TLS');
417
+ assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TLS');
397
418
  });
398
419
 
399
- it('emits NO_FRAMES_ENCODED when frames are not being encoded for share', async () => {
400
- const expected = {mediaType: 'share'};
401
- await startStatsAnalyzer({expected: {sendShare: true}});
402
-
403
- statsAnalyzer.lastStatsResults.share.send = {framesEncoded: 102, totalPacketsSent: 106};
420
+ it('emits the correct peripherals in MEDIA_QUALITY events', async () => {
421
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
404
422
 
405
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
423
+ await progressTime();
406
424
 
407
- statsAnalyzer.compareLastStatsResult();
408
- assert.deepEqual(receivedEventsData.noVideoEncoded, expected);
425
+ assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE).information, 'fake-microphone');
426
+ assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA).information, 'fake-camera');
409
427
  });
410
428
 
411
- it('emits NO_FRAMES_SENT when frames are not being sent but frames are being encoded for share', async () => {
412
- const expected = {mediaType: 'share'};
413
- await startStatsAnalyzer({expected: {sendShare: true}});
429
+ it('emits the correct peripherals in MEDIA_QUALITY events when localTrackLabel is undefined', async () => {
430
+ fakeStats.audio.senders[0].localTrackLabel = undefined;
431
+ fakeStats.video.senders[0].localTrackLabel = undefined;
414
432
 
415
- statsAnalyzer.lastStatsResults.share.send = {
416
- framesEncoded: 10,
417
- framesSent: 105,
418
- totalPacketsSent: 106,
419
- };
433
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
420
434
 
421
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
435
+ await progressTime();
422
436
 
423
- statsAnalyzer.compareLastStatsResult();
424
- assert.deepEqual(receivedEventsData.noFramesSent, expected);
437
+ assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE).information, _UNKNOWN_);
438
+ assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA).information, _UNKNOWN_);
425
439
  });
426
440
 
427
- it('doesnot emits NO_FRAMES_SENT when last emitted event is LOCAL_MEDIA_STOPPED for share', async () => {
428
- statsAnalyzer.lastEmittedStartStopEvent.video.local = EVENTS.LOCAL_MEDIA_STOPPED;
429
-
430
- await startStatsAnalyzer({expected: {sendShare: true}});
431
- await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
441
+ it('emits the correct frameRate', async () => {
442
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
432
443
 
433
- statsAnalyzer.compareLastStatsResult();
434
- assert.deepEqual(receivedEventsData.noFramesSent, undefined);
444
+ await progressTime();
445
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 25);
446
+ fakeStats.video.receivers[0].framesReceived = 3000;
447
+ await progressTime();
448
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 25);
435
449
  });
436
450
  });
437
451
  });
@@ -0,0 +1,13 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import WebinarCollection from '@webex/plugin-meetings/src/webinar/collection';
3
+
4
+ describe('plugin-meetings', () => {
5
+ describe('WebinarCollection', () => {
6
+ it('the webinar collection is as expected', () => {
7
+ const collection = new WebinarCollection();
8
+
9
+ assert.equal(collection.namespace, 'Meetings');
10
+ assert.equal(collection.mainIndex, 'sessionId');
11
+ });
12
+ });
13
+ });
@@ -0,0 +1,60 @@
1
+ import {assert, expect} from '@webex/test-helper-chai';
2
+ import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
3
+ import Webinar from '@webex/plugin-meetings/src/webinar';
4
+ import MockWebex from '@webex/test-helper-mock-webex';
5
+ import sinon from 'sinon';
6
+
7
+ describe('plugin-meetings', () => {
8
+ describe('Webinar', () => {
9
+
10
+ let webex;
11
+ let webinar;
12
+
13
+ beforeEach(() => {
14
+ // @ts-ignore
15
+ webex = new MockWebex({});
16
+ webex.internal.mercury.on = sinon.stub();
17
+ webinar = new Webinar({}, {parent: webex});
18
+ webinar.locusUrl = 'locusUrl';
19
+ webex.request = sinon.stub().returns(Promise.resolve('REQUEST_RETURN_VALUE'));
20
+ webex.meetings = {};
21
+ webex.meetings.getMeetingByType = sinon.stub();
22
+ });
23
+
24
+ describe('#locusUrlUpdate', () => {
25
+ it('sets the locus url', () => {
26
+ webinar.locusUrlUpdate('newUrl');
27
+
28
+ assert.equal(webinar.locusUrl, 'newUrl');
29
+ });
30
+ });
31
+
32
+ describe('#webcastUrlUpdate', () => {
33
+ it('sets the webcast url', () => {
34
+ webinar.webcastUrlUpdate('newUrl');
35
+
36
+ assert.equal(webinar.webcastUrl, 'newUrl');
37
+ });
38
+ });
39
+
40
+ describe('#webinarAttendeesSearchingUrlUpdate', () => {
41
+ it('sets the webinarAttendeesSearching url', () => {
42
+ webinar.webinarAttendeesSearchingUrlUpdate('newUrl');
43
+
44
+ assert.equal(webinar.webinarAttendeesSearchingUrl, 'newUrl');
45
+ });
46
+ });
47
+
48
+ describe('#updateCanManageWebcast', () => {
49
+ it('update canManageWebcast', () => {
50
+ webinar.updateCanManageWebcast(true);
51
+
52
+ assert.equal(webinar.canManageWebcast, true);
53
+
54
+ webinar.updateCanManageWebcast(false);
55
+
56
+ assert.equal(webinar.canManageWebcast, false);
57
+ });
58
+ });
59
+ })
60
+ })
@@ -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
+ };
@@ -0,0 +1,46 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import {Defer} from '@webex/common';
3
+
4
+ const addMedia = async (user, options = {}) => {
5
+
6
+ const {microphone, camera} = options;
7
+
8
+ if (options.multistream) {
9
+ await user.meeting.addMedia({localStreams: {microphone, camera}});
10
+ } else {
11
+ const mediaReadyPromises = Array.isArray(options.expectedMediaReadyTypes)
12
+ ? options.expectedMediaReadyTypes.reduce((output, expectedMediaReadyType) => {
13
+ if (typeof expectedMediaReadyType !== 'string') {
14
+ return output;
15
+ }
16
+
17
+ output[expectedMediaReadyType] = new Defer();
18
+
19
+ return output;
20
+ }, {})
21
+ : {remoteAudio: new Defer(), remoteVideo: new Defer()};
22
+
23
+ const mediaReady = (media) => {
24
+ if (!media) {
25
+ return;
26
+ }
27
+ if (mediaReadyPromises[media.type]) {
28
+ mediaReadyPromises[media.type].resolve();
29
+ }
30
+ };
31
+
32
+ user.meeting.on('media:ready', mediaReady);
33
+
34
+ await user.meeting.addMedia({localStreams: {microphone, camera}});
35
+ await Promise.all(Object.values(mediaReadyPromises).map((defer) => defer.promise));
36
+ };
37
+
38
+
39
+ assert.exists(user.meeting.mediaProperties.audioStream, 'audioStream not present');
40
+ assert.exists(user.meeting.mediaProperties.videoStream, 'videoStream not present');
41
+
42
+ };
43
+
44
+ export default {
45
+ addMedia
46
+ };