@webex/plugin-meetings 2.59.8-next.2 → 2.60.0-next.1

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 (433) 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 +41 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +357 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +215 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +22 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +51 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +44 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1047 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +77 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +64 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/browser-detection.js +1 -2
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +1 -2
  25. package/dist/common/collection.js.map +1 -1
  26. package/dist/common/config.js +1 -2
  27. package/dist/common/config.js.map +1 -1
  28. package/dist/common/errors/captcha-error.js +1 -2
  29. package/dist/common/errors/captcha-error.js.map +1 -1
  30. package/dist/common/errors/intent-to-join.js +1 -2
  31. package/dist/common/errors/intent-to-join.js.map +1 -1
  32. package/dist/common/errors/join-meeting.js +1 -2
  33. package/dist/common/errors/join-meeting.js.map +1 -1
  34. package/dist/common/errors/media.js +1 -2
  35. package/dist/common/errors/media.js.map +1 -1
  36. package/dist/common/errors/no-meeting-info.js +50 -0
  37. package/dist/common/errors/no-meeting-info.js.map +1 -0
  38. package/dist/common/errors/parameter.js +3 -4
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +1 -2
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +1 -2
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  45. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  46. package/dist/common/errors/reconnection-in-progress.js +1 -2
  47. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  48. package/dist/common/errors/reconnection.js +1 -2
  49. package/dist/common/errors/reconnection.js.map +1 -1
  50. package/dist/common/errors/stats.js +1 -2
  51. package/dist/common/errors/stats.js.map +1 -1
  52. package/dist/common/errors/webex-errors.js +48 -28
  53. package/dist/common/errors/webex-errors.js.map +1 -1
  54. package/dist/common/errors/webex-meetings-error.js +1 -2
  55. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  56. package/dist/common/events/events-scope.js +1 -2
  57. package/dist/common/events/events-scope.js.map +1 -1
  58. package/dist/common/events/events.js +1 -2
  59. package/dist/common/events/events.js.map +1 -1
  60. package/dist/common/events/trigger-proxy.js +1 -2
  61. package/dist/common/events/trigger-proxy.js.map +1 -1
  62. package/dist/common/events/util.js +1 -2
  63. package/dist/common/events/util.js.map +1 -1
  64. package/dist/common/logs/logger-config.js +1 -2
  65. package/dist/common/logs/logger-config.js.map +1 -1
  66. package/dist/common/logs/logger-proxy.js +2 -3
  67. package/dist/common/logs/logger-proxy.js.map +1 -1
  68. package/dist/common/logs/request.js +8 -5
  69. package/dist/common/logs/request.js.map +1 -1
  70. package/dist/common/queue.js +22 -9
  71. package/dist/common/queue.js.map +1 -1
  72. package/dist/config.js +9 -12
  73. package/dist/config.js.map +1 -1
  74. package/dist/constants.js +437 -433
  75. package/dist/constants.js.map +1 -1
  76. package/dist/controls-options-manager/constants.js +3 -6
  77. package/dist/controls-options-manager/constants.js.map +1 -1
  78. package/dist/controls-options-manager/enums.js +14 -6
  79. package/dist/controls-options-manager/enums.js.map +1 -1
  80. package/dist/controls-options-manager/index.js +126 -37
  81. package/dist/controls-options-manager/index.js.map +1 -1
  82. package/dist/controls-options-manager/types.js +7 -0
  83. package/dist/controls-options-manager/types.js.map +1 -0
  84. package/dist/controls-options-manager/util.js +309 -19
  85. package/dist/controls-options-manager/util.js.map +1 -1
  86. package/dist/index.js +116 -4
  87. package/dist/index.js.map +1 -1
  88. package/dist/interpretation/collection.js +22 -0
  89. package/dist/interpretation/collection.js.map +1 -0
  90. package/dist/interpretation/index.js +365 -0
  91. package/dist/interpretation/index.js.map +1 -0
  92. package/dist/interpretation/siLanguage.js +24 -0
  93. package/dist/interpretation/siLanguage.js.map +1 -0
  94. package/dist/locus-info/controlsUtils.js +95 -6
  95. package/dist/locus-info/controlsUtils.js.map +1 -1
  96. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  97. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  98. package/dist/locus-info/fullState.js +1 -2
  99. package/dist/locus-info/fullState.js.map +1 -1
  100. package/dist/locus-info/hostUtils.js +1 -2
  101. package/dist/locus-info/hostUtils.js.map +1 -1
  102. package/dist/locus-info/index.js +408 -67
  103. package/dist/locus-info/index.js.map +1 -1
  104. package/dist/locus-info/infoUtils.js +13 -5
  105. package/dist/locus-info/infoUtils.js.map +1 -1
  106. package/dist/locus-info/mediaSharesUtils.js +58 -3
  107. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  108. package/dist/locus-info/parser.js +251 -78
  109. package/dist/locus-info/parser.js.map +1 -1
  110. package/dist/locus-info/selfUtils.js +97 -13
  111. package/dist/locus-info/selfUtils.js.map +1 -1
  112. package/dist/media/index.js +106 -319
  113. package/dist/media/index.js.map +1 -1
  114. package/dist/media/properties.js +96 -153
  115. package/dist/media/properties.js.map +1 -1
  116. package/dist/media/util.js +1 -22
  117. package/dist/media/util.js.map +1 -1
  118. package/dist/mediaQualityMetrics/config.js +498 -493
  119. package/dist/mediaQualityMetrics/config.js.map +1 -1
  120. package/dist/meeting/in-meeting-actions.js +90 -3
  121. package/dist/meeting/in-meeting-actions.js.map +1 -1
  122. package/dist/meeting/index.js +4579 -2951
  123. package/dist/meeting/index.js.map +1 -1
  124. package/dist/meeting/locusMediaRequest.js +291 -0
  125. package/dist/meeting/locusMediaRequest.js.map +1 -0
  126. package/dist/meeting/muteState.js +224 -133
  127. package/dist/meeting/muteState.js.map +1 -1
  128. package/dist/meeting/request.js +295 -197
  129. package/dist/meeting/request.js.map +1 -1
  130. package/dist/meeting/request.type.js +7 -0
  131. package/dist/meeting/request.type.js.map +1 -0
  132. package/dist/meeting/state.js +1 -2
  133. package/dist/meeting/state.js.map +1 -1
  134. package/dist/meeting/util.js +602 -432
  135. package/dist/meeting/util.js.map +1 -1
  136. package/dist/meeting-info/collection.js +1 -2
  137. package/dist/meeting-info/collection.js.map +1 -1
  138. package/dist/meeting-info/index.js +74 -7
  139. package/dist/meeting-info/index.js.map +1 -1
  140. package/dist/meeting-info/meeting-info-v2.js +197 -63
  141. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  142. package/dist/meeting-info/request.js +1 -2
  143. package/dist/meeting-info/request.js.map +1 -1
  144. package/dist/meeting-info/util.js +2 -3
  145. package/dist/meeting-info/util.js.map +1 -1
  146. package/dist/meeting-info/utilv2.js +25 -12
  147. package/dist/meeting-info/utilv2.js.map +1 -1
  148. package/dist/meetings/collection.js +23 -2
  149. package/dist/meetings/collection.js.map +1 -1
  150. package/dist/meetings/index.js +464 -123
  151. package/dist/meetings/index.js.map +1 -1
  152. package/dist/meetings/meetings.types.js +7 -0
  153. package/dist/meetings/meetings.types.js.map +1 -0
  154. package/dist/meetings/request.js +4 -3
  155. package/dist/meetings/request.js.map +1 -1
  156. package/dist/meetings/util.js +107 -6
  157. package/dist/meetings/util.js.map +1 -1
  158. package/dist/member/index.js +54 -2
  159. package/dist/member/index.js.map +1 -1
  160. package/dist/member/member.types.js +3 -4
  161. package/dist/member/member.types.js.map +1 -1
  162. package/dist/member/types.js +23 -0
  163. package/dist/member/types.js.map +1 -0
  164. package/dist/member/util.js +131 -29
  165. package/dist/member/util.js.map +1 -1
  166. package/dist/members/collection.js +11 -2
  167. package/dist/members/collection.js.map +1 -1
  168. package/dist/members/index.js +172 -8
  169. package/dist/members/index.js.map +1 -1
  170. package/dist/members/request.js +108 -41
  171. package/dist/members/request.js.map +1 -1
  172. package/dist/members/types.js +14 -0
  173. package/dist/members/types.js.map +1 -0
  174. package/dist/members/util.js +327 -234
  175. package/dist/members/util.js.map +1 -1
  176. package/dist/metrics/constants.js +14 -7
  177. package/dist/metrics/constants.js.map +1 -1
  178. package/dist/metrics/index.js +4 -452
  179. package/dist/metrics/index.js.map +1 -1
  180. package/dist/multistream/mediaRequestManager.js +344 -0
  181. package/dist/multistream/mediaRequestManager.js.map +1 -0
  182. package/dist/multistream/receiveSlot.js +200 -0
  183. package/dist/multistream/receiveSlot.js.map +1 -0
  184. package/dist/multistream/receiveSlotManager.js +174 -0
  185. package/dist/multistream/receiveSlotManager.js.map +1 -0
  186. package/dist/multistream/remoteMedia.js +268 -0
  187. package/dist/multistream/remoteMedia.js.map +1 -0
  188. package/dist/multistream/remoteMediaGroup.js +267 -0
  189. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  190. package/dist/multistream/remoteMediaManager.js +1211 -0
  191. package/dist/multistream/remoteMediaManager.js.map +1 -0
  192. package/dist/multistream/sendSlotManager.js +236 -0
  193. package/dist/multistream/sendSlotManager.js.map +1 -0
  194. package/dist/networkQualityMonitor/index.js +5 -4
  195. package/dist/networkQualityMonitor/index.js.map +1 -1
  196. package/dist/personal-meeting-room/index.js +2 -3
  197. package/dist/personal-meeting-room/index.js.map +1 -1
  198. package/dist/personal-meeting-room/request.js +2 -3
  199. package/dist/personal-meeting-room/request.js.map +1 -1
  200. package/dist/personal-meeting-room/util.js +1 -2
  201. package/dist/personal-meeting-room/util.js.map +1 -1
  202. package/dist/reachability/index.js +258 -72
  203. package/dist/reachability/index.js.map +1 -1
  204. package/dist/reachability/request.js +18 -10
  205. package/dist/reachability/request.js.map +1 -1
  206. package/dist/reactions/constants.js +12 -0
  207. package/dist/reactions/constants.js.map +1 -0
  208. package/dist/reactions/reactions.js +4 -6
  209. package/dist/reactions/reactions.js.map +1 -1
  210. package/dist/reactions/reactions.type.js +21 -23
  211. package/dist/reactions/reactions.type.js.map +1 -1
  212. package/dist/reconnection-manager/index.js +272 -220
  213. package/dist/reconnection-manager/index.js.map +1 -1
  214. package/dist/recording-controller/enums.js +4 -5
  215. package/dist/recording-controller/enums.js.map +1 -1
  216. package/dist/recording-controller/index.js +57 -46
  217. package/dist/recording-controller/index.js.map +1 -1
  218. package/dist/recording-controller/util.js +10 -10
  219. package/dist/recording-controller/util.js.map +1 -1
  220. package/dist/roap/index.js +101 -235
  221. package/dist/roap/index.js.map +1 -1
  222. package/dist/roap/request.js +126 -180
  223. package/dist/roap/request.js.map +1 -1
  224. package/dist/roap/turnDiscovery.js +115 -105
  225. package/dist/roap/turnDiscovery.js.map +1 -1
  226. package/dist/rtcMetrics/constants.js +11 -0
  227. package/dist/rtcMetrics/constants.js.map +1 -0
  228. package/dist/rtcMetrics/index.js +115 -0
  229. package/dist/rtcMetrics/index.js.map +1 -0
  230. package/dist/statsAnalyzer/global.js +2 -93
  231. package/dist/statsAnalyzer/global.js.map +1 -1
  232. package/dist/statsAnalyzer/index.js +374 -374
  233. package/dist/statsAnalyzer/index.js.map +1 -1
  234. package/dist/statsAnalyzer/mqaUtil.js +100 -66
  235. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  236. package/dist/transcription/index.js +1 -2
  237. package/dist/transcription/index.js.map +1 -1
  238. package/dist/webinar/collection.js +43 -0
  239. package/dist/webinar/collection.js.map +1 -0
  240. package/dist/webinar/index.js +68 -0
  241. package/dist/webinar/index.js.map +1 -0
  242. package/package.json +27 -18
  243. package/src/annotation/annotation.types.ts +50 -0
  244. package/src/annotation/constants.ts +36 -0
  245. package/src/annotation/index.ts +328 -0
  246. package/src/breakouts/README.md +220 -0
  247. package/src/breakouts/breakout.ts +188 -0
  248. package/src/breakouts/collection.ts +19 -0
  249. package/src/breakouts/edit-lock-error.ts +25 -0
  250. package/src/breakouts/events.ts +56 -0
  251. package/src/breakouts/index.ts +925 -0
  252. package/src/breakouts/request.ts +55 -0
  253. package/src/breakouts/utils.ts +57 -0
  254. package/src/common/errors/no-meeting-info.ts +24 -0
  255. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  256. package/src/common/errors/webex-errors.ts +36 -12
  257. package/src/common/logs/logger-proxy.ts +1 -1
  258. package/src/common/logs/request.ts +5 -1
  259. package/src/common/queue.ts +22 -8
  260. package/src/config.ts +7 -9
  261. package/src/constants.ts +263 -89
  262. package/src/controls-options-manager/enums.ts +11 -1
  263. package/src/controls-options-manager/index.ts +116 -21
  264. package/src/controls-options-manager/types.ts +59 -0
  265. package/src/controls-options-manager/util.ts +294 -14
  266. package/src/index.ts +40 -0
  267. package/src/interpretation/README.md +60 -0
  268. package/src/interpretation/collection.ts +19 -0
  269. package/src/interpretation/index.ts +332 -0
  270. package/src/interpretation/siLanguage.ts +18 -0
  271. package/src/locus-info/controlsUtils.ts +110 -0
  272. package/src/locus-info/index.ts +449 -61
  273. package/src/locus-info/infoUtils.ts +14 -2
  274. package/src/locus-info/mediaSharesUtils.ts +64 -0
  275. package/src/locus-info/parser.ts +258 -47
  276. package/src/locus-info/selfUtils.ts +85 -2
  277. package/src/media/index.ts +153 -370
  278. package/src/media/properties.ts +106 -136
  279. package/src/media/util.ts +0 -21
  280. package/src/mediaQualityMetrics/config.ts +379 -377
  281. package/src/meeting/in-meeting-actions.ts +168 -0
  282. package/src/meeting/index.ts +3801 -2457
  283. package/src/meeting/locusMediaRequest.ts +313 -0
  284. package/src/meeting/muteState.ts +224 -138
  285. package/src/meeting/request.ts +207 -127
  286. package/src/meeting/request.type.ts +13 -0
  287. package/src/meeting/util.ts +590 -423
  288. package/src/meeting-info/index.ts +81 -8
  289. package/src/meeting-info/meeting-info-v2.ts +159 -13
  290. package/src/meeting-info/util.ts +1 -1
  291. package/src/meeting-info/utilv2.ts +22 -9
  292. package/src/meetings/collection.ts +20 -0
  293. package/src/meetings/index.ts +466 -124
  294. package/src/meetings/meetings.types.ts +12 -0
  295. package/src/meetings/request.ts +2 -0
  296. package/src/meetings/util.ts +116 -5
  297. package/src/member/index.ts +52 -1
  298. package/src/member/types.ts +38 -0
  299. package/src/member/util.ts +139 -28
  300. package/src/members/collection.ts +8 -0
  301. package/src/members/index.ts +196 -7
  302. package/src/members/request.ts +97 -17
  303. package/src/members/types.ts +29 -0
  304. package/src/members/util.ts +333 -240
  305. package/src/metrics/constants.ts +12 -4
  306. package/src/metrics/index.ts +1 -471
  307. package/src/multistream/mediaRequestManager.ts +440 -0
  308. package/src/multistream/receiveSlot.ts +184 -0
  309. package/src/multistream/receiveSlotManager.ts +166 -0
  310. package/src/multistream/remoteMedia.ts +254 -0
  311. package/src/multistream/remoteMediaGroup.ts +284 -0
  312. package/src/multistream/remoteMediaManager.ts +1145 -0
  313. package/src/multistream/sendSlotManager.ts +170 -0
  314. package/src/networkQualityMonitor/index.ts +6 -6
  315. package/src/reachability/index.ts +238 -45
  316. package/src/reachability/request.ts +17 -8
  317. package/src/reactions/constants.ts +4 -0
  318. package/src/reactions/reactions.ts +4 -4
  319. package/src/reactions/reactions.type.ts +30 -4
  320. package/src/reconnection-manager/index.ts +124 -107
  321. package/src/recording-controller/index.ts +20 -3
  322. package/src/recording-controller/util.ts +26 -9
  323. package/src/roap/index.ts +98 -240
  324. package/src/roap/request.ts +74 -148
  325. package/src/roap/turnDiscovery.ts +62 -56
  326. package/src/rtcMetrics/constants.ts +3 -0
  327. package/src/rtcMetrics/index.ts +100 -0
  328. package/src/statsAnalyzer/global.ts +1 -92
  329. package/src/statsAnalyzer/index.ts +429 -447
  330. package/src/statsAnalyzer/mqaUtil.ts +105 -103
  331. package/src/webinar/collection.ts +31 -0
  332. package/src/webinar/index.ts +62 -0
  333. package/test/integration/spec/converged-space-meetings.js +233 -0
  334. package/test/integration/spec/journey.js +320 -264
  335. package/test/integration/spec/space-meeting.js +77 -4
  336. package/test/unit/spec/annotation/index.ts +418 -0
  337. package/test/unit/spec/breakouts/breakout.ts +237 -0
  338. package/test/unit/spec/breakouts/collection.ts +15 -0
  339. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  340. package/test/unit/spec/breakouts/events.ts +89 -0
  341. package/test/unit/spec/breakouts/index.ts +1790 -0
  342. package/test/unit/spec/breakouts/request.ts +104 -0
  343. package/test/unit/spec/breakouts/utils.js +72 -0
  344. package/test/unit/spec/common/queue.js +31 -2
  345. package/test/unit/spec/controls-options-manager/index.js +163 -0
  346. package/test/unit/spec/controls-options-manager/util.js +576 -60
  347. package/test/unit/spec/fixture/locus.js +1 -0
  348. package/test/unit/spec/interpretation/collection.ts +15 -0
  349. package/test/unit/spec/interpretation/index.ts +589 -0
  350. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  351. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  352. package/test/unit/spec/locus-info/index.js +1390 -16
  353. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  354. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  355. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  356. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  357. package/test/unit/spec/locus-info/parser.js +116 -35
  358. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  359. package/test/unit/spec/media/index.ts +274 -0
  360. package/test/unit/spec/media/properties.ts +75 -84
  361. package/test/unit/spec/meeting/in-meeting-actions.ts +82 -0
  362. package/test/unit/spec/meeting/index.js +7420 -3125
  363. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  364. package/test/unit/spec/meeting/muteState.js +407 -212
  365. package/test/unit/spec/meeting/request.js +512 -42
  366. package/test/unit/spec/meeting/utils.js +741 -24
  367. package/test/unit/spec/meeting-info/index.js +300 -0
  368. package/test/unit/spec/meeting-info/meetinginfov2.js +500 -6
  369. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  370. package/test/unit/spec/meetings/collection.js +14 -0
  371. package/test/unit/spec/meetings/index.js +1012 -209
  372. package/test/unit/spec/meetings/utils.js +202 -2
  373. package/test/unit/spec/member/index.js +38 -8
  374. package/test/unit/spec/member/util.js +528 -27
  375. package/test/unit/spec/members/index.js +597 -3
  376. package/test/unit/spec/members/request.js +206 -27
  377. package/test/unit/spec/members/utils.js +210 -0
  378. package/test/unit/spec/metrics/index.js +1 -50
  379. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  380. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  381. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  382. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  383. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  384. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  385. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  386. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  387. package/test/unit/spec/reachability/index.ts +598 -24
  388. package/test/unit/spec/reachability/request.js +68 -0
  389. package/test/unit/spec/reconnection-manager/index.js +130 -22
  390. package/test/unit/spec/recording-controller/index.js +293 -218
  391. package/test/unit/spec/recording-controller/util.js +223 -96
  392. package/test/unit/spec/roap/index.ts +200 -77
  393. package/test/unit/spec/roap/request.ts +232 -0
  394. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  395. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  396. package/test/unit/spec/stats-analyzer/index.js +205 -50
  397. package/test/unit/spec/webinar/collection.ts +13 -0
  398. package/test/unit/spec/webinar/index.ts +60 -0
  399. package/test/utils/constants.js +9 -0
  400. package/test/utils/integrationTestUtils.js +46 -0
  401. package/test/utils/testUtils.js +0 -45
  402. package/test/utils/webex-config.js +4 -0
  403. package/test/utils/webex-test-users.js +7 -3
  404. package/dist/meeting/effectsState.js +0 -260
  405. package/dist/meeting/effectsState.js.map +0 -1
  406. package/dist/metrics/config.js +0 -289
  407. package/dist/metrics/config.js.map +0 -1
  408. package/dist/peer-connection-manager/index.js +0 -671
  409. package/dist/peer-connection-manager/index.js.map +0 -1
  410. package/dist/peer-connection-manager/util.js +0 -110
  411. package/dist/peer-connection-manager/util.js.map +0 -1
  412. package/dist/roap/collection.js +0 -63
  413. package/dist/roap/collection.js.map +0 -1
  414. package/dist/roap/handler.js +0 -279
  415. package/dist/roap/handler.js.map +0 -1
  416. package/dist/roap/state.js +0 -127
  417. package/dist/roap/state.js.map +0 -1
  418. package/dist/roap/util.js +0 -76
  419. package/dist/roap/util.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/meeting/effectsState.ts +0 -209
  422. package/src/metrics/config.ts +0 -485
  423. package/src/peer-connection-manager/index.ts +0 -847
  424. package/src/peer-connection-manager/util.ts +0 -119
  425. package/src/roap/collection.ts +0 -62
  426. package/src/roap/handler.ts +0 -294
  427. package/src/roap/state.ts +0 -156
  428. package/src/roap/util.ts +0 -100
  429. package/test/unit/spec/meeting/effectsState.js +0 -281
  430. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  431. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  432. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  433. package/test/unit/spec/roap/util.js +0 -30
@@ -1,13 +1,17 @@
1
1
  /* eslint no-shadow: ["error", { "allow": ["eventType"] }] */
2
2
 
3
3
  import '@webex/internal-plugin-mercury';
4
+ import '@webex/internal-plugin-conversation';
5
+ import '@webex/internal-plugin-metrics';
4
6
  // @ts-ignore
5
7
  import {WebexPlugin} from '@webex/webex-core';
8
+ import {setLogger} from '@webex/internal-media-core';
9
+
10
+ import * as mediaHelpersModule from '@webex/media-helpers';
6
11
 
7
12
  import 'webrtc-adapter';
8
13
 
9
14
  import Metrics from '../metrics';
10
- import {trigger, eventType} from '../metrics/config';
11
15
  import LoggerConfig from '../common/logs/logger-config';
12
16
  import StaticConfig from '../common/config';
13
17
  import LoggerProxy from '../common/logs/logger-proxy';
@@ -38,6 +42,9 @@ import {
38
42
  MEETING_REMOVED_REASON,
39
43
  _CONVERSATION_URL_,
40
44
  CONVERSATION_URL,
45
+ MEETINGNUMBER,
46
+ _JOINED_,
47
+ _MOVED_,
41
48
  } from '../constants';
42
49
  import BEHAVIORAL_METRICS from '../metrics/constants';
43
50
  import MeetingInfo from '../meeting-info';
@@ -51,7 +58,38 @@ import CaptchaError from '../common/errors/captcha-error';
51
58
 
52
59
  import MeetingCollection from './collection';
53
60
  import MeetingsUtil from './util';
61
+ import PermissionError from '../common/errors/permission';
62
+ import {INoiseReductionEffect, IVirtualBackgroundEffect} from './meetings.types';
63
+ import {SpaceIDDeprecatedError} from '../common/errors/webex-errors';
64
+ import NoMeetingInfoError from '../common/errors/no-meeting-info';
65
+
66
+ let mediaLogger;
67
+
68
+ class MediaLogger {
69
+ info(...args) {
70
+ LoggerProxy.logger.info(...args);
71
+ }
54
72
 
73
+ log(...args) {
74
+ LoggerProxy.logger.log(...args);
75
+ }
76
+
77
+ error(...args) {
78
+ LoggerProxy.logger.error(...args);
79
+ }
80
+
81
+ warn(...args) {
82
+ LoggerProxy.logger.warn(...args);
83
+ }
84
+
85
+ trace(...args) {
86
+ LoggerProxy.logger.trace(...args);
87
+ }
88
+
89
+ debug(...args) {
90
+ LoggerProxy.logger.debug(...args);
91
+ }
92
+ }
55
93
  /**
56
94
  * Meetings Ready Event
57
95
  * Emitted when the meetings instance on webex is ready
@@ -110,12 +148,13 @@ export default class Meetings extends WebexPlugin {
110
148
  meetingCollection: any;
111
149
  personalMeetingRoom: any;
112
150
  preferredWebexSite: any;
113
- reachability: any;
151
+ reachability: Reachability;
114
152
  registered: any;
115
153
  request: any;
116
154
  geoHintInfo: any;
117
155
  meetingInfo: any;
118
-
156
+ mediaHelpers: any;
157
+ breakoutLocusForHandleLater: any;
119
158
  namespace = MEETINGS;
120
159
 
121
160
  /**
@@ -127,6 +166,17 @@ export default class Meetings extends WebexPlugin {
127
166
  constructor(...args) {
128
167
  super(...args);
129
168
 
169
+ /**
170
+ * The webrtc-core media helpers. This is a temporary solution required for the SDK sample app
171
+ * to be able to call media helper functions.
172
+ *
173
+ * @instance
174
+ * @type {Object}
175
+ * @private
176
+ * @memberof Meetings
177
+ */
178
+ this.mediaHelpers = mediaHelpersModule;
179
+
130
180
  /**
131
181
  * The Meetings request to interact with server
132
182
  * @instance
@@ -154,15 +204,17 @@ export default class Meetings extends WebexPlugin {
154
204
  * @memberof Meetings
155
205
  */
156
206
  this.personalMeetingRoom = null;
207
+
157
208
  /**
158
- * The Reachability object to interact with server, starts as null until {@link Meeting#setReachability} is called
209
+ * The Reachability object to interact with server
159
210
  * starts as null
160
211
  * @instance
161
212
  * @type {Object}
162
213
  * @private
163
214
  * @memberof Meetings
164
215
  */
165
- this.reachability = null;
216
+ // @ts-ignore
217
+ this.reachability = new Reachability(this.webex);
166
218
 
167
219
  /**
168
220
  * If the meetings plugin has been registered and listening via {@link Meetings#register}
@@ -192,30 +244,137 @@ export default class Meetings extends WebexPlugin {
192
244
  */
193
245
  this.media = {
194
246
  getUserMedia: Media.getUserMedia,
195
- getSupportedDevice: Media.getSupportedDevice,
196
247
  };
197
248
 
198
249
  this.onReady();
199
250
  }
200
251
 
201
252
  /**
202
- * handle locus events and takes meeting actions with them as they come in
253
+ * check whether you need to handle this main session's locus data or not
254
+ * @param {Object} meeting current meeting data
255
+ * @param {Object} newLocus new locus data
256
+ * @returns {boolean}
257
+ * @private
258
+ * @memberof Meetings
259
+ */
260
+ private isNeedHandleMainLocus(meeting: any, newLocus: any) {
261
+ const breakoutUrl = newLocus.controls?.breakout?.url;
262
+ const breakoutLocus = this.meetingCollection.getActiveBreakoutLocus(breakoutUrl);
263
+
264
+ const isSelfJoined = newLocus?.self?.state === _JOINED_;
265
+ const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
266
+ // @ts-ignore
267
+ const deviceFromNewLocus = MeetingsUtil.getThisDevice(newLocus, this.webex.internal.device.url);
268
+ const isResourceMovedOnThisDevice =
269
+ deviceFromNewLocus?.state === _LEFT_ && deviceFromNewLocus?.reason === _MOVED_;
270
+
271
+ const isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(
272
+ meeting,
273
+ newLocus,
274
+ // @ts-ignore
275
+ this.webex.internal.device.url
276
+ );
277
+ const isBreakoutLocusJoinThisDevice =
278
+ breakoutLocus?.joinedWith?.correlationId &&
279
+ breakoutLocus.joinedWith.correlationId === meeting?.correlationId;
280
+
281
+ if (isSelfJoined && isNewLocusJoinThisDevice) {
282
+ LoggerProxy.logger.log(
283
+ 'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
284
+ );
285
+ if (breakoutLocus?.joinedWith && deviceFromNewLocus) {
286
+ const breakoutReplaceAt =
287
+ breakoutLocus.joinedWith.replaces?.length > 0
288
+ ? breakoutLocus.joinedWith.replaces[0].replaceAt
289
+ : '';
290
+ const newLocusReplaceAt =
291
+ deviceFromNewLocus.replaces?.length > 0 ? deviceFromNewLocus.replaces[0].replaceAt : '';
292
+ if (breakoutReplaceAt && newLocusReplaceAt && breakoutReplaceAt > newLocusReplaceAt) {
293
+ LoggerProxy.logger.log(
294
+ `Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt ${newLocusReplaceAt} bo replacedAt ${breakoutReplaceAt}`
295
+ );
296
+
297
+ return false;
298
+ }
299
+ }
300
+
301
+ return true;
302
+ }
303
+ if (isBreakoutLocusJoinThisDevice) {
304
+ LoggerProxy.logger.log(
305
+ `Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ${breakoutUrl}`
306
+ );
307
+
308
+ return false;
309
+ }
310
+ if (isSelfMoved && (newLocus?.self?.removed || isResourceMovedOnThisDevice)) {
311
+ LoggerProxy.logger.log(
312
+ 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
313
+ );
314
+
315
+ return false;
316
+ }
317
+ if (isSelfJoined && isResourceMovedOnThisDevice) {
318
+ LoggerProxy.logger.log(
319
+ 'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'
320
+ );
321
+
322
+ return false;
323
+ }
324
+ LoggerProxy.logger.log(
325
+ 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
326
+ );
327
+
328
+ return true;
329
+ }
330
+
331
+ /**
332
+ * check whether you need to handle this locus data or not
333
+ * @param {Object} meeting old locus data
334
+ * @param {Object} newLocus new locus data
335
+ * @returns {boolean}
336
+ * @private
337
+ * @memberof Meetings
338
+ */
339
+ private isNeedHandleLocusDTO(meeting: any, newLocus: any) {
340
+ if (newLocus) {
341
+ const isNewLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(newLocus);
342
+ const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
343
+ if (!meeting) {
344
+ if (isNewLocusAsBreakout) {
345
+ LoggerProxy.logger.log(
346
+ `Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: ${newLocus.fullState?.active}`
347
+ );
348
+
349
+ return newLocus.self?.state === _JOINED_;
350
+ }
351
+
352
+ return this.isNeedHandleMainLocus(meeting, newLocus);
353
+ }
354
+ if (!isNewLocusAsBreakout) {
355
+ return this.isNeedHandleMainLocus(meeting, newLocus);
356
+ }
357
+
358
+ return !isSelfMoved;
359
+ }
360
+
361
+ return true;
362
+ }
363
+
364
+ /**
365
+ * get corresponding meeting object by locus data
203
366
  * @param {Object} data a locus event
204
367
  * @param {String} data.locusUrl
205
368
  * @param {Object} data.locus
206
- * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
207
- * @param {String} data.eventType
208
- * @returns {undefined}
369
+ * @returns {Object}
209
370
  * @private
210
371
  * @memberof Meetings
211
372
  */
212
- private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
213
- let meeting = null;
214
-
373
+ getCorrespondingMeetingByLocus(data) {
215
374
  // getting meeting by correlationId. This will happen for the new event
216
375
  // Either the locus
217
376
  // TODO : Add check for the callBack Address
218
- meeting =
377
+ return (
219
378
  this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||
220
379
  // @ts-ignore
221
380
  this.meetingCollection.getByKey(
@@ -231,7 +390,24 @@ export default class Meetings extends WebexPlugin {
231
390
  ) ||
232
391
  (data.locus.info?.isUnifiedSpaceMeeting
233
392
  ? undefined
234
- : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl));
393
+ : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl)) ||
394
+ this.meetingCollection.getByKey(MEETINGNUMBER, data.locus?.info?.webExMeetingId)
395
+ );
396
+ }
397
+
398
+ /**
399
+ * handle locus events and takes meeting actions with them as they come in
400
+ * @param {Object} data a locus event
401
+ * @param {String} data.locusUrl
402
+ * @param {Object} data.locus
403
+ * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
404
+ * @param {String} data.eventType
405
+ * @returns {undefined}
406
+ * @private
407
+ * @memberof Meetings
408
+ */
409
+ private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
410
+ let meeting = this.getCorrespondingMeetingByLocus(data);
235
411
 
236
412
  // Special case when locus has got replaced, This only happend once if a replace locus exists
237
413
  // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call
@@ -244,6 +420,16 @@ export default class Meetings extends WebexPlugin {
244
420
  );
245
421
  }
246
422
 
423
+ if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {
424
+ meeting.locusInfo.updateMainSessionLocusCache(data.locus);
425
+ }
426
+ if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {
427
+ LoggerProxy.logger.log(
428
+ `Meetings:index#handleLocusEvent --> doesn't need to process locus event`
429
+ );
430
+
431
+ return;
432
+ }
247
433
  if (!meeting) {
248
434
  // TODO: create meeting when we get a meeting object
249
435
  // const checkForEnded = (locus) => {
@@ -300,6 +486,7 @@ export default class Meetings extends WebexPlugin {
300
486
 
301
487
  // It's a new meeting so initialize the locus data
302
488
  meeting.locusInfo.initialSetup(data.locus);
489
+ this.checkHandleBreakoutLocus(data.locus);
303
490
  })
304
491
  .catch((e) => {
305
492
  LoggerProxy.logger.error(e);
@@ -309,10 +496,15 @@ export default class Meetings extends WebexPlugin {
309
496
  // because the other user left so before sending 'added' event make sure it exists in the collection
310
497
 
311
498
  if (this.getMeetingByType(_ID_, meeting.id)) {
312
- Metrics.postEvent({
313
- event: eventType.REMOTE_STARTED,
314
- meeting,
315
- data: {trigger: trigger.MERCURY_EVENT},
499
+ // @ts-ignore
500
+ this.webex.internal.newMetrics.submitClientEvent({
501
+ name: 'client.call.remote-started',
502
+ payload: {
503
+ trigger: 'mercury-event',
504
+ },
505
+ options: {
506
+ meetingId: meeting.id,
507
+ },
316
508
  });
317
509
  Trigger.trigger(
318
510
  this,
@@ -431,6 +623,9 @@ export default class Meetings extends WebexPlugin {
431
623
  // @ts-ignore
432
624
  LoggerProxy.set(this.webex.logger);
433
625
 
626
+ mediaLogger = new MediaLogger();
627
+ setLogger(mediaLogger);
628
+
434
629
  /**
435
630
  * The MeetingInfo object to interact with server
436
631
  * @instance
@@ -462,7 +657,7 @@ export default class Meetings extends WebexPlugin {
462
657
 
463
658
  MeetingsUtil.checkH264Support({disableNotifications: true});
464
659
  // @ts-ignore
465
- Metrics.initialSetup(this.meetingCollection, this.webex);
660
+ Metrics.initialSetup(this.webex);
466
661
  });
467
662
  }
468
663
 
@@ -486,21 +681,6 @@ export default class Meetings extends WebexPlugin {
486
681
  }
487
682
  }
488
683
 
489
- /**
490
- * API to enable or disable TURN discovery
491
- * @param {Boolean} enable
492
- * @private
493
- * @memberof Meetings
494
- * @returns {undefined}
495
- */
496
- private _toggleTurnDiscovery(enable: boolean) {
497
- if (typeof enable !== 'boolean') {
498
- return;
499
- }
500
- // @ts-ignore
501
- this.config.experimental.enableTurnDiscovery = enable;
502
- }
503
-
504
684
  /**
505
685
  * API to toggle starting adhoc meeting
506
686
  * @param {Boolean} changeState
@@ -631,6 +811,36 @@ export default class Meetings extends WebexPlugin {
631
811
  );
632
812
  }
633
813
 
814
+ /**
815
+ * Creates a noise reduction effect
816
+ *
817
+ * @param {INoiseReductionEffect} options optional custom effect options
818
+ * @returns {Promise<effect>} noise reduction effect.
819
+ * @public
820
+ * @memberof Meetings
821
+ */
822
+ createNoiseReductionEffect = async (options?: INoiseReductionEffect) => {
823
+ // @ts-ignore
824
+ const authToken = this.webex.credentials.supertoken.access_token;
825
+
826
+ return new mediaHelpersModule.NoiseReductionEffect({authToken, ...options});
827
+ };
828
+
829
+ /**
830
+ * Creates a virtual background effect
831
+ *
832
+ * @param {IVirtualBackgroundEffect} options optional custom effect options
833
+ * @returns {Promise<effect>} virtual background effect.
834
+ * @public
835
+ * @memberof Meetings
836
+ */
837
+ createVirtualBackgroundEffect = async (options?: IVirtualBackgroundEffect) => {
838
+ // @ts-ignore
839
+ const authToken = this.webex.credentials.supertoken.access_token;
840
+
841
+ return new mediaHelpersModule.VirtualBackgroundEffect({authToken, ...options});
842
+ };
843
+
634
844
  /**
635
845
  * Uploads logs to the webex services for tracking
636
846
  * @param {Object} [options={}]
@@ -645,8 +855,10 @@ export default class Meetings extends WebexPlugin {
645
855
  */
646
856
  uploadLogs(
647
857
  options: {
858
+ autoupload?: boolean;
648
859
  callStart?: string;
649
860
  feedbackId?: string;
861
+ locussessionid?: string;
650
862
  locusId?: string;
651
863
  correlationId?: string;
652
864
  meetingId?: string;
@@ -663,6 +875,7 @@ export default class Meetings extends WebexPlugin {
663
875
  'Meetings:index#uploadLogs --> Upload logs for meeting completed.',
664
876
  uploadResult
665
877
  );
878
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_SUCCESS, options);
666
879
  Trigger.trigger(
667
880
  this,
668
881
  {
@@ -697,8 +910,7 @@ export default class Meetings extends WebexPlugin {
697
910
  );
698
911
 
699
912
  Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE, {
700
- // @ts-ignore - seems like typo
701
- meetingId: options.meetingsId,
913
+ ...options,
702
914
  reason: uploadError.message,
703
915
  stack: uploadError.stack,
704
916
  code: uploadError.code,
@@ -706,17 +918,6 @@ export default class Meetings extends WebexPlugin {
706
918
  });
707
919
  }
708
920
 
709
- /**
710
- * initializes the reachability instance for Meetings
711
- * @returns {undefined}
712
- * @public
713
- * @memberof Meetings
714
- */
715
- setReachability() {
716
- // @ts-ignore
717
- this.reachability = new Reachability(this.webex);
718
- }
719
-
720
921
  /**
721
922
  * gets the reachability instance for Meetings
722
923
  * @returns {Reachability}
@@ -734,10 +935,6 @@ export default class Meetings extends WebexPlugin {
734
935
  * @memberof Meetings
735
936
  */
736
937
  startReachability() {
737
- if (!this.reachability) {
738
- this.setReachability();
739
- }
740
-
741
938
  return this.getReachability().gatherReachability();
742
939
  }
743
940
 
@@ -765,6 +962,29 @@ export default class Meetings extends WebexPlugin {
765
962
  if (res) {
766
963
  this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);
767
964
  }
965
+
966
+ // fall back to getting the preferred site from the user information
967
+ if (!this.preferredWebexSite) {
968
+ // @ts-ignore
969
+ return this.webex.internal.user
970
+ .get()
971
+ .then((user) => {
972
+ const preferredWebexSite =
973
+ user?.userPreferences?.userPreferencesItems?.preferredWebExSite;
974
+ if (preferredWebexSite) {
975
+ this.preferredWebexSite = preferredWebexSite;
976
+ } else {
977
+ throw new Error('site not found');
978
+ }
979
+ })
980
+ .catch(() => {
981
+ LoggerProxy.logger.error(
982
+ 'Failed to fetch preferred site from user - no site will be set'
983
+ );
984
+ });
985
+ }
986
+
987
+ return Promise.resolve();
768
988
  });
769
989
  }
770
990
 
@@ -806,14 +1026,24 @@ export default class Meetings extends WebexPlugin {
806
1026
 
807
1027
  /**
808
1028
  * Create a meeting.
809
- * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}
1029
+ * @param {string} destination - sipURL, phonenumber, or locus object}
810
1030
  * @param {string} [type] - the optional specified type, such as locusId
811
1031
  * @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info
1032
+ * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
1033
+ * @param {string} correlationId - the optional specified correlationId
1034
+ * @param {Boolean} failOnMissingMeetingInfo - whether to throw an error if meeting info fails to fetch (for calls that are not 1:1 or content share)
812
1035
  * @returns {Promise<Meeting>} A new Meeting.
813
1036
  * @public
814
1037
  * @memberof Meetings
815
1038
  */
816
- public create(destination: string, type: string = null, useRandomDelayForInfo = false) {
1039
+ public create(
1040
+ destination: string,
1041
+ type: string = null,
1042
+ useRandomDelayForInfo = false,
1043
+ infoExtraParams = {},
1044
+ correlationId: string = undefined,
1045
+ failOnMissingMeetingInfo = false
1046
+ ) {
817
1047
  // TODO: type should be from a dictionary
818
1048
 
819
1049
  // Validate meeting information based on the provided destination and
@@ -825,9 +1055,12 @@ export default class Meetings extends WebexPlugin {
825
1055
  .fetchInfoOptions(destination, type)
826
1056
  // Catch a failure to fetch info options.
827
1057
  .catch((error) => {
828
- LoggerProxy.logger.info(
829
- `Meetings:index#create --> INFO, unable to determine info options: ${error.message}`
1058
+ LoggerProxy.logger.error(
1059
+ `Meetings:index#create --> ERROR, unable to determine info options: ${error.message}`
830
1060
  );
1061
+ if (error instanceof SpaceIDDeprecatedError) {
1062
+ throw new SpaceIDDeprecatedError();
1063
+ }
831
1064
  })
832
1065
  .then((options: any = {}) => {
833
1066
  // Normalize the destination.
@@ -858,48 +1091,57 @@ export default class Meetings extends WebexPlugin {
858
1091
  // Validate if a meeting was found.
859
1092
  if (!meeting) {
860
1093
  // Create a meeting based on the normalized destination and type.
861
- return this.createMeeting(targetDest, type, useRandomDelayForInfo).then(
862
- (createdMeeting: any) => {
863
- // If the meeting was successfully created.
864
- if (createdMeeting && createdMeeting.on) {
865
- // Create a destruction event for the meeting.
866
- createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {
867
- // @ts-ignore
868
- if (this.config.autoUploadLogs) {
869
- this.uploadLogs({
870
- callStart: createdMeeting.locusInfo?.fullState?.lastActive,
871
- correlationId: createdMeeting.correlationId,
872
- feedbackId: createdMeeting.correlationId,
873
- locusId: createdMeeting.locusId,
874
- meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
875
- }).then(() => this.destroy(createdMeeting, payload.reason));
876
- } else {
877
- this.destroy(createdMeeting, payload.reason);
878
- }
879
- });
880
-
881
- createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
882
- // @ts-ignore
883
- if (this.config.autoUploadLogs) {
884
- this.uploadLogs({
885
- callStart: meetingInstance?.locusInfo?.fullState?.lastActive,
886
- correlationId: meetingInstance.correlationId,
887
- feedbackId: meetingInstance.correlationId,
888
- locusId: meetingInstance.locusId,
889
- meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
890
- });
891
- }
892
- });
893
- } else {
894
- LoggerProxy.logger.error(
895
- `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
896
- );
897
- }
898
-
899
- // Return the newly created meeting.
900
- return Promise.resolve(createdMeeting);
1094
+ return this.createMeeting(
1095
+ targetDest,
1096
+ type,
1097
+ useRandomDelayForInfo,
1098
+ infoExtraParams,
1099
+ correlationId,
1100
+ failOnMissingMeetingInfo
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
+ locussessionid: createdMeeting.locusInfo?.fullState?.sessionId,
1111
+ correlationId: createdMeeting.correlationId,
1112
+ feedbackId: createdMeeting.correlationId,
1113
+ locusId: createdMeeting.locusId,
1114
+ meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
1115
+ autoupload: true,
1116
+ }).then(() => this.destroy(createdMeeting, payload.reason));
1117
+ } else {
1118
+ this.destroy(createdMeeting, payload.reason);
1119
+ }
1120
+ });
1121
+
1122
+ createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
1123
+ // @ts-ignore
1124
+ if (this.config.autoUploadLogs) {
1125
+ this.uploadLogs({
1126
+ callStart: meetingInstance?.locusInfo?.fullState?.lastActive,
1127
+ locussessionid: meetingInstance?.locusInfo?.fullState?.sessionId,
1128
+ correlationId: meetingInstance.correlationId,
1129
+ feedbackId: meetingInstance.correlationId,
1130
+ locusId: meetingInstance.locusId,
1131
+ meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
1132
+ autoupload: true,
1133
+ });
1134
+ }
1135
+ });
1136
+ } else {
1137
+ LoggerProxy.logger.error(
1138
+ `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
1139
+ );
901
1140
  }
902
- );
1141
+
1142
+ // Return the newly created meeting.
1143
+ return Promise.resolve(createdMeeting);
1144
+ });
903
1145
  }
904
1146
 
905
1147
  // Return the existing meeting.
@@ -912,6 +1154,9 @@ export default class Meetings extends WebexPlugin {
912
1154
  * @param {String} destination see create()
913
1155
  * @param {String} type see create()
914
1156
  * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
1157
+ * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
1158
+ * @param {String} correlationId the optional specified correlationId
1159
+ * @param {Boolean} failOnMissingMeetingInfo - whether to throw an error if meeting info fails to fetch (for calls that are not 1:1 or content share)
915
1160
  * @returns {Promise} a new meeting instance complete with meeting info and destination
916
1161
  * @private
917
1162
  * @memberof Meetings
@@ -919,7 +1164,10 @@ export default class Meetings extends WebexPlugin {
919
1164
  private async createMeeting(
920
1165
  destination: any,
921
1166
  type: string = null,
922
- useRandomDelayForInfo = false
1167
+ useRandomDelayForInfo = false,
1168
+ infoExtraParams = {},
1169
+ correlationId: string = undefined,
1170
+ failOnMissingMeetingInfo = false
923
1171
  ) {
924
1172
  const meeting = new Meeting(
925
1173
  {
@@ -929,11 +1177,11 @@ export default class Meetings extends WebexPlugin {
929
1177
  deviceUrl: this.webex.internal.device.url,
930
1178
  // @ts-ignore
931
1179
  orgId: this.webex.internal.device.orgId,
932
- roapSeq: 0,
933
1180
  locus: type === _LOCUS_ID_ ? destination : null, // pass the locus object if present
934
1181
  meetingInfoProvider: this.meetingInfo,
935
1182
  destination,
936
1183
  destinationType: type,
1184
+ correlationId,
937
1185
  },
938
1186
  {
939
1187
  // @ts-ignore
@@ -968,19 +1216,38 @@ export default class Meetings extends WebexPlugin {
968
1216
 
969
1217
  if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {
970
1218
  meeting.fetchMeetingInfoTimeoutId = setTimeout(
971
- () => meeting.fetchMeetingInfo({}),
1219
+ () =>
1220
+ meeting.fetchMeetingInfo({
1221
+ extraParams: infoExtraParams,
1222
+ sendCAevents: !!correlationId, // if client sends correlation id as argument of public create(), then it means that this meeting creation is part of a pre-join intent from user
1223
+ }),
972
1224
  waitingTime
973
1225
  );
974
1226
  meeting.parseMeetingInfo(undefined, destination);
975
1227
  } else {
976
- await meeting.fetchMeetingInfo({});
1228
+ await meeting.fetchMeetingInfo({
1229
+ extraParams: infoExtraParams,
1230
+ sendCAevents: !!correlationId, // if client sends correlation id as argument of public create(), then it means that this meeting creation is part of a pre-join intent from user
1231
+ });
977
1232
  }
978
1233
  } catch (err) {
979
- if (!(err instanceof CaptchaError) && !(err instanceof PasswordError)) {
980
- // if there is no meeting info we assume its a 1:1 call or wireless share
1234
+ if (
1235
+ !(err instanceof CaptchaError) &&
1236
+ !(err instanceof PasswordError) &&
1237
+ !(err instanceof PermissionError)
1238
+ ) {
981
1239
  LoggerProxy.logger.info(
982
1240
  `Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`
983
1241
  );
1242
+ if (failOnMissingMeetingInfo) {
1243
+ LoggerProxy.logger.info(
1244
+ `Meetings:index#createMeeting --> Destroying meeting due to missing meeting info.`
1245
+ );
1246
+ // @ts-ignore
1247
+ this.destroy(meeting, MEETING_REMOVED_REASON.MISSING_MEETING_INFO);
1248
+ throw new NoMeetingInfoError();
1249
+ }
1250
+ // if there is no meeting info and no error should be thrown then we assume its a 1:1 call or wireless share
984
1251
  LoggerProxy.logger.info(
985
1252
  'Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share'
986
1253
  );
@@ -1033,7 +1300,7 @@ export default class Meetings extends WebexPlugin {
1033
1300
  //
1034
1301
  // Our job is to determine the appropriate one
1035
1302
  // and its corresponding service so that developers
1036
- // need only sipURL or spaceID to get a meeting
1303
+ // need only sipURL to get a meeting
1037
1304
  // and its ID, but have the option to use createWithType()
1038
1305
  // and specify those types to get meetingInfo
1039
1306
  }
@@ -1077,33 +1344,108 @@ export default class Meetings extends WebexPlugin {
1077
1344
  * @memberof Meetings
1078
1345
  */
1079
1346
  public syncMeetings() {
1080
- return this.request.getActiveMeetings().then((locusArray) => {
1081
- const activeLocusUrl = [];
1082
-
1083
- if (locusArray?.loci && locusArray.loci.length > 0) {
1084
- locusArray.loci.forEach((locus) => {
1085
- activeLocusUrl.push(locus.url);
1086
- this.handleLocusEvent({
1087
- locus,
1088
- locusUrl: locus.url,
1347
+ return this.request
1348
+ .getActiveMeetings()
1349
+ .then((locusArray) => {
1350
+ const activeLocusUrl = [];
1351
+
1352
+ if (locusArray?.loci && locusArray.loci.length > 0) {
1353
+ const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);
1354
+ lociToUpdate.forEach((locus) => {
1355
+ activeLocusUrl.push(locus.url);
1356
+ this.handleLocusEvent({
1357
+ locus,
1358
+ locusUrl: locus.url,
1359
+ });
1089
1360
  });
1090
- });
1091
- }
1092
- const meetingsCollection = this.meetingCollection.getAll();
1361
+ }
1362
+ const meetingsCollection = this.meetingCollection.getAll();
1093
1363
 
1094
- if (Object.keys(meetingsCollection).length > 0) {
1095
- // Some time the mercury event is missed after mercury reconnect
1096
- // if sync returns no locus then clear all the meetings
1097
- for (const meeting of Object.values(meetingsCollection)) {
1098
- // @ts-ignore
1099
- if (!activeLocusUrl.includes(meeting.locusUrl)) {
1100
- // destroy function also uploads logs
1364
+ if (Object.keys(meetingsCollection).length > 0) {
1365
+ // Some time the mercury event is missed after mercury reconnect
1366
+ // if sync returns no locus then clear all the meetings
1367
+ for (const meeting of Object.values(meetingsCollection)) {
1101
1368
  // @ts-ignore
1102
- this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
1369
+ if (!activeLocusUrl.includes(meeting.locusUrl)) {
1370
+ // destroy function also uploads logs
1371
+ // @ts-ignore
1372
+ this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
1373
+ }
1103
1374
  }
1104
1375
  }
1376
+ })
1377
+ .catch((error) => {
1378
+ LoggerProxy.logger.error(
1379
+ `Meetings:index#syncMeetings --> failed to sync meetings, ${error}`
1380
+ );
1381
+ throw new Error(error);
1382
+ });
1383
+ }
1384
+
1385
+ /**
1386
+ * sort out locus array for initial creating
1387
+ * @param {Array} loci original locus array
1388
+ * @returns {undefined}
1389
+ * @public
1390
+ * @memberof Meetings
1391
+ */
1392
+ sortLocusArrayToUpdate(loci: any[]) {
1393
+ const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));
1394
+ const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));
1395
+ this.breakoutLocusForHandleLater = [];
1396
+ const lociToUpdate = [...mainLoci];
1397
+ breakoutLoci.forEach((breakoutLocus) => {
1398
+ const associateMainLocus = mainLoci.find(
1399
+ (mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url
1400
+ );
1401
+ const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({
1402
+ locus: breakoutLocus,
1403
+ locusUrl: breakoutLocus.url,
1404
+ });
1405
+
1406
+ if (associateMainLocus && !existCorrespondingMeeting) {
1407
+ // if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,
1408
+ // after meeting create with main locus, then handle the associate breakout locus.
1409
+ // if only handle breakout locus, will miss some date
1410
+ this.breakoutLocusForHandleLater.push(breakoutLocus);
1411
+ } else {
1412
+ lociToUpdate.push(breakoutLocus);
1105
1413
  }
1106
1414
  });
1415
+
1416
+ return lociToUpdate;
1417
+ }
1418
+
1419
+ /**
1420
+ * check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus
1421
+ * @param {Object} newCreatedLocus the locus which just create meeting object of it
1422
+ * @returns {undefined}
1423
+ * @public
1424
+ * @memberof Meetings
1425
+ */
1426
+ checkHandleBreakoutLocus(newCreatedLocus) {
1427
+ if (
1428
+ !newCreatedLocus ||
1429
+ !this.breakoutLocusForHandleLater ||
1430
+ !this.breakoutLocusForHandleLater.length
1431
+ ) {
1432
+ return;
1433
+ }
1434
+ if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {
1435
+ return;
1436
+ }
1437
+ const existIndex = this.breakoutLocusForHandleLater.findIndex(
1438
+ (breakoutLocus) =>
1439
+ breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url
1440
+ );
1441
+
1442
+ if (existIndex < 0) {
1443
+ return;
1444
+ }
1445
+
1446
+ const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];
1447
+ this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});
1448
+ this.breakoutLocusForHandleLater.splice(existIndex, 1);
1107
1449
  }
1108
1450
 
1109
1451
  /**