@webex/plugin-meetings 3.0.0-beta.21 → 3.0.0-beta.211

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