@webex/plugin-meetings 3.0.0-beta.2 → 3.0.0-beta.200

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 (576) hide show
  1. package/README.md +45 -7
  2. package/UPGRADING.md +9 -9
  3. package/browsers.js +19 -24
  4. package/dist/annotation/annotation.types.js +7 -0
  5. package/dist/annotation/annotation.types.js.map +1 -0
  6. package/dist/annotation/constants.js +49 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +342 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +216 -0
  11. package/dist/breakouts/breakout.js.map +1 -0
  12. package/dist/breakouts/collection.js +23 -0
  13. package/dist/breakouts/collection.js.map +1 -0
  14. package/dist/breakouts/edit-lock-error.js +52 -0
  15. package/dist/breakouts/edit-lock-error.js.map +1 -0
  16. package/dist/breakouts/events.js +45 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +1048 -0
  19. package/dist/breakouts/index.js.map +1 -0
  20. package/dist/breakouts/request.js +78 -0
  21. package/dist/breakouts/request.js.map +1 -0
  22. package/dist/breakouts/utils.js +67 -0
  23. package/dist/breakouts/utils.js.map +1 -0
  24. package/dist/common/browser-detection.js +1 -20
  25. package/dist/common/browser-detection.js.map +1 -1
  26. package/dist/common/collection.js +5 -20
  27. package/dist/common/collection.js.map +1 -1
  28. package/dist/common/config.js +0 -7
  29. package/dist/common/config.js.map +1 -1
  30. package/dist/common/errors/captcha-error.js +10 -24
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +11 -24
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +12 -25
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +10 -24
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/parameter.js +5 -33
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +10 -24
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +9 -23
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reconnection-in-progress.js +0 -17
  45. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  46. package/dist/common/errors/reconnection.js +10 -24
  47. package/dist/common/errors/reconnection.js.map +1 -1
  48. package/dist/common/errors/stats.js +10 -24
  49. package/dist/common/errors/stats.js.map +1 -1
  50. package/dist/common/errors/webex-errors.js +9 -43
  51. package/dist/common/errors/webex-errors.js.map +1 -1
  52. package/dist/common/errors/webex-meetings-error.js +5 -25
  53. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  54. package/dist/common/events/events-scope.js +0 -22
  55. package/dist/common/events/events-scope.js.map +1 -1
  56. package/dist/common/events/events.js +0 -23
  57. package/dist/common/events/events.js.map +1 -1
  58. package/dist/common/events/trigger-proxy.js +0 -12
  59. package/dist/common/events/trigger-proxy.js.map +1 -1
  60. package/dist/common/events/util.js +0 -15
  61. package/dist/common/events/util.js.map +1 -1
  62. package/dist/common/logs/logger-config.js +0 -4
  63. package/dist/common/logs/logger-config.js.map +1 -1
  64. package/dist/common/logs/logger-proxy.js +1 -8
  65. package/dist/common/logs/logger-proxy.js.map +1 -1
  66. package/dist/common/logs/request.js +37 -60
  67. package/dist/common/logs/request.js.map +1 -1
  68. package/dist/common/queue.js +28 -23
  69. package/dist/common/queue.js.map +1 -1
  70. package/dist/config.js +8 -13
  71. package/dist/config.js.map +1 -1
  72. package/dist/constants.js +250 -66
  73. package/dist/constants.js.map +1 -1
  74. package/dist/controls-options-manager/constants.js +14 -0
  75. package/dist/controls-options-manager/constants.js.map +1 -0
  76. package/dist/controls-options-manager/enums.js +27 -0
  77. package/dist/controls-options-manager/enums.js.map +1 -0
  78. package/dist/controls-options-manager/index.js +297 -0
  79. package/dist/controls-options-manager/index.js.map +1 -0
  80. package/dist/controls-options-manager/types.js +7 -0
  81. package/dist/controls-options-manager/types.js.map +1 -0
  82. package/dist/controls-options-manager/util.js +319 -0
  83. package/dist/controls-options-manager/util.js.map +1 -0
  84. package/dist/index.js +108 -17
  85. package/dist/index.js.map +1 -1
  86. package/dist/interpretation/collection.js +23 -0
  87. package/dist/interpretation/collection.js.map +1 -0
  88. package/dist/interpretation/index.js +366 -0
  89. package/dist/interpretation/index.js.map +1 -0
  90. package/dist/interpretation/siLanguage.js +25 -0
  91. package/dist/interpretation/siLanguage.js.map +1 -0
  92. package/dist/locus-info/controlsUtils.js +101 -29
  93. package/dist/locus-info/controlsUtils.js.map +1 -1
  94. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  95. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  96. package/dist/locus-info/fullState.js +0 -15
  97. package/dist/locus-info/fullState.js.map +1 -1
  98. package/dist/locus-info/hostUtils.js +4 -12
  99. package/dist/locus-info/hostUtils.js.map +1 -1
  100. package/dist/locus-info/index.js +532 -240
  101. package/dist/locus-info/index.js.map +1 -1
  102. package/dist/locus-info/infoUtils.js +3 -37
  103. package/dist/locus-info/infoUtils.js.map +1 -1
  104. package/dist/locus-info/mediaSharesUtils.js +54 -38
  105. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  106. package/dist/locus-info/parser.js +284 -154
  107. package/dist/locus-info/parser.js.map +1 -1
  108. package/dist/locus-info/selfUtils.js +110 -92
  109. package/dist/locus-info/selfUtils.js.map +1 -1
  110. package/dist/media/index.js +95 -226
  111. package/dist/media/index.js.map +1 -1
  112. package/dist/media/properties.js +99 -194
  113. package/dist/media/properties.js.map +1 -1
  114. package/dist/media/util.js +2 -9
  115. package/dist/media/util.js.map +1 -1
  116. package/dist/mediaQualityMetrics/config.js +505 -495
  117. package/dist/mediaQualityMetrics/config.js.map +1 -1
  118. package/dist/meeting/in-meeting-actions.js +83 -14
  119. package/dist/meeting/in-meeting-actions.js.map +1 -1
  120. package/dist/meeting/index.js +3478 -3563
  121. package/dist/meeting/index.js.map +1 -1
  122. package/dist/meeting/locusMediaRequest.js +291 -0
  123. package/dist/meeting/locusMediaRequest.js.map +1 -0
  124. package/dist/meeting/muteState.js +247 -183
  125. package/dist/meeting/muteState.js.map +1 -1
  126. package/dist/meeting/request.js +344 -344
  127. package/dist/meeting/request.js.map +1 -1
  128. package/dist/meeting/request.type.js +7 -0
  129. package/dist/meeting/request.type.js.map +1 -0
  130. package/dist/meeting/state.js +21 -31
  131. package/dist/meeting/state.js.map +1 -1
  132. package/dist/meeting/util.js +529 -588
  133. package/dist/meeting/util.js.map +1 -1
  134. package/dist/meeting-info/collection.js +6 -25
  135. package/dist/meeting-info/collection.js.map +1 -1
  136. package/dist/meeting-info/index.js +62 -39
  137. package/dist/meeting-info/index.js.map +1 -1
  138. package/dist/meeting-info/meeting-info-v2.js +328 -283
  139. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  140. package/dist/meeting-info/request.js +3 -15
  141. package/dist/meeting-info/request.js.map +1 -1
  142. package/dist/meeting-info/util.js +98 -183
  143. package/dist/meeting-info/util.js.map +1 -1
  144. package/dist/meeting-info/utilv2.js +156 -232
  145. package/dist/meeting-info/utilv2.js.map +1 -1
  146. package/dist/meetings/collection.js +26 -19
  147. package/dist/meetings/collection.js.map +1 -1
  148. package/dist/meetings/index.js +795 -574
  149. package/dist/meetings/index.js.map +1 -1
  150. package/dist/meetings/meetings.types.js +7 -0
  151. package/dist/meetings/meetings.types.js.map +1 -0
  152. package/dist/meetings/request.js +26 -41
  153. package/dist/meetings/request.js.map +1 -1
  154. package/dist/meetings/util.js +186 -155
  155. package/dist/meetings/util.js.map +1 -1
  156. package/dist/member/index.js +126 -85
  157. package/dist/member/index.js.map +1 -1
  158. package/dist/member/types.js +25 -0
  159. package/dist/member/types.js.map +1 -0
  160. package/dist/member/util.js +147 -88
  161. package/dist/member/util.js.map +1 -1
  162. package/dist/members/collection.js +13 -12
  163. package/dist/members/collection.js.map +1 -1
  164. package/dist/members/index.js +178 -204
  165. package/dist/members/index.js.map +1 -1
  166. package/dist/members/request.js +113 -68
  167. package/dist/members/request.js.map +1 -1
  168. package/dist/members/types.js +15 -0
  169. package/dist/members/types.js.map +1 -0
  170. package/dist/members/util.js +314 -260
  171. package/dist/members/util.js.map +1 -1
  172. package/dist/metrics/constants.js +4 -7
  173. package/dist/metrics/constants.js.map +1 -1
  174. package/dist/metrics/index.js +11 -558
  175. package/dist/metrics/index.js.map +1 -1
  176. package/dist/multistream/mediaRequestManager.js +264 -50
  177. package/dist/multistream/mediaRequestManager.js.map +1 -1
  178. package/dist/multistream/receiveSlot.js +58 -65
  179. package/dist/multistream/receiveSlot.js.map +1 -1
  180. package/dist/multistream/receiveSlotManager.js +76 -95
  181. package/dist/multistream/receiveSlotManager.js.map +1 -1
  182. package/dist/multistream/remoteMedia.js +62 -76
  183. package/dist/multistream/remoteMedia.js.map +1 -1
  184. package/dist/multistream/remoteMediaGroup.js +66 -43
  185. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  186. package/dist/multistream/remoteMediaManager.js +502 -442
  187. package/dist/multistream/remoteMediaManager.js.map +1 -1
  188. package/dist/networkQualityMonitor/index.js +40 -59
  189. package/dist/networkQualityMonitor/index.js.map +1 -1
  190. package/dist/personal-meeting-room/index.js +21 -45
  191. package/dist/personal-meeting-room/index.js.map +1 -1
  192. package/dist/personal-meeting-room/request.js +1 -31
  193. package/dist/personal-meeting-room/request.js.map +1 -1
  194. package/dist/personal-meeting-room/util.js +0 -13
  195. package/dist/personal-meeting-room/util.js.map +1 -1
  196. package/dist/reachability/index.js +192 -191
  197. package/dist/reachability/index.js.map +1 -1
  198. package/dist/reachability/request.js +15 -23
  199. package/dist/reachability/request.js.map +1 -1
  200. package/dist/reactions/constants.js +13 -0
  201. package/dist/reactions/constants.js.map +1 -0
  202. package/dist/reactions/reactions.js +109 -0
  203. package/dist/reactions/reactions.js.map +1 -0
  204. package/dist/reactions/reactions.type.js +36 -0
  205. package/dist/reactions/reactions.type.js.map +1 -0
  206. package/dist/reconnection-manager/index.js +384 -476
  207. package/dist/reconnection-manager/index.js.map +1 -1
  208. package/dist/recording-controller/enums.js +17 -0
  209. package/dist/recording-controller/enums.js.map +1 -0
  210. package/dist/recording-controller/index.js +363 -0
  211. package/dist/recording-controller/index.js.map +1 -0
  212. package/dist/recording-controller/util.js +64 -0
  213. package/dist/recording-controller/util.js.map +1 -0
  214. package/dist/roap/index.js +58 -91
  215. package/dist/roap/index.js.map +1 -1
  216. package/dist/roap/request.js +137 -135
  217. package/dist/roap/request.js.map +1 -1
  218. package/dist/roap/turnDiscovery.js +148 -100
  219. package/dist/roap/turnDiscovery.js.map +1 -1
  220. package/dist/rtcMetrics/constants.js +12 -0
  221. package/dist/rtcMetrics/constants.js.map +1 -0
  222. package/dist/rtcMetrics/index.js +115 -0
  223. package/dist/rtcMetrics/index.js.map +1 -0
  224. package/dist/statsAnalyzer/global.js +1 -95
  225. package/dist/statsAnalyzer/global.js.map +1 -1
  226. package/dist/statsAnalyzer/index.js +385 -460
  227. package/dist/statsAnalyzer/index.js.map +1 -1
  228. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  229. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  230. package/dist/transcription/index.js +22 -47
  231. package/dist/transcription/index.js.map +1 -1
  232. package/dist/types/annotation/annotation.types.d.ts +42 -0
  233. package/dist/types/annotation/constants.d.ts +31 -0
  234. package/dist/types/annotation/index.d.ts +117 -0
  235. package/dist/types/breakouts/breakout.d.ts +8 -0
  236. package/dist/types/breakouts/collection.d.ts +5 -0
  237. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  238. package/dist/types/breakouts/events.d.ts +8 -0
  239. package/dist/types/breakouts/index.d.ts +5 -0
  240. package/dist/types/breakouts/request.d.ts +22 -0
  241. package/dist/types/breakouts/utils.d.ts +15 -0
  242. package/dist/types/common/browser-detection.d.ts +9 -0
  243. package/dist/types/common/collection.d.ts +48 -0
  244. package/dist/types/common/config.d.ts +2 -0
  245. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  246. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  247. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  248. package/dist/types/common/errors/media.d.ts +15 -0
  249. package/dist/types/common/errors/parameter.d.ts +15 -0
  250. package/dist/types/common/errors/password-error.d.ts +15 -0
  251. package/dist/types/common/errors/permission.d.ts +14 -0
  252. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  253. package/dist/types/common/errors/reconnection.d.ts +15 -0
  254. package/dist/types/common/errors/stats.d.ts +15 -0
  255. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  256. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  257. package/dist/types/common/events/events-scope.d.ts +17 -0
  258. package/dist/types/common/events/events.d.ts +12 -0
  259. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  260. package/dist/types/common/events/util.d.ts +2 -0
  261. package/dist/types/common/logs/logger-config.d.ts +2 -0
  262. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  263. package/dist/types/common/logs/request.d.ts +34 -0
  264. package/dist/types/common/queue.d.ts +34 -0
  265. package/dist/types/config.d.ts +72 -0
  266. package/dist/types/constants.d.ts +1016 -0
  267. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  268. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  269. package/dist/types/controls-options-manager/index.d.ts +136 -0
  270. package/dist/types/controls-options-manager/types.d.ts +43 -0
  271. package/dist/types/controls-options-manager/util.d.ts +1 -0
  272. package/dist/types/index.d.ts +7 -0
  273. package/dist/types/interpretation/collection.d.ts +5 -0
  274. package/dist/types/interpretation/index.d.ts +5 -0
  275. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  276. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  277. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  278. package/dist/types/locus-info/fullState.d.ts +2 -0
  279. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  280. package/dist/types/locus-info/index.d.ts +322 -0
  281. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  282. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  283. package/dist/types/locus-info/parser.d.ts +271 -0
  284. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  285. package/dist/types/media/index.d.ts +34 -0
  286. package/dist/types/media/properties.d.ts +93 -0
  287. package/dist/types/media/util.d.ts +2 -0
  288. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  289. package/dist/types/meeting/in-meeting-actions.d.ts +153 -0
  290. package/dist/types/meeting/index.d.ts +1471 -0
  291. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  292. package/dist/types/meeting/muteState.d.ts +184 -0
  293. package/dist/types/meeting/request.d.ts +257 -0
  294. package/dist/types/meeting/request.type.d.ts +11 -0
  295. package/dist/types/meeting/state.d.ts +9 -0
  296. package/dist/types/meeting/util.d.ts +78 -0
  297. package/dist/types/meeting-info/collection.d.ts +20 -0
  298. package/dist/types/meeting-info/index.d.ts +62 -0
  299. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  300. package/dist/types/meeting-info/request.d.ts +22 -0
  301. package/dist/types/meeting-info/util.d.ts +2 -0
  302. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  303. package/dist/types/meetings/collection.d.ts +31 -0
  304. package/dist/types/meetings/index.d.ts +367 -0
  305. package/dist/types/meetings/meetings.types.d.ts +4 -0
  306. package/dist/types/meetings/request.d.ts +27 -0
  307. package/dist/types/meetings/util.d.ts +18 -0
  308. package/dist/types/member/index.d.ts +159 -0
  309. package/dist/types/member/types.d.ts +32 -0
  310. package/dist/types/member/util.d.ts +2 -0
  311. package/dist/types/members/collection.d.ts +29 -0
  312. package/dist/types/members/index.d.ts +353 -0
  313. package/dist/types/members/request.d.ts +114 -0
  314. package/dist/types/members/types.d.ts +24 -0
  315. package/dist/types/members/util.d.ts +210 -0
  316. package/dist/types/metrics/constants.d.ts +55 -0
  317. package/dist/types/metrics/index.d.ts +45 -0
  318. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  319. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  320. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  321. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  322. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  323. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  324. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  325. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  326. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  327. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  328. package/dist/types/reachability/index.d.ts +152 -0
  329. package/dist/types/reachability/request.d.ts +37 -0
  330. package/dist/types/reactions/constants.d.ts +3 -0
  331. package/dist/types/reactions/reactions.d.ts +4 -0
  332. package/dist/types/reactions/reactions.type.d.ts +52 -0
  333. package/dist/types/reconnection-manager/index.d.ts +126 -0
  334. package/dist/types/recording-controller/enums.d.ts +7 -0
  335. package/dist/types/recording-controller/index.d.ts +208 -0
  336. package/dist/types/recording-controller/util.d.ts +14 -0
  337. package/dist/types/roap/index.d.ts +77 -0
  338. package/dist/types/roap/request.d.ts +36 -0
  339. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  340. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  341. package/dist/types/rtcMetrics/index.d.ts +46 -0
  342. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  343. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  344. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  345. package/dist/types/transcription/index.d.ts +64 -0
  346. package/internal-README.md +7 -6
  347. package/package.json +29 -21
  348. package/src/annotation/annotation.types.ts +50 -0
  349. package/src/annotation/constants.ts +36 -0
  350. package/src/annotation/index.ts +328 -0
  351. package/src/breakouts/README.md +220 -0
  352. package/src/breakouts/breakout.ts +188 -0
  353. package/src/breakouts/collection.ts +19 -0
  354. package/src/breakouts/edit-lock-error.ts +25 -0
  355. package/src/breakouts/events.ts +56 -0
  356. package/src/breakouts/index.ts +925 -0
  357. package/src/breakouts/request.ts +55 -0
  358. package/src/breakouts/utils.ts +57 -0
  359. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  360. package/src/common/collection.ts +9 -7
  361. package/src/common/{config.js → config.ts} +1 -1
  362. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  363. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  364. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  365. package/src/common/errors/{media.js → media.ts} +11 -7
  366. package/src/common/errors/parameter.ts +11 -7
  367. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  368. package/src/common/errors/{permission.js → permission.ts} +10 -6
  369. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  370. package/src/common/errors/{stats.js → stats.ts} +11 -7
  371. package/src/common/errors/{webex-errors.js → webex-errors.ts} +14 -9
  372. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  373. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  374. package/src/common/events/{events.js → events.ts} +5 -1
  375. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  376. package/src/common/events/{util.js → util.ts} +2 -3
  377. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  378. package/src/common/logs/logger-proxy.ts +44 -0
  379. package/src/common/logs/{request.js → request.ts} +22 -9
  380. package/src/common/queue.ts +22 -9
  381. package/src/{config.js → config.ts} +17 -17
  382. package/src/constants.ts +197 -22
  383. package/src/controls-options-manager/constants.ts +5 -0
  384. package/src/controls-options-manager/enums.ts +18 -0
  385. package/src/controls-options-manager/index.ts +278 -0
  386. package/src/controls-options-manager/types.ts +59 -0
  387. package/src/controls-options-manager/util.ts +300 -0
  388. package/src/index.ts +39 -0
  389. package/src/interpretation/README.md +60 -0
  390. package/src/interpretation/collection.ts +19 -0
  391. package/src/interpretation/index.ts +332 -0
  392. package/src/interpretation/siLanguage.ts +18 -0
  393. package/src/locus-info/controlsUtils.ts +222 -0
  394. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  395. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  396. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  397. package/src/locus-info/{index.js → index.ts} +518 -111
  398. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  399. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +65 -17
  400. package/src/locus-info/{parser.js → parser.ts} +271 -98
  401. package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
  402. package/src/media/index.ts +456 -0
  403. package/src/media/{properties.js → properties.ts} +80 -102
  404. package/src/media/{util.js → util.ts} +2 -2
  405. package/src/mediaQualityMetrics/config.ts +384 -0
  406. package/src/meeting/in-meeting-actions.ts +171 -3
  407. package/src/meeting/index.ts +7070 -0
  408. package/src/meeting/locusMediaRequest.ts +309 -0
  409. package/src/meeting/muteState.ts +450 -0
  410. package/src/meeting/{request.js → request.ts} +354 -214
  411. package/src/meeting/request.type.ts +13 -0
  412. package/src/meeting/{state.js → state.ts} +50 -35
  413. package/src/meeting/util.ts +615 -0
  414. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  415. package/src/meeting-info/index.ts +183 -0
  416. package/src/meeting-info/meeting-info-v2.ts +407 -0
  417. package/src/meeting-info/{request.js → request.ts} +14 -4
  418. package/src/meeting-info/{util.js → util.ts} +60 -51
  419. package/src/meeting-info/{utilv2.js → utilv2.ts} +77 -60
  420. package/src/meetings/{collection.js → collection.ts} +26 -3
  421. package/src/meetings/index.ts +1467 -0
  422. package/src/meetings/meetings.types.ts +12 -0
  423. package/src/meetings/{request.js → request.ts} +34 -25
  424. package/src/meetings/{util.js → util.ts} +137 -36
  425. package/src/member/{index.js → index.ts} +151 -56
  426. package/src/member/types.ts +38 -0
  427. package/src/member/util.ts +383 -0
  428. package/src/members/{collection.js → collection.ts} +10 -2
  429. package/src/members/{index.js → index.ts} +323 -145
  430. package/src/members/request.ts +255 -0
  431. package/src/members/types.ts +28 -0
  432. package/src/members/util.ts +339 -0
  433. package/src/metrics/{constants.js → constants.ts} +2 -6
  434. package/src/metrics/index.ts +73 -0
  435. package/src/multistream/mediaRequestManager.ts +337 -61
  436. package/src/multistream/receiveSlot.ts +69 -26
  437. package/src/multistream/receiveSlotManager.ts +66 -42
  438. package/src/multistream/remoteMedia.ts +40 -5
  439. package/src/multistream/remoteMediaGroup.ts +63 -3
  440. package/src/multistream/remoteMediaManager.ts +263 -66
  441. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  442. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  443. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  444. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  445. package/src/reachability/{index.js → index.ts} +157 -94
  446. package/src/reachability/request.ts +46 -35
  447. package/src/reactions/constants.ts +4 -0
  448. package/src/reactions/reactions.ts +104 -0
  449. package/src/reactions/reactions.type.ts +62 -0
  450. package/src/reconnection-manager/{index.js → index.ts} +254 -136
  451. package/src/recording-controller/enums.ts +8 -0
  452. package/src/recording-controller/index.ts +333 -0
  453. package/src/recording-controller/util.ts +75 -0
  454. package/src/roap/{index.js → index.ts} +86 -78
  455. package/src/roap/request.ts +163 -0
  456. package/src/roap/turnDiscovery.ts +111 -49
  457. package/src/rtcMetrics/constants.ts +3 -0
  458. package/src/rtcMetrics/index.ts +96 -0
  459. package/src/statsAnalyzer/global.ts +37 -0
  460. package/src/statsAnalyzer/index.ts +1272 -0
  461. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  462. package/src/transcription/{index.js → index.ts} +46 -39
  463. package/test/integration/spec/converged-space-meetings.js +233 -0
  464. package/test/integration/spec/journey.js +804 -526
  465. package/test/integration/spec/space-meeting.js +391 -204
  466. package/test/integration/spec/transcription.js +7 -8
  467. package/test/unit/spec/annotation/index.ts +418 -0
  468. package/test/unit/spec/breakouts/breakout.ts +237 -0
  469. package/test/unit/spec/breakouts/collection.ts +15 -0
  470. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  471. package/test/unit/spec/breakouts/events.ts +89 -0
  472. package/test/unit/spec/breakouts/index.ts +1790 -0
  473. package/test/unit/spec/breakouts/request.ts +104 -0
  474. package/test/unit/spec/breakouts/utils.js +72 -0
  475. package/test/unit/spec/common/browser-detection.js +9 -28
  476. package/test/unit/spec/common/queue.js +31 -2
  477. package/test/unit/spec/controls-options-manager/index.js +287 -0
  478. package/test/unit/spec/controls-options-manager/util.js +582 -0
  479. package/test/unit/spec/fixture/locus.js +93 -90
  480. package/test/unit/spec/interpretation/collection.ts +15 -0
  481. package/test/unit/spec/interpretation/index.ts +589 -0
  482. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  483. package/test/unit/spec/locus-info/controlsUtils.js +325 -32
  484. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  485. package/test/unit/spec/locus-info/index.js +1176 -18
  486. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  487. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  488. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  489. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  490. package/test/unit/spec/locus-info/parser.js +65 -31
  491. package/test/unit/spec/locus-info/selfConstant.js +120 -103
  492. package/test/unit/spec/locus-info/selfUtils.js +296 -12
  493. package/test/unit/spec/media/index.ts +162 -68
  494. package/test/unit/spec/media/properties.ts +9 -9
  495. package/test/unit/spec/meeting/in-meeting-actions.ts +82 -3
  496. package/test/unit/spec/meeting/index.js +4569 -1773
  497. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  498. package/test/unit/spec/meeting/muteState.js +382 -211
  499. package/test/unit/spec/meeting/request.js +444 -78
  500. package/test/unit/spec/meeting/utils.js +517 -192
  501. package/test/unit/spec/meeting-info/index.js +181 -0
  502. package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
  503. package/test/unit/spec/meeting-info/request.js +7 -9
  504. package/test/unit/spec/meeting-info/util.js +11 -12
  505. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  506. package/test/unit/spec/meetings/collection.js +15 -1
  507. package/test/unit/spec/meetings/index.js +1254 -330
  508. package/test/unit/spec/meetings/utils.js +220 -14
  509. package/test/unit/spec/member/index.js +58 -5
  510. package/test/unit/spec/member/util.js +494 -26
  511. package/test/unit/spec/members/index.js +423 -55
  512. package/test/unit/spec/members/request.js +228 -40
  513. package/test/unit/spec/members/utils.js +191 -4
  514. package/test/unit/spec/metrics/index.js +12 -66
  515. package/test/unit/spec/multistream/mediaRequestManager.ts +1013 -106
  516. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  517. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  518. package/test/unit/spec/multistream/remoteMedia.ts +40 -2
  519. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  520. package/test/unit/spec/multistream/remoteMediaManager.ts +730 -65
  521. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  522. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  523. package/test/unit/spec/reachability/index.ts +176 -27
  524. package/test/unit/spec/reachability/request.js +66 -0
  525. package/test/unit/spec/reconnection-manager/index.js +155 -9
  526. package/test/unit/spec/recording-controller/index.js +307 -0
  527. package/test/unit/spec/recording-controller/util.js +229 -0
  528. package/test/unit/spec/roap/index.ts +28 -52
  529. package/test/unit/spec/roap/request.ts +225 -0
  530. package/test/unit/spec/roap/turnDiscovery.ts +92 -50
  531. package/test/unit/spec/rtcMetrics/index.ts +60 -0
  532. package/test/unit/spec/stats-analyzer/index.js +116 -60
  533. package/test/utils/cmr.js +44 -42
  534. package/test/utils/constants.js +9 -0
  535. package/test/utils/integrationTestUtils.js +46 -0
  536. package/test/utils/testUtils.js +63 -99
  537. package/test/utils/webex-config.js +22 -18
  538. package/test/utils/webex-test-users.js +57 -50
  539. package/tsconfig.json +6 -0
  540. package/dist/media/internal-media-core-wrapper.js +0 -22
  541. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  542. package/dist/meeting/effectsState.js +0 -327
  543. package/dist/meeting/effectsState.js.map +0 -1
  544. package/dist/metrics/config.js +0 -301
  545. package/dist/metrics/config.js.map +0 -1
  546. package/dist/multistream/multistreamMedia.js +0 -116
  547. package/dist/multistream/multistreamMedia.js.map +0 -1
  548. package/dist/peer-connection-manager/util.js +0 -124
  549. package/dist/peer-connection-manager/util.js.map +0 -1
  550. package/src/common/logs/logger-proxy.js +0 -33
  551. package/src/index.js +0 -15
  552. package/src/locus-info/controlsUtils.js +0 -102
  553. package/src/media/index.js +0 -459
  554. package/src/media/internal-media-core-wrapper.ts +0 -9
  555. package/src/mediaQualityMetrics/config.js +0 -382
  556. package/src/meeting/effectsState.js +0 -205
  557. package/src/meeting/index.js +0 -6284
  558. package/src/meeting/muteState.js +0 -318
  559. package/src/meeting/util.js +0 -506
  560. package/src/meeting-info/index.js +0 -131
  561. package/src/meeting-info/meeting-info-v2.js +0 -255
  562. package/src/meetings/index.js +0 -1015
  563. package/src/member/util.js +0 -254
  564. package/src/members/request.js +0 -131
  565. package/src/members/util.js +0 -258
  566. package/src/metrics/config.js +0 -324
  567. package/src/metrics/index.js +0 -530
  568. package/src/multistream/multistreamMedia.ts +0 -92
  569. package/src/peer-connection-manager/util.ts +0 -117
  570. package/src/roap/request.js +0 -127
  571. package/src/statsAnalyzer/global.js +0 -133
  572. package/src/statsAnalyzer/index.js +0 -1006
  573. package/src/statsAnalyzer/mqaUtil.js +0 -173
  574. package/test/unit/spec/meeting/effectsState.js +0 -291
  575. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  576. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -2,77 +2,81 @@ import sinon from 'sinon';
2
2
  import {assert} from '@webex/test-helper-chai';
3
3
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
4
4
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
5
- import LoggerConfig
6
- from '@webex/plugin-meetings/src/common/logs/logger-config';
5
+ import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
7
6
  import Metrics from '@webex/plugin-meetings/src/metrics/index';
8
-
7
+ import {SELF_POLICY} from '@webex/plugin-meetings/src/constants';
8
+ import {DISPLAY_HINTS} from '@webex/plugin-meetings/src/constants';
9
+ import MockWebex from '@webex/test-helper-mock-webex';
9
10
 
10
11
  describe('plugin-meetings', () => {
12
+ let webex;
11
13
  describe('Meeting utils function', () => {
12
14
  const sandbox = sinon.createSandbox();
13
15
  const meeting = {};
14
16
 
15
17
  beforeEach(() => {
16
- Metrics.postEvent = sinon.stub();
18
+ webex = new MockWebex({});
17
19
  const logger = {
18
20
  info: sandbox.stub(),
19
21
  log: sandbox.stub(),
20
22
  error: sandbox.stub(),
21
- warn: sandbox.stub()
23
+ warn: sandbox.stub(),
24
+ debug: sandbox.stub(),
22
25
  };
23
26
 
24
27
  LoggerConfig.set({
25
28
  verboseEvents: true,
26
- enable: true
29
+ enable: true,
27
30
  });
28
31
  LoggerProxy.set(logger);
29
32
 
30
- meeting.closeLocalStream = sinon.stub()
31
- .returns(Promise.resolve());
32
- meeting.closeLocalShare = sinon.stub()
33
- .returns(Promise.resolve());
34
- meeting.closeRemoteTracks = sinon.stub()
35
- .returns(Promise.resolve());
36
- meeting.closePeerConnections = sinon.stub()
37
- .returns(Promise.resolve());
38
-
39
- meeting.unsetLocalVideoTrack = sinon.stub();
40
- meeting.unsetLocalShareTrack = sinon.stub();
33
+ meeting.cleanupLocalTracks = sinon.stub().returns(Promise.resolve());
34
+ meeting.closeRemoteTracks = sinon.stub().returns(Promise.resolve());
35
+ meeting.closePeerConnections = sinon.stub().returns(Promise.resolve());
36
+
41
37
  meeting.unsetRemoteTracks = sinon.stub();
42
38
  meeting.unsetPeerConnections = sinon.stub();
43
39
  meeting.reconnectionManager = {cleanUp: sinon.stub()};
44
40
  meeting.stopKeepAlive = sinon.stub();
41
+ meeting.updateLLMConnection = sinon.stub();
42
+ meeting.breakouts = {cleanUp: sinon.stub()};
43
+ meeting.annotaion = {cleanUp: sinon.stub()};
44
+ meeting.getWebexObject = sinon.stub().returns(webex);
45
+ meeting.simultaneousInterpretation = {cleanUp: sinon.stub()};
46
+ meeting.trigger = sinon.stub();
45
47
  });
46
48
 
47
49
  afterEach(() => {
48
50
  sandbox.restore();
51
+ sinon.restore();
49
52
  });
50
53
 
51
54
  describe('#cleanup', () => {
52
55
  it('do clean up on meeting object', async () => {
53
56
  await MeetingUtil.cleanUp(meeting);
54
- assert.calledOnce(meeting.closeLocalStream);
55
- assert.calledOnce(meeting.closeLocalStream);
56
- assert.calledOnce(meeting.closeLocalShare);
57
+ assert.calledOnce(meeting.cleanupLocalTracks);
57
58
  assert.calledOnce(meeting.closeRemoteTracks);
58
59
  assert.calledOnce(meeting.closePeerConnections);
59
60
 
60
- assert.calledOnce(meeting.unsetLocalVideoTrack);
61
- assert.calledOnce(meeting.unsetLocalShareTrack);
62
61
  assert.calledOnce(meeting.unsetRemoteTracks);
63
62
  assert.calledOnce(meeting.unsetPeerConnections);
64
63
  assert.calledOnce(meeting.reconnectionManager.cleanUp);
65
64
  assert.calledOnce(meeting.stopKeepAlive);
65
+ assert.calledOnce(meeting.updateLLMConnection);
66
+ assert.calledOnce(meeting.breakouts.cleanUp);
67
+ assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
66
68
  });
67
69
  });
68
70
 
69
71
  describe('logging', () => {
70
72
  const fakeDevice = sinon.fake.returns({
71
- deviceId: 'device-1'
73
+ deviceId: 'device-1',
72
74
  });
73
75
 
74
76
  const mockTrack = {
75
- getSettings: fakeDevice
77
+ underlyingTrack: {
78
+ getSettings: fakeDevice,
79
+ },
76
80
  };
77
81
 
78
82
  it('#log - should log [info, warn, error, log] to console', () => {
@@ -122,10 +126,7 @@ describe('plugin-meetings', () => {
122
126
  });
123
127
 
124
128
  it('should log device settings', () => {
125
- const mockDevices = [
126
- {deviceId: 'device-1'},
127
- {deviceId: 'device-2'}
128
- ];
129
+ const mockDevices = [{deviceId: 'device-1'}, {deviceId: 'device-2'}];
129
130
 
130
131
  assert(MeetingUtil.handleDeviceLogging, 'is defined');
131
132
  MeetingUtil.handleDeviceLogging(mockDevices);
@@ -134,51 +135,228 @@ describe('plugin-meetings', () => {
134
135
  });
135
136
  });
136
137
 
137
- describe('remoteUpdateAudioVideo', () => {
138
- it('#Should call meetingRequest.remoteAudioVideoToggle with correct parameters (multistream)', async () => {
138
+ describe('addSequence', () => {
139
+ it('should add the sequence object to a request body', () => {
140
+ const body = {};
141
+
142
+ MeetingUtil.addSequence({
143
+ locusInfo: {
144
+ sequence: 'sequence'
145
+ }
146
+ }, body);
147
+
148
+ assert.deepEqual(body, {
149
+ sequence: 'sequence'
150
+ });
151
+ });
152
+
153
+ it('should work with an undefined meeting', () => {
154
+ const body = {};
155
+
156
+ MeetingUtil.addSequence(
157
+ undefined,
158
+ body
159
+ );
160
+
161
+ assert.deepEqual(body, {});
162
+ });
163
+
164
+ it('should work with an undefined locusInfo', () => {
165
+ const body = {};
166
+
167
+ MeetingUtil.addSequence({}, body);
168
+
169
+ assert.deepEqual(body, {});
170
+ });
171
+
172
+ it('should work with an undefined sequence', () => {
173
+ const body = {};
174
+
175
+ MeetingUtil.addSequence({locusInfo: {}}, body);
176
+
177
+ assert.deepEqual(body, {});
178
+ });
179
+ });
180
+
181
+ describe('updateLocusWithDelta', () => {
182
+ it('should call handleLocusDelta with the new delta locus', () => {
139
183
  const meeting = {
140
- correlationId: 'correlation id',
141
- isMultistream: true,
142
- mediaId: '12345',
143
- meetingJoinUrl: 'meetingJoinUrl',
144
- locusUrl: 'locusUrl',
145
- deviceUrl: 'some device url',
146
- selfId: 'self id',
147
- meetingRequest: {remoteAudioVideoToggle: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}
184
+ locusInfo: {
185
+ handleLocusDelta: sinon.stub()
186
+ },
148
187
  };
149
188
 
150
- await MeetingUtil.remoteUpdateAudioVideo(true, false, meeting);
189
+ const originalResponse = {
190
+ body: {
191
+ locus: 'locus'
192
+ },
193
+ };
151
194
 
152
- assert.calledOnce(meeting.meetingRequest.remoteAudioVideoToggle);
153
- const parameter = meeting.meetingRequest.remoteAudioVideoToggle.getCall(0).args[0];
195
+ const response = MeetingUtil.updateLocusWithDelta(meeting, originalResponse);
196
+
197
+ assert.deepEqual(response, originalResponse);
198
+ assert.calledOnceWithExactly(meeting.locusInfo.handleLocusDelta, 'locus', meeting);
199
+ });
200
+
201
+ it('should handle locus being missing from the response', () => {
202
+ const meeting = {
203
+ locusInfo: {
204
+ handleLocusDelta: sinon.stub(),
205
+ },
206
+ };
207
+
208
+ const originalResponse = {
209
+ body: {},
210
+ };
211
+
212
+ const response = MeetingUtil.updateLocusWithDelta(meeting, originalResponse);
213
+
214
+ assert.deepEqual(response, originalResponse);
215
+ assert.notCalled(meeting.locusInfo.handleLocusDelta);
216
+ });
217
+
218
+ it('should work with an undefined meeting', () => {
219
+ const originalResponse = {
220
+ body: {
221
+ locus: 'locus',
222
+ },
223
+ };
224
+
225
+ const response = MeetingUtil.updateLocusWithDelta(undefined, originalResponse);
226
+ assert.deepEqual(response, originalResponse);
227
+ });
228
+ });
229
+
230
+ describe('generateLocusDeltaRequest', () => {
231
+
232
+ afterEach(() => {
233
+ WeakRef.prototype.deref.restore();
234
+ });
235
+
236
+ it('generates the correct wrapper function', async () => {
237
+ const updateLocusWithDeltaSpy = sinon.spy(MeetingUtil, 'updateLocusWithDelta');
238
+ const addSequenceSpy = sinon.spy(MeetingUtil, 'addSequence');
239
+
240
+ const meeting = {
241
+ request: sinon.stub().returns(Promise.resolve('result')),
242
+ }
243
+
244
+ const locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);
245
+
246
+ const options = {
247
+ some: 'option',
248
+ body: {}
249
+ };
250
+
251
+ let result = await locusDeltaRequest(options);
252
+
253
+ assert.equal(result, 'result');
254
+ assert.calledOnceWithExactly(updateLocusWithDeltaSpy, meeting, 'result');
255
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
256
+
257
+ updateLocusWithDeltaSpy.resetHistory();
258
+ addSequenceSpy.resetHistory();
259
+
260
+ // body missing from options
261
+ result = await locusDeltaRequest({});
262
+ assert.equal(result, 'result');
263
+ assert.calledOnceWithExactly(updateLocusWithDeltaSpy, meeting, 'result');
264
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
265
+
266
+ // meeting disappears so the WeakRef returns undefined
267
+ sinon.stub(WeakRef.prototype, 'deref').returns(undefined);
268
+
269
+ result = await locusDeltaRequest(options);
270
+ assert.equal(result, undefined);
154
271
 
155
- assert.equal(parameter.locusUrl, 'locusUrl');
156
- assert.equal(parameter.selfId, 'self id');
157
- assert.equal(parameter.correlationId, 'correlation id');
158
- assert.equal(parameter.deviceUrl, 'some device url');
159
- assert.deepEqual(parameter.localMedias, [{localSdp: '{"audioMuted":true,"videoMuted":false}', mediaId: '12345'}]);
160
- assert.equal(parameter.preferTranscoding, false);
161
272
  });
162
273
 
163
- it('#Should call meetingRequest.remoteAudioVideoToggle with preferTranscoding:true for non multistream connections', async () => {
274
+ });
275
+
276
+ describe('selfSupportsFeature', () => {
277
+ it('returns true if there are no user policies', () => {
278
+ assert.equal(
279
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, undefined),
280
+ true
281
+ );
282
+ });
283
+
284
+ it('returns true if policy is true', () => {
285
+ assert.equal(
286
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, {
287
+ [SELF_POLICY.SUPPORT_ANNOTATION]: true
288
+ }),
289
+ true
290
+ );
291
+ });
292
+
293
+ it('returns false if policy is false', () => {
294
+ assert.equal(
295
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, {
296
+ [SELF_POLICY.SUPPORT_ANNOTATION]: false,
297
+ }),
298
+ false
299
+ );
300
+ });
301
+ });
302
+
303
+ describe('remoteUpdateAudioVideo', () => {
304
+ it('#Should call meetingRequest.locusMediaRequest with correct parameters', async () => {
164
305
  const meeting = {
165
- isMultistream: false,
306
+ id: 'meeting-id',
166
307
  mediaId: '12345',
167
- meetingRequest: {remoteAudioVideoToggle: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}
308
+ selfUrl: 'self url',
309
+ locusInfo: {
310
+ sequence: {},
311
+ },
312
+ locusMediaRequest: {
313
+ send: sinon.stub().resolves({body: {}, headers: {}}),
314
+ },
315
+ getWebexObject: sinon.stub().returns(webex)
168
316
  };
169
317
 
170
- await MeetingUtil.remoteUpdateAudioVideo(true, false, meeting);
318
+ await MeetingUtil.remoteUpdateAudioVideo(meeting, true, false);
171
319
 
172
- assert.calledOnce(meeting.meetingRequest.remoteAudioVideoToggle);
173
- const parameter = meeting.meetingRequest.remoteAudioVideoToggle.getCall(0).args[0];
320
+ assert.calledOnceWithExactly(meeting.locusMediaRequest.send, {
321
+ mediaId: '12345',
322
+ muteOptions: {
323
+ audioMuted: true,
324
+ videoMuted: false,
325
+ },
326
+ selfUrl: 'self url',
327
+ sequence: {},
328
+ type: 'LocalMute',
329
+ });
174
330
 
175
- assert.equal(parameter.preferTranscoding, true);
331
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
332
+ name: 'client.locus.media.request',
333
+ options: {meetingId: meeting.id},
334
+ });
335
+
336
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
337
+ name: 'client.locus.media.response',
338
+ options: {meetingId: meeting.id},
339
+ });
176
340
  });
177
341
  });
178
342
 
179
343
  describe('joinMeeting', () => {
180
344
  it('#Should call `meetingRequest.joinMeeting', async () => {
181
- const meeting = {meetingJoinUrl: 'meetingJoinUrl', locusUrl: 'locusUrl', meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}};
345
+ const meeting = {
346
+ meetingJoinUrl: 'meetingJoinUrl',
347
+ locusUrl: 'locusUrl',
348
+ meetingRequest: {
349
+ joinMeeting: sinon.stub().returns(
350
+ Promise.resolve({
351
+ body: {mediaConnections: 'mediaConnections'},
352
+ headers: {
353
+ trackingid: 'trackingId',
354
+ },
355
+ })
356
+ ),
357
+ },
358
+ getWebexObject: sinon.stub().returns(webex)
359
+ };
182
360
 
183
361
  MeetingUtil.parseLocusJoin = sinon.stub();
184
362
  await MeetingUtil.joinMeeting(meeting, {});
@@ -188,6 +366,84 @@ describe('plugin-meetings', () => {
188
366
 
189
367
  assert.equal(parameter.inviteeAddress, 'meetingJoinUrl');
190
368
  assert.equal(parameter.preferTranscoding, true);
369
+
370
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
371
+ name: 'client.locus.join.request',
372
+ options: {meetingId: meeting.id},
373
+ });
374
+
375
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
376
+ name: 'client.locus.join.response',
377
+ payload: {
378
+ trigger: 'loci-update',
379
+ identifiers: {
380
+ trackingId: 'trackingId',
381
+ },
382
+ },
383
+ options: {
384
+ meetingId: meeting.id,
385
+ mediaConnections: 'mediaConnections',
386
+ },
387
+ });
388
+ });
389
+
390
+ it('#Should call meetingRequest.joinMeeting with breakoutsSupported=true when passed in as true', async () => {
391
+ const meeting = {
392
+ meetingRequest: {
393
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
394
+ },
395
+ getWebexObject: sinon.stub().returns(webex)
396
+ };
397
+
398
+ MeetingUtil.parseLocusJoin = sinon.stub();
399
+ await MeetingUtil.joinMeeting(meeting, {
400
+ breakoutsSupported: true,
401
+ });
402
+
403
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
404
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
405
+
406
+ assert.equal(parameter.breakoutsSupported, true);
407
+ });
408
+
409
+ it('#Should call meetingRequest.joinMeeting with liveAnnotationSupported=true when passed in as true', async () => {
410
+ const meeting = {
411
+ meetingRequest: {
412
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
413
+ },
414
+ getWebexObject: sinon.stub().returns(webex)
415
+ };
416
+
417
+ MeetingUtil.parseLocusJoin = sinon.stub();
418
+ await MeetingUtil.joinMeeting(meeting, {
419
+ liveAnnotationSupported: true,
420
+ });
421
+
422
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
423
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
424
+
425
+ assert.equal(parameter.liveAnnotationSupported, true);
426
+ });
427
+
428
+ it('#Should call meetingRequest.joinMeeting with locale=en_UK, deviceCapabilities=["TEST"] when they are passed in as those values', async () => {
429
+ const meeting = {
430
+ meetingRequest: {
431
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
432
+ },
433
+ getWebexObject: sinon.stub().returns(webex)
434
+ };
435
+
436
+ MeetingUtil.parseLocusJoin = sinon.stub();
437
+ await MeetingUtil.joinMeeting(meeting, {
438
+ locale: 'en_UK',
439
+ deviceCapabilities: ['TEST'],
440
+ });
441
+
442
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
443
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
444
+
445
+ assert.equal(parameter.locale, 'en_UK');
446
+ assert.deepEqual(parameter.deviceCapabilities, ['TEST']);
191
447
  });
192
448
 
193
449
  it('#Should call meetingRequest.joinMeeting with preferTranscoding=false when multistream is enabled', async () => {
@@ -195,7 +451,10 @@ describe('plugin-meetings', () => {
195
451
  isMultistream: true,
196
452
  meetingJoinUrl: 'meetingJoinUrl',
197
453
  locusUrl: 'locusUrl',
198
- meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}
454
+ meetingRequest: {
455
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
456
+ },
457
+ getWebexObject: sinon.stub().returns(webex)
199
458
  };
200
459
 
201
460
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -209,7 +468,14 @@ describe('plugin-meetings', () => {
209
468
  });
210
469
 
211
470
  it('#Should fallback sipUrl if meetingJoinUrl does not exists', async () => {
212
- const meeting = {sipUri: 'sipUri', locusUrl: 'locusUrl', meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}};
471
+ const meeting = {
472
+ sipUri: 'sipUri',
473
+ locusUrl: 'locusUrl',
474
+ meetingRequest: {
475
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
476
+ },
477
+ getWebexObject: sinon.stub().returns(webex)
478
+ };
213
479
 
214
480
  MeetingUtil.parseLocusJoin = sinon.stub();
215
481
  await MeetingUtil.joinMeeting(meeting, {});
@@ -221,7 +487,14 @@ describe('plugin-meetings', () => {
221
487
  });
222
488
 
223
489
  it('#Should fallback to meetingNumber if meetingJoinUrl/sipUrl does not exists', async () => {
224
- const meeting = {meetingNumber: 'meetingNumber', locusUrl: 'locusUrl', meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}};
490
+ const meeting = {
491
+ meetingNumber: 'meetingNumber',
492
+ locusUrl: 'locusUrl',
493
+ meetingRequest: {
494
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
495
+ },
496
+ getWebexObject: sinon.stub().returns(webex)
497
+ };
225
498
 
226
499
  MeetingUtil.parseLocusJoin = sinon.stub();
227
500
  await MeetingUtil.joinMeeting(meeting, {});
@@ -234,19 +507,51 @@ describe('plugin-meetings', () => {
234
507
  });
235
508
  });
236
509
 
510
+ describe('joinMeetingOptions', () => {
511
+ it('sends client events correctly', async () => {
512
+ MeetingUtil.joinMeeting = sinon.stub().rejects({});
513
+ MeetingUtil.isPinOrGuest = sinon.stub().returns(true);
514
+ const meeting = {
515
+ id: 'meeting-id',
516
+ mediaId: '12345',
517
+ selfUrl: 'self url',
518
+ locusInfo: {
519
+ sequence: {},
520
+ },
521
+ locusMediaRequest: {
522
+ send: sinon.stub().resolves({body: {}, headers: {}}),
523
+ },
524
+ getWebexObject: sinon.stub().returns(webex)
525
+ };
526
+
527
+ try {
528
+ await MeetingUtil.joinMeetingOptions(meeting, {pin: true});
529
+
530
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
531
+ name: 'client.pin.collected',
532
+ options: {
533
+ meetingId: meeting.id,
534
+ },
535
+ });
536
+ } catch (err) {
537
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
538
+ name: 'client.pin.prompt',
539
+ options: {
540
+ meetingId: meeting.id,
541
+ },
542
+ });
543
+ }
544
+ });
545
+
546
+ })
547
+
237
548
  describe('getUserDisplayHintsFromLocusInfo', () => {
238
549
  it('returns display hints', () => {
239
550
  assert.deepEqual(MeetingUtil.getUserDisplayHintsFromLocusInfo(), []);
240
551
 
241
- assert.deepEqual(
242
- MeetingUtil.getUserDisplayHintsFromLocusInfo({}),
243
- []
244
- );
552
+ assert.deepEqual(MeetingUtil.getUserDisplayHintsFromLocusInfo({}), []);
245
553
 
246
- assert.deepEqual(
247
- MeetingUtil.getUserDisplayHintsFromLocusInfo({parsedLocus: {}}),
248
- []
249
- );
554
+ assert.deepEqual(MeetingUtil.getUserDisplayHintsFromLocusInfo({parsedLocus: {}}), []);
250
555
 
251
556
  assert.deepEqual(
252
557
  MeetingUtil.getUserDisplayHintsFromLocusInfo({parsedLocus: {info: {}}}),
@@ -254,7 +559,9 @@ describe('plugin-meetings', () => {
254
559
  );
255
560
 
256
561
  assert.deepEqual(
257
- MeetingUtil.getUserDisplayHintsFromLocusInfo({parsedLocus: {info: {userDisplayHints: []}}}),
562
+ MeetingUtil.getUserDisplayHintsFromLocusInfo({
563
+ parsedLocus: {info: {userDisplayHints: []}},
564
+ }),
258
565
  []
259
566
  );
260
567
 
@@ -262,11 +569,9 @@ describe('plugin-meetings', () => {
262
569
  MeetingUtil.getUserDisplayHintsFromLocusInfo({
263
570
  parsedLocus: {
264
571
  info: {
265
- userDisplayHints: [
266
- 'HINT_1'
267
- ]
268
- }
269
- }
572
+ userDisplayHints: ['HINT_1'],
573
+ },
574
+ },
270
575
  }),
271
576
  ['HINT_1']
272
577
  );
@@ -303,23 +608,55 @@ describe('plugin-meetings', () => {
303
608
 
304
609
  describe('canUserLowerSomeoneElsesHand', () => {
305
610
  it('works as expected', () => {
306
- assert.deepEqual(MeetingUtil.canUserLowerSomeoneElsesHand(['LOWER_SOMEONE_ELSES_HAND']), true);
611
+ assert.deepEqual(
612
+ MeetingUtil.canUserLowerSomeoneElsesHand(['LOWER_SOMEONE_ELSES_HAND']),
613
+ true
614
+ );
307
615
  assert.deepEqual(MeetingUtil.canUserLowerSomeoneElsesHand([]), false);
308
616
  });
309
617
  });
310
618
 
619
+ describe('canUserRenameSelfAndObserved', () => {
620
+ it('works as expected', () => {
621
+ assert.deepEqual(
622
+ MeetingUtil.canUserRenameSelfAndObserved(['CAN_RENAME_SELF_AND_OBSERVED']),
623
+ true
624
+ );
625
+ assert.deepEqual(MeetingUtil.canUserRenameSelfAndObserved([]), false);
626
+ });
627
+ });
628
+
629
+ describe('canUserRenameOthers', () => {
630
+ it('works as expected', () => {
631
+ assert.deepEqual(MeetingUtil.canUserRenameOthers(['CAN_RENAME_OTHERS']), true);
632
+ assert.deepEqual(MeetingUtil.canUserRenameOthers([]), false);
633
+ });
634
+ });
635
+
311
636
  describe('bothLeaveAndEndMeetingAvailable', () => {
312
637
  it('works as expected', () => {
313
- assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_TRANSFER_HOST_END_MEETING']), true);
638
+ assert.deepEqual(
639
+ MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_TRANSFER_HOST_END_MEETING']),
640
+ true
641
+ );
314
642
  assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_END_MEETING']), true);
315
- assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_TRANSFER_HOST_END_MEETING', 'LEAVE_END_MEETING']), true);
643
+ assert.deepEqual(
644
+ MeetingUtil.bothLeaveAndEndMeetingAvailable([
645
+ 'LEAVE_TRANSFER_HOST_END_MEETING',
646
+ 'LEAVE_END_MEETING',
647
+ ]),
648
+ true
649
+ );
316
650
  assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable([]), false);
317
651
  });
318
652
  });
319
653
 
320
654
  describe('canUserLock', () => {
321
655
  it('works as expected', () => {
322
- assert.deepEqual(MeetingUtil.canUserLock(['LOCK_CONTROL_LOCK', 'LOCK_STATUS_UNLOCKED']), true);
656
+ assert.deepEqual(
657
+ MeetingUtil.canUserLock(['LOCK_CONTROL_LOCK', 'LOCK_STATUS_UNLOCKED']),
658
+ true
659
+ );
323
660
  assert.deepEqual(MeetingUtil.canUserLock(['LOCK_CONTROL_LOCK']), false);
324
661
  assert.deepEqual(MeetingUtil.canUserLock(['LOCK_STATUS_UNLOCKED']), false);
325
662
  assert.deepEqual(MeetingUtil.canUserLock([]), false);
@@ -328,43 +665,18 @@ describe('plugin-meetings', () => {
328
665
 
329
666
  describe('canUserUnlock', () => {
330
667
  it('works as expected', () => {
331
- assert.deepEqual(MeetingUtil.canUserUnlock(['LOCK_CONTROL_UNLOCK', 'LOCK_STATUS_LOCKED']), true);
668
+ assert.deepEqual(
669
+ MeetingUtil.canUserUnlock(['LOCK_CONTROL_UNLOCK', 'LOCK_STATUS_LOCKED']),
670
+ true
671
+ );
332
672
  assert.deepEqual(MeetingUtil.canUserUnlock(['LOCK_CONTROL_UNLOCK']), false);
333
673
  assert.deepEqual(MeetingUtil.canUserUnlock(['LOCK_STATUS_LOCKED']), false);
334
674
  assert.deepEqual(MeetingUtil.canUserUnlock([]), false);
335
675
  });
336
676
  });
337
677
 
338
- describe('canUserRecord', () => {
339
- it('works as expected', () => {
340
- assert.deepEqual(MeetingUtil.canUserRecord(['RECORDING_CONTROL_START']), true);
341
- assert.deepEqual(MeetingUtil.canUserRecord([]), false);
342
- });
343
- });
344
-
345
- describe('canUserPause', () => {
346
- it('works as expected', () => {
347
- assert.deepEqual(MeetingUtil.canUserPause(['RECORDING_CONTROL_PAUSE']), true);
348
- assert.deepEqual(MeetingUtil.canUserPause([]), false);
349
- });
350
- });
351
-
352
- describe('canUserResume', () => {
353
- it('works as expected', () => {
354
- assert.deepEqual(MeetingUtil.canUserResume(['RECORDING_CONTROL_RESUME']), true);
355
- assert.deepEqual(MeetingUtil.canUserResume([]), false);
356
- });
357
- });
358
-
359
-
360
- describe('canUserStop', () => {
361
- it('works as expected', () => {
362
- assert.deepEqual(MeetingUtil.canUserStop(['RECORDING_CONTROL_STOP']), true);
363
- assert.deepEqual(MeetingUtil.canUserStop([]), false);
364
- });
365
- });
366
-
367
678
  [
679
+ {functionName: 'isSaveTranscriptsEnabled', displayHint: 'SAVE_TRANSCRIPTS_ENABLED'},
368
680
  {functionName: 'canEnableClosedCaption', displayHint: 'CAPTION_START'},
369
681
  {functionName: 'canStartTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_START'},
370
682
  {functionName: 'canStopTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_STOP'},
@@ -383,105 +695,118 @@ describe('plugin-meetings', () => {
383
695
  });
384
696
  });
385
697
 
386
-
387
- describe('recording tests', () => {
388
- let request;
389
- let locusInfo;
390
- const locusUrl = 'locusUrl';
391
-
392
- beforeEach(() => {
393
- locusInfo = {
394
- parsedLocus: {
395
- info: {
396
- userDisplayHints: [
397
- 'RECORDING_CONTROL_START'
398
- ]
399
- }
400
- }
401
- };
402
- request = {
403
- recordMeeting: sinon.stub().returns(Promise.resolve())
404
- };
698
+ describe('canManageBreakout', () => {
699
+ it('works as expected', () => {
700
+ assert.deepEqual(MeetingUtil.canManageBreakout(['BREAKOUT_MANAGEMENT']), true);
701
+ assert.deepEqual(MeetingUtil.canManageBreakout([]), false);
405
702
  });
703
+ });
406
704
 
407
- describe('startRecording', () => {
408
- it('can start recording when the correct display hint is present', () => {
409
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_START');
410
-
411
- const result = MeetingUtil.startRecording(request, locusUrl, locusInfo);
412
-
413
- assert.calledWith(request.recordMeeting, {locusUrl, recording: true, paused: false});
414
-
415
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
416
- });
417
-
418
- it('rejects when correct display hint is not present', () => {
419
- const result = MeetingUtil.startRecording(request, locusUrl, {});
420
-
421
- assert.notCalled(request.recordMeeting);
705
+ describe('canBroadcastMessageToBreakout', () => {
706
+ it('works as expected', () => {
707
+ assert.deepEqual(MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT'], {
708
+ [SELF_POLICY.SUPPORT_BROADCAST_MESSAGE]: true
709
+ }), true);
710
+ assert.deepEqual(MeetingUtil.canBroadcastMessageToBreakout([], {[SELF_POLICY.SUPPORT_BROADCAST_MESSAGE]: true}), false);
711
+ assert.deepEqual(MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT'], {[SELF_POLICY.SUPPORT_BROADCAST_MESSAGE]: false}), false);
712
+ assert.deepEqual(MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT'], undefined), false);
422
713
 
423
- assert.isRejected(result);
424
- });
425
714
  });
715
+ });
426
716
 
427
- describe('pauseRecording', () => {
428
- it('can pause recording when the correct display hint is present', () => {
429
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_PAUSE');
430
-
431
- const result = MeetingUtil.pauseRecording(request, locusUrl, locusInfo);
432
-
433
- assert.calledWith(request.recordMeeting, {locusUrl, recording: true, paused: true});
434
-
435
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
436
- });
437
-
438
- it('rejects when correct display hint is not present', () => {
439
- const result = MeetingUtil.pauseRecording(request, locusUrl, {});
440
-
441
- assert.notCalled(request.recordMeeting);
442
-
443
- assert.isRejected(result);
444
- });
717
+ describe('isSuppressBreakoutSupport', () => {
718
+ it('works as expected', () => {
719
+ assert.deepEqual(
720
+ MeetingUtil.isSuppressBreakoutSupport(['UCF_SUPPRESS_BREAKOUTS_SUPPORT']),
721
+ true
722
+ );
723
+ assert.deepEqual(MeetingUtil.isSuppressBreakoutSupport([]), false);
445
724
  });
725
+ });
446
726
 
447
- describe('resumeRecording', () => {
448
- it('can resume recording when the correct display hint is present', () => {
449
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_RESUME');
450
-
451
- const result = MeetingUtil.resumeRecording(request, locusUrl, locusInfo);
452
-
453
- assert.calledWith(request.recordMeeting, {locusUrl, recording: true, paused: false});
454
-
455
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
456
- });
457
-
458
- it('rejects when correct display hint is not present', () => {
459
- const result = MeetingUtil.resumeRecording(request, locusUrl, {});
460
-
461
- assert.notCalled(request.recordMeeting);
462
-
463
- assert.isRejected(result);
464
- });
727
+ describe('canAdmitLobbyToBreakout', () => {
728
+ it('works as expected', () => {
729
+ assert.deepEqual(MeetingUtil.canAdmitLobbyToBreakout(['DISABLE_LOBBY_TO_BREAKOUT']), false);
730
+ assert.deepEqual(MeetingUtil.canAdmitLobbyToBreakout([]), true);
465
731
  });
732
+ });
466
733
 
467
- describe('stopRecording', () => {
468
- it('can stop recording when the correct display hint is present', () => {
469
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_STOP');
470
-
471
- const result = MeetingUtil.stopRecording(request, locusUrl, locusInfo);
472
-
473
- assert.calledWith(request.recordMeeting, {locusUrl, recording: false, paused: false});
734
+ describe('canUserAskForHelp', () => {
735
+ it('works as expected', () => {
736
+ assert.deepEqual(MeetingUtil.canUserAskForHelp(['DISABLE_ASK_FOR_HELP']), false);
737
+ assert.deepEqual(MeetingUtil.canUserAskForHelp([]), true);
738
+ });
739
+ });
474
740
 
475
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
476
- });
741
+ describe('isBreakoutPreassignmentsEnabled', () => {
742
+ it('works as expected', () => {
743
+ assert.deepEqual(
744
+ MeetingUtil.isBreakoutPreassignmentsEnabled(['DISABLE_BREAKOUT_PREASSIGNMENTS']),
745
+ false
746
+ );
747
+ assert.deepEqual(MeetingUtil.isBreakoutPreassignmentsEnabled([]), true);
748
+ });
749
+ });
477
750
 
478
- it('rejects when correct display hint is not present', () => {
479
- const result = MeetingUtil.stopRecording(request, locusUrl, {});
480
751
 
481
- assert.notCalled(request.recordMeeting);
752
+ describe('parseInterpretationInfo', () => {
753
+ let meetingInfo = {};
754
+ beforeEach(() => {
755
+ meeting.simultaneousInterpretation = {
756
+ updateMeetingSIEnabled: sinon.stub(),
757
+ updateHostSIEnabled: sinon.stub(),
758
+ updateInterpretation: sinon.stub(),
759
+ siLanguages: [],
760
+ };
761
+ });
762
+ it('should update simultaneous interpretation settings with SI and host enabled', () => {
763
+ meetingInfo.turnOnSimultaneousInterpretation = true;
764
+ meetingInfo.meetingSiteSetting = {
765
+ enableHostInterpreterControlSI: true,
766
+ };
767
+ meetingInfo.simultaneousInterpretation = {
768
+ currentSIInterpreter: true,
769
+ siLanguages: [
770
+ { languageCode: 'en', languageGroupId: 1 },
771
+ { languageCode: 'es', languageGroupId: 2 },
772
+ ],
773
+ };
482
774
 
483
- assert.isRejected(result);
484
- });
775
+ MeetingUtil.parseInterpretationInfo(meeting, meetingInfo);
776
+ assert.calledWith(meeting.simultaneousInterpretation.updateMeetingSIEnabled, true, true);
777
+ assert.calledWith(meeting.simultaneousInterpretation.updateHostSIEnabled, true);
778
+ assert.calledWith(meeting.simultaneousInterpretation.updateInterpretation, [
779
+ { languageName: 'en', languageCode: 1 },
780
+ { languageName: 'es', languageCode: 2 },
781
+ ]);
782
+ });
783
+
784
+ it('should update simultaneous interpretation settings with host SI disabled', () => {
785
+ meetingInfo.meetingSiteSetting.enableHostInterpreterControlSI = false;
786
+ meetingInfo.simultaneousInterpretation.currentSIInterpreter = false;
787
+ MeetingUtil.parseInterpretationInfo(meeting, meetingInfo);
788
+ assert.calledWith(meeting.simultaneousInterpretation.updateMeetingSIEnabled, true, false);
789
+ assert.calledWith(meeting.simultaneousInterpretation.updateHostSIEnabled, false);
790
+ assert.calledWith(meeting.simultaneousInterpretation.updateInterpretation, [
791
+ { languageName: 'en', languageCode: 1 },
792
+ { languageName: 'es', languageCode: 2 },
793
+ ]);
794
+ });
795
+ it('should update simultaneous interpretation settings with SI disabled', () => {
796
+ meetingInfo.turnOnSimultaneousInterpretation = false;
797
+ MeetingUtil.parseInterpretationInfo(meeting, meetingInfo);
798
+ assert.calledWith(meeting.simultaneousInterpretation.updateMeetingSIEnabled, false, false);
799
+ assert.calledWith(meeting.simultaneousInterpretation.updateHostSIEnabled, false);
800
+ });
801
+
802
+ it('should not update simultaneous interpretation settings for invalid input', () => {
803
+ // Call the function with invalid inputs
804
+ MeetingUtil.parseInterpretationInfo(null, null);
805
+
806
+ // Ensure that the update functions are not called
807
+ assert.notCalled(meeting.simultaneousInterpretation.updateMeetingSIEnabled);
808
+ assert.notCalled(meeting.simultaneousInterpretation.updateHostSIEnabled);
809
+ assert.notCalled(meeting.simultaneousInterpretation.updateInterpretation);
485
810
  });
486
811
  });
487
812
  });