@webex/plugin-meetings 2.60.0 → 2.60.1-next.10

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 (539) hide show
  1. package/README.md +58 -8
  2. package/dist/annotation/annotation.types.d.ts +42 -0
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.d.ts +31 -0
  6. package/dist/annotation/constants.js +41 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.d.ts +117 -0
  9. package/dist/annotation/index.js +357 -0
  10. package/dist/annotation/index.js.map +1 -0
  11. package/dist/breakouts/breakout.d.ts +8 -0
  12. package/dist/breakouts/breakout.js +215 -0
  13. package/dist/breakouts/breakout.js.map +1 -0
  14. package/dist/breakouts/collection.d.ts +5 -0
  15. package/dist/breakouts/collection.js +22 -0
  16. package/dist/breakouts/collection.js.map +1 -0
  17. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  18. package/dist/breakouts/edit-lock-error.js +51 -0
  19. package/dist/breakouts/edit-lock-error.js.map +1 -0
  20. package/dist/breakouts/events.d.ts +8 -0
  21. package/dist/breakouts/events.js +44 -0
  22. package/dist/breakouts/events.js.map +1 -0
  23. package/dist/breakouts/index.d.ts +5 -0
  24. package/dist/breakouts/index.js +1047 -0
  25. package/dist/breakouts/index.js.map +1 -0
  26. package/dist/breakouts/request.d.ts +22 -0
  27. package/dist/breakouts/request.js +77 -0
  28. package/dist/breakouts/request.js.map +1 -0
  29. package/dist/breakouts/utils.d.ts +15 -0
  30. package/dist/breakouts/utils.js +64 -0
  31. package/dist/breakouts/utils.js.map +1 -0
  32. package/dist/common/browser-detection.js +2 -3
  33. package/dist/common/browser-detection.js.map +1 -1
  34. package/dist/common/collection.js +3 -4
  35. package/dist/common/collection.js.map +1 -1
  36. package/dist/common/config.js +1 -2
  37. package/dist/common/config.js.map +1 -1
  38. package/dist/common/errors/captcha-error.js +1 -2
  39. package/dist/common/errors/captcha-error.js.map +1 -1
  40. package/dist/common/errors/intent-to-join.js +1 -2
  41. package/dist/common/errors/intent-to-join.js.map +1 -1
  42. package/dist/common/errors/join-meeting.js +1 -2
  43. package/dist/common/errors/join-meeting.js.map +1 -1
  44. package/dist/common/errors/media.js +1 -2
  45. package/dist/common/errors/media.js.map +1 -1
  46. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  47. package/dist/common/errors/no-meeting-info.js +50 -0
  48. package/dist/common/errors/no-meeting-info.js.map +1 -0
  49. package/dist/common/errors/parameter.js +3 -4
  50. package/dist/common/errors/parameter.js.map +1 -1
  51. package/dist/common/errors/password-error.js +1 -2
  52. package/dist/common/errors/password-error.js.map +1 -1
  53. package/dist/common/errors/permission.js +1 -2
  54. package/dist/common/errors/permission.js.map +1 -1
  55. package/dist/common/errors/{reclaim-host-role-error.js → reclaim-host-role-errors.js} +7 -11
  56. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  57. package/dist/common/errors/reconnection-in-progress.js +1 -2
  58. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  59. package/dist/common/errors/reconnection.js +1 -2
  60. package/dist/common/errors/reconnection.js.map +1 -1
  61. package/dist/common/errors/stats.js +1 -2
  62. package/dist/common/errors/stats.js.map +1 -1
  63. package/dist/common/errors/webex-errors.d.ts +20 -8
  64. package/dist/common/errors/webex-errors.js +48 -28
  65. package/dist/common/errors/webex-errors.js.map +1 -1
  66. package/dist/common/errors/webex-meetings-error.js +1 -2
  67. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  68. package/dist/common/events/events-scope.js +1 -2
  69. package/dist/common/events/events-scope.js.map +1 -1
  70. package/dist/common/events/events.js +1 -2
  71. package/dist/common/events/events.js.map +1 -1
  72. package/dist/common/events/trigger-proxy.js +1 -2
  73. package/dist/common/events/trigger-proxy.js.map +1 -1
  74. package/dist/common/events/util.js +1 -2
  75. package/dist/common/events/util.js.map +1 -1
  76. package/dist/common/logs/logger-config.js +1 -2
  77. package/dist/common/logs/logger-config.js.map +1 -1
  78. package/dist/common/logs/logger-proxy.js +2 -3
  79. package/dist/common/logs/logger-proxy.js.map +1 -1
  80. package/dist/common/logs/request.d.ts +3 -1
  81. package/dist/common/logs/request.js +8 -5
  82. package/dist/common/logs/request.js.map +1 -1
  83. package/dist/common/queue.d.ts +9 -7
  84. package/dist/common/queue.js +22 -9
  85. package/dist/common/queue.js.map +1 -1
  86. package/dist/config.d.ts +6 -7
  87. package/dist/config.js +8 -10
  88. package/dist/config.js.map +1 -1
  89. package/dist/constants.d.ts +234 -100
  90. package/dist/constants.js +433 -444
  91. package/dist/constants.js.map +1 -1
  92. package/dist/controls-options-manager/constants.js +3 -6
  93. package/dist/controls-options-manager/constants.js.map +1 -1
  94. package/dist/controls-options-manager/enums.d.ts +11 -1
  95. package/dist/controls-options-manager/enums.js +15 -6
  96. package/dist/controls-options-manager/enums.js.map +1 -1
  97. package/dist/controls-options-manager/index.d.ts +17 -1
  98. package/dist/controls-options-manager/index.js +127 -38
  99. package/dist/controls-options-manager/index.js.map +1 -1
  100. package/dist/controls-options-manager/types.d.ts +43 -0
  101. package/dist/controls-options-manager/types.js +7 -0
  102. package/dist/controls-options-manager/types.js.map +1 -0
  103. package/dist/controls-options-manager/util.d.ts +1 -7
  104. package/dist/controls-options-manager/util.js +309 -19
  105. package/dist/controls-options-manager/util.js.map +1 -1
  106. package/dist/index.d.ts +6 -3
  107. package/dist/index.js +121 -5
  108. package/dist/index.js.map +1 -1
  109. package/dist/interceptors/index.d.ts +2 -0
  110. package/dist/interceptors/index.js +15 -0
  111. package/dist/interceptors/index.js.map +1 -0
  112. package/dist/interceptors/locusRetry.d.ts +27 -0
  113. package/dist/interceptors/locusRetry.js +94 -0
  114. package/dist/interceptors/locusRetry.js.map +1 -0
  115. package/dist/interpretation/collection.d.ts +5 -0
  116. package/dist/interpretation/collection.js +22 -0
  117. package/dist/interpretation/collection.js.map +1 -0
  118. package/dist/interpretation/index.d.ts +5 -0
  119. package/dist/interpretation/index.js +365 -0
  120. package/dist/interpretation/index.js.map +1 -0
  121. package/dist/interpretation/siLanguage.d.ts +5 -0
  122. package/dist/interpretation/siLanguage.js +24 -0
  123. package/dist/interpretation/siLanguage.js.map +1 -0
  124. package/dist/locus-info/controlsUtils.js +100 -11
  125. package/dist/locus-info/controlsUtils.js.map +1 -1
  126. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  127. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  128. package/dist/locus-info/fullState.js +1 -2
  129. package/dist/locus-info/fullState.js.map +1 -1
  130. package/dist/locus-info/hostUtils.js +1 -2
  131. package/dist/locus-info/hostUtils.js.map +1 -1
  132. package/dist/locus-info/index.d.ts +57 -4
  133. package/dist/locus-info/index.js +425 -84
  134. package/dist/locus-info/index.js.map +1 -1
  135. package/dist/locus-info/infoUtils.js +13 -5
  136. package/dist/locus-info/infoUtils.js.map +1 -1
  137. package/dist/locus-info/mediaSharesUtils.js +58 -3
  138. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  139. package/dist/locus-info/parser.d.ts +66 -6
  140. package/dist/locus-info/parser.js +253 -80
  141. package/dist/locus-info/parser.js.map +1 -1
  142. package/dist/locus-info/selfUtils.js +97 -13
  143. package/dist/locus-info/selfUtils.js.map +1 -1
  144. package/dist/media/index.d.ts +2 -0
  145. package/dist/media/index.js +107 -319
  146. package/dist/media/index.js.map +1 -1
  147. package/dist/media/properties.d.ts +38 -53
  148. package/dist/media/properties.js +96 -153
  149. package/dist/media/properties.js.map +1 -1
  150. package/dist/media/util.js +1 -22
  151. package/dist/media/util.js.map +1 -1
  152. package/dist/mediaQualityMetrics/config.d.ts +234 -230
  153. package/dist/mediaQualityMetrics/config.js +302 -498
  154. package/dist/mediaQualityMetrics/config.js.map +1 -1
  155. package/dist/meeting/in-meeting-actions.d.ts +88 -0
  156. package/dist/meeting/in-meeting-actions.js +94 -3
  157. package/dist/meeting/in-meeting-actions.js.map +1 -1
  158. package/dist/meeting/index.d.ts +705 -520
  159. package/dist/meeting/index.js +5047 -3089
  160. package/dist/meeting/index.js.map +1 -1
  161. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  162. package/dist/meeting/locusMediaRequest.js +291 -0
  163. package/dist/meeting/locusMediaRequest.js.map +1 -0
  164. package/dist/meeting/muteState.d.ts +93 -25
  165. package/dist/meeting/muteState.js +224 -133
  166. package/dist/meeting/muteState.js.map +1 -1
  167. package/dist/meeting/request.d.ts +82 -47
  168. package/dist/meeting/request.js +304 -199
  169. package/dist/meeting/request.js.map +1 -1
  170. package/dist/meeting/request.type.d.ts +11 -0
  171. package/dist/meeting/request.type.js +7 -0
  172. package/dist/meeting/request.type.js.map +1 -0
  173. package/dist/meeting/state.js +1 -2
  174. package/dist/meeting/state.js.map +1 -1
  175. package/dist/meeting/util.d.ts +118 -1
  176. package/dist/meeting/util.js +676 -435
  177. package/dist/meeting/util.js.map +1 -1
  178. package/dist/meeting/voicea-meeting.d.ts +20 -0
  179. package/dist/meeting/voicea-meeting.js +201 -0
  180. package/dist/meeting/voicea-meeting.js.map +1 -0
  181. package/dist/meeting-info/collection.js +3 -4
  182. package/dist/meeting-info/collection.js.map +1 -1
  183. package/dist/meeting-info/index.d.ts +13 -1
  184. package/dist/meeting-info/index.js +74 -7
  185. package/dist/meeting-info/index.js.map +1 -1
  186. package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
  187. package/dist/meeting-info/meeting-info-v2.js +200 -63
  188. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  189. package/dist/meeting-info/request.js +1 -2
  190. package/dist/meeting-info/request.js.map +1 -1
  191. package/dist/meeting-info/util.js +2 -3
  192. package/dist/meeting-info/util.js.map +1 -1
  193. package/dist/meeting-info/utilv2.js +39 -41
  194. package/dist/meeting-info/utilv2.js.map +1 -1
  195. package/dist/meetings/collection.d.ts +17 -0
  196. package/dist/meetings/collection.js +42 -4
  197. package/dist/meetings/collection.js.map +1 -1
  198. package/dist/meetings/index.d.ts +114 -20
  199. package/dist/meetings/index.js +540 -126
  200. package/dist/meetings/index.js.map +1 -1
  201. package/dist/meetings/meetings.types.d.ts +4 -0
  202. package/dist/meetings/meetings.types.js +7 -0
  203. package/dist/meetings/meetings.types.js.map +1 -0
  204. package/dist/meetings/request.js +4 -3
  205. package/dist/meetings/request.js.map +1 -1
  206. package/dist/meetings/util.js +107 -6
  207. package/dist/meetings/util.js.map +1 -1
  208. package/dist/member/index.d.ts +13 -1
  209. package/dist/member/index.js +45 -2
  210. package/dist/member/index.js.map +1 -1
  211. package/dist/member/member.types.js +3 -4
  212. package/dist/member/member.types.js.map +1 -1
  213. package/dist/member/types.d.ts +32 -0
  214. package/dist/member/types.js +23 -0
  215. package/dist/member/types.js.map +1 -0
  216. package/dist/member/util.js +120 -29
  217. package/dist/member/util.js.map +1 -1
  218. package/dist/members/collection.d.ts +5 -0
  219. package/dist/members/collection.js +11 -2
  220. package/dist/members/collection.js.map +1 -1
  221. package/dist/members/index.d.ts +56 -11
  222. package/dist/members/index.js +174 -47
  223. package/dist/members/index.js.map +1 -1
  224. package/dist/members/request.d.ts +67 -11
  225. package/dist/members/request.js +102 -54
  226. package/dist/members/request.js.map +1 -1
  227. package/dist/members/types.js +3 -4
  228. package/dist/members/types.js.map +1 -1
  229. package/dist/members/util.d.ts +214 -1
  230. package/dist/members/util.js +327 -284
  231. package/dist/members/util.js.map +1 -1
  232. package/dist/metrics/constants.d.ts +15 -6
  233. package/dist/metrics/constants.js +17 -9
  234. package/dist/metrics/constants.js.map +1 -1
  235. package/dist/metrics/index.d.ts +4 -111
  236. package/dist/metrics/index.js +4 -452
  237. package/dist/metrics/index.js.map +1 -1
  238. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  239. package/dist/multistream/mediaRequestManager.js +344 -0
  240. package/dist/multistream/mediaRequestManager.js.map +1 -0
  241. package/dist/multistream/receiveSlot.d.ts +68 -0
  242. package/dist/multistream/receiveSlot.js +200 -0
  243. package/dist/multistream/receiveSlot.js.map +1 -0
  244. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  245. package/dist/multistream/receiveSlotManager.js +174 -0
  246. package/dist/multistream/receiveSlotManager.js.map +1 -0
  247. package/dist/multistream/remoteMedia.d.ts +72 -0
  248. package/dist/multistream/remoteMedia.js +268 -0
  249. package/dist/multistream/remoteMedia.js.map +1 -0
  250. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  251. package/dist/multistream/remoteMediaGroup.js +267 -0
  252. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  253. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  254. package/dist/multistream/remoteMediaManager.js +1211 -0
  255. package/dist/multistream/remoteMediaManager.js.map +1 -0
  256. package/dist/multistream/sendSlotManager.d.ts +61 -0
  257. package/dist/multistream/sendSlotManager.js +236 -0
  258. package/dist/multistream/sendSlotManager.js.map +1 -0
  259. package/dist/networkQualityMonitor/index.js +5 -4
  260. package/dist/networkQualityMonitor/index.js.map +1 -1
  261. package/dist/personal-meeting-room/index.js +2 -3
  262. package/dist/personal-meeting-room/index.js.map +1 -1
  263. package/dist/personal-meeting-room/request.js +2 -3
  264. package/dist/personal-meeting-room/request.js.map +1 -1
  265. package/dist/personal-meeting-room/util.js +1 -2
  266. package/dist/personal-meeting-room/util.js.map +1 -1
  267. package/dist/reachability/clusterReachability.d.ts +109 -0
  268. package/dist/reachability/clusterReachability.js +357 -0
  269. package/dist/reachability/clusterReachability.js.map +1 -0
  270. package/dist/reachability/index.d.ts +61 -95
  271. package/dist/reachability/index.js +304 -392
  272. package/dist/reachability/index.js.map +1 -1
  273. package/dist/reachability/request.d.ts +7 -3
  274. package/dist/reachability/request.js +18 -10
  275. package/dist/reachability/request.js.map +1 -1
  276. package/dist/reachability/util.d.ts +8 -0
  277. package/dist/reachability/util.js +29 -0
  278. package/dist/reachability/util.js.map +1 -0
  279. package/dist/reactions/constants.d.ts +3 -0
  280. package/dist/reactions/constants.js +12 -0
  281. package/dist/reactions/constants.js.map +1 -0
  282. package/dist/reactions/reactions.d.ts +2 -2
  283. package/dist/reactions/reactions.js +4 -6
  284. package/dist/reactions/reactions.js.map +1 -1
  285. package/dist/reactions/reactions.type.d.ts +23 -3
  286. package/dist/reactions/reactions.type.js +21 -23
  287. package/dist/reactions/reactions.type.js.map +1 -1
  288. package/dist/reconnection-manager/index.d.ts +32 -8
  289. package/dist/reconnection-manager/index.js +285 -232
  290. package/dist/reconnection-manager/index.js.map +1 -1
  291. package/dist/recording-controller/enums.js +4 -5
  292. package/dist/recording-controller/enums.js.map +1 -1
  293. package/dist/recording-controller/index.d.ts +15 -1
  294. package/dist/recording-controller/index.js +57 -46
  295. package/dist/recording-controller/index.js.map +1 -1
  296. package/dist/recording-controller/util.d.ts +5 -4
  297. package/dist/recording-controller/util.js +10 -10
  298. package/dist/recording-controller/util.js.map +1 -1
  299. package/dist/roap/index.d.ts +9 -47
  300. package/dist/roap/index.js +100 -238
  301. package/dist/roap/index.js.map +1 -1
  302. package/dist/roap/request.d.ts +18 -12
  303. package/dist/roap/request.js +126 -180
  304. package/dist/roap/request.js.map +1 -1
  305. package/dist/roap/turnDiscovery.d.ts +27 -16
  306. package/dist/roap/turnDiscovery.js +115 -105
  307. package/dist/roap/turnDiscovery.js.map +1 -1
  308. package/dist/rtcMetrics/constants.d.ts +4 -0
  309. package/dist/rtcMetrics/constants.js +11 -0
  310. package/dist/rtcMetrics/constants.js.map +1 -0
  311. package/dist/rtcMetrics/index.d.ts +54 -0
  312. package/dist/rtcMetrics/index.js +140 -0
  313. package/dist/rtcMetrics/index.js.map +1 -0
  314. package/dist/statsAnalyzer/global.d.ts +1 -83
  315. package/dist/statsAnalyzer/global.js +2 -85
  316. package/dist/statsAnalyzer/global.js.map +1 -1
  317. package/dist/statsAnalyzer/index.d.ts +50 -30
  318. package/dist/statsAnalyzer/index.js +436 -511
  319. package/dist/statsAnalyzer/index.js.map +1 -1
  320. package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
  321. package/dist/statsAnalyzer/mqaUtil.js +130 -90
  322. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  323. package/dist/transcription/index.js +1 -2
  324. package/dist/transcription/index.js.map +1 -1
  325. package/dist/webinar/collection.d.ts +16 -0
  326. package/dist/webinar/collection.js +43 -0
  327. package/dist/webinar/collection.js.map +1 -0
  328. package/dist/webinar/index.d.ts +5 -0
  329. package/dist/webinar/index.js +68 -0
  330. package/dist/webinar/index.js.map +1 -0
  331. package/package.json +39 -26
  332. package/src/annotation/annotation.types.ts +50 -0
  333. package/src/annotation/constants.ts +36 -0
  334. package/src/annotation/index.ts +328 -0
  335. package/src/breakouts/README.md +220 -0
  336. package/src/breakouts/breakout.ts +188 -0
  337. package/src/breakouts/collection.ts +19 -0
  338. package/src/breakouts/edit-lock-error.ts +25 -0
  339. package/src/breakouts/events.ts +56 -0
  340. package/src/breakouts/index.ts +925 -0
  341. package/src/breakouts/request.ts +55 -0
  342. package/src/breakouts/utils.ts +57 -0
  343. package/src/common/errors/no-meeting-info.ts +24 -0
  344. package/src/common/errors/webex-errors.ts +36 -12
  345. package/src/common/logs/logger-proxy.ts +1 -1
  346. package/src/common/logs/request.ts +5 -1
  347. package/src/common/queue.ts +22 -8
  348. package/src/config.ts +6 -7
  349. package/src/constants.ts +265 -100
  350. package/src/controls-options-manager/enums.ts +12 -0
  351. package/src/controls-options-manager/index.ts +116 -21
  352. package/src/controls-options-manager/types.ts +59 -0
  353. package/src/controls-options-manager/util.ts +294 -14
  354. package/src/index.ts +44 -0
  355. package/src/interceptors/index.ts +3 -0
  356. package/src/interceptors/locusRetry.ts +67 -0
  357. package/src/interpretation/README.md +60 -0
  358. package/src/interpretation/collection.ts +19 -0
  359. package/src/interpretation/index.ts +332 -0
  360. package/src/interpretation/siLanguage.ts +18 -0
  361. package/src/locus-info/controlsUtils.ts +110 -0
  362. package/src/locus-info/index.ts +450 -61
  363. package/src/locus-info/infoUtils.ts +14 -2
  364. package/src/locus-info/mediaSharesUtils.ts +64 -0
  365. package/src/locus-info/parser.ts +258 -47
  366. package/src/locus-info/selfUtils.ts +85 -2
  367. package/src/media/index.ts +153 -370
  368. package/src/media/properties.ts +106 -136
  369. package/src/media/util.ts +0 -21
  370. package/src/mediaQualityMetrics/config.ts +244 -377
  371. package/src/meeting/in-meeting-actions.ts +176 -0
  372. package/src/meeting/index.ts +4306 -2581
  373. package/src/meeting/locusMediaRequest.ts +313 -0
  374. package/src/meeting/muteState.ts +224 -138
  375. package/src/meeting/request.ts +214 -127
  376. package/src/meeting/request.type.ts +13 -0
  377. package/src/meeting/util.ts +687 -423
  378. package/src/meeting/voicea-meeting.ts +161 -0
  379. package/src/meeting-info/index.ts +81 -8
  380. package/src/meeting-info/meeting-info-v2.ts +163 -13
  381. package/src/meeting-info/util.ts +1 -1
  382. package/src/meeting-info/utilv2.ts +28 -28
  383. package/src/meetings/collection.ts +33 -0
  384. package/src/meetings/index.ts +529 -127
  385. package/src/meetings/meetings.types.ts +12 -0
  386. package/src/meetings/request.ts +2 -0
  387. package/src/meetings/util.ts +116 -5
  388. package/src/member/index.ts +43 -1
  389. package/src/member/types.ts +38 -0
  390. package/src/member/util.ts +125 -28
  391. package/src/members/collection.ts +8 -0
  392. package/src/members/index.ts +187 -52
  393. package/src/members/request.ts +87 -27
  394. package/src/members/util.ts +332 -291
  395. package/src/metrics/constants.ts +15 -6
  396. package/src/metrics/index.ts +1 -471
  397. package/src/multistream/mediaRequestManager.ts +440 -0
  398. package/src/multistream/receiveSlot.ts +184 -0
  399. package/src/multistream/receiveSlotManager.ts +166 -0
  400. package/src/multistream/remoteMedia.ts +254 -0
  401. package/src/multistream/remoteMediaGroup.ts +284 -0
  402. package/src/multistream/remoteMediaManager.ts +1145 -0
  403. package/src/multistream/sendSlotManager.ts +170 -0
  404. package/src/networkQualityMonitor/index.ts +6 -6
  405. package/src/reachability/clusterReachability.ts +320 -0
  406. package/src/reachability/index.ts +246 -347
  407. package/src/reachability/request.ts +17 -8
  408. package/src/reachability/util.ts +24 -0
  409. package/src/reactions/constants.ts +4 -0
  410. package/src/reactions/reactions.ts +4 -4
  411. package/src/reactions/reactions.type.ts +30 -4
  412. package/src/reconnection-manager/index.ts +168 -156
  413. package/src/recording-controller/index.ts +20 -3
  414. package/src/recording-controller/util.ts +26 -9
  415. package/src/roap/index.ts +96 -241
  416. package/src/roap/request.ts +74 -148
  417. package/src/roap/turnDiscovery.ts +62 -56
  418. package/src/rtcMetrics/constants.ts +3 -0
  419. package/src/rtcMetrics/index.ts +124 -0
  420. package/src/statsAnalyzer/global.ts +1 -84
  421. package/src/statsAnalyzer/index.ts +479 -645
  422. package/src/statsAnalyzer/mqaUtil.ts +128 -126
  423. package/src/webinar/collection.ts +31 -0
  424. package/src/webinar/index.ts +62 -0
  425. package/test/integration/spec/converged-space-meetings.js +233 -0
  426. package/test/integration/spec/journey.js +320 -264
  427. package/test/integration/spec/space-meeting.js +77 -4
  428. package/test/unit/spec/annotation/index.ts +418 -0
  429. package/test/unit/spec/breakouts/breakout.ts +237 -0
  430. package/test/unit/spec/breakouts/collection.ts +15 -0
  431. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  432. package/test/unit/spec/breakouts/events.ts +89 -0
  433. package/test/unit/spec/breakouts/index.ts +1790 -0
  434. package/test/unit/spec/breakouts/request.ts +104 -0
  435. package/test/unit/spec/breakouts/utils.js +72 -0
  436. package/test/unit/spec/common/queue.js +31 -2
  437. package/test/unit/spec/controls-options-manager/index.js +163 -0
  438. package/test/unit/spec/controls-options-manager/util.js +576 -60
  439. package/test/unit/spec/fixture/locus.js +1 -0
  440. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  441. package/test/unit/spec/interpretation/collection.ts +15 -0
  442. package/test/unit/spec/interpretation/index.ts +589 -0
  443. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  444. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  445. package/test/unit/spec/locus-info/index.js +1438 -16
  446. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  447. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  448. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  449. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  450. package/test/unit/spec/locus-info/parser.js +116 -35
  451. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  452. package/test/unit/spec/media/index.ts +290 -0
  453. package/test/unit/spec/media/properties.ts +75 -84
  454. package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
  455. package/test/unit/spec/meeting/index.js +8886 -2815
  456. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  457. package/test/unit/spec/meeting/muteState.js +409 -213
  458. package/test/unit/spec/meeting/request.js +523 -43
  459. package/test/unit/spec/meeting/utils.js +834 -24
  460. package/test/unit/spec/meeting-info/index.js +300 -0
  461. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  462. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  463. package/test/unit/spec/meetings/collection.js +26 -0
  464. package/test/unit/spec/meetings/index.js +1446 -217
  465. package/test/unit/spec/meetings/utils.js +202 -2
  466. package/test/unit/spec/member/index.js +32 -9
  467. package/test/unit/spec/member/util.js +499 -61
  468. package/test/unit/spec/members/index.js +394 -5
  469. package/test/unit/spec/members/request.js +206 -27
  470. package/test/unit/spec/members/utils.js +173 -38
  471. package/test/unit/spec/metrics/index.js +1 -50
  472. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  473. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  474. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  475. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  476. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  477. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  478. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  479. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  480. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  481. package/test/unit/spec/reachability/index.ts +532 -24
  482. package/test/unit/spec/reachability/request.js +68 -0
  483. package/test/unit/spec/reachability/util.ts +40 -0
  484. package/test/unit/spec/reconnection-manager/index.js +163 -24
  485. package/test/unit/spec/recording-controller/index.js +293 -218
  486. package/test/unit/spec/recording-controller/util.js +223 -96
  487. package/test/unit/spec/roap/index.ts +187 -77
  488. package/test/unit/spec/roap/request.ts +255 -0
  489. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  490. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  491. package/test/unit/spec/stats-analyzer/index.js +644 -165
  492. package/test/unit/spec/webinar/collection.ts +13 -0
  493. package/test/unit/spec/webinar/index.ts +60 -0
  494. package/test/utils/constants.js +9 -0
  495. package/test/utils/integrationTestUtils.js +46 -0
  496. package/test/utils/testUtils.js +0 -45
  497. package/test/utils/webex-config.js +4 -0
  498. package/test/utils/webex-test-users.js +7 -3
  499. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  500. package/dist/meeting/effectsState.d.ts +0 -42
  501. package/dist/meeting/effectsState.js +0 -260
  502. package/dist/meeting/effectsState.js.map +0 -1
  503. package/dist/metrics/config.d.ts +0 -169
  504. package/dist/metrics/config.js +0 -289
  505. package/dist/metrics/config.js.map +0 -1
  506. package/dist/peer-connection-manager/index.d.ts +0 -6
  507. package/dist/peer-connection-manager/index.js +0 -671
  508. package/dist/peer-connection-manager/index.js.map +0 -1
  509. package/dist/peer-connection-manager/util.d.ts +0 -6
  510. package/dist/peer-connection-manager/util.js +0 -110
  511. package/dist/peer-connection-manager/util.js.map +0 -1
  512. package/dist/roap/collection.d.ts +0 -10
  513. package/dist/roap/collection.js +0 -63
  514. package/dist/roap/collection.js.map +0 -1
  515. package/dist/roap/handler.d.ts +0 -47
  516. package/dist/roap/handler.js +0 -279
  517. package/dist/roap/handler.js.map +0 -1
  518. package/dist/roap/state.d.ts +0 -9
  519. package/dist/roap/state.js +0 -127
  520. package/dist/roap/state.js.map +0 -1
  521. package/dist/roap/util.d.ts +0 -2
  522. package/dist/roap/util.js +0 -76
  523. package/dist/roap/util.js.map +0 -1
  524. package/src/index.js +0 -15
  525. package/src/meeting/effectsState.ts +0 -209
  526. package/src/metrics/config.ts +0 -485
  527. package/src/peer-connection-manager/index.ts +0 -847
  528. package/src/peer-connection-manager/util.ts +0 -119
  529. package/src/roap/collection.ts +0 -62
  530. package/src/roap/handler.ts +0 -294
  531. package/src/roap/state.ts +0 -156
  532. package/src/roap/util.ts +0 -100
  533. package/test/unit/spec/meeting/effectsState.js +0 -281
  534. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  535. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  536. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  537. package/test/unit/spec/roap/util.js +0 -30
  538. /package/dist/common/errors/{reclaim-host-role-error.d.ts → reclaim-host-role-errors.d.ts} +0 -0
  539. /package/src/common/errors/{reclaim-host-role-error.ts → reclaim-host-role-errors.ts} +0 -0
@@ -1,13 +1,17 @@
1
1
  /* eslint no-shadow: ["error", { "allow": ["eventType"] }] */
2
2
 
3
3
  import '@webex/internal-plugin-mercury';
4
+ import '@webex/internal-plugin-conversation';
5
+ import '@webex/internal-plugin-metrics';
4
6
  // @ts-ignore
5
7
  import {WebexPlugin} from '@webex/webex-core';
8
+ import {setLogger} from '@webex/internal-media-core';
9
+
10
+ import * as mediaHelpersModule from '@webex/media-helpers';
6
11
 
7
12
  import 'webrtc-adapter';
8
13
 
9
14
  import Metrics from '../metrics';
10
- import {trigger, eventType} from '../metrics/config';
11
15
  import LoggerConfig from '../common/logs/logger-config';
12
16
  import StaticConfig from '../common/config';
13
17
  import LoggerProxy from '../common/logs/logger-proxy';
@@ -38,11 +42,14 @@ import {
38
42
  MEETING_REMOVED_REASON,
39
43
  _CONVERSATION_URL_,
40
44
  CONVERSATION_URL,
45
+ MEETINGNUMBER,
46
+ _JOINED_,
47
+ _MOVED_,
41
48
  } from '../constants';
42
49
  import BEHAVIORAL_METRICS from '../metrics/constants';
43
50
  import MeetingInfo from '../meeting-info';
44
51
  import MeetingInfoV2 from '../meeting-info/meeting-info-v2';
45
- import Meeting from '../meeting';
52
+ import Meeting, {CallStateForMetrics} from '../meeting';
46
53
  import PersonalMeetingRoom from '../personal-meeting-room';
47
54
  import Reachability from '../reachability';
48
55
  import Request from './request';
@@ -51,7 +58,38 @@ import CaptchaError from '../common/errors/captcha-error';
51
58
 
52
59
  import MeetingCollection from './collection';
53
60
  import MeetingsUtil from './util';
61
+ import PermissionError from '../common/errors/permission';
62
+ import {INoiseReductionEffect, IVirtualBackgroundEffect} from './meetings.types';
63
+ import {SpaceIDDeprecatedError} from '../common/errors/webex-errors';
64
+ import NoMeetingInfoError from '../common/errors/no-meeting-info';
65
+
66
+ let mediaLogger;
67
+
68
+ class MediaLogger {
69
+ info(...args) {
70
+ LoggerProxy.logger.info(...args);
71
+ }
72
+
73
+ log(...args) {
74
+ LoggerProxy.logger.log(...args);
75
+ }
76
+
77
+ error(...args) {
78
+ LoggerProxy.logger.error(...args);
79
+ }
80
+
81
+ warn(...args) {
82
+ LoggerProxy.logger.warn(...args);
83
+ }
54
84
 
85
+ trace(...args) {
86
+ LoggerProxy.logger.trace(...args);
87
+ }
88
+
89
+ debug(...args) {
90
+ LoggerProxy.logger.debug(...args);
91
+ }
92
+ }
55
93
  /**
56
94
  * Meetings Ready Event
57
95
  * Emitted when the meetings instance on webex is ready
@@ -110,12 +148,13 @@ export default class Meetings extends WebexPlugin {
110
148
  meetingCollection: any;
111
149
  personalMeetingRoom: any;
112
150
  preferredWebexSite: any;
113
- reachability: any;
151
+ reachability: Reachability;
114
152
  registered: any;
115
153
  request: any;
116
154
  geoHintInfo: any;
117
155
  meetingInfo: any;
118
-
156
+ mediaHelpers: any;
157
+ breakoutLocusForHandleLater: any;
119
158
  namespace = MEETINGS;
120
159
 
121
160
  /**
@@ -127,6 +166,17 @@ export default class Meetings extends WebexPlugin {
127
166
  constructor(...args) {
128
167
  super(...args);
129
168
 
169
+ /**
170
+ * The webrtc-core media helpers. This is a temporary solution required for the SDK sample app
171
+ * to be able to call media helper functions.
172
+ *
173
+ * @instance
174
+ * @type {Object}
175
+ * @private
176
+ * @memberof Meetings
177
+ */
178
+ this.mediaHelpers = mediaHelpersModule;
179
+
130
180
  /**
131
181
  * The Meetings request to interact with server
132
182
  * @instance
@@ -154,15 +204,17 @@ export default class Meetings extends WebexPlugin {
154
204
  * @memberof Meetings
155
205
  */
156
206
  this.personalMeetingRoom = null;
207
+
157
208
  /**
158
- * The Reachability object to interact with server, starts as null until {@link Meeting#setReachability} is called
209
+ * The Reachability object to interact with server
159
210
  * starts as null
160
211
  * @instance
161
212
  * @type {Object}
162
213
  * @private
163
214
  * @memberof Meetings
164
215
  */
165
- this.reachability = null;
216
+ // @ts-ignore
217
+ this.reachability = new Reachability(this.webex);
166
218
 
167
219
  /**
168
220
  * If the meetings plugin has been registered and listening via {@link Meetings#register}
@@ -192,30 +244,137 @@ export default class Meetings extends WebexPlugin {
192
244
  */
193
245
  this.media = {
194
246
  getUserMedia: Media.getUserMedia,
195
- getSupportedDevice: Media.getSupportedDevice,
196
247
  };
197
248
 
198
249
  this.onReady();
199
250
  }
200
251
 
201
252
  /**
202
- * handle locus events and takes meeting actions with them as they come in
253
+ * check whether you need to handle this main session's locus data or not
254
+ * @param {Object} meeting current meeting data
255
+ * @param {Object} newLocus new locus data
256
+ * @returns {boolean}
257
+ * @private
258
+ * @memberof Meetings
259
+ */
260
+ private isNeedHandleMainLocus(meeting: any, newLocus: any) {
261
+ const breakoutUrl = newLocus.controls?.breakout?.url;
262
+ const breakoutLocus = this.meetingCollection.getActiveBreakoutLocus(breakoutUrl);
263
+
264
+ const isSelfJoined = newLocus?.self?.state === _JOINED_;
265
+ const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
266
+ // @ts-ignore
267
+ const deviceFromNewLocus = MeetingsUtil.getThisDevice(newLocus, this.webex.internal.device.url);
268
+ const isResourceMovedOnThisDevice =
269
+ deviceFromNewLocus?.state === _LEFT_ && deviceFromNewLocus?.reason === _MOVED_;
270
+
271
+ const isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(
272
+ meeting,
273
+ newLocus,
274
+ // @ts-ignore
275
+ this.webex.internal.device.url
276
+ );
277
+ const isBreakoutLocusJoinThisDevice =
278
+ breakoutLocus?.joinedWith?.correlationId &&
279
+ breakoutLocus.joinedWith.correlationId === meeting?.correlationId;
280
+
281
+ if (isSelfJoined && isNewLocusJoinThisDevice) {
282
+ LoggerProxy.logger.log(
283
+ 'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
284
+ );
285
+ if (breakoutLocus?.joinedWith && deviceFromNewLocus) {
286
+ const breakoutReplaceAt =
287
+ breakoutLocus.joinedWith.replaces?.length > 0
288
+ ? breakoutLocus.joinedWith.replaces[0].replaceAt
289
+ : '';
290
+ const newLocusReplaceAt =
291
+ deviceFromNewLocus.replaces?.length > 0 ? deviceFromNewLocus.replaces[0].replaceAt : '';
292
+ if (breakoutReplaceAt && newLocusReplaceAt && breakoutReplaceAt > newLocusReplaceAt) {
293
+ LoggerProxy.logger.log(
294
+ `Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt ${newLocusReplaceAt} bo replacedAt ${breakoutReplaceAt}`
295
+ );
296
+
297
+ return false;
298
+ }
299
+ }
300
+
301
+ return true;
302
+ }
303
+ if (isBreakoutLocusJoinThisDevice) {
304
+ LoggerProxy.logger.log(
305
+ `Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ${breakoutUrl}`
306
+ );
307
+
308
+ return false;
309
+ }
310
+ if (isSelfMoved && (newLocus?.self?.removed || isResourceMovedOnThisDevice)) {
311
+ LoggerProxy.logger.log(
312
+ 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
313
+ );
314
+
315
+ return false;
316
+ }
317
+ if (isSelfJoined && isResourceMovedOnThisDevice) {
318
+ LoggerProxy.logger.log(
319
+ 'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'
320
+ );
321
+
322
+ return false;
323
+ }
324
+ LoggerProxy.logger.log(
325
+ 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
326
+ );
327
+
328
+ return true;
329
+ }
330
+
331
+ /**
332
+ * check whether you need to handle this locus data or not
333
+ * @param {Object} meeting old locus data
334
+ * @param {Object} newLocus new locus data
335
+ * @returns {boolean}
336
+ * @private
337
+ * @memberof Meetings
338
+ */
339
+ private isNeedHandleLocusDTO(meeting: any, newLocus: any) {
340
+ if (newLocus) {
341
+ const isNewLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(newLocus);
342
+ const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
343
+ if (!meeting) {
344
+ if (isNewLocusAsBreakout) {
345
+ LoggerProxy.logger.log(
346
+ `Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: ${newLocus.fullState?.active}`
347
+ );
348
+
349
+ return newLocus.self?.state === _JOINED_;
350
+ }
351
+
352
+ return this.isNeedHandleMainLocus(meeting, newLocus);
353
+ }
354
+ if (!isNewLocusAsBreakout) {
355
+ return this.isNeedHandleMainLocus(meeting, newLocus);
356
+ }
357
+
358
+ return !isSelfMoved;
359
+ }
360
+
361
+ return true;
362
+ }
363
+
364
+ /**
365
+ * get corresponding meeting object by locus data
203
366
  * @param {Object} data a locus event
204
367
  * @param {String} data.locusUrl
205
368
  * @param {Object} data.locus
206
- * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
207
- * @param {String} data.eventType
208
- * @returns {undefined}
369
+ * @returns {Object}
209
370
  * @private
210
371
  * @memberof Meetings
211
372
  */
212
- private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
213
- let meeting = null;
214
-
373
+ getCorrespondingMeetingByLocus(data) {
215
374
  // getting meeting by correlationId. This will happen for the new event
216
375
  // Either the locus
217
376
  // TODO : Add check for the callBack Address
218
- meeting =
377
+ return (
219
378
  this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||
220
379
  // @ts-ignore
221
380
  this.meetingCollection.getByKey(
@@ -231,7 +390,24 @@ export default class Meetings extends WebexPlugin {
231
390
  ) ||
232
391
  (data.locus.info?.isUnifiedSpaceMeeting
233
392
  ? undefined
234
- : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl));
393
+ : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl)) ||
394
+ this.meetingCollection.getByKey(MEETINGNUMBER, data.locus?.info?.webExMeetingId)
395
+ );
396
+ }
397
+
398
+ /**
399
+ * handle locus events and takes meeting actions with them as they come in
400
+ * @param {Object} data a locus event
401
+ * @param {String} data.locusUrl
402
+ * @param {Object} data.locus
403
+ * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
404
+ * @param {String} data.eventType
405
+ * @returns {undefined}
406
+ * @private
407
+ * @memberof Meetings
408
+ */
409
+ private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
410
+ let meeting = this.getCorrespondingMeetingByLocus(data);
235
411
 
236
412
  // Special case when locus has got replaced, This only happend once if a replace locus exists
237
413
  // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call
@@ -244,6 +420,16 @@ export default class Meetings extends WebexPlugin {
244
420
  );
245
421
  }
246
422
 
423
+ if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {
424
+ meeting.locusInfo.updateMainSessionLocusCache(data.locus);
425
+ }
426
+ if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {
427
+ LoggerProxy.logger.log(
428
+ `Meetings:index#handleLocusEvent --> doesn't need to process locus event`
429
+ );
430
+
431
+ return;
432
+ }
247
433
  if (!meeting) {
248
434
  // TODO: create meeting when we get a meeting object
249
435
  // const checkForEnded = (locus) => {
@@ -300,6 +486,7 @@ export default class Meetings extends WebexPlugin {
300
486
 
301
487
  // It's a new meeting so initialize the locus data
302
488
  meeting.locusInfo.initialSetup(data.locus);
489
+ this.checkHandleBreakoutLocus(data.locus);
303
490
  })
304
491
  .catch((e) => {
305
492
  LoggerProxy.logger.error(e);
@@ -309,10 +496,15 @@ export default class Meetings extends WebexPlugin {
309
496
  // because the other user left so before sending 'added' event make sure it exists in the collection
310
497
 
311
498
  if (this.getMeetingByType(_ID_, meeting.id)) {
312
- Metrics.postEvent({
313
- event: eventType.REMOTE_STARTED,
314
- meeting,
315
- data: {trigger: trigger.MERCURY_EVENT},
499
+ // @ts-ignore
500
+ this.webex.internal.newMetrics.submitClientEvent({
501
+ name: 'client.call.remote-started',
502
+ payload: {
503
+ trigger: 'mercury-event',
504
+ },
505
+ options: {
506
+ meetingId: meeting.id,
507
+ },
316
508
  });
317
509
  Trigger.trigger(
318
510
  this,
@@ -392,7 +584,7 @@ export default class Meetings extends WebexPlugin {
392
584
 
393
585
  // @ts-ignore
394
586
  this.webex.internal.mercury.on(ONLINE, () => {
395
- this.syncMeetings();
587
+ this.syncMeetings({keepOnlyLocusMeetings: false});
396
588
  });
397
589
 
398
590
  // @ts-ignore
@@ -431,6 +623,9 @@ export default class Meetings extends WebexPlugin {
431
623
  // @ts-ignore
432
624
  LoggerProxy.set(this.webex.logger);
433
625
 
626
+ mediaLogger = new MediaLogger();
627
+ setLogger(mediaLogger);
628
+
434
629
  /**
435
630
  * The MeetingInfo object to interact with server
436
631
  * @instance
@@ -462,7 +657,7 @@ export default class Meetings extends WebexPlugin {
462
657
 
463
658
  MeetingsUtil.checkH264Support({disableNotifications: true});
464
659
  // @ts-ignore
465
- Metrics.initialSetup(this.meetingCollection, this.webex);
660
+ Metrics.initialSetup(this.webex);
466
661
  });
467
662
  }
468
663
 
@@ -487,35 +682,38 @@ export default class Meetings extends WebexPlugin {
487
682
  }
488
683
 
489
684
  /**
490
- * API to enable or disable TURN discovery
491
- * @param {Boolean} enable
685
+ * API to toggle starting adhoc meeting
686
+ * @param {Boolean} changeState
492
687
  * @private
493
688
  * @memberof Meetings
494
689
  * @returns {undefined}
495
690
  */
496
- private _toggleTurnDiscovery(enable: boolean) {
497
- if (typeof enable !== 'boolean') {
691
+ private _toggleAdhocMeetings(changeState: boolean) {
692
+ if (typeof changeState !== 'boolean') {
498
693
  return;
499
694
  }
500
695
  // @ts-ignore
501
- this.config.experimental.enableTurnDiscovery = enable;
696
+ if (this.config?.experimental?.enableAdhocMeetings !== changeState) {
697
+ // @ts-ignore
698
+ this.config.experimental.enableAdhocMeetings = changeState;
699
+ }
502
700
  }
503
701
 
504
702
  /**
505
- * API to toggle starting adhoc meeting
506
- * @param {Boolean} changeState
703
+ * API to toggle TCP reachability, needs to be called before webex.meetings.register()
704
+ * @param {Boolean} newValue
507
705
  * @private
508
706
  * @memberof Meetings
509
707
  * @returns {undefined}
510
708
  */
511
- private _toggleAdhocMeetings(changeState: boolean) {
512
- if (typeof changeState !== 'boolean') {
709
+ private _toggleTcpReachability(newValue: boolean) {
710
+ if (typeof newValue !== 'boolean') {
513
711
  return;
514
712
  }
515
713
  // @ts-ignore
516
- if (this.config?.experimental?.enableAdhocMeetings !== changeState) {
714
+ if (this.config.experimental.enableTcpReachability !== newValue) {
517
715
  // @ts-ignore
518
- this.config.experimental.enableAdhocMeetings = changeState;
716
+ this.config.experimental.enableTcpReachability = newValue;
519
717
  }
520
718
  }
521
719
 
@@ -631,6 +829,36 @@ export default class Meetings extends WebexPlugin {
631
829
  );
632
830
  }
633
831
 
832
+ /**
833
+ * Creates a noise reduction effect
834
+ *
835
+ * @param {INoiseReductionEffect} options optional custom effect options
836
+ * @returns {Promise<effect>} noise reduction effect.
837
+ * @public
838
+ * @memberof Meetings
839
+ */
840
+ createNoiseReductionEffect = async (options?: INoiseReductionEffect) => {
841
+ // @ts-ignore
842
+ const authToken = this.webex.credentials.supertoken.access_token;
843
+
844
+ return new mediaHelpersModule.NoiseReductionEffect({authToken, ...options});
845
+ };
846
+
847
+ /**
848
+ * Creates a virtual background effect
849
+ *
850
+ * @param {IVirtualBackgroundEffect} options optional custom effect options
851
+ * @returns {Promise<effect>} virtual background effect.
852
+ * @public
853
+ * @memberof Meetings
854
+ */
855
+ createVirtualBackgroundEffect = async (options?: IVirtualBackgroundEffect) => {
856
+ // @ts-ignore
857
+ const authToken = this.webex.credentials.supertoken.access_token;
858
+
859
+ return new mediaHelpersModule.VirtualBackgroundEffect({authToken, ...options});
860
+ };
861
+
634
862
  /**
635
863
  * Uploads logs to the webex services for tracking
636
864
  * @param {Object} [options={}]
@@ -645,8 +873,10 @@ export default class Meetings extends WebexPlugin {
645
873
  */
646
874
  uploadLogs(
647
875
  options: {
876
+ autoupload?: boolean;
648
877
  callStart?: string;
649
878
  feedbackId?: string;
879
+ locussessionid?: string;
650
880
  locusId?: string;
651
881
  correlationId?: string;
652
882
  meetingId?: string;
@@ -663,6 +893,7 @@ export default class Meetings extends WebexPlugin {
663
893
  'Meetings:index#uploadLogs --> Upload logs for meeting completed.',
664
894
  uploadResult
665
895
  );
896
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_SUCCESS, options);
666
897
  Trigger.trigger(
667
898
  this,
668
899
  {
@@ -697,8 +928,7 @@ export default class Meetings extends WebexPlugin {
697
928
  );
698
929
 
699
930
  Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE, {
700
- // @ts-ignore - seems like typo
701
- meetingId: options.meetingsId,
931
+ ...options,
702
932
  reason: uploadError.message,
703
933
  stack: uploadError.stack,
704
934
  code: uploadError.code,
@@ -706,17 +936,6 @@ export default class Meetings extends WebexPlugin {
706
936
  });
707
937
  }
708
938
 
709
- /**
710
- * initializes the reachability instance for Meetings
711
- * @returns {undefined}
712
- * @public
713
- * @memberof Meetings
714
- */
715
- setReachability() {
716
- // @ts-ignore
717
- this.reachability = new Reachability(this.webex);
718
- }
719
-
720
939
  /**
721
940
  * gets the reachability instance for Meetings
722
941
  * @returns {Reachability}
@@ -734,10 +953,6 @@ export default class Meetings extends WebexPlugin {
734
953
  * @memberof Meetings
735
954
  */
736
955
  startReachability() {
737
- if (!this.reachability) {
738
- this.setReachability();
739
- }
740
-
741
956
  return this.getReachability().gatherReachability();
742
957
  }
743
958
 
@@ -765,6 +980,29 @@ export default class Meetings extends WebexPlugin {
765
980
  if (res) {
766
981
  this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);
767
982
  }
983
+
984
+ // fall back to getting the preferred site from the user information
985
+ if (!this.preferredWebexSite) {
986
+ // @ts-ignore
987
+ return this.webex.internal.user
988
+ .get()
989
+ .then((user) => {
990
+ const preferredWebexSite =
991
+ user?.userPreferences?.userPreferencesItems?.preferredWebExSite;
992
+ if (preferredWebexSite) {
993
+ this.preferredWebexSite = preferredWebexSite;
994
+ } else {
995
+ throw new Error('site not found');
996
+ }
997
+ })
998
+ .catch(() => {
999
+ LoggerProxy.logger.error(
1000
+ 'Failed to fetch preferred site from user - no site will be set'
1001
+ );
1002
+ });
1003
+ }
1004
+
1005
+ return Promise.resolve();
768
1006
  });
769
1007
  }
770
1008
 
@@ -805,29 +1043,55 @@ export default class Meetings extends WebexPlugin {
805
1043
  }
806
1044
 
807
1045
  /**
808
- * Create a meeting.
809
- * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}
1046
+ * Create a meeting or return an existing meeting.
1047
+ *
1048
+ * When meeting info passed it should be complete, e.g.: fetched after password or captcha provided
1049
+ *
1050
+ * @param {string} destination - sipURL, phonenumber, or locus object}
810
1051
  * @param {string} [type] - the optional specified type, such as locusId
811
1052
  * @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info
1053
+ * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
1054
+ * @param {string} correlationId - the optional specified correlationId (callStateForMetrics.correlationId can be provided instead)
1055
+ * @param {Boolean} failOnMissingMeetingInfo - whether to throw an error if meeting info fails to fetch (for calls that are not 1:1 or content share)
1056
+ * @param {CallStateForMetrics} callStateForMetrics - information about call state for metrics
1057
+ * @param {Object} [meetingInfo] - Pre-fetched complete meeting info
1058
+ * @param {String} [meetingLookupUrl] - meeting info prefetch url
812
1059
  * @returns {Promise<Meeting>} A new Meeting.
813
1060
  * @public
814
1061
  * @memberof Meetings
815
1062
  */
816
- public create(destination: string, type: string = null, useRandomDelayForInfo = false) {
1063
+ public create(
1064
+ destination: string,
1065
+ type: string = null,
1066
+ useRandomDelayForInfo = false,
1067
+ infoExtraParams = {},
1068
+ correlationId: string = undefined,
1069
+ failOnMissingMeetingInfo = false,
1070
+ callStateForMetrics: CallStateForMetrics = undefined,
1071
+ meetingInfo = undefined,
1072
+ meetingLookupUrl = undefined
1073
+ ) {
817
1074
  // TODO: type should be from a dictionary
818
1075
 
819
1076
  // Validate meeting information based on the provided destination and
820
1077
  // type. This must be performed prior to determining if the meeting is
821
1078
  // found in the collection, as we mutate the destination for hydra person
822
1079
  // id values.
1080
+ if (correlationId) {
1081
+ callStateForMetrics = {...(callStateForMetrics || {}), correlationId};
1082
+ }
1083
+
823
1084
  return (
824
1085
  this.meetingInfo
825
1086
  .fetchInfoOptions(destination, type)
826
1087
  // Catch a failure to fetch info options.
827
1088
  .catch((error) => {
828
- LoggerProxy.logger.info(
829
- `Meetings:index#create --> INFO, unable to determine info options: ${error.message}`
1089
+ LoggerProxy.logger.error(
1090
+ `Meetings:index#create --> ERROR, unable to determine info options: ${error.message}`
830
1091
  );
1092
+ if (error instanceof SpaceIDDeprecatedError) {
1093
+ throw new SpaceIDDeprecatedError();
1094
+ }
831
1095
  })
832
1096
  .then((options: any = {}) => {
833
1097
  // Normalize the destination.
@@ -858,49 +1122,61 @@ export default class Meetings extends WebexPlugin {
858
1122
  // Validate if a meeting was found.
859
1123
  if (!meeting) {
860
1124
  // Create a meeting based on the normalized destination and type.
861
- return this.createMeeting(targetDest, type, useRandomDelayForInfo).then(
862
- (createdMeeting: any) => {
863
- // If the meeting was successfully created.
864
- if (createdMeeting && createdMeeting.on) {
865
- // Create a destruction event for the meeting.
866
- createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {
867
- // @ts-ignore
868
- if (this.config.autoUploadLogs) {
869
- this.uploadLogs({
870
- callStart: createdMeeting.locusInfo?.fullState?.lastActive,
871
- correlationId: createdMeeting.correlationId,
872
- feedbackId: createdMeeting.correlationId,
873
- locusId: createdMeeting.locusId,
874
- meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
875
- }).then(() => this.destroy(createdMeeting, payload.reason));
876
- } else {
877
- this.destroy(createdMeeting, payload.reason);
878
- }
879
- });
880
-
881
- createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
882
- // @ts-ignore
883
- if (this.config.autoUploadLogs) {
884
- this.uploadLogs({
885
- callStart: meetingInstance?.locusInfo?.fullState?.lastActive,
886
- correlationId: meetingInstance.correlationId,
887
- feedbackId: meetingInstance.correlationId,
888
- locusId: meetingInstance.locusId,
889
- meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
890
- });
891
- }
892
- });
893
- } else {
894
- LoggerProxy.logger.error(
895
- `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
896
- );
897
- }
898
-
899
- // Return the newly created meeting.
900
- return Promise.resolve(createdMeeting);
1125
+ return this.createMeeting(
1126
+ targetDest,
1127
+ type,
1128
+ useRandomDelayForInfo,
1129
+ infoExtraParams,
1130
+ callStateForMetrics,
1131
+ failOnMissingMeetingInfo,
1132
+ meetingInfo,
1133
+ meetingLookupUrl
1134
+ ).then((createdMeeting: any) => {
1135
+ // If the meeting was successfully created.
1136
+ if (createdMeeting && createdMeeting.on) {
1137
+ // Create a destruction event for the meeting.
1138
+ createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {
1139
+ // @ts-ignore
1140
+ if (this.config.autoUploadLogs) {
1141
+ this.uploadLogs({
1142
+ callStart: createdMeeting.locusInfo?.fullState?.lastActive,
1143
+ locussessionid: createdMeeting.locusInfo?.fullState?.sessionId,
1144
+ correlationId: createdMeeting.correlationId,
1145
+ feedbackId: createdMeeting.correlationId,
1146
+ locusId: createdMeeting.locusId,
1147
+ meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
1148
+ autoupload: true,
1149
+ }).then(() => this.destroy(createdMeeting, payload.reason));
1150
+ } else {
1151
+ this.destroy(createdMeeting, payload.reason);
1152
+ }
1153
+ });
1154
+
1155
+ createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
1156
+ // @ts-ignore
1157
+ if (this.config.autoUploadLogs) {
1158
+ this.uploadLogs({
1159
+ callStart: meetingInstance?.locusInfo?.fullState?.lastActive,
1160
+ locussessionid: meetingInstance?.locusInfo?.fullState?.sessionId,
1161
+ correlationId: meetingInstance.correlationId,
1162
+ feedbackId: meetingInstance.correlationId,
1163
+ locusId: meetingInstance.locusId,
1164
+ meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
1165
+ autoupload: true,
1166
+ });
1167
+ }
1168
+ });
1169
+ } else {
1170
+ LoggerProxy.logger.error(
1171
+ `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
1172
+ );
901
1173
  }
902
- );
1174
+
1175
+ // Return the newly created meeting.
1176
+ return Promise.resolve(createdMeeting);
1177
+ });
903
1178
  }
1179
+ meeting.setCallStateForMetrics(callStateForMetrics);
904
1180
 
905
1181
  // Return the existing meeting.
906
1182
  return Promise.resolve(meeting);
@@ -909,9 +1185,18 @@ export default class Meetings extends WebexPlugin {
909
1185
  }
910
1186
 
911
1187
  /**
1188
+ * Create meeting
1189
+ *
1190
+ * When meeting info passed it should be complete, e.g.: fetched after password or captcha provided
1191
+ *
912
1192
  * @param {String} destination see create()
913
1193
  * @param {String} type see create()
914
1194
  * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
1195
+ * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
1196
+ * @param {CallStateForMetrics} callStateForMetrics - information about call state for metrics
1197
+ * @param {Boolean} failOnMissingMeetingInfo - whether to throw an error if meeting info fails to fetch (for calls that are not 1:1 or content share)
1198
+ * @param {Object} [meetingInfo] - Pre-fetched complete meeting info
1199
+ * @param {String} [meetingLookupUrl] - meeting info prefetch url
915
1200
  * @returns {Promise} a new meeting instance complete with meeting info and destination
916
1201
  * @private
917
1202
  * @memberof Meetings
@@ -919,7 +1204,12 @@ export default class Meetings extends WebexPlugin {
919
1204
  private async createMeeting(
920
1205
  destination: any,
921
1206
  type: string = null,
922
- useRandomDelayForInfo = false
1207
+ useRandomDelayForInfo = false,
1208
+ infoExtraParams = {},
1209
+ callStateForMetrics: CallStateForMetrics = undefined,
1210
+ failOnMissingMeetingInfo = false,
1211
+ meetingInfo = undefined,
1212
+ meetingLookupUrl = undefined
923
1213
  ) {
924
1214
  const meeting = new Meeting(
925
1215
  {
@@ -929,11 +1219,11 @@ export default class Meetings extends WebexPlugin {
929
1219
  deviceUrl: this.webex.internal.device.url,
930
1220
  // @ts-ignore
931
1221
  orgId: this.webex.internal.device.orgId,
932
- roapSeq: 0,
933
1222
  locus: type === _LOCUS_ID_ ? destination : null, // pass the locus object if present
934
1223
  meetingInfoProvider: this.meetingInfo,
935
1224
  destination,
936
1225
  destinationType: type,
1226
+ callStateForMetrics,
937
1227
  },
938
1228
  {
939
1229
  // @ts-ignore
@@ -965,22 +1255,45 @@ export default class Meetings extends WebexPlugin {
965
1255
  const isMeetingActive = !!destination.fullState?.active;
966
1256
  // @ts-ignore
967
1257
  const {enableUnifiedMeetings} = this.config.experimental;
968
-
969
- if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {
1258
+ const meetingInfoOptions = {
1259
+ extraParams: infoExtraParams,
1260
+ sendCAevents: !!callStateForMetrics?.correlationId, // if client sends correlation id as argument of public create(), then it means that this meeting creation is part of a pre-join intent from user
1261
+ };
1262
+
1263
+ if (meetingInfo) {
1264
+ meeting.injectMeetingInfo(meetingInfo, meetingInfoOptions, meetingLookupUrl);
1265
+ } else if (
1266
+ enableUnifiedMeetings &&
1267
+ !isMeetingActive &&
1268
+ useRandomDelayForInfo &&
1269
+ waitingTime > 0
1270
+ ) {
970
1271
  meeting.fetchMeetingInfoTimeoutId = setTimeout(
971
- () => meeting.fetchMeetingInfo({}),
1272
+ () => meeting.fetchMeetingInfo(meetingInfoOptions),
972
1273
  waitingTime
973
1274
  );
974
1275
  meeting.parseMeetingInfo(undefined, destination);
975
1276
  } else {
976
- await meeting.fetchMeetingInfo({});
1277
+ await meeting.fetchMeetingInfo(meetingInfoOptions);
977
1278
  }
978
1279
  } catch (err) {
979
- if (!(err instanceof CaptchaError) && !(err instanceof PasswordError)) {
980
- // if there is no meeting info we assume its a 1:1 call or wireless share
1280
+ if (
1281
+ !(err instanceof CaptchaError) &&
1282
+ !(err instanceof PasswordError) &&
1283
+ !(err instanceof PermissionError)
1284
+ ) {
981
1285
  LoggerProxy.logger.info(
982
1286
  `Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`
983
1287
  );
1288
+ if (failOnMissingMeetingInfo) {
1289
+ LoggerProxy.logger.info(
1290
+ `Meetings:index#createMeeting --> Destroying meeting due to missing meeting info.`
1291
+ );
1292
+ // @ts-ignore
1293
+ this.destroy(meeting, MEETING_REMOVED_REASON.MISSING_MEETING_INFO);
1294
+ throw new NoMeetingInfoError();
1295
+ }
1296
+ // if there is no meeting info and no error should be thrown then we assume its a 1:1 call or wireless share
984
1297
  LoggerProxy.logger.info(
985
1298
  'Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share'
986
1299
  );
@@ -1033,7 +1346,7 @@ export default class Meetings extends WebexPlugin {
1033
1346
  //
1034
1347
  // Our job is to determine the appropriate one
1035
1348
  // and its corresponding service so that developers
1036
- // need only sipURL or spaceID to get a meeting
1349
+ // need only sipURL to get a meeting
1037
1350
  // and its ID, but have the option to use createWithType()
1038
1351
  // and specify those types to get meetingInfo
1039
1352
  }
@@ -1072,38 +1385,116 @@ export default class Meetings extends WebexPlugin {
1072
1385
 
1073
1386
  /**
1074
1387
  * syncs all the meeting from server
1075
- * @returns {undefined}
1388
+ * @param {boolean} keepOnlyLocusMeetings - whether the sync should keep only locus meetings or any other meeting in meetingCollection
1389
+ * @returns {Promise<void>}
1076
1390
  * @public
1077
1391
  * @memberof Meetings
1078
1392
  */
1079
- public syncMeetings() {
1080
- return this.request.getActiveMeetings().then((locusArray) => {
1081
- const activeLocusUrl = [];
1082
-
1083
- if (locusArray?.loci && locusArray.loci.length > 0) {
1084
- locusArray.loci.forEach((locus) => {
1085
- activeLocusUrl.push(locus.url);
1086
- this.handleLocusEvent({
1087
- locus,
1088
- locusUrl: locus.url,
1393
+ public syncMeetings({keepOnlyLocusMeetings = true} = {}): Promise<void> {
1394
+ return this.request
1395
+ .getActiveMeetings()
1396
+ .then((locusArray) => {
1397
+ const activeLocusUrl = [];
1398
+
1399
+ if (locusArray?.loci && locusArray.loci.length > 0) {
1400
+ const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);
1401
+ lociToUpdate.forEach((locus) => {
1402
+ activeLocusUrl.push(locus.url);
1403
+ this.handleLocusEvent({
1404
+ locus,
1405
+ locusUrl: locus.url,
1406
+ });
1089
1407
  });
1090
- });
1091
- }
1092
- const meetingsCollection = this.meetingCollection.getAll();
1408
+ }
1409
+ const meetingsCollection = this.meetingCollection.getAll();
1093
1410
 
1094
- if (Object.keys(meetingsCollection).length > 0) {
1095
- // Some time the mercury event is missed after mercury reconnect
1096
- // if sync returns no locus then clear all the meetings
1097
- for (const meeting of Object.values(meetingsCollection)) {
1098
- // @ts-ignore
1099
- if (!activeLocusUrl.includes(meeting.locusUrl)) {
1100
- // destroy function also uploads logs
1411
+ if (Object.keys(meetingsCollection).length > 0) {
1412
+ // Sometimes the mercury events are lost after mercury reconnect
1413
+ // Remove any Locus meetings that are not returned by Locus
1414
+ // (they had a locusUrl previously but are no longer active) in the sync
1415
+ for (const meeting of Object.values(meetingsCollection)) {
1101
1416
  // @ts-ignore
1102
- this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
1417
+ const {locusUrl} = meeting;
1418
+ if ((keepOnlyLocusMeetings || locusUrl) && !activeLocusUrl.includes(locusUrl)) {
1419
+ // destroy function also uploads logs
1420
+ // @ts-ignore
1421
+ this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
1422
+ }
1103
1423
  }
1104
1424
  }
1425
+ })
1426
+ .catch((error) => {
1427
+ LoggerProxy.logger.error(
1428
+ `Meetings:index#syncMeetings --> failed to sync meetings, ${error}`
1429
+ );
1430
+ throw new Error(error);
1431
+ });
1432
+ }
1433
+
1434
+ /**
1435
+ * sort out locus array for initial creating
1436
+ * @param {Array} loci original locus array
1437
+ * @returns {undefined}
1438
+ * @public
1439
+ * @memberof Meetings
1440
+ */
1441
+ sortLocusArrayToUpdate(loci: any[]) {
1442
+ const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));
1443
+ const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));
1444
+ this.breakoutLocusForHandleLater = [];
1445
+ const lociToUpdate = [...mainLoci];
1446
+ breakoutLoci.forEach((breakoutLocus) => {
1447
+ const associateMainLocus = mainLoci.find(
1448
+ (mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url
1449
+ );
1450
+ const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({
1451
+ locus: breakoutLocus,
1452
+ locusUrl: breakoutLocus.url,
1453
+ });
1454
+
1455
+ if (associateMainLocus && !existCorrespondingMeeting) {
1456
+ // if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,
1457
+ // after meeting create with main locus, then handle the associate breakout locus.
1458
+ // if only handle breakout locus, will miss some date
1459
+ this.breakoutLocusForHandleLater.push(breakoutLocus);
1460
+ } else {
1461
+ lociToUpdate.push(breakoutLocus);
1105
1462
  }
1106
1463
  });
1464
+
1465
+ return lociToUpdate;
1466
+ }
1467
+
1468
+ /**
1469
+ * check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus
1470
+ * @param {Object} newCreatedLocus the locus which just create meeting object of it
1471
+ * @returns {undefined}
1472
+ * @public
1473
+ * @memberof Meetings
1474
+ */
1475
+ checkHandleBreakoutLocus(newCreatedLocus) {
1476
+ if (
1477
+ !newCreatedLocus ||
1478
+ !this.breakoutLocusForHandleLater ||
1479
+ !this.breakoutLocusForHandleLater.length
1480
+ ) {
1481
+ return;
1482
+ }
1483
+ if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {
1484
+ return;
1485
+ }
1486
+ const existIndex = this.breakoutLocusForHandleLater.findIndex(
1487
+ (breakoutLocus) =>
1488
+ breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url
1489
+ );
1490
+
1491
+ if (existIndex < 0) {
1492
+ return;
1493
+ }
1494
+
1495
+ const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];
1496
+ this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});
1497
+ this.breakoutLocusForHandleLater.splice(existIndex, 1);
1107
1498
  }
1108
1499
 
1109
1500
  /**
@@ -1125,4 +1516,15 @@ export default class Meetings extends WebexPlugin {
1125
1516
  getLogger() {
1126
1517
  return LoggerProxy.get();
1127
1518
  }
1519
+
1520
+ /**
1521
+ * Returns the first meeting it finds that has the webrtc media connection created.
1522
+ * Useful for debugging in the console.
1523
+ *
1524
+ * @private
1525
+ * @returns {Meeting} Meeting object that has a webrtc media connection, else undefined
1526
+ */
1527
+ getActiveWebrtcMeeting() {
1528
+ return this.meetingCollection.getActiveWebrtcMeeting();
1529
+ }
1128
1530
  }