@webex/plugin-meetings 2.60.0 → 2.60.1-next.2

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 (535) 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-error.js → reclaim-host-role-errors.js} +7 -11
  56. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  57. package/dist/common/errors/reconnection-in-progress.js +1 -2
  58. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  59. package/dist/common/errors/reconnection.js +1 -2
  60. package/dist/common/errors/reconnection.js.map +1 -1
  61. package/dist/common/errors/stats.js +1 -2
  62. package/dist/common/errors/stats.js.map +1 -1
  63. package/dist/common/errors/webex-errors.d.ts +20 -8
  64. package/dist/common/errors/webex-errors.js +48 -28
  65. package/dist/common/errors/webex-errors.js.map +1 -1
  66. package/dist/common/errors/webex-meetings-error.js +1 -2
  67. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  68. package/dist/common/events/events-scope.js +1 -2
  69. package/dist/common/events/events-scope.js.map +1 -1
  70. package/dist/common/events/events.js +1 -2
  71. package/dist/common/events/events.js.map +1 -1
  72. package/dist/common/events/trigger-proxy.js +1 -2
  73. package/dist/common/events/trigger-proxy.js.map +1 -1
  74. package/dist/common/events/util.js +1 -2
  75. package/dist/common/events/util.js.map +1 -1
  76. package/dist/common/logs/logger-config.js +1 -2
  77. package/dist/common/logs/logger-config.js.map +1 -1
  78. package/dist/common/logs/logger-proxy.js +2 -3
  79. package/dist/common/logs/logger-proxy.js.map +1 -1
  80. package/dist/common/logs/request.d.ts +3 -1
  81. package/dist/common/logs/request.js +8 -5
  82. package/dist/common/logs/request.js.map +1 -1
  83. package/dist/common/queue.d.ts +9 -7
  84. package/dist/common/queue.js +22 -9
  85. package/dist/common/queue.js.map +1 -1
  86. package/dist/config.d.ts +6 -7
  87. package/dist/config.js +8 -10
  88. package/dist/config.js.map +1 -1
  89. package/dist/constants.d.ts +217 -97
  90. package/dist/constants.js +416 -441
  91. package/dist/constants.js.map +1 -1
  92. package/dist/controls-options-manager/constants.js +3 -6
  93. package/dist/controls-options-manager/constants.js.map +1 -1
  94. package/dist/controls-options-manager/enums.d.ts +11 -1
  95. package/dist/controls-options-manager/enums.js +15 -6
  96. package/dist/controls-options-manager/enums.js.map +1 -1
  97. package/dist/controls-options-manager/index.d.ts +17 -1
  98. package/dist/controls-options-manager/index.js +127 -38
  99. package/dist/controls-options-manager/index.js.map +1 -1
  100. package/dist/controls-options-manager/types.d.ts +43 -0
  101. package/dist/controls-options-manager/types.js +7 -0
  102. package/dist/controls-options-manager/types.js.map +1 -0
  103. package/dist/controls-options-manager/util.d.ts +1 -7
  104. package/dist/controls-options-manager/util.js +309 -19
  105. package/dist/controls-options-manager/util.js.map +1 -1
  106. package/dist/index.d.ts +6 -3
  107. package/dist/index.js +121 -5
  108. package/dist/index.js.map +1 -1
  109. package/dist/interceptors/index.d.ts +2 -0
  110. package/dist/interceptors/index.js +15 -0
  111. package/dist/interceptors/index.js.map +1 -0
  112. package/dist/interceptors/locusRetry.d.ts +27 -0
  113. package/dist/interceptors/locusRetry.js +94 -0
  114. package/dist/interceptors/locusRetry.js.map +1 -0
  115. package/dist/interpretation/collection.d.ts +5 -0
  116. package/dist/interpretation/collection.js +22 -0
  117. package/dist/interpretation/collection.js.map +1 -0
  118. package/dist/interpretation/index.d.ts +5 -0
  119. package/dist/interpretation/index.js +365 -0
  120. package/dist/interpretation/index.js.map +1 -0
  121. package/dist/interpretation/siLanguage.d.ts +5 -0
  122. package/dist/interpretation/siLanguage.js +24 -0
  123. package/dist/interpretation/siLanguage.js.map +1 -0
  124. package/dist/locus-info/controlsUtils.js +100 -11
  125. package/dist/locus-info/controlsUtils.js.map +1 -1
  126. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  127. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  128. package/dist/locus-info/fullState.js +1 -2
  129. package/dist/locus-info/fullState.js.map +1 -1
  130. package/dist/locus-info/hostUtils.js +1 -2
  131. package/dist/locus-info/hostUtils.js.map +1 -1
  132. package/dist/locus-info/index.d.ts +57 -4
  133. package/dist/locus-info/index.js +425 -84
  134. package/dist/locus-info/index.js.map +1 -1
  135. package/dist/locus-info/infoUtils.js +13 -5
  136. package/dist/locus-info/infoUtils.js.map +1 -1
  137. package/dist/locus-info/mediaSharesUtils.js +58 -3
  138. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  139. package/dist/locus-info/parser.d.ts +66 -6
  140. package/dist/locus-info/parser.js +253 -80
  141. package/dist/locus-info/parser.js.map +1 -1
  142. package/dist/locus-info/selfUtils.js +97 -13
  143. package/dist/locus-info/selfUtils.js.map +1 -1
  144. package/dist/media/index.d.ts +2 -0
  145. package/dist/media/index.js +107 -319
  146. package/dist/media/index.js.map +1 -1
  147. package/dist/media/properties.d.ts +38 -53
  148. package/dist/media/properties.js +96 -153
  149. package/dist/media/properties.js.map +1 -1
  150. package/dist/media/util.js +1 -22
  151. package/dist/media/util.js.map +1 -1
  152. package/dist/mediaQualityMetrics/config.d.ts +234 -230
  153. package/dist/mediaQualityMetrics/config.js +302 -498
  154. package/dist/mediaQualityMetrics/config.js.map +1 -1
  155. package/dist/meeting/in-meeting-actions.d.ts +88 -0
  156. package/dist/meeting/in-meeting-actions.js +94 -3
  157. package/dist/meeting/in-meeting-actions.js.map +1 -1
  158. package/dist/meeting/index.d.ts +591 -494
  159. package/dist/meeting/index.js +4732 -2990
  160. package/dist/meeting/index.js.map +1 -1
  161. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  162. package/dist/meeting/locusMediaRequest.js +291 -0
  163. package/dist/meeting/locusMediaRequest.js.map +1 -0
  164. package/dist/meeting/muteState.d.ts +93 -25
  165. package/dist/meeting/muteState.js +224 -133
  166. package/dist/meeting/muteState.js.map +1 -1
  167. package/dist/meeting/request.d.ts +82 -47
  168. package/dist/meeting/request.js +297 -199
  169. package/dist/meeting/request.js.map +1 -1
  170. package/dist/meeting/request.type.d.ts +11 -0
  171. package/dist/meeting/request.type.js +7 -0
  172. package/dist/meeting/request.type.js.map +1 -0
  173. package/dist/meeting/state.js +1 -2
  174. package/dist/meeting/state.js.map +1 -1
  175. package/dist/meeting/util.d.ts +102 -1
  176. package/dist/meeting/util.js +605 -435
  177. package/dist/meeting/util.js.map +1 -1
  178. package/dist/meeting-info/collection.js +3 -4
  179. package/dist/meeting-info/collection.js.map +1 -1
  180. package/dist/meeting-info/index.d.ts +13 -1
  181. package/dist/meeting-info/index.js +74 -7
  182. package/dist/meeting-info/index.js.map +1 -1
  183. package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
  184. package/dist/meeting-info/meeting-info-v2.js +200 -63
  185. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  186. package/dist/meeting-info/request.js +1 -2
  187. package/dist/meeting-info/request.js.map +1 -1
  188. package/dist/meeting-info/util.js +2 -3
  189. package/dist/meeting-info/util.js.map +1 -1
  190. package/dist/meeting-info/utilv2.js +39 -41
  191. package/dist/meeting-info/utilv2.js.map +1 -1
  192. package/dist/meetings/collection.d.ts +17 -0
  193. package/dist/meetings/collection.js +42 -4
  194. package/dist/meetings/collection.js.map +1 -1
  195. package/dist/meetings/index.d.ts +93 -21
  196. package/dist/meetings/index.js +490 -127
  197. package/dist/meetings/index.js.map +1 -1
  198. package/dist/meetings/meetings.types.d.ts +4 -0
  199. package/dist/meetings/meetings.types.js +7 -0
  200. package/dist/meetings/meetings.types.js.map +1 -0
  201. package/dist/meetings/request.js +4 -3
  202. package/dist/meetings/request.js.map +1 -1
  203. package/dist/meetings/util.js +107 -6
  204. package/dist/meetings/util.js.map +1 -1
  205. package/dist/member/index.d.ts +13 -1
  206. package/dist/member/index.js +45 -2
  207. package/dist/member/index.js.map +1 -1
  208. package/dist/member/member.types.js +3 -4
  209. package/dist/member/member.types.js.map +1 -1
  210. package/dist/member/types.d.ts +32 -0
  211. package/dist/member/types.js +23 -0
  212. package/dist/member/types.js.map +1 -0
  213. package/dist/member/util.js +120 -29
  214. package/dist/member/util.js.map +1 -1
  215. package/dist/members/collection.d.ts +5 -0
  216. package/dist/members/collection.js +11 -2
  217. package/dist/members/collection.js.map +1 -1
  218. package/dist/members/index.d.ts +56 -11
  219. package/dist/members/index.js +174 -47
  220. package/dist/members/index.js.map +1 -1
  221. package/dist/members/request.d.ts +67 -11
  222. package/dist/members/request.js +102 -54
  223. package/dist/members/request.js.map +1 -1
  224. package/dist/members/types.js +3 -4
  225. package/dist/members/types.js.map +1 -1
  226. package/dist/members/util.d.ts +214 -1
  227. package/dist/members/util.js +327 -284
  228. package/dist/members/util.js.map +1 -1
  229. package/dist/metrics/constants.d.ts +15 -6
  230. package/dist/metrics/constants.js +17 -9
  231. package/dist/metrics/constants.js.map +1 -1
  232. package/dist/metrics/index.d.ts +4 -111
  233. package/dist/metrics/index.js +4 -452
  234. package/dist/metrics/index.js.map +1 -1
  235. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  236. package/dist/multistream/mediaRequestManager.js +344 -0
  237. package/dist/multistream/mediaRequestManager.js.map +1 -0
  238. package/dist/multistream/receiveSlot.d.ts +68 -0
  239. package/dist/multistream/receiveSlot.js +200 -0
  240. package/dist/multistream/receiveSlot.js.map +1 -0
  241. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  242. package/dist/multistream/receiveSlotManager.js +174 -0
  243. package/dist/multistream/receiveSlotManager.js.map +1 -0
  244. package/dist/multistream/remoteMedia.d.ts +72 -0
  245. package/dist/multistream/remoteMedia.js +268 -0
  246. package/dist/multistream/remoteMedia.js.map +1 -0
  247. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  248. package/dist/multistream/remoteMediaGroup.js +267 -0
  249. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  250. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  251. package/dist/multistream/remoteMediaManager.js +1211 -0
  252. package/dist/multistream/remoteMediaManager.js.map +1 -0
  253. package/dist/multistream/sendSlotManager.d.ts +61 -0
  254. package/dist/multistream/sendSlotManager.js +236 -0
  255. package/dist/multistream/sendSlotManager.js.map +1 -0
  256. package/dist/networkQualityMonitor/index.js +5 -4
  257. package/dist/networkQualityMonitor/index.js.map +1 -1
  258. package/dist/personal-meeting-room/index.js +2 -3
  259. package/dist/personal-meeting-room/index.js.map +1 -1
  260. package/dist/personal-meeting-room/request.js +2 -3
  261. package/dist/personal-meeting-room/request.js.map +1 -1
  262. package/dist/personal-meeting-room/util.js +1 -2
  263. package/dist/personal-meeting-room/util.js.map +1 -1
  264. package/dist/reachability/clusterReachability.d.ts +109 -0
  265. package/dist/reachability/clusterReachability.js +357 -0
  266. package/dist/reachability/clusterReachability.js.map +1 -0
  267. package/dist/reachability/index.d.ts +61 -95
  268. package/dist/reachability/index.js +300 -393
  269. package/dist/reachability/index.js.map +1 -1
  270. package/dist/reachability/request.d.ts +7 -3
  271. package/dist/reachability/request.js +18 -10
  272. package/dist/reachability/request.js.map +1 -1
  273. package/dist/reachability/util.d.ts +8 -0
  274. package/dist/reachability/util.js +29 -0
  275. package/dist/reachability/util.js.map +1 -0
  276. package/dist/reactions/constants.d.ts +3 -0
  277. package/dist/reactions/constants.js +12 -0
  278. package/dist/reactions/constants.js.map +1 -0
  279. package/dist/reactions/reactions.d.ts +2 -2
  280. package/dist/reactions/reactions.js +4 -6
  281. package/dist/reactions/reactions.js.map +1 -1
  282. package/dist/reactions/reactions.type.d.ts +23 -3
  283. package/dist/reactions/reactions.type.js +21 -23
  284. package/dist/reactions/reactions.type.js.map +1 -1
  285. package/dist/reconnection-manager/index.d.ts +32 -8
  286. package/dist/reconnection-manager/index.js +282 -231
  287. package/dist/reconnection-manager/index.js.map +1 -1
  288. package/dist/recording-controller/enums.js +4 -5
  289. package/dist/recording-controller/enums.js.map +1 -1
  290. package/dist/recording-controller/index.d.ts +15 -1
  291. package/dist/recording-controller/index.js +57 -46
  292. package/dist/recording-controller/index.js.map +1 -1
  293. package/dist/recording-controller/util.d.ts +5 -4
  294. package/dist/recording-controller/util.js +10 -10
  295. package/dist/recording-controller/util.js.map +1 -1
  296. package/dist/roap/index.d.ts +9 -47
  297. package/dist/roap/index.js +101 -235
  298. package/dist/roap/index.js.map +1 -1
  299. package/dist/roap/request.d.ts +18 -12
  300. package/dist/roap/request.js +126 -180
  301. package/dist/roap/request.js.map +1 -1
  302. package/dist/roap/turnDiscovery.d.ts +27 -16
  303. package/dist/roap/turnDiscovery.js +115 -105
  304. package/dist/roap/turnDiscovery.js.map +1 -1
  305. package/dist/rtcMetrics/constants.d.ts +4 -0
  306. package/dist/rtcMetrics/constants.js +11 -0
  307. package/dist/rtcMetrics/constants.js.map +1 -0
  308. package/dist/rtcMetrics/index.d.ts +54 -0
  309. package/dist/rtcMetrics/index.js +140 -0
  310. package/dist/rtcMetrics/index.js.map +1 -0
  311. package/dist/statsAnalyzer/global.d.ts +1 -83
  312. package/dist/statsAnalyzer/global.js +2 -85
  313. package/dist/statsAnalyzer/global.js.map +1 -1
  314. package/dist/statsAnalyzer/index.d.ts +50 -30
  315. package/dist/statsAnalyzer/index.js +435 -510
  316. package/dist/statsAnalyzer/index.js.map +1 -1
  317. package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
  318. package/dist/statsAnalyzer/mqaUtil.js +120 -83
  319. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  320. package/dist/transcription/index.js +1 -2
  321. package/dist/transcription/index.js.map +1 -1
  322. package/dist/webinar/collection.d.ts +16 -0
  323. package/dist/webinar/collection.js +43 -0
  324. package/dist/webinar/collection.js.map +1 -0
  325. package/dist/webinar/index.d.ts +5 -0
  326. package/dist/webinar/index.js +68 -0
  327. package/dist/webinar/index.js.map +1 -0
  328. package/package.json +38 -26
  329. package/src/annotation/annotation.types.ts +50 -0
  330. package/src/annotation/constants.ts +36 -0
  331. package/src/annotation/index.ts +328 -0
  332. package/src/breakouts/README.md +220 -0
  333. package/src/breakouts/breakout.ts +188 -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 +56 -0
  337. package/src/breakouts/index.ts +925 -0
  338. package/src/breakouts/request.ts +55 -0
  339. package/src/breakouts/utils.ts +57 -0
  340. package/src/common/errors/no-meeting-info.ts +24 -0
  341. package/src/common/errors/webex-errors.ts +36 -12
  342. package/src/common/logs/logger-proxy.ts +1 -1
  343. package/src/common/logs/request.ts +5 -1
  344. package/src/common/queue.ts +22 -8
  345. package/src/config.ts +6 -7
  346. package/src/constants.ts +244 -97
  347. package/src/controls-options-manager/enums.ts +12 -0
  348. package/src/controls-options-manager/index.ts +116 -21
  349. package/src/controls-options-manager/types.ts +59 -0
  350. package/src/controls-options-manager/util.ts +294 -14
  351. package/src/index.ts +44 -0
  352. package/src/interceptors/index.ts +3 -0
  353. package/src/interceptors/locusRetry.ts +67 -0
  354. package/src/interpretation/README.md +60 -0
  355. package/src/interpretation/collection.ts +19 -0
  356. package/src/interpretation/index.ts +332 -0
  357. package/src/interpretation/siLanguage.ts +18 -0
  358. package/src/locus-info/controlsUtils.ts +110 -0
  359. package/src/locus-info/index.ts +449 -61
  360. package/src/locus-info/infoUtils.ts +14 -2
  361. package/src/locus-info/mediaSharesUtils.ts +64 -0
  362. package/src/locus-info/parser.ts +258 -47
  363. package/src/locus-info/selfUtils.ts +85 -2
  364. package/src/media/index.ts +153 -370
  365. package/src/media/properties.ts +106 -136
  366. package/src/media/util.ts +0 -21
  367. package/src/mediaQualityMetrics/config.ts +244 -377
  368. package/src/meeting/in-meeting-actions.ts +176 -0
  369. package/src/meeting/index.ts +3944 -2489
  370. package/src/meeting/locusMediaRequest.ts +313 -0
  371. package/src/meeting/muteState.ts +224 -138
  372. package/src/meeting/request.ts +207 -127
  373. package/src/meeting/request.type.ts +13 -0
  374. package/src/meeting/util.ts +590 -423
  375. package/src/meeting-info/index.ts +81 -8
  376. package/src/meeting-info/meeting-info-v2.ts +163 -13
  377. package/src/meeting-info/util.ts +1 -1
  378. package/src/meeting-info/utilv2.ts +28 -28
  379. package/src/meetings/collection.ts +33 -0
  380. package/src/meetings/index.ts +487 -126
  381. package/src/meetings/meetings.types.ts +12 -0
  382. package/src/meetings/request.ts +2 -0
  383. package/src/meetings/util.ts +116 -5
  384. package/src/member/index.ts +43 -1
  385. package/src/member/types.ts +38 -0
  386. package/src/member/util.ts +125 -28
  387. package/src/members/collection.ts +8 -0
  388. package/src/members/index.ts +187 -52
  389. package/src/members/request.ts +87 -27
  390. package/src/members/util.ts +332 -291
  391. package/src/metrics/constants.ts +15 -6
  392. package/src/metrics/index.ts +1 -471
  393. package/src/multistream/mediaRequestManager.ts +440 -0
  394. package/src/multistream/receiveSlot.ts +184 -0
  395. package/src/multistream/receiveSlotManager.ts +166 -0
  396. package/src/multistream/remoteMedia.ts +254 -0
  397. package/src/multistream/remoteMediaGroup.ts +284 -0
  398. package/src/multistream/remoteMediaManager.ts +1145 -0
  399. package/src/multistream/sendSlotManager.ts +170 -0
  400. package/src/networkQualityMonitor/index.ts +6 -6
  401. package/src/reachability/clusterReachability.ts +320 -0
  402. package/src/reachability/index.ts +243 -347
  403. package/src/reachability/request.ts +17 -8
  404. package/src/reachability/util.ts +24 -0
  405. package/src/reactions/constants.ts +4 -0
  406. package/src/reactions/reactions.ts +4 -4
  407. package/src/reactions/reactions.type.ts +30 -4
  408. package/src/reconnection-manager/index.ts +168 -156
  409. package/src/recording-controller/index.ts +20 -3
  410. package/src/recording-controller/util.ts +26 -9
  411. package/src/roap/index.ts +98 -241
  412. package/src/roap/request.ts +74 -148
  413. package/src/roap/turnDiscovery.ts +62 -56
  414. package/src/rtcMetrics/constants.ts +3 -0
  415. package/src/rtcMetrics/index.ts +124 -0
  416. package/src/statsAnalyzer/global.ts +1 -84
  417. package/src/statsAnalyzer/index.ts +477 -643
  418. package/src/statsAnalyzer/mqaUtil.ts +115 -114
  419. package/src/webinar/collection.ts +31 -0
  420. package/src/webinar/index.ts +62 -0
  421. package/test/integration/spec/converged-space-meetings.js +233 -0
  422. package/test/integration/spec/journey.js +320 -264
  423. package/test/integration/spec/space-meeting.js +77 -4
  424. package/test/unit/spec/annotation/index.ts +418 -0
  425. package/test/unit/spec/breakouts/breakout.ts +237 -0
  426. package/test/unit/spec/breakouts/collection.ts +15 -0
  427. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  428. package/test/unit/spec/breakouts/events.ts +89 -0
  429. package/test/unit/spec/breakouts/index.ts +1790 -0
  430. package/test/unit/spec/breakouts/request.ts +104 -0
  431. package/test/unit/spec/breakouts/utils.js +72 -0
  432. package/test/unit/spec/common/queue.js +31 -2
  433. package/test/unit/spec/controls-options-manager/index.js +163 -0
  434. package/test/unit/spec/controls-options-manager/util.js +576 -60
  435. package/test/unit/spec/fixture/locus.js +1 -0
  436. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  437. package/test/unit/spec/interpretation/collection.ts +15 -0
  438. package/test/unit/spec/interpretation/index.ts +589 -0
  439. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  440. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  441. package/test/unit/spec/locus-info/index.js +1390 -16
  442. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  443. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  444. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  445. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  446. package/test/unit/spec/locus-info/parser.js +116 -35
  447. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  448. package/test/unit/spec/media/index.ts +290 -0
  449. package/test/unit/spec/media/properties.ts +75 -84
  450. package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
  451. package/test/unit/spec/meeting/index.js +8187 -2769
  452. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  453. package/test/unit/spec/meeting/muteState.js +409 -213
  454. package/test/unit/spec/meeting/request.js +512 -42
  455. package/test/unit/spec/meeting/utils.js +741 -24
  456. package/test/unit/spec/meeting-info/index.js +300 -0
  457. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  458. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  459. package/test/unit/spec/meetings/collection.js +26 -0
  460. package/test/unit/spec/meetings/index.js +1313 -243
  461. package/test/unit/spec/meetings/utils.js +202 -2
  462. package/test/unit/spec/member/index.js +32 -9
  463. package/test/unit/spec/member/util.js +499 -61
  464. package/test/unit/spec/members/index.js +394 -5
  465. package/test/unit/spec/members/request.js +206 -27
  466. package/test/unit/spec/members/utils.js +173 -38
  467. package/test/unit/spec/metrics/index.js +1 -50
  468. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  469. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  470. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  471. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  472. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  473. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  474. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  475. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  476. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  477. package/test/unit/spec/reachability/index.ts +531 -24
  478. package/test/unit/spec/reachability/request.js +68 -0
  479. package/test/unit/spec/reachability/util.ts +40 -0
  480. package/test/unit/spec/reconnection-manager/index.js +162 -24
  481. package/test/unit/spec/recording-controller/index.js +293 -218
  482. package/test/unit/spec/recording-controller/util.js +223 -96
  483. package/test/unit/spec/roap/index.ts +200 -76
  484. package/test/unit/spec/roap/request.ts +255 -0
  485. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  486. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  487. package/test/unit/spec/stats-analyzer/index.js +261 -167
  488. package/test/unit/spec/webinar/collection.ts +13 -0
  489. package/test/unit/spec/webinar/index.ts +60 -0
  490. package/test/utils/constants.js +9 -0
  491. package/test/utils/integrationTestUtils.js +46 -0
  492. package/test/utils/testUtils.js +0 -45
  493. package/test/utils/webex-config.js +4 -0
  494. package/test/utils/webex-test-users.js +7 -3
  495. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  496. package/dist/meeting/effectsState.d.ts +0 -42
  497. package/dist/meeting/effectsState.js +0 -260
  498. package/dist/meeting/effectsState.js.map +0 -1
  499. package/dist/metrics/config.d.ts +0 -169
  500. package/dist/metrics/config.js +0 -289
  501. package/dist/metrics/config.js.map +0 -1
  502. package/dist/peer-connection-manager/index.d.ts +0 -6
  503. package/dist/peer-connection-manager/index.js +0 -671
  504. package/dist/peer-connection-manager/index.js.map +0 -1
  505. package/dist/peer-connection-manager/util.d.ts +0 -6
  506. package/dist/peer-connection-manager/util.js +0 -110
  507. package/dist/peer-connection-manager/util.js.map +0 -1
  508. package/dist/roap/collection.d.ts +0 -10
  509. package/dist/roap/collection.js +0 -63
  510. package/dist/roap/collection.js.map +0 -1
  511. package/dist/roap/handler.d.ts +0 -47
  512. package/dist/roap/handler.js +0 -279
  513. package/dist/roap/handler.js.map +0 -1
  514. package/dist/roap/state.d.ts +0 -9
  515. package/dist/roap/state.js +0 -127
  516. package/dist/roap/state.js.map +0 -1
  517. package/dist/roap/util.d.ts +0 -2
  518. package/dist/roap/util.js +0 -76
  519. package/dist/roap/util.js.map +0 -1
  520. package/src/index.js +0 -15
  521. package/src/meeting/effectsState.ts +0 -209
  522. package/src/metrics/config.ts +0 -485
  523. package/src/peer-connection-manager/index.ts +0 -847
  524. package/src/peer-connection-manager/util.ts +0 -119
  525. package/src/roap/collection.ts +0 -62
  526. package/src/roap/handler.ts +0 -294
  527. package/src/roap/state.ts +0 -156
  528. package/src/roap/util.ts +0 -100
  529. package/test/unit/spec/meeting/effectsState.js +0 -281
  530. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  531. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  532. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  533. package/test/unit/spec/roap/util.js +0 -30
  534. /package/dist/common/errors/{reclaim-host-role-error.d.ts → reclaim-host-role-errors.d.ts} +0 -0
  535. /package/src/common/errors/{reclaim-host-role-error.ts → reclaim-host-role-errors.ts} +0 -0
@@ -1,22 +1,31 @@
1
1
  import sinon from 'sinon';
2
2
  import {assert} from '@webex/test-helper-chai';
3
+ import Meetings from '@webex/plugin-meetings';
3
4
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
4
5
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
5
6
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
6
- import Metrics from '@webex/plugin-meetings/src/metrics/index';
7
+ import {SELF_POLICY, IP_VERSION} from '@webex/plugin-meetings/src/constants';
8
+ import MockWebex from '@webex/test-helper-mock-webex';
9
+ import * as BrowserDetectionModule from '@webex/plugin-meetings/src/common/browser-detection';
7
10
 
8
11
  describe('plugin-meetings', () => {
12
+ let webex;
9
13
  describe('Meeting utils function', () => {
10
14
  const sandbox = sinon.createSandbox();
11
15
  const meeting = {};
12
16
 
13
17
  beforeEach(() => {
14
- Metrics.postEvent = sinon.stub();
18
+ webex = new MockWebex({
19
+ children: {
20
+ meetings: Meetings,
21
+ },
22
+ });
15
23
  const logger = {
16
24
  info: sandbox.stub(),
17
25
  log: sandbox.stub(),
18
26
  error: sandbox.stub(),
19
27
  warn: sandbox.stub(),
28
+ debug: sandbox.stub(),
20
29
  };
21
30
 
22
31
  LoggerConfig.set({
@@ -25,40 +34,41 @@ describe('plugin-meetings', () => {
25
34
  });
26
35
  LoggerProxy.set(logger);
27
36
 
28
- meeting.closeLocalStream = sinon.stub().returns(Promise.resolve());
29
- meeting.closeLocalShare = sinon.stub().returns(Promise.resolve());
30
- meeting.closeRemoteTracks = sinon.stub().returns(Promise.resolve());
37
+ meeting.cleanupLocalStreams = sinon.stub().returns(Promise.resolve());
38
+ meeting.closeRemoteStreams = sinon.stub().returns(Promise.resolve());
31
39
  meeting.closePeerConnections = sinon.stub().returns(Promise.resolve());
32
40
 
33
- meeting.unsetLocalVideoTrack = sinon.stub();
34
- meeting.unsetLocalShareTrack = sinon.stub();
35
- meeting.unsetRemoteTracks = sinon.stub();
41
+ meeting.unsetRemoteStreams = sinon.stub();
36
42
  meeting.unsetPeerConnections = sinon.stub();
37
43
  meeting.reconnectionManager = {cleanUp: sinon.stub()};
38
- meeting.roap = {stop: sinon.stub()};
39
44
  meeting.stopKeepAlive = sinon.stub();
45
+ meeting.updateLLMConnection = sinon.stub();
46
+ meeting.breakouts = {cleanUp: sinon.stub()};
47
+ meeting.annotaion = {cleanUp: sinon.stub()};
48
+ meeting.getWebexObject = sinon.stub().returns(webex);
49
+ meeting.simultaneousInterpretation = {cleanUp: sinon.stub()};
50
+ meeting.trigger = sinon.stub();
40
51
  });
41
52
 
42
53
  afterEach(() => {
43
54
  sandbox.restore();
55
+ sinon.restore();
44
56
  });
45
57
 
46
58
  describe('#cleanup', () => {
47
59
  it('do clean up on meeting object', async () => {
48
60
  await MeetingUtil.cleanUp(meeting);
49
- assert.calledOnce(meeting.closeLocalStream);
50
- assert.calledOnce(meeting.closeLocalStream);
51
- assert.calledOnce(meeting.closeLocalShare);
52
- assert.calledOnce(meeting.closeRemoteTracks);
61
+ assert.calledOnce(meeting.cleanupLocalStreams);
62
+ assert.calledOnce(meeting.closeRemoteStreams);
53
63
  assert.calledOnce(meeting.closePeerConnections);
54
64
 
55
- assert.calledOnce(meeting.unsetLocalVideoTrack);
56
- assert.calledOnce(meeting.unsetLocalShareTrack);
57
- assert.calledOnce(meeting.unsetRemoteTracks);
65
+ assert.calledOnce(meeting.unsetRemoteStreams);
58
66
  assert.calledOnce(meeting.unsetPeerConnections);
59
67
  assert.calledOnce(meeting.reconnectionManager.cleanUp);
60
- assert.calledOnce(meeting.roap.stop);
61
68
  assert.calledOnce(meeting.stopKeepAlive);
69
+ assert.calledOnce(meeting.updateLLMConnection);
70
+ assert.calledOnce(meeting.breakouts.cleanUp);
71
+ assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
62
72
  });
63
73
  });
64
74
 
@@ -67,7 +77,7 @@ describe('plugin-meetings', () => {
67
77
  deviceId: 'device-1',
68
78
  });
69
79
 
70
- const mockTrack = {
80
+ const mockStream = {
71
81
  getSettings: fakeDevice,
72
82
  };
73
83
 
@@ -86,27 +96,27 @@ describe('plugin-meetings', () => {
86
96
  });
87
97
 
88
98
  describe('#handleAudioLogging', () => {
89
- it('should not log if called without track', () => {
99
+ it('should not log if called without stream', () => {
90
100
  MeetingUtil.handleAudioLogging();
91
101
  assert(!LoggerProxy.logger.log.called, 'log not called');
92
102
  });
93
103
 
94
- it('should log audioTrack settings', () => {
104
+ it('should log audioStream settings', () => {
95
105
  assert(MeetingUtil.handleAudioLogging, 'method is defined');
96
- MeetingUtil.handleAudioLogging(mockTrack);
106
+ MeetingUtil.handleAudioLogging(mockStream);
97
107
  assert(LoggerProxy.logger.log.called, 'log called');
98
108
  });
99
109
  });
100
110
 
101
111
  describe('#handleVideoLogging', () => {
102
- it('should not log if called without track', () => {
112
+ it('should not log if called without stream', () => {
103
113
  MeetingUtil.handleVideoLogging(null);
104
114
  assert(!LoggerProxy.logger.log.called, 'log not called');
105
115
  });
106
116
 
107
- it('should log videoTrack settings', () => {
117
+ it('should log videoStream settings', () => {
108
118
  assert(MeetingUtil.handleVideoLogging, 'method is defined');
109
- MeetingUtil.handleVideoLogging(mockTrack);
119
+ MeetingUtil.handleVideoLogging(mockStream);
110
120
  assert(LoggerProxy.logger.log.called, 'log called');
111
121
  });
112
122
  });
@@ -127,14 +137,334 @@ describe('plugin-meetings', () => {
127
137
  });
128
138
  });
129
139
 
140
+ describe('addSequence', () => {
141
+ it('should add the sequence object to a request body', () => {
142
+ const body = {};
143
+
144
+ MeetingUtil.addSequence(
145
+ {
146
+ locusInfo: {
147
+ sequence: 'sequence',
148
+ },
149
+ },
150
+ body
151
+ );
152
+
153
+ assert.deepEqual(body, {
154
+ sequence: 'sequence',
155
+ });
156
+ });
157
+
158
+ it('should work with an undefined meeting', () => {
159
+ const body = {};
160
+
161
+ MeetingUtil.addSequence(undefined, body);
162
+
163
+ assert.deepEqual(body, {});
164
+ });
165
+
166
+ it('should work with an undefined locusInfo', () => {
167
+ const body = {};
168
+
169
+ MeetingUtil.addSequence({}, body);
170
+
171
+ assert.deepEqual(body, {});
172
+ });
173
+
174
+ it('should work with an undefined sequence', () => {
175
+ const body = {};
176
+
177
+ MeetingUtil.addSequence({locusInfo: {}}, body);
178
+
179
+ assert.deepEqual(body, {});
180
+ });
181
+ });
182
+
183
+ describe('updateLocusWithDelta', () => {
184
+ it('should call handleLocusDelta with the new delta locus', () => {
185
+ const meeting = {
186
+ locusInfo: {
187
+ handleLocusDelta: sinon.stub(),
188
+ },
189
+ };
190
+
191
+ const originalResponse = {
192
+ body: {
193
+ locus: 'locus',
194
+ },
195
+ };
196
+
197
+ const response = MeetingUtil.updateLocusWithDelta(meeting, originalResponse);
198
+
199
+ assert.deepEqual(response, originalResponse);
200
+ assert.calledOnceWithExactly(meeting.locusInfo.handleLocusDelta, 'locus', meeting);
201
+ });
202
+
203
+ it('should handle locus being missing from the response', () => {
204
+ const meeting = {
205
+ locusInfo: {
206
+ handleLocusDelta: sinon.stub(),
207
+ },
208
+ };
209
+
210
+ const originalResponse = {
211
+ body: {},
212
+ };
213
+
214
+ const response = MeetingUtil.updateLocusWithDelta(meeting, originalResponse);
215
+
216
+ assert.deepEqual(response, originalResponse);
217
+ assert.notCalled(meeting.locusInfo.handleLocusDelta);
218
+ });
219
+
220
+ it('should work with an undefined meeting', () => {
221
+ const originalResponse = {
222
+ body: {
223
+ locus: 'locus',
224
+ },
225
+ };
226
+
227
+ const response = MeetingUtil.updateLocusWithDelta(undefined, originalResponse);
228
+ assert.deepEqual(response, originalResponse);
229
+ });
230
+ });
231
+
232
+ describe('generateLocusDeltaRequest', () => {
233
+ it('generates the correct wrapper function', async () => {
234
+ const updateLocusWithDeltaSpy = sinon.spy(MeetingUtil, 'updateLocusWithDelta');
235
+ const addSequenceSpy = sinon.spy(MeetingUtil, 'addSequence');
236
+
237
+ const meeting = {
238
+ request: sinon.stub().returns(Promise.resolve('result')),
239
+ };
240
+
241
+ const locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);
242
+
243
+ const options = {
244
+ some: 'option',
245
+ body: {},
246
+ };
247
+
248
+ let result = await locusDeltaRequest(options);
249
+
250
+ assert.equal(result, 'result');
251
+ assert.calledOnceWithExactly(updateLocusWithDeltaSpy, meeting, 'result');
252
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
253
+
254
+ updateLocusWithDeltaSpy.resetHistory();
255
+ addSequenceSpy.resetHistory();
256
+
257
+ // body missing from options
258
+ result = await locusDeltaRequest({});
259
+ assert.equal(result, 'result');
260
+ assert.calledOnceWithExactly(updateLocusWithDeltaSpy, meeting, 'result');
261
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
262
+
263
+ // meeting disappears so the WeakRef returns undefined
264
+ sinon.stub(WeakRef.prototype, 'deref').returns(undefined);
265
+
266
+ result = await locusDeltaRequest(options);
267
+ assert.equal(result, undefined);
268
+
269
+ WeakRef.prototype.deref.restore();
270
+ });
271
+
272
+ it('calls generateBuildLocusDeltaRequestOptions as expected', () => {
273
+ const generateBuildLocusDeltaRequestOptionsSpy = sinon.spy(
274
+ MeetingUtil,
275
+ 'generateBuildLocusDeltaRequestOptions'
276
+ );
277
+
278
+ const meeting = {};
279
+
280
+ MeetingUtil.generateLocusDeltaRequest(meeting);
281
+
282
+ assert.calledOnceWithExactly(generateBuildLocusDeltaRequestOptionsSpy, meeting);
283
+ });
284
+ });
285
+
286
+ describe('selfSupportsFeature', () => {
287
+ it('returns true if there are no user policies', () => {
288
+ assert.equal(
289
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, undefined),
290
+ true
291
+ );
292
+ });
293
+
294
+ it('returns true if policy is true', () => {
295
+ assert.equal(
296
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, {
297
+ [SELF_POLICY.SUPPORT_ANNOTATION]: true,
298
+ }),
299
+ true
300
+ );
301
+ });
302
+
303
+ it('returns false if policy is false', () => {
304
+ assert.equal(
305
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, {
306
+ [SELF_POLICY.SUPPORT_ANNOTATION]: false,
307
+ }),
308
+ false
309
+ );
310
+ });
311
+ });
312
+
313
+ describe('remoteUpdateAudioVideo', () => {
314
+ it('#Should call meetingRequest.locusMediaRequest with correct parameters', async () => {
315
+ const meeting = {
316
+ id: 'meeting-id',
317
+ mediaId: '12345',
318
+ selfUrl: 'self url',
319
+ locusInfo: {
320
+ sequence: {},
321
+ },
322
+ locusMediaRequest: {
323
+ send: sinon.stub().resolves({body: {}, headers: {}}),
324
+ },
325
+ getWebexObject: sinon.stub().returns(webex),
326
+ };
327
+
328
+ await MeetingUtil.remoteUpdateAudioVideo(meeting, true, false);
329
+
330
+ assert.calledOnceWithExactly(meeting.locusMediaRequest.send, {
331
+ mediaId: '12345',
332
+ muteOptions: {
333
+ audioMuted: true,
334
+ videoMuted: false,
335
+ },
336
+ selfUrl: 'self url',
337
+ sequence: {},
338
+ type: 'LocalMute',
339
+ });
340
+
341
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
342
+ name: 'client.locus.media.request',
343
+ options: {meetingId: meeting.id},
344
+ });
345
+
346
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
347
+ name: 'client.locus.media.response',
348
+ options: {meetingId: meeting.id},
349
+ });
350
+ });
351
+ });
352
+
130
353
  describe('joinMeeting', () => {
131
354
  it('#Should call `meetingRequest.joinMeeting', async () => {
132
355
  const meeting = {
356
+ meetingJoinUrl: 'meetingJoinUrl',
357
+ locusUrl: 'locusUrl',
358
+ meetingRequest: {
359
+ joinMeeting: sinon.stub().returns(
360
+ Promise.resolve({
361
+ body: {mediaConnections: 'mediaConnections'},
362
+ headers: {
363
+ trackingid: 'trackingId',
364
+ },
365
+ })
366
+ ),
367
+ },
368
+ getWebexObject: sinon.stub().returns(webex),
369
+ };
370
+
371
+ MeetingUtil.parseLocusJoin = sinon.stub();
372
+ await MeetingUtil.joinMeeting(meeting, {});
373
+
374
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
375
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
376
+
377
+ assert.equal(parameter.inviteeAddress, 'meetingJoinUrl');
378
+ assert.equal(parameter.preferTranscoding, true);
379
+
380
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
381
+ name: 'client.locus.join.request',
382
+ options: {meetingId: meeting.id},
383
+ });
384
+
385
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
386
+ name: 'client.locus.join.response',
387
+ payload: {
388
+ trigger: 'loci-update',
389
+ identifiers: {
390
+ trackingId: 'trackingId',
391
+ },
392
+ },
393
+ options: {
394
+ meetingId: meeting.id,
395
+ mediaConnections: 'mediaConnections',
396
+ },
397
+ });
398
+ });
399
+
400
+ it('#Should call meetingRequest.joinMeeting with breakoutsSupported=true when passed in as true', async () => {
401
+ const meeting = {
402
+ meetingRequest: {
403
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
404
+ },
405
+ getWebexObject: sinon.stub().returns(webex),
406
+ };
407
+
408
+ MeetingUtil.parseLocusJoin = sinon.stub();
409
+ await MeetingUtil.joinMeeting(meeting, {
410
+ breakoutsSupported: true,
411
+ });
412
+
413
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
414
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
415
+
416
+ assert.equal(parameter.breakoutsSupported, true);
417
+ });
418
+
419
+ it('#Should call meetingRequest.joinMeeting with liveAnnotationSupported=true when passed in as true', async () => {
420
+ const meeting = {
421
+ meetingRequest: {
422
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
423
+ },
424
+ getWebexObject: sinon.stub().returns(webex),
425
+ };
426
+
427
+ MeetingUtil.parseLocusJoin = sinon.stub();
428
+ await MeetingUtil.joinMeeting(meeting, {
429
+ liveAnnotationSupported: true,
430
+ });
431
+
432
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
433
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
434
+
435
+ assert.equal(parameter.liveAnnotationSupported, true);
436
+ });
437
+
438
+ it('#Should call meetingRequest.joinMeeting with locale=en_UK, deviceCapabilities=["TEST"] when they are passed in as those values', async () => {
439
+ const meeting = {
440
+ meetingRequest: {
441
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
442
+ },
443
+ getWebexObject: sinon.stub().returns(webex),
444
+ };
445
+
446
+ MeetingUtil.parseLocusJoin = sinon.stub();
447
+ await MeetingUtil.joinMeeting(meeting, {
448
+ locale: 'en_UK',
449
+ deviceCapabilities: ['TEST'],
450
+ });
451
+
452
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
453
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
454
+
455
+ assert.equal(parameter.locale, 'en_UK');
456
+ assert.deepEqual(parameter.deviceCapabilities, ['TEST']);
457
+ });
458
+
459
+ it('#Should call meetingRequest.joinMeeting with preferTranscoding=false when multistream is enabled', async () => {
460
+ const meeting = {
461
+ isMultistream: true,
133
462
  meetingJoinUrl: 'meetingJoinUrl',
134
463
  locusUrl: 'locusUrl',
135
464
  meetingRequest: {
136
465
  joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
137
466
  },
467
+ getWebexObject: sinon.stub().returns(webex),
138
468
  };
139
469
 
140
470
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -144,6 +474,7 @@ describe('plugin-meetings', () => {
144
474
  const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
145
475
 
146
476
  assert.equal(parameter.inviteeAddress, 'meetingJoinUrl');
477
+ assert.equal(parameter.preferTranscoding, false);
147
478
  });
148
479
 
149
480
  it('#Should fallback sipUrl if meetingJoinUrl does not exists', async () => {
@@ -153,6 +484,7 @@ describe('plugin-meetings', () => {
153
484
  meetingRequest: {
154
485
  joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
155
486
  },
487
+ getWebexObject: sinon.stub().returns(webex),
156
488
  };
157
489
 
158
490
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -171,6 +503,7 @@ describe('plugin-meetings', () => {
171
503
  meetingRequest: {
172
504
  joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
173
505
  },
506
+ getWebexObject: sinon.stub().returns(webex),
174
507
  };
175
508
 
176
509
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -182,6 +515,63 @@ describe('plugin-meetings', () => {
182
515
  assert.isUndefined(parameter.inviteeAddress);
183
516
  assert.equal(parameter.meetingNumber, 'meetingNumber');
184
517
  });
518
+
519
+ it('should pass in the locusClusterUrl from meetingInfo', async () => {
520
+ const meeting = {
521
+ meetingInfo: {
522
+ locusClusterUrl: 'locusClusterUrl',
523
+ },
524
+ meetingRequest: {
525
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
526
+ },
527
+ getWebexObject: sinon.stub().returns(webex),
528
+ };
529
+
530
+ MeetingUtil.parseLocusJoin = sinon.stub();
531
+ await MeetingUtil.joinMeeting(meeting, {});
532
+
533
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
534
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
535
+
536
+ assert.equal(parameter.locusClusterUrl, 'locusClusterUrl');
537
+ });
538
+ });
539
+
540
+ describe('joinMeetingOptions', () => {
541
+ it('sends client events correctly', async () => {
542
+ MeetingUtil.joinMeeting = sinon.stub().rejects({});
543
+ MeetingUtil.isPinOrGuest = sinon.stub().returns(true);
544
+ const meeting = {
545
+ id: 'meeting-id',
546
+ mediaId: '12345',
547
+ selfUrl: 'self url',
548
+ locusInfo: {
549
+ sequence: {},
550
+ },
551
+ locusMediaRequest: {
552
+ send: sinon.stub().resolves({body: {}, headers: {}}),
553
+ },
554
+ getWebexObject: sinon.stub().returns(webex),
555
+ };
556
+
557
+ try {
558
+ await MeetingUtil.joinMeetingOptions(meeting, {pin: true});
559
+
560
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
561
+ name: 'client.pin.collected',
562
+ options: {
563
+ meetingId: meeting.id,
564
+ },
565
+ });
566
+ } catch (err) {
567
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
568
+ name: 'client.pin.prompt',
569
+ options: {
570
+ meetingId: meeting.id,
571
+ },
572
+ });
573
+ }
574
+ });
185
575
  });
186
576
 
187
577
  describe('getUserDisplayHintsFromLocusInfo', () => {
@@ -255,6 +645,30 @@ describe('plugin-meetings', () => {
255
645
  });
256
646
  });
257
647
 
648
+ describe('canUserRenameSelfAndObserved', () => {
649
+ it('works as expected', () => {
650
+ assert.deepEqual(
651
+ MeetingUtil.canUserRenameSelfAndObserved(['CAN_RENAME_SELF_AND_OBSERVED']),
652
+ true
653
+ );
654
+ assert.deepEqual(MeetingUtil.canUserRenameSelfAndObserved([]), false);
655
+ });
656
+ });
657
+
658
+ describe('canUserRenameOthers', () => {
659
+ it('works as expected', () => {
660
+ assert.deepEqual(MeetingUtil.canUserRenameOthers(['CAN_RENAME_OTHERS']), true);
661
+ assert.deepEqual(MeetingUtil.canUserRenameOthers([]), false);
662
+ });
663
+ });
664
+
665
+ describe('canShareWhiteBoard', () => {
666
+ it('works as expected', () => {
667
+ assert.deepEqual(MeetingUtil.canShareWhiteBoard(['SHARE_WHITEBOARD']), true);
668
+ assert.deepEqual(MeetingUtil.canShareWhiteBoard([]), false);
669
+ });
670
+ });
671
+
258
672
  describe('bothLeaveAndEndMeetingAvailable', () => {
259
673
  it('works as expected', () => {
260
674
  assert.deepEqual(
@@ -298,6 +712,7 @@ describe('plugin-meetings', () => {
298
712
  });
299
713
 
300
714
  [
715
+ {functionName: 'isSaveTranscriptsEnabled', displayHint: 'SAVE_TRANSCRIPTS_ENABLED'},
301
716
  {functionName: 'canEnableClosedCaption', displayHint: 'CAPTION_START'},
302
717
  {functionName: 'canStartTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_START'},
303
718
  {functionName: 'canStopTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_STOP'},
@@ -315,5 +730,307 @@ describe('plugin-meetings', () => {
315
730
  });
316
731
  });
317
732
  });
733
+
734
+ describe('canManageBreakout', () => {
735
+ it('works as expected', () => {
736
+ assert.deepEqual(MeetingUtil.canManageBreakout(['BREAKOUT_MANAGEMENT']), true);
737
+ assert.deepEqual(MeetingUtil.canManageBreakout([]), false);
738
+ });
739
+ });
740
+
741
+ describe('canBroadcastMessageToBreakout', () => {
742
+ it('works as expected', () => {
743
+ assert.deepEqual(
744
+ MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT'], {
745
+ [SELF_POLICY.SUPPORT_BROADCAST_MESSAGE]: true,
746
+ }),
747
+ true
748
+ );
749
+ assert.deepEqual(
750
+ MeetingUtil.canBroadcastMessageToBreakout([], {
751
+ [SELF_POLICY.SUPPORT_BROADCAST_MESSAGE]: true,
752
+ }),
753
+ false
754
+ );
755
+ assert.deepEqual(
756
+ MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT'], {
757
+ [SELF_POLICY.SUPPORT_BROADCAST_MESSAGE]: false,
758
+ }),
759
+ false
760
+ );
761
+ assert.deepEqual(
762
+ MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT'], undefined),
763
+ false
764
+ );
765
+ });
766
+ });
767
+
768
+ describe('isSuppressBreakoutSupport', () => {
769
+ it('works as expected', () => {
770
+ assert.deepEqual(
771
+ MeetingUtil.isSuppressBreakoutSupport(['UCF_SUPPRESS_BREAKOUTS_SUPPORT']),
772
+ true
773
+ );
774
+ assert.deepEqual(MeetingUtil.isSuppressBreakoutSupport([]), false);
775
+ });
776
+ });
777
+
778
+ describe('canAdmitLobbyToBreakout', () => {
779
+ it('works as expected', () => {
780
+ assert.deepEqual(MeetingUtil.canAdmitLobbyToBreakout(['DISABLE_LOBBY_TO_BREAKOUT']), false);
781
+ assert.deepEqual(MeetingUtil.canAdmitLobbyToBreakout([]), true);
782
+ });
783
+ });
784
+
785
+ describe('canUserAskForHelp', () => {
786
+ it('works as expected', () => {
787
+ assert.deepEqual(MeetingUtil.canUserAskForHelp(['DISABLE_ASK_FOR_HELP']), false);
788
+ assert.deepEqual(MeetingUtil.canUserAskForHelp([]), true);
789
+ });
790
+ });
791
+
792
+ describe('isBreakoutPreassignmentsEnabled', () => {
793
+ it('works as expected', () => {
794
+ assert.deepEqual(
795
+ MeetingUtil.isBreakoutPreassignmentsEnabled(['DISABLE_BREAKOUT_PREASSIGNMENTS']),
796
+ false
797
+ );
798
+ assert.deepEqual(MeetingUtil.isBreakoutPreassignmentsEnabled([]), true);
799
+ });
800
+ });
801
+
802
+ describe('parseInterpretationInfo', () => {
803
+ let meetingInfo = {};
804
+ beforeEach(() => {
805
+ meeting.simultaneousInterpretation = {
806
+ updateMeetingSIEnabled: sinon.stub(),
807
+ updateHostSIEnabled: sinon.stub(),
808
+ updateInterpretation: sinon.stub(),
809
+ siLanguages: [],
810
+ };
811
+ });
812
+ it('should update simultaneous interpretation settings with SI and host enabled', () => {
813
+ meetingInfo.turnOnSimultaneousInterpretation = true;
814
+ meetingInfo.meetingSiteSetting = {
815
+ enableHostInterpreterControlSI: true,
816
+ };
817
+ meetingInfo.simultaneousInterpretation = {
818
+ currentSIInterpreter: true,
819
+ siLanguages: [
820
+ {languageCode: 'en', languageGroupId: 1},
821
+ {languageCode: 'es', languageGroupId: 2},
822
+ ],
823
+ };
824
+
825
+ MeetingUtil.parseInterpretationInfo(meeting, meetingInfo);
826
+ assert.calledWith(meeting.simultaneousInterpretation.updateMeetingSIEnabled, true, true);
827
+ assert.calledWith(meeting.simultaneousInterpretation.updateHostSIEnabled, true);
828
+ assert.calledWith(meeting.simultaneousInterpretation.updateInterpretation, {
829
+ siLanguages: [
830
+ {languageName: 'en', languageCode: 1},
831
+ {languageName: 'es', languageCode: 2},
832
+ ],
833
+ });
834
+ });
835
+
836
+ it('should update simultaneous interpretation settings with host SI disabled', () => {
837
+ meetingInfo.meetingSiteSetting.enableHostInterpreterControlSI = false;
838
+ meetingInfo.simultaneousInterpretation.currentSIInterpreter = false;
839
+ MeetingUtil.parseInterpretationInfo(meeting, meetingInfo);
840
+ assert.calledWith(meeting.simultaneousInterpretation.updateMeetingSIEnabled, true, false);
841
+ assert.calledWith(meeting.simultaneousInterpretation.updateHostSIEnabled, false);
842
+ assert.calledWith(meeting.simultaneousInterpretation.updateInterpretation, {
843
+ siLanguages: [
844
+ {languageName: 'en', languageCode: 1},
845
+ {languageName: 'es', languageCode: 2},
846
+ ],
847
+ });
848
+ });
849
+ it('should update simultaneous interpretation settings with SI disabled', () => {
850
+ meetingInfo.turnOnSimultaneousInterpretation = false;
851
+ MeetingUtil.parseInterpretationInfo(meeting, meetingInfo);
852
+ assert.calledWith(meeting.simultaneousInterpretation.updateMeetingSIEnabled, false, false);
853
+ assert.calledWith(meeting.simultaneousInterpretation.updateHostSIEnabled, false);
854
+ });
855
+
856
+ it('should not update simultaneous interpretation settings for invalid input', () => {
857
+ // Call the function with invalid inputs
858
+ MeetingUtil.parseInterpretationInfo(null, null);
859
+
860
+ // Ensure that the update functions are not called
861
+ assert.notCalled(meeting.simultaneousInterpretation.updateMeetingSIEnabled);
862
+ assert.notCalled(meeting.simultaneousInterpretation.updateHostSIEnabled);
863
+ assert.notCalled(meeting.simultaneousInterpretation.updateInterpretation);
864
+ });
865
+ });
866
+
867
+ describe('prepareLeaveMeetingOptions', () => {
868
+ it('works as expected', () => {
869
+ const meeting = {
870
+ locusUrl: 'locusUrl',
871
+ selfId: 'selfId',
872
+ correlationId: 'correlationId',
873
+ resourceId: 'resourceId',
874
+ deviceUrl: 'deviceUrl',
875
+ };
876
+
877
+ const leaveOptions = MeetingUtil.prepareLeaveMeetingOptions(meeting, {
878
+ selfId: 'bob',
879
+ foo: 'bar',
880
+ });
881
+
882
+ assert.deepEqual(leaveOptions, {
883
+ correlationId: 'correlationId',
884
+ deviceUrl: 'deviceUrl',
885
+ foo: 'bar',
886
+ locusUrl: 'locusUrl',
887
+ resourceId: 'resourceId',
888
+ selfId: 'bob',
889
+ });
890
+ });
891
+ });
892
+
893
+ describe('leaveMeeting', () => {
894
+ it('calls prepareLeaveMeetingOptions as expected', () => {
895
+ const meeting = {
896
+ locusUrl: 'locusUrl',
897
+ selfId: 'selfId',
898
+ correlationId: 'correlationId',
899
+ resourceId: 'resourceId',
900
+ deviceUrl: 'deviceUrl',
901
+ locusInfo: {parsedLocus: {}},
902
+ meetingRequest: {
903
+ leaveMeeting: () => Promise.resolve(),
904
+ },
905
+ };
906
+
907
+ const prepareLeaveMeetingOptionsSpy = sinon.spy(MeetingUtil, 'prepareLeaveMeetingOptions');
908
+
909
+ MeetingUtil.leaveMeeting(meeting, {foo: 'bar'});
910
+
911
+ assert.calledOnce(prepareLeaveMeetingOptionsSpy);
912
+ assert.deepEqual(prepareLeaveMeetingOptionsSpy.getCall(0).args[0], meeting);
913
+ assert.deepEqual(prepareLeaveMeetingOptionsSpy.getCall(0).args[1], {foo: 'bar'});
914
+ });
915
+ });
916
+
917
+ describe('buildLeaveFetchRequestOptions', () => {
918
+ it('calls expected functions', () => {
919
+ const buildLeaveMeetingRequestOptionsSpy = sinon.stub();
920
+
921
+ const meeting = {
922
+ locusUrl: 'locusUrl',
923
+ selfId: 'selfId',
924
+ correlationId: 'correlationId',
925
+ resourceId: 'resourceId',
926
+ deviceUrl: 'deviceUrl',
927
+ meetingRequest: {
928
+ leaveMeeting: () => Promise.resolve(),
929
+ buildLeaveMeetingRequestOptions: buildLeaveMeetingRequestOptionsSpy,
930
+ },
931
+ };
932
+
933
+ const prepareLeaveMeetingOptionsSpy = sinon.spy(MeetingUtil, 'prepareLeaveMeetingOptions');
934
+
935
+ const options = MeetingUtil.buildLeaveFetchRequestOptions(meeting, {foo: 'bar'});
936
+
937
+ assert.calledOnce(prepareLeaveMeetingOptionsSpy);
938
+ assert.deepEqual(prepareLeaveMeetingOptionsSpy.getCall(0).args[0], meeting);
939
+ assert.deepEqual(prepareLeaveMeetingOptionsSpy.getCall(0).args[1], {foo: 'bar'});
940
+
941
+ assert.calledOnce(buildLeaveMeetingRequestOptionsSpy);
942
+ assert.deepEqual(buildLeaveMeetingRequestOptionsSpy.getCall(0).args[0], {
943
+ correlationId: 'correlationId',
944
+ deviceUrl: 'deviceUrl',
945
+ foo: 'bar',
946
+ locusUrl: 'locusUrl',
947
+ resourceId: 'resourceId',
948
+ selfId: 'selfId',
949
+ });
950
+ });
951
+ });
952
+
953
+ describe('generateBuildLocusDeltaRequestOptions', () => {
954
+ it('generates the correct wrapper function', async () => {
955
+ const addSequenceSpy = sinon.spy(MeetingUtil, 'addSequence');
956
+
957
+ const meeting = {locusInfo: {sequence: 123}};
958
+
959
+ const buildLocusDeltaRequestOptions =
960
+ MeetingUtil.generateBuildLocusDeltaRequestOptions(meeting);
961
+
962
+ let result = buildLocusDeltaRequestOptions({
963
+ some: 'option',
964
+ body: {},
965
+ });
966
+ assert.deepEqual(result, {some: 'option', body: {sequence: 123}});
967
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, {sequence: 123});
968
+
969
+ addSequenceSpy.resetHistory();
970
+
971
+ // body missing from options
972
+ result = buildLocusDeltaRequestOptions({});
973
+ assert.deepEqual(result, {body: {sequence: 123}});
974
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, {sequence: 123});
975
+
976
+ // meeting disappears so the WeakRef returns undefined
977
+ sinon.stub(WeakRef.prototype, 'deref').returns(undefined);
978
+
979
+ const input = {foo: 'bar'};
980
+ result = buildLocusDeltaRequestOptions(input);
981
+ assert.equal(result, input);
982
+ });
983
+ });
984
+
985
+ describe('getIpVersion', () => {
986
+ let isBrowserStub;
987
+ beforeEach(() => {
988
+ isBrowserStub = sinon.stub().returns(false);
989
+
990
+ sinon.stub(BrowserDetectionModule, 'default').returns({
991
+ isBrowser: isBrowserStub,
992
+ });
993
+ });
994
+
995
+ afterEach(() => {
996
+ sinon.restore();
997
+ });
998
+
999
+ [
1000
+ {supportsIpV4: undefined, supportsIpV6: undefined, expectedOutput: IP_VERSION.unknown},
1001
+ {supportsIpV4: undefined, supportsIpV6: true, expectedOutput: IP_VERSION.only_ipv6},
1002
+ {supportsIpV4: undefined, supportsIpV6: false, expectedOutput: IP_VERSION.unknown},
1003
+ {supportsIpV4: true, supportsIpV6: undefined, expectedOutput: IP_VERSION.only_ipv4},
1004
+ {supportsIpV4: true, supportsIpV6: true, expectedOutput: IP_VERSION.ipv4_and_ipv6},
1005
+ {supportsIpV4: true, supportsIpV6: false, expectedOutput: IP_VERSION.only_ipv4},
1006
+ {supportsIpV4: false, supportsIpV6: undefined, expectedOutput: IP_VERSION.unknown},
1007
+ {supportsIpV4: false, supportsIpV6: true, expectedOutput: IP_VERSION.only_ipv6},
1008
+ {supportsIpV4: false, supportsIpV6: false, expectedOutput: IP_VERSION.unknown},
1009
+ ].forEach(({supportsIpV4, supportsIpV6, expectedOutput}) => {
1010
+ it(`returns ${expectedOutput} when supportsIpV4=${supportsIpV4} and supportsIpV6=${supportsIpV6}`, () => {
1011
+ sinon
1012
+ .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV4')
1013
+ .get(() => supportsIpV4);
1014
+ sinon
1015
+ .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV6')
1016
+ .get(() => supportsIpV6);
1017
+
1018
+ assert.equal(MeetingUtil.getIpVersion(webex), expectedOutput);
1019
+ });
1020
+
1021
+ it(`returns undefined when supportsIpV4=${supportsIpV4} and supportsIpV6=${supportsIpV6} and browser is firefox`, () => {
1022
+ sinon
1023
+ .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV4')
1024
+ .get(() => supportsIpV4);
1025
+ sinon
1026
+ .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV6')
1027
+ .get(() => supportsIpV6);
1028
+
1029
+ isBrowserStub.callsFake((name) => name === 'firefox');
1030
+
1031
+ assert.equal(MeetingUtil.getIpVersion(webex), undefined);
1032
+ });
1033
+ });
1034
+ });
318
1035
  });
319
1036
  });