@webex/plugin-meetings 3.0.0-beta.12 → 3.0.0-beta.120

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