@webex/plugin-meetings 3.0.0-beta.10 → 3.0.0-beta.104

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