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

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 (528) 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 +41 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +357 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +215 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +22 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +51 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +44 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1047 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +77 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +64 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/browser-detection.js +2 -3
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +3 -4
  25. package/dist/common/collection.js.map +1 -1
  26. package/dist/common/config.js +1 -2
  27. package/dist/common/config.js.map +1 -1
  28. package/dist/common/errors/captcha-error.js +1 -2
  29. package/dist/common/errors/captcha-error.js.map +1 -1
  30. package/dist/common/errors/intent-to-join.js +1 -2
  31. package/dist/common/errors/intent-to-join.js.map +1 -1
  32. package/dist/common/errors/join-meeting.js +1 -2
  33. package/dist/common/errors/join-meeting.js.map +1 -1
  34. package/dist/common/errors/media.js +1 -2
  35. package/dist/common/errors/media.js.map +1 -1
  36. package/dist/common/errors/no-meeting-info.js +50 -0
  37. package/dist/common/errors/no-meeting-info.js.map +1 -0
  38. package/dist/common/errors/parameter.js +3 -4
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +1 -2
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +1 -2
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  45. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  46. package/dist/common/errors/reconnection-in-progress.js +1 -2
  47. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  48. package/dist/common/errors/reconnection.js +1 -2
  49. package/dist/common/errors/reconnection.js.map +1 -1
  50. package/dist/common/errors/stats.js +1 -2
  51. package/dist/common/errors/stats.js.map +1 -1
  52. package/dist/common/errors/webex-errors.js +48 -28
  53. package/dist/common/errors/webex-errors.js.map +1 -1
  54. package/dist/common/errors/webex-meetings-error.js +1 -2
  55. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  56. package/dist/common/events/events-scope.js +1 -2
  57. package/dist/common/events/events-scope.js.map +1 -1
  58. package/dist/common/events/events.js +1 -2
  59. package/dist/common/events/events.js.map +1 -1
  60. package/dist/common/events/trigger-proxy.js +1 -2
  61. package/dist/common/events/trigger-proxy.js.map +1 -1
  62. package/dist/common/events/util.js +1 -2
  63. package/dist/common/events/util.js.map +1 -1
  64. package/dist/common/logs/logger-config.js +1 -2
  65. package/dist/common/logs/logger-config.js.map +1 -1
  66. package/dist/common/logs/logger-proxy.js +2 -3
  67. package/dist/common/logs/logger-proxy.js.map +1 -1
  68. package/dist/common/logs/request.js +8 -5
  69. package/dist/common/logs/request.js.map +1 -1
  70. package/dist/common/queue.js +22 -9
  71. package/dist/common/queue.js.map +1 -1
  72. package/dist/config.js +8 -11
  73. package/dist/config.js.map +1 -1
  74. package/dist/constants.js +437 -435
  75. package/dist/constants.js.map +1 -1
  76. package/dist/controls-options-manager/constants.js +3 -6
  77. package/dist/controls-options-manager/constants.js.map +1 -1
  78. package/dist/controls-options-manager/enums.js +14 -6
  79. package/dist/controls-options-manager/enums.js.map +1 -1
  80. package/dist/controls-options-manager/index.js +127 -38
  81. package/dist/controls-options-manager/index.js.map +1 -1
  82. package/dist/controls-options-manager/types.js +7 -0
  83. package/dist/controls-options-manager/types.js.map +1 -0
  84. package/dist/controls-options-manager/util.js +309 -19
  85. package/dist/controls-options-manager/util.js.map +1 -1
  86. package/dist/index.js +116 -4
  87. package/dist/index.js.map +1 -1
  88. package/dist/interpretation/collection.js +22 -0
  89. package/dist/interpretation/collection.js.map +1 -0
  90. package/dist/interpretation/index.js +365 -0
  91. package/dist/interpretation/index.js.map +1 -0
  92. package/dist/interpretation/siLanguage.js +24 -0
  93. package/dist/interpretation/siLanguage.js.map +1 -0
  94. package/dist/locus-info/controlsUtils.js +100 -11
  95. package/dist/locus-info/controlsUtils.js.map +1 -1
  96. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  97. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  98. package/dist/locus-info/fullState.js +1 -2
  99. package/dist/locus-info/fullState.js.map +1 -1
  100. package/dist/locus-info/hostUtils.js +1 -2
  101. package/dist/locus-info/hostUtils.js.map +1 -1
  102. package/dist/locus-info/index.js +425 -84
  103. package/dist/locus-info/index.js.map +1 -1
  104. package/dist/locus-info/infoUtils.js +13 -5
  105. package/dist/locus-info/infoUtils.js.map +1 -1
  106. package/dist/locus-info/mediaSharesUtils.js +58 -3
  107. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  108. package/dist/locus-info/parser.js +253 -80
  109. package/dist/locus-info/parser.js.map +1 -1
  110. package/dist/locus-info/selfUtils.js +97 -13
  111. package/dist/locus-info/selfUtils.js.map +1 -1
  112. package/dist/media/index.js +106 -319
  113. package/dist/media/index.js.map +1 -1
  114. package/dist/media/properties.js +96 -153
  115. package/dist/media/properties.js.map +1 -1
  116. package/dist/media/util.js +1 -22
  117. package/dist/media/util.js.map +1 -1
  118. package/dist/mediaQualityMetrics/config.js +498 -493
  119. package/dist/mediaQualityMetrics/config.js.map +1 -1
  120. package/dist/meeting/in-meeting-actions.js +90 -3
  121. package/dist/meeting/in-meeting-actions.js.map +1 -1
  122. package/dist/meeting/index.js +4578 -2973
  123. package/dist/meeting/index.js.map +1 -1
  124. package/dist/meeting/locusMediaRequest.js +291 -0
  125. package/dist/meeting/locusMediaRequest.js.map +1 -0
  126. package/dist/meeting/muteState.js +224 -133
  127. package/dist/meeting/muteState.js.map +1 -1
  128. package/dist/meeting/request.js +297 -199
  129. package/dist/meeting/request.js.map +1 -1
  130. package/dist/meeting/request.type.js +7 -0
  131. package/dist/meeting/request.type.js.map +1 -0
  132. package/dist/meeting/state.js +1 -2
  133. package/dist/meeting/state.js.map +1 -1
  134. package/dist/meeting/util.js +605 -435
  135. package/dist/meeting/util.js.map +1 -1
  136. package/dist/meeting-info/collection.js +3 -4
  137. package/dist/meeting-info/collection.js.map +1 -1
  138. package/dist/meeting-info/index.js +74 -7
  139. package/dist/meeting-info/index.js.map +1 -1
  140. package/dist/meeting-info/meeting-info-v2.js +197 -63
  141. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  142. package/dist/meeting-info/request.js +1 -2
  143. package/dist/meeting-info/request.js.map +1 -1
  144. package/dist/meeting-info/util.js +2 -3
  145. package/dist/meeting-info/util.js.map +1 -1
  146. package/dist/meeting-info/utilv2.js +25 -12
  147. package/dist/meeting-info/utilv2.js.map +1 -1
  148. package/dist/meetings/collection.js +25 -4
  149. package/dist/meetings/collection.js.map +1 -1
  150. package/dist/meetings/index.js +464 -123
  151. package/dist/meetings/index.js.map +1 -1
  152. package/dist/meetings/meetings.types.js +7 -0
  153. package/dist/meetings/meetings.types.js.map +1 -0
  154. package/dist/meetings/request.js +4 -3
  155. package/dist/meetings/request.js.map +1 -1
  156. package/dist/meetings/util.js +107 -6
  157. package/dist/meetings/util.js.map +1 -1
  158. package/dist/member/index.js +54 -2
  159. package/dist/member/index.js.map +1 -1
  160. package/dist/member/member.types.js +3 -4
  161. package/dist/member/member.types.js.map +1 -1
  162. package/dist/member/types.js +23 -0
  163. package/dist/member/types.js.map +1 -0
  164. package/dist/member/util.js +131 -29
  165. package/dist/member/util.js.map +1 -1
  166. package/dist/members/collection.js +11 -2
  167. package/dist/members/collection.js.map +1 -1
  168. package/dist/members/index.js +174 -10
  169. package/dist/members/index.js.map +1 -1
  170. package/dist/members/request.js +108 -41
  171. package/dist/members/request.js.map +1 -1
  172. package/dist/members/types.js +14 -0
  173. package/dist/members/types.js.map +1 -0
  174. package/dist/members/util.js +327 -234
  175. package/dist/members/util.js.map +1 -1
  176. package/dist/metrics/constants.js +14 -9
  177. package/dist/metrics/constants.js.map +1 -1
  178. package/dist/metrics/index.js +4 -452
  179. package/dist/metrics/index.js.map +1 -1
  180. package/dist/multistream/mediaRequestManager.js +344 -0
  181. package/dist/multistream/mediaRequestManager.js.map +1 -0
  182. package/dist/multistream/receiveSlot.js +200 -0
  183. package/dist/multistream/receiveSlot.js.map +1 -0
  184. package/dist/multistream/receiveSlotManager.js +174 -0
  185. package/dist/multistream/receiveSlotManager.js.map +1 -0
  186. package/dist/multistream/remoteMedia.js +268 -0
  187. package/dist/multistream/remoteMedia.js.map +1 -0
  188. package/dist/multistream/remoteMediaGroup.js +267 -0
  189. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  190. package/dist/multistream/remoteMediaManager.js +1211 -0
  191. package/dist/multistream/remoteMediaManager.js.map +1 -0
  192. package/dist/multistream/sendSlotManager.js +236 -0
  193. package/dist/multistream/sendSlotManager.js.map +1 -0
  194. package/dist/networkQualityMonitor/index.js +5 -4
  195. package/dist/networkQualityMonitor/index.js.map +1 -1
  196. package/dist/personal-meeting-room/index.js +2 -3
  197. package/dist/personal-meeting-room/index.js.map +1 -1
  198. package/dist/personal-meeting-room/request.js +2 -3
  199. package/dist/personal-meeting-room/request.js.map +1 -1
  200. package/dist/personal-meeting-room/util.js +1 -2
  201. package/dist/personal-meeting-room/util.js.map +1 -1
  202. package/dist/reachability/index.js +265 -72
  203. package/dist/reachability/index.js.map +1 -1
  204. package/dist/reachability/request.js +18 -10
  205. package/dist/reachability/request.js.map +1 -1
  206. package/dist/reactions/constants.js +12 -0
  207. package/dist/reactions/constants.js.map +1 -0
  208. package/dist/reactions/reactions.js +4 -6
  209. package/dist/reactions/reactions.js.map +1 -1
  210. package/dist/reactions/reactions.type.js +21 -23
  211. package/dist/reactions/reactions.type.js.map +1 -1
  212. package/dist/reconnection-manager/index.js +272 -220
  213. package/dist/reconnection-manager/index.js.map +1 -1
  214. package/dist/recording-controller/enums.js +4 -5
  215. package/dist/recording-controller/enums.js.map +1 -1
  216. package/dist/recording-controller/index.js +57 -46
  217. package/dist/recording-controller/index.js.map +1 -1
  218. package/dist/recording-controller/util.js +10 -10
  219. package/dist/recording-controller/util.js.map +1 -1
  220. package/dist/roap/index.js +101 -235
  221. package/dist/roap/index.js.map +1 -1
  222. package/dist/roap/request.js +126 -180
  223. package/dist/roap/request.js.map +1 -1
  224. package/dist/roap/turnDiscovery.js +115 -105
  225. package/dist/roap/turnDiscovery.js.map +1 -1
  226. package/dist/rtcMetrics/constants.js +11 -0
  227. package/dist/rtcMetrics/constants.js.map +1 -0
  228. package/dist/rtcMetrics/index.js +115 -0
  229. package/dist/rtcMetrics/index.js.map +1 -0
  230. package/dist/statsAnalyzer/global.js +2 -85
  231. package/dist/statsAnalyzer/global.js.map +1 -1
  232. package/dist/statsAnalyzer/index.js +384 -426
  233. package/dist/statsAnalyzer/index.js.map +1 -1
  234. package/dist/statsAnalyzer/mqaUtil.js +114 -80
  235. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  236. package/dist/transcription/index.js +1 -2
  237. package/dist/transcription/index.js.map +1 -1
  238. package/dist/webinar/collection.js +43 -0
  239. package/dist/webinar/collection.js.map +1 -0
  240. package/dist/webinar/index.js +68 -0
  241. package/dist/webinar/index.js.map +1 -0
  242. package/package.json +34 -24
  243. package/src/annotation/annotation.types.ts +50 -0
  244. package/src/annotation/constants.ts +36 -0
  245. package/src/annotation/index.ts +328 -0
  246. package/src/breakouts/README.md +220 -0
  247. package/src/breakouts/breakout.ts +188 -0
  248. package/src/breakouts/collection.ts +19 -0
  249. package/src/breakouts/edit-lock-error.ts +25 -0
  250. package/src/breakouts/events.ts +56 -0
  251. package/src/breakouts/index.ts +925 -0
  252. package/src/breakouts/request.ts +55 -0
  253. package/src/breakouts/utils.ts +57 -0
  254. package/src/common/errors/no-meeting-info.ts +24 -0
  255. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  256. package/src/common/errors/webex-errors.ts +36 -12
  257. package/src/common/logs/logger-proxy.ts +1 -1
  258. package/src/common/logs/request.ts +5 -1
  259. package/src/common/queue.ts +22 -8
  260. package/src/config.ts +5 -7
  261. package/src/constants.ts +263 -91
  262. package/src/controls-options-manager/enums.ts +11 -1
  263. package/src/controls-options-manager/index.ts +116 -21
  264. package/src/controls-options-manager/types.ts +59 -0
  265. package/src/controls-options-manager/util.ts +294 -14
  266. package/src/index.ts +40 -0
  267. package/src/interpretation/README.md +60 -0
  268. package/src/interpretation/collection.ts +19 -0
  269. package/src/interpretation/index.ts +332 -0
  270. package/src/interpretation/siLanguage.ts +18 -0
  271. package/src/locus-info/controlsUtils.ts +110 -0
  272. package/src/locus-info/index.ts +449 -61
  273. package/src/locus-info/infoUtils.ts +14 -2
  274. package/src/locus-info/mediaSharesUtils.ts +64 -0
  275. package/src/locus-info/parser.ts +258 -47
  276. package/src/locus-info/selfUtils.ts +85 -2
  277. package/src/media/index.ts +153 -370
  278. package/src/media/properties.ts +106 -136
  279. package/src/media/util.ts +0 -21
  280. package/src/mediaQualityMetrics/config.ts +379 -377
  281. package/src/meeting/in-meeting-actions.ts +168 -0
  282. package/src/meeting/index.ts +3800 -2491
  283. package/src/meeting/locusMediaRequest.ts +313 -0
  284. package/src/meeting/muteState.ts +224 -138
  285. package/src/meeting/request.ts +207 -127
  286. package/src/meeting/request.type.ts +13 -0
  287. package/src/meeting/util.ts +590 -423
  288. package/src/meeting-info/index.ts +81 -8
  289. package/src/meeting-info/meeting-info-v2.ts +159 -13
  290. package/src/meeting-info/util.ts +1 -1
  291. package/src/meeting-info/utilv2.ts +22 -9
  292. package/src/meetings/collection.ts +20 -0
  293. package/src/meetings/index.ts +466 -124
  294. package/src/meetings/meetings.types.ts +12 -0
  295. package/src/meetings/request.ts +2 -0
  296. package/src/meetings/util.ts +116 -5
  297. package/src/member/index.ts +52 -1
  298. package/src/member/types.ts +38 -0
  299. package/src/member/util.ts +139 -28
  300. package/src/members/collection.ts +8 -0
  301. package/src/members/index.ts +196 -7
  302. package/src/members/request.ts +97 -17
  303. package/src/members/types.ts +29 -0
  304. package/src/members/util.ts +333 -240
  305. package/src/metrics/constants.ts +12 -6
  306. package/src/metrics/index.ts +1 -471
  307. package/src/multistream/mediaRequestManager.ts +440 -0
  308. package/src/multistream/receiveSlot.ts +184 -0
  309. package/src/multistream/receiveSlotManager.ts +166 -0
  310. package/src/multistream/remoteMedia.ts +254 -0
  311. package/src/multistream/remoteMediaGroup.ts +284 -0
  312. package/src/multistream/remoteMediaManager.ts +1145 -0
  313. package/src/multistream/sendSlotManager.ts +170 -0
  314. package/src/networkQualityMonitor/index.ts +6 -6
  315. package/src/reachability/index.ts +238 -45
  316. package/src/reachability/request.ts +17 -8
  317. package/src/reactions/constants.ts +4 -0
  318. package/src/reactions/reactions.ts +4 -4
  319. package/src/reactions/reactions.type.ts +30 -4
  320. package/src/reconnection-manager/index.ts +124 -107
  321. package/src/recording-controller/index.ts +20 -3
  322. package/src/recording-controller/util.ts +26 -9
  323. package/src/roap/index.ts +98 -241
  324. package/src/roap/request.ts +74 -148
  325. package/src/roap/turnDiscovery.ts +62 -56
  326. package/src/rtcMetrics/constants.ts +3 -0
  327. package/src/rtcMetrics/index.ts +100 -0
  328. package/src/statsAnalyzer/global.ts +1 -84
  329. package/src/statsAnalyzer/index.ts +442 -523
  330. package/src/statsAnalyzer/mqaUtil.ts +105 -103
  331. package/src/webinar/collection.ts +31 -0
  332. package/src/webinar/index.ts +62 -0
  333. package/test/integration/spec/converged-space-meetings.js +233 -0
  334. package/test/integration/spec/journey.js +320 -264
  335. package/test/integration/spec/space-meeting.js +77 -4
  336. package/test/unit/spec/annotation/index.ts +418 -0
  337. package/test/unit/spec/breakouts/breakout.ts +237 -0
  338. package/test/unit/spec/breakouts/collection.ts +15 -0
  339. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  340. package/test/unit/spec/breakouts/events.ts +89 -0
  341. package/test/unit/spec/breakouts/index.ts +1790 -0
  342. package/test/unit/spec/breakouts/request.ts +104 -0
  343. package/test/unit/spec/breakouts/utils.js +72 -0
  344. package/test/unit/spec/common/queue.js +31 -2
  345. package/test/unit/spec/controls-options-manager/index.js +163 -0
  346. package/test/unit/spec/controls-options-manager/util.js +576 -60
  347. package/test/unit/spec/fixture/locus.js +1 -0
  348. package/test/unit/spec/interpretation/collection.ts +15 -0
  349. package/test/unit/spec/interpretation/index.ts +589 -0
  350. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  351. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  352. package/test/unit/spec/locus-info/index.js +1390 -16
  353. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  354. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  355. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  356. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  357. package/test/unit/spec/locus-info/parser.js +116 -35
  358. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  359. package/test/unit/spec/media/index.ts +274 -0
  360. package/test/unit/spec/media/properties.ts +75 -84
  361. package/test/unit/spec/meeting/in-meeting-actions.ts +82 -0
  362. package/test/unit/spec/meeting/index.js +7395 -3171
  363. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  364. package/test/unit/spec/meeting/muteState.js +407 -212
  365. package/test/unit/spec/meeting/request.js +512 -42
  366. package/test/unit/spec/meeting/utils.js +741 -24
  367. package/test/unit/spec/meeting-info/index.js +300 -0
  368. package/test/unit/spec/meeting-info/meetinginfov2.js +500 -6
  369. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  370. package/test/unit/spec/meetings/collection.js +14 -0
  371. package/test/unit/spec/meetings/index.js +1012 -209
  372. package/test/unit/spec/meetings/utils.js +202 -2
  373. package/test/unit/spec/member/index.js +38 -8
  374. package/test/unit/spec/member/util.js +528 -27
  375. package/test/unit/spec/members/index.js +597 -3
  376. package/test/unit/spec/members/request.js +206 -27
  377. package/test/unit/spec/members/utils.js +210 -0
  378. package/test/unit/spec/metrics/index.js +1 -50
  379. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  380. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  381. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  382. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  383. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  384. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  385. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  386. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  387. package/test/unit/spec/reachability/index.ts +598 -24
  388. package/test/unit/spec/reachability/request.js +68 -0
  389. package/test/unit/spec/reconnection-manager/index.js +130 -22
  390. package/test/unit/spec/recording-controller/index.js +293 -218
  391. package/test/unit/spec/recording-controller/util.js +223 -96
  392. package/test/unit/spec/roap/index.ts +200 -76
  393. package/test/unit/spec/roap/request.ts +232 -0
  394. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  395. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  396. package/test/unit/spec/stats-analyzer/index.js +181 -177
  397. package/test/unit/spec/webinar/collection.ts +13 -0
  398. package/test/unit/spec/webinar/index.ts +60 -0
  399. package/test/utils/constants.js +9 -0
  400. package/test/utils/integrationTestUtils.js +46 -0
  401. package/test/utils/testUtils.js +0 -45
  402. package/test/utils/webex-config.js +4 -0
  403. package/test/utils/webex-test-users.js +7 -3
  404. package/dist/common/browser-detection.d.ts +0 -9
  405. package/dist/common/collection.d.ts +0 -48
  406. package/dist/common/config.d.ts +0 -2
  407. package/dist/common/errors/captcha-error.d.ts +0 -15
  408. package/dist/common/errors/intent-to-join.d.ts +0 -16
  409. package/dist/common/errors/join-meeting.d.ts +0 -17
  410. package/dist/common/errors/media.d.ts +0 -15
  411. package/dist/common/errors/parameter.d.ts +0 -15
  412. package/dist/common/errors/password-error.d.ts +0 -15
  413. package/dist/common/errors/permission.d.ts +0 -14
  414. package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
  415. package/dist/common/errors/reconnection.d.ts +0 -15
  416. package/dist/common/errors/stats.d.ts +0 -15
  417. package/dist/common/errors/webex-errors.d.ts +0 -81
  418. package/dist/common/errors/webex-meetings-error.d.ts +0 -20
  419. package/dist/common/events/events-scope.d.ts +0 -17
  420. package/dist/common/events/events.d.ts +0 -12
  421. package/dist/common/events/trigger-proxy.d.ts +0 -2
  422. package/dist/common/events/util.d.ts +0 -2
  423. package/dist/common/logs/logger-config.d.ts +0 -2
  424. package/dist/common/logs/logger-proxy.d.ts +0 -2
  425. package/dist/common/logs/request.d.ts +0 -34
  426. package/dist/common/queue.d.ts +0 -32
  427. package/dist/config.d.ts +0 -73
  428. package/dist/constants.d.ts +0 -926
  429. package/dist/controls-options-manager/constants.d.ts +0 -4
  430. package/dist/controls-options-manager/enums.d.ts +0 -5
  431. package/dist/controls-options-manager/index.d.ts +0 -120
  432. package/dist/controls-options-manager/util.d.ts +0 -7
  433. package/dist/index.d.ts +0 -4
  434. package/dist/locus-info/controlsUtils.d.ts +0 -2
  435. package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
  436. package/dist/locus-info/fullState.d.ts +0 -2
  437. package/dist/locus-info/hostUtils.d.ts +0 -2
  438. package/dist/locus-info/index.d.ts +0 -269
  439. package/dist/locus-info/infoUtils.d.ts +0 -2
  440. package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
  441. package/dist/locus-info/parser.d.ts +0 -212
  442. package/dist/locus-info/selfUtils.d.ts +0 -2
  443. package/dist/media/index.d.ts +0 -32
  444. package/dist/media/properties.d.ts +0 -108
  445. package/dist/media/util.d.ts +0 -2
  446. package/dist/mediaQualityMetrics/config.d.ts +0 -233
  447. package/dist/meeting/effectsState.d.ts +0 -42
  448. package/dist/meeting/effectsState.js +0 -260
  449. package/dist/meeting/effectsState.js.map +0 -1
  450. package/dist/meeting/in-meeting-actions.d.ts +0 -79
  451. package/dist/meeting/index.d.ts +0 -1622
  452. package/dist/meeting/muteState.d.ts +0 -116
  453. package/dist/meeting/request.d.ts +0 -255
  454. package/dist/meeting/state.d.ts +0 -9
  455. package/dist/meeting/util.d.ts +0 -2
  456. package/dist/meeting-info/collection.d.ts +0 -20
  457. package/dist/meeting-info/index.d.ts +0 -57
  458. package/dist/meeting-info/meeting-info-v2.d.ts +0 -93
  459. package/dist/meeting-info/request.d.ts +0 -22
  460. package/dist/meeting-info/util.d.ts +0 -2
  461. package/dist/meeting-info/utilv2.d.ts +0 -2
  462. package/dist/meetings/collection.d.ts +0 -23
  463. package/dist/meetings/index.d.ts +0 -296
  464. package/dist/meetings/request.d.ts +0 -27
  465. package/dist/meetings/util.d.ts +0 -18
  466. package/dist/member/index.d.ts +0 -147
  467. package/dist/member/member.types.d.ts +0 -11
  468. package/dist/member/util.d.ts +0 -2
  469. package/dist/members/collection.d.ts +0 -24
  470. package/dist/members/index.d.ts +0 -298
  471. package/dist/members/request.d.ts +0 -50
  472. package/dist/members/util.d.ts +0 -2
  473. package/dist/metrics/config.d.ts +0 -169
  474. package/dist/metrics/config.js +0 -289
  475. package/dist/metrics/config.js.map +0 -1
  476. package/dist/metrics/constants.d.ts +0 -59
  477. package/dist/metrics/index.d.ts +0 -152
  478. package/dist/networkQualityMonitor/index.d.ts +0 -70
  479. package/dist/peer-connection-manager/index.d.ts +0 -6
  480. package/dist/peer-connection-manager/index.js +0 -671
  481. package/dist/peer-connection-manager/index.js.map +0 -1
  482. package/dist/peer-connection-manager/util.d.ts +0 -6
  483. package/dist/peer-connection-manager/util.js +0 -110
  484. package/dist/peer-connection-manager/util.js.map +0 -1
  485. package/dist/personal-meeting-room/index.d.ts +0 -47
  486. package/dist/personal-meeting-room/request.d.ts +0 -14
  487. package/dist/personal-meeting-room/util.d.ts +0 -2
  488. package/dist/reachability/index.d.ts +0 -139
  489. package/dist/reachability/request.d.ts +0 -35
  490. package/dist/reactions/reactions.d.ts +0 -4
  491. package/dist/reactions/reactions.type.d.ts +0 -32
  492. package/dist/reconnection-manager/index.d.ts +0 -112
  493. package/dist/recording-controller/enums.d.ts +0 -7
  494. package/dist/recording-controller/index.d.ts +0 -193
  495. package/dist/recording-controller/util.d.ts +0 -13
  496. package/dist/roap/collection.d.ts +0 -10
  497. package/dist/roap/collection.js +0 -63
  498. package/dist/roap/collection.js.map +0 -1
  499. package/dist/roap/handler.d.ts +0 -47
  500. package/dist/roap/handler.js +0 -279
  501. package/dist/roap/handler.js.map +0 -1
  502. package/dist/roap/index.d.ts +0 -116
  503. package/dist/roap/request.d.ts +0 -35
  504. package/dist/roap/state.d.ts +0 -9
  505. package/dist/roap/state.js +0 -127
  506. package/dist/roap/state.js.map +0 -1
  507. package/dist/roap/turnDiscovery.d.ts +0 -81
  508. package/dist/roap/util.d.ts +0 -2
  509. package/dist/roap/util.js +0 -76
  510. package/dist/roap/util.js.map +0 -1
  511. package/dist/statsAnalyzer/global.d.ts +0 -118
  512. package/dist/statsAnalyzer/index.d.ts +0 -193
  513. package/dist/statsAnalyzer/mqaUtil.d.ts +0 -22
  514. package/dist/transcription/index.d.ts +0 -64
  515. package/src/index.js +0 -15
  516. package/src/meeting/effectsState.ts +0 -209
  517. package/src/metrics/config.ts +0 -485
  518. package/src/peer-connection-manager/index.ts +0 -847
  519. package/src/peer-connection-manager/util.ts +0 -119
  520. package/src/roap/collection.ts +0 -62
  521. package/src/roap/handler.ts +0 -294
  522. package/src/roap/state.ts +0 -156
  523. package/src/roap/util.ts +0 -100
  524. package/test/unit/spec/meeting/effectsState.js +0 -281
  525. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  526. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  527. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  528. package/test/unit/spec/roap/util.js +0 -30
@@ -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
  });