@webex/plugin-meetings 3.0.0-beta.23 → 3.0.0-beta.231

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