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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +41 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +357 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +215 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +22 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +51 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +44 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1047 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +77 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +64 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/browser-detection.js +1 -2
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +1 -2
  25. package/dist/common/collection.js.map +1 -1
  26. package/dist/common/config.js +1 -2
  27. package/dist/common/config.js.map +1 -1
  28. package/dist/common/errors/captcha-error.js +1 -2
  29. package/dist/common/errors/captcha-error.js.map +1 -1
  30. package/dist/common/errors/intent-to-join.js +1 -2
  31. package/dist/common/errors/intent-to-join.js.map +1 -1
  32. package/dist/common/errors/join-meeting.js +1 -2
  33. package/dist/common/errors/join-meeting.js.map +1 -1
  34. package/dist/common/errors/media.js +1 -2
  35. package/dist/common/errors/media.js.map +1 -1
  36. package/dist/common/errors/no-meeting-info.js +50 -0
  37. package/dist/common/errors/no-meeting-info.js.map +1 -0
  38. package/dist/common/errors/parameter.js +3 -4
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +1 -2
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +1 -2
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  45. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  46. package/dist/common/errors/reconnection-in-progress.js +1 -2
  47. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  48. package/dist/common/errors/reconnection.js +1 -2
  49. package/dist/common/errors/reconnection.js.map +1 -1
  50. package/dist/common/errors/stats.js +1 -2
  51. package/dist/common/errors/stats.js.map +1 -1
  52. package/dist/common/errors/webex-errors.js +48 -28
  53. package/dist/common/errors/webex-errors.js.map +1 -1
  54. package/dist/common/errors/webex-meetings-error.js +1 -2
  55. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  56. package/dist/common/events/events-scope.js +1 -2
  57. package/dist/common/events/events-scope.js.map +1 -1
  58. package/dist/common/events/events.js +1 -2
  59. package/dist/common/events/events.js.map +1 -1
  60. package/dist/common/events/trigger-proxy.js +1 -2
  61. package/dist/common/events/trigger-proxy.js.map +1 -1
  62. package/dist/common/events/util.js +1 -2
  63. package/dist/common/events/util.js.map +1 -1
  64. package/dist/common/logs/logger-config.js +1 -2
  65. package/dist/common/logs/logger-config.js.map +1 -1
  66. package/dist/common/logs/logger-proxy.js +2 -3
  67. package/dist/common/logs/logger-proxy.js.map +1 -1
  68. package/dist/common/logs/request.js +8 -5
  69. package/dist/common/logs/request.js.map +1 -1
  70. package/dist/common/queue.js +22 -9
  71. package/dist/common/queue.js.map +1 -1
  72. package/dist/config.js +9 -12
  73. package/dist/config.js.map +1 -1
  74. package/dist/constants.js +437 -433
  75. package/dist/constants.js.map +1 -1
  76. package/dist/controls-options-manager/constants.js +3 -6
  77. package/dist/controls-options-manager/constants.js.map +1 -1
  78. package/dist/controls-options-manager/enums.js +14 -6
  79. package/dist/controls-options-manager/enums.js.map +1 -1
  80. package/dist/controls-options-manager/index.js +126 -37
  81. package/dist/controls-options-manager/index.js.map +1 -1
  82. package/dist/controls-options-manager/types.js +7 -0
  83. package/dist/controls-options-manager/types.js.map +1 -0
  84. package/dist/controls-options-manager/util.js +309 -19
  85. package/dist/controls-options-manager/util.js.map +1 -1
  86. package/dist/index.js +116 -4
  87. package/dist/index.js.map +1 -1
  88. package/dist/interpretation/collection.js +22 -0
  89. package/dist/interpretation/collection.js.map +1 -0
  90. package/dist/interpretation/index.js +365 -0
  91. package/dist/interpretation/index.js.map +1 -0
  92. package/dist/interpretation/siLanguage.js +24 -0
  93. package/dist/interpretation/siLanguage.js.map +1 -0
  94. package/dist/locus-info/controlsUtils.js +95 -6
  95. package/dist/locus-info/controlsUtils.js.map +1 -1
  96. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  97. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  98. package/dist/locus-info/fullState.js +1 -2
  99. package/dist/locus-info/fullState.js.map +1 -1
  100. package/dist/locus-info/hostUtils.js +1 -2
  101. package/dist/locus-info/hostUtils.js.map +1 -1
  102. package/dist/locus-info/index.js +408 -67
  103. package/dist/locus-info/index.js.map +1 -1
  104. package/dist/locus-info/infoUtils.js +13 -5
  105. package/dist/locus-info/infoUtils.js.map +1 -1
  106. package/dist/locus-info/mediaSharesUtils.js +58 -3
  107. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  108. package/dist/locus-info/parser.js +251 -78
  109. package/dist/locus-info/parser.js.map +1 -1
  110. package/dist/locus-info/selfUtils.js +97 -13
  111. package/dist/locus-info/selfUtils.js.map +1 -1
  112. package/dist/media/index.js +106 -319
  113. package/dist/media/index.js.map +1 -1
  114. package/dist/media/properties.js +96 -153
  115. package/dist/media/properties.js.map +1 -1
  116. package/dist/media/util.js +1 -22
  117. package/dist/media/util.js.map +1 -1
  118. package/dist/mediaQualityMetrics/config.js +498 -493
  119. package/dist/mediaQualityMetrics/config.js.map +1 -1
  120. package/dist/meeting/in-meeting-actions.js +90 -3
  121. package/dist/meeting/in-meeting-actions.js.map +1 -1
  122. package/dist/meeting/index.js +4579 -2951
  123. package/dist/meeting/index.js.map +1 -1
  124. package/dist/meeting/locusMediaRequest.js +291 -0
  125. package/dist/meeting/locusMediaRequest.js.map +1 -0
  126. package/dist/meeting/muteState.js +224 -133
  127. package/dist/meeting/muteState.js.map +1 -1
  128. package/dist/meeting/request.js +295 -197
  129. package/dist/meeting/request.js.map +1 -1
  130. package/dist/meeting/request.type.js +7 -0
  131. package/dist/meeting/request.type.js.map +1 -0
  132. package/dist/meeting/state.js +1 -2
  133. package/dist/meeting/state.js.map +1 -1
  134. package/dist/meeting/util.js +602 -432
  135. package/dist/meeting/util.js.map +1 -1
  136. package/dist/meeting-info/collection.js +1 -2
  137. package/dist/meeting-info/collection.js.map +1 -1
  138. package/dist/meeting-info/index.js +74 -7
  139. package/dist/meeting-info/index.js.map +1 -1
  140. package/dist/meeting-info/meeting-info-v2.js +197 -63
  141. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  142. package/dist/meeting-info/request.js +1 -2
  143. package/dist/meeting-info/request.js.map +1 -1
  144. package/dist/meeting-info/util.js +2 -3
  145. package/dist/meeting-info/util.js.map +1 -1
  146. package/dist/meeting-info/utilv2.js +25 -12
  147. package/dist/meeting-info/utilv2.js.map +1 -1
  148. package/dist/meetings/collection.js +23 -2
  149. package/dist/meetings/collection.js.map +1 -1
  150. package/dist/meetings/index.js +464 -123
  151. package/dist/meetings/index.js.map +1 -1
  152. package/dist/meetings/meetings.types.js +7 -0
  153. package/dist/meetings/meetings.types.js.map +1 -0
  154. package/dist/meetings/request.js +4 -3
  155. package/dist/meetings/request.js.map +1 -1
  156. package/dist/meetings/util.js +107 -6
  157. package/dist/meetings/util.js.map +1 -1
  158. package/dist/member/index.js +54 -2
  159. package/dist/member/index.js.map +1 -1
  160. package/dist/member/member.types.js +3 -4
  161. package/dist/member/member.types.js.map +1 -1
  162. package/dist/member/types.js +23 -0
  163. package/dist/member/types.js.map +1 -0
  164. package/dist/member/util.js +131 -29
  165. package/dist/member/util.js.map +1 -1
  166. package/dist/members/collection.js +11 -2
  167. package/dist/members/collection.js.map +1 -1
  168. package/dist/members/index.js +172 -8
  169. package/dist/members/index.js.map +1 -1
  170. package/dist/members/request.js +108 -41
  171. package/dist/members/request.js.map +1 -1
  172. package/dist/members/types.js +14 -0
  173. package/dist/members/types.js.map +1 -0
  174. package/dist/members/util.js +327 -234
  175. package/dist/members/util.js.map +1 -1
  176. package/dist/metrics/constants.js +14 -7
  177. package/dist/metrics/constants.js.map +1 -1
  178. package/dist/metrics/index.js +4 -452
  179. package/dist/metrics/index.js.map +1 -1
  180. package/dist/multistream/mediaRequestManager.js +344 -0
  181. package/dist/multistream/mediaRequestManager.js.map +1 -0
  182. package/dist/multistream/receiveSlot.js +200 -0
  183. package/dist/multistream/receiveSlot.js.map +1 -0
  184. package/dist/multistream/receiveSlotManager.js +174 -0
  185. package/dist/multistream/receiveSlotManager.js.map +1 -0
  186. package/dist/multistream/remoteMedia.js +268 -0
  187. package/dist/multistream/remoteMedia.js.map +1 -0
  188. package/dist/multistream/remoteMediaGroup.js +267 -0
  189. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  190. package/dist/multistream/remoteMediaManager.js +1211 -0
  191. package/dist/multistream/remoteMediaManager.js.map +1 -0
  192. package/dist/multistream/sendSlotManager.js +236 -0
  193. package/dist/multistream/sendSlotManager.js.map +1 -0
  194. package/dist/networkQualityMonitor/index.js +5 -4
  195. package/dist/networkQualityMonitor/index.js.map +1 -1
  196. package/dist/personal-meeting-room/index.js +2 -3
  197. package/dist/personal-meeting-room/index.js.map +1 -1
  198. package/dist/personal-meeting-room/request.js +2 -3
  199. package/dist/personal-meeting-room/request.js.map +1 -1
  200. package/dist/personal-meeting-room/util.js +1 -2
  201. package/dist/personal-meeting-room/util.js.map +1 -1
  202. package/dist/reachability/index.js +258 -72
  203. package/dist/reachability/index.js.map +1 -1
  204. package/dist/reachability/request.js +18 -10
  205. package/dist/reachability/request.js.map +1 -1
  206. package/dist/reactions/constants.js +12 -0
  207. package/dist/reactions/constants.js.map +1 -0
  208. package/dist/reactions/reactions.js +4 -6
  209. package/dist/reactions/reactions.js.map +1 -1
  210. package/dist/reactions/reactions.type.js +21 -23
  211. package/dist/reactions/reactions.type.js.map +1 -1
  212. package/dist/reconnection-manager/index.js +272 -220
  213. package/dist/reconnection-manager/index.js.map +1 -1
  214. package/dist/recording-controller/enums.js +4 -5
  215. package/dist/recording-controller/enums.js.map +1 -1
  216. package/dist/recording-controller/index.js +57 -46
  217. package/dist/recording-controller/index.js.map +1 -1
  218. package/dist/recording-controller/util.js +10 -10
  219. package/dist/recording-controller/util.js.map +1 -1
  220. package/dist/roap/index.js +101 -235
  221. package/dist/roap/index.js.map +1 -1
  222. package/dist/roap/request.js +126 -180
  223. package/dist/roap/request.js.map +1 -1
  224. package/dist/roap/turnDiscovery.js +115 -105
  225. package/dist/roap/turnDiscovery.js.map +1 -1
  226. package/dist/rtcMetrics/constants.js +11 -0
  227. package/dist/rtcMetrics/constants.js.map +1 -0
  228. package/dist/rtcMetrics/index.js +115 -0
  229. package/dist/rtcMetrics/index.js.map +1 -0
  230. package/dist/statsAnalyzer/global.js +2 -93
  231. package/dist/statsAnalyzer/global.js.map +1 -1
  232. package/dist/statsAnalyzer/index.js +374 -374
  233. package/dist/statsAnalyzer/index.js.map +1 -1
  234. package/dist/statsAnalyzer/mqaUtil.js +100 -66
  235. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  236. package/dist/transcription/index.js +1 -2
  237. package/dist/transcription/index.js.map +1 -1
  238. package/dist/webinar/collection.js +43 -0
  239. package/dist/webinar/collection.js.map +1 -0
  240. package/dist/webinar/index.js +68 -0
  241. package/dist/webinar/index.js.map +1 -0
  242. package/package.json +27 -18
  243. package/src/annotation/annotation.types.ts +50 -0
  244. package/src/annotation/constants.ts +36 -0
  245. package/src/annotation/index.ts +328 -0
  246. package/src/breakouts/README.md +220 -0
  247. package/src/breakouts/breakout.ts +188 -0
  248. package/src/breakouts/collection.ts +19 -0
  249. package/src/breakouts/edit-lock-error.ts +25 -0
  250. package/src/breakouts/events.ts +56 -0
  251. package/src/breakouts/index.ts +925 -0
  252. package/src/breakouts/request.ts +55 -0
  253. package/src/breakouts/utils.ts +57 -0
  254. package/src/common/errors/no-meeting-info.ts +24 -0
  255. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  256. package/src/common/errors/webex-errors.ts +36 -12
  257. package/src/common/logs/logger-proxy.ts +1 -1
  258. package/src/common/logs/request.ts +5 -1
  259. package/src/common/queue.ts +22 -8
  260. package/src/config.ts +7 -9
  261. package/src/constants.ts +263 -89
  262. package/src/controls-options-manager/enums.ts +11 -1
  263. package/src/controls-options-manager/index.ts +116 -21
  264. package/src/controls-options-manager/types.ts +59 -0
  265. package/src/controls-options-manager/util.ts +294 -14
  266. package/src/index.ts +40 -0
  267. package/src/interpretation/README.md +60 -0
  268. package/src/interpretation/collection.ts +19 -0
  269. package/src/interpretation/index.ts +332 -0
  270. package/src/interpretation/siLanguage.ts +18 -0
  271. package/src/locus-info/controlsUtils.ts +110 -0
  272. package/src/locus-info/index.ts +449 -61
  273. package/src/locus-info/infoUtils.ts +14 -2
  274. package/src/locus-info/mediaSharesUtils.ts +64 -0
  275. package/src/locus-info/parser.ts +258 -47
  276. package/src/locus-info/selfUtils.ts +85 -2
  277. package/src/media/index.ts +153 -370
  278. package/src/media/properties.ts +106 -136
  279. package/src/media/util.ts +0 -21
  280. package/src/mediaQualityMetrics/config.ts +379 -377
  281. package/src/meeting/in-meeting-actions.ts +168 -0
  282. package/src/meeting/index.ts +3801 -2457
  283. package/src/meeting/locusMediaRequest.ts +313 -0
  284. package/src/meeting/muteState.ts +224 -138
  285. package/src/meeting/request.ts +207 -127
  286. package/src/meeting/request.type.ts +13 -0
  287. package/src/meeting/util.ts +590 -423
  288. package/src/meeting-info/index.ts +81 -8
  289. package/src/meeting-info/meeting-info-v2.ts +159 -13
  290. package/src/meeting-info/util.ts +1 -1
  291. package/src/meeting-info/utilv2.ts +22 -9
  292. package/src/meetings/collection.ts +20 -0
  293. package/src/meetings/index.ts +466 -124
  294. package/src/meetings/meetings.types.ts +12 -0
  295. package/src/meetings/request.ts +2 -0
  296. package/src/meetings/util.ts +116 -5
  297. package/src/member/index.ts +52 -1
  298. package/src/member/types.ts +38 -0
  299. package/src/member/util.ts +139 -28
  300. package/src/members/collection.ts +8 -0
  301. package/src/members/index.ts +196 -7
  302. package/src/members/request.ts +97 -17
  303. package/src/members/types.ts +29 -0
  304. package/src/members/util.ts +333 -240
  305. package/src/metrics/constants.ts +12 -4
  306. package/src/metrics/index.ts +1 -471
  307. package/src/multistream/mediaRequestManager.ts +440 -0
  308. package/src/multistream/receiveSlot.ts +184 -0
  309. package/src/multistream/receiveSlotManager.ts +166 -0
  310. package/src/multistream/remoteMedia.ts +254 -0
  311. package/src/multistream/remoteMediaGroup.ts +284 -0
  312. package/src/multistream/remoteMediaManager.ts +1145 -0
  313. package/src/multistream/sendSlotManager.ts +170 -0
  314. package/src/networkQualityMonitor/index.ts +6 -6
  315. package/src/reachability/index.ts +238 -45
  316. package/src/reachability/request.ts +17 -8
  317. package/src/reactions/constants.ts +4 -0
  318. package/src/reactions/reactions.ts +4 -4
  319. package/src/reactions/reactions.type.ts +30 -4
  320. package/src/reconnection-manager/index.ts +124 -107
  321. package/src/recording-controller/index.ts +20 -3
  322. package/src/recording-controller/util.ts +26 -9
  323. package/src/roap/index.ts +98 -240
  324. package/src/roap/request.ts +74 -148
  325. package/src/roap/turnDiscovery.ts +62 -56
  326. package/src/rtcMetrics/constants.ts +3 -0
  327. package/src/rtcMetrics/index.ts +100 -0
  328. package/src/statsAnalyzer/global.ts +1 -92
  329. package/src/statsAnalyzer/index.ts +429 -447
  330. package/src/statsAnalyzer/mqaUtil.ts +105 -103
  331. package/src/webinar/collection.ts +31 -0
  332. package/src/webinar/index.ts +62 -0
  333. package/test/integration/spec/converged-space-meetings.js +233 -0
  334. package/test/integration/spec/journey.js +320 -264
  335. package/test/integration/spec/space-meeting.js +77 -4
  336. package/test/unit/spec/annotation/index.ts +418 -0
  337. package/test/unit/spec/breakouts/breakout.ts +237 -0
  338. package/test/unit/spec/breakouts/collection.ts +15 -0
  339. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  340. package/test/unit/spec/breakouts/events.ts +89 -0
  341. package/test/unit/spec/breakouts/index.ts +1790 -0
  342. package/test/unit/spec/breakouts/request.ts +104 -0
  343. package/test/unit/spec/breakouts/utils.js +72 -0
  344. package/test/unit/spec/common/queue.js +31 -2
  345. package/test/unit/spec/controls-options-manager/index.js +163 -0
  346. package/test/unit/spec/controls-options-manager/util.js +576 -60
  347. package/test/unit/spec/fixture/locus.js +1 -0
  348. package/test/unit/spec/interpretation/collection.ts +15 -0
  349. package/test/unit/spec/interpretation/index.ts +589 -0
  350. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  351. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  352. package/test/unit/spec/locus-info/index.js +1390 -16
  353. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  354. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  355. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  356. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  357. package/test/unit/spec/locus-info/parser.js +116 -35
  358. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  359. package/test/unit/spec/media/index.ts +274 -0
  360. package/test/unit/spec/media/properties.ts +75 -84
  361. package/test/unit/spec/meeting/in-meeting-actions.ts +82 -0
  362. package/test/unit/spec/meeting/index.js +7420 -3125
  363. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  364. package/test/unit/spec/meeting/muteState.js +407 -212
  365. package/test/unit/spec/meeting/request.js +512 -42
  366. package/test/unit/spec/meeting/utils.js +741 -24
  367. package/test/unit/spec/meeting-info/index.js +300 -0
  368. package/test/unit/spec/meeting-info/meetinginfov2.js +500 -6
  369. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  370. package/test/unit/spec/meetings/collection.js +14 -0
  371. package/test/unit/spec/meetings/index.js +1012 -209
  372. package/test/unit/spec/meetings/utils.js +202 -2
  373. package/test/unit/spec/member/index.js +38 -8
  374. package/test/unit/spec/member/util.js +528 -27
  375. package/test/unit/spec/members/index.js +597 -3
  376. package/test/unit/spec/members/request.js +206 -27
  377. package/test/unit/spec/members/utils.js +210 -0
  378. package/test/unit/spec/metrics/index.js +1 -50
  379. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  380. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  381. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  382. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  383. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  384. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  385. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  386. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  387. package/test/unit/spec/reachability/index.ts +598 -24
  388. package/test/unit/spec/reachability/request.js +68 -0
  389. package/test/unit/spec/reconnection-manager/index.js +130 -22
  390. package/test/unit/spec/recording-controller/index.js +293 -218
  391. package/test/unit/spec/recording-controller/util.js +223 -96
  392. package/test/unit/spec/roap/index.ts +200 -77
  393. package/test/unit/spec/roap/request.ts +232 -0
  394. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  395. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  396. package/test/unit/spec/stats-analyzer/index.js +205 -50
  397. package/test/unit/spec/webinar/collection.ts +13 -0
  398. package/test/unit/spec/webinar/index.ts +60 -0
  399. package/test/utils/constants.js +9 -0
  400. package/test/utils/integrationTestUtils.js +46 -0
  401. package/test/utils/testUtils.js +0 -45
  402. package/test/utils/webex-config.js +4 -0
  403. package/test/utils/webex-test-users.js +7 -3
  404. package/dist/meeting/effectsState.js +0 -260
  405. package/dist/meeting/effectsState.js.map +0 -1
  406. package/dist/metrics/config.js +0 -289
  407. package/dist/metrics/config.js.map +0 -1
  408. package/dist/peer-connection-manager/index.js +0 -671
  409. package/dist/peer-connection-manager/index.js.map +0 -1
  410. package/dist/peer-connection-manager/util.js +0 -110
  411. package/dist/peer-connection-manager/util.js.map +0 -1
  412. package/dist/roap/collection.js +0 -63
  413. package/dist/roap/collection.js.map +0 -1
  414. package/dist/roap/handler.js +0 -279
  415. package/dist/roap/handler.js.map +0 -1
  416. package/dist/roap/state.js +0 -127
  417. package/dist/roap/state.js.map +0 -1
  418. package/dist/roap/util.js +0 -76
  419. package/dist/roap/util.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/meeting/effectsState.ts +0 -209
  422. package/src/metrics/config.ts +0 -485
  423. package/src/peer-connection-manager/index.ts +0 -847
  424. package/src/peer-connection-manager/util.ts +0 -119
  425. package/src/roap/collection.ts +0 -62
  426. package/src/roap/handler.ts +0 -294
  427. package/src/roap/state.ts +0 -156
  428. package/src/roap/util.ts +0 -100
  429. package/test/unit/spec/meeting/effectsState.js +0 -281
  430. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  431. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  432. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  433. package/test/unit/spec/roap/util.js +0 -30
@@ -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,12 +789,18 @@ describe('plugin-meetings', () => {
345
789
  ciUserUuid: conversation.participants.items[1].entryUUID,
346
790
  });
347
791
 
792
+ return {invitee}
793
+ }
794
+
795
+ it('Make a request to /spaceInstant when conversationUrl', async () => {
796
+ const {invitee} = setup();
797
+
348
798
  webex.request.resolves({
349
799
  statusCode: 200,
350
800
  body: conversation
351
801
  });
352
802
 
353
- await meetingInfo.createAdhocSpaceMeeting(conversationUrl);
803
+ const result = await meetingInfo.createAdhocSpaceMeeting(conversationUrl,installedOrgID);
354
804
 
355
805
  assert.calledWith(
356
806
  webex.request,
@@ -366,11 +816,55 @@ describe('plugin-meetings', () => {
366
816
  keyUrl: conversation.encryptionKeyUrl,
367
817
  kroUrl: conversation.kmsResourceObjectUrl,
368
818
  invitees: invitee,
819
+ installedOrgID: installedOrgID
369
820
  },
370
821
  });
371
- assert(Metrics.sendBehavioralMetric.calledOnce);
822
+ assert.calledOnce(Metrics.sendBehavioralMetric);
372
823
  assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
824
+ assert.deepEqual(result, {
825
+ body: conversation,
826
+ statusCode: 200
827
+ });
373
828
  });
829
+
830
+ forEach(
831
+ [
832
+ {errorCode: 403049},
833
+ {errorCode: 403104},
834
+ {errorCode: 403103},
835
+ {errorCode: 403048},
836
+ {errorCode: 403102},
837
+ {errorCode: 403101},
838
+ ],
839
+ ({errorCode}) => {
840
+ it(`should throw a MeetingInfoV2PolicyError for error code ${errorCode}`, async () => {
841
+ const message = 'a message';
842
+ const meetingInfoData = 'meeting info';
843
+
844
+ webex.request = sinon.stub().rejects({
845
+ statusCode: 403,
846
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
847
+ });
848
+ try {
849
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
850
+ assert.fail('createAdhocSpaceMeeting should have thrown, but has not done that');
851
+ } catch (err) {
852
+ assert.instanceOf(err, MeetingInfoV2PolicyError);
853
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
854
+ assert.equal(err.wbxAppApiCode, errorCode);
855
+ assert.deepEqual(err.meetingInfo, meetingInfoData);
856
+
857
+ assert(Metrics.sendBehavioralMetric.calledOnce);
858
+ assert.calledWith(
859
+ Metrics.sendBehavioralMetric,
860
+ BEHAVIORAL_METRICS.MEETING_INFO_POLICY_ERROR,
861
+ {code: errorCode}
862
+ );
863
+
864
+ }
865
+ });
866
+ }
867
+ );
374
868
  });
375
869
  });
376
870
  });
@@ -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
  });