@webex/plugin-meetings 3.0.0-beta.6 → 3.0.0-beta.61

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