@webex/plugin-meetings 3.0.0-beta.34 → 3.0.0-beta.340

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 (392) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +94 -15
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +709 -35
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/utils.js +45 -1
  17. package/dist/breakouts/utils.js.map +1 -1
  18. package/dist/common/errors/no-meeting-info.js +51 -0
  19. package/dist/common/errors/no-meeting-info.js.map +1 -0
  20. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  21. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +48 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/logs/request.js +5 -1
  27. package/dist/common/logs/request.js.map +1 -1
  28. package/dist/common/queue.js +24 -9
  29. package/dist/common/queue.js.map +1 -1
  30. package/dist/config.js +5 -10
  31. package/dist/config.js.map +1 -1
  32. package/dist/constants.js +233 -29
  33. package/dist/constants.js.map +1 -1
  34. package/dist/controls-options-manager/enums.js +14 -2
  35. package/dist/controls-options-manager/enums.js.map +1 -1
  36. package/dist/controls-options-manager/index.js +109 -15
  37. package/dist/controls-options-manager/index.js.map +1 -1
  38. package/dist/controls-options-manager/types.js +7 -0
  39. package/dist/controls-options-manager/types.js.map +1 -0
  40. package/dist/controls-options-manager/util.js +309 -18
  41. package/dist/controls-options-manager/util.js.map +1 -1
  42. package/dist/index.js +112 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/interpretation/collection.js +23 -0
  45. package/dist/interpretation/collection.js.map +1 -0
  46. package/dist/interpretation/index.js +366 -0
  47. package/dist/interpretation/index.js.map +1 -0
  48. package/dist/interpretation/siLanguage.js +25 -0
  49. package/dist/interpretation/siLanguage.js.map +1 -0
  50. package/dist/locus-info/controlsUtils.js +91 -2
  51. package/dist/locus-info/controlsUtils.js.map +1 -1
  52. package/dist/locus-info/index.js +383 -62
  53. package/dist/locus-info/index.js.map +1 -1
  54. package/dist/locus-info/infoUtils.js +7 -1
  55. package/dist/locus-info/infoUtils.js.map +1 -1
  56. package/dist/locus-info/mediaSharesUtils.js +57 -1
  57. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  58. package/dist/locus-info/parser.js +249 -72
  59. package/dist/locus-info/parser.js.map +1 -1
  60. package/dist/locus-info/selfUtils.js +89 -14
  61. package/dist/locus-info/selfUtils.js.map +1 -1
  62. package/dist/media/index.js +62 -116
  63. package/dist/media/index.js.map +1 -1
  64. package/dist/media/properties.js +73 -124
  65. package/dist/media/properties.js.map +1 -1
  66. package/dist/mediaQualityMetrics/config.js +1 -204
  67. package/dist/mediaQualityMetrics/config.js.map +1 -1
  68. package/dist/meeting/in-meeting-actions.js +86 -2
  69. package/dist/meeting/in-meeting-actions.js.map +1 -1
  70. package/dist/meeting/index.js +3927 -2960
  71. package/dist/meeting/index.js.map +1 -1
  72. package/dist/meeting/locusMediaRequest.js +292 -0
  73. package/dist/meeting/locusMediaRequest.js.map +1 -0
  74. package/dist/meeting/muteState.js +224 -131
  75. package/dist/meeting/muteState.js.map +1 -1
  76. package/dist/meeting/request.js +260 -196
  77. package/dist/meeting/request.js.map +1 -1
  78. package/dist/meeting/util.js +601 -417
  79. package/dist/meeting/util.js.map +1 -1
  80. package/dist/meeting-info/index.js +73 -7
  81. package/dist/meeting-info/index.js.map +1 -1
  82. package/dist/meeting-info/meeting-info-v2.js +192 -51
  83. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  84. package/dist/meeting-info/util.js +1 -1
  85. package/dist/meeting-info/util.js.map +1 -1
  86. package/dist/meeting-info/utilv2.js +36 -36
  87. package/dist/meeting-info/utilv2.js.map +1 -1
  88. package/dist/meetings/collection.js +39 -0
  89. package/dist/meetings/collection.js.map +1 -1
  90. package/dist/meetings/index.js +424 -116
  91. package/dist/meetings/index.js.map +1 -1
  92. package/dist/meetings/meetings.types.js +7 -0
  93. package/dist/meetings/meetings.types.js.map +1 -0
  94. package/dist/meetings/request.js +2 -0
  95. package/dist/meetings/request.js.map +1 -1
  96. package/dist/meetings/util.js +72 -6
  97. package/dist/meetings/util.js.map +1 -1
  98. package/dist/member/index.js +58 -0
  99. package/dist/member/index.js.map +1 -1
  100. package/dist/member/types.js +25 -0
  101. package/dist/member/types.js.map +1 -0
  102. package/dist/member/util.js +132 -25
  103. package/dist/member/util.js.map +1 -1
  104. package/dist/members/collection.js +10 -0
  105. package/dist/members/collection.js.map +1 -1
  106. package/dist/members/index.js +102 -6
  107. package/dist/members/index.js.map +1 -1
  108. package/dist/members/request.js +106 -38
  109. package/dist/members/request.js.map +1 -1
  110. package/dist/members/types.js +15 -0
  111. package/dist/members/types.js.map +1 -0
  112. package/dist/members/util.js +326 -232
  113. package/dist/members/util.js.map +1 -1
  114. package/dist/metrics/constants.js +16 -5
  115. package/dist/metrics/constants.js.map +1 -1
  116. package/dist/metrics/index.js +1 -446
  117. package/dist/metrics/index.js.map +1 -1
  118. package/dist/multistream/mediaRequestManager.js +228 -58
  119. package/dist/multistream/mediaRequestManager.js.map +1 -1
  120. package/dist/multistream/receiveSlot.js +29 -16
  121. package/dist/multistream/receiveSlot.js.map +1 -1
  122. package/dist/multistream/receiveSlotManager.js +39 -36
  123. package/dist/multistream/receiveSlotManager.js.map +1 -1
  124. package/dist/multistream/remoteMedia.js +44 -18
  125. package/dist/multistream/remoteMedia.js.map +1 -1
  126. package/dist/multistream/remoteMediaGroup.js +60 -3
  127. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  128. package/dist/multistream/remoteMediaManager.js +209 -59
  129. package/dist/multistream/remoteMediaManager.js.map +1 -1
  130. package/dist/multistream/sendSlotManager.js +233 -0
  131. package/dist/multistream/sendSlotManager.js.map +1 -0
  132. package/dist/reachability/clusterReachability.js +356 -0
  133. package/dist/reachability/clusterReachability.js.map +1 -0
  134. package/dist/reachability/index.js +273 -391
  135. package/dist/reachability/index.js.map +1 -1
  136. package/dist/reachability/request.js +17 -8
  137. package/dist/reachability/request.js.map +1 -1
  138. package/dist/reachability/util.js +29 -0
  139. package/dist/reachability/util.js.map +1 -0
  140. package/dist/reconnection-manager/index.js +214 -170
  141. package/dist/reconnection-manager/index.js.map +1 -1
  142. package/dist/recording-controller/index.js +21 -2
  143. package/dist/recording-controller/index.js.map +1 -1
  144. package/dist/recording-controller/util.js +9 -8
  145. package/dist/recording-controller/util.js.map +1 -1
  146. package/dist/roap/index.js +62 -35
  147. package/dist/roap/index.js.map +1 -1
  148. package/dist/roap/request.js +112 -97
  149. package/dist/roap/request.js.map +1 -1
  150. package/dist/roap/turnDiscovery.js +95 -38
  151. package/dist/roap/turnDiscovery.js.map +1 -1
  152. package/dist/rtcMetrics/constants.js +12 -0
  153. package/dist/rtcMetrics/constants.js.map +1 -0
  154. package/dist/rtcMetrics/index.js +142 -0
  155. package/dist/rtcMetrics/index.js.map +1 -0
  156. package/dist/statsAnalyzer/index.js +181 -214
  157. package/dist/statsAnalyzer/index.js.map +1 -1
  158. package/dist/statsAnalyzer/mqaUtil.js +22 -18
  159. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  160. package/dist/types/annotation/annotation.types.d.ts +42 -0
  161. package/dist/types/annotation/constants.d.ts +31 -0
  162. package/dist/types/annotation/index.d.ts +117 -0
  163. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  164. package/dist/types/breakouts/events.d.ts +8 -0
  165. package/dist/types/breakouts/utils.d.ts +14 -0
  166. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  167. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  168. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  169. package/dist/types/common/logs/request.d.ts +2 -0
  170. package/dist/types/common/queue.d.ts +9 -7
  171. package/dist/types/config.d.ts +2 -7
  172. package/dist/types/constants.d.ts +201 -30
  173. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  174. package/dist/types/controls-options-manager/index.d.ts +17 -1
  175. package/dist/types/controls-options-manager/types.d.ts +43 -0
  176. package/dist/types/controls-options-manager/util.d.ts +1 -7
  177. package/dist/types/index.d.ts +6 -4
  178. package/dist/types/interpretation/collection.d.ts +5 -0
  179. package/dist/types/interpretation/index.d.ts +5 -0
  180. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  181. package/dist/types/locus-info/index.d.ts +57 -4
  182. package/dist/types/locus-info/parser.d.ts +66 -6
  183. package/dist/types/media/index.d.ts +2 -0
  184. package/dist/types/media/properties.d.ts +34 -48
  185. package/dist/types/mediaQualityMetrics/config.d.ts +0 -128
  186. package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
  187. package/dist/types/meeting/index.d.ts +506 -512
  188. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  189. package/dist/types/meeting/muteState.d.ts +93 -25
  190. package/dist/types/meeting/request.d.ts +72 -43
  191. package/dist/types/meeting/util.d.ts +101 -1
  192. package/dist/types/meeting-info/index.d.ts +13 -1
  193. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  194. package/dist/types/meetings/collection.d.ts +17 -0
  195. package/dist/types/meetings/index.d.ts +91 -21
  196. package/dist/types/meetings/meetings.types.d.ts +4 -0
  197. package/dist/types/member/index.d.ts +14 -0
  198. package/dist/types/member/types.d.ts +32 -0
  199. package/dist/types/members/collection.d.ts +5 -0
  200. package/dist/types/members/index.d.ts +35 -2
  201. package/dist/types/members/request.d.ts +73 -9
  202. package/dist/types/members/types.d.ts +25 -0
  203. package/dist/types/members/util.d.ts +214 -1
  204. package/dist/types/metrics/constants.d.ts +15 -4
  205. package/dist/types/metrics/index.d.ts +4 -111
  206. package/dist/types/multistream/mediaRequestManager.d.ts +72 -5
  207. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  208. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  209. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  210. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  211. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  212. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  213. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  214. package/dist/types/reachability/index.d.ts +60 -95
  215. package/dist/types/reachability/request.d.ts +7 -3
  216. package/dist/types/reachability/util.d.ts +8 -0
  217. package/dist/types/reconnection-manager/index.d.ts +19 -0
  218. package/dist/types/recording-controller/index.d.ts +15 -1
  219. package/dist/types/recording-controller/util.d.ts +5 -4
  220. package/dist/types/roap/index.d.ts +2 -1
  221. package/dist/types/roap/request.d.ts +15 -11
  222. package/dist/types/roap/turnDiscovery.d.ts +21 -3
  223. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  224. package/dist/types/rtcMetrics/index.d.ts +54 -0
  225. package/dist/types/statsAnalyzer/index.d.ts +29 -11
  226. package/dist/types/webinar/collection.d.ts +16 -0
  227. package/dist/types/webinar/index.d.ts +5 -0
  228. package/dist/webinar/collection.js +44 -0
  229. package/dist/webinar/collection.js.map +1 -0
  230. package/dist/webinar/index.js +69 -0
  231. package/dist/webinar/index.js.map +1 -0
  232. package/package.json +22 -19
  233. package/src/annotation/annotation.types.ts +50 -0
  234. package/src/annotation/constants.ts +36 -0
  235. package/src/annotation/index.ts +328 -0
  236. package/src/breakouts/README.md +42 -12
  237. package/src/breakouts/breakout.ts +67 -9
  238. package/src/breakouts/edit-lock-error.ts +25 -0
  239. package/src/breakouts/events.ts +56 -0
  240. package/src/breakouts/index.ts +592 -20
  241. package/src/breakouts/utils.ts +42 -0
  242. package/src/common/errors/no-meeting-info.ts +24 -0
  243. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  244. package/src/common/errors/webex-errors.ts +44 -2
  245. package/src/common/logs/logger-proxy.ts +1 -1
  246. package/src/common/logs/request.ts +5 -1
  247. package/src/common/queue.ts +22 -8
  248. package/src/config.ts +4 -9
  249. package/src/constants.ts +224 -20
  250. package/src/controls-options-manager/enums.ts +12 -0
  251. package/src/controls-options-manager/index.ts +116 -21
  252. package/src/controls-options-manager/types.ts +59 -0
  253. package/src/controls-options-manager/util.ts +294 -14
  254. package/src/index.ts +40 -0
  255. package/src/interpretation/README.md +60 -0
  256. package/src/interpretation/collection.ts +19 -0
  257. package/src/interpretation/index.ts +332 -0
  258. package/src/interpretation/siLanguage.ts +18 -0
  259. package/src/locus-info/controlsUtils.ts +108 -0
  260. package/src/locus-info/index.ts +413 -59
  261. package/src/locus-info/infoUtils.ts +10 -2
  262. package/src/locus-info/mediaSharesUtils.ts +64 -0
  263. package/src/locus-info/parser.ts +258 -47
  264. package/src/locus-info/selfUtils.ts +81 -5
  265. package/src/media/index.ts +102 -122
  266. package/src/media/properties.ts +87 -110
  267. package/src/mediaQualityMetrics/config.ts +0 -135
  268. package/src/meeting/in-meeting-actions.ts +171 -3
  269. package/src/meeting/index.ts +3276 -2555
  270. package/src/meeting/locusMediaRequest.ts +313 -0
  271. package/src/meeting/muteState.ts +223 -136
  272. package/src/meeting/request.ts +177 -121
  273. package/src/meeting/util.ts +588 -394
  274. package/src/meeting-info/index.ts +81 -8
  275. package/src/meeting-info/meeting-info-v2.ts +170 -14
  276. package/src/meeting-info/util.ts +1 -1
  277. package/src/meeting-info/utilv2.ts +23 -23
  278. package/src/meetings/collection.ts +33 -0
  279. package/src/meetings/index.ts +454 -125
  280. package/src/meetings/meetings.types.ts +12 -0
  281. package/src/meetings/request.ts +2 -0
  282. package/src/meetings/util.ts +80 -11
  283. package/src/member/index.ts +58 -0
  284. package/src/member/types.ts +38 -0
  285. package/src/member/util.ts +141 -25
  286. package/src/members/collection.ts +8 -0
  287. package/src/members/index.ts +134 -8
  288. package/src/members/request.ts +97 -17
  289. package/src/members/types.ts +29 -0
  290. package/src/members/util.ts +333 -240
  291. package/src/metrics/constants.ts +15 -4
  292. package/src/metrics/index.ts +1 -469
  293. package/src/multistream/mediaRequestManager.ts +277 -82
  294. package/src/multistream/receiveSlot.ts +31 -17
  295. package/src/multistream/receiveSlotManager.ts +34 -24
  296. package/src/multistream/remoteMedia.ts +27 -2
  297. package/src/multistream/remoteMediaGroup.ts +59 -0
  298. package/src/multistream/remoteMediaManager.ts +148 -30
  299. package/src/multistream/sendSlotManager.ts +170 -0
  300. package/src/reachability/clusterReachability.ts +320 -0
  301. package/src/reachability/index.ts +236 -342
  302. package/src/reachability/request.ts +17 -8
  303. package/src/reachability/util.ts +24 -0
  304. package/src/reconnection-manager/index.ts +128 -106
  305. package/src/recording-controller/index.ts +20 -3
  306. package/src/recording-controller/util.ts +26 -9
  307. package/src/roap/index.ts +63 -32
  308. package/src/roap/request.ts +100 -104
  309. package/src/roap/turnDiscovery.ts +48 -26
  310. package/src/rtcMetrics/constants.ts +3 -0
  311. package/src/rtcMetrics/index.ts +124 -0
  312. package/src/statsAnalyzer/index.ts +218 -289
  313. package/src/statsAnalyzer/mqaUtil.ts +28 -30
  314. package/src/webinar/collection.ts +31 -0
  315. package/src/webinar/index.ts +62 -0
  316. package/test/integration/spec/converged-space-meetings.js +60 -3
  317. package/test/integration/spec/journey.js +320 -261
  318. package/test/integration/spec/space-meeting.js +76 -3
  319. package/test/unit/spec/annotation/index.ts +418 -0
  320. package/test/unit/spec/breakouts/breakout.ts +118 -28
  321. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  322. package/test/unit/spec/breakouts/events.ts +89 -0
  323. package/test/unit/spec/breakouts/index.ts +1395 -69
  324. package/test/unit/spec/breakouts/utils.js +52 -1
  325. package/test/unit/spec/common/queue.js +31 -2
  326. package/test/unit/spec/controls-options-manager/index.js +163 -0
  327. package/test/unit/spec/controls-options-manager/util.js +576 -60
  328. package/test/unit/spec/fixture/locus.js +1 -0
  329. package/test/unit/spec/interpretation/collection.ts +15 -0
  330. package/test/unit/spec/interpretation/index.ts +589 -0
  331. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  332. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  333. package/test/unit/spec/locus-info/index.js +1304 -33
  334. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  335. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  336. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  337. package/test/unit/spec/locus-info/parser.js +116 -35
  338. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  339. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  340. package/test/unit/spec/media/index.ts +120 -37
  341. package/test/unit/spec/media/properties.ts +2 -2
  342. package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
  343. package/test/unit/spec/meeting/index.js +5849 -2014
  344. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  345. package/test/unit/spec/meeting/muteState.js +402 -213
  346. package/test/unit/spec/meeting/request.js +483 -49
  347. package/test/unit/spec/meeting/utils.js +679 -64
  348. package/test/unit/spec/meeting-info/index.js +300 -0
  349. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  350. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  351. package/test/unit/spec/meetings/collection.js +26 -0
  352. package/test/unit/spec/meetings/index.js +1231 -212
  353. package/test/unit/spec/meetings/utils.js +202 -2
  354. package/test/unit/spec/member/index.js +61 -6
  355. package/test/unit/spec/member/util.js +510 -34
  356. package/test/unit/spec/members/index.js +432 -1
  357. package/test/unit/spec/members/request.js +206 -27
  358. package/test/unit/spec/members/utils.js +210 -0
  359. package/test/unit/spec/metrics/index.js +1 -50
  360. package/test/unit/spec/multistream/mediaRequestManager.ts +776 -162
  361. package/test/unit/spec/multistream/receiveSlot.ts +28 -20
  362. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  363. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  364. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  365. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  366. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  367. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  368. package/test/unit/spec/reachability/index.ts +486 -13
  369. package/test/unit/spec/reachability/request.js +68 -0
  370. package/test/unit/spec/reachability/util.ts +40 -0
  371. package/test/unit/spec/reconnection-manager/index.js +117 -11
  372. package/test/unit/spec/recording-controller/index.js +294 -218
  373. package/test/unit/spec/recording-controller/util.js +223 -96
  374. package/test/unit/spec/roap/index.ts +174 -63
  375. package/test/unit/spec/roap/request.ts +226 -85
  376. package/test/unit/spec/roap/turnDiscovery.ts +76 -34
  377. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  378. package/test/unit/spec/stats-analyzer/index.js +231 -7
  379. package/test/unit/spec/webinar/collection.ts +13 -0
  380. package/test/unit/spec/webinar/index.ts +60 -0
  381. package/test/utils/integrationTestUtils.js +46 -0
  382. package/test/utils/testUtils.js +0 -52
  383. package/dist/meeting/effectsState.js +0 -262
  384. package/dist/meeting/effectsState.js.map +0 -1
  385. package/dist/metrics/config.js +0 -289
  386. package/dist/metrics/config.js.map +0 -1
  387. package/dist/types/meeting/effectsState.d.ts +0 -42
  388. package/dist/types/metrics/config.d.ts +0 -169
  389. package/src/index.js +0 -16
  390. package/src/meeting/effectsState.ts +0 -211
  391. package/src/metrics/config.ts +0 -485
  392. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -7,6 +7,7 @@ import {ConnectionState} from '@webex/internal-media-core';
7
7
  import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
8
8
  import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
9
9
  import testUtils from '../../../utils/testUtils';
10
+ import {MEDIA_DEVICES, _UNKNOWN_} from '@webex/plugin-meetings/src/constants';
10
11
 
11
12
  const {assert} = chai;
12
13
 
@@ -53,7 +54,12 @@ describe('plugin-meetings', () => {
53
54
  beforeEach(() => {
54
55
  const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
55
56
 
56
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor, defaultStats);
57
+ statsAnalyzer = new StatsAnalyzer(
58
+ initialConfig,
59
+ () => ({}),
60
+ networkQualityMonitor,
61
+ defaultStats
62
+ );
57
63
 
58
64
  sandBoxSpy = sandbox.spy(
59
65
  statsAnalyzer.networkQualityMonitor,
@@ -84,6 +90,7 @@ describe('plugin-meetings', () => {
84
90
  let pc;
85
91
  let networkQualityMonitor;
86
92
  let statsAnalyzer;
93
+ let mqeData;
87
94
 
88
95
  let receivedEventsData = {
89
96
  local: {},
@@ -113,12 +120,28 @@ describe('plugin-meetings', () => {
113
120
  audio: {
114
121
  senders: [
115
122
  {
123
+ localTrackLabel: 'fake-microphone',
116
124
  report: [
117
125
  {
118
126
  type: 'outbound-rtp',
119
127
  packetsSent: 0,
120
128
  bytesSent: 1,
121
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
+ },
122
145
  ],
123
146
  },
124
147
  ],
@@ -130,6 +153,21 @@ describe('plugin-meetings', () => {
130
153
  packetsReceived: 0,
131
154
  bytesReceived: 1,
132
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
+ },
133
171
  ],
134
172
  },
135
173
  ],
@@ -137,12 +175,28 @@ describe('plugin-meetings', () => {
137
175
  video: {
138
176
  senders: [
139
177
  {
178
+ localTrackLabel: 'fake-camera',
140
179
  report: [
141
180
  {
142
181
  type: 'outbound-rtp',
143
- framesSent: 0,
182
+ framesSent: 1500,
144
183
  bytesSent: 1,
145
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
+ },
146
200
  ],
147
201
  },
148
202
  ],
@@ -153,6 +207,24 @@ describe('plugin-meetings', () => {
153
207
  type: 'inbound-rtp',
154
208
  framesDecoded: 0,
155
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',
156
228
  },
157
229
  ],
158
230
  },
@@ -172,19 +244,19 @@ describe('plugin-meetings', () => {
172
244
  receivers: [fakeStats.video.receivers[0]],
173
245
  },
174
246
  screenShareAudio: {
175
- senders: [],
176
- receivers: [],
247
+ senders: [fakeStats.audio.senders[0]],
248
+ receivers: [fakeStats.audio.receivers[0]],
177
249
  },
178
250
  screenShareVideo: {
179
- senders: [],
180
- receivers: [],
251
+ senders: [fakeStats.video.senders[0]],
252
+ receivers: [fakeStats.video.receivers[0]],
181
253
  },
182
254
  }),
183
255
  };
184
256
 
185
257
  networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
186
258
 
187
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
259
+ statsAnalyzer = new StatsAnalyzer(initialConfig, () => ({}), networkQualityMonitor);
188
260
 
189
261
  statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
190
262
  receivedEventsData.local.started = data;
@@ -198,6 +270,9 @@ describe('plugin-meetings', () => {
198
270
  statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
199
271
  receivedEventsData.remote.stopped = data;
200
272
  });
273
+ statsAnalyzer.on(EVENTS.MEDIA_QUALITY, ({data}) => {
274
+ mqeData = data;
275
+ });
201
276
  });
202
277
 
203
278
  afterEach(() => {
@@ -211,6 +286,19 @@ describe('plugin-meetings', () => {
211
286
  await testUtils.flushPromises();
212
287
  };
213
288
 
289
+ const mergeProperties = (target, properties, keyValue = 'fake-candidate-id', matchKey= 'type', matchValue = 'local-candidate') => {
290
+ for (let key in target) {
291
+ if (target.hasOwnProperty(key)) {
292
+ if (typeof target[key] === 'object') {
293
+ mergeProperties(target[key], properties, keyValue, matchKey, matchValue);
294
+ }
295
+ if (key === 'id' && target[key] === keyValue && target[matchKey] === matchValue) {
296
+ Object.assign(target, properties);
297
+ }
298
+ }
299
+ }
300
+ }
301
+
214
302
  const progressTime = async () => {
215
303
  await clock.tickAsync(initialConfig.analyzerInterval);
216
304
  await testUtils.flushPromises();
@@ -224,6 +312,23 @@ describe('plugin-meetings', () => {
224
312
  assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
225
313
  };
226
314
 
315
+ const checkMqeData = () => {
316
+ for (const data of [
317
+ mqeData.audioTransmit,
318
+ mqeData.audioReceive,
319
+ mqeData.videoTransmit,
320
+ mqeData.videoReceive,
321
+ ]) {
322
+ assert.strictEqual(data.length, 2);
323
+ assert.strictEqual(data[0].common.common.isMain, true);
324
+ assert.strictEqual(data[1].common.common.isMain, false);
325
+ }
326
+
327
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedFrameSize, 3600);
328
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedHeight, 720);
329
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedWidth, 1280);
330
+ };
331
+
227
332
  it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
228
333
  await startStatsAnalyzer({expected: {sendAudio: true}});
229
334
 
@@ -303,6 +408,125 @@ describe('plugin-meetings', () => {
303
408
 
304
409
  checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
305
410
  });
411
+
412
+ it('emits the correct MEDIA_QUALITY events', async () => {
413
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
414
+
415
+ await progressTime();
416
+
417
+ // Check that the mqe data has been emitted and is correctly computed.
418
+ checkMqeData();
419
+ });
420
+
421
+ it('emits the correct transportType in MEDIA_QUALITY events', async () => {
422
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
423
+
424
+ await progressTime();
425
+
426
+ assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TCP');
427
+ assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TCP');
428
+ });
429
+
430
+ it('emits the correct transportType in MEDIA_QUALITY events when using a TURN server', async () => {
431
+ fakeStats.audio.senders[0].report[3].relayProtocol = 'tls';
432
+ fakeStats.video.senders[0].report[3].relayProtocol = 'tls';
433
+ fakeStats.audio.receivers[0].report[3].relayProtocol = 'tls';
434
+ fakeStats.video.receivers[0].report[3].relayProtocol = 'tls';
435
+
436
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
437
+
438
+ await progressTime();
439
+
440
+ assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TLS');
441
+ assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TLS');
442
+ });
443
+
444
+ it('emits the correct peripherals in MEDIA_QUALITY events', async () => {
445
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
446
+
447
+ await progressTime();
448
+
449
+ assert.strictEqual(
450
+ mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE)
451
+ .information,
452
+ 'fake-microphone'
453
+ );
454
+ assert.strictEqual(
455
+ mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA)
456
+ .information,
457
+ 'fake-camera'
458
+ );
459
+ });
460
+
461
+ it('emits the correct peripherals in MEDIA_QUALITY events when localTrackLabel is undefined', async () => {
462
+ fakeStats.audio.senders[0].localTrackLabel = undefined;
463
+ fakeStats.video.senders[0].localTrackLabel = undefined;
464
+
465
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
466
+
467
+ await progressTime();
468
+
469
+ assert.strictEqual(
470
+ mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE)
471
+ .information,
472
+ _UNKNOWN_
473
+ );
474
+ assert.strictEqual(
475
+ mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA)
476
+ .information,
477
+ _UNKNOWN_
478
+ );
479
+ });
480
+
481
+ it('emits the correct frameRate', async () => {
482
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
483
+
484
+ await progressTime();
485
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 25);
486
+ fakeStats.video.receivers[0].framesReceived = 3000;
487
+ await progressTime();
488
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 25);
489
+ });
490
+
491
+ it('has the correct localIpAddress set when the candidateType is host', async () => {
492
+ await startStatsAnalyzer();
493
+
494
+ await progressTime();
495
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
496
+ mergeProperties(fakeStats, {address: 'test', candidateType: 'host'});
497
+ await progressTime();
498
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), 'test');
499
+ });
500
+
501
+ it('has the correct localIpAddress set when the candidateType is prflx and relayProtocol is set', async () => {
502
+ await startStatsAnalyzer();
503
+
504
+ await progressTime();
505
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
506
+ mergeProperties(fakeStats, {relayProtocol: 'test', address: 'test2', candidateType: 'prflx'});
507
+ await progressTime();
508
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), 'test2');
509
+ });
510
+
511
+ it('has the correct localIpAddress set when the candidateType is prflx and relayProtocol is not set', async () => {
512
+ await startStatsAnalyzer();
513
+
514
+ await progressTime();
515
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
516
+ mergeProperties(fakeStats, {relatedAddress: 'relatedAddress', address: 'test2', candidateType: 'prflx'});
517
+ await progressTime();
518
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), 'relatedAddress');
519
+ });
520
+
521
+ it('has no localIpAddress set when the candidateType is invalid', async () => {
522
+ await startStatsAnalyzer();
523
+
524
+ await progressTime();
525
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
526
+ mergeProperties(fakeStats, {candidateType: 'invalid'});
527
+ await progressTime();
528
+ assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
529
+ });
306
530
  });
307
531
  });
308
532
  });
@@ -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,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
+ };
@@ -1,5 +1,3 @@
1
- import {assert} from '@webex/test-helper-chai';
2
- import {Defer} from '@webex/common';
3
1
 
4
2
  const max = 30000;
5
3
  const waitForSpy = (spy, event) => {
@@ -195,56 +193,7 @@ const delayedTest = (callback, timeout) =>
195
193
  }, timeout);
196
194
  });
197
195
 
198
- const addMedia = (user, options = {}) => {
199
- const mediaReadyPromises = Array.isArray(options.expectedMediaReadyTypes)
200
- ? options.expectedMediaReadyTypes.reduce((output, expectedMediaReadyType) => {
201
- if (typeof expectedMediaReadyType !== 'string') {
202
- return output;
203
- }
204
-
205
- output[expectedMediaReadyType] = new Defer();
206
-
207
- return output;
208
- }, {})
209
- : {local: new Defer(), remoteAudio: new Defer(), remoteVideo: new Defer()};
210
-
211
- const mediaReady = (media) => {
212
- if (!media) {
213
- return;
214
- }
215
- if (mediaReadyPromises[media.type]) {
216
- mediaReadyPromises[media.type].resolve();
217
- }
218
- };
219
196
 
220
- user.meeting.on('media:ready', mediaReady);
221
-
222
- return user.meeting
223
- .getMediaStreams({
224
- sendAudio: true,
225
- sendVideo: true,
226
- sendShare: false,
227
- })
228
- .then(([localStream, localShare]) =>
229
- user.meeting.addMedia({
230
- mediaSettings: {
231
- sendAudio: true,
232
- sendVideo: true,
233
- sendShare: false,
234
- receiveShare: true,
235
- receiveAudio: true,
236
- receiveVideo: true,
237
- },
238
- localShare,
239
- localStream,
240
- })
241
- )
242
- .then(() => Promise.all(Object.values(mediaReadyPromises).map((defer) => defer.promise)))
243
- .then(() => {
244
- assert.exists(user.meeting.mediaProperties.audioTrack, 'audioTrack not present');
245
- assert.exists(user.meeting.mediaProperties.videoTrack, 'videoTrack not present');
246
- });
247
- };
248
197
 
249
198
  const waitUntil = (waitTime) =>
250
199
  new Promise((resolve) => {
@@ -286,7 +235,6 @@ export default {
286
235
  waitForEvents,
287
236
  checkParticipantUpdatedStatus,
288
237
  delayedPromise,
289
- addMedia,
290
238
  waitUntil,
291
239
  delayedTest,
292
240
  flushPromises,