@webex/plugin-meetings 3.0.0-beta.15 → 3.0.0-beta.151

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 (480) hide show
  1. package/README.md +45 -1
  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 +359 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +193 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +23 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +52 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +43 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1046 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +78 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +67 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/browser-detection.js +1 -21
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +5 -20
  25. package/dist/common/collection.js.map +1 -1
  26. package/dist/common/config.js +0 -7
  27. package/dist/common/config.js.map +1 -1
  28. package/dist/common/errors/captcha-error.js +0 -21
  29. package/dist/common/errors/captcha-error.js.map +1 -1
  30. package/dist/common/errors/intent-to-join.js +0 -21
  31. package/dist/common/errors/intent-to-join.js.map +1 -1
  32. package/dist/common/errors/join-meeting.js +0 -21
  33. package/dist/common/errors/join-meeting.js.map +1 -1
  34. package/dist/common/errors/media.js +0 -21
  35. package/dist/common/errors/media.js.map +1 -1
  36. package/dist/common/errors/parameter.js +0 -28
  37. package/dist/common/errors/parameter.js.map +1 -1
  38. package/dist/common/errors/password-error.js +0 -21
  39. package/dist/common/errors/password-error.js.map +1 -1
  40. package/dist/common/errors/permission.js +0 -21
  41. package/dist/common/errors/permission.js.map +1 -1
  42. package/dist/common/errors/reconnection-in-progress.js +0 -17
  43. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  44. package/dist/common/errors/reconnection.js +0 -21
  45. package/dist/common/errors/reconnection.js.map +1 -1
  46. package/dist/common/errors/stats.js +0 -21
  47. package/dist/common/errors/stats.js.map +1 -1
  48. package/dist/common/errors/webex-errors.js +9 -43
  49. package/dist/common/errors/webex-errors.js.map +1 -1
  50. package/dist/common/errors/webex-meetings-error.js +1 -24
  51. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  52. package/dist/common/events/events-scope.js +0 -22
  53. package/dist/common/events/events-scope.js.map +1 -1
  54. package/dist/common/events/events.js +0 -23
  55. package/dist/common/events/events.js.map +1 -1
  56. package/dist/common/events/trigger-proxy.js +0 -12
  57. package/dist/common/events/trigger-proxy.js.map +1 -1
  58. package/dist/common/events/util.js +0 -15
  59. package/dist/common/events/util.js.map +1 -1
  60. package/dist/common/logs/logger-config.js +0 -4
  61. package/dist/common/logs/logger-config.js.map +1 -1
  62. package/dist/common/logs/logger-proxy.js +1 -8
  63. package/dist/common/logs/logger-proxy.js.map +1 -1
  64. package/dist/common/logs/request.js +35 -61
  65. package/dist/common/logs/request.js.map +1 -1
  66. package/dist/common/queue.js +4 -14
  67. package/dist/common/queue.js.map +1 -1
  68. package/dist/config.js +7 -13
  69. package/dist/config.js.map +1 -1
  70. package/dist/constants.js +208 -64
  71. package/dist/constants.js.map +1 -1
  72. package/dist/controls-options-manager/constants.js +14 -0
  73. package/dist/controls-options-manager/constants.js.map +1 -0
  74. package/dist/controls-options-manager/enums.js +27 -0
  75. package/dist/controls-options-manager/enums.js.map +1 -0
  76. package/dist/controls-options-manager/index.js +297 -0
  77. package/dist/controls-options-manager/index.js.map +1 -0
  78. package/dist/controls-options-manager/types.js +7 -0
  79. package/dist/controls-options-manager/types.js.map +1 -0
  80. package/dist/controls-options-manager/util.js +300 -0
  81. package/dist/controls-options-manager/util.js.map +1 -0
  82. package/dist/index.js +78 -17
  83. package/dist/index.js.map +1 -1
  84. package/dist/locus-info/controlsUtils.js +100 -29
  85. package/dist/locus-info/controlsUtils.js.map +1 -1
  86. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  87. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  88. package/dist/locus-info/fullState.js +0 -15
  89. package/dist/locus-info/fullState.js.map +1 -1
  90. package/dist/locus-info/hostUtils.js +4 -12
  91. package/dist/locus-info/hostUtils.js.map +1 -1
  92. package/dist/locus-info/index.js +387 -208
  93. package/dist/locus-info/index.js.map +1 -1
  94. package/dist/locus-info/infoUtils.js +0 -38
  95. package/dist/locus-info/infoUtils.js.map +1 -1
  96. package/dist/locus-info/mediaSharesUtils.js +54 -38
  97. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  98. package/dist/locus-info/parser.js +90 -126
  99. package/dist/locus-info/parser.js.map +1 -1
  100. package/dist/locus-info/selfUtils.js +93 -92
  101. package/dist/locus-info/selfUtils.js.map +1 -1
  102. package/dist/media/index.js +70 -219
  103. package/dist/media/index.js.map +1 -1
  104. package/dist/media/properties.js +74 -198
  105. package/dist/media/properties.js.map +1 -1
  106. package/dist/media/util.js +1 -8
  107. package/dist/media/util.js.map +1 -1
  108. package/dist/mediaQualityMetrics/config.js +505 -495
  109. package/dist/mediaQualityMetrics/config.js.map +1 -1
  110. package/dist/meeting/in-meeting-actions.js +79 -14
  111. package/dist/meeting/in-meeting-actions.js.map +1 -1
  112. package/dist/meeting/index.js +2685 -3324
  113. package/dist/meeting/index.js.map +1 -1
  114. package/dist/meeting/locusMediaRequest.js +291 -0
  115. package/dist/meeting/locusMediaRequest.js.map +1 -0
  116. package/dist/meeting/muteState.js +243 -185
  117. package/dist/meeting/muteState.js.map +1 -1
  118. package/dist/meeting/request.js +296 -342
  119. package/dist/meeting/request.js.map +1 -1
  120. package/dist/meeting/request.type.js +0 -1
  121. package/dist/meeting/request.type.js.map +1 -1
  122. package/dist/meeting/state.js +16 -26
  123. package/dist/meeting/state.js.map +1 -1
  124. package/dist/meeting/util.js +446 -585
  125. package/dist/meeting/util.js.map +1 -1
  126. package/dist/meeting-info/collection.js +3 -25
  127. package/dist/meeting-info/collection.js.map +1 -1
  128. package/dist/meeting-info/index.js +8 -31
  129. package/dist/meeting-info/index.js.map +1 -1
  130. package/dist/meeting-info/meeting-info-v2.js +261 -242
  131. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  132. package/dist/meeting-info/request.js +1 -16
  133. package/dist/meeting-info/request.js.map +1 -1
  134. package/dist/meeting-info/util.js +98 -183
  135. package/dist/meeting-info/util.js.map +1 -1
  136. package/dist/meeting-info/utilv2.js +156 -232
  137. package/dist/meeting-info/utilv2.js.map +1 -1
  138. package/dist/meetings/collection.js +24 -20
  139. package/dist/meetings/collection.js.map +1 -1
  140. package/dist/meetings/index.js +526 -372
  141. package/dist/meetings/index.js.map +1 -1
  142. package/dist/meetings/meetings.types.js +7 -0
  143. package/dist/meetings/meetings.types.js.map +1 -0
  144. package/dist/meetings/request.js +21 -40
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +172 -141
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +58 -57
  149. package/dist/member/index.js.map +1 -1
  150. package/dist/member/types.js +15 -0
  151. package/dist/member/types.js.map +1 -0
  152. package/dist/member/util.js +101 -69
  153. package/dist/member/util.js.map +1 -1
  154. package/dist/members/collection.js +12 -12
  155. package/dist/members/collection.js.map +1 -1
  156. package/dist/members/index.js +123 -162
  157. package/dist/members/index.js.map +1 -1
  158. package/dist/members/request.js +120 -85
  159. package/dist/members/request.js.map +1 -1
  160. package/dist/members/types.js +15 -0
  161. package/dist/members/types.js.map +1 -0
  162. package/dist/members/util.js +314 -260
  163. package/dist/members/util.js.map +1 -1
  164. package/dist/metrics/config.js +50 -16
  165. package/dist/metrics/config.js.map +1 -1
  166. package/dist/metrics/constants.js +4 -7
  167. package/dist/metrics/constants.js.map +1 -1
  168. package/dist/metrics/index.js +75 -147
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +170 -50
  171. package/dist/multistream/mediaRequestManager.js.map +1 -1
  172. package/dist/multistream/receiveSlot.js +58 -65
  173. package/dist/multistream/receiveSlot.js.map +1 -1
  174. package/dist/multistream/receiveSlotManager.js +73 -94
  175. package/dist/multistream/receiveSlotManager.js.map +1 -1
  176. package/dist/multistream/remoteMedia.js +55 -74
  177. package/dist/multistream/remoteMedia.js.map +1 -1
  178. package/dist/multistream/remoteMediaGroup.js +66 -43
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +502 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +24 -51
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +3 -38
  185. package/dist/personal-meeting-room/index.js.map +1 -1
  186. package/dist/personal-meeting-room/request.js +2 -33
  187. package/dist/personal-meeting-room/request.js.map +1 -1
  188. package/dist/personal-meeting-room/util.js +0 -13
  189. package/dist/personal-meeting-room/util.js.map +1 -1
  190. package/dist/reachability/index.js +190 -199
  191. package/dist/reachability/index.js.map +1 -1
  192. package/dist/reachability/request.js +14 -23
  193. package/dist/reachability/request.js.map +1 -1
  194. package/dist/reactions/constants.js +13 -0
  195. package/dist/reactions/constants.js.map +1 -0
  196. package/dist/reactions/reactions.js +2 -4
  197. package/dist/reactions/reactions.js.map +1 -1
  198. package/dist/reactions/reactions.type.js +18 -24
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +356 -476
  201. package/dist/reconnection-manager/index.js.map +1 -1
  202. package/dist/recording-controller/enums.js +17 -0
  203. package/dist/recording-controller/enums.js.map +1 -0
  204. package/dist/recording-controller/index.js +343 -0
  205. package/dist/recording-controller/index.js.map +1 -0
  206. package/dist/recording-controller/util.js +63 -0
  207. package/dist/recording-controller/util.js.map +1 -0
  208. package/dist/roap/index.js +32 -75
  209. package/dist/roap/index.js.map +1 -1
  210. package/dist/roap/request.js +129 -136
  211. package/dist/roap/request.js.map +1 -1
  212. package/dist/roap/turnDiscovery.js +143 -103
  213. package/dist/roap/turnDiscovery.js.map +1 -1
  214. package/dist/statsAnalyzer/global.js +1 -95
  215. package/dist/statsAnalyzer/global.js.map +1 -1
  216. package/dist/statsAnalyzer/index.js +369 -462
  217. package/dist/statsAnalyzer/index.js.map +1 -1
  218. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  219. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  220. package/dist/transcription/index.js +9 -44
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +43 -0
  223. package/dist/types/annotation/constants.d.ts +31 -0
  224. package/dist/types/annotation/index.d.ts +124 -0
  225. package/dist/types/breakouts/breakout.d.ts +8 -0
  226. package/dist/types/breakouts/collection.d.ts +5 -0
  227. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  228. package/dist/types/breakouts/events.d.ts +2 -0
  229. package/dist/types/breakouts/index.d.ts +5 -0
  230. package/dist/types/breakouts/request.d.ts +22 -0
  231. package/dist/types/breakouts/utils.d.ts +15 -0
  232. package/dist/types/common/browser-detection.d.ts +9 -0
  233. package/dist/types/common/collection.d.ts +48 -0
  234. package/dist/types/common/config.d.ts +2 -0
  235. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  236. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  237. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  238. package/dist/types/common/errors/media.d.ts +15 -0
  239. package/dist/types/common/errors/parameter.d.ts +15 -0
  240. package/dist/types/common/errors/password-error.d.ts +15 -0
  241. package/dist/types/common/errors/permission.d.ts +14 -0
  242. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  243. package/dist/types/common/errors/reconnection.d.ts +15 -0
  244. package/dist/types/common/errors/stats.d.ts +15 -0
  245. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  246. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  247. package/dist/types/common/events/events-scope.d.ts +17 -0
  248. package/dist/types/common/events/events.d.ts +12 -0
  249. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  250. package/dist/types/common/events/util.d.ts +2 -0
  251. package/dist/types/common/logs/logger-config.d.ts +2 -0
  252. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  253. package/dist/types/common/logs/request.d.ts +34 -0
  254. package/dist/types/common/queue.d.ts +32 -0
  255. package/dist/types/config.d.ts +72 -0
  256. package/dist/types/constants.d.ts +978 -0
  257. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  258. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  259. package/dist/types/controls-options-manager/index.d.ts +136 -0
  260. package/dist/types/controls-options-manager/types.d.ts +43 -0
  261. package/dist/types/controls-options-manager/util.d.ts +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  264. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  265. package/dist/types/locus-info/fullState.d.ts +2 -0
  266. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  267. package/dist/types/locus-info/index.d.ts +315 -0
  268. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  269. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  270. package/dist/types/locus-info/parser.d.ts +212 -0
  271. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  272. package/dist/types/media/index.d.ts +34 -0
  273. package/dist/types/media/properties.d.ts +86 -0
  274. package/dist/types/media/util.d.ts +2 -0
  275. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  276. package/dist/types/meeting/in-meeting-actions.d.ts +149 -0
  277. package/dist/types/meeting/index.d.ts +1509 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +184 -0
  280. package/dist/types/meeting/request.d.ts +270 -0
  281. package/dist/types/meeting/request.type.d.ts +11 -0
  282. package/dist/types/meeting/state.d.ts +9 -0
  283. package/dist/types/meeting/util.d.ts +75 -0
  284. package/dist/types/meeting-info/collection.d.ts +20 -0
  285. package/dist/types/meeting-info/index.d.ts +57 -0
  286. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  287. package/dist/types/meeting-info/request.d.ts +22 -0
  288. package/dist/types/meeting-info/util.d.ts +2 -0
  289. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  290. package/dist/types/meetings/collection.d.ts +31 -0
  291. package/dist/types/meetings/index.d.ts +364 -0
  292. package/dist/types/meetings/meetings.types.d.ts +4 -0
  293. package/dist/types/meetings/request.d.ts +27 -0
  294. package/dist/types/meetings/util.d.ts +18 -0
  295. package/dist/types/member/index.d.ts +157 -0
  296. package/dist/types/member/types.d.ts +21 -0
  297. package/dist/types/member/util.d.ts +2 -0
  298. package/dist/types/members/collection.d.ts +29 -0
  299. package/dist/types/members/index.d.ts +353 -0
  300. package/dist/types/members/request.d.ts +114 -0
  301. package/dist/types/members/types.d.ts +24 -0
  302. package/dist/types/members/util.d.ts +210 -0
  303. package/dist/types/metrics/config.d.ts +195 -0
  304. package/dist/types/metrics/constants.d.ts +55 -0
  305. package/dist/types/metrics/index.d.ts +169 -0
  306. package/dist/types/multistream/mediaRequestManager.d.ts +104 -0
  307. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  308. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  309. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  310. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  311. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  312. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  313. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  314. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  315. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  316. package/dist/types/reachability/index.d.ts +152 -0
  317. package/dist/types/reachability/request.d.ts +37 -0
  318. package/dist/types/reactions/constants.d.ts +3 -0
  319. package/dist/types/reactions/reactions.d.ts +4 -0
  320. package/dist/types/reactions/reactions.type.d.ts +52 -0
  321. package/dist/types/reconnection-manager/index.d.ts +126 -0
  322. package/dist/types/recording-controller/enums.d.ts +7 -0
  323. package/dist/types/recording-controller/index.d.ts +193 -0
  324. package/dist/types/recording-controller/util.d.ts +13 -0
  325. package/dist/types/roap/index.d.ts +77 -0
  326. package/dist/types/roap/request.d.ts +36 -0
  327. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  328. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  329. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  330. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  331. package/dist/types/transcription/index.d.ts +64 -0
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +52 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +343 -0
  336. package/src/breakouts/README.md +220 -0
  337. package/src/breakouts/breakout.ts +163 -0
  338. package/src/breakouts/collection.ts +19 -0
  339. package/src/breakouts/edit-lock-error.ts +25 -0
  340. package/src/breakouts/events.ts +37 -0
  341. package/src/breakouts/index.ts +921 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/errors/webex-errors.ts +6 -2
  345. package/src/common/logs/logger-proxy.ts +1 -1
  346. package/src/config.ts +5 -7
  347. package/src/constants.ts +155 -20
  348. package/src/controls-options-manager/constants.ts +5 -0
  349. package/src/controls-options-manager/enums.ts +18 -0
  350. package/src/controls-options-manager/index.ts +278 -0
  351. package/src/controls-options-manager/types.ts +59 -0
  352. package/src/controls-options-manager/util.ts +286 -0
  353. package/src/index.ts +34 -0
  354. package/src/locus-info/controlsUtils.ts +108 -0
  355. package/src/locus-info/index.ts +310 -21
  356. package/src/locus-info/mediaSharesUtils.ts +48 -0
  357. package/src/locus-info/parser.ts +2 -1
  358. package/src/locus-info/selfUtils.ts +71 -1
  359. package/src/media/index.ts +70 -142
  360. package/src/media/properties.ts +41 -104
  361. package/src/mediaQualityMetrics/config.ts +379 -377
  362. package/src/meeting/in-meeting-actions.ts +156 -0
  363. package/src/meeting/index.ts +1730 -1768
  364. package/src/meeting/locusMediaRequest.ts +309 -0
  365. package/src/meeting/muteState.ts +228 -132
  366. package/src/meeting/request.ts +100 -91
  367. package/src/meeting/request.type.ts +2 -0
  368. package/src/meeting/util.ts +421 -421
  369. package/src/meeting-info/meeting-info-v2.ts +134 -13
  370. package/src/meeting-info/utilv2.ts +13 -3
  371. package/src/meetings/collection.ts +20 -0
  372. package/src/meetings/index.ts +375 -83
  373. package/src/meetings/meetings.types.ts +9 -0
  374. package/src/meetings/request.ts +3 -1
  375. package/src/meetings/util.ts +103 -4
  376. package/src/member/index.ts +40 -0
  377. package/src/member/types.ts +24 -0
  378. package/src/member/util.ts +81 -1
  379. package/src/members/collection.ts +8 -0
  380. package/src/members/index.ts +108 -6
  381. package/src/members/request.ts +98 -17
  382. package/src/members/types.ts +28 -0
  383. package/src/members/util.ts +319 -240
  384. package/src/metrics/config.ts +49 -10
  385. package/src/metrics/constants.ts +2 -4
  386. package/src/metrics/index.ts +43 -27
  387. package/src/multistream/mediaRequestManager.ts +210 -45
  388. package/src/multistream/receiveSlot.ts +68 -26
  389. package/src/multistream/receiveSlotManager.ts +61 -38
  390. package/src/multistream/remoteMedia.ts +29 -3
  391. package/src/multistream/remoteMediaGroup.ts +61 -2
  392. package/src/multistream/remoteMediaManager.ts +260 -66
  393. package/src/networkQualityMonitor/index.ts +6 -6
  394. package/src/reachability/index.ts +75 -25
  395. package/src/reachability/request.ts +10 -5
  396. package/src/reactions/constants.ts +4 -0
  397. package/src/reactions/reactions.ts +4 -4
  398. package/src/reactions/reactions.type.ts +28 -3
  399. package/src/reconnection-manager/index.ts +53 -32
  400. package/src/recording-controller/enums.ts +8 -0
  401. package/src/recording-controller/index.ts +315 -0
  402. package/src/recording-controller/util.ts +58 -0
  403. package/src/roap/index.ts +21 -30
  404. package/src/roap/request.ts +51 -52
  405. package/src/roap/turnDiscovery.ts +51 -27
  406. package/src/statsAnalyzer/global.ts +1 -94
  407. package/src/statsAnalyzer/index.ts +380 -390
  408. package/src/statsAnalyzer/mqaUtil.ts +106 -99
  409. package/test/integration/spec/converged-space-meetings.js +233 -0
  410. package/test/integration/spec/journey.js +332 -255
  411. package/test/integration/spec/space-meeting.js +78 -5
  412. package/test/integration/spec/transcription.js +1 -1
  413. package/test/unit/spec/annotation/index.ts +436 -0
  414. package/test/unit/spec/breakouts/breakout.ts +203 -0
  415. package/test/unit/spec/breakouts/collection.ts +15 -0
  416. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  417. package/test/unit/spec/breakouts/events.ts +77 -0
  418. package/test/unit/spec/breakouts/index.ts +1790 -0
  419. package/test/unit/spec/breakouts/request.ts +104 -0
  420. package/test/unit/spec/breakouts/utils.js +72 -0
  421. package/test/unit/spec/controls-options-manager/index.js +287 -0
  422. package/test/unit/spec/controls-options-manager/util.js +518 -0
  423. package/test/unit/spec/fixture/locus.js +1 -0
  424. package/test/unit/spec/locus-info/controlsUtils.js +303 -30
  425. package/test/unit/spec/locus-info/index.js +615 -4
  426. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  427. package/test/unit/spec/locus-info/selfConstant.js +38 -0
  428. package/test/unit/spec/locus-info/selfUtils.js +200 -0
  429. package/test/unit/spec/media/index.ts +118 -22
  430. package/test/unit/spec/media/properties.ts +9 -9
  431. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -0
  432. package/test/unit/spec/meeting/index.js +2394 -1381
  433. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  434. package/test/unit/spec/meeting/muteState.js +370 -208
  435. package/test/unit/spec/meeting/request.js +354 -42
  436. package/test/unit/spec/meeting/utils.js +268 -156
  437. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  438. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  439. package/test/unit/spec/meetings/collection.js +14 -0
  440. package/test/unit/spec/meetings/index.js +842 -128
  441. package/test/unit/spec/meetings/utils.js +206 -2
  442. package/test/unit/spec/member/index.js +24 -0
  443. package/test/unit/spec/member/util.js +384 -32
  444. package/test/unit/spec/members/index.js +320 -1
  445. package/test/unit/spec/members/request.js +206 -27
  446. package/test/unit/spec/members/utils.js +184 -0
  447. package/test/unit/spec/metrics/index.js +98 -0
  448. package/test/unit/spec/multistream/mediaRequestManager.ts +676 -105
  449. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  450. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  451. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  452. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  453. package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
  454. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  455. package/test/unit/spec/reachability/index.ts +176 -25
  456. package/test/unit/spec/reachability/request.js +66 -0
  457. package/test/unit/spec/reconnection-manager/index.js +46 -13
  458. package/test/unit/spec/recording-controller/index.js +231 -0
  459. package/test/unit/spec/recording-controller/util.js +102 -0
  460. package/test/unit/spec/roap/index.ts +21 -51
  461. package/test/unit/spec/roap/request.ts +187 -0
  462. package/test/unit/spec/roap/turnDiscovery.ts +73 -34
  463. package/test/unit/spec/stats-analyzer/index.js +94 -43
  464. package/test/utils/constants.js +9 -0
  465. package/test/utils/integrationTestUtils.js +46 -0
  466. package/test/utils/testUtils.js +0 -45
  467. package/test/utils/webex-config.js +4 -0
  468. package/test/utils/webex-test-users.js +7 -3
  469. package/tsconfig.json +6 -0
  470. package/dist/media/internal-media-core-wrapper.js +0 -22
  471. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  472. package/dist/meeting/effectsState.js +0 -334
  473. package/dist/meeting/effectsState.js.map +0 -1
  474. package/dist/multistream/multistreamMedia.js +0 -117
  475. package/dist/multistream/multistreamMedia.js.map +0 -1
  476. package/src/index.js +0 -15
  477. package/src/media/internal-media-core-wrapper.ts +0 -9
  478. package/src/meeting/effectsState.ts +0 -211
  479. package/src/multistream/multistreamMedia.ts +0 -93
  480. package/test/unit/spec/meeting/effectsState.js +0 -281
@@ -4,7 +4,9 @@ import '@webex/internal-plugin-mercury';
4
4
  import '@webex/internal-plugin-conversation';
5
5
  // @ts-ignore
6
6
  import {WebexPlugin} from '@webex/webex-core';
7
- import {MediaConnection as MC} from '@webex/internal-media-core';
7
+ import {setLogger} from '@webex/internal-media-core';
8
+
9
+ import * as mediaHelpersModule from '@webex/media-helpers';
8
10
 
9
11
  import 'webrtc-adapter';
10
12
 
@@ -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,34 +240,132 @@ 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 isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(
265
+ meeting,
266
+ newLocus,
267
+ // @ts-ignore
268
+ this.webex.internal.device.url
269
+ );
270
+ const isBreakoutLocusJoinThisDevice =
271
+ breakoutLocus?.joinedWith?.correlationId &&
272
+ breakoutLocus.joinedWith.correlationId === meeting?.correlationId;
273
+
274
+ if (isSelfJoined && isNewLocusJoinThisDevice) {
275
+ LoggerProxy.logger.log(
276
+ 'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
277
+ );
278
+ if (breakoutLocus?.joinedWith && deviceFromNewLocus) {
279
+ const breakoutReplaceAt =
280
+ breakoutLocus.joinedWith.replaces?.length > 0
281
+ ? breakoutLocus.joinedWith.replaces[0].replaceAt
282
+ : '';
283
+ const newLocusReplaceAt =
284
+ deviceFromNewLocus.replaces?.length > 0 ? deviceFromNewLocus.replaces[0].replaceAt : '';
285
+ if (breakoutReplaceAt && newLocusReplaceAt && breakoutReplaceAt > newLocusReplaceAt) {
286
+ LoggerProxy.logger.log(
287
+ `Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt ${newLocusReplaceAt} bo replacedAt ${breakoutReplaceAt}`
288
+ );
289
+
290
+ return false;
291
+ }
292
+ }
293
+
294
+ return true;
295
+ }
296
+ if (isBreakoutLocusJoinThisDevice) {
297
+ LoggerProxy.logger.log(
298
+ `Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ${breakoutUrl}`
299
+ );
300
+
301
+ return false;
302
+ }
303
+ if (isSelfMoved && newLocus?.self?.removed) {
304
+ LoggerProxy.logger.log(
305
+ 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status, not need to handle'
306
+ );
307
+
308
+ return false;
309
+ }
310
+ LoggerProxy.logger.log(
311
+ 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
312
+ );
313
+
314
+ return true;
315
+ }
316
+
317
+ /**
318
+ * check whether you need to handle this locus data or not
319
+ * @param {Object} meeting old locus data
320
+ * @param {Object} newLocus new locus data
321
+ * @returns {boolean}
322
+ * @private
323
+ * @memberof Meetings
324
+ */
325
+ private isNeedHandleLocusDTO(meeting: any, newLocus: any) {
326
+ if (newLocus) {
327
+ const isNewLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(newLocus);
328
+ const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
329
+ if (!meeting) {
330
+ if (isNewLocusAsBreakout) {
331
+ LoggerProxy.logger.log(
332
+ `Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: ${newLocus.fullState?.active}`
333
+ );
334
+
335
+ return newLocus.self?.state === _JOINED_;
336
+ }
337
+
338
+ return this.isNeedHandleMainLocus(meeting, newLocus);
339
+ }
340
+ if (!isNewLocusAsBreakout) {
341
+ return this.isNeedHandleMainLocus(meeting, newLocus);
342
+ }
343
+
344
+ return !isSelfMoved;
345
+ }
346
+
347
+ return true;
348
+ }
349
+
350
+ /**
351
+ * get corresponding meeting object by locus data
232
352
  * @param {Object} data a locus event
233
353
  * @param {String} data.locusUrl
234
354
  * @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}
355
+ * @returns {Object}
238
356
  * @private
239
357
  * @memberof Meetings
240
358
  */
241
- private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
242
- let meeting = null;
243
-
359
+ getCorrespondingMeetingByLocus(data) {
244
360
  // getting meeting by correlationId. This will happen for the new event
245
361
  // Either the locus
246
362
  // TODO : Add check for the callBack Address
247
- meeting =
363
+ return (
248
364
  this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||
249
365
  // @ts-ignore
250
366
  this.meetingCollection.getByKey(
251
367
  CORRELATION_ID,
368
+ // @ts-ignore
252
369
  MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)
253
370
  ) ||
254
371
  this.meetingCollection.getByKey(
@@ -259,7 +376,24 @@ export default class Meetings extends WebexPlugin {
259
376
  ) ||
260
377
  (data.locus.info?.isUnifiedSpaceMeeting
261
378
  ? undefined
262
- : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl));
379
+ : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl)) ||
380
+ this.meetingCollection.getByKey(MEETINGNUMBER, data.locus?.info?.webExMeetingId)
381
+ );
382
+ }
383
+
384
+ /**
385
+ * handle locus events and takes meeting actions with them as they come in
386
+ * @param {Object} data a locus event
387
+ * @param {String} data.locusUrl
388
+ * @param {Object} data.locus
389
+ * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
390
+ * @param {String} data.eventType
391
+ * @returns {undefined}
392
+ * @private
393
+ * @memberof Meetings
394
+ */
395
+ private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
396
+ let meeting = this.getCorrespondingMeetingByLocus(data);
263
397
 
264
398
  // Special case when locus has got replaced, This only happend once if a replace locus exists
265
399
  // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call
@@ -272,6 +406,16 @@ export default class Meetings extends WebexPlugin {
272
406
  );
273
407
  }
274
408
 
409
+ if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {
410
+ meeting.locusInfo.updateMainSessionLocusCache(data.locus);
411
+ }
412
+ if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {
413
+ LoggerProxy.logger.log(
414
+ `Meetings:index#handleLocusEvent --> doesn't need to process locus event`
415
+ );
416
+
417
+ return;
418
+ }
275
419
  if (!meeting) {
276
420
  // TODO: create meeting when we get a meeting object
277
421
  // const checkForEnded = (locus) => {
@@ -328,6 +472,7 @@ export default class Meetings extends WebexPlugin {
328
472
 
329
473
  // It's a new meeting so initialize the locus data
330
474
  meeting.locusInfo.initialSetup(data.locus);
475
+ this.checkHandleBreakoutLocus(data.locus);
331
476
  })
332
477
  .catch((e) => {
333
478
  LoggerProxy.logger.error(e);
@@ -460,7 +605,7 @@ export default class Meetings extends WebexPlugin {
460
605
  LoggerProxy.set(this.webex.logger);
461
606
 
462
607
  mediaLogger = new MediaLogger();
463
- MC.setLogger(mediaLogger);
608
+ setLogger(mediaLogger);
464
609
 
465
610
  /**
466
611
  * The MeetingInfo object to interact with server
@@ -471,11 +616,14 @@ export default class Meetings extends WebexPlugin {
471
616
  */
472
617
  // @ts-ignore
473
618
  this.meetingInfo = this.config.experimental.enableUnifiedMeetings
474
- ? new MeetingInfoV2(this.webex)
475
- : new MeetingInfo(this.webex);
619
+ ? // @ts-ignore
620
+ new MeetingInfoV2(this.webex)
621
+ : // @ts-ignore
622
+ new MeetingInfo(this.webex);
476
623
  // @ts-ignore
477
624
  this.personalMeetingRoom = new PersonalMeetingRoom(
478
625
  {meetingInfo: this.meetingInfo},
626
+ // @ts-ignore
479
627
  {parent: this.webex}
480
628
  );
481
629
 
@@ -585,6 +733,7 @@ export default class Meetings extends WebexPlugin {
585
733
  // @ts-ignore
586
734
  .then(() =>
587
735
  LoggerProxy.logger.info(
736
+ // @ts-ignore
588
737
  `Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`
589
738
  )
590
739
  )
@@ -638,8 +787,8 @@ export default class Meetings extends WebexPlugin {
638
787
 
639
788
  this.stopListeningForEvents();
640
789
 
641
- // @ts-ignore
642
790
  return (
791
+ // @ts-ignore
643
792
  this.webex.internal.mercury
644
793
  .disconnect()
645
794
  // @ts-ignore
@@ -658,6 +807,36 @@ export default class Meetings extends WebexPlugin {
658
807
  );
659
808
  }
660
809
 
810
+ /**
811
+ * Creates a noise reduction effect
812
+ *
813
+ * @param {INoiseReductionEffect} options optional custom effect options
814
+ * @returns {Promise<effect>} noise reduction effect.
815
+ * @public
816
+ * @memberof Meetings
817
+ */
818
+ createNoiseReductionEffect = async (options?: INoiseReductionEffect) => {
819
+ // @ts-ignore
820
+ const authToken = this.webex.credentials.supertoken.access_token;
821
+
822
+ return new mediaHelpersModule.NoiseReductionEffect({authToken, ...options});
823
+ };
824
+
825
+ /**
826
+ * Creates a virtual background effect
827
+ *
828
+ * @param {IVirtualBackgroundEffect} options optional custom effect options
829
+ * @returns {Promise<effect>} virtual background effect.
830
+ * @public
831
+ * @memberof Meetings
832
+ */
833
+ createVirtualBackgroundEffect = async (options?: IVirtualBackgroundEffect) => {
834
+ // @ts-ignore
835
+ const authToken = this.webex.credentials.supertoken.access_token;
836
+
837
+ return new mediaHelpersModule.VirtualBackgroundEffect({authToken, ...options});
838
+ };
839
+
661
840
  /**
662
841
  * Uploads logs to the webex services for tracking
663
842
  * @param {Object} [options={}]
@@ -792,6 +971,29 @@ export default class Meetings extends WebexPlugin {
792
971
  if (res) {
793
972
  this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);
794
973
  }
974
+
975
+ // fall back to getting the preferred site from the user information
976
+ if (!this.preferredWebexSite) {
977
+ // @ts-ignore
978
+ return this.webex.internal.user
979
+ .get()
980
+ .then((user) => {
981
+ const preferredWebexSite =
982
+ user?.userPreferences?.userPreferencesItems?.preferredWebExSite;
983
+ if (preferredWebexSite) {
984
+ this.preferredWebexSite = preferredWebexSite;
985
+ } else {
986
+ throw new Error('site not found');
987
+ }
988
+ })
989
+ .catch(() => {
990
+ LoggerProxy.logger.error(
991
+ 'Failed to fetch preferred site from user - no site will be set'
992
+ );
993
+ });
994
+ }
995
+
996
+ return Promise.resolve();
795
997
  });
796
998
  }
797
999
 
@@ -836,11 +1038,17 @@ export default class Meetings extends WebexPlugin {
836
1038
  * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}
837
1039
  * @param {string} [type] - the optional specified type, such as locusId
838
1040
  * @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info
1041
+ * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
839
1042
  * @returns {Promise<Meeting>} A new Meeting.
840
1043
  * @public
841
1044
  * @memberof Meetings
842
1045
  */
843
- public create(destination: string, type: string = null, useRandomDelayForInfo = false) {
1046
+ public create(
1047
+ destination: string,
1048
+ type: string = null,
1049
+ useRandomDelayForInfo = false,
1050
+ infoExtraParams = {}
1051
+ ) {
844
1052
  // TODO: type should be from a dictionary
845
1053
 
846
1054
  // Validate meeting information based on the provided destination and
@@ -885,48 +1093,51 @@ export default class Meetings extends WebexPlugin {
885
1093
  // Validate if a meeting was found.
886
1094
  if (!meeting) {
887
1095
  // Create a meeting based on the normalized destination and type.
888
- return this.createMeeting(targetDest, type, useRandomDelayForInfo).then(
889
- (createdMeeting: any) => {
890
- // If the meeting was successfully created.
891
- if (createdMeeting && createdMeeting.on) {
892
- // Create a destruction event for the meeting.
893
- createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {
894
- // @ts-ignore
895
- if (this.config.autoUploadLogs) {
896
- this.uploadLogs({
897
- callStart: createdMeeting.locusInfo?.fullState?.lastActive,
898
- correlationId: createdMeeting.correlationId,
899
- feedbackId: createdMeeting.correlationId,
900
- locusId: createdMeeting.locusId,
901
- meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
902
- }).then(() => this.destroy(createdMeeting, payload.reason));
903
- } else {
904
- this.destroy(createdMeeting, payload.reason);
905
- }
906
- });
907
-
908
- createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
909
- // @ts-ignore
910
- if (this.config.autoUploadLogs) {
911
- this.uploadLogs({
912
- callStart: meetingInstance?.locusInfo?.fullState?.lastActive,
913
- correlationId: meetingInstance.correlationId,
914
- feedbackId: meetingInstance.correlationId,
915
- locusId: meetingInstance.locusId,
916
- meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
917
- });
918
- }
919
- });
920
- } else {
921
- LoggerProxy.logger.error(
922
- `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
923
- );
924
- }
925
-
926
- // Return the newly created meeting.
927
- return Promise.resolve(createdMeeting);
1096
+ return this.createMeeting(
1097
+ targetDest,
1098
+ type,
1099
+ useRandomDelayForInfo,
1100
+ infoExtraParams
1101
+ ).then((createdMeeting: any) => {
1102
+ // If the meeting was successfully created.
1103
+ if (createdMeeting && createdMeeting.on) {
1104
+ // Create a destruction event for the meeting.
1105
+ createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {
1106
+ // @ts-ignore
1107
+ if (this.config.autoUploadLogs) {
1108
+ this.uploadLogs({
1109
+ callStart: createdMeeting.locusInfo?.fullState?.lastActive,
1110
+ correlationId: createdMeeting.correlationId,
1111
+ feedbackId: createdMeeting.correlationId,
1112
+ locusId: createdMeeting.locusId,
1113
+ meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
1114
+ }).then(() => this.destroy(createdMeeting, payload.reason));
1115
+ } else {
1116
+ this.destroy(createdMeeting, payload.reason);
1117
+ }
1118
+ });
1119
+
1120
+ createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
1121
+ // @ts-ignore
1122
+ if (this.config.autoUploadLogs) {
1123
+ this.uploadLogs({
1124
+ callStart: meetingInstance?.locusInfo?.fullState?.lastActive,
1125
+ correlationId: meetingInstance.correlationId,
1126
+ feedbackId: meetingInstance.correlationId,
1127
+ locusId: meetingInstance.locusId,
1128
+ meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
1129
+ });
1130
+ }
1131
+ });
1132
+ } else {
1133
+ LoggerProxy.logger.error(
1134
+ `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
1135
+ );
928
1136
  }
929
- );
1137
+
1138
+ // Return the newly created meeting.
1139
+ return Promise.resolve(createdMeeting);
1140
+ });
930
1141
  }
931
1142
 
932
1143
  // Return the existing meeting.
@@ -939,6 +1150,7 @@ export default class Meetings extends WebexPlugin {
939
1150
  * @param {String} destination see create()
940
1151
  * @param {String} type see create()
941
1152
  * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
1153
+ * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
942
1154
  * @returns {Promise} a new meeting instance complete with meeting info and destination
943
1155
  * @private
944
1156
  * @memberof Meetings
@@ -946,7 +1158,8 @@ export default class Meetings extends WebexPlugin {
946
1158
  private async createMeeting(
947
1159
  destination: any,
948
1160
  type: string = null,
949
- useRandomDelayForInfo = false
1161
+ useRandomDelayForInfo = false,
1162
+ infoExtraParams = {}
950
1163
  ) {
951
1164
  const meeting = new Meeting(
952
1165
  {
@@ -994,15 +1207,19 @@ export default class Meetings extends WebexPlugin {
994
1207
 
995
1208
  if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {
996
1209
  meeting.fetchMeetingInfoTimeoutId = setTimeout(
997
- () => meeting.fetchMeetingInfo({}),
1210
+ () => meeting.fetchMeetingInfo({extraParams: infoExtraParams}),
998
1211
  waitingTime
999
1212
  );
1000
1213
  meeting.parseMeetingInfo(undefined, destination);
1001
1214
  } else {
1002
- await meeting.fetchMeetingInfo({});
1215
+ await meeting.fetchMeetingInfo({extraParams: infoExtraParams});
1003
1216
  }
1004
1217
  } catch (err) {
1005
- if (!(err instanceof CaptchaError) && !(err instanceof PasswordError)) {
1218
+ if (
1219
+ !(err instanceof CaptchaError) &&
1220
+ !(err instanceof PasswordError) &&
1221
+ !(err instanceof PermissionError)
1222
+ ) {
1006
1223
  // if there is no meeting info we assume its a 1:1 call or wireless share
1007
1224
  LoggerProxy.logger.info(
1008
1225
  `Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`
@@ -1103,33 +1320,108 @@ export default class Meetings extends WebexPlugin {
1103
1320
  * @memberof Meetings
1104
1321
  */
1105
1322
  public syncMeetings() {
1106
- return this.request.getActiveMeetings().then((locusArray) => {
1107
- const activeLocusUrl = [];
1108
-
1109
- if (locusArray?.loci && locusArray.loci.length > 0) {
1110
- locusArray.loci.forEach((locus) => {
1111
- activeLocusUrl.push(locus.url);
1112
- this.handleLocusEvent({
1113
- locus,
1114
- locusUrl: locus.url,
1323
+ return this.request
1324
+ .getActiveMeetings()
1325
+ .then((locusArray) => {
1326
+ const activeLocusUrl = [];
1327
+
1328
+ if (locusArray?.loci && locusArray.loci.length > 0) {
1329
+ const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);
1330
+ lociToUpdate.forEach((locus) => {
1331
+ activeLocusUrl.push(locus.url);
1332
+ this.handleLocusEvent({
1333
+ locus,
1334
+ locusUrl: locus.url,
1335
+ });
1115
1336
  });
1116
- });
1117
- }
1118
- const meetingsCollection = this.meetingCollection.getAll();
1119
-
1120
- if (Object.keys(meetingsCollection).length > 0) {
1121
- // Some time the mercury event is missed after mercury reconnect
1122
- // if sync returns no locus then clear all the meetings
1123
- for (const meeting of Object.values(meetingsCollection)) {
1124
- // @ts-ignore
1125
- if (!activeLocusUrl.includes(meeting.locusUrl)) {
1126
- // destroy function also uploads logs
1337
+ }
1338
+ const meetingsCollection = this.meetingCollection.getAll();
1339
+
1340
+ if (Object.keys(meetingsCollection).length > 0) {
1341
+ // Some time the mercury event is missed after mercury reconnect
1342
+ // if sync returns no locus then clear all the meetings
1343
+ for (const meeting of Object.values(meetingsCollection)) {
1127
1344
  // @ts-ignore
1128
- this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
1345
+ if (!activeLocusUrl.includes(meeting.locusUrl)) {
1346
+ // destroy function also uploads logs
1347
+ // @ts-ignore
1348
+ this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
1349
+ }
1129
1350
  }
1130
1351
  }
1352
+ })
1353
+ .catch((error) => {
1354
+ LoggerProxy.logger.error(
1355
+ `Meetings:index#syncMeetings --> failed to sync meetings, ${error}`
1356
+ );
1357
+ throw new Error(error);
1358
+ });
1359
+ }
1360
+
1361
+ /**
1362
+ * sort out locus array for initial creating
1363
+ * @param {Array} loci original locus array
1364
+ * @returns {undefined}
1365
+ * @public
1366
+ * @memberof Meetings
1367
+ */
1368
+ sortLocusArrayToUpdate(loci: any[]) {
1369
+ const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));
1370
+ const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));
1371
+ this.breakoutLocusForHandleLater = [];
1372
+ const lociToUpdate = [...mainLoci];
1373
+ breakoutLoci.forEach((breakoutLocus) => {
1374
+ const associateMainLocus = mainLoci.find(
1375
+ (mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url
1376
+ );
1377
+ const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({
1378
+ locus: breakoutLocus,
1379
+ locusUrl: breakoutLocus.url,
1380
+ });
1381
+
1382
+ if (associateMainLocus && !existCorrespondingMeeting) {
1383
+ // if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,
1384
+ // after meeting create with main locus, then handle the associate breakout locus.
1385
+ // if only handle breakout locus, will miss some date
1386
+ this.breakoutLocusForHandleLater.push(breakoutLocus);
1387
+ } else {
1388
+ lociToUpdate.push(breakoutLocus);
1131
1389
  }
1132
1390
  });
1391
+
1392
+ return lociToUpdate;
1393
+ }
1394
+
1395
+ /**
1396
+ * check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus
1397
+ * @param {Object} newCreatedLocus the locus which just create meeting object of it
1398
+ * @returns {undefined}
1399
+ * @public
1400
+ * @memberof Meetings
1401
+ */
1402
+ checkHandleBreakoutLocus(newCreatedLocus) {
1403
+ if (
1404
+ !newCreatedLocus ||
1405
+ !this.breakoutLocusForHandleLater ||
1406
+ !this.breakoutLocusForHandleLater.length
1407
+ ) {
1408
+ return;
1409
+ }
1410
+ if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {
1411
+ return;
1412
+ }
1413
+ const existIndex = this.breakoutLocusForHandleLater.findIndex(
1414
+ (breakoutLocus) =>
1415
+ breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url
1416
+ );
1417
+
1418
+ if (existIndex < 0) {
1419
+ return;
1420
+ }
1421
+
1422
+ const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];
1423
+ this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});
1424
+ this.breakoutLocusForHandleLater.splice(existIndex, 1);
1133
1425
  }
1134
1426
 
1135
1427
  /**
@@ -0,0 +1,9 @@
1
+ import type {
2
+ NoiseReductionEffectOptions,
3
+ VirtualBackgroundEffectOptions,
4
+ } from '@webex/media-helpers';
5
+
6
+ type INoiseReductionEffect = Omit<NoiseReductionEffectOptions, 'authToken'>;
7
+ type IVirtualBackgroundEffect = Omit<VirtualBackgroundEffectOptions, 'authToken'>;
8
+
9
+ 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
 
@@ -53,9 +54,9 @@ export default class MeetingRequest extends StatelessWebexPlugin {
53
54
  */
54
55
  determineRedirections(responseBody: any) {
55
56
  if (responseBody.remoteLocusClusterUrls && responseBody.remoteLocusClusterUrls.length) {
56
- // @ts-ignore
57
57
  return Promise.all(
58
58
  responseBody.remoteLocusClusterUrls.map((url) =>
59
+ // @ts-ignore
59
60
  this.request({
60
61
  method: HTTP_VERBS.GET,
61
62
  url,
@@ -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));