@webex/plugin-meetings 3.0.0-beta.11 → 3.0.0-beta.111

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