@webex/plugin-meetings 3.0.0-beta.31 → 3.0.0-beta.310

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 (378) 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 +94 -15
  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 +709 -35
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/utils.js +45 -1
  17. package/dist/breakouts/utils.js.map +1 -1
  18. package/dist/common/errors/no-meeting-info.js +51 -0
  19. package/dist/common/errors/no-meeting-info.js.map +1 -0
  20. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  21. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +48 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/logs/request.js +5 -1
  27. package/dist/common/logs/request.js.map +1 -1
  28. package/dist/common/queue.js +24 -9
  29. package/dist/common/queue.js.map +1 -1
  30. package/dist/config.js +5 -11
  31. package/dist/config.js.map +1 -1
  32. package/dist/constants.js +233 -29
  33. package/dist/constants.js.map +1 -1
  34. package/dist/controls-options-manager/enums.js +14 -2
  35. package/dist/controls-options-manager/enums.js.map +1 -1
  36. package/dist/controls-options-manager/index.js +109 -15
  37. package/dist/controls-options-manager/index.js.map +1 -1
  38. package/dist/controls-options-manager/types.js +7 -0
  39. package/dist/controls-options-manager/types.js.map +1 -0
  40. package/dist/controls-options-manager/util.js +309 -18
  41. package/dist/controls-options-manager/util.js.map +1 -1
  42. package/dist/index.js +112 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/interpretation/collection.js +23 -0
  45. package/dist/interpretation/collection.js.map +1 -0
  46. package/dist/interpretation/index.js +366 -0
  47. package/dist/interpretation/index.js.map +1 -0
  48. package/dist/interpretation/siLanguage.js +25 -0
  49. package/dist/interpretation/siLanguage.js.map +1 -0
  50. package/dist/locus-info/controlsUtils.js +91 -2
  51. package/dist/locus-info/controlsUtils.js.map +1 -1
  52. package/dist/locus-info/index.js +383 -62
  53. package/dist/locus-info/index.js.map +1 -1
  54. package/dist/locus-info/infoUtils.js +7 -1
  55. package/dist/locus-info/infoUtils.js.map +1 -1
  56. package/dist/locus-info/mediaSharesUtils.js +57 -1
  57. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  58. package/dist/locus-info/parser.js +249 -72
  59. package/dist/locus-info/parser.js.map +1 -1
  60. package/dist/locus-info/selfUtils.js +89 -14
  61. package/dist/locus-info/selfUtils.js.map +1 -1
  62. package/dist/media/index.js +61 -116
  63. package/dist/media/index.js.map +1 -1
  64. package/dist/media/properties.js +73 -124
  65. package/dist/media/properties.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +82 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +3777 -2929
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +292 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +230 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +260 -196
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +601 -417
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +73 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +192 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/util.js +1 -1
  83. package/dist/meeting-info/util.js.map +1 -1
  84. package/dist/meeting-info/utilv2.js +36 -36
  85. package/dist/meeting-info/utilv2.js.map +1 -1
  86. package/dist/meetings/collection.js +39 -0
  87. package/dist/meetings/collection.js.map +1 -1
  88. package/dist/meetings/index.js +415 -115
  89. package/dist/meetings/index.js.map +1 -1
  90. package/dist/meetings/meetings.types.js +7 -0
  91. package/dist/meetings/meetings.types.js.map +1 -0
  92. package/dist/meetings/request.js +2 -0
  93. package/dist/meetings/request.js.map +1 -1
  94. package/dist/meetings/util.js +72 -6
  95. package/dist/meetings/util.js.map +1 -1
  96. package/dist/member/index.js +58 -0
  97. package/dist/member/index.js.map +1 -1
  98. package/dist/member/types.js +25 -0
  99. package/dist/member/types.js.map +1 -0
  100. package/dist/member/util.js +132 -25
  101. package/dist/member/util.js.map +1 -1
  102. package/dist/members/collection.js +10 -0
  103. package/dist/members/collection.js.map +1 -1
  104. package/dist/members/index.js +102 -6
  105. package/dist/members/index.js.map +1 -1
  106. package/dist/members/request.js +106 -38
  107. package/dist/members/request.js.map +1 -1
  108. package/dist/members/types.js +15 -0
  109. package/dist/members/types.js.map +1 -0
  110. package/dist/members/util.js +326 -232
  111. package/dist/members/util.js.map +1 -1
  112. package/dist/metrics/constants.js +13 -5
  113. package/dist/metrics/constants.js.map +1 -1
  114. package/dist/metrics/index.js +1 -468
  115. package/dist/metrics/index.js.map +1 -1
  116. package/dist/multistream/mediaRequestManager.js +238 -49
  117. package/dist/multistream/mediaRequestManager.js.map +1 -1
  118. package/dist/multistream/receiveSlot.js +29 -16
  119. package/dist/multistream/receiveSlot.js.map +1 -1
  120. package/dist/multistream/receiveSlotManager.js +39 -36
  121. package/dist/multistream/receiveSlotManager.js.map +1 -1
  122. package/dist/multistream/remoteMedia.js +44 -18
  123. package/dist/multistream/remoteMedia.js.map +1 -1
  124. package/dist/multistream/remoteMediaGroup.js +60 -3
  125. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  126. package/dist/multistream/remoteMediaManager.js +209 -59
  127. package/dist/multistream/remoteMediaManager.js.map +1 -1
  128. package/dist/multistream/sendSlotManager.js +233 -0
  129. package/dist/multistream/sendSlotManager.js.map +1 -0
  130. package/dist/reachability/index.js +225 -59
  131. package/dist/reachability/index.js.map +1 -1
  132. package/dist/reachability/request.js +17 -8
  133. package/dist/reachability/request.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +201 -156
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -2
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +62 -32
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +112 -97
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +95 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +117 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/index.js +86 -78
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +11 -10
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  158. package/dist/types/breakouts/events.d.ts +8 -0
  159. package/dist/types/breakouts/utils.d.ts +14 -0
  160. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  161. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  162. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  163. package/dist/types/common/logs/request.d.ts +2 -0
  164. package/dist/types/common/queue.d.ts +9 -7
  165. package/dist/types/config.d.ts +1 -7
  166. package/dist/types/constants.d.ts +194 -24
  167. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  168. package/dist/types/controls-options-manager/index.d.ts +17 -1
  169. package/dist/types/controls-options-manager/types.d.ts +43 -0
  170. package/dist/types/controls-options-manager/util.d.ts +1 -7
  171. package/dist/types/index.d.ts +6 -4
  172. package/dist/types/interpretation/collection.d.ts +5 -0
  173. package/dist/types/interpretation/index.d.ts +5 -0
  174. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  175. package/dist/types/locus-info/index.d.ts +57 -4
  176. package/dist/types/locus-info/parser.d.ts +67 -6
  177. package/dist/types/media/index.d.ts +2 -0
  178. package/dist/types/media/properties.d.ts +34 -48
  179. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  180. package/dist/types/meeting/index.d.ts +463 -510
  181. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  182. package/dist/types/meeting/muteState.d.ts +99 -23
  183. package/dist/types/meeting/request.d.ts +72 -43
  184. package/dist/types/meeting/util.d.ts +101 -1
  185. package/dist/types/meeting-info/index.d.ts +13 -1
  186. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  187. package/dist/types/meetings/collection.d.ts +17 -0
  188. package/dist/types/meetings/index.d.ts +98 -20
  189. package/dist/types/meetings/meetings.types.d.ts +4 -0
  190. package/dist/types/member/index.d.ts +14 -0
  191. package/dist/types/member/types.d.ts +32 -0
  192. package/dist/types/members/collection.d.ts +5 -0
  193. package/dist/types/members/index.d.ts +35 -2
  194. package/dist/types/members/request.d.ts +73 -9
  195. package/dist/types/members/types.d.ts +25 -0
  196. package/dist/types/members/util.d.ts +214 -1
  197. package/dist/types/metrics/constants.d.ts +12 -4
  198. package/dist/types/metrics/index.d.ts +4 -119
  199. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  200. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  201. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  202. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  203. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  204. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  205. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  206. package/dist/types/reachability/index.d.ts +61 -7
  207. package/dist/types/reachability/request.d.ts +7 -3
  208. package/dist/types/reconnection-manager/index.d.ts +9 -0
  209. package/dist/types/recording-controller/index.d.ts +15 -1
  210. package/dist/types/recording-controller/util.d.ts +5 -4
  211. package/dist/types/roap/index.d.ts +2 -1
  212. package/dist/types/roap/request.d.ts +15 -11
  213. package/dist/types/roap/turnDiscovery.d.ts +21 -3
  214. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  215. package/dist/types/rtcMetrics/index.d.ts +47 -0
  216. package/dist/types/statsAnalyzer/index.d.ts +7 -1
  217. package/dist/types/webinar/collection.d.ts +16 -0
  218. package/dist/types/webinar/index.d.ts +5 -0
  219. package/dist/webinar/collection.js +44 -0
  220. package/dist/webinar/collection.js.map +1 -0
  221. package/dist/webinar/index.js +69 -0
  222. package/dist/webinar/index.js.map +1 -0
  223. package/package.json +23 -20
  224. package/src/annotation/annotation.types.ts +50 -0
  225. package/src/annotation/constants.ts +36 -0
  226. package/src/annotation/index.ts +328 -0
  227. package/src/breakouts/README.md +42 -12
  228. package/src/breakouts/breakout.ts +67 -9
  229. package/src/breakouts/edit-lock-error.ts +25 -0
  230. package/src/breakouts/events.ts +56 -0
  231. package/src/breakouts/index.ts +592 -20
  232. package/src/breakouts/utils.ts +42 -0
  233. package/src/common/errors/no-meeting-info.ts +24 -0
  234. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  235. package/src/common/errors/webex-errors.ts +44 -2
  236. package/src/common/logs/logger-proxy.ts +1 -1
  237. package/src/common/logs/request.ts +5 -1
  238. package/src/common/queue.ts +22 -8
  239. package/src/config.ts +4 -10
  240. package/src/constants.ts +221 -19
  241. package/src/controls-options-manager/enums.ts +12 -0
  242. package/src/controls-options-manager/index.ts +116 -21
  243. package/src/controls-options-manager/types.ts +59 -0
  244. package/src/controls-options-manager/util.ts +294 -14
  245. package/src/index.ts +40 -0
  246. package/src/interpretation/README.md +60 -0
  247. package/src/interpretation/collection.ts +19 -0
  248. package/src/interpretation/index.ts +332 -0
  249. package/src/interpretation/siLanguage.ts +18 -0
  250. package/src/locus-info/controlsUtils.ts +108 -0
  251. package/src/locus-info/index.ts +413 -59
  252. package/src/locus-info/infoUtils.ts +10 -2
  253. package/src/locus-info/mediaSharesUtils.ts +64 -0
  254. package/src/locus-info/parser.ts +258 -47
  255. package/src/locus-info/selfUtils.ts +81 -5
  256. package/src/media/index.ts +102 -122
  257. package/src/media/properties.ts +87 -110
  258. package/src/meeting/in-meeting-actions.ts +163 -3
  259. package/src/meeting/index.ts +3132 -2541
  260. package/src/meeting/locusMediaRequest.ts +313 -0
  261. package/src/meeting/muteState.ts +229 -131
  262. package/src/meeting/request.ts +177 -121
  263. package/src/meeting/util.ts +588 -394
  264. package/src/meeting-info/index.ts +81 -8
  265. package/src/meeting-info/meeting-info-v2.ts +170 -14
  266. package/src/meeting-info/util.ts +1 -1
  267. package/src/meeting-info/utilv2.ts +23 -23
  268. package/src/meetings/collection.ts +33 -0
  269. package/src/meetings/index.ts +445 -123
  270. package/src/meetings/meetings.types.ts +12 -0
  271. package/src/meetings/request.ts +2 -0
  272. package/src/meetings/util.ts +80 -11
  273. package/src/member/index.ts +58 -0
  274. package/src/member/types.ts +38 -0
  275. package/src/member/util.ts +141 -25
  276. package/src/members/collection.ts +8 -0
  277. package/src/members/index.ts +134 -8
  278. package/src/members/request.ts +97 -17
  279. package/src/members/types.ts +29 -0
  280. package/src/members/util.ts +333 -240
  281. package/src/metrics/constants.ts +12 -4
  282. package/src/metrics/index.ts +1 -490
  283. package/src/multistream/mediaRequestManager.ts +289 -79
  284. package/src/multistream/receiveSlot.ts +31 -17
  285. package/src/multistream/receiveSlotManager.ts +34 -24
  286. package/src/multistream/remoteMedia.ts +27 -2
  287. package/src/multistream/remoteMediaGroup.ts +59 -0
  288. package/src/multistream/remoteMediaManager.ts +148 -30
  289. package/src/multistream/sendSlotManager.ts +170 -0
  290. package/src/reachability/index.ts +228 -37
  291. package/src/reachability/request.ts +17 -8
  292. package/src/reconnection-manager/index.ts +83 -56
  293. package/src/recording-controller/index.ts +20 -3
  294. package/src/recording-controller/util.ts +26 -9
  295. package/src/roap/index.ts +63 -32
  296. package/src/roap/request.ts +100 -104
  297. package/src/roap/turnDiscovery.ts +48 -26
  298. package/src/rtcMetrics/constants.ts +3 -0
  299. package/src/rtcMetrics/index.ts +100 -0
  300. package/src/statsAnalyzer/index.ts +105 -91
  301. package/src/statsAnalyzer/mqaUtil.ts +13 -14
  302. package/src/webinar/collection.ts +31 -0
  303. package/src/webinar/index.ts +62 -0
  304. package/test/integration/spec/converged-space-meetings.js +60 -3
  305. package/test/integration/spec/journey.js +320 -261
  306. package/test/integration/spec/space-meeting.js +76 -3
  307. package/test/unit/spec/annotation/index.ts +418 -0
  308. package/test/unit/spec/breakouts/breakout.ts +118 -28
  309. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  310. package/test/unit/spec/breakouts/events.ts +89 -0
  311. package/test/unit/spec/breakouts/index.ts +1395 -69
  312. package/test/unit/spec/breakouts/utils.js +52 -1
  313. package/test/unit/spec/common/queue.js +31 -2
  314. package/test/unit/spec/controls-options-manager/index.js +163 -0
  315. package/test/unit/spec/controls-options-manager/util.js +576 -60
  316. package/test/unit/spec/fixture/locus.js +1 -0
  317. package/test/unit/spec/interpretation/collection.ts +15 -0
  318. package/test/unit/spec/interpretation/index.ts +589 -0
  319. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  320. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  321. package/test/unit/spec/locus-info/index.js +1304 -33
  322. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  323. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  324. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  325. package/test/unit/spec/locus-info/parser.js +116 -35
  326. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  327. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  328. package/test/unit/spec/media/index.ts +104 -37
  329. package/test/unit/spec/media/properties.ts +2 -2
  330. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  331. package/test/unit/spec/meeting/index.js +5216 -1956
  332. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  333. package/test/unit/spec/meeting/muteState.js +408 -208
  334. package/test/unit/spec/meeting/request.js +483 -49
  335. package/test/unit/spec/meeting/utils.js +679 -64
  336. package/test/unit/spec/meeting-info/index.js +300 -0
  337. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  338. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  339. package/test/unit/spec/meetings/collection.js +26 -0
  340. package/test/unit/spec/meetings/index.js +1011 -205
  341. package/test/unit/spec/meetings/utils.js +202 -2
  342. package/test/unit/spec/member/index.js +61 -6
  343. package/test/unit/spec/member/util.js +510 -34
  344. package/test/unit/spec/members/index.js +432 -1
  345. package/test/unit/spec/members/request.js +206 -27
  346. package/test/unit/spec/members/utils.js +210 -0
  347. package/test/unit/spec/metrics/index.js +1 -50
  348. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  349. package/test/unit/spec/multistream/receiveSlot.ts +28 -20
  350. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  351. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  352. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  353. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  354. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  355. package/test/unit/spec/reachability/index.ts +549 -9
  356. package/test/unit/spec/reachability/request.js +68 -0
  357. package/test/unit/spec/reconnection-manager/index.js +85 -9
  358. package/test/unit/spec/recording-controller/index.js +294 -218
  359. package/test/unit/spec/recording-controller/util.js +223 -96
  360. package/test/unit/spec/roap/index.ts +178 -64
  361. package/test/unit/spec/roap/request.ts +203 -85
  362. package/test/unit/spec/roap/turnDiscovery.ts +82 -36
  363. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  364. package/test/unit/spec/stats-analyzer/index.js +136 -2
  365. package/test/unit/spec/webinar/collection.ts +13 -0
  366. package/test/unit/spec/webinar/index.ts +60 -0
  367. package/test/utils/integrationTestUtils.js +46 -0
  368. package/test/utils/testUtils.js +0 -52
  369. package/dist/meeting/effectsState.js +0 -262
  370. package/dist/meeting/effectsState.js.map +0 -1
  371. package/dist/metrics/config.js +0 -299
  372. package/dist/metrics/config.js.map +0 -1
  373. package/dist/types/meeting/effectsState.d.ts +0 -42
  374. package/dist/types/metrics/config.d.ts +0 -178
  375. package/src/index.js +0 -16
  376. package/src/meeting/effectsState.ts +0 -211
  377. package/src/metrics/config.ts +0 -495
  378. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -70,10 +70,41 @@ export default class MeetingInfo {
70
70
  * @private
71
71
  * @memberof MeetingInfo
72
72
  */
73
- private requestFetchInfo(options: object) {
73
+ private requestFetchInfo(options: any) {
74
+ const {meetingId, sendCAevents} = options;
75
+ if (meetingId && sendCAevents) {
76
+ this.webex.internal.newMetrics.submitInternalEvent({
77
+ name: 'internal.client.meetinginfo.request',
78
+ });
79
+ this.webex.internal.newMetrics.submitClientEvent({
80
+ name: 'client.meetinginfo.request',
81
+ options: {
82
+ meetingId,
83
+ },
84
+ });
85
+ }
86
+
74
87
  return this.meetingInfoRequest
75
88
  .fetchMeetingInfo(options)
76
89
  .then((info) => {
90
+ if (meetingId && sendCAevents) {
91
+ this.webex.internal.newMetrics.submitInternalEvent({
92
+ name: 'internal.client.meetinginfo.response',
93
+ });
94
+ this.webex.internal.newMetrics.submitClientEvent({
95
+ name: 'client.meetinginfo.response',
96
+ payload: {
97
+ identifiers: {
98
+ meetingLookupUrl: info?.url,
99
+ },
100
+ },
101
+ options: {
102
+ meetingId,
103
+ webexConferenceIdStr: info?.body?.confIdStr || info?.body?.confID,
104
+ globalMeetingId: info?.body?.meetingId,
105
+ },
106
+ });
107
+ }
77
108
  if (info && info.body) {
78
109
  this.setMeetingInfo(info.body.sipMeetingUri || info.body.meetingLink, info.body);
79
110
  }
@@ -84,6 +115,23 @@ export default class MeetingInfo {
84
115
  LoggerProxy.logger.error(
85
116
  `Meeting-info:index#requestFetchInfo --> ${error} fetch meetingInfo`
86
117
  );
118
+ if (meetingId && sendCAevents) {
119
+ this.webex.internal.newMetrics.submitInternalEvent({
120
+ name: 'internal.client.meetinginfo.response',
121
+ });
122
+ this.webex.internal.newMetrics.submitClientEvent({
123
+ name: 'client.meetinginfo.response',
124
+ payload: {
125
+ identifiers: {
126
+ meetingLookupUrl: error?.url,
127
+ },
128
+ },
129
+ options: {
130
+ meetingId,
131
+ rawError: error,
132
+ },
133
+ });
134
+ }
87
135
 
88
136
  return Promise.reject(error);
89
137
  });
@@ -105,29 +153,54 @@ export default class MeetingInfo {
105
153
  });
106
154
  }
107
155
 
156
+ // eslint-disable-next-line valid-jsdoc
108
157
  /**
109
158
  * Fetches meeting info from the server
110
159
  * @param {String} destination one of many different types of destinations to look up info for
111
160
  * @param {String} [type] to match up with the destination value
161
+ * @param {String} [password] meeting password
162
+ * @param {Object} [captchaInfo] captcha code and id
163
+ * @param {String} [installedOrgID]
164
+ * @param {String} [locusId]
165
+ * @param {Object} [extraParams]
166
+ * @param {Boolean} [options] meeting Id and whether Call Analyzer events should be sent
112
167
  * @returns {Promise} returns a meeting info object
113
168
  * @public
114
169
  * @memberof MeetingInfo
115
170
  */
116
- public fetchMeetingInfo(destination: string, type: string = null) {
171
+ public fetchMeetingInfo(
172
+ destination: string,
173
+ type: string = null,
174
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
175
+ password: string = null,
176
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
177
+ captchaInfo: {
178
+ code: string;
179
+ id: string;
180
+ } = null,
181
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
182
+ installedOrgID = null,
183
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
184
+ locusId = null,
185
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
186
+ extraParams: object = {},
187
+ options: {meetingId?: string; sendCAevents?: boolean} = {}
188
+ ) {
117
189
  if (type === _PERSONAL_ROOM_ && !destination) {
118
190
  destination = this.webex.internal.device.userId;
119
191
  }
120
192
 
121
193
  return this.fetchInfoOptions(MeetingInfoUtil.extractDestination(destination, type), type).then(
122
- (options) =>
194
+ (infoOptions) =>
123
195
  // fetch meeting info
124
- this.requestFetchInfo(options).catch((error) => {
196
+ this.requestFetchInfo({...infoOptions, ...options}).catch((error) => {
125
197
  // if it failed the first time as meeting link
126
- if (options.type === _MEETING_LINK_) {
198
+ if (infoOptions.type === _MEETING_LINK_) {
127
199
  // convert the meeting link to sip URI and retry
128
- return this.requestFetchInfo(
129
- this.fetchInfoOptions(MeetingInfoUtil.convertLinkToSip(destination), _SIP_URI_)
130
- );
200
+ return this.requestFetchInfo({
201
+ ...this.fetchInfoOptions(MeetingInfoUtil.convertLinkToSip(destination), _SIP_URI_),
202
+ ...options,
203
+ });
131
204
  }
132
205
 
133
206
  return Promise.reject(error);
@@ -1,4 +1,10 @@
1
- import {HTTP_VERBS, _CONVERSATION_URL_, WBXAPPAPI_SERVICE} from '../constants';
1
+ import lodash from 'lodash';
2
+ import {
3
+ HTTP_VERBS,
4
+ _CONVERSATION_URL_,
5
+ WBXAPPAPI_SERVICE,
6
+ DEFAULT_MEETING_INFO_REQUEST_BODY,
7
+ } from '../constants';
2
8
  import Metrics from '../metrics';
3
9
  import BEHAVIORAL_METRICS from '../metrics/constants';
4
10
 
@@ -11,7 +17,7 @@ const CAPTCHA_ERROR_DEFAULT_MESSAGE =
11
17
  const ADHOC_MEETING_DEFAULT_ERROR =
12
18
  'Failed starting the adhoc meeting, Please contact support team ';
13
19
  const CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES = [423005, 423006];
14
-
20
+ const POLICY_ERROR_CODES = [403049, 403104, 403103, 403048, 403102, 403101];
15
21
  /**
16
22
  * Error to indicate that wbxappapi requires a password
17
23
  */
@@ -63,6 +69,30 @@ export class MeetingInfoV2AdhocMeetingError extends Error {
63
69
  }
64
70
  }
65
71
 
72
+ /**
73
+ * Error preventing join because of a meeting policy
74
+ */
75
+ export class MeetingInfoV2PolicyError extends Error {
76
+ meetingInfo: object;
77
+ sdkMessage: string;
78
+ wbxAppApiCode: number;
79
+ /**
80
+ *
81
+ * @constructor
82
+ * @param {Number} [wbxAppApiErrorCode]
83
+ * @param {Object} [meetingInfo]
84
+ * @param {String} [message]
85
+ */
86
+ constructor(wbxAppApiErrorCode?: number, meetingInfo?: object, message?: string) {
87
+ super(`${message}, code=${wbxAppApiErrorCode}`);
88
+ this.name = 'MeetingInfoV2AdhocMeetingError';
89
+ this.sdkMessage = message;
90
+ this.stack = new Error().stack;
91
+ this.wbxAppApiCode = wbxAppApiErrorCode;
92
+ this.meetingInfo = meetingInfo;
93
+ }
94
+ }
95
+
66
96
  /**
67
97
  * Error to indicate that preferred webex site not present to start adhoc meeting
68
98
  */
@@ -124,14 +154,38 @@ export default class MeetingInfoV2 {
124
154
  });
125
155
  }
126
156
 
157
+ /**
158
+ * Raises a MeetingInfoV2PolicyError for policy error codes
159
+ * @param {any} err the error from the request
160
+ * @returns {void}
161
+ */
162
+ handlePolicyError = (err) => {
163
+ if (!err.body) {
164
+ return;
165
+ }
166
+
167
+ if (POLICY_ERROR_CODES.includes(err.body?.code)) {
168
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_INFO_POLICY_ERROR, {
169
+ code: err.body?.code,
170
+ });
171
+
172
+ throw new MeetingInfoV2PolicyError(
173
+ err.body?.code,
174
+ err.body?.data?.meetingInfo,
175
+ err.body?.message
176
+ );
177
+ }
178
+ };
179
+
127
180
  /**
128
181
  * Creates adhoc space meetings for a space by fetching the conversation infomation
129
182
  * @param {String} conversationUrl conversationUrl to start adhoc meeting on
183
+ * @param {String} installedOrgID org ID of user's machine
130
184
  * @returns {Promise} returns a meeting info object
131
185
  * @public
132
186
  * @memberof MeetingInfo
133
187
  */
134
- async createAdhocSpaceMeeting(conversationUrl: string) {
188
+ async createAdhocSpaceMeeting(conversationUrl: string, installedOrgID?: string) {
135
189
  if (!this.webex.meetings.preferredWebexSite) {
136
190
  throw Error('No preferred webex site found');
137
191
  }
@@ -153,7 +207,14 @@ export default class MeetingInfoV2 {
153
207
  return this.webex.internal.conversation
154
208
  .get({url: conversationUrl}, {includeParticipants: true, disableTransform: true})
155
209
  .then((conversation) => {
156
- const body = {
210
+ const body: {
211
+ title: string;
212
+ spaceUrl: string;
213
+ keyUrl: string;
214
+ kroUrl: string;
215
+ invitees: any[];
216
+ installedOrgID?: string;
217
+ } = {
157
218
  title: conversation.displayName,
158
219
  spaceUrl: conversation.url,
159
220
  keyUrl: conversation.encryptionKeyUrl,
@@ -161,19 +222,28 @@ export default class MeetingInfoV2 {
161
222
  invitees: getInvitees(conversation.participants?.items),
162
223
  };
163
224
 
225
+ if (installedOrgID) {
226
+ body.installedOrgID = installedOrgID;
227
+ }
228
+
164
229
  const uri = this.webex.meetings.preferredWebexSite
165
230
  ? `https://${this.webex.meetings.preferredWebexSite}/wbxappapi/v2/meetings/spaceInstant`
166
231
  : '';
167
232
 
168
- Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
169
-
170
233
  return this.webex.request({
171
234
  method: HTTP_VERBS.POST,
172
235
  uri,
173
236
  body,
174
237
  });
175
238
  })
239
+ .then((requestResult) => {
240
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
241
+
242
+ return requestResult;
243
+ })
176
244
  .catch((err) => {
245
+ this.handlePolicyError(err);
246
+
177
247
  Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADHOC_MEETING_FAILURE, {
178
248
  reason: err.message,
179
249
  stack: err.stack,
@@ -190,6 +260,10 @@ export default class MeetingInfoV2 {
190
260
  * @param {Object} captchaInfo
191
261
  * @param {String} captchaInfo.code
192
262
  * @param {String} captchaInfo.id
263
+ * @param {String} installedOrgID org ID of user's machine
264
+ * @param {String} locusId
265
+ * @param {Object} extraParams
266
+ * @param {Object} options
193
267
  * @returns {Promise} returns a meeting info object
194
268
  * @public
195
269
  * @memberof MeetingInfo
@@ -201,8 +275,14 @@ export default class MeetingInfoV2 {
201
275
  captchaInfo: {
202
276
  code: string;
203
277
  id: string;
204
- } = null
278
+ } = null,
279
+ installedOrgID = null,
280
+ locusId = null,
281
+ extraParams: object = {},
282
+ options: {meetingId?: string; sendCAevents?: boolean} = {}
205
283
  ) {
284
+ const {meetingId, sendCAevents} = options;
285
+
206
286
  const destinationType = await MeetingInfoUtil.getDestinationType({
207
287
  destination,
208
288
  type,
@@ -214,12 +294,35 @@ export default class MeetingInfoV2 {
214
294
  this.webex.config.meetings.experimental.enableAdhocMeetings &&
215
295
  this.webex.meetings.preferredWebexSite
216
296
  ) {
217
- return this.createAdhocSpaceMeeting(destinationType.destination);
297
+ return this.createAdhocSpaceMeeting(destinationType.destination, installedOrgID);
218
298
  }
219
299
 
220
- const body = await MeetingInfoUtil.getRequestBody({...destinationType, password, captchaInfo});
300
+ const body = await MeetingInfoUtil.getRequestBody({
301
+ ...destinationType,
302
+ password,
303
+ captchaInfo,
304
+ installedOrgID,
305
+ locusId,
306
+ extraParams,
307
+ });
221
308
 
222
- const options: any = {
309
+ // If the body only contains the default properties, we don't have enough to
310
+ // fetch the meeting info so don't bother trying.
311
+ if (
312
+ !lodash.difference(Object.keys(body), Object.keys(DEFAULT_MEETING_INFO_REQUEST_BODY)).length
313
+ ) {
314
+ const err = new Error('Not enough information to fetch meeting info');
315
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_FAILURE, {
316
+ reason: err.message,
317
+ destinationType: destinationType?.type,
318
+ webExMeetingId: destinationType?.info?.webExMeetingId,
319
+ sipUri: destinationType?.info?.sipUri,
320
+ });
321
+
322
+ throw err;
323
+ }
324
+
325
+ const requestOptions: any = {
223
326
  method: HTTP_VERBS.POST,
224
327
  body,
225
328
  };
@@ -227,21 +330,74 @@ export default class MeetingInfoV2 {
227
330
  const directURI = await MeetingInfoUtil.getDirectMeetingInfoURI(destinationType);
228
331
 
229
332
  if (directURI) {
230
- options.uri = directURI;
333
+ requestOptions.uri = directURI;
231
334
  } else {
232
- options.service = WBXAPPAPI_SERVICE;
233
- options.resource = 'meetingInfo';
335
+ requestOptions.service = WBXAPPAPI_SERVICE;
336
+ requestOptions.resource = 'meetingInfo';
337
+ }
338
+
339
+ if (meetingId && sendCAevents) {
340
+ this.webex.internal.newMetrics.submitInternalEvent({
341
+ name: 'internal.client.meetinginfo.request',
342
+ });
343
+
344
+ this.webex.internal.newMetrics.submitClientEvent({
345
+ name: 'client.meetinginfo.request',
346
+ options: {
347
+ meetingId,
348
+ },
349
+ });
234
350
  }
235
351
 
236
352
  return this.webex
237
- .request(options)
353
+ .request(requestOptions)
238
354
  .then((response) => {
355
+ if (meetingId && sendCAevents) {
356
+ this.webex.internal.newMetrics.submitInternalEvent({
357
+ name: 'internal.client.meetinginfo.response',
358
+ });
359
+
360
+ this.webex.internal.newMetrics.submitClientEvent({
361
+ name: 'client.meetinginfo.response',
362
+ payload: {
363
+ identifiers: {
364
+ meetingLookupUrl: response?.url,
365
+ },
366
+ },
367
+ options: {
368
+ meetingId,
369
+ webexConferenceIdStr: response?.body?.confIdStr || response?.body?.confID,
370
+ globalMeetingId: response?.body?.meetingId,
371
+ },
372
+ });
373
+ }
239
374
  Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS);
240
375
 
241
376
  return response;
242
377
  })
243
378
  .catch((err) => {
379
+ if (meetingId && sendCAevents) {
380
+ this.webex.internal.newMetrics.submitInternalEvent({
381
+ name: 'internal.client.meetinginfo.response',
382
+ });
383
+
384
+ this.webex.internal.newMetrics.submitClientEvent({
385
+ name: 'client.meetinginfo.response',
386
+ payload: {
387
+ identifiers: {
388
+ meetingLookupUrl: err?.url,
389
+ },
390
+ },
391
+ options: {
392
+ meetingId,
393
+ rawError: err,
394
+ },
395
+ });
396
+ }
397
+
244
398
  if (err?.statusCode === 403) {
399
+ this.handlePolicyError(err);
400
+
245
401
  Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.VERIFY_PASSWORD_ERROR, {
246
402
  reason: err.message,
247
403
  stack: err.stack,
@@ -233,7 +233,7 @@ MeetingInfoUtil.generateOptions = async (from) => {
233
233
  }
234
234
  } else {
235
235
  throw new ParameterError(
236
- 'MeetingInfo is fetched with meeting link, sip uri, phone number, hydra room id, hydra people id, or a conversation url.'
236
+ 'MeetingInfo is fetched with the meeting link, SIP URI, phone number, Hydra people ID, or a conversation URL.'
237
237
  );
238
238
  }
239
239
 
@@ -24,11 +24,15 @@ import {
24
24
  HTTPS_PROTOCOL,
25
25
  UUID_REG,
26
26
  VALID_EMAIL_ADDRESS,
27
+ DEFAULT_MEETING_INFO_REQUEST_BODY,
27
28
  } from '../constants';
28
29
  import ParameterError from '../common/errors/parameter';
29
30
  import LoggerProxy from '../common/logs/logger-proxy';
31
+ import {SpaceIDDeprecatedError} from '../common/errors/webex-errors';
30
32
 
31
33
  const MeetingInfoUtil: any = {};
34
+ const meetingInfoError =
35
+ 'MeetingInfo is fetched with the meeting link, SIP URI, phone number, Hydra people ID, or a conversation URL.';
32
36
 
33
37
  MeetingInfoUtil.getParsedUrl = (link) => {
34
38
  try {
@@ -190,27 +194,14 @@ MeetingInfoUtil.getDestinationType = async (from) => {
190
194
  return Promise.resolve(options);
191
195
  });
192
196
  } else if (hydraId.room) {
193
- options.type = _CONVERSATION_URL_;
194
- try {
195
- await webex.internal.services.waitForCatalog('postauth');
196
-
197
- const conversationUrl = webex.internal.conversation.getUrlFromClusterId({
198
- cluster: hydraId.cluster,
199
- id: hydraId.destination,
200
- });
201
-
202
- options.destination = conversationUrl;
203
- } catch (e) {
204
- LoggerProxy.logger.error(`Meeting-info:util#getDestinationType --> ${e}`);
205
- throw e;
206
- }
207
- } else {
208
- LoggerProxy.logger.warn(
209
- "Meeting-info:util#getDestinationType --> ('MeetingInfo is fetched with meeting link, sip uri, phone number, hydra room id, hydra people id, or a conversation url."
210
- );
211
- throw new ParameterError(
212
- 'MeetingInfo is fetched with meeting link, sip uri, phone number, hydra room id, hydra people id, or a conversation url.'
197
+ LoggerProxy.logger.error(
198
+ `Meeting-info:util#getDestinationType --> Using the space ID as a destination is no longer supported. Please refer to the [migration guide](https://github.com/webex/webex-js-sdk/wiki/Migration-to-Unified-Space-Meetings) to migrate to use the meeting ID or SIP address.`
213
199
  );
200
+ // Error code 30105 added as Space ID deprecated as of beta, Please refer migration guide.
201
+ throw new SpaceIDDeprecatedError();
202
+ } else {
203
+ LoggerProxy.logger.warn(`Meeting-info:util#getDestinationType --> ${meetingInfoError}`);
204
+ throw new ParameterError(`${meetingInfoError}`);
214
205
  }
215
206
 
216
207
  return Promise.resolve(options);
@@ -220,14 +211,15 @@ MeetingInfoUtil.getDestinationType = async (from) => {
220
211
  * Helper function to build up a correct locus url depending on the value passed
221
212
  * @param {Object} options type and value to fetch meeting info
222
213
  * @param {String} options.type One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK]
214
+ * @param {String} options.installedOrgID org ID of user's machine
223
215
  * @param {Object} options.destination ?? value.value
224
216
  * @returns {Object} returns an object with {resource, method}
225
217
  */
226
218
  MeetingInfoUtil.getRequestBody = (options: {type: string; destination: object} | any) => {
227
- const {type, destination, password, captchaInfo} = options;
219
+ const {type, destination, password, captchaInfo, installedOrgID, locusId, extraParams} = options;
228
220
  const body: any = {
229
- supportHostKey: true,
230
- supportCountryList: true,
221
+ ...DEFAULT_MEETING_INFO_REQUEST_BODY,
222
+ ...extraParams,
231
223
  };
232
224
 
233
225
  switch (type) {
@@ -271,6 +263,14 @@ MeetingInfoUtil.getRequestBody = (options: {type: string; destination: object} |
271
263
  body.captchaVerifyCode = captchaInfo.code;
272
264
  }
273
265
 
266
+ if (installedOrgID) {
267
+ body.installedOrgID = installedOrgID;
268
+ }
269
+
270
+ if (locusId) {
271
+ body.locusId = locusId;
272
+ }
273
+
274
274
  return body;
275
275
  };
276
276
 
@@ -40,4 +40,37 @@ export default class MeetingCollection extends Collection {
40
40
 
41
41
  return null;
42
42
  }
43
+
44
+ /**
45
+ * get a specific meeting searching for key
46
+ * @param {String} breakoutUrl
47
+ * @returns {Meeting} if found, else returns null
48
+ * @public
49
+ * @memberof MeetingCollection
50
+ */
51
+ public getActiveBreakoutLocus(breakoutUrl: string) {
52
+ if (breakoutUrl) {
53
+ // @ts-ignore
54
+ return find(
55
+ // @ts-ignore
56
+ this.meetings,
57
+ (meeting) => meeting.breakouts?.url === breakoutUrl && meeting.breakouts?.isActiveBreakout
58
+ );
59
+ }
60
+
61
+ return null;
62
+ }
63
+
64
+ /**
65
+ * Gets the meeting that has a webrtc media connection
66
+ * NOTE: this function assumes there is no more than 1 such meeting
67
+ *
68
+ * @returns {Meeting} first meeting found, else undefined
69
+ * @public
70
+ * @memberof MeetingCollection
71
+ */
72
+ public getActiveWebrtcMeeting() {
73
+ // @ts-ignore
74
+ return find(this.meetings, (meeting) => meeting.mediaProperties.webrtcMediaConnection);
75
+ }
43
76
  }