@webex/plugin-meetings 3.0.0-beta.7 → 3.0.0-beta.71

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