@webex/plugin-meetings 3.0.0-beta.22 → 3.0.0-beta.221

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 (419) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +114 -14
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +3 -2
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +3 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +188 -30
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +319 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +106 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +357 -62
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/infoUtils.js +7 -1
  53. package/dist/locus-info/infoUtils.js.map +1 -1
  54. package/dist/locus-info/mediaSharesUtils.js +43 -1
  55. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  56. package/dist/locus-info/parser.js +219 -63
  57. package/dist/locus-info/parser.js.map +1 -1
  58. package/dist/locus-info/selfUtils.js +89 -14
  59. package/dist/locus-info/selfUtils.js.map +1 -1
  60. package/dist/media/index.js +49 -106
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +29 -90
  63. package/dist/media/properties.js.map +1 -1
  64. package/dist/mediaQualityMetrics/config.js +505 -493
  65. package/dist/mediaQualityMetrics/config.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +90 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +2587 -2560
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +292 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +228 -123
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +244 -194
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +568 -414
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +48 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +171 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/utilv2.js +20 -5
  83. package/dist/meeting-info/utilv2.js.map +1 -1
  84. package/dist/meetings/collection.js +22 -0
  85. package/dist/meetings/collection.js.map +1 -1
  86. package/dist/meetings/index.js +361 -84
  87. package/dist/meetings/index.js.map +1 -1
  88. package/dist/meetings/meetings.types.js +7 -0
  89. package/dist/meetings/meetings.types.js.map +1 -0
  90. package/dist/meetings/request.js +2 -0
  91. package/dist/meetings/request.js.map +1 -1
  92. package/dist/meetings/util.js +88 -1
  93. package/dist/meetings/util.js.map +1 -1
  94. package/dist/member/index.js +49 -0
  95. package/dist/member/index.js.map +1 -1
  96. package/dist/member/types.js +25 -0
  97. package/dist/member/types.js.map +1 -0
  98. package/dist/member/util.js +121 -25
  99. package/dist/member/util.js.map +1 -1
  100. package/dist/members/collection.js +10 -0
  101. package/dist/members/collection.js.map +1 -1
  102. package/dist/members/index.js +86 -5
  103. package/dist/members/index.js.map +1 -1
  104. package/dist/members/request.js +106 -38
  105. package/dist/members/request.js.map +1 -1
  106. package/dist/members/types.js +15 -0
  107. package/dist/members/types.js.map +1 -0
  108. package/dist/members/util.js +316 -233
  109. package/dist/members/util.js.map +1 -1
  110. package/dist/metrics/constants.js +3 -5
  111. package/dist/metrics/constants.js.map +1 -1
  112. package/dist/metrics/index.js +1 -468
  113. package/dist/metrics/index.js.map +1 -1
  114. package/dist/multistream/mediaRequestManager.js +238 -49
  115. package/dist/multistream/mediaRequestManager.js.map +1 -1
  116. package/dist/multistream/receiveSlot.js +49 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +52 -34
  119. package/dist/multistream/receiveSlotManager.js.map +1 -1
  120. package/dist/multistream/remoteMedia.js +44 -18
  121. package/dist/multistream/remoteMedia.js.map +1 -1
  122. package/dist/multistream/remoteMediaGroup.js +60 -3
  123. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  124. package/dist/multistream/remoteMediaManager.js +173 -59
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/networkQualityMonitor/index.js +4 -2
  127. package/dist/networkQualityMonitor/index.js.map +1 -1
  128. package/dist/reachability/index.js +90 -30
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +16 -7
  131. package/dist/reachability/request.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +196 -155
  133. package/dist/reconnection-manager/index.js.map +1 -1
  134. package/dist/recording-controller/index.js +21 -2
  135. package/dist/recording-controller/index.js.map +1 -1
  136. package/dist/recording-controller/util.js +9 -8
  137. package/dist/recording-controller/util.js.map +1 -1
  138. package/dist/roap/index.js +25 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +111 -89
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +97 -36
  143. package/dist/roap/turnDiscovery.js.map +1 -1
  144. package/dist/rtcMetrics/constants.js +12 -0
  145. package/dist/rtcMetrics/constants.js.map +1 -0
  146. package/dist/rtcMetrics/index.js +117 -0
  147. package/dist/rtcMetrics/index.js.map +1 -0
  148. package/dist/statsAnalyzer/global.js +1 -93
  149. package/dist/statsAnalyzer/global.js.map +1 -1
  150. package/dist/statsAnalyzer/index.js +326 -311
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/breakout.d.ts +8 -0
  158. package/dist/types/breakouts/collection.d.ts +5 -0
  159. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  160. package/dist/types/breakouts/events.d.ts +8 -0
  161. package/dist/types/breakouts/index.d.ts +5 -0
  162. package/dist/types/breakouts/request.d.ts +22 -0
  163. package/dist/types/breakouts/utils.d.ts +15 -0
  164. package/dist/types/common/browser-detection.d.ts +9 -0
  165. package/dist/types/common/collection.d.ts +48 -0
  166. package/dist/types/common/config.d.ts +2 -0
  167. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  168. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  169. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  170. package/dist/types/common/errors/media.d.ts +15 -0
  171. package/dist/types/common/errors/parameter.d.ts +15 -0
  172. package/dist/types/common/errors/password-error.d.ts +15 -0
  173. package/dist/types/common/errors/permission.d.ts +14 -0
  174. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  175. package/dist/types/common/errors/reconnection.d.ts +15 -0
  176. package/dist/types/common/errors/stats.d.ts +15 -0
  177. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  178. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  179. package/dist/types/common/events/events-scope.d.ts +17 -0
  180. package/dist/types/common/events/events.d.ts +12 -0
  181. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  182. package/dist/types/common/events/util.d.ts +2 -0
  183. package/dist/types/common/logs/logger-config.d.ts +2 -0
  184. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  185. package/dist/types/common/logs/request.d.ts +34 -0
  186. package/dist/types/common/queue.d.ts +34 -0
  187. package/dist/types/config.d.ts +72 -0
  188. package/dist/types/constants.d.ts +1028 -0
  189. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  190. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  191. package/dist/types/controls-options-manager/index.d.ts +136 -0
  192. package/dist/types/controls-options-manager/types.d.ts +43 -0
  193. package/dist/types/controls-options-manager/util.d.ts +1 -0
  194. package/dist/types/index.d.ts +7 -0
  195. package/dist/types/interpretation/collection.d.ts +5 -0
  196. package/dist/types/interpretation/index.d.ts +5 -0
  197. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  198. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  199. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  200. package/dist/types/locus-info/fullState.d.ts +2 -0
  201. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  202. package/dist/types/locus-info/index.d.ts +322 -0
  203. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  204. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  205. package/dist/types/locus-info/parser.d.ts +271 -0
  206. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  207. package/dist/types/media/index.d.ts +34 -0
  208. package/dist/types/media/properties.d.ts +93 -0
  209. package/dist/types/media/util.d.ts +2 -0
  210. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  211. package/dist/types/meeting/in-meeting-actions.d.ts +163 -0
  212. package/dist/types/meeting/index.d.ts +1512 -0
  213. package/dist/types/meeting/locusMediaRequest.d.ts +75 -0
  214. package/dist/types/meeting/muteState.d.ts +184 -0
  215. package/dist/types/meeting/request.d.ts +289 -0
  216. package/dist/types/meeting/request.type.d.ts +11 -0
  217. package/dist/types/meeting/state.d.ts +9 -0
  218. package/dist/types/meeting/util.d.ts +94 -0
  219. package/dist/types/meeting-info/collection.d.ts +20 -0
  220. package/dist/types/meeting-info/index.d.ts +62 -0
  221. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  222. package/dist/types/meeting-info/request.d.ts +22 -0
  223. package/dist/types/meeting-info/util.d.ts +2 -0
  224. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  225. package/dist/types/meetings/collection.d.ts +31 -0
  226. package/dist/types/meetings/index.d.ts +361 -0
  227. package/dist/types/meetings/meetings.types.d.ts +4 -0
  228. package/dist/types/meetings/request.d.ts +27 -0
  229. package/dist/types/meetings/util.d.ts +18 -0
  230. package/dist/types/member/index.d.ts +159 -0
  231. package/dist/types/member/types.d.ts +32 -0
  232. package/dist/types/member/util.d.ts +2 -0
  233. package/dist/types/members/collection.d.ts +29 -0
  234. package/dist/types/members/index.d.ts +353 -0
  235. package/dist/types/members/request.d.ts +114 -0
  236. package/dist/types/members/types.d.ts +24 -0
  237. package/dist/types/members/util.d.ts +210 -0
  238. package/dist/types/metrics/constants.d.ts +55 -0
  239. package/dist/types/metrics/index.d.ts +45 -0
  240. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  241. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  242. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  243. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  244. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  245. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  246. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  247. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  248. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  249. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  250. package/dist/types/reachability/index.d.ts +158 -0
  251. package/dist/types/reachability/request.d.ts +39 -0
  252. package/dist/types/reactions/constants.d.ts +3 -0
  253. package/dist/types/reactions/reactions.d.ts +4 -0
  254. package/dist/types/reactions/reactions.type.d.ts +52 -0
  255. package/dist/types/reconnection-manager/index.d.ts +126 -0
  256. package/dist/types/recording-controller/enums.d.ts +7 -0
  257. package/dist/types/recording-controller/index.d.ts +207 -0
  258. package/dist/types/recording-controller/util.d.ts +14 -0
  259. package/dist/types/roap/index.d.ts +77 -0
  260. package/dist/types/roap/request.d.ts +38 -0
  261. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  262. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  263. package/dist/types/rtcMetrics/index.d.ts +47 -0
  264. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  265. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  266. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  267. package/dist/types/transcription/index.d.ts +64 -0
  268. package/package.json +23 -20
  269. package/src/annotation/annotation.types.ts +50 -0
  270. package/src/annotation/constants.ts +36 -0
  271. package/src/annotation/index.ts +328 -0
  272. package/src/breakouts/README.md +44 -14
  273. package/src/breakouts/breakout.ts +87 -9
  274. package/src/breakouts/edit-lock-error.ts +25 -0
  275. package/src/breakouts/events.ts +56 -0
  276. package/src/breakouts/index.ts +710 -10
  277. package/src/breakouts/request.ts +55 -0
  278. package/src/breakouts/utils.ts +57 -0
  279. package/src/common/errors/webex-errors.ts +6 -2
  280. package/src/common/logs/logger-proxy.ts +1 -1
  281. package/src/common/queue.ts +22 -8
  282. package/src/config.ts +2 -7
  283. package/src/constants.ts +175 -21
  284. package/src/controls-options-manager/constants.ts +5 -0
  285. package/src/controls-options-manager/enums.ts +18 -0
  286. package/src/controls-options-manager/index.ts +278 -0
  287. package/src/controls-options-manager/types.ts +59 -0
  288. package/src/controls-options-manager/util.ts +300 -0
  289. package/src/index.ts +39 -0
  290. package/src/interpretation/README.md +60 -0
  291. package/src/interpretation/collection.ts +19 -0
  292. package/src/interpretation/index.ts +332 -0
  293. package/src/interpretation/siLanguage.ts +18 -0
  294. package/src/locus-info/controlsUtils.ts +108 -0
  295. package/src/locus-info/index.ts +381 -59
  296. package/src/locus-info/infoUtils.ts +10 -2
  297. package/src/locus-info/mediaSharesUtils.ts +48 -0
  298. package/src/locus-info/parser.ts +224 -39
  299. package/src/locus-info/selfUtils.ts +81 -5
  300. package/src/media/index.ts +89 -109
  301. package/src/media/properties.ts +49 -90
  302. package/src/mediaQualityMetrics/config.ts +379 -377
  303. package/src/meeting/in-meeting-actions.ts +179 -3
  304. package/src/meeting/index.ts +2062 -2137
  305. package/src/meeting/locusMediaRequest.ts +314 -0
  306. package/src/meeting/muteState.ts +227 -130
  307. package/src/meeting/request.ts +157 -116
  308. package/src/meeting/util.ts +555 -396
  309. package/src/meeting-info/index.ts +54 -8
  310. package/src/meeting-info/meeting-info-v2.ts +148 -14
  311. package/src/meeting-info/utilv2.ts +13 -3
  312. package/src/meetings/collection.ts +20 -0
  313. package/src/meetings/index.ts +397 -102
  314. package/src/meetings/meetings.types.ts +12 -0
  315. package/src/meetings/request.ts +2 -0
  316. package/src/meetings/util.ts +103 -4
  317. package/src/member/index.ts +49 -0
  318. package/src/member/types.ts +38 -0
  319. package/src/member/util.ts +127 -25
  320. package/src/members/collection.ts +8 -0
  321. package/src/members/index.ts +107 -6
  322. package/src/members/request.ts +97 -17
  323. package/src/members/types.ts +28 -0
  324. package/src/members/util.ts +319 -240
  325. package/src/metrics/constants.ts +2 -4
  326. package/src/metrics/index.ts +1 -490
  327. package/src/multistream/mediaRequestManager.ts +289 -79
  328. package/src/multistream/receiveSlot.ts +55 -18
  329. package/src/multistream/receiveSlotManager.ts +46 -24
  330. package/src/multistream/remoteMedia.ts +27 -2
  331. package/src/multistream/remoteMediaGroup.ts +59 -0
  332. package/src/multistream/remoteMediaManager.ts +113 -32
  333. package/src/networkQualityMonitor/index.ts +6 -6
  334. package/src/reachability/index.ts +76 -18
  335. package/src/reachability/request.ts +16 -7
  336. package/src/reconnection-manager/index.ts +68 -43
  337. package/src/recording-controller/index.ts +20 -3
  338. package/src/recording-controller/util.ts +26 -9
  339. package/src/roap/index.ts +25 -30
  340. package/src/roap/request.ts +103 -95
  341. package/src/roap/turnDiscovery.ts +51 -25
  342. package/src/rtcMetrics/constants.ts +3 -0
  343. package/src/rtcMetrics/index.ts +100 -0
  344. package/src/statsAnalyzer/global.ts +1 -94
  345. package/src/statsAnalyzer/index.ts +376 -386
  346. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  347. package/test/integration/spec/converged-space-meetings.js +233 -0
  348. package/test/integration/spec/journey.js +336 -259
  349. package/test/integration/spec/space-meeting.js +77 -4
  350. package/test/unit/spec/annotation/index.ts +418 -0
  351. package/test/unit/spec/breakouts/breakout.ts +142 -24
  352. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  353. package/test/unit/spec/breakouts/events.ts +89 -0
  354. package/test/unit/spec/breakouts/index.ts +1545 -48
  355. package/test/unit/spec/breakouts/request.ts +104 -0
  356. package/test/unit/spec/breakouts/utils.js +72 -0
  357. package/test/unit/spec/common/queue.js +31 -2
  358. package/test/unit/spec/controls-options-manager/index.js +287 -0
  359. package/test/unit/spec/controls-options-manager/util.js +582 -0
  360. package/test/unit/spec/fixture/locus.js +1 -0
  361. package/test/unit/spec/interpretation/collection.ts +15 -0
  362. package/test/unit/spec/interpretation/index.ts +589 -0
  363. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  364. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  365. package/test/unit/spec/locus-info/index.js +1169 -36
  366. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  367. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  368. package/test/unit/spec/locus-info/parser.js +62 -22
  369. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  370. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  371. package/test/unit/spec/media/index.ts +138 -28
  372. package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
  373. package/test/unit/spec/meeting/index.js +3510 -1747
  374. package/test/unit/spec/meeting/locusMediaRequest.ts +443 -0
  375. package/test/unit/spec/meeting/muteState.js +370 -208
  376. package/test/unit/spec/meeting/request.js +417 -45
  377. package/test/unit/spec/meeting/utils.js +601 -53
  378. package/test/unit/spec/meeting-info/index.js +181 -0
  379. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  380. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  381. package/test/unit/spec/meetings/collection.js +14 -0
  382. package/test/unit/spec/meetings/index.js +874 -150
  383. package/test/unit/spec/meetings/utils.js +206 -2
  384. package/test/unit/spec/member/index.js +58 -4
  385. package/test/unit/spec/member/util.js +479 -35
  386. package/test/unit/spec/members/index.js +319 -1
  387. package/test/unit/spec/members/request.js +206 -27
  388. package/test/unit/spec/members/utils.js +184 -0
  389. package/test/unit/spec/metrics/index.js +1 -50
  390. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  391. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  392. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  393. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  394. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  395. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  396. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  397. package/test/unit/spec/reachability/index.ts +185 -7
  398. package/test/unit/spec/reachability/request.js +68 -0
  399. package/test/unit/spec/reconnection-manager/index.js +59 -6
  400. package/test/unit/spec/recording-controller/index.js +294 -218
  401. package/test/unit/spec/recording-controller/util.js +223 -96
  402. package/test/unit/spec/roap/index.ts +27 -51
  403. package/test/unit/spec/roap/request.ts +202 -85
  404. package/test/unit/spec/roap/turnDiscovery.ts +36 -8
  405. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  406. package/test/unit/spec/stats-analyzer/index.js +92 -41
  407. package/test/utils/constants.js +9 -0
  408. package/test/utils/integrationTestUtils.js +46 -0
  409. package/test/utils/testUtils.js +0 -45
  410. package/test/utils/webex-config.js +4 -0
  411. package/test/utils/webex-test-users.js +6 -3
  412. package/dist/meeting/effectsState.js +0 -262
  413. package/dist/meeting/effectsState.js.map +0 -1
  414. package/dist/metrics/config.js +0 -299
  415. package/dist/metrics/config.js.map +0 -1
  416. package/src/index.js +0 -16
  417. package/src/meeting/effectsState.ts +0 -211
  418. package/src/metrics/config.ts +0 -495
  419. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -2,14 +2,16 @@
2
2
 
3
3
  import '@webex/internal-plugin-mercury';
4
4
  import '@webex/internal-plugin-conversation';
5
+ import '@webex/internal-plugin-metrics';
5
6
  // @ts-ignore
6
7
  import {WebexPlugin} from '@webex/webex-core';
7
8
  import {setLogger} from '@webex/internal-media-core';
8
9
 
10
+ import * as mediaHelpersModule from '@webex/media-helpers';
11
+
9
12
  import 'webrtc-adapter';
10
13
 
11
14
  import Metrics from '../metrics';
12
- import {trigger, eventType} from '../metrics/config';
13
15
  import LoggerConfig from '../common/logs/logger-config';
14
16
  import StaticConfig from '../common/config';
15
17
  import LoggerProxy from '../common/logs/logger-proxy';
@@ -40,6 +42,9 @@ import {
40
42
  MEETING_REMOVED_REASON,
41
43
  _CONVERSATION_URL_,
42
44
  CONVERSATION_URL,
45
+ MEETINGNUMBER,
46
+ _JOINED_,
47
+ _MOVED_,
43
48
  } from '../constants';
44
49
  import BEHAVIORAL_METRICS from '../metrics/constants';
45
50
  import MeetingInfo from '../meeting-info';
@@ -53,6 +58,8 @@ import CaptchaError from '../common/errors/captcha-error';
53
58
 
54
59
  import MeetingCollection from './collection';
55
60
  import MeetingsUtil from './util';
61
+ import PermissionError from '../common/errors/permission';
62
+ import {INoiseReductionEffect, IVirtualBackgroundEffect} from './meetings.types';
56
63
 
57
64
  let mediaLogger;
58
65
 
@@ -139,12 +146,13 @@ export default class Meetings extends WebexPlugin {
139
146
  meetingCollection: any;
140
147
  personalMeetingRoom: any;
141
148
  preferredWebexSite: any;
142
- reachability: any;
149
+ reachability: Reachability;
143
150
  registered: any;
144
151
  request: any;
145
152
  geoHintInfo: any;
146
153
  meetingInfo: any;
147
-
154
+ mediaHelpers: any;
155
+ breakoutLocusForHandleLater: any;
148
156
  namespace = MEETINGS;
149
157
 
150
158
  /**
@@ -156,6 +164,17 @@ export default class Meetings extends WebexPlugin {
156
164
  constructor(...args) {
157
165
  super(...args);
158
166
 
167
+ /**
168
+ * The webrtc-core media helpers. This is a temporary solution required for the SDK sample app
169
+ * to be able to call media helper functions.
170
+ *
171
+ * @instance
172
+ * @type {Object}
173
+ * @private
174
+ * @memberof Meetings
175
+ */
176
+ this.mediaHelpers = mediaHelpersModule;
177
+
159
178
  /**
160
179
  * The Meetings request to interact with server
161
180
  * @instance
@@ -183,15 +202,17 @@ export default class Meetings extends WebexPlugin {
183
202
  * @memberof Meetings
184
203
  */
185
204
  this.personalMeetingRoom = null;
205
+
186
206
  /**
187
- * The Reachability object to interact with server, starts as null until {@link Meeting#setReachability} is called
207
+ * The Reachability object to interact with server
188
208
  * starts as null
189
209
  * @instance
190
210
  * @type {Object}
191
211
  * @private
192
212
  * @memberof Meetings
193
213
  */
194
- this.reachability = null;
214
+ // @ts-ignore
215
+ this.reachability = new Reachability(this.webex);
195
216
 
196
217
  /**
197
218
  * If the meetings plugin has been registered and listening via {@link Meetings#register}
@@ -221,30 +242,137 @@ export default class Meetings extends WebexPlugin {
221
242
  */
222
243
  this.media = {
223
244
  getUserMedia: Media.getUserMedia,
224
- getSupportedDevice: Media.getSupportedDevice,
225
245
  };
226
246
 
227
247
  this.onReady();
228
248
  }
229
249
 
230
250
  /**
231
- * handle locus events and takes meeting actions with them as they come in
251
+ * check whether you need to handle this main session's locus data or not
252
+ * @param {Object} meeting current meeting data
253
+ * @param {Object} newLocus new locus data
254
+ * @returns {boolean}
255
+ * @private
256
+ * @memberof Meetings
257
+ */
258
+ private isNeedHandleMainLocus(meeting: any, newLocus: any) {
259
+ const breakoutUrl = newLocus.controls?.breakout?.url;
260
+ const breakoutLocus = this.meetingCollection.getActiveBreakoutLocus(breakoutUrl);
261
+
262
+ const isSelfJoined = newLocus?.self?.state === _JOINED_;
263
+ const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
264
+ // @ts-ignore
265
+ const deviceFromNewLocus = MeetingsUtil.getThisDevice(newLocus, this.webex.internal.device.url);
266
+ const isResourceMovedOnThisDevice =
267
+ deviceFromNewLocus?.state === _LEFT_ && deviceFromNewLocus?.reason === _MOVED_;
268
+
269
+ const isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(
270
+ meeting,
271
+ newLocus,
272
+ // @ts-ignore
273
+ this.webex.internal.device.url
274
+ );
275
+ const isBreakoutLocusJoinThisDevice =
276
+ breakoutLocus?.joinedWith?.correlationId &&
277
+ breakoutLocus.joinedWith.correlationId === meeting?.correlationId;
278
+
279
+ if (isSelfJoined && isNewLocusJoinThisDevice) {
280
+ LoggerProxy.logger.log(
281
+ 'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
282
+ );
283
+ if (breakoutLocus?.joinedWith && deviceFromNewLocus) {
284
+ const breakoutReplaceAt =
285
+ breakoutLocus.joinedWith.replaces?.length > 0
286
+ ? breakoutLocus.joinedWith.replaces[0].replaceAt
287
+ : '';
288
+ const newLocusReplaceAt =
289
+ deviceFromNewLocus.replaces?.length > 0 ? deviceFromNewLocus.replaces[0].replaceAt : '';
290
+ if (breakoutReplaceAt && newLocusReplaceAt && breakoutReplaceAt > newLocusReplaceAt) {
291
+ LoggerProxy.logger.log(
292
+ `Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt ${newLocusReplaceAt} bo replacedAt ${breakoutReplaceAt}`
293
+ );
294
+
295
+ return false;
296
+ }
297
+ }
298
+
299
+ return true;
300
+ }
301
+ if (isBreakoutLocusJoinThisDevice) {
302
+ LoggerProxy.logger.log(
303
+ `Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ${breakoutUrl}`
304
+ );
305
+
306
+ return false;
307
+ }
308
+ if (isSelfMoved && (newLocus?.self?.removed || isResourceMovedOnThisDevice)) {
309
+ LoggerProxy.logger.log(
310
+ 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
311
+ );
312
+
313
+ return false;
314
+ }
315
+ if (isSelfJoined && isResourceMovedOnThisDevice) {
316
+ LoggerProxy.logger.log(
317
+ 'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'
318
+ );
319
+
320
+ return false;
321
+ }
322
+ LoggerProxy.logger.log(
323
+ 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
324
+ );
325
+
326
+ return true;
327
+ }
328
+
329
+ /**
330
+ * check whether you need to handle this locus data or not
331
+ * @param {Object} meeting old locus data
332
+ * @param {Object} newLocus new locus data
333
+ * @returns {boolean}
334
+ * @private
335
+ * @memberof Meetings
336
+ */
337
+ private isNeedHandleLocusDTO(meeting: any, newLocus: any) {
338
+ if (newLocus) {
339
+ const isNewLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(newLocus);
340
+ const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
341
+ if (!meeting) {
342
+ if (isNewLocusAsBreakout) {
343
+ LoggerProxy.logger.log(
344
+ `Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: ${newLocus.fullState?.active}`
345
+ );
346
+
347
+ return newLocus.self?.state === _JOINED_;
348
+ }
349
+
350
+ return this.isNeedHandleMainLocus(meeting, newLocus);
351
+ }
352
+ if (!isNewLocusAsBreakout) {
353
+ return this.isNeedHandleMainLocus(meeting, newLocus);
354
+ }
355
+
356
+ return !isSelfMoved;
357
+ }
358
+
359
+ return true;
360
+ }
361
+
362
+ /**
363
+ * get corresponding meeting object by locus data
232
364
  * @param {Object} data a locus event
233
365
  * @param {String} data.locusUrl
234
366
  * @param {Object} data.locus
235
- * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
236
- * @param {String} data.eventType
237
- * @returns {undefined}
367
+ * @returns {Object}
238
368
  * @private
239
369
  * @memberof Meetings
240
370
  */
241
- private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
242
- let meeting = null;
243
-
371
+ getCorrespondingMeetingByLocus(data) {
244
372
  // getting meeting by correlationId. This will happen for the new event
245
373
  // Either the locus
246
374
  // TODO : Add check for the callBack Address
247
- meeting =
375
+ return (
248
376
  this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||
249
377
  // @ts-ignore
250
378
  this.meetingCollection.getByKey(
@@ -260,7 +388,24 @@ export default class Meetings extends WebexPlugin {
260
388
  ) ||
261
389
  (data.locus.info?.isUnifiedSpaceMeeting
262
390
  ? undefined
263
- : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl));
391
+ : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl)) ||
392
+ this.meetingCollection.getByKey(MEETINGNUMBER, data.locus?.info?.webExMeetingId)
393
+ );
394
+ }
395
+
396
+ /**
397
+ * handle locus events and takes meeting actions with them as they come in
398
+ * @param {Object} data a locus event
399
+ * @param {String} data.locusUrl
400
+ * @param {Object} data.locus
401
+ * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
402
+ * @param {String} data.eventType
403
+ * @returns {undefined}
404
+ * @private
405
+ * @memberof Meetings
406
+ */
407
+ private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
408
+ let meeting = this.getCorrespondingMeetingByLocus(data);
264
409
 
265
410
  // Special case when locus has got replaced, This only happend once if a replace locus exists
266
411
  // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call
@@ -273,6 +418,16 @@ export default class Meetings extends WebexPlugin {
273
418
  );
274
419
  }
275
420
 
421
+ if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {
422
+ meeting.locusInfo.updateMainSessionLocusCache(data.locus);
423
+ }
424
+ if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {
425
+ LoggerProxy.logger.log(
426
+ `Meetings:index#handleLocusEvent --> doesn't need to process locus event`
427
+ );
428
+
429
+ return;
430
+ }
276
431
  if (!meeting) {
277
432
  // TODO: create meeting when we get a meeting object
278
433
  // const checkForEnded = (locus) => {
@@ -329,6 +484,7 @@ export default class Meetings extends WebexPlugin {
329
484
 
330
485
  // It's a new meeting so initialize the locus data
331
486
  meeting.locusInfo.initialSetup(data.locus);
487
+ this.checkHandleBreakoutLocus(data.locus);
332
488
  })
333
489
  .catch((e) => {
334
490
  LoggerProxy.logger.error(e);
@@ -338,10 +494,15 @@ export default class Meetings extends WebexPlugin {
338
494
  // because the other user left so before sending 'added' event make sure it exists in the collection
339
495
 
340
496
  if (this.getMeetingByType(_ID_, meeting.id)) {
341
- Metrics.postEvent({
342
- event: eventType.REMOTE_STARTED,
343
- meeting,
344
- data: {trigger: trigger.MERCURY_EVENT},
497
+ // @ts-ignore
498
+ this.webex.internal.newMetrics.submitClientEvent({
499
+ name: 'client.call.remote-started',
500
+ payload: {
501
+ trigger: 'mercury-event',
502
+ },
503
+ options: {
504
+ meetingId: meeting.id,
505
+ },
345
506
  });
346
507
  Trigger.trigger(
347
508
  this,
@@ -494,7 +655,7 @@ export default class Meetings extends WebexPlugin {
494
655
 
495
656
  MeetingsUtil.checkH264Support({disableNotifications: true});
496
657
  // @ts-ignore
497
- Metrics.initialSetup(this.meetingCollection, this.webex);
658
+ Metrics.initialSetup(this.webex);
498
659
  });
499
660
  }
500
661
 
@@ -663,6 +824,36 @@ export default class Meetings extends WebexPlugin {
663
824
  );
664
825
  }
665
826
 
827
+ /**
828
+ * Creates a noise reduction effect
829
+ *
830
+ * @param {INoiseReductionEffect} options optional custom effect options
831
+ * @returns {Promise<effect>} noise reduction effect.
832
+ * @public
833
+ * @memberof Meetings
834
+ */
835
+ createNoiseReductionEffect = async (options?: INoiseReductionEffect) => {
836
+ // @ts-ignore
837
+ const authToken = this.webex.credentials.supertoken.access_token;
838
+
839
+ return new mediaHelpersModule.NoiseReductionEffect({authToken, ...options});
840
+ };
841
+
842
+ /**
843
+ * Creates a virtual background effect
844
+ *
845
+ * @param {IVirtualBackgroundEffect} options optional custom effect options
846
+ * @returns {Promise<effect>} virtual background effect.
847
+ * @public
848
+ * @memberof Meetings
849
+ */
850
+ createVirtualBackgroundEffect = async (options?: IVirtualBackgroundEffect) => {
851
+ // @ts-ignore
852
+ const authToken = this.webex.credentials.supertoken.access_token;
853
+
854
+ return new mediaHelpersModule.VirtualBackgroundEffect({authToken, ...options});
855
+ };
856
+
666
857
  /**
667
858
  * Uploads logs to the webex services for tracking
668
859
  * @param {Object} [options={}]
@@ -738,17 +929,6 @@ export default class Meetings extends WebexPlugin {
738
929
  });
739
930
  }
740
931
 
741
- /**
742
- * initializes the reachability instance for Meetings
743
- * @returns {undefined}
744
- * @public
745
- * @memberof Meetings
746
- */
747
- setReachability() {
748
- // @ts-ignore
749
- this.reachability = new Reachability(this.webex);
750
- }
751
-
752
932
  /**
753
933
  * gets the reachability instance for Meetings
754
934
  * @returns {Reachability}
@@ -766,10 +946,6 @@ export default class Meetings extends WebexPlugin {
766
946
  * @memberof Meetings
767
947
  */
768
948
  startReachability() {
769
- if (!this.reachability) {
770
- this.setReachability();
771
- }
772
-
773
949
  return this.getReachability().gatherReachability();
774
950
  }
775
951
 
@@ -797,6 +973,29 @@ export default class Meetings extends WebexPlugin {
797
973
  if (res) {
798
974
  this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);
799
975
  }
976
+
977
+ // fall back to getting the preferred site from the user information
978
+ if (!this.preferredWebexSite) {
979
+ // @ts-ignore
980
+ return this.webex.internal.user
981
+ .get()
982
+ .then((user) => {
983
+ const preferredWebexSite =
984
+ user?.userPreferences?.userPreferencesItems?.preferredWebExSite;
985
+ if (preferredWebexSite) {
986
+ this.preferredWebexSite = preferredWebexSite;
987
+ } else {
988
+ throw new Error('site not found');
989
+ }
990
+ })
991
+ .catch(() => {
992
+ LoggerProxy.logger.error(
993
+ 'Failed to fetch preferred site from user - no site will be set'
994
+ );
995
+ });
996
+ }
997
+
998
+ return Promise.resolve();
800
999
  });
801
1000
  }
802
1001
 
@@ -841,11 +1040,19 @@ export default class Meetings extends WebexPlugin {
841
1040
  * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}
842
1041
  * @param {string} [type] - the optional specified type, such as locusId
843
1042
  * @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info
1043
+ * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
1044
+ * @param {string} correlationId - the optional specified correlationId
844
1045
  * @returns {Promise<Meeting>} A new Meeting.
845
1046
  * @public
846
1047
  * @memberof Meetings
847
1048
  */
848
- public create(destination: string, type: string = null, useRandomDelayForInfo = false) {
1049
+ public create(
1050
+ destination: string,
1051
+ type: string = null,
1052
+ useRandomDelayForInfo = false,
1053
+ infoExtraParams = {},
1054
+ correlationId: string = undefined
1055
+ ) {
849
1056
  // TODO: type should be from a dictionary
850
1057
 
851
1058
  // Validate meeting information based on the provided destination and
@@ -890,48 +1097,52 @@ export default class Meetings extends WebexPlugin {
890
1097
  // Validate if a meeting was found.
891
1098
  if (!meeting) {
892
1099
  // Create a meeting based on the normalized destination and type.
893
- return this.createMeeting(targetDest, type, useRandomDelayForInfo).then(
894
- (createdMeeting: any) => {
895
- // If the meeting was successfully created.
896
- if (createdMeeting && createdMeeting.on) {
897
- // Create a destruction event for the meeting.
898
- createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {
899
- // @ts-ignore
900
- if (this.config.autoUploadLogs) {
901
- this.uploadLogs({
902
- callStart: createdMeeting.locusInfo?.fullState?.lastActive,
903
- correlationId: createdMeeting.correlationId,
904
- feedbackId: createdMeeting.correlationId,
905
- locusId: createdMeeting.locusId,
906
- meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
907
- }).then(() => this.destroy(createdMeeting, payload.reason));
908
- } else {
909
- this.destroy(createdMeeting, payload.reason);
910
- }
911
- });
912
-
913
- createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
914
- // @ts-ignore
915
- if (this.config.autoUploadLogs) {
916
- this.uploadLogs({
917
- callStart: meetingInstance?.locusInfo?.fullState?.lastActive,
918
- correlationId: meetingInstance.correlationId,
919
- feedbackId: meetingInstance.correlationId,
920
- locusId: meetingInstance.locusId,
921
- meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
922
- });
923
- }
924
- });
925
- } else {
926
- LoggerProxy.logger.error(
927
- `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
928
- );
929
- }
930
-
931
- // Return the newly created meeting.
932
- return Promise.resolve(createdMeeting);
1100
+ return this.createMeeting(
1101
+ targetDest,
1102
+ type,
1103
+ useRandomDelayForInfo,
1104
+ infoExtraParams,
1105
+ correlationId
1106
+ ).then((createdMeeting: any) => {
1107
+ // If the meeting was successfully created.
1108
+ if (createdMeeting && createdMeeting.on) {
1109
+ // Create a destruction event for the meeting.
1110
+ createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {
1111
+ // @ts-ignore
1112
+ if (this.config.autoUploadLogs) {
1113
+ this.uploadLogs({
1114
+ callStart: createdMeeting.locusInfo?.fullState?.lastActive,
1115
+ correlationId: createdMeeting.correlationId,
1116
+ feedbackId: createdMeeting.correlationId,
1117
+ locusId: createdMeeting.locusId,
1118
+ meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
1119
+ }).then(() => this.destroy(createdMeeting, payload.reason));
1120
+ } else {
1121
+ this.destroy(createdMeeting, payload.reason);
1122
+ }
1123
+ });
1124
+
1125
+ createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
1126
+ // @ts-ignore
1127
+ if (this.config.autoUploadLogs) {
1128
+ this.uploadLogs({
1129
+ callStart: meetingInstance?.locusInfo?.fullState?.lastActive,
1130
+ correlationId: meetingInstance.correlationId,
1131
+ feedbackId: meetingInstance.correlationId,
1132
+ locusId: meetingInstance.locusId,
1133
+ meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
1134
+ });
1135
+ }
1136
+ });
1137
+ } else {
1138
+ LoggerProxy.logger.error(
1139
+ `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
1140
+ );
933
1141
  }
934
- );
1142
+
1143
+ // Return the newly created meeting.
1144
+ return Promise.resolve(createdMeeting);
1145
+ });
935
1146
  }
936
1147
 
937
1148
  // Return the existing meeting.
@@ -944,6 +1155,8 @@ export default class Meetings extends WebexPlugin {
944
1155
  * @param {String} destination see create()
945
1156
  * @param {String} type see create()
946
1157
  * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
1158
+ * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
1159
+ * @param {String} correlationId the optional specified correlationId
947
1160
  * @returns {Promise} a new meeting instance complete with meeting info and destination
948
1161
  * @private
949
1162
  * @memberof Meetings
@@ -951,7 +1164,9 @@ export default class Meetings extends WebexPlugin {
951
1164
  private async createMeeting(
952
1165
  destination: any,
953
1166
  type: string = null,
954
- useRandomDelayForInfo = false
1167
+ useRandomDelayForInfo = false,
1168
+ infoExtraParams = {},
1169
+ correlationId: string = undefined
955
1170
  ) {
956
1171
  const meeting = new Meeting(
957
1172
  {
@@ -965,6 +1180,7 @@ export default class Meetings extends WebexPlugin {
965
1180
  meetingInfoProvider: this.meetingInfo,
966
1181
  destination,
967
1182
  destinationType: type,
1183
+ correlationId,
968
1184
  },
969
1185
  {
970
1186
  // @ts-ignore
@@ -999,15 +1215,19 @@ export default class Meetings extends WebexPlugin {
999
1215
 
1000
1216
  if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {
1001
1217
  meeting.fetchMeetingInfoTimeoutId = setTimeout(
1002
- () => meeting.fetchMeetingInfo({}),
1218
+ () => meeting.fetchMeetingInfo({extraParams: infoExtraParams}),
1003
1219
  waitingTime
1004
1220
  );
1005
1221
  meeting.parseMeetingInfo(undefined, destination);
1006
1222
  } else {
1007
- await meeting.fetchMeetingInfo({});
1223
+ await meeting.fetchMeetingInfo({extraParams: infoExtraParams});
1008
1224
  }
1009
1225
  } catch (err) {
1010
- if (!(err instanceof CaptchaError) && !(err instanceof PasswordError)) {
1226
+ if (
1227
+ !(err instanceof CaptchaError) &&
1228
+ !(err instanceof PasswordError) &&
1229
+ !(err instanceof PermissionError)
1230
+ ) {
1011
1231
  // if there is no meeting info we assume its a 1:1 call or wireless share
1012
1232
  LoggerProxy.logger.info(
1013
1233
  `Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`
@@ -1108,33 +1328,108 @@ export default class Meetings extends WebexPlugin {
1108
1328
  * @memberof Meetings
1109
1329
  */
1110
1330
  public syncMeetings() {
1111
- return this.request.getActiveMeetings().then((locusArray) => {
1112
- const activeLocusUrl = [];
1113
-
1114
- if (locusArray?.loci && locusArray.loci.length > 0) {
1115
- locusArray.loci.forEach((locus) => {
1116
- activeLocusUrl.push(locus.url);
1117
- this.handleLocusEvent({
1118
- locus,
1119
- locusUrl: locus.url,
1331
+ return this.request
1332
+ .getActiveMeetings()
1333
+ .then((locusArray) => {
1334
+ const activeLocusUrl = [];
1335
+
1336
+ if (locusArray?.loci && locusArray.loci.length > 0) {
1337
+ const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);
1338
+ lociToUpdate.forEach((locus) => {
1339
+ activeLocusUrl.push(locus.url);
1340
+ this.handleLocusEvent({
1341
+ locus,
1342
+ locusUrl: locus.url,
1343
+ });
1120
1344
  });
1121
- });
1122
- }
1123
- const meetingsCollection = this.meetingCollection.getAll();
1124
-
1125
- if (Object.keys(meetingsCollection).length > 0) {
1126
- // Some time the mercury event is missed after mercury reconnect
1127
- // if sync returns no locus then clear all the meetings
1128
- for (const meeting of Object.values(meetingsCollection)) {
1129
- // @ts-ignore
1130
- if (!activeLocusUrl.includes(meeting.locusUrl)) {
1131
- // destroy function also uploads logs
1345
+ }
1346
+ const meetingsCollection = this.meetingCollection.getAll();
1347
+
1348
+ if (Object.keys(meetingsCollection).length > 0) {
1349
+ // Some time the mercury event is missed after mercury reconnect
1350
+ // if sync returns no locus then clear all the meetings
1351
+ for (const meeting of Object.values(meetingsCollection)) {
1132
1352
  // @ts-ignore
1133
- this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
1353
+ if (!activeLocusUrl.includes(meeting.locusUrl)) {
1354
+ // destroy function also uploads logs
1355
+ // @ts-ignore
1356
+ this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
1357
+ }
1134
1358
  }
1135
1359
  }
1360
+ })
1361
+ .catch((error) => {
1362
+ LoggerProxy.logger.error(
1363
+ `Meetings:index#syncMeetings --> failed to sync meetings, ${error}`
1364
+ );
1365
+ throw new Error(error);
1366
+ });
1367
+ }
1368
+
1369
+ /**
1370
+ * sort out locus array for initial creating
1371
+ * @param {Array} loci original locus array
1372
+ * @returns {undefined}
1373
+ * @public
1374
+ * @memberof Meetings
1375
+ */
1376
+ sortLocusArrayToUpdate(loci: any[]) {
1377
+ const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));
1378
+ const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));
1379
+ this.breakoutLocusForHandleLater = [];
1380
+ const lociToUpdate = [...mainLoci];
1381
+ breakoutLoci.forEach((breakoutLocus) => {
1382
+ const associateMainLocus = mainLoci.find(
1383
+ (mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url
1384
+ );
1385
+ const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({
1386
+ locus: breakoutLocus,
1387
+ locusUrl: breakoutLocus.url,
1388
+ });
1389
+
1390
+ if (associateMainLocus && !existCorrespondingMeeting) {
1391
+ // if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,
1392
+ // after meeting create with main locus, then handle the associate breakout locus.
1393
+ // if only handle breakout locus, will miss some date
1394
+ this.breakoutLocusForHandleLater.push(breakoutLocus);
1395
+ } else {
1396
+ lociToUpdate.push(breakoutLocus);
1136
1397
  }
1137
1398
  });
1399
+
1400
+ return lociToUpdate;
1401
+ }
1402
+
1403
+ /**
1404
+ * check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus
1405
+ * @param {Object} newCreatedLocus the locus which just create meeting object of it
1406
+ * @returns {undefined}
1407
+ * @public
1408
+ * @memberof Meetings
1409
+ */
1410
+ checkHandleBreakoutLocus(newCreatedLocus) {
1411
+ if (
1412
+ !newCreatedLocus ||
1413
+ !this.breakoutLocusForHandleLater ||
1414
+ !this.breakoutLocusForHandleLater.length
1415
+ ) {
1416
+ return;
1417
+ }
1418
+ if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {
1419
+ return;
1420
+ }
1421
+ const existIndex = this.breakoutLocusForHandleLater.findIndex(
1422
+ (breakoutLocus) =>
1423
+ breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url
1424
+ );
1425
+
1426
+ if (existIndex < 0) {
1427
+ return;
1428
+ }
1429
+
1430
+ const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];
1431
+ this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});
1432
+ this.breakoutLocusForHandleLater.splice(existIndex, 1);
1138
1433
  }
1139
1434
 
1140
1435
  /**