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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. package/README.md +45 -7
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +114 -14
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +3 -2
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +3 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +179 -30
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +319 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +106 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +359 -64
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/infoUtils.js +7 -1
  53. package/dist/locus-info/infoUtils.js.map +1 -1
  54. package/dist/locus-info/mediaSharesUtils.js +43 -1
  55. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  56. package/dist/locus-info/parser.js +219 -63
  57. package/dist/locus-info/parser.js.map +1 -1
  58. package/dist/locus-info/selfUtils.js +89 -14
  59. package/dist/locus-info/selfUtils.js.map +1 -1
  60. package/dist/media/index.js +48 -135
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +29 -90
  63. package/dist/media/properties.js.map +1 -1
  64. package/dist/mediaQualityMetrics/config.js +505 -493
  65. package/dist/mediaQualityMetrics/config.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +90 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +2770 -2547
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +291 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +229 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +199 -193
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +532 -414
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +48 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +171 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/utilv2.js +20 -5
  83. package/dist/meeting-info/utilv2.js.map +1 -1
  84. package/dist/meetings/collection.js +22 -0
  85. package/dist/meetings/collection.js.map +1 -1
  86. package/dist/meetings/index.js +357 -66
  87. package/dist/meetings/index.js.map +1 -1
  88. package/dist/meetings/meetings.types.js +7 -0
  89. package/dist/meetings/meetings.types.js.map +1 -0
  90. package/dist/meetings/request.js +2 -0
  91. package/dist/meetings/request.js.map +1 -1
  92. package/dist/meetings/util.js +88 -1
  93. package/dist/meetings/util.js.map +1 -1
  94. package/dist/member/index.js +49 -0
  95. package/dist/member/index.js.map +1 -1
  96. package/dist/member/types.js +25 -0
  97. package/dist/member/types.js.map +1 -0
  98. package/dist/member/util.js +121 -25
  99. package/dist/member/util.js.map +1 -1
  100. package/dist/members/collection.js +10 -0
  101. package/dist/members/collection.js.map +1 -1
  102. package/dist/members/index.js +86 -5
  103. package/dist/members/index.js.map +1 -1
  104. package/dist/members/request.js +106 -38
  105. package/dist/members/request.js.map +1 -1
  106. package/dist/members/types.js +15 -0
  107. package/dist/members/types.js.map +1 -0
  108. package/dist/members/util.js +316 -233
  109. package/dist/members/util.js.map +1 -1
  110. package/dist/metrics/constants.js +3 -5
  111. package/dist/metrics/constants.js.map +1 -1
  112. package/dist/metrics/index.js +1 -468
  113. package/dist/metrics/index.js.map +1 -1
  114. package/dist/multistream/mediaRequestManager.js +238 -49
  115. package/dist/multistream/mediaRequestManager.js.map +1 -1
  116. package/dist/multistream/receiveSlot.js +49 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +52 -34
  119. package/dist/multistream/receiveSlotManager.js.map +1 -1
  120. package/dist/multistream/remoteMedia.js +44 -18
  121. package/dist/multistream/remoteMedia.js.map +1 -1
  122. package/dist/multistream/remoteMediaGroup.js +60 -3
  123. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  124. package/dist/multistream/remoteMediaManager.js +173 -59
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/networkQualityMonitor/index.js +4 -2
  127. package/dist/networkQualityMonitor/index.js.map +1 -1
  128. package/dist/reachability/index.js +72 -27
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +12 -5
  131. package/dist/reachability/request.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +196 -155
  133. package/dist/reconnection-manager/index.js.map +1 -1
  134. package/dist/recording-controller/index.js +21 -2
  135. package/dist/recording-controller/index.js.map +1 -1
  136. package/dist/recording-controller/util.js +9 -8
  137. package/dist/recording-controller/util.js.map +1 -1
  138. package/dist/roap/index.js +21 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +110 -89
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +93 -36
  143. package/dist/roap/turnDiscovery.js.map +1 -1
  144. package/dist/rtcMetrics/constants.js +12 -0
  145. package/dist/rtcMetrics/constants.js.map +1 -0
  146. package/dist/rtcMetrics/index.js +117 -0
  147. package/dist/rtcMetrics/index.js.map +1 -0
  148. package/dist/statsAnalyzer/global.js +1 -93
  149. package/dist/statsAnalyzer/global.js.map +1 -1
  150. package/dist/statsAnalyzer/index.js +326 -311
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/breakout.d.ts +8 -0
  158. package/dist/types/breakouts/collection.d.ts +5 -0
  159. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  160. package/dist/types/breakouts/events.d.ts +8 -0
  161. package/dist/types/breakouts/index.d.ts +5 -0
  162. package/dist/types/breakouts/request.d.ts +22 -0
  163. package/dist/types/breakouts/utils.d.ts +15 -0
  164. package/dist/types/common/browser-detection.d.ts +9 -0
  165. package/dist/types/common/collection.d.ts +48 -0
  166. package/dist/types/common/config.d.ts +2 -0
  167. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  168. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  169. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  170. package/dist/types/common/errors/media.d.ts +15 -0
  171. package/dist/types/common/errors/parameter.d.ts +15 -0
  172. package/dist/types/common/errors/password-error.d.ts +15 -0
  173. package/dist/types/common/errors/permission.d.ts +14 -0
  174. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  175. package/dist/types/common/errors/reconnection.d.ts +15 -0
  176. package/dist/types/common/errors/stats.d.ts +15 -0
  177. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  178. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  179. package/dist/types/common/events/events-scope.d.ts +17 -0
  180. package/dist/types/common/events/events.d.ts +12 -0
  181. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  182. package/dist/types/common/events/util.d.ts +2 -0
  183. package/dist/types/common/logs/logger-config.d.ts +2 -0
  184. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  185. package/dist/types/common/logs/request.d.ts +34 -0
  186. package/dist/types/common/queue.d.ts +34 -0
  187. package/dist/types/config.d.ts +72 -0
  188. package/dist/types/constants.d.ts +1020 -0
  189. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  190. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  191. package/dist/types/controls-options-manager/index.d.ts +136 -0
  192. package/dist/types/controls-options-manager/types.d.ts +43 -0
  193. package/dist/types/controls-options-manager/util.d.ts +1 -0
  194. package/dist/types/index.d.ts +7 -0
  195. package/dist/types/interpretation/collection.d.ts +5 -0
  196. package/dist/types/interpretation/index.d.ts +5 -0
  197. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  198. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  199. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  200. package/dist/types/locus-info/fullState.d.ts +2 -0
  201. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  202. package/dist/types/locus-info/index.d.ts +322 -0
  203. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  204. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  205. package/dist/types/locus-info/parser.d.ts +271 -0
  206. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  207. package/dist/types/media/index.d.ts +34 -0
  208. package/dist/types/media/properties.d.ts +93 -0
  209. package/dist/types/media/util.d.ts +2 -0
  210. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  211. package/dist/types/meeting/in-meeting-actions.d.ts +163 -0
  212. package/dist/types/meeting/index.d.ts +1482 -0
  213. package/dist/types/meeting/locusMediaRequest.d.ts +72 -0
  214. package/dist/types/meeting/muteState.d.ts +184 -0
  215. package/dist/types/meeting/request.d.ts +257 -0
  216. package/dist/types/meeting/request.type.d.ts +11 -0
  217. package/dist/types/meeting/state.d.ts +9 -0
  218. package/dist/types/meeting/util.d.ts +79 -0
  219. package/dist/types/meeting-info/collection.d.ts +20 -0
  220. package/dist/types/meeting-info/index.d.ts +62 -0
  221. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  222. package/dist/types/meeting-info/request.d.ts +22 -0
  223. package/dist/types/meeting-info/util.d.ts +2 -0
  224. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  225. package/dist/types/meetings/collection.d.ts +31 -0
  226. package/dist/types/meetings/index.d.ts +367 -0
  227. package/dist/types/meetings/meetings.types.d.ts +4 -0
  228. package/dist/types/meetings/request.d.ts +27 -0
  229. package/dist/types/meetings/util.d.ts +18 -0
  230. package/dist/types/member/index.d.ts +159 -0
  231. package/dist/types/member/types.d.ts +32 -0
  232. package/dist/types/member/util.d.ts +2 -0
  233. package/dist/types/members/collection.d.ts +29 -0
  234. package/dist/types/members/index.d.ts +353 -0
  235. package/dist/types/members/request.d.ts +114 -0
  236. package/dist/types/members/types.d.ts +24 -0
  237. package/dist/types/members/util.d.ts +210 -0
  238. package/dist/types/metrics/constants.d.ts +55 -0
  239. package/dist/types/metrics/index.d.ts +45 -0
  240. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  241. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  242. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  243. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  244. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  245. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  246. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  247. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  248. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  249. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  250. package/dist/types/reachability/index.d.ts +152 -0
  251. package/dist/types/reachability/request.d.ts +37 -0
  252. package/dist/types/reactions/constants.d.ts +3 -0
  253. package/dist/types/reactions/reactions.d.ts +4 -0
  254. package/dist/types/reactions/reactions.type.d.ts +52 -0
  255. package/dist/types/reconnection-manager/index.d.ts +126 -0
  256. package/dist/types/recording-controller/enums.d.ts +7 -0
  257. package/dist/types/recording-controller/index.d.ts +207 -0
  258. package/dist/types/recording-controller/util.d.ts +14 -0
  259. package/dist/types/roap/index.d.ts +77 -0
  260. package/dist/types/roap/request.d.ts +36 -0
  261. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  262. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  263. package/dist/types/rtcMetrics/index.d.ts +46 -0
  264. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  265. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  266. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  267. package/dist/types/transcription/index.d.ts +64 -0
  268. package/package.json +23 -20
  269. package/src/annotation/annotation.types.ts +50 -0
  270. package/src/annotation/constants.ts +36 -0
  271. package/src/annotation/index.ts +328 -0
  272. package/src/breakouts/README.md +44 -14
  273. package/src/breakouts/breakout.ts +87 -9
  274. package/src/breakouts/edit-lock-error.ts +25 -0
  275. package/src/breakouts/events.ts +56 -0
  276. package/src/breakouts/index.ts +710 -10
  277. package/src/breakouts/request.ts +55 -0
  278. package/src/breakouts/utils.ts +57 -0
  279. package/src/common/errors/webex-errors.ts +6 -2
  280. package/src/common/logs/logger-proxy.ts +1 -1
  281. package/src/common/queue.ts +22 -8
  282. package/src/config.ts +2 -7
  283. package/src/constants.ts +165 -21
  284. package/src/controls-options-manager/constants.ts +5 -0
  285. package/src/controls-options-manager/enums.ts +18 -0
  286. package/src/controls-options-manager/index.ts +278 -0
  287. package/src/controls-options-manager/types.ts +59 -0
  288. package/src/controls-options-manager/util.ts +300 -0
  289. package/src/index.ts +39 -0
  290. package/src/interpretation/README.md +60 -0
  291. package/src/interpretation/collection.ts +19 -0
  292. package/src/interpretation/index.ts +332 -0
  293. package/src/interpretation/siLanguage.ts +18 -0
  294. package/src/locus-info/controlsUtils.ts +108 -0
  295. package/src/locus-info/index.ts +383 -61
  296. package/src/locus-info/infoUtils.ts +10 -2
  297. package/src/locus-info/mediaSharesUtils.ts +48 -0
  298. package/src/locus-info/parser.ts +224 -39
  299. package/src/locus-info/selfUtils.ts +81 -5
  300. package/src/media/index.ts +87 -140
  301. package/src/media/properties.ts +49 -90
  302. package/src/mediaQualityMetrics/config.ts +379 -377
  303. package/src/meeting/in-meeting-actions.ts +179 -3
  304. package/src/meeting/index.ts +2099 -2083
  305. package/src/meeting/locusMediaRequest.ts +311 -0
  306. package/src/meeting/muteState.ts +228 -132
  307. package/src/meeting/request.ts +105 -115
  308. package/src/meeting/util.ts +511 -397
  309. package/src/meeting-info/index.ts +54 -8
  310. package/src/meeting-info/meeting-info-v2.ts +148 -14
  311. package/src/meeting-info/utilv2.ts +13 -3
  312. package/src/meetings/collection.ts +20 -0
  313. package/src/meetings/index.ts +392 -84
  314. package/src/meetings/meetings.types.ts +12 -0
  315. package/src/meetings/request.ts +2 -0
  316. package/src/meetings/util.ts +103 -4
  317. package/src/member/index.ts +49 -0
  318. package/src/member/types.ts +38 -0
  319. package/src/member/util.ts +127 -25
  320. package/src/members/collection.ts +8 -0
  321. package/src/members/index.ts +107 -6
  322. package/src/members/request.ts +97 -17
  323. package/src/members/types.ts +28 -0
  324. package/src/members/util.ts +319 -240
  325. package/src/metrics/constants.ts +2 -4
  326. package/src/metrics/index.ts +1 -490
  327. package/src/multistream/mediaRequestManager.ts +289 -79
  328. package/src/multistream/receiveSlot.ts +55 -18
  329. package/src/multistream/receiveSlotManager.ts +46 -24
  330. package/src/multistream/remoteMedia.ts +27 -2
  331. package/src/multistream/remoteMediaGroup.ts +59 -0
  332. package/src/multistream/remoteMediaManager.ts +113 -32
  333. package/src/networkQualityMonitor/index.ts +6 -6
  334. package/src/reachability/index.ts +62 -15
  335. package/src/reachability/request.ts +10 -5
  336. package/src/reconnection-manager/index.ts +68 -43
  337. package/src/recording-controller/index.ts +20 -3
  338. package/src/recording-controller/util.ts +26 -9
  339. package/src/roap/index.ts +21 -30
  340. package/src/roap/request.ts +101 -95
  341. package/src/roap/turnDiscovery.ts +47 -25
  342. package/src/rtcMetrics/constants.ts +3 -0
  343. package/src/rtcMetrics/index.ts +100 -0
  344. package/src/statsAnalyzer/global.ts +1 -94
  345. package/src/statsAnalyzer/index.ts +376 -386
  346. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  347. package/test/integration/spec/converged-space-meetings.js +233 -0
  348. package/test/integration/spec/journey.js +336 -259
  349. package/test/integration/spec/space-meeting.js +77 -4
  350. package/test/unit/spec/annotation/index.ts +418 -0
  351. package/test/unit/spec/breakouts/breakout.ts +142 -24
  352. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  353. package/test/unit/spec/breakouts/events.ts +89 -0
  354. package/test/unit/spec/breakouts/index.ts +1545 -48
  355. package/test/unit/spec/breakouts/request.ts +104 -0
  356. package/test/unit/spec/breakouts/utils.js +72 -0
  357. package/test/unit/spec/common/queue.js +31 -2
  358. package/test/unit/spec/controls-options-manager/index.js +287 -0
  359. package/test/unit/spec/controls-options-manager/util.js +582 -0
  360. package/test/unit/spec/fixture/locus.js +1 -0
  361. package/test/unit/spec/interpretation/collection.ts +15 -0
  362. package/test/unit/spec/interpretation/index.ts +589 -0
  363. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  364. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  365. package/test/unit/spec/locus-info/index.js +1169 -36
  366. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  367. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  368. package/test/unit/spec/locus-info/parser.js +62 -22
  369. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  370. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  371. package/test/unit/spec/media/index.ts +138 -28
  372. package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
  373. package/test/unit/spec/meeting/index.js +3573 -1663
  374. package/test/unit/spec/meeting/locusMediaRequest.ts +438 -0
  375. package/test/unit/spec/meeting/muteState.js +370 -208
  376. package/test/unit/spec/meeting/request.js +339 -44
  377. package/test/unit/spec/meeting/utils.js +456 -53
  378. package/test/unit/spec/meeting-info/index.js +181 -0
  379. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  380. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  381. package/test/unit/spec/meetings/collection.js +14 -0
  382. package/test/unit/spec/meetings/index.js +867 -125
  383. package/test/unit/spec/meetings/utils.js +206 -2
  384. package/test/unit/spec/member/index.js +58 -4
  385. package/test/unit/spec/member/util.js +479 -35
  386. package/test/unit/spec/members/index.js +319 -1
  387. package/test/unit/spec/members/request.js +206 -27
  388. package/test/unit/spec/members/utils.js +184 -0
  389. package/test/unit/spec/metrics/index.js +1 -50
  390. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  391. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  392. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  393. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  394. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  395. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  396. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  397. package/test/unit/spec/reachability/index.ts +125 -8
  398. package/test/unit/spec/reachability/request.js +66 -0
  399. package/test/unit/spec/reconnection-manager/index.js +59 -6
  400. package/test/unit/spec/recording-controller/index.js +294 -218
  401. package/test/unit/spec/recording-controller/util.js +223 -96
  402. package/test/unit/spec/roap/index.ts +26 -51
  403. package/test/unit/spec/roap/request.ts +196 -85
  404. package/test/unit/spec/roap/turnDiscovery.ts +30 -7
  405. package/test/unit/spec/rtcMetrics/index.ts +60 -0
  406. package/test/unit/spec/stats-analyzer/index.js +92 -41
  407. package/test/utils/constants.js +9 -0
  408. package/test/utils/integrationTestUtils.js +46 -0
  409. package/test/utils/testUtils.js +0 -45
  410. package/test/utils/webex-config.js +4 -0
  411. package/test/utils/webex-test-users.js +6 -3
  412. package/dist/meeting/effectsState.js +0 -262
  413. package/dist/meeting/effectsState.js.map +0 -1
  414. package/dist/metrics/config.js +0 -299
  415. package/dist/metrics/config.js.map +0 -1
  416. package/dist/multistream/multistreamMedia.js +0 -110
  417. package/dist/multistream/multistreamMedia.js.map +0 -1
  418. package/src/index.js +0 -16
  419. package/src/meeting/effectsState.ts +0 -211
  420. package/src/metrics/config.ts +0 -495
  421. package/src/multistream/multistreamMedia.ts +0 -97
  422. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -0,0 +1,181 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import sinon from 'sinon';
3
+ import MockWebex from '@webex/test-helper-mock-webex';
4
+ import {_MEETING_ID_} from '@webex/plugin-meetings/src/constants';
5
+
6
+ import MeetingInfo from '@webex/plugin-meetings/src/meeting-info/index';
7
+ import MeetingInfoUtil from '@webex/plugin-meetings/src/meeting-info/util';
8
+ import MeetingInfoRequest from '@webex/plugin-meetings/src/meeting-info/request';
9
+
10
+ const flushPromises = () => new Promise(setImmediate);
11
+
12
+ describe('plugin-meetings', () => {
13
+ let webex;
14
+ let meetingInfo = null;
15
+
16
+ afterEach(() => {
17
+ sinon.restore();
18
+ });
19
+
20
+ describe('Meeting Info V1', () => {
21
+ beforeEach(() => {
22
+ webex = new MockWebex({});
23
+
24
+ meetingInfo = new MeetingInfo(webex);
25
+ });
26
+
27
+ describe('#fetchMeetingInfo', () => {
28
+ it('should send ca events if meetingId present', async () => {
29
+ const body = {meetingKey: '1234323'};
30
+
31
+ sinon
32
+ .stub(MeetingInfoUtil, 'generateOptions')
33
+ .resolves({type: 'MEETING_ID', destination: '123456'});
34
+ sinon.stub(MeetingInfoRequest.prototype, 'fetchMeetingInfo').returns(Promise.resolve(body));
35
+
36
+ await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, null, null, null, {
37
+ meetingId: 'meetingId',
38
+ });
39
+
40
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
41
+
42
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
43
+ name: 'internal.client.meetinginfo.request',
44
+ });
45
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
46
+ name: 'internal.client.meetinginfo.response',
47
+ });
48
+ });
49
+
50
+ it('should not send ca events if meetingId not present', async () => {
51
+ const body = {meetingKey: '1234323'};
52
+
53
+ sinon
54
+ .stub(MeetingInfoUtil, 'generateOptions')
55
+ .resolves({type: 'MEETING_ID', destination: '123456'});
56
+ sinon.stub(MeetingInfoRequest.prototype, 'fetchMeetingInfo').returns(Promise.resolve(body));
57
+
58
+ await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, null, null, null);
59
+
60
+ assert.notCalled(webex.internal.newMetrics.submitInternalEvent);
61
+ });
62
+
63
+ it('should send ca events when fails and if meetingId present', async () => {
64
+ const reject = {
65
+ statusCode: 403,
66
+ body: {message: 'msg', code: 403102, data: {meetingInfo: {}}},
67
+ url: 'http://api-url.com',
68
+ };
69
+
70
+ sinon
71
+ .stub(MeetingInfoUtil, 'generateOptions')
72
+ .returns(Promise.resolve({type: 'MEETING_ID', destination: '123456'}));
73
+ sinon
74
+ .stub(MeetingInfoRequest.prototype, 'fetchMeetingInfo')
75
+ .returns(Promise.reject(reject));
76
+
77
+ try {
78
+ await meetingInfo.fetchMeetingInfo(
79
+ '1234323',
80
+ _MEETING_ID_,
81
+ null,
82
+ null,
83
+ null,
84
+ null,
85
+ null,
86
+ {
87
+ meetingId: 'meetingId',
88
+ }
89
+ );
90
+ } catch (err) {
91
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
92
+
93
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
94
+ name: 'internal.client.meetinginfo.request',
95
+ });
96
+
97
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
98
+ name: 'client.meetinginfo.response',
99
+ payload: {
100
+ identifiers: {
101
+ meetingLookupUrl: 'http://api-url.com',
102
+ },
103
+ },
104
+ options: {
105
+ meetingId: 'meetingId',
106
+ rawError: err,
107
+ },
108
+ });
109
+ }
110
+ });
111
+
112
+ it('should send ca events when in the retry as well if meetingId present', async () => {
113
+ const reject = {
114
+ statusCode: 403,
115
+ body: {message: 'msg', code: 403102, data: {meetingInfo: {}}},
116
+ url: 'http://api-url.com',
117
+ };
118
+
119
+ sinon
120
+ .stub(MeetingInfoUtil, 'generateOptions')
121
+ .resolves({type: 'MEETING_LINK', destination: '123456'});
122
+ const requestStub = sinon
123
+ .stub(MeetingInfoRequest.prototype, 'fetchMeetingInfo')
124
+ .rejects(reject);
125
+
126
+ try {
127
+ await meetingInfo.fetchMeetingInfo(
128
+ '1234323',
129
+ _MEETING_ID_,
130
+ null,
131
+ null,
132
+ null,
133
+ null,
134
+ null,
135
+ {
136
+ meetingId: 'meetingId',
137
+ }
138
+ );
139
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
140
+ } catch (err) {
141
+ let submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
142
+
143
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
144
+ name: 'internal.client.meetinginfo.request',
145
+ });
146
+
147
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
148
+ name: 'client.meetinginfo.response',
149
+ payload: {
150
+ identifiers: {
151
+ meetingLookupUrl: 'http://api-url.com',
152
+ },
153
+ },
154
+ options: {
155
+ meetingId: 'meetingId',
156
+ rawError: err,
157
+ },
158
+ });
159
+
160
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
161
+ name: 'internal.client.meetinginfo.response',
162
+ });
163
+
164
+ assert.deepEqual(submitInternalEventCalls[2].args[0], {
165
+ name: 'internal.client.meetinginfo.request',
166
+ });
167
+
168
+ requestStub.resolves({});
169
+
170
+ await flushPromises();
171
+
172
+ submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
173
+
174
+ assert.deepEqual(submitInternalEventCalls[3].args[0], {
175
+ name: 'internal.client.meetinginfo.response',
176
+ });
177
+ }
178
+ });
179
+ });
180
+ });
181
+ });
@@ -13,6 +13,7 @@ import {
13
13
  _CONVERSATION_URL_,
14
14
  _SIP_URI_,
15
15
  WBXAPPAPI_SERVICE,
16
+ _LOCUS_ID_,
16
17
  } from '@webex/plugin-meetings/src/constants';
17
18
 
18
19
  import Meetings from '@webex/plugin-meetings/src/meetings';
@@ -20,10 +21,12 @@ import MeetingInfo, {
20
21
  MeetingInfoV2PasswordError,
21
22
  MeetingInfoV2CaptchaError,
22
23
  MeetingInfoV2AdhocMeetingError,
24
+ MeetingInfoV2PolicyError,
23
25
  } from '@webex/plugin-meetings/src/meeting-info/meeting-info-v2';
24
26
  import MeetingInfoUtil from '@webex/plugin-meetings/src/meeting-info/utilv2';
25
27
  import Metrics from '@webex/plugin-meetings/src/metrics';
26
28
  import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
29
+ import {forEach} from 'lodash';
27
30
 
28
31
  describe('plugin-meetings', () => {
29
32
  const conversation = {
@@ -120,7 +123,7 @@ describe('plugin-meetings', () => {
120
123
  MeetingInfoUtil.getRequestBody.restore();
121
124
  });
122
125
 
123
- it('should fetch meeting info for the personal meeting room type', async () => {
126
+ it('should fetch meeting info for the personal meeting room type', async () => {
124
127
  const body = {meetingKey: '1234323'};
125
128
  const requestResponse = {statusCode: 200, body};
126
129
 
@@ -211,6 +214,87 @@ describe('plugin-meetings', () => {
211
214
  );
212
215
  });
213
216
 
217
+ it('should fetch meeting info with provided installedOrgID', async () => {
218
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
219
+ const installedOrgID = '123456';
220
+
221
+ webex.request.resolves(requestResponse);
222
+
223
+ const result = await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, installedOrgID);
224
+
225
+ assert.calledWith(webex.request, {
226
+ method: 'POST',
227
+ service: WBXAPPAPI_SERVICE,
228
+ resource: 'meetingInfo',
229
+ body: {
230
+ supportHostKey: true,
231
+ supportCountryList: true,
232
+ meetingKey: '1234323',
233
+ installedOrgID,
234
+ },
235
+ });
236
+ assert.deepEqual(result, requestResponse);
237
+ assert(Metrics.sendBehavioralMetric.calledOnce);
238
+ assert.calledWith(
239
+ Metrics.sendBehavioralMetric,
240
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
241
+ );
242
+ });
243
+
244
+ it('should fetch meeting info with provided locusId', async () => {
245
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
246
+ const locusId = 'eccd5c1b-d42d-35e3-a1b9-3021030a6d84';
247
+
248
+ webex.request.resolves(requestResponse);
249
+
250
+ const result = await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, null, locusId);
251
+
252
+ assert.calledWith(webex.request, {
253
+ method: 'POST',
254
+ service: WBXAPPAPI_SERVICE,
255
+ resource: 'meetingInfo',
256
+ body: {
257
+ supportHostKey: true,
258
+ supportCountryList: true,
259
+ meetingKey: '1234323',
260
+ locusId,
261
+ },
262
+ });
263
+ assert.deepEqual(result, requestResponse);
264
+ assert(Metrics.sendBehavioralMetric.calledOnce);
265
+ assert.calledWith(
266
+ Metrics.sendBehavioralMetric,
267
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
268
+ );
269
+ });
270
+
271
+ it('should fetch meeting info with provided extraParams', async () => {
272
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
273
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
274
+
275
+ webex.request.resolves(requestResponse);
276
+
277
+ const result = await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, null, null, extraParams);
278
+
279
+ assert.calledWith(webex.request, {
280
+ method: 'POST',
281
+ service: WBXAPPAPI_SERVICE,
282
+ resource: 'meetingInfo',
283
+ body: {
284
+ supportHostKey: true,
285
+ supportCountryList: true,
286
+ meetingKey: '1234323',
287
+ ...extraParams,
288
+ },
289
+ });
290
+ assert.deepEqual(result, requestResponse);
291
+ assert(Metrics.sendBehavioralMetric.calledOnce);
292
+ assert.calledWith(
293
+ Metrics.sendBehavioralMetric,
294
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
295
+ );
296
+ });
297
+
214
298
  it('create adhoc meeting when conversationUrl passed with enableAdhocMeetings toggle', async () => {
215
299
  sinon.stub(meetingInfo, 'createAdhocSpaceMeeting').returns(Promise.resolve());
216
300
  await meetingInfo.fetchMeetingInfo('conversationUrl', _CONVERSATION_URL_);
@@ -220,6 +304,29 @@ describe('plugin-meetings', () => {
220
304
  meetingInfo.createAdhocSpaceMeeting.restore();
221
305
  });
222
306
 
307
+ it('create adhoc meeting when conversationUrl and installedOrgID passed with enableAdhocMeetings toggle', async () => {
308
+ sinon.stub(meetingInfo, 'createAdhocSpaceMeeting').returns(Promise.resolve());
309
+
310
+ const installedOrgID = '12345'
311
+
312
+ await meetingInfo.fetchMeetingInfo(
313
+ 'conversationUrl',
314
+ _CONVERSATION_URL_,
315
+ null,
316
+ null,
317
+ installedOrgID
318
+ );
319
+
320
+ assert.calledOnceWithExactly(
321
+ meetingInfo.createAdhocSpaceMeeting,
322
+ 'conversationUrl',
323
+ installedOrgID
324
+ );
325
+ assert.notCalled(webex.request);
326
+ meetingInfo.createAdhocSpaceMeeting.restore();
327
+ });
328
+
329
+
223
330
  it('should not call createAdhocSpaceMeeting if enableAdhocMeetings toggle is off', async () => {
224
331
  webex.config.meetings.experimental.enableAdhocMeetings = false;
225
332
  sinon.stub(meetingInfo, 'createAdhocSpaceMeeting').returns(Promise.resolve());
@@ -245,7 +352,7 @@ describe('plugin-meetings', () => {
245
352
  it('should throw an error MeetingInfoV2AdhocMeetingError if not able to start adhoc meeting for a conversation', async () => {
246
353
  webex.config.meetings.experimental.enableAdhocMeetings = true;
247
354
 
248
- webex.request = sinon.stub().rejects({statusCode: 403, body: {code: 400000}});
355
+ webex.request = sinon.stub().rejects({stack: 'a stack', message: 'a message', statusCode: 403, body: {code: 400000}});
249
356
  try {
250
357
  await meetingInfo.createAdhocSpaceMeeting('conversationUrl');
251
358
  } catch (err) {
@@ -255,6 +362,160 @@ describe('plugin-meetings', () => {
255
362
  'Failed starting the adhoc meeting, Please contact support team , code=400000'
256
363
  );
257
364
  assert.equal(err.wbxAppApiCode, 400000);
365
+ assert(Metrics.sendBehavioralMetric.calledOnce);
366
+ assert.calledWith(
367
+ Metrics.sendBehavioralMetric,
368
+ BEHAVIORAL_METRICS.ADHOC_MEETING_FAILURE,
369
+ {reason: 'a message', stack: 'a stack'}
370
+ );
371
+ }
372
+ });
373
+
374
+ forEach(
375
+ [
376
+ {errorCode: 403049},
377
+ {errorCode: 403104},
378
+ {errorCode: 403103},
379
+ {errorCode: 403048},
380
+ {errorCode: 403102},
381
+ {errorCode: 403101},
382
+ ],
383
+ ({errorCode}) => {
384
+ it(`should throw a MeetingInfoV2PolicyError for error code ${errorCode}`, async () => {
385
+ const message = 'a message';
386
+ const meetingInfoData = 'meeting info';
387
+
388
+ webex.request = sinon.stub().rejects({
389
+ statusCode: 403,
390
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
391
+ url: 'http://api-url.com',
392
+ });
393
+ try {
394
+ await meetingInfo.fetchMeetingInfo(
395
+ '1234323',
396
+ _MEETING_ID_,
397
+ 'abc',
398
+ {
399
+ id: '999',
400
+ code: 'aabbcc11',
401
+ },
402
+ null,
403
+ null,
404
+ {},
405
+ {meetingId: 'meeting-id'}
406
+ );
407
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
408
+ } catch (err) {
409
+ assert(webex.internal.newMetrics.submitClientEvent.calledOnce);
410
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
411
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
412
+ name: 'internal.client.meetinginfo.request',
413
+ });
414
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
415
+ name: 'internal.client.meetinginfo.response',
416
+ });
417
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
418
+ name: 'client.meetinginfo.response',
419
+ payload: {
420
+ identifiers: {
421
+ meetingLookupUrl: 'http://api-url.com',
422
+ },
423
+ },
424
+ options: {
425
+ meetingId: 'meeting-id',
426
+ rawError: {
427
+ statusCode: 403,
428
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
429
+ url: 'http://api-url.com',
430
+ },
431
+ },
432
+ });
433
+
434
+ assert.instanceOf(err, MeetingInfoV2PolicyError);
435
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
436
+ assert.equal(err.wbxAppApiCode, errorCode);
437
+ assert.deepEqual(err.meetingInfo, meetingInfoData);
438
+ assert(Metrics.sendBehavioralMetric.calledOnce);
439
+ assert.calledWith(
440
+ Metrics.sendBehavioralMetric,
441
+ BEHAVIORAL_METRICS.MEETING_INFO_POLICY_ERROR,
442
+ {code: errorCode}
443
+ );
444
+ }
445
+ });
446
+ }
447
+ );
448
+
449
+ it('should send internal CA metric if meetingId is provided', async () => {
450
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
451
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
452
+
453
+ webex.request.resolves(requestResponse);
454
+
455
+ const result = await meetingInfo.fetchMeetingInfo(
456
+ '1234323',
457
+ _MEETING_ID_,
458
+ null,
459
+ null,
460
+ null,
461
+ null,
462
+ extraParams,
463
+ {meetingId: 'meetingId'}
464
+ );
465
+
466
+ assert.calledWith(webex.request, {
467
+ method: 'POST',
468
+ service: WBXAPPAPI_SERVICE,
469
+ resource: 'meetingInfo',
470
+ body: {
471
+ supportHostKey: true,
472
+ supportCountryList: true,
473
+ meetingKey: '1234323',
474
+ ...extraParams,
475
+ },
476
+ });
477
+ assert.deepEqual(result, requestResponse);
478
+ assert(Metrics.sendBehavioralMetric.calledOnce);
479
+ assert.calledWith(
480
+ Metrics.sendBehavioralMetric,
481
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
482
+ );
483
+
484
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
485
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
486
+ name: 'internal.client.meetinginfo.request',
487
+ });
488
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
489
+ name: 'internal.client.meetinginfo.response',
490
+ });
491
+ });
492
+
493
+ it('should not send CA metric if meetingId is not provided', async () => {
494
+ const message = 'a message';
495
+ const meetingInfoData = 'meeting info';
496
+
497
+ webex.request = sinon.stub().rejects({
498
+ statusCode: 403,
499
+ body: {message, code: 403102, data: {meetingInfo: meetingInfoData}},
500
+ url: 'http://api-url.com',
501
+ });
502
+ try {
503
+ await meetingInfo.fetchMeetingInfo(
504
+ '1234323',
505
+ _MEETING_ID_,
506
+ 'abc',
507
+ {
508
+ id: '999',
509
+ code: 'aabbcc11',
510
+ },
511
+ null,
512
+ null,
513
+ undefined
514
+ );
515
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
516
+ } catch (err) {
517
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
518
+ assert.notCalled(webex.internal.newMetrics.submitInternalEvent);
258
519
  }
259
520
  });
260
521
 
@@ -328,11 +589,51 @@ describe('plugin-meetings', () => {
328
589
  await runTest(423001, false);
329
590
  });
330
591
  });
592
+
593
+ it('should throw an error and not fetch with an "empty" body', async () => {
594
+ const body = {supportHostKey: 'foo', supportCountryList: 'bar'};
595
+ const requestResponse = {statusCode: 200, body};
596
+
597
+ sinon
598
+ .stub(MeetingInfoUtil, 'getDestinationType')
599
+ .returns(Promise.resolve({type: _LOCUS_ID_, destination: '123456'}));
600
+ sinon.stub(MeetingInfoUtil, 'getRequestBody').returns(Promise.resolve(body));
601
+ webex.request.resolves(requestResponse);
602
+
603
+ try {
604
+ await meetingInfo.fetchMeetingInfo({
605
+ type: _LOCUS_ID_,
606
+ });
607
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
608
+ } catch (err) {
609
+ assert.calledWith(
610
+ Metrics.sendBehavioralMetric,
611
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_FAILURE,
612
+ {
613
+ reason: 'Not enough information to fetch meeting info',
614
+ destinationType: _LOCUS_ID_,
615
+ webExMeetingId: undefined,
616
+ sipUri: undefined,
617
+ }
618
+ );
619
+ assert(Metrics.sendBehavioralMetric.calledOnce);
620
+ assert.calledWith(
621
+ Metrics.sendBehavioralMetric,
622
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_FAILURE
623
+ );
624
+ assert.deepEqual(err.message, 'Not enough information to fetch meeting info');
625
+ }
626
+
627
+ MeetingInfoUtil.getDestinationType.restore();
628
+ MeetingInfoUtil.getRequestBody.restore();
629
+ });
331
630
  });
332
631
 
333
632
  describe('createAdhocSpaceMeeting', () => {
334
- it('Make a request to /instantSpace when conversationUrl', async () => {
335
- const conversationUrl = 'https://conversationUrl/xxx';
633
+ const conversationUrl = 'https://conversationUrl/xxx';
634
+ const installedOrgID = '12345';
635
+
636
+ const setup = () => {
336
637
  const invitee = [];
337
638
 
338
639
  invitee.push({
@@ -345,7 +646,43 @@ describe('plugin-meetings', () => {
345
646
  ciUserUuid: conversation.participants.items[1].entryUUID,
346
647
  });
347
648
 
348
- await meetingInfo.createAdhocSpaceMeeting(conversationUrl);
649
+ return {invitee}
650
+ }
651
+
652
+ it('Make a request to /spaceInstant when conversationUrl', async () => {
653
+ const {invitee} = setup();
654
+
655
+ const result = await meetingInfo.createAdhocSpaceMeeting(conversationUrl);
656
+
657
+ assert.calledWith(
658
+ webex.internal.conversation.get,
659
+ {url: conversationUrl},
660
+ {includeParticipants: true, disableTransform: true}
661
+ );
662
+
663
+ assert.calledWith(webex.request, {
664
+ method: 'POST',
665
+ uri: 'https://go.webex.com/wbxappapi/v2/meetings/spaceInstant',
666
+ body: {
667
+ title: conversation.displayName,
668
+ spaceUrl: conversation.url,
669
+ keyUrl: conversation.encryptionKeyUrl,
670
+ kroUrl: conversation.kmsResourceObjectUrl,
671
+ invitees: invitee,
672
+ },
673
+ });
674
+ assert(Metrics.sendBehavioralMetric.calledOnce);
675
+ assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
676
+ assert.deepEqual(result, {
677
+ body: {},
678
+ statusCode: 200
679
+ });
680
+ });
681
+
682
+ it('Make a request to /spaceInstant when conversationUrl with installed org ID', async () => {
683
+ const {invitee} = setup();
684
+
685
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
349
686
 
350
687
  assert.calledWith(
351
688
  webex.internal.conversation.get,
@@ -362,11 +699,52 @@ describe('plugin-meetings', () => {
362
699
  keyUrl: conversation.encryptionKeyUrl,
363
700
  kroUrl: conversation.kmsResourceObjectUrl,
364
701
  invitees: invitee,
702
+ installedOrgID,
365
703
  },
366
704
  });
367
705
  assert(Metrics.sendBehavioralMetric.calledOnce);
368
706
  assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
369
707
  });
708
+
709
+
710
+ forEach(
711
+ [
712
+ {errorCode: 403049},
713
+ {errorCode: 403104},
714
+ {errorCode: 403103},
715
+ {errorCode: 403048},
716
+ {errorCode: 403102},
717
+ {errorCode: 403101},
718
+ ],
719
+ ({errorCode}) => {
720
+ it(`should throw a MeetingInfoV2PolicyError for error code ${errorCode}`, async () => {
721
+ const message = 'a message';
722
+ const meetingInfoData = 'meeting info';
723
+
724
+ webex.request = sinon.stub().rejects({
725
+ statusCode: 403,
726
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
727
+ });
728
+ try {
729
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
730
+ assert.fail('createAdhocSpaceMeeting should have thrown, but has not done that');
731
+ } catch (err) {
732
+ assert.instanceOf(err, MeetingInfoV2PolicyError);
733
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
734
+ assert.equal(err.wbxAppApiCode, errorCode);
735
+ assert.deepEqual(err.meetingInfo, meetingInfoData);
736
+
737
+ assert(Metrics.sendBehavioralMetric.calledOnce);
738
+ assert.calledWith(
739
+ Metrics.sendBehavioralMetric,
740
+ BEHAVIORAL_METRICS.MEETING_INFO_POLICY_ERROR,
741
+ {code: errorCode}
742
+ );
743
+
744
+ }
745
+ });
746
+ }
747
+ );
370
748
  });
371
749
  });
372
750
  });
@@ -150,6 +150,7 @@ describe('plugin-meetings', () => {
150
150
  });
151
151
 
152
152
  describe('#getRequestBody', () => {
153
+
153
154
  it('for _PERSONAL_ROOM_', () => {
154
155
  const res = MeetingInfoUtil.getRequestBody({
155
156
  type: _PERSONAL_ROOM_,
@@ -219,6 +220,26 @@ describe('plugin-meetings', () => {
219
220
  'https://conv-a.wbx2.com/conversation/api/v1/conversations/bfb49280'
220
221
  );
221
222
  });
223
+
224
+ it('allows for extra params to be provided', () => {
225
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
226
+
227
+ const res = MeetingInfoUtil.getRequestBody({
228
+ type: _CONVERSATION_URL_,
229
+ destination: 'https://conv-a.wbx2.com/conversation/api/v1/conversations/bfb49281',
230
+ extraParams,
231
+ });
232
+
233
+ assert.deepEqual(
234
+ res,
235
+ {
236
+ conversationUrl: 'https://conv-a.wbx2.com/conversation/api/v1/conversations/bfb49281',
237
+ supportHostKey: true,
238
+ supportCountryList: true,
239
+ ...extraParams,
240
+ }
241
+ );
242
+ });
222
243
  });
223
244
 
224
245
  describe('#getWebexSite', () => {
@@ -48,5 +48,19 @@ describe('plugin-meetings', () => {
48
48
  assert.deepEqual(meetingCollection.getByKey('value', 'test'), {value: 'test', id: uuid1});
49
49
  });
50
50
  });
51
+
52
+ describe('#getActiveBreakoutLocus', () => {
53
+ beforeEach(() => {
54
+ meetingCollection.meetings.test = {breakouts: {url: 'url', isActiveBreakout: true}, id: uuid1};
55
+ });
56
+ it('return null if empty breakoutUrl', () => {
57
+ assert.deepEqual(meetingCollection.getActiveBreakoutLocus(), null);
58
+ });
59
+
60
+ it('should get the meeting which joined breakout by breakoutUrl', () => {
61
+ assert.deepEqual(meetingCollection.getActiveBreakoutLocus('url'), {
62
+ breakouts: {url: 'url', isActiveBreakout: true}, id: uuid1});
63
+ });
64
+ });
51
65
  });
52
66
  });