@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
@@ -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,13 @@ 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';
30
+ import { request } from 'express';
27
31
 
28
32
  describe('plugin-meetings', () => {
29
33
  const conversation = {
@@ -120,7 +124,7 @@ describe('plugin-meetings', () => {
120
124
  MeetingInfoUtil.getRequestBody.restore();
121
125
  });
122
126
 
123
- it('should fetch meeting info for the personal meeting room type', async () => {
127
+ it('should fetch meeting info for the personal meeting room type', async () => {
124
128
  const body = {meetingKey: '1234323'};
125
129
  const requestResponse = {statusCode: 200, body};
126
130
 
@@ -211,6 +215,87 @@ describe('plugin-meetings', () => {
211
215
  );
212
216
  });
213
217
 
218
+ it('should fetch meeting info with provided installedOrgID', async () => {
219
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
220
+ const installedOrgID = '123456';
221
+
222
+ webex.request.resolves(requestResponse);
223
+
224
+ const result = await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, installedOrgID);
225
+
226
+ assert.calledWith(webex.request, {
227
+ method: 'POST',
228
+ service: WBXAPPAPI_SERVICE,
229
+ resource: 'meetingInfo',
230
+ body: {
231
+ supportHostKey: true,
232
+ supportCountryList: true,
233
+ meetingKey: '1234323',
234
+ installedOrgID,
235
+ },
236
+ });
237
+ assert.deepEqual(result, requestResponse);
238
+ assert(Metrics.sendBehavioralMetric.calledOnce);
239
+ assert.calledWith(
240
+ Metrics.sendBehavioralMetric,
241
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
242
+ );
243
+ });
244
+
245
+ it('should fetch meeting info with provided locusId', async () => {
246
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
247
+ const locusId = 'eccd5c1b-d42d-35e3-a1b9-3021030a6d84';
248
+
249
+ webex.request.resolves(requestResponse);
250
+
251
+ const result = await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, null, locusId);
252
+
253
+ assert.calledWith(webex.request, {
254
+ method: 'POST',
255
+ service: WBXAPPAPI_SERVICE,
256
+ resource: 'meetingInfo',
257
+ body: {
258
+ supportHostKey: true,
259
+ supportCountryList: true,
260
+ meetingKey: '1234323',
261
+ locusId,
262
+ },
263
+ });
264
+ assert.deepEqual(result, requestResponse);
265
+ assert(Metrics.sendBehavioralMetric.calledOnce);
266
+ assert.calledWith(
267
+ Metrics.sendBehavioralMetric,
268
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
269
+ );
270
+ });
271
+
272
+ it('should fetch meeting info with provided extraParams', async () => {
273
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
274
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
275
+
276
+ webex.request.resolves(requestResponse);
277
+
278
+ const result = await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, null, null, extraParams);
279
+
280
+ assert.calledWith(webex.request, {
281
+ method: 'POST',
282
+ service: WBXAPPAPI_SERVICE,
283
+ resource: 'meetingInfo',
284
+ body: {
285
+ supportHostKey: true,
286
+ supportCountryList: true,
287
+ meetingKey: '1234323',
288
+ ...extraParams,
289
+ },
290
+ });
291
+ assert.deepEqual(result, requestResponse);
292
+ assert(Metrics.sendBehavioralMetric.calledOnce);
293
+ assert.calledWith(
294
+ Metrics.sendBehavioralMetric,
295
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
296
+ );
297
+ });
298
+
214
299
  it('create adhoc meeting when conversationUrl passed with enableAdhocMeetings toggle', async () => {
215
300
  sinon.stub(meetingInfo, 'createAdhocSpaceMeeting').returns(Promise.resolve());
216
301
  await meetingInfo.fetchMeetingInfo('conversationUrl', _CONVERSATION_URL_);
@@ -220,6 +305,29 @@ describe('plugin-meetings', () => {
220
305
  meetingInfo.createAdhocSpaceMeeting.restore();
221
306
  });
222
307
 
308
+ it('create adhoc meeting when conversationUrl and installedOrgID passed with enableAdhocMeetings toggle', async () => {
309
+ sinon.stub(meetingInfo, 'createAdhocSpaceMeeting').returns(Promise.resolve());
310
+
311
+ const installedOrgID = '12345'
312
+
313
+ await meetingInfo.fetchMeetingInfo(
314
+ 'conversationUrl',
315
+ _CONVERSATION_URL_,
316
+ null,
317
+ null,
318
+ installedOrgID
319
+ );
320
+
321
+ assert.calledOnceWithExactly(
322
+ meetingInfo.createAdhocSpaceMeeting,
323
+ 'conversationUrl',
324
+ installedOrgID
325
+ );
326
+ assert.notCalled(webex.request);
327
+ meetingInfo.createAdhocSpaceMeeting.restore();
328
+ });
329
+
330
+
223
331
  it('should not call createAdhocSpaceMeeting if enableAdhocMeetings toggle is off', async () => {
224
332
  webex.config.meetings.experimental.enableAdhocMeetings = false;
225
333
  sinon.stub(meetingInfo, 'createAdhocSpaceMeeting').returns(Promise.resolve());
@@ -245,7 +353,7 @@ describe('plugin-meetings', () => {
245
353
  it('should throw an error MeetingInfoV2AdhocMeetingError if not able to start adhoc meeting for a conversation', async () => {
246
354
  webex.config.meetings.experimental.enableAdhocMeetings = true;
247
355
 
248
- webex.request = sinon.stub().rejects({statusCode: 403, body: {code: 400000}});
356
+ webex.request = sinon.stub().rejects({stack: 'a stack', message: 'a message', statusCode: 403, body: {code: 400000}});
249
357
  try {
250
358
  await meetingInfo.createAdhocSpaceMeeting('conversationUrl');
251
359
  } catch (err) {
@@ -255,9 +363,305 @@ describe('plugin-meetings', () => {
255
363
  'Failed starting the adhoc meeting, Please contact support team , code=400000'
256
364
  );
257
365
  assert.equal(err.wbxAppApiCode, 400000);
366
+ assert(Metrics.sendBehavioralMetric.calledOnce);
367
+ assert.calledWith(
368
+ Metrics.sendBehavioralMetric,
369
+ BEHAVIORAL_METRICS.ADHOC_MEETING_FAILURE,
370
+ {reason: 'a message', stack: 'a stack'}
371
+ );
258
372
  }
259
373
  });
260
374
 
375
+ forEach(
376
+ [
377
+ {errorCode: 403049, sendCAevents: false},
378
+ {errorCode: 403049, sendCAevents: true},
379
+ {errorCode: 403049},
380
+ {errorCode: 403104, sendCAevents: false},
381
+ {errorCode: 403104, sendCAevents: true},
382
+ {errorCode: 403104},
383
+ {errorCode: 403103, sendCAevents: false},
384
+ {errorCode: 403103, sendCAevents: true},
385
+ {errorCode: 403103},
386
+ {errorCode: 403048, sendCAevents: false},
387
+ {errorCode: 403048, sendCAevents: true},
388
+ {errorCode: 403048},
389
+ {errorCode: 403102, sendCAevents: false},
390
+ {errorCode: 403102, sendCAevents: true},
391
+ {errorCode: 403102},
392
+ {errorCode: 403101, sendCAevents: false},
393
+ {errorCode: 403101, sendCAevents: true},
394
+ {errorCode: 403101},
395
+ ],
396
+ ({errorCode, sendCAevents}) => {
397
+ it(`should throw a MeetingInfoV2PolicyError for error code ${errorCode}`, async () => {
398
+ const message = 'a message';
399
+ const meetingInfoData = 'meeting info';
400
+
401
+ webex.request = sinon.stub().rejects({
402
+ statusCode: 403,
403
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
404
+ url: 'http://api-url.com',
405
+ });
406
+ try {
407
+ await meetingInfo.fetchMeetingInfo(
408
+ '1234323',
409
+ _MEETING_ID_,
410
+ 'abc',
411
+ {
412
+ id: '999',
413
+ code: 'aabbcc11',
414
+ },
415
+ null,
416
+ null,
417
+ {},
418
+ {meetingId: 'meeting-id', sendCAevents}
419
+ );
420
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
421
+ } catch (err) {
422
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
423
+ const submitClientEventCalls = webex.internal.newMetrics.submitClientEvent.getCalls();
424
+
425
+ if (sendCAevents) {
426
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
427
+ name: 'internal.client.meetinginfo.request',
428
+ });
429
+
430
+ assert.deepEqual(submitClientEventCalls[0].args[0], {
431
+ name: 'client.meetinginfo.request',
432
+ options: {
433
+ meetingId: 'meeting-id'
434
+ },
435
+ });
436
+
437
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
438
+ name: 'internal.client.meetinginfo.response',
439
+ });
440
+
441
+ assert.deepEqual(submitClientEventCalls[1].args[0], {
442
+ name: 'client.meetinginfo.response',
443
+ payload: {
444
+ identifiers: {
445
+ meetingLookupUrl: 'http://api-url.com',
446
+ },
447
+ },
448
+ options: {
449
+ meetingId: 'meeting-id',
450
+ rawError: {
451
+ statusCode: 403,
452
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
453
+ url: 'http://api-url.com',
454
+ },
455
+ },
456
+ });
457
+ } else {
458
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
459
+ }
460
+
461
+ assert.instanceOf(err, MeetingInfoV2PolicyError);
462
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
463
+ assert.equal(err.wbxAppApiCode, errorCode);
464
+ assert.deepEqual(err.meetingInfo, meetingInfoData);
465
+ assert(Metrics.sendBehavioralMetric.calledOnce);
466
+ assert.calledWith(
467
+ Metrics.sendBehavioralMetric,
468
+ BEHAVIORAL_METRICS.MEETING_INFO_POLICY_ERROR,
469
+ {code: errorCode}
470
+ );
471
+ }
472
+ });
473
+ }
474
+ );
475
+
476
+ forEach(
477
+ [
478
+ {meetingId: '123', sendCAevents: true, shouldSendCAevents: true},
479
+ {sendCAevents: true, shouldSendCAevents: false},
480
+ {meetingId: '123', sendCAevents: false, shouldSendCAevents: false},
481
+ {shouldSendCAevents: false},
482
+ {meetingId: '123', sendCAevents: true, shouldSendCAevents: true, confIdStr: '999'},
483
+ ],
484
+ ({meetingId, sendCAevents, shouldSendCAevents, confIdStr}) => {
485
+ it('should send CA metric if meetingId is provided and send CA events is authorized', async () => {
486
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323', meetingId: '123', confID: '321'}};
487
+ if (confIdStr) {
488
+ requestResponse.body.confIdStr = confIdStr;
489
+ }
490
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
491
+
492
+ webex.request.resolves(requestResponse);
493
+
494
+ const result = await meetingInfo.fetchMeetingInfo(
495
+ '1234323',
496
+ _MEETING_ID_,
497
+ null,
498
+ null,
499
+ null,
500
+ null,
501
+ extraParams,
502
+ {meetingId, sendCAevents}
503
+ );
504
+
505
+ assert.calledWith(webex.request, {
506
+ method: 'POST',
507
+ service: WBXAPPAPI_SERVICE,
508
+ resource: 'meetingInfo',
509
+ body: {
510
+ supportHostKey: true,
511
+ supportCountryList: true,
512
+ meetingKey: '1234323',
513
+ ...extraParams,
514
+ },
515
+ });
516
+ assert.deepEqual(result, requestResponse);
517
+ assert(Metrics.sendBehavioralMetric.calledOnce);
518
+ assert.calledWith(
519
+ Metrics.sendBehavioralMetric,
520
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
521
+ );
522
+
523
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
524
+ const submitClientEventCalls = webex.internal.newMetrics.submitClientEvent.getCalls();
525
+
526
+ if(shouldSendCAevents) {
527
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
528
+ name: 'internal.client.meetinginfo.request',
529
+ });
530
+ assert.deepEqual(submitClientEventCalls[0].args[0], {
531
+ name: 'client.meetinginfo.request',
532
+ options: {
533
+ meetingId,
534
+ }
535
+ });
536
+
537
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
538
+ name: 'internal.client.meetinginfo.response',
539
+ });
540
+ assert.deepEqual(submitClientEventCalls[1].args[0], {
541
+ name: 'client.meetinginfo.response',
542
+ payload: {
543
+ identifiers: {
544
+ meetingLookupUrl: result?.url,
545
+ },
546
+ },
547
+ options: {
548
+ meetingId,
549
+ globalMeetingId: requestResponse.body?.meetingId,
550
+ webexConferenceIdStr: confIdStr ? requestResponse.body?.confIdStr : requestResponse.body?.confID,
551
+ }
552
+ });
553
+ } else {
554
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
555
+ assert.notCalled(webex.internal.newMetrics.submitInternalEvent);
556
+ }
557
+ })
558
+ }
559
+ )
560
+
561
+ it('should send CA metric if meetingId is provided and send CA events is authorized', async () => {
562
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323', confID: '123', meetingId: '321'}};
563
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
564
+
565
+ webex.request.resolves(requestResponse);
566
+
567
+ const result = await meetingInfo.fetchMeetingInfo(
568
+ '1234323',
569
+ _MEETING_ID_,
570
+ null,
571
+ null,
572
+ null,
573
+ null,
574
+ extraParams,
575
+ {meetingId: 'meetingId', sendCAevents: true}
576
+ );
577
+
578
+ assert.calledWith(webex.request, {
579
+ method: 'POST',
580
+ service: WBXAPPAPI_SERVICE,
581
+ resource: 'meetingInfo',
582
+ body: {
583
+ supportHostKey: true,
584
+ supportCountryList: true,
585
+ meetingKey: '1234323',
586
+ ...extraParams,
587
+ },
588
+ });
589
+ assert.deepEqual(result, requestResponse);
590
+ assert(Metrics.sendBehavioralMetric.calledOnce);
591
+ assert.calledWith(
592
+ Metrics.sendBehavioralMetric,
593
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
594
+ );
595
+
596
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
597
+ const submitClientEventCalls = webex.internal.newMetrics.submitClientEvent.getCalls();
598
+
599
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
600
+ name: 'internal.client.meetinginfo.request',
601
+ });
602
+ assert.deepEqual(submitClientEventCalls[0].args[0], {
603
+ name: 'client.meetinginfo.request',
604
+ options: {
605
+ meetingId: 'meetingId',
606
+ }
607
+ });
608
+
609
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
610
+ name: 'internal.client.meetinginfo.response',
611
+ });
612
+ assert.deepEqual(submitClientEventCalls[1].args[0], {
613
+ name: 'client.meetinginfo.response',
614
+ payload: {
615
+ identifiers: {
616
+ meetingLookupUrl: result?.url,
617
+ },
618
+ },
619
+ options: {
620
+ meetingId: 'meetingId',
621
+ globalMeetingId: requestResponse.body?.meetingId,
622
+ webexConferenceIdStr: requestResponse.body?.confID,
623
+ }
624
+ });
625
+ });
626
+
627
+ forEach(
628
+ [
629
+ {sendCAevents: true},
630
+ {sendCAevents: false},
631
+ ],
632
+ ({sendCAevents}) => {
633
+ it(`should not send CA metric if meetingId is not provided disregarding if sendCAevents is ${sendCAevents}`, async () => {
634
+ const message = 'a message';
635
+ const meetingInfoData = 'meeting info';
636
+
637
+ webex.request = sinon.stub().rejects({
638
+ statusCode: 403,
639
+ body: {message, code: 403102, data: {meetingInfo: meetingInfoData}},
640
+ url: 'http://api-url.com',
641
+ });
642
+ try {
643
+ await meetingInfo.fetchMeetingInfo(
644
+ '1234323',
645
+ _MEETING_ID_,
646
+ 'abc',
647
+ {
648
+ id: '999',
649
+ code: 'aabbcc11',
650
+ },
651
+ null,
652
+ null,
653
+ undefined,
654
+ {meetingId: undefined, sendCAevents}
655
+ );
656
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
657
+ } catch (err) {
658
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
659
+ assert.notCalled(webex.internal.newMetrics.submitInternalEvent);
660
+ }
661
+ });
662
+ }
663
+ );
664
+
261
665
  it('should throw MeetingInfoV2PasswordError for 403 response', async () => {
262
666
  const FAKE_MEETING_INFO = {blablabla: 'some_fake_meeting_info'};
263
667
 
@@ -328,11 +732,51 @@ describe('plugin-meetings', () => {
328
732
  await runTest(423001, false);
329
733
  });
330
734
  });
735
+
736
+ it('should throw an error and not fetch with an "empty" body', async () => {
737
+ const body = {supportHostKey: 'foo', supportCountryList: 'bar'};
738
+ const requestResponse = {statusCode: 200, body};
739
+
740
+ sinon
741
+ .stub(MeetingInfoUtil, 'getDestinationType')
742
+ .returns(Promise.resolve({type: _LOCUS_ID_, destination: '123456'}));
743
+ sinon.stub(MeetingInfoUtil, 'getRequestBody').returns(Promise.resolve(body));
744
+ webex.request.resolves(requestResponse);
745
+
746
+ try {
747
+ await meetingInfo.fetchMeetingInfo({
748
+ type: _LOCUS_ID_,
749
+ });
750
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
751
+ } catch (err) {
752
+ assert.calledWith(
753
+ Metrics.sendBehavioralMetric,
754
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_FAILURE,
755
+ {
756
+ reason: 'Not enough information to fetch meeting info',
757
+ destinationType: _LOCUS_ID_,
758
+ webExMeetingId: undefined,
759
+ sipUri: undefined,
760
+ }
761
+ );
762
+ assert(Metrics.sendBehavioralMetric.calledOnce);
763
+ assert.calledWith(
764
+ Metrics.sendBehavioralMetric,
765
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_FAILURE
766
+ );
767
+ assert.deepEqual(err.message, 'Not enough information to fetch meeting info');
768
+ }
769
+
770
+ MeetingInfoUtil.getDestinationType.restore();
771
+ MeetingInfoUtil.getRequestBody.restore();
772
+ });
331
773
  });
332
774
 
333
775
  describe('createAdhocSpaceMeeting', () => {
334
- it('Make a request to /instantSpace when conversationUrl', async () => {
335
- const conversationUrl = 'https://conversationUrl/xxx';
776
+ const conversationUrl = 'https://conversationUrl/xxx';
777
+ const installedOrgID = '12345';
778
+
779
+ const setup = () => {
336
780
  const invitee = [];
337
781
 
338
782
  invitee.push({
@@ -345,7 +789,13 @@ describe('plugin-meetings', () => {
345
789
  ciUserUuid: conversation.participants.items[1].entryUUID,
346
790
  });
347
791
 
348
- await meetingInfo.createAdhocSpaceMeeting(conversationUrl);
792
+ return {invitee}
793
+ }
794
+
795
+ it('Make a request to /spaceInstant when conversationUrl', async () => {
796
+ const {invitee} = setup();
797
+
798
+ const result = await meetingInfo.createAdhocSpaceMeeting(conversationUrl);
349
799
 
350
800
  assert.calledWith(
351
801
  webex.internal.conversation.get,
@@ -366,7 +816,78 @@ describe('plugin-meetings', () => {
366
816
  });
367
817
  assert(Metrics.sendBehavioralMetric.calledOnce);
368
818
  assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
819
+ assert.deepEqual(result, {
820
+ body: {},
821
+ statusCode: 200
822
+ });
369
823
  });
824
+
825
+ it('Make a request to /spaceInstant when conversationUrl with installed org ID', async () => {
826
+ const {invitee} = setup();
827
+
828
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
829
+
830
+ assert.calledWith(
831
+ webex.internal.conversation.get,
832
+ {url: conversationUrl},
833
+ {includeParticipants: true, disableTransform: true}
834
+ );
835
+
836
+ assert.calledWith(webex.request, {
837
+ method: 'POST',
838
+ uri: 'https://go.webex.com/wbxappapi/v2/meetings/spaceInstant',
839
+ body: {
840
+ title: conversation.displayName,
841
+ spaceUrl: conversation.url,
842
+ keyUrl: conversation.encryptionKeyUrl,
843
+ kroUrl: conversation.kmsResourceObjectUrl,
844
+ invitees: invitee,
845
+ installedOrgID,
846
+ },
847
+ });
848
+ assert(Metrics.sendBehavioralMetric.calledOnce);
849
+ assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
850
+ });
851
+
852
+
853
+ forEach(
854
+ [
855
+ {errorCode: 403049},
856
+ {errorCode: 403104},
857
+ {errorCode: 403103},
858
+ {errorCode: 403048},
859
+ {errorCode: 403102},
860
+ {errorCode: 403101},
861
+ ],
862
+ ({errorCode}) => {
863
+ it(`should throw a MeetingInfoV2PolicyError for error code ${errorCode}`, async () => {
864
+ const message = 'a message';
865
+ const meetingInfoData = 'meeting info';
866
+
867
+ webex.request = sinon.stub().rejects({
868
+ statusCode: 403,
869
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
870
+ });
871
+ try {
872
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
873
+ assert.fail('createAdhocSpaceMeeting should have thrown, but has not done that');
874
+ } catch (err) {
875
+ assert.instanceOf(err, MeetingInfoV2PolicyError);
876
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
877
+ assert.equal(err.wbxAppApiCode, errorCode);
878
+ assert.deepEqual(err.meetingInfo, meetingInfoData);
879
+
880
+ assert(Metrics.sendBehavioralMetric.calledOnce);
881
+ assert.calledWith(
882
+ Metrics.sendBehavioralMetric,
883
+ BEHAVIORAL_METRICS.MEETING_INFO_POLICY_ERROR,
884
+ {code: errorCode}
885
+ );
886
+
887
+ }
888
+ });
889
+ }
890
+ );
370
891
  });
371
892
  });
372
893
  });
@@ -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,31 @@ 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
+ });
65
+
66
+ describe('#getActiveWebrtcMeeting', () => {
67
+ it('returns the meeting with a webrtc media connection', () => {
68
+ const activeMeeting = {value: 'test3', id: uuid.v4(), mediaProperties: { webrtcMediaConnection: 'something'}};
69
+
70
+ meetingCollection.meetings.test = {value: 'test', id: uuid1, mediaProperties: {}};
71
+ meetingCollection.meetings.test2 = {value: 'test2', id: uuid2, mediaProperties: {}};
72
+ meetingCollection.meetings.test3 = activeMeeting;
73
+
74
+ assert.equal(meetingCollection.getActiveWebrtcMeeting(), activeMeeting);
75
+ })
76
+ })
51
77
  });
52
78
  });