@webex/plugin-meetings 3.0.0-beta.21 → 3.0.0-beta.211

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 (422) hide show
  1. package/README.md +45 -7
  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 +179 -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 +359 -64
  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 +48 -135
  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 +2770 -2547
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +291 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +229 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +199 -193
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +532 -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 +357 -66
  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 +72 -27
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +12 -5
  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 +21 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +110 -89
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +93 -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 +1020 -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 +1482 -0
  213. package/dist/types/meeting/locusMediaRequest.d.ts +72 -0
  214. package/dist/types/meeting/muteState.d.ts +184 -0
  215. package/dist/types/meeting/request.d.ts +257 -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 +79 -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 +367 -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 +152 -0
  251. package/dist/types/reachability/request.d.ts +37 -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 +36 -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 +46 -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 +165 -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 +383 -61
  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 +87 -140
  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 +2099 -2083
  305. package/src/meeting/locusMediaRequest.ts +311 -0
  306. package/src/meeting/muteState.ts +228 -132
  307. package/src/meeting/request.ts +105 -115
  308. package/src/meeting/util.ts +511 -397
  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 +392 -84
  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 +62 -15
  335. package/src/reachability/request.ts +10 -5
  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 +21 -30
  340. package/src/roap/request.ts +101 -95
  341. package/src/roap/turnDiscovery.ts +47 -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 +3573 -1663
  374. package/test/unit/spec/meeting/locusMediaRequest.ts +438 -0
  375. package/test/unit/spec/meeting/muteState.js +370 -208
  376. package/test/unit/spec/meeting/request.js +339 -44
  377. package/test/unit/spec/meeting/utils.js +456 -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 +867 -125
  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 +125 -8
  398. package/test/unit/spec/reachability/request.js +66 -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 +26 -51
  403. package/test/unit/spec/roap/request.ts +196 -85
  404. package/test/unit/spec/roap/turnDiscovery.ts +30 -7
  405. package/test/unit/spec/rtcMetrics/index.ts +60 -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/dist/multistream/multistreamMedia.js +0 -110
  417. package/dist/multistream/multistreamMedia.js.map +0 -1
  418. package/src/index.js +0 -16
  419. package/src/meeting/effectsState.ts +0 -211
  420. package/src/metrics/config.ts +0 -495
  421. package/src/multistream/multistreamMedia.ts +0 -97
  422. 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
 
@@ -144,7 +151,8 @@ export default class Meetings extends WebexPlugin {
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
@@ -221,30 +240,137 @@ export default class Meetings extends WebexPlugin {
221
240
  */
222
241
  this.media = {
223
242
  getUserMedia: Media.getUserMedia,
224
- getSupportedDevice: Media.getSupportedDevice,
225
243
  };
226
244
 
227
245
  this.onReady();
228
246
  }
229
247
 
230
248
  /**
231
- * handle locus events and takes meeting actions with them as they come in
249
+ * check whether you need to handle this main session's locus data or not
250
+ * @param {Object} meeting current meeting data
251
+ * @param {Object} newLocus new locus data
252
+ * @returns {boolean}
253
+ * @private
254
+ * @memberof Meetings
255
+ */
256
+ private isNeedHandleMainLocus(meeting: any, newLocus: any) {
257
+ const breakoutUrl = newLocus.controls?.breakout?.url;
258
+ const breakoutLocus = this.meetingCollection.getActiveBreakoutLocus(breakoutUrl);
259
+
260
+ const isSelfJoined = newLocus?.self?.state === _JOINED_;
261
+ const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
262
+ // @ts-ignore
263
+ const deviceFromNewLocus = MeetingsUtil.getThisDevice(newLocus, this.webex.internal.device.url);
264
+ const isResourceMovedOnThisDevice =
265
+ deviceFromNewLocus?.state === _LEFT_ && deviceFromNewLocus?.reason === _MOVED_;
266
+
267
+ const isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(
268
+ meeting,
269
+ newLocus,
270
+ // @ts-ignore
271
+ this.webex.internal.device.url
272
+ );
273
+ const isBreakoutLocusJoinThisDevice =
274
+ breakoutLocus?.joinedWith?.correlationId &&
275
+ breakoutLocus.joinedWith.correlationId === meeting?.correlationId;
276
+
277
+ if (isSelfJoined && isNewLocusJoinThisDevice) {
278
+ LoggerProxy.logger.log(
279
+ 'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
280
+ );
281
+ if (breakoutLocus?.joinedWith && deviceFromNewLocus) {
282
+ const breakoutReplaceAt =
283
+ breakoutLocus.joinedWith.replaces?.length > 0
284
+ ? breakoutLocus.joinedWith.replaces[0].replaceAt
285
+ : '';
286
+ const newLocusReplaceAt =
287
+ deviceFromNewLocus.replaces?.length > 0 ? deviceFromNewLocus.replaces[0].replaceAt : '';
288
+ if (breakoutReplaceAt && newLocusReplaceAt && breakoutReplaceAt > newLocusReplaceAt) {
289
+ LoggerProxy.logger.log(
290
+ `Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt ${newLocusReplaceAt} bo replacedAt ${breakoutReplaceAt}`
291
+ );
292
+
293
+ return false;
294
+ }
295
+ }
296
+
297
+ return true;
298
+ }
299
+ if (isBreakoutLocusJoinThisDevice) {
300
+ LoggerProxy.logger.log(
301
+ `Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ${breakoutUrl}`
302
+ );
303
+
304
+ return false;
305
+ }
306
+ if (isSelfMoved && (newLocus?.self?.removed || isResourceMovedOnThisDevice)) {
307
+ LoggerProxy.logger.log(
308
+ 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
309
+ );
310
+
311
+ return false;
312
+ }
313
+ if (isSelfJoined && isResourceMovedOnThisDevice) {
314
+ LoggerProxy.logger.log(
315
+ 'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'
316
+ );
317
+
318
+ return false;
319
+ }
320
+ LoggerProxy.logger.log(
321
+ 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
322
+ );
323
+
324
+ return true;
325
+ }
326
+
327
+ /**
328
+ * check whether you need to handle this locus data or not
329
+ * @param {Object} meeting old locus data
330
+ * @param {Object} newLocus new locus data
331
+ * @returns {boolean}
332
+ * @private
333
+ * @memberof Meetings
334
+ */
335
+ private isNeedHandleLocusDTO(meeting: any, newLocus: any) {
336
+ if (newLocus) {
337
+ const isNewLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(newLocus);
338
+ const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
339
+ if (!meeting) {
340
+ if (isNewLocusAsBreakout) {
341
+ LoggerProxy.logger.log(
342
+ `Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: ${newLocus.fullState?.active}`
343
+ );
344
+
345
+ return newLocus.self?.state === _JOINED_;
346
+ }
347
+
348
+ return this.isNeedHandleMainLocus(meeting, newLocus);
349
+ }
350
+ if (!isNewLocusAsBreakout) {
351
+ return this.isNeedHandleMainLocus(meeting, newLocus);
352
+ }
353
+
354
+ return !isSelfMoved;
355
+ }
356
+
357
+ return true;
358
+ }
359
+
360
+ /**
361
+ * get corresponding meeting object by locus data
232
362
  * @param {Object} data a locus event
233
363
  * @param {String} data.locusUrl
234
364
  * @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}
365
+ * @returns {Object}
238
366
  * @private
239
367
  * @memberof Meetings
240
368
  */
241
- private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
242
- let meeting = null;
243
-
369
+ getCorrespondingMeetingByLocus(data) {
244
370
  // getting meeting by correlationId. This will happen for the new event
245
371
  // Either the locus
246
372
  // TODO : Add check for the callBack Address
247
- meeting =
373
+ return (
248
374
  this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||
249
375
  // @ts-ignore
250
376
  this.meetingCollection.getByKey(
@@ -260,7 +386,24 @@ export default class Meetings extends WebexPlugin {
260
386
  ) ||
261
387
  (data.locus.info?.isUnifiedSpaceMeeting
262
388
  ? undefined
263
- : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl));
389
+ : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl)) ||
390
+ this.meetingCollection.getByKey(MEETINGNUMBER, data.locus?.info?.webExMeetingId)
391
+ );
392
+ }
393
+
394
+ /**
395
+ * handle locus events and takes meeting actions with them as they come in
396
+ * @param {Object} data a locus event
397
+ * @param {String} data.locusUrl
398
+ * @param {Object} data.locus
399
+ * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
400
+ * @param {String} data.eventType
401
+ * @returns {undefined}
402
+ * @private
403
+ * @memberof Meetings
404
+ */
405
+ private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
406
+ let meeting = this.getCorrespondingMeetingByLocus(data);
264
407
 
265
408
  // Special case when locus has got replaced, This only happend once if a replace locus exists
266
409
  // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call
@@ -273,6 +416,16 @@ export default class Meetings extends WebexPlugin {
273
416
  );
274
417
  }
275
418
 
419
+ if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {
420
+ meeting.locusInfo.updateMainSessionLocusCache(data.locus);
421
+ }
422
+ if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {
423
+ LoggerProxy.logger.log(
424
+ `Meetings:index#handleLocusEvent --> doesn't need to process locus event`
425
+ );
426
+
427
+ return;
428
+ }
276
429
  if (!meeting) {
277
430
  // TODO: create meeting when we get a meeting object
278
431
  // const checkForEnded = (locus) => {
@@ -329,6 +482,7 @@ export default class Meetings extends WebexPlugin {
329
482
 
330
483
  // It's a new meeting so initialize the locus data
331
484
  meeting.locusInfo.initialSetup(data.locus);
485
+ this.checkHandleBreakoutLocus(data.locus);
332
486
  })
333
487
  .catch((e) => {
334
488
  LoggerProxy.logger.error(e);
@@ -338,10 +492,15 @@ export default class Meetings extends WebexPlugin {
338
492
  // because the other user left so before sending 'added' event make sure it exists in the collection
339
493
 
340
494
  if (this.getMeetingByType(_ID_, meeting.id)) {
341
- Metrics.postEvent({
342
- event: eventType.REMOTE_STARTED,
343
- meeting,
344
- data: {trigger: trigger.MERCURY_EVENT},
495
+ // @ts-ignore
496
+ this.webex.internal.newMetrics.submitClientEvent({
497
+ name: 'client.call.remote-started',
498
+ payload: {
499
+ trigger: 'mercury-event',
500
+ },
501
+ options: {
502
+ meetingId: meeting.id,
503
+ },
345
504
  });
346
505
  Trigger.trigger(
347
506
  this,
@@ -494,7 +653,7 @@ export default class Meetings extends WebexPlugin {
494
653
 
495
654
  MeetingsUtil.checkH264Support({disableNotifications: true});
496
655
  // @ts-ignore
497
- Metrics.initialSetup(this.meetingCollection, this.webex);
656
+ Metrics.initialSetup(this.webex);
498
657
  });
499
658
  }
500
659
 
@@ -663,6 +822,36 @@ export default class Meetings extends WebexPlugin {
663
822
  );
664
823
  }
665
824
 
825
+ /**
826
+ * Creates a noise reduction effect
827
+ *
828
+ * @param {INoiseReductionEffect} options optional custom effect options
829
+ * @returns {Promise<effect>} noise reduction effect.
830
+ * @public
831
+ * @memberof Meetings
832
+ */
833
+ createNoiseReductionEffect = async (options?: INoiseReductionEffect) => {
834
+ // @ts-ignore
835
+ const authToken = this.webex.credentials.supertoken.access_token;
836
+
837
+ return new mediaHelpersModule.NoiseReductionEffect({authToken, ...options});
838
+ };
839
+
840
+ /**
841
+ * Creates a virtual background effect
842
+ *
843
+ * @param {IVirtualBackgroundEffect} options optional custom effect options
844
+ * @returns {Promise<effect>} virtual background effect.
845
+ * @public
846
+ * @memberof Meetings
847
+ */
848
+ createVirtualBackgroundEffect = async (options?: IVirtualBackgroundEffect) => {
849
+ // @ts-ignore
850
+ const authToken = this.webex.credentials.supertoken.access_token;
851
+
852
+ return new mediaHelpersModule.VirtualBackgroundEffect({authToken, ...options});
853
+ };
854
+
666
855
  /**
667
856
  * Uploads logs to the webex services for tracking
668
857
  * @param {Object} [options={}]
@@ -797,6 +986,29 @@ export default class Meetings extends WebexPlugin {
797
986
  if (res) {
798
987
  this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);
799
988
  }
989
+
990
+ // fall back to getting the preferred site from the user information
991
+ if (!this.preferredWebexSite) {
992
+ // @ts-ignore
993
+ return this.webex.internal.user
994
+ .get()
995
+ .then((user) => {
996
+ const preferredWebexSite =
997
+ user?.userPreferences?.userPreferencesItems?.preferredWebExSite;
998
+ if (preferredWebexSite) {
999
+ this.preferredWebexSite = preferredWebexSite;
1000
+ } else {
1001
+ throw new Error('site not found');
1002
+ }
1003
+ })
1004
+ .catch(() => {
1005
+ LoggerProxy.logger.error(
1006
+ 'Failed to fetch preferred site from user - no site will be set'
1007
+ );
1008
+ });
1009
+ }
1010
+
1011
+ return Promise.resolve();
800
1012
  });
801
1013
  }
802
1014
 
@@ -841,11 +1053,19 @@ export default class Meetings extends WebexPlugin {
841
1053
  * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}
842
1054
  * @param {string} [type] - the optional specified type, such as locusId
843
1055
  * @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info
1056
+ * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
1057
+ * @param {string} correlationId - the optional specified correlationId
844
1058
  * @returns {Promise<Meeting>} A new Meeting.
845
1059
  * @public
846
1060
  * @memberof Meetings
847
1061
  */
848
- public create(destination: string, type: string = null, useRandomDelayForInfo = false) {
1062
+ public create(
1063
+ destination: string,
1064
+ type: string = null,
1065
+ useRandomDelayForInfo = false,
1066
+ infoExtraParams = {},
1067
+ correlationId: string = undefined
1068
+ ) {
849
1069
  // TODO: type should be from a dictionary
850
1070
 
851
1071
  // Validate meeting information based on the provided destination and
@@ -890,48 +1110,52 @@ export default class Meetings extends WebexPlugin {
890
1110
  // Validate if a meeting was found.
891
1111
  if (!meeting) {
892
1112
  // 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);
1113
+ return this.createMeeting(
1114
+ targetDest,
1115
+ type,
1116
+ useRandomDelayForInfo,
1117
+ infoExtraParams,
1118
+ correlationId
1119
+ ).then((createdMeeting: any) => {
1120
+ // If the meeting was successfully created.
1121
+ if (createdMeeting && createdMeeting.on) {
1122
+ // Create a destruction event for the meeting.
1123
+ createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {
1124
+ // @ts-ignore
1125
+ if (this.config.autoUploadLogs) {
1126
+ this.uploadLogs({
1127
+ callStart: createdMeeting.locusInfo?.fullState?.lastActive,
1128
+ correlationId: createdMeeting.correlationId,
1129
+ feedbackId: createdMeeting.correlationId,
1130
+ locusId: createdMeeting.locusId,
1131
+ meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
1132
+ }).then(() => this.destroy(createdMeeting, payload.reason));
1133
+ } else {
1134
+ this.destroy(createdMeeting, payload.reason);
1135
+ }
1136
+ });
1137
+
1138
+ createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
1139
+ // @ts-ignore
1140
+ if (this.config.autoUploadLogs) {
1141
+ this.uploadLogs({
1142
+ callStart: meetingInstance?.locusInfo?.fullState?.lastActive,
1143
+ correlationId: meetingInstance.correlationId,
1144
+ feedbackId: meetingInstance.correlationId,
1145
+ locusId: meetingInstance.locusId,
1146
+ meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
1147
+ });
1148
+ }
1149
+ });
1150
+ } else {
1151
+ LoggerProxy.logger.error(
1152
+ `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
1153
+ );
933
1154
  }
934
- );
1155
+
1156
+ // Return the newly created meeting.
1157
+ return Promise.resolve(createdMeeting);
1158
+ });
935
1159
  }
936
1160
 
937
1161
  // Return the existing meeting.
@@ -944,6 +1168,8 @@ export default class Meetings extends WebexPlugin {
944
1168
  * @param {String} destination see create()
945
1169
  * @param {String} type see create()
946
1170
  * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
1171
+ * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
1172
+ * @param {String} correlationId the optional specified correlationId
947
1173
  * @returns {Promise} a new meeting instance complete with meeting info and destination
948
1174
  * @private
949
1175
  * @memberof Meetings
@@ -951,7 +1177,9 @@ export default class Meetings extends WebexPlugin {
951
1177
  private async createMeeting(
952
1178
  destination: any,
953
1179
  type: string = null,
954
- useRandomDelayForInfo = false
1180
+ useRandomDelayForInfo = false,
1181
+ infoExtraParams = {},
1182
+ correlationId: string = undefined
955
1183
  ) {
956
1184
  const meeting = new Meeting(
957
1185
  {
@@ -965,6 +1193,7 @@ export default class Meetings extends WebexPlugin {
965
1193
  meetingInfoProvider: this.meetingInfo,
966
1194
  destination,
967
1195
  destinationType: type,
1196
+ correlationId,
968
1197
  },
969
1198
  {
970
1199
  // @ts-ignore
@@ -999,15 +1228,19 @@ export default class Meetings extends WebexPlugin {
999
1228
 
1000
1229
  if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {
1001
1230
  meeting.fetchMeetingInfoTimeoutId = setTimeout(
1002
- () => meeting.fetchMeetingInfo({}),
1231
+ () => meeting.fetchMeetingInfo({extraParams: infoExtraParams}),
1003
1232
  waitingTime
1004
1233
  );
1005
1234
  meeting.parseMeetingInfo(undefined, destination);
1006
1235
  } else {
1007
- await meeting.fetchMeetingInfo({});
1236
+ await meeting.fetchMeetingInfo({extraParams: infoExtraParams});
1008
1237
  }
1009
1238
  } catch (err) {
1010
- if (!(err instanceof CaptchaError) && !(err instanceof PasswordError)) {
1239
+ if (
1240
+ !(err instanceof CaptchaError) &&
1241
+ !(err instanceof PasswordError) &&
1242
+ !(err instanceof PermissionError)
1243
+ ) {
1011
1244
  // if there is no meeting info we assume its a 1:1 call or wireless share
1012
1245
  LoggerProxy.logger.info(
1013
1246
  `Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`
@@ -1108,33 +1341,108 @@ export default class Meetings extends WebexPlugin {
1108
1341
  * @memberof Meetings
1109
1342
  */
1110
1343
  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,
1344
+ return this.request
1345
+ .getActiveMeetings()
1346
+ .then((locusArray) => {
1347
+ const activeLocusUrl = [];
1348
+
1349
+ if (locusArray?.loci && locusArray.loci.length > 0) {
1350
+ const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);
1351
+ lociToUpdate.forEach((locus) => {
1352
+ activeLocusUrl.push(locus.url);
1353
+ this.handleLocusEvent({
1354
+ locus,
1355
+ locusUrl: locus.url,
1356
+ });
1120
1357
  });
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
1358
+ }
1359
+ const meetingsCollection = this.meetingCollection.getAll();
1360
+
1361
+ if (Object.keys(meetingsCollection).length > 0) {
1362
+ // Some time the mercury event is missed after mercury reconnect
1363
+ // if sync returns no locus then clear all the meetings
1364
+ for (const meeting of Object.values(meetingsCollection)) {
1132
1365
  // @ts-ignore
1133
- this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
1366
+ if (!activeLocusUrl.includes(meeting.locusUrl)) {
1367
+ // destroy function also uploads logs
1368
+ // @ts-ignore
1369
+ this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
1370
+ }
1134
1371
  }
1135
1372
  }
1373
+ })
1374
+ .catch((error) => {
1375
+ LoggerProxy.logger.error(
1376
+ `Meetings:index#syncMeetings --> failed to sync meetings, ${error}`
1377
+ );
1378
+ throw new Error(error);
1379
+ });
1380
+ }
1381
+
1382
+ /**
1383
+ * sort out locus array for initial creating
1384
+ * @param {Array} loci original locus array
1385
+ * @returns {undefined}
1386
+ * @public
1387
+ * @memberof Meetings
1388
+ */
1389
+ sortLocusArrayToUpdate(loci: any[]) {
1390
+ const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));
1391
+ const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));
1392
+ this.breakoutLocusForHandleLater = [];
1393
+ const lociToUpdate = [...mainLoci];
1394
+ breakoutLoci.forEach((breakoutLocus) => {
1395
+ const associateMainLocus = mainLoci.find(
1396
+ (mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url
1397
+ );
1398
+ const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({
1399
+ locus: breakoutLocus,
1400
+ locusUrl: breakoutLocus.url,
1401
+ });
1402
+
1403
+ if (associateMainLocus && !existCorrespondingMeeting) {
1404
+ // if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,
1405
+ // after meeting create with main locus, then handle the associate breakout locus.
1406
+ // if only handle breakout locus, will miss some date
1407
+ this.breakoutLocusForHandleLater.push(breakoutLocus);
1408
+ } else {
1409
+ lociToUpdate.push(breakoutLocus);
1136
1410
  }
1137
1411
  });
1412
+
1413
+ return lociToUpdate;
1414
+ }
1415
+
1416
+ /**
1417
+ * check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus
1418
+ * @param {Object} newCreatedLocus the locus which just create meeting object of it
1419
+ * @returns {undefined}
1420
+ * @public
1421
+ * @memberof Meetings
1422
+ */
1423
+ checkHandleBreakoutLocus(newCreatedLocus) {
1424
+ if (
1425
+ !newCreatedLocus ||
1426
+ !this.breakoutLocusForHandleLater ||
1427
+ !this.breakoutLocusForHandleLater.length
1428
+ ) {
1429
+ return;
1430
+ }
1431
+ if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {
1432
+ return;
1433
+ }
1434
+ const existIndex = this.breakoutLocusForHandleLater.findIndex(
1435
+ (breakoutLocus) =>
1436
+ breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url
1437
+ );
1438
+
1439
+ if (existIndex < 0) {
1440
+ return;
1441
+ }
1442
+
1443
+ const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];
1444
+ this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});
1445
+ this.breakoutLocusForHandleLater.splice(existIndex, 1);
1138
1446
  }
1139
1447
 
1140
1448
  /**
@@ -0,0 +1,12 @@
1
+ import type {
2
+ NoiseReductionEffectOptions,
3
+ VirtualBackgroundEffectOptions,
4
+ } from '@webex/media-helpers';
5
+
6
+ type INoiseReductionEffect = Omit<
7
+ NoiseReductionEffectOptions,
8
+ 'authToken' | 'workletProcessorUrl' | 'legacyProcessorUrl'
9
+ >;
10
+ type IVirtualBackgroundEffect = Omit<VirtualBackgroundEffectOptions, 'authToken'>;
11
+
12
+ export type {INoiseReductionEffect, IVirtualBackgroundEffect};
@@ -23,6 +23,7 @@ export default class MeetingRequest extends StatelessWebexPlugin {
23
23
  LoggerProxy.logger.error(
24
24
  `Meetings:request#getActiveMeetings --> failed to get locus details, ${error}`
25
25
  );
26
+ throw new Error(error);
26
27
  });
27
28
  }
28
29
 
@@ -71,6 +72,7 @@ export default class MeetingRequest extends StatelessWebexPlugin {
71
72
  LoggerProxy.logger.error(
72
73
  `Meetings:request#determineRedirections --> failed to get locus details from url: ${url}, reason: ${error}`
73
74
  );
75
+ throw new Error(error);
74
76
  })
75
77
  )
76
78
  ).then(() => Promise.resolve(responseBody));