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

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