@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.131

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 (519) hide show
  1. package/README.md +45 -1
  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 +48 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +355 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +193 -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 +43 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +994 -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 +5 -26
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +5 -26
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +6 -27
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +5 -26
  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 +5 -26
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +4 -25
  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 +5 -26
  47. package/dist/common/errors/reconnection.js.map +1 -1
  48. package/dist/common/errors/stats.js +5 -26
  49. package/dist/common/errors/stats.js.map +1 -1
  50. package/dist/common/errors/webex-errors.js +6 -41
  51. package/dist/common/errors/webex-errors.js.map +1 -1
  52. package/dist/common/errors/webex-meetings-error.js +1 -24
  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 +35 -61
  67. package/dist/common/logs/request.js.map +1 -1
  68. package/dist/common/queue.js +4 -14
  69. package/dist/common/queue.js.map +1 -1
  70. package/dist/config.js +6 -6
  71. package/dist/config.js.map +1 -1
  72. package/dist/constants.js +203 -53
  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 +294 -0
  83. package/dist/controls-options-manager/util.js.map +1 -0
  84. package/dist/index.js +72 -17
  85. package/dist/index.js.map +1 -1
  86. package/dist/locus-info/controlsUtils.js +100 -29
  87. package/dist/locus-info/controlsUtils.js.map +1 -1
  88. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  89. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  90. package/dist/locus-info/fullState.js +0 -15
  91. package/dist/locus-info/fullState.js.map +1 -1
  92. package/dist/locus-info/hostUtils.js +4 -12
  93. package/dist/locus-info/hostUtils.js.map +1 -1
  94. package/dist/locus-info/index.js +406 -216
  95. package/dist/locus-info/index.js.map +1 -1
  96. package/dist/locus-info/infoUtils.js +0 -38
  97. package/dist/locus-info/infoUtils.js.map +1 -1
  98. package/dist/locus-info/mediaSharesUtils.js +54 -38
  99. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  100. package/dist/locus-info/parser.js +88 -123
  101. package/dist/locus-info/parser.js.map +1 -1
  102. package/dist/locus-info/selfUtils.js +105 -91
  103. package/dist/locus-info/selfUtils.js.map +1 -1
  104. package/dist/media/index.js +55 -165
  105. package/dist/media/index.js.map +1 -1
  106. package/dist/media/properties.js +71 -117
  107. package/dist/media/properties.js.map +1 -1
  108. package/dist/media/util.js +2 -9
  109. package/dist/media/util.js.map +1 -1
  110. package/dist/mediaQualityMetrics/config.js +505 -495
  111. package/dist/mediaQualityMetrics/config.js.map +1 -1
  112. package/dist/meeting/in-meeting-actions.js +77 -14
  113. package/dist/meeting/in-meeting-actions.js.map +1 -1
  114. package/dist/meeting/index.js +2603 -2462
  115. package/dist/meeting/index.js.map +1 -1
  116. package/dist/meeting/locusMediaRequest.js +291 -0
  117. package/dist/meeting/locusMediaRequest.js.map +1 -0
  118. package/dist/meeting/muteState.js +292 -138
  119. package/dist/meeting/muteState.js.map +1 -1
  120. package/dist/meeting/request.js +315 -336
  121. package/dist/meeting/request.js.map +1 -1
  122. package/dist/meeting/request.type.js +7 -0
  123. package/dist/meeting/request.type.js.map +1 -0
  124. package/dist/meeting/state.js +21 -31
  125. package/dist/meeting/state.js.map +1 -1
  126. package/dist/meeting/util.js +463 -583
  127. package/dist/meeting/util.js.map +1 -1
  128. package/dist/meeting-info/collection.js +3 -25
  129. package/dist/meeting-info/collection.js.map +1 -1
  130. package/dist/meeting-info/index.js +10 -33
  131. package/dist/meeting-info/index.js.map +1 -1
  132. package/dist/meeting-info/meeting-info-v2.js +305 -286
  133. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  134. package/dist/meeting-info/request.js +1 -16
  135. package/dist/meeting-info/request.js.map +1 -1
  136. package/dist/meeting-info/util.js +98 -183
  137. package/dist/meeting-info/util.js.map +1 -1
  138. package/dist/meeting-info/utilv2.js +156 -232
  139. package/dist/meeting-info/utilv2.js.map +1 -1
  140. package/dist/meetings/collection.js +24 -20
  141. package/dist/meetings/collection.js.map +1 -1
  142. package/dist/meetings/index.js +692 -593
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +23 -42
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +186 -155
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +89 -88
  149. package/dist/member/index.js.map +1 -1
  150. package/dist/member/types.js +15 -0
  151. package/dist/member/types.js.map +1 -0
  152. package/dist/member/util.js +101 -69
  153. package/dist/member/util.js.map +1 -1
  154. package/dist/members/collection.js +12 -12
  155. package/dist/members/collection.js.map +1 -1
  156. package/dist/members/index.js +166 -205
  157. package/dist/members/index.js.map +1 -1
  158. package/dist/members/request.js +120 -85
  159. package/dist/members/request.js.map +1 -1
  160. package/dist/members/types.js +15 -0
  161. package/dist/members/types.js.map +1 -0
  162. package/dist/members/util.js +314 -260
  163. package/dist/members/util.js.map +1 -1
  164. package/dist/metrics/config.js +50 -16
  165. package/dist/metrics/config.js.map +1 -1
  166. package/dist/metrics/constants.js +4 -7
  167. package/dist/metrics/constants.js.map +1 -1
  168. package/dist/metrics/index.js +93 -162
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +167 -50
  171. package/dist/multistream/mediaRequestManager.js.map +1 -1
  172. package/dist/multistream/receiveSlot.js +58 -65
  173. package/dist/multistream/receiveSlot.js.map +1 -1
  174. package/dist/multistream/receiveSlotManager.js +74 -93
  175. package/dist/multistream/receiveSlotManager.js.map +1 -1
  176. package/dist/multistream/remoteMedia.js +55 -74
  177. package/dist/multistream/remoteMedia.js.map +1 -1
  178. package/dist/multistream/remoteMediaGroup.js +6 -40
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +466 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +32 -59
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +10 -45
  185. package/dist/personal-meeting-room/index.js.map +1 -1
  186. package/dist/personal-meeting-room/request.js +2 -33
  187. package/dist/personal-meeting-room/request.js.map +1 -1
  188. package/dist/personal-meeting-room/util.js +0 -13
  189. package/dist/personal-meeting-room/util.js.map +1 -1
  190. package/dist/reachability/index.js +190 -199
  191. package/dist/reachability/index.js.map +1 -1
  192. package/dist/reachability/request.js +14 -23
  193. package/dist/reachability/request.js.map +1 -1
  194. package/dist/reactions/constants.js +13 -0
  195. package/dist/reactions/constants.js.map +1 -0
  196. package/dist/reactions/reactions.js +2 -4
  197. package/dist/reactions/reactions.js.map +1 -1
  198. package/dist/reactions/reactions.type.js +19 -23
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +326 -465
  201. package/dist/reconnection-manager/index.js.map +1 -1
  202. package/dist/recording-controller/enums.js +17 -0
  203. package/dist/recording-controller/enums.js.map +1 -0
  204. package/dist/recording-controller/index.js +343 -0
  205. package/dist/recording-controller/index.js.map +1 -0
  206. package/dist/recording-controller/util.js +63 -0
  207. package/dist/recording-controller/util.js.map +1 -0
  208. package/dist/roap/index.js +31 -75
  209. package/dist/roap/index.js.map +1 -1
  210. package/dist/roap/request.js +129 -136
  211. package/dist/roap/request.js.map +1 -1
  212. package/dist/roap/turnDiscovery.js +143 -103
  213. package/dist/roap/turnDiscovery.js.map +1 -1
  214. package/dist/statsAnalyzer/global.js +1 -95
  215. package/dist/statsAnalyzer/global.js.map +1 -1
  216. package/dist/statsAnalyzer/index.js +369 -461
  217. package/dist/statsAnalyzer/index.js.map +1 -1
  218. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  219. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  220. package/dist/transcription/index.js +13 -45
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +35 -0
  223. package/dist/types/annotation/constants.d.ts +31 -0
  224. package/dist/types/annotation/index.d.ts +124 -0
  225. package/dist/types/breakouts/breakout.d.ts +8 -0
  226. package/dist/types/breakouts/collection.d.ts +5 -0
  227. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  228. package/dist/types/breakouts/events.d.ts +2 -0
  229. package/dist/types/breakouts/index.d.ts +5 -0
  230. package/dist/types/breakouts/request.d.ts +22 -0
  231. package/dist/types/breakouts/utils.d.ts +15 -0
  232. package/dist/types/common/browser-detection.d.ts +9 -0
  233. package/dist/types/common/collection.d.ts +48 -0
  234. package/dist/types/common/config.d.ts +2 -0
  235. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  236. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  237. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  238. package/dist/types/common/errors/media.d.ts +15 -0
  239. package/dist/types/common/errors/parameter.d.ts +15 -0
  240. package/dist/types/common/errors/password-error.d.ts +15 -0
  241. package/dist/types/common/errors/permission.d.ts +14 -0
  242. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  243. package/dist/types/common/errors/reconnection.d.ts +15 -0
  244. package/dist/types/common/errors/stats.d.ts +15 -0
  245. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  246. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  247. package/dist/types/common/events/events-scope.d.ts +17 -0
  248. package/dist/types/common/events/events.d.ts +12 -0
  249. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  250. package/dist/types/common/events/util.d.ts +2 -0
  251. package/dist/types/common/logs/logger-config.d.ts +2 -0
  252. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  253. package/dist/types/common/logs/request.d.ts +34 -0
  254. package/dist/types/common/queue.d.ts +32 -0
  255. package/dist/types/config.d.ts +78 -0
  256. package/dist/types/constants.d.ts +993 -0
  257. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  258. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  259. package/dist/types/controls-options-manager/index.d.ts +136 -0
  260. package/dist/types/controls-options-manager/types.d.ts +43 -0
  261. package/dist/types/controls-options-manager/util.d.ts +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  264. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  265. package/dist/types/locus-info/fullState.d.ts +2 -0
  266. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  267. package/dist/types/locus-info/index.d.ts +315 -0
  268. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  269. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  270. package/dist/types/locus-info/parser.d.ts +212 -0
  271. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  272. package/dist/types/media/index.d.ts +34 -0
  273. package/dist/types/media/properties.d.ts +108 -0
  274. package/dist/types/media/util.d.ts +2 -0
  275. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  276. package/dist/types/meeting/in-meeting-actions.d.ts +147 -0
  277. package/dist/types/meeting/index.d.ts +1762 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +186 -0
  280. package/dist/types/meeting/request.d.ts +269 -0
  281. package/dist/types/meeting/request.type.d.ts +11 -0
  282. package/dist/types/meeting/state.d.ts +9 -0
  283. package/dist/types/meeting/util.d.ts +76 -0
  284. package/dist/types/meeting-info/collection.d.ts +20 -0
  285. package/dist/types/meeting-info/index.d.ts +57 -0
  286. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  287. package/dist/types/meeting-info/request.d.ts +22 -0
  288. package/dist/types/meeting-info/util.d.ts +2 -0
  289. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  290. package/dist/types/meetings/collection.d.ts +31 -0
  291. package/dist/types/meetings/index.d.ts +345 -0
  292. package/dist/types/meetings/request.d.ts +27 -0
  293. package/dist/types/meetings/util.d.ts +18 -0
  294. package/dist/types/member/index.d.ts +157 -0
  295. package/dist/types/member/types.d.ts +21 -0
  296. package/dist/types/member/util.d.ts +2 -0
  297. package/dist/types/members/collection.d.ts +29 -0
  298. package/dist/types/members/index.d.ts +353 -0
  299. package/dist/types/members/request.d.ts +114 -0
  300. package/dist/types/members/types.d.ts +24 -0
  301. package/dist/types/members/util.d.ts +210 -0
  302. package/dist/types/metrics/config.d.ts +195 -0
  303. package/dist/types/metrics/constants.d.ts +55 -0
  304. package/dist/types/metrics/index.d.ts +169 -0
  305. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  306. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  307. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  308. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  309. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  310. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  311. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  312. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  313. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  314. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  315. package/dist/types/reachability/index.d.ts +152 -0
  316. package/dist/types/reachability/request.d.ts +37 -0
  317. package/dist/types/reactions/constants.d.ts +3 -0
  318. package/dist/types/reactions/reactions.d.ts +4 -0
  319. package/dist/types/reactions/reactions.type.d.ts +52 -0
  320. package/dist/types/reconnection-manager/index.d.ts +126 -0
  321. package/dist/types/recording-controller/enums.d.ts +7 -0
  322. package/dist/types/recording-controller/index.d.ts +193 -0
  323. package/dist/types/recording-controller/util.d.ts +13 -0
  324. package/dist/types/roap/index.d.ts +77 -0
  325. package/dist/types/roap/request.d.ts +36 -0
  326. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  327. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  328. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  329. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  330. package/dist/types/transcription/index.d.ts +64 -0
  331. package/internal-README.md +7 -6
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +42 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +339 -0
  336. package/src/breakouts/README.md +220 -0
  337. package/src/breakouts/breakout.ts +163 -0
  338. package/src/breakouts/collection.ts +19 -0
  339. package/src/breakouts/edit-lock-error.ts +25 -0
  340. package/src/breakouts/events.ts +37 -0
  341. package/src/breakouts/index.ts +860 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/browser-detection.ts +9 -6
  345. package/src/common/collection.ts +3 -1
  346. package/src/common/errors/captcha-error.ts +6 -6
  347. package/src/common/errors/intent-to-join.ts +6 -6
  348. package/src/common/errors/join-meeting.ts +12 -8
  349. package/src/common/errors/media.ts +6 -6
  350. package/src/common/errors/parameter.ts +9 -6
  351. package/src/common/errors/password-error.ts +6 -6
  352. package/src/common/errors/permission.ts +5 -5
  353. package/src/common/errors/reconnection.ts +6 -6
  354. package/src/common/errors/stats.ts +6 -6
  355. package/src/common/errors/webex-errors.ts +7 -5
  356. package/src/common/errors/webex-meetings-error.ts +1 -1
  357. package/src/common/events/events-scope.ts +5 -1
  358. package/src/common/events/events.ts +5 -1
  359. package/src/common/events/trigger-proxy.ts +8 -3
  360. package/src/common/events/util.ts +1 -2
  361. package/src/common/logs/logger-proxy.ts +21 -10
  362. package/src/common/logs/request.ts +11 -8
  363. package/src/config.ts +16 -12
  364. package/src/constants.ts +153 -7
  365. package/src/controls-options-manager/constants.ts +5 -0
  366. package/src/controls-options-manager/enums.ts +18 -0
  367. package/src/controls-options-manager/index.ts +278 -0
  368. package/src/controls-options-manager/types.ts +59 -0
  369. package/src/controls-options-manager/util.ts +281 -0
  370. package/src/index.ts +33 -0
  371. package/src/locus-info/controlsUtils.ts +142 -24
  372. package/src/locus-info/fullState.ts +15 -11
  373. package/src/locus-info/hostUtils.ts +4 -3
  374. package/src/locus-info/index.ts +346 -55
  375. package/src/locus-info/infoUtils.ts +12 -4
  376. package/src/locus-info/mediaSharesUtils.ts +52 -4
  377. package/src/locus-info/parser.ts +46 -68
  378. package/src/locus-info/selfUtils.ts +195 -56
  379. package/src/media/index.ts +139 -196
  380. package/src/media/properties.ts +43 -36
  381. package/src/media/util.ts +1 -1
  382. package/src/mediaQualityMetrics/config.ts +380 -378
  383. package/src/meeting/in-meeting-actions.ts +159 -3
  384. package/src/meeting/index.ts +2803 -1584
  385. package/src/meeting/locusMediaRequest.ts +309 -0
  386. package/src/meeting/muteState.ts +290 -72
  387. package/src/meeting/request.ts +247 -178
  388. package/src/meeting/request.type.ts +13 -0
  389. package/src/meeting/state.ts +45 -30
  390. package/src/meeting/util.ts +445 -395
  391. package/src/meeting-info/collection.ts +2 -1
  392. package/src/meeting-info/index.ts +32 -30
  393. package/src/meeting-info/meeting-info-v2.ts +235 -116
  394. package/src/meeting-info/request.ts +9 -3
  395. package/src/meeting-info/util.ts +54 -46
  396. package/src/meeting-info/utilv2.ts +71 -55
  397. package/src/meetings/collection.ts +21 -1
  398. package/src/meetings/index.ts +772 -437
  399. package/src/meetings/request.ts +29 -25
  400. package/src/meetings/util.ts +132 -33
  401. package/src/member/index.ts +95 -49
  402. package/src/member/types.ts +24 -0
  403. package/src/member/util.ts +106 -13
  404. package/src/members/collection.ts +8 -1
  405. package/src/members/index.ts +288 -130
  406. package/src/members/request.ts +144 -31
  407. package/src/members/types.ts +28 -0
  408. package/src/members/util.ts +316 -235
  409. package/src/metrics/config.ts +302 -90
  410. package/src/metrics/constants.ts +2 -6
  411. package/src/metrics/index.ts +124 -95
  412. package/src/multistream/mediaRequestManager.ts +203 -45
  413. package/src/multistream/receiveSlot.ts +69 -26
  414. package/src/multistream/receiveSlotManager.ts +62 -38
  415. package/src/multistream/remoteMedia.ts +30 -4
  416. package/src/multistream/remoteMediaGroup.ts +4 -3
  417. package/src/multistream/remoteMediaManager.ts +230 -66
  418. package/src/networkQualityMonitor/index.ts +24 -27
  419. package/src/personal-meeting-room/index.ts +12 -16
  420. package/src/personal-meeting-room/request.ts +10 -3
  421. package/src/personal-meeting-room/util.ts +3 -3
  422. package/src/reachability/index.ts +131 -79
  423. package/src/reachability/request.ts +43 -34
  424. package/src/reactions/constants.ts +4 -0
  425. package/src/reactions/reactions.ts +8 -8
  426. package/src/reactions/reactions.type.ts +31 -5
  427. package/src/reconnection-manager/index.ts +193 -111
  428. package/src/recording-controller/enums.ts +8 -0
  429. package/src/recording-controller/index.ts +315 -0
  430. package/src/recording-controller/util.ts +58 -0
  431. package/src/roap/index.ts +53 -53
  432. package/src/roap/request.ts +77 -64
  433. package/src/roap/turnDiscovery.ts +101 -48
  434. package/src/statsAnalyzer/global.ts +8 -104
  435. package/src/statsAnalyzer/index.ts +624 -376
  436. package/src/statsAnalyzer/mqaUtil.ts +203 -90
  437. package/src/transcription/index.ts +34 -32
  438. package/test/integration/spec/converged-space-meetings.js +177 -0
  439. package/test/integration/spec/journey.js +670 -466
  440. package/test/integration/spec/space-meeting.js +320 -204
  441. package/test/integration/spec/transcription.js +7 -8
  442. package/test/unit/spec/annotation/index.ts +433 -0
  443. package/test/unit/spec/breakouts/breakout.ts +203 -0
  444. package/test/unit/spec/breakouts/collection.ts +15 -0
  445. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  446. package/test/unit/spec/breakouts/events.ts +77 -0
  447. package/test/unit/spec/breakouts/index.ts +1609 -0
  448. package/test/unit/spec/breakouts/request.ts +104 -0
  449. package/test/unit/spec/breakouts/utils.js +72 -0
  450. package/test/unit/spec/common/browser-detection.js +9 -28
  451. package/test/unit/spec/controls-options-manager/index.js +287 -0
  452. package/test/unit/spec/controls-options-manager/util.js +504 -0
  453. package/test/unit/spec/fixture/locus.js +93 -90
  454. package/test/unit/spec/locus-info/controlsUtils.js +305 -32
  455. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  456. package/test/unit/spec/locus-info/index.js +636 -5
  457. package/test/unit/spec/locus-info/infoUtils.js +26 -33
  458. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  459. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  460. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  461. package/test/unit/spec/locus-info/parser.js +3 -9
  462. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  463. package/test/unit/spec/locus-info/selfUtils.js +252 -12
  464. package/test/unit/spec/media/index.ts +104 -8
  465. package/test/unit/spec/media/properties.ts +9 -9
  466. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -3
  467. package/test/unit/spec/meeting/index.js +3112 -921
  468. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  469. package/test/unit/spec/meeting/muteState.js +421 -94
  470. package/test/unit/spec/meeting/request.js +421 -79
  471. package/test/unit/spec/meeting/utils.js +326 -189
  472. package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
  473. package/test/unit/spec/meeting-info/request.js +7 -9
  474. package/test/unit/spec/meeting-info/util.js +11 -12
  475. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  476. package/test/unit/spec/meetings/collection.js +15 -1
  477. package/test/unit/spec/meetings/index.js +1126 -328
  478. package/test/unit/spec/meetings/utils.js +220 -14
  479. package/test/unit/spec/member/index.js +24 -1
  480. package/test/unit/spec/member/util.js +383 -32
  481. package/test/unit/spec/members/index.js +424 -55
  482. package/test/unit/spec/members/request.js +228 -40
  483. package/test/unit/spec/members/utils.js +191 -4
  484. package/test/unit/spec/metrics/index.js +113 -20
  485. package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
  486. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  487. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  488. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  489. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  490. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  491. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  492. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  493. package/test/unit/spec/reachability/index.ts +176 -27
  494. package/test/unit/spec/reachability/request.js +66 -0
  495. package/test/unit/spec/reconnection-manager/index.js +62 -31
  496. package/test/unit/spec/recording-controller/index.js +231 -0
  497. package/test/unit/spec/recording-controller/util.js +102 -0
  498. package/test/unit/spec/roap/index.ts +19 -49
  499. package/test/unit/spec/roap/request.ts +187 -0
  500. package/test/unit/spec/roap/turnDiscovery.ts +92 -50
  501. package/test/unit/spec/stats-analyzer/index.js +116 -60
  502. package/test/utils/cmr.js +44 -42
  503. package/test/utils/constants.js +9 -0
  504. package/test/utils/integrationTestUtils.js +64 -0
  505. package/test/utils/testUtils.js +63 -99
  506. package/test/utils/webex-config.js +22 -18
  507. package/test/utils/webex-test-users.js +57 -50
  508. package/tsconfig.json +6 -0
  509. package/dist/media/internal-media-core-wrapper.js +0 -22
  510. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  511. package/dist/meeting/effectsState.js +0 -334
  512. package/dist/meeting/effectsState.js.map +0 -1
  513. package/dist/multistream/multistreamMedia.js +0 -116
  514. package/dist/multistream/multistreamMedia.js.map +0 -1
  515. package/src/index.js +0 -15
  516. package/src/media/internal-media-core-wrapper.ts +0 -9
  517. package/src/meeting/effectsState.ts +0 -211
  518. package/src/multistream/multistreamMedia.ts +0 -92
  519. package/test/unit/spec/meeting/effectsState.js +0 -291
@@ -0,0 +1,860 @@
1
+ /*!
2
+ * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.
3
+ */
4
+ import {WebexPlugin} from '@webex/webex-core';
5
+ import {debounce, forEach} from 'lodash';
6
+ import LoggerProxy from '../common/logs/logger-proxy';
7
+
8
+ import {BREAKOUTS, MEETINGS, HTTP_VERBS, _ID_} from '../constants';
9
+
10
+ import Breakout from './breakout';
11
+ import BreakoutCollection from './collection';
12
+ import BreakoutRequest from './request';
13
+ import breakoutEvent from './events';
14
+ import {boServiceErrorHandler, isSessionTypeChangedFromSessionToMain} from './utils';
15
+
16
+ /**
17
+ * @class Breakouts
18
+ */
19
+ const Breakouts = WebexPlugin.extend({
20
+ namespace: MEETINGS,
21
+ breakoutRequest: BreakoutRequest,
22
+ collections: {
23
+ breakouts: BreakoutCollection,
24
+ },
25
+
26
+ props: {
27
+ allowBackToMain: 'boolean', // only present when in a breakout session
28
+ delayCloseTime: 'number', // appears once breakouts start
29
+ enableBreakoutSession: 'boolean', // appears from the moment you enable breakouts
30
+ hasBreakoutPreAssignments: 'boolean', // appears from the moment you enable breakouts
31
+ groupId: 'string', // appears from the moment you enable breakouts
32
+ name: 'string', // only present when in a breakout session
33
+ sessionId: 'string', // appears from the moment you enable breakouts
34
+ sessionType: 'string', // appears from the moment you enable breakouts
35
+ startTime: 'string', // appears once breakouts start
36
+ status: 'string', // only present when in a breakout session
37
+ url: 'string', // appears from the moment you enable breakouts
38
+ locusUrl: 'string', // the current locus url
39
+ breakoutServiceUrl: 'string', // the current breakout resource url
40
+ mainLocusUrl: 'string', // the locus url of the main session
41
+ groups: 'array', // appears when create breakouts
42
+ manageGroups: 'array', // appears when manage breakouts
43
+ preAssignments: 'array', // appears when getPreAssignments info hasBreakoutPreAssignments = true
44
+ shouldFetchPreassignments: 'boolean', // Controlling the lifecycle of the pre-assign API
45
+ editLock: 'object', // appears when getBreakout info editlock = true
46
+ intervalID: 'number',
47
+ meetingId: 'string',
48
+ },
49
+ children: {
50
+ currentBreakoutSession: Breakout,
51
+ },
52
+
53
+ derived: {
54
+ isInMainSession: {
55
+ cache: false,
56
+ deps: ['sessionType'],
57
+ /**
58
+ * Returns true if the user is in the main session
59
+ * @returns {boolean}
60
+ */
61
+ fn() {
62
+ return this.sessionType === BREAKOUTS.SESSION_TYPES.MAIN;
63
+ },
64
+ },
65
+ isActiveBreakout: {
66
+ cache: false, // fix issue: sometimes the derived will not change even if the deps changed
67
+ deps: ['sessionType', 'status'],
68
+ /**
69
+ * Returns true if the breakout status is active
70
+ * @returns {boolean}
71
+ */
72
+ fn() {
73
+ return (
74
+ this.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT &&
75
+ (this.status === BREAKOUTS.STATUS.OPEN || this.status === BREAKOUTS.STATUS.CLOSING)
76
+ );
77
+ },
78
+ },
79
+ breakoutGroupId: {
80
+ cache: false,
81
+ deps: ['manageGroups'],
82
+ /**
83
+ * Returns the actived group id
84
+ * @returns {boolean}
85
+ */
86
+ fn() {
87
+ if (this.manageGroups?.length) {
88
+ return this.manageGroups[0].status !== BREAKOUTS.STATUS.CLOSED
89
+ ? this.manageGroups[0].id
90
+ : '';
91
+ }
92
+
93
+ return '';
94
+ },
95
+ },
96
+ breakoutStatus: {
97
+ cache: false,
98
+ deps: ['isInMainSession', 'status', 'groups'],
99
+ /**
100
+ * Returns the breakout status
101
+ * @returns {boolean}
102
+ */
103
+ fn() {
104
+ return this.isInMainSession ? this.groups?.[0]?.status : this.status;
105
+ },
106
+ },
107
+ },
108
+
109
+ /**
110
+ * initialize for the breakouts
111
+ * @returns {void}
112
+ */
113
+ initialize() {
114
+ this.listenTo(this, 'change:breakoutStatus', () => {
115
+ if (this.breakoutStatus === BREAKOUTS.STATUS.CLOSING) {
116
+ this.trigger(BREAKOUTS.EVENTS.BREAKOUTS_CLOSING);
117
+ }
118
+ });
119
+ this.debouncedQueryRosters = debounce(this.queryRosters, 10, {
120
+ leading: true,
121
+ trailing: false,
122
+ });
123
+ this.listenTo(this.breakouts, 'add', (breakout) => {
124
+ this.debouncedQueryRosters();
125
+ this.triggerReturnToMainEvent(breakout);
126
+ });
127
+ this.listenTo(this.breakouts, 'change:requestedLastModifiedTime', (breakout) => {
128
+ this.triggerReturnToMainEvent(breakout);
129
+ });
130
+ this.listenToCurrentSessionTypeChange();
131
+ this.listenToBroadcastMessages();
132
+ this.listenToBreakoutRosters();
133
+ this.listenToBreakoutHelp();
134
+ // @ts-ignore
135
+ this.breakoutRequest = new BreakoutRequest({webex: this.webex});
136
+ },
137
+
138
+ /**
139
+ * Calls this to clean up listeners
140
+ * @returns {void}
141
+ */
142
+ cleanUp() {
143
+ this.stopListening();
144
+ },
145
+
146
+ /**
147
+ * Update the current locus url of the meeting
148
+ * @param {string} locusUrl // locus url
149
+ * @returns {void}
150
+ */
151
+ locusUrlUpdate(locusUrl) {
152
+ this.set('locusUrl', locusUrl);
153
+ const {isInMainSession, mainLocusUrl} = this;
154
+ if (isInMainSession || !mainLocusUrl) {
155
+ this.set('mainLocusUrl', locusUrl);
156
+ }
157
+ },
158
+
159
+ /**
160
+ * Update the current breakout resource url
161
+ * @param {string} breakoutServiceUrl
162
+ * @returns {void}
163
+ */
164
+ breakoutServiceUrlUpdate(breakoutServiceUrl) {
165
+ this.set('breakoutServiceUrl', `${breakoutServiceUrl}/breakout/`);
166
+ },
167
+
168
+ /**
169
+ * The initial roster lists need to be queried because you don't
170
+ * get a breakout.roster event when you join the meeting
171
+ * @returns {void}
172
+ */
173
+ queryRosters() {
174
+ this.webex
175
+ .request({uri: `${this.url}/roster`, qs: {locusUrl: btoa(this.locusUrl)}})
176
+ .then((result) => {
177
+ const {
178
+ body: {rosters},
179
+ } = result;
180
+
181
+ rosters?.forEach(({locus}) => {
182
+ this.handleRosterUpdate(locus);
183
+ });
184
+
185
+ this.trigger(BREAKOUTS.EVENTS.MEMBERS_UPDATE);
186
+ })
187
+ .catch((error) => {
188
+ LoggerProxy.logger.error('Meeting:breakouts#queryRosters failed', error);
189
+ });
190
+ },
191
+
192
+ /**
193
+ *
194
+ * @param {Object} locus // locus object
195
+ * @returns {void}
196
+ */
197
+ handleRosterUpdate(locus) {
198
+ const sessionId = locus.controls?.breakout?.sessionId;
199
+
200
+ const session = this.breakouts.get(sessionId);
201
+
202
+ if (!session) {
203
+ return;
204
+ }
205
+
206
+ session.parseRoster(locus);
207
+ },
208
+ /**
209
+ *Sets up listener for currentBreakoutSession sessionType changed
210
+ * @returns {void}
211
+ */
212
+ listenToCurrentSessionTypeChange(): void {
213
+ this.listenTo(
214
+ this.currentBreakoutSession,
215
+ 'change:sessionType',
216
+ (currentBreakoutSession, sessionType) => {
217
+ if (isSessionTypeChangedFromSessionToMain(currentBreakoutSession, sessionType)) {
218
+ this.trigger(BREAKOUTS.EVENTS.LEAVE_BREAKOUT);
219
+ }
220
+ }
221
+ );
222
+ },
223
+
224
+ /**
225
+ * Sets up listener for broadcast messages sent to the breakout session
226
+ * @returns {void}
227
+ */
228
+ listenToBroadcastMessages() {
229
+ this.listenTo(this.webex.internal.llm, 'event:breakout.message', (event) => {
230
+ const {
231
+ data: {senderUserId, sentTime, message},
232
+ } = event;
233
+
234
+ this.trigger(BREAKOUTS.EVENTS.MESSAGE, {
235
+ senderUserId,
236
+ sentTime,
237
+ message,
238
+ // FIXME: This is only the current sessionId
239
+ // We'd need to check that the dataChannelUrl is still the same
240
+ // to guarantee that this message was sent to this session
241
+ sessionId: this.currentBreakoutSession.sessionId,
242
+ });
243
+ });
244
+ },
245
+
246
+ /**
247
+ * Sets up a listener for roster messags from mecury
248
+ * @returns {void}
249
+ */
250
+ listenToBreakoutRosters() {
251
+ this.listenTo(this.webex.internal.mercury, 'event:breakout.roster', (event) => {
252
+ this.handleRosterUpdate(event.data.locus);
253
+ this.trigger(BREAKOUTS.EVENTS.MEMBERS_UPDATE);
254
+ });
255
+ },
256
+
257
+ /**
258
+ * Sets up a listener for ask help notify from mecury
259
+ * @returns {void}
260
+ */
261
+ listenToBreakoutHelp() {
262
+ this.listenTo(this.webex.internal.mercury, 'event:breakout.help', (event) => {
263
+ const {
264
+ data: {participant, sessionId},
265
+ } = event;
266
+ this.trigger(BREAKOUTS.EVENTS.ASK_FOR_HELP, {participant, sessionId});
267
+ });
268
+ },
269
+
270
+ /**
271
+ * Updates the information about the current breakout
272
+ * @param {Object} params
273
+ * @returns {void}
274
+ */
275
+ updateBreakout(params) {
276
+ const preEnableBreakoutSession = this.get('enableBreakoutSession');
277
+ this.set(params);
278
+
279
+ // These values are set manually so they are unset when they are not included in params
280
+ this.set('groups', params.groups);
281
+ this.set('startTime', params.startTime);
282
+ this.set('status', params.status);
283
+
284
+ this.set('currentBreakoutSession', {
285
+ sessionId: params.sessionId,
286
+ groupId: params.groupId,
287
+ name: params.name,
288
+ current: true,
289
+ sessionType: params.sessionType,
290
+ url: params.url,
291
+ [BREAKOUTS.SESSION_STATES.ACTIVE]: false,
292
+ [BREAKOUTS.SESSION_STATES.ALLOWED]: false,
293
+ [BREAKOUTS.SESSION_STATES.ALLOWED]: false,
294
+ [BREAKOUTS.SESSION_STATES.ASSIGNED_CURRENT]: false,
295
+ [BREAKOUTS.SESSION_STATES.REQUESTED]: false,
296
+ });
297
+
298
+ // We need to call queryPreAssignments when enableBreakoutSession become true
299
+ if (preEnableBreakoutSession !== params.enableBreakoutSession) {
300
+ this.queryPreAssignments(params);
301
+ }
302
+
303
+ if (
304
+ this.currentBreakoutSession.previous('sessionId') !== this.currentBreakoutSession.sessionId ||
305
+ this.currentBreakoutSession.previous('groupId') !== this.currentBreakoutSession.groupId
306
+ ) {
307
+ // should report joined session changed
308
+ const meeting = this.webex.meetings.getMeetingByType(_ID_, this.meetingId);
309
+ breakoutEvent.onBreakoutJoinResponse({
310
+ currentSession: this.currentBreakoutSession,
311
+ meeting,
312
+ breakoutMoveId: params.breakoutMoveId,
313
+ });
314
+ }
315
+ },
316
+
317
+ /**
318
+ * Updates the information about available breakouts
319
+ * @param {Object} payload
320
+ * @returns {void}
321
+ */
322
+ updateBreakoutSessions(payload) {
323
+ const breakouts = {};
324
+
325
+ if (payload.breakoutSessions) {
326
+ forEach(BREAKOUTS.SESSION_STATES, (state) => {
327
+ forEach(payload.breakoutSessions[state], (breakout) => {
328
+ const {sessionId} = breakout;
329
+
330
+ if (!breakouts[sessionId]) {
331
+ breakouts[sessionId] = breakout;
332
+ breakouts[sessionId][BREAKOUTS.SESSION_STATES.ACTIVE] = false;
333
+ breakouts[sessionId][BREAKOUTS.SESSION_STATES.ASSIGNED] = false;
334
+ breakouts[sessionId][BREAKOUTS.SESSION_STATES.ALLOWED] = false;
335
+ breakouts[sessionId][BREAKOUTS.SESSION_STATES.ASSIGNED_CURRENT] = false;
336
+ breakouts[sessionId][BREAKOUTS.SESSION_STATES.REQUESTED] = false;
337
+ }
338
+
339
+ breakouts[sessionId][state] = true;
340
+
341
+ if (state === BREAKOUTS.SESSION_STATES.REQUESTED) {
342
+ breakouts[sessionId].requestedLastModifiedTime = breakout.modifiedAt;
343
+ }
344
+ });
345
+ });
346
+ }
347
+
348
+ forEach(breakouts, (breakout: typeof Breakout) => {
349
+ // eslint-disable-next-line no-param-reassign
350
+ breakout.url = this.url;
351
+ });
352
+
353
+ this.breakouts.set(Object.values(breakouts));
354
+ },
355
+ /**
356
+ * get main session
357
+ * @returns {Breakout}
358
+ */
359
+ getMainSession() {
360
+ if (this.isInMainSession) {
361
+ return this.currentBreakoutSession;
362
+ }
363
+
364
+ const mainSession = this.breakouts.filter((breakout) => breakout.isMain)[0];
365
+ if (!mainSession) {
366
+ throw new Error('no main session found');
367
+ }
368
+
369
+ return mainSession;
370
+ },
371
+ /**
372
+ * Host/CoHost ask all participants return to main session
373
+ * @returns {Promise}
374
+ */
375
+ askAllToReturn() {
376
+ const mainSession = this.getMainSession();
377
+
378
+ return this.webex.request({
379
+ method: HTTP_VERBS.POST,
380
+ uri: `${this.url}/requestMove`,
381
+ body: {
382
+ groupId: mainSession.groupId,
383
+ sessionId: mainSession.sessionId,
384
+ },
385
+ });
386
+ },
387
+
388
+ /**
389
+ * Broadcast message to all breakout session's participants
390
+ * @param {String} message
391
+ * @param {Object} options
392
+ * @returns {Promise}
393
+ */
394
+ broadcast(message, options) {
395
+ const {breakoutGroupId} = this;
396
+ if (!breakoutGroupId) {
397
+ throw new Error('Cannot broadcast, no breakout session found');
398
+ }
399
+
400
+ return this.breakoutRequest.broadcast({
401
+ url: this.url,
402
+ message,
403
+ options,
404
+ groupId: breakoutGroupId,
405
+ });
406
+ },
407
+ /**
408
+ * Make enable breakout resource
409
+ * @returns {Promise}
410
+ */
411
+ enableBreakouts() {
412
+ if (this.breakoutServiceUrl) {
413
+ // @ts-ignore
414
+ return this.webex
415
+ .request({
416
+ method: HTTP_VERBS.POST,
417
+ uri: this.breakoutServiceUrl,
418
+ body: {
419
+ locusUrl: this.locusUrl,
420
+ },
421
+ })
422
+ .catch((err) => {
423
+ LoggerProxy.logger.error(
424
+ `Meeting:request#touchBreakout --> Error provisioning error ${err}`
425
+ );
426
+ throw err;
427
+ });
428
+ }
429
+
430
+ return Promise.reject(new Error(`enableBreakouts: the breakoutServiceUrl is empty`));
431
+ },
432
+
433
+ /**
434
+ * Make the meeting enable or disable breakout session
435
+ * @param {boolean} enable
436
+ * @returns {Promise}
437
+ */
438
+ async toggleBreakout(enable) {
439
+ if (this.enableBreakoutSession === undefined) {
440
+ const info = await this.enableBreakouts();
441
+ if (!enable) {
442
+ // if enable is false, updateBreakout set the param then set enableBreakoutSession as false
443
+ this.updateBreakout(info.body);
444
+ await this.doToggleBreakout(enable);
445
+ }
446
+ } else {
447
+ await this.doToggleBreakout(enable);
448
+ }
449
+ },
450
+
451
+ /**
452
+ * do toggle meeting breakout session enable or disable
453
+ * @param {boolean} enable
454
+ * @returns {Promise}
455
+ */
456
+ doToggleBreakout(enable) {
457
+ const body = {
458
+ ...(this.editLock && !!this.editLock.token ? {editlock: {token: this.editLock.token}} : {}),
459
+ ...{enableBreakoutSession: enable},
460
+ };
461
+
462
+ // @ts-ignore
463
+ return this.webex.request({
464
+ method: HTTP_VERBS.PUT,
465
+ uri: this.url,
466
+ body,
467
+ });
468
+ },
469
+
470
+ /**
471
+ * set groups to manageGroups prop
472
+ * @param {Object} breakoutInfo -- breakout groups
473
+ * @returns {void}
474
+ */
475
+ _setManageGroups(breakoutInfo) {
476
+ if (breakoutInfo?.body?.groups) {
477
+ this.set('manageGroups', breakoutInfo.body.groups);
478
+ }
479
+ },
480
+
481
+ /**
482
+ * Create new breakout sessions
483
+ * @param {object} params -- breakout session group
484
+ * @returns {Promise}
485
+ */
486
+ async create(params) {
487
+ const payload = {...params};
488
+ const body = {
489
+ ...(this.editLock && !!this.editLock.token ? {editlock: {token: this.editLock.token}} : {}),
490
+ ...{groups: [payload]},
491
+ };
492
+ // @ts-ignore
493
+ const breakoutInfo = await this.webex
494
+ .request({
495
+ method: HTTP_VERBS.PUT,
496
+ uri: this.url,
497
+ body,
498
+ })
499
+ .catch((error) => {
500
+ return Promise.reject(boServiceErrorHandler(error, 'Breakouts#create'));
501
+ });
502
+
503
+ this._setManageGroups(breakoutInfo);
504
+
505
+ // clear edit lock info after save breakout session info
506
+ this._clearEditLockInfo();
507
+
508
+ return breakoutInfo;
509
+ },
510
+
511
+ /**
512
+ * Delete all breakout sessions
513
+ * @returns {Promise}
514
+ */
515
+ async clearSessions() {
516
+ const body = {
517
+ ...(this.editLock && !!this.editLock.token ? {editlock: {token: this.editLock.token}} : {}),
518
+ ...{groups: [{action: BREAKOUTS.ACTION.DELETE}]},
519
+ };
520
+ // @ts-ignore
521
+ const breakoutInfo = await this.webex
522
+ .request({
523
+ method: HTTP_VERBS.PUT,
524
+ uri: this.url,
525
+ body,
526
+ })
527
+ .catch((error) => {
528
+ return Promise.reject(boServiceErrorHandler(error, 'Breakouts#clearSessions'));
529
+ });
530
+
531
+ this._setManageGroups(breakoutInfo);
532
+ this.shouldFetchPreassignments = false;
533
+
534
+ return breakoutInfo;
535
+ },
536
+
537
+ /**
538
+ * Host or cohost starts breakout sessions
539
+ * @param {object} params
540
+ * @returns {Promise}
541
+ */
542
+ async start(params = {}) {
543
+ const action = BREAKOUTS.ACTION.START;
544
+ const payload = {
545
+ id: this.breakoutGroupId,
546
+ action,
547
+ allowBackToMain: false,
548
+ allowToJoinLater: false,
549
+ ...params,
550
+ };
551
+
552
+ const body = {
553
+ ...(this.editLock && !!this.editLock.token
554
+ ? {editlock: {token: this.editLock.token, refresh: true}}
555
+ : {}),
556
+ ...{groups: [payload]},
557
+ };
558
+
559
+ const breakoutInfo = await this.request({
560
+ method: HTTP_VERBS.PUT,
561
+ uri: this.url,
562
+ body,
563
+ }).catch((error) => {
564
+ return Promise.reject(boServiceErrorHandler(error, 'Breakouts#start'));
565
+ });
566
+
567
+ this._setManageGroups(breakoutInfo);
568
+
569
+ return breakoutInfo;
570
+ },
571
+
572
+ /**
573
+ * Host or cohost ends breakout sessions
574
+ * @param {object} params
575
+ * @returns {Promise}
576
+ */
577
+ async end(params = {}) {
578
+ const {delayCloseTime, breakoutGroupId: id} = this;
579
+ const action = BREAKOUTS.ACTION.CLOSE;
580
+ const payload = {
581
+ id,
582
+ action,
583
+ delayCloseTime,
584
+ ...params,
585
+ };
586
+
587
+ const body = {
588
+ ...(this.editLock && !!this.editLock.token
589
+ ? {editlock: {token: this.editLock.token, refresh: true}}
590
+ : {}),
591
+ ...{groups: [payload]},
592
+ };
593
+
594
+ const breakoutInfo = await this.request({
595
+ method: HTTP_VERBS.PUT,
596
+ uri: this.url,
597
+ body,
598
+ }).catch((error) => {
599
+ return Promise.reject(boServiceErrorHandler(error, 'Breakouts#end'));
600
+ });
601
+
602
+ this._setManageGroups(breakoutInfo);
603
+
604
+ return breakoutInfo;
605
+ },
606
+
607
+ /**
608
+ * Host or cohost update breakout sessions
609
+ * @param {Object} params
610
+ * @param {String} params.id
611
+ * @param {Boolean} unlockEdit
612
+ * @returns {Promise}
613
+ */
614
+ async update(params: {id: string}, unlockEdit?: boolean) {
615
+ if (!params.id) {
616
+ return Promise.reject(new Error('Missing breakout group id'));
617
+ }
618
+ const payload = {...params};
619
+
620
+ const body = {
621
+ ...(this.editLock?.token
622
+ ? {editlock: {token: this.editLock.token, refresh: !unlockEdit}}
623
+ : {}),
624
+ ...{groups: [payload]},
625
+ };
626
+
627
+ const breakoutInfo = await this.request({
628
+ method: HTTP_VERBS.PUT,
629
+ uri: this.url,
630
+ body,
631
+ }).catch((error) => {
632
+ return Promise.reject(boServiceErrorHandler(error, 'Breakouts#update'));
633
+ });
634
+
635
+ if (unlockEdit) {
636
+ this._clearEditLockInfo();
637
+ }
638
+
639
+ this._setManageGroups(breakoutInfo);
640
+
641
+ return breakoutInfo;
642
+ },
643
+
644
+ /**
645
+ * get existed breakout sessions
646
+ * @param {boolean} editlock -- lock operations of the breakout sessions
647
+ * @returns {Promise}
648
+ */
649
+ async getBreakout(editlock) {
650
+ const breakout = await this.request({
651
+ method: HTTP_VERBS.GET,
652
+ uri: this.url + (editlock ? `?editlock=${editlock}` : ''),
653
+ });
654
+
655
+ this._setManageGroups(breakout);
656
+ if (editlock && breakout.body?.editlock?.token) {
657
+ this.set('editLock', breakout.body.editlock);
658
+ this.keepEditLockAlive();
659
+ }
660
+
661
+ return breakout;
662
+ },
663
+
664
+ /**
665
+ * enable and edit lock breakout
666
+ * @returns {void}
667
+ */
668
+ async enableAndLockBreakout() {
669
+ if (this.enableBreakoutSession) {
670
+ this.lockBreakout();
671
+ } else {
672
+ const info = await this.enableBreakouts();
673
+
674
+ if (info.body) {
675
+ this.lockBreakout();
676
+ }
677
+ }
678
+ },
679
+
680
+ /**
681
+ * send breakout edit lock
682
+ * @returns {void}
683
+ */
684
+ async lockBreakout() {
685
+ if (this.editLock && !!this.editLock.token) {
686
+ if (this.editLock.state === BREAKOUTS.EDIT_LOCK_STATUS.LOCKED) {
687
+ throw new Error('Breakout already locked');
688
+ } else {
689
+ this.keepEditLockAlive();
690
+ }
691
+ } else {
692
+ const breakout = await this.getBreakout(true);
693
+ if (breakout.body?.editlock) {
694
+ this.keepEditLockAlive();
695
+ }
696
+ }
697
+ },
698
+
699
+ /**
700
+ * keep edit lock alive
701
+ * @returns {void}
702
+ */
703
+ keepEditLockAlive() {
704
+ if (this.editLock && !!this.editLock.token) {
705
+ const ttl = this.editLock.ttl < 30 ? BREAKOUTS.DEFAULT_TTL : this.editLock.ttl;
706
+ if (this.intervalID) {
707
+ window.clearInterval(this.intervalID);
708
+ }
709
+
710
+ this.intervalID = window.setInterval(() => {
711
+ this.request({
712
+ method: HTTP_VERBS.PUT,
713
+ uri: `${this.url}/editlock/${this.editLock.token}`,
714
+ }).catch((error) => {
715
+ this._clearEditLockInfo();
716
+
717
+ return Promise.reject(boServiceErrorHandler(error, 'Breakouts#keepEditLockAlive'));
718
+ });
719
+ }, (ttl / 2) * 1000);
720
+ }
721
+ },
722
+
723
+ /**
724
+ * unlock edit breakout
725
+ * @returns {void}
726
+ */
727
+ unLockEditBreakout() {
728
+ if (this.editLock && !!this.editLock.token) {
729
+ this.request({
730
+ method: HTTP_VERBS.DELETE,
731
+ uri: `${this.url}/editlock/${this.editLock.token}`,
732
+ })
733
+ .then(() => {
734
+ this._clearEditLockInfo();
735
+ })
736
+ .catch((error) => {
737
+ return Promise.reject(boServiceErrorHandler(error, 'Breakouts#unLockEditBreakout'));
738
+ });
739
+ }
740
+ },
741
+
742
+ /**
743
+ * clear interval and edit lock info
744
+ * @private
745
+ * @returns {void}
746
+ */
747
+ _clearEditLockInfo() {
748
+ if (this.intervalID) {
749
+ clearInterval(this.intervalID);
750
+ }
751
+ this.set('editLock', {});
752
+ },
753
+
754
+ /**
755
+ * assign participants to breakout session
756
+ * @param {Array} sessions
757
+ * @returns {void}
758
+ */
759
+ assign(sessions: any[]) {
760
+ const internalSessions = sessions.map((item) => {
761
+ return {
762
+ id: item.id,
763
+ assigned: item.memberIds,
764
+ assignedEmails: item.emails,
765
+ anyoneCanJoin: !!item.anyone,
766
+ };
767
+ });
768
+
769
+ const body = {
770
+ ...(this.editLock && !!this.editLock.token
771
+ ? {editlock: {token: this.editLock.token, refresh: true}}
772
+ : {}),
773
+ ...{
774
+ groups: [
775
+ {
776
+ id: this.breakoutGroupId,
777
+ sessions: internalSessions,
778
+ },
779
+ ],
780
+ },
781
+ };
782
+
783
+ return this.request({
784
+ method: HTTP_VERBS.PUT,
785
+ uri: this.url,
786
+ body,
787
+ });
788
+ },
789
+
790
+ /**
791
+ * The pre-assignments need to be queried when "hasBreakoutPreAssignments" is true
792
+ * @param {Object} params
793
+ * @returns {void}
794
+ */
795
+ queryPreAssignments(params) {
796
+ if (!params || !params.enableBreakoutSession || !params.hasBreakoutPreAssignments) {
797
+ return;
798
+ }
799
+ if (!this.shouldFetchPreassignments) {
800
+ this.webex
801
+ .request({uri: `${this.url}/preassignments`, qs: {locusUrl: btoa(this.locusUrl)}})
802
+ .then((result) => {
803
+ if (result.body?.groups) {
804
+ this.set('preAssignments', result.body.groups);
805
+ }
806
+ })
807
+ .catch((error) => {
808
+ LoggerProxy.logger.error('Meeting:breakouts#queryPreAssignments failed', error);
809
+ });
810
+ this.shouldFetchPreassignments = true;
811
+ }
812
+ },
813
+ /**
814
+ * assign participants dynamically after breakout sessions started,
815
+ * but currently it only used for admitting participants from lobby into breakout directly
816
+ * @param {Array} sessions
817
+ * @returns {void}
818
+ */
819
+ dynamicAssign(sessions: any[]) {
820
+ const updatedSessions = sessions.map((item) => {
821
+ return {
822
+ id: item.id,
823
+ participants: item.participants,
824
+ targetState: item.targetState,
825
+ };
826
+ });
827
+
828
+ const body = {
829
+ groups: [
830
+ {
831
+ id: this.breakoutGroupId,
832
+ sessions: updatedSessions,
833
+ },
834
+ ],
835
+ editlock: null,
836
+ };
837
+
838
+ if (this.editLock && this.editLock.token) {
839
+ body.editlock = this.editLock;
840
+ }
841
+
842
+ return this.request({
843
+ method: HTTP_VERBS.PUT,
844
+ uri: `${this.url}/dynamicAssign`,
845
+ body,
846
+ });
847
+ },
848
+ /**
849
+ * trigger ASK_RETURN_TO_MAIN event when main session requested
850
+ * @param {Object} breakout
851
+ * @returns {void}
852
+ */
853
+ triggerReturnToMainEvent(breakout) {
854
+ if (breakout.isMain && breakout.requested) {
855
+ this.trigger(BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
856
+ }
857
+ },
858
+ });
859
+
860
+ export default Breakouts;