@webex/plugin-meetings 2.59.8 → 2.60.0-next.10

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 (517) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.d.ts +42 -0
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.d.ts +31 -0
  6. package/dist/annotation/constants.js +41 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.d.ts +117 -0
  9. package/dist/annotation/index.js +357 -0
  10. package/dist/annotation/index.js.map +1 -0
  11. package/dist/breakouts/breakout.d.ts +8 -0
  12. package/dist/breakouts/breakout.js +215 -0
  13. package/dist/breakouts/breakout.js.map +1 -0
  14. package/dist/breakouts/collection.d.ts +5 -0
  15. package/dist/breakouts/collection.js +22 -0
  16. package/dist/breakouts/collection.js.map +1 -0
  17. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  18. package/dist/breakouts/edit-lock-error.js +51 -0
  19. package/dist/breakouts/edit-lock-error.js.map +1 -0
  20. package/dist/breakouts/events.d.ts +8 -0
  21. package/dist/breakouts/events.js +44 -0
  22. package/dist/breakouts/events.js.map +1 -0
  23. package/dist/breakouts/index.d.ts +5 -0
  24. package/dist/breakouts/index.js +1047 -0
  25. package/dist/breakouts/index.js.map +1 -0
  26. package/dist/breakouts/request.d.ts +22 -0
  27. package/dist/breakouts/request.js +77 -0
  28. package/dist/breakouts/request.js.map +1 -0
  29. package/dist/breakouts/utils.d.ts +15 -0
  30. package/dist/breakouts/utils.js +64 -0
  31. package/dist/breakouts/utils.js.map +1 -0
  32. package/dist/common/browser-detection.js +2 -3
  33. package/dist/common/browser-detection.js.map +1 -1
  34. package/dist/common/collection.js +3 -4
  35. package/dist/common/collection.js.map +1 -1
  36. package/dist/common/config.js +1 -2
  37. package/dist/common/config.js.map +1 -1
  38. package/dist/common/errors/captcha-error.js +1 -2
  39. package/dist/common/errors/captcha-error.js.map +1 -1
  40. package/dist/common/errors/intent-to-join.js +1 -2
  41. package/dist/common/errors/intent-to-join.js.map +1 -1
  42. package/dist/common/errors/join-meeting.js +1 -2
  43. package/dist/common/errors/join-meeting.js.map +1 -1
  44. package/dist/common/errors/media.js +1 -2
  45. package/dist/common/errors/media.js.map +1 -1
  46. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  47. package/dist/common/errors/no-meeting-info.js +50 -0
  48. package/dist/common/errors/no-meeting-info.js.map +1 -0
  49. package/dist/common/errors/parameter.js +3 -4
  50. package/dist/common/errors/parameter.js.map +1 -1
  51. package/dist/common/errors/password-error.js +1 -2
  52. package/dist/common/errors/password-error.js.map +1 -1
  53. package/dist/common/errors/permission.js +1 -2
  54. package/dist/common/errors/permission.js.map +1 -1
  55. package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
  56. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  57. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  58. package/dist/common/errors/reconnection-in-progress.js +1 -2
  59. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  60. package/dist/common/errors/reconnection.js +1 -2
  61. package/dist/common/errors/reconnection.js.map +1 -1
  62. package/dist/common/errors/stats.js +1 -2
  63. package/dist/common/errors/stats.js.map +1 -1
  64. package/dist/common/errors/webex-errors.d.ts +20 -8
  65. package/dist/common/errors/webex-errors.js +48 -28
  66. package/dist/common/errors/webex-errors.js.map +1 -1
  67. package/dist/common/errors/webex-meetings-error.js +1 -2
  68. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  69. package/dist/common/events/events-scope.js +1 -2
  70. package/dist/common/events/events-scope.js.map +1 -1
  71. package/dist/common/events/events.js +1 -2
  72. package/dist/common/events/events.js.map +1 -1
  73. package/dist/common/events/trigger-proxy.js +1 -2
  74. package/dist/common/events/trigger-proxy.js.map +1 -1
  75. package/dist/common/events/util.js +1 -2
  76. package/dist/common/events/util.js.map +1 -1
  77. package/dist/common/logs/logger-config.js +1 -2
  78. package/dist/common/logs/logger-config.js.map +1 -1
  79. package/dist/common/logs/logger-proxy.js +2 -3
  80. package/dist/common/logs/logger-proxy.js.map +1 -1
  81. package/dist/common/logs/request.d.ts +3 -1
  82. package/dist/common/logs/request.js +8 -5
  83. package/dist/common/logs/request.js.map +1 -1
  84. package/dist/common/queue.d.ts +9 -7
  85. package/dist/common/queue.js +22 -9
  86. package/dist/common/queue.js.map +1 -1
  87. package/dist/config.d.ts +5 -7
  88. package/dist/config.js +8 -11
  89. package/dist/config.js.map +1 -1
  90. package/dist/constants.d.ts +243 -97
  91. package/dist/constants.js +437 -435
  92. package/dist/constants.js.map +1 -1
  93. package/dist/controls-options-manager/constants.js +3 -6
  94. package/dist/controls-options-manager/constants.js.map +1 -1
  95. package/dist/controls-options-manager/enums.d.ts +11 -1
  96. package/dist/controls-options-manager/enums.js +15 -6
  97. package/dist/controls-options-manager/enums.js.map +1 -1
  98. package/dist/controls-options-manager/index.d.ts +17 -1
  99. package/dist/controls-options-manager/index.js +127 -38
  100. package/dist/controls-options-manager/index.js.map +1 -1
  101. package/dist/controls-options-manager/types.d.ts +43 -0
  102. package/dist/controls-options-manager/types.js +7 -0
  103. package/dist/controls-options-manager/types.js.map +1 -0
  104. package/dist/controls-options-manager/util.d.ts +1 -7
  105. package/dist/controls-options-manager/util.js +309 -19
  106. package/dist/controls-options-manager/util.js.map +1 -1
  107. package/dist/index.d.ts +6 -3
  108. package/dist/index.js +116 -4
  109. package/dist/index.js.map +1 -1
  110. package/dist/interpretation/collection.d.ts +5 -0
  111. package/dist/interpretation/collection.js +22 -0
  112. package/dist/interpretation/collection.js.map +1 -0
  113. package/dist/interpretation/index.d.ts +5 -0
  114. package/dist/interpretation/index.js +365 -0
  115. package/dist/interpretation/index.js.map +1 -0
  116. package/dist/interpretation/siLanguage.d.ts +5 -0
  117. package/dist/interpretation/siLanguage.js +24 -0
  118. package/dist/interpretation/siLanguage.js.map +1 -0
  119. package/dist/locus-info/controlsUtils.js +100 -11
  120. package/dist/locus-info/controlsUtils.js.map +1 -1
  121. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  122. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  123. package/dist/locus-info/fullState.js +1 -2
  124. package/dist/locus-info/fullState.js.map +1 -1
  125. package/dist/locus-info/hostUtils.js +1 -2
  126. package/dist/locus-info/hostUtils.js.map +1 -1
  127. package/dist/locus-info/index.d.ts +57 -4
  128. package/dist/locus-info/index.js +425 -84
  129. package/dist/locus-info/index.js.map +1 -1
  130. package/dist/locus-info/infoUtils.js +13 -5
  131. package/dist/locus-info/infoUtils.js.map +1 -1
  132. package/dist/locus-info/mediaSharesUtils.js +58 -3
  133. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  134. package/dist/locus-info/parser.d.ts +66 -6
  135. package/dist/locus-info/parser.js +253 -80
  136. package/dist/locus-info/parser.js.map +1 -1
  137. package/dist/locus-info/selfUtils.js +97 -13
  138. package/dist/locus-info/selfUtils.js.map +1 -1
  139. package/dist/media/index.d.ts +2 -0
  140. package/dist/media/index.js +107 -319
  141. package/dist/media/index.js.map +1 -1
  142. package/dist/media/properties.d.ts +38 -53
  143. package/dist/media/properties.js +96 -153
  144. package/dist/media/properties.js.map +1 -1
  145. package/dist/media/util.js +1 -22
  146. package/dist/media/util.js.map +1 -1
  147. package/dist/mediaQualityMetrics/config.d.ts +234 -230
  148. package/dist/mediaQualityMetrics/config.js +302 -498
  149. package/dist/mediaQualityMetrics/config.js.map +1 -1
  150. package/dist/meeting/in-meeting-actions.d.ts +88 -0
  151. package/dist/meeting/in-meeting-actions.js +94 -3
  152. package/dist/meeting/in-meeting-actions.js.map +1 -1
  153. package/dist/meeting/index.d.ts +591 -494
  154. package/dist/meeting/index.js +4728 -2990
  155. package/dist/meeting/index.js.map +1 -1
  156. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  157. package/dist/meeting/locusMediaRequest.js +291 -0
  158. package/dist/meeting/locusMediaRequest.js.map +1 -0
  159. package/dist/meeting/muteState.d.ts +93 -25
  160. package/dist/meeting/muteState.js +224 -133
  161. package/dist/meeting/muteState.js.map +1 -1
  162. package/dist/meeting/request.d.ts +82 -47
  163. package/dist/meeting/request.js +297 -199
  164. package/dist/meeting/request.js.map +1 -1
  165. package/dist/meeting/request.type.d.ts +11 -0
  166. package/dist/meeting/request.type.js +7 -0
  167. package/dist/meeting/request.type.js.map +1 -0
  168. package/dist/meeting/state.js +1 -2
  169. package/dist/meeting/state.js.map +1 -1
  170. package/dist/meeting/util.d.ts +102 -1
  171. package/dist/meeting/util.js +605 -435
  172. package/dist/meeting/util.js.map +1 -1
  173. package/dist/meeting-info/collection.js +3 -4
  174. package/dist/meeting-info/collection.js.map +1 -1
  175. package/dist/meeting-info/index.d.ts +13 -1
  176. package/dist/meeting-info/index.js +74 -7
  177. package/dist/meeting-info/index.js.map +1 -1
  178. package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
  179. package/dist/meeting-info/meeting-info-v2.js +200 -63
  180. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  181. package/dist/meeting-info/request.js +1 -2
  182. package/dist/meeting-info/request.js.map +1 -1
  183. package/dist/meeting-info/util.js +2 -3
  184. package/dist/meeting-info/util.js.map +1 -1
  185. package/dist/meeting-info/utilv2.js +39 -41
  186. package/dist/meeting-info/utilv2.js.map +1 -1
  187. package/dist/meetings/collection.d.ts +17 -0
  188. package/dist/meetings/collection.js +42 -4
  189. package/dist/meetings/collection.js.map +1 -1
  190. package/dist/meetings/index.d.ts +103 -21
  191. package/dist/meetings/index.js +486 -124
  192. package/dist/meetings/index.js.map +1 -1
  193. package/dist/meetings/meetings.types.d.ts +4 -0
  194. package/dist/meetings/meetings.types.js +7 -0
  195. package/dist/meetings/meetings.types.js.map +1 -0
  196. package/dist/meetings/request.js +4 -3
  197. package/dist/meetings/request.js.map +1 -1
  198. package/dist/meetings/util.js +107 -6
  199. package/dist/meetings/util.js.map +1 -1
  200. package/dist/member/index.d.ts +14 -1
  201. package/dist/member/index.js +54 -2
  202. package/dist/member/index.js.map +1 -1
  203. package/dist/member/member.types.js +3 -4
  204. package/dist/member/member.types.js.map +1 -1
  205. package/dist/member/types.d.ts +32 -0
  206. package/dist/member/types.js +23 -0
  207. package/dist/member/types.js.map +1 -0
  208. package/dist/member/util.js +131 -29
  209. package/dist/member/util.js.map +1 -1
  210. package/dist/members/collection.d.ts +5 -0
  211. package/dist/members/collection.js +11 -2
  212. package/dist/members/collection.js.map +1 -1
  213. package/dist/members/index.d.ts +57 -2
  214. package/dist/members/index.js +174 -10
  215. package/dist/members/index.js.map +1 -1
  216. package/dist/members/request.d.ts +73 -9
  217. package/dist/members/request.js +108 -41
  218. package/dist/members/request.js.map +1 -1
  219. package/dist/members/types.d.ts +25 -0
  220. package/dist/members/types.js +14 -0
  221. package/dist/members/types.js.map +1 -0
  222. package/dist/members/util.d.ts +214 -1
  223. package/dist/members/util.js +327 -234
  224. package/dist/members/util.js.map +1 -1
  225. package/dist/metrics/constants.d.ts +15 -6
  226. package/dist/metrics/constants.js +17 -9
  227. package/dist/metrics/constants.js.map +1 -1
  228. package/dist/metrics/index.d.ts +4 -111
  229. package/dist/metrics/index.js +4 -452
  230. package/dist/metrics/index.js.map +1 -1
  231. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  232. package/dist/multistream/mediaRequestManager.js +344 -0
  233. package/dist/multistream/mediaRequestManager.js.map +1 -0
  234. package/dist/multistream/receiveSlot.d.ts +68 -0
  235. package/dist/multistream/receiveSlot.js +200 -0
  236. package/dist/multistream/receiveSlot.js.map +1 -0
  237. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  238. package/dist/multistream/receiveSlotManager.js +174 -0
  239. package/dist/multistream/receiveSlotManager.js.map +1 -0
  240. package/dist/multistream/remoteMedia.d.ts +72 -0
  241. package/dist/multistream/remoteMedia.js +268 -0
  242. package/dist/multistream/remoteMedia.js.map +1 -0
  243. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  244. package/dist/multistream/remoteMediaGroup.js +267 -0
  245. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  246. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  247. package/dist/multistream/remoteMediaManager.js +1211 -0
  248. package/dist/multistream/remoteMediaManager.js.map +1 -0
  249. package/dist/multistream/sendSlotManager.d.ts +61 -0
  250. package/dist/multistream/sendSlotManager.js +236 -0
  251. package/dist/multistream/sendSlotManager.js.map +1 -0
  252. package/dist/networkQualityMonitor/index.js +5 -4
  253. package/dist/networkQualityMonitor/index.js.map +1 -1
  254. package/dist/personal-meeting-room/index.js +2 -3
  255. package/dist/personal-meeting-room/index.js.map +1 -1
  256. package/dist/personal-meeting-room/request.js +2 -3
  257. package/dist/personal-meeting-room/request.js.map +1 -1
  258. package/dist/personal-meeting-room/util.js +1 -2
  259. package/dist/personal-meeting-room/util.js.map +1 -1
  260. package/dist/reachability/index.d.ts +62 -7
  261. package/dist/reachability/index.js +265 -72
  262. package/dist/reachability/index.js.map +1 -1
  263. package/dist/reachability/request.d.ts +7 -3
  264. package/dist/reachability/request.js +18 -10
  265. package/dist/reachability/request.js.map +1 -1
  266. package/dist/reactions/constants.d.ts +3 -0
  267. package/dist/reactions/constants.js +12 -0
  268. package/dist/reactions/constants.js.map +1 -0
  269. package/dist/reactions/reactions.d.ts +2 -2
  270. package/dist/reactions/reactions.js +4 -6
  271. package/dist/reactions/reactions.js.map +1 -1
  272. package/dist/reactions/reactions.type.d.ts +23 -3
  273. package/dist/reactions/reactions.type.js +21 -23
  274. package/dist/reactions/reactions.type.js.map +1 -1
  275. package/dist/reconnection-manager/index.d.ts +32 -8
  276. package/dist/reconnection-manager/index.js +282 -231
  277. package/dist/reconnection-manager/index.js.map +1 -1
  278. package/dist/recording-controller/enums.js +4 -5
  279. package/dist/recording-controller/enums.js.map +1 -1
  280. package/dist/recording-controller/index.d.ts +15 -1
  281. package/dist/recording-controller/index.js +57 -46
  282. package/dist/recording-controller/index.js.map +1 -1
  283. package/dist/recording-controller/util.d.ts +5 -4
  284. package/dist/recording-controller/util.js +10 -10
  285. package/dist/recording-controller/util.js.map +1 -1
  286. package/dist/roap/index.d.ts +9 -47
  287. package/dist/roap/index.js +101 -235
  288. package/dist/roap/index.js.map +1 -1
  289. package/dist/roap/request.d.ts +18 -12
  290. package/dist/roap/request.js +126 -180
  291. package/dist/roap/request.js.map +1 -1
  292. package/dist/roap/turnDiscovery.d.ts +27 -16
  293. package/dist/roap/turnDiscovery.js +115 -105
  294. package/dist/roap/turnDiscovery.js.map +1 -1
  295. package/dist/rtcMetrics/constants.d.ts +4 -0
  296. package/dist/rtcMetrics/constants.js +11 -0
  297. package/dist/rtcMetrics/constants.js.map +1 -0
  298. package/dist/rtcMetrics/index.d.ts +54 -0
  299. package/dist/rtcMetrics/index.js +140 -0
  300. package/dist/rtcMetrics/index.js.map +1 -0
  301. package/dist/statsAnalyzer/global.d.ts +1 -83
  302. package/dist/statsAnalyzer/global.js +2 -85
  303. package/dist/statsAnalyzer/global.js.map +1 -1
  304. package/dist/statsAnalyzer/index.d.ts +28 -30
  305. package/dist/statsAnalyzer/index.js +374 -509
  306. package/dist/statsAnalyzer/index.js.map +1 -1
  307. package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
  308. package/dist/statsAnalyzer/mqaUtil.js +116 -83
  309. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  310. package/dist/transcription/index.js +1 -2
  311. package/dist/transcription/index.js.map +1 -1
  312. package/dist/webinar/collection.d.ts +16 -0
  313. package/dist/webinar/collection.js +43 -0
  314. package/dist/webinar/collection.js.map +1 -0
  315. package/dist/webinar/index.d.ts +5 -0
  316. package/dist/webinar/index.js +68 -0
  317. package/dist/webinar/index.js.map +1 -0
  318. package/package.json +35 -26
  319. package/src/annotation/annotation.types.ts +50 -0
  320. package/src/annotation/constants.ts +36 -0
  321. package/src/annotation/index.ts +328 -0
  322. package/src/breakouts/README.md +220 -0
  323. package/src/breakouts/breakout.ts +188 -0
  324. package/src/breakouts/collection.ts +19 -0
  325. package/src/breakouts/edit-lock-error.ts +25 -0
  326. package/src/breakouts/events.ts +56 -0
  327. package/src/breakouts/index.ts +925 -0
  328. package/src/breakouts/request.ts +55 -0
  329. package/src/breakouts/utils.ts +57 -0
  330. package/src/common/errors/no-meeting-info.ts +24 -0
  331. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  332. package/src/common/errors/webex-errors.ts +36 -12
  333. package/src/common/logs/logger-proxy.ts +1 -1
  334. package/src/common/logs/request.ts +5 -1
  335. package/src/common/queue.ts +22 -8
  336. package/src/config.ts +5 -7
  337. package/src/constants.ts +271 -93
  338. package/src/controls-options-manager/enums.ts +12 -0
  339. package/src/controls-options-manager/index.ts +116 -21
  340. package/src/controls-options-manager/types.ts +59 -0
  341. package/src/controls-options-manager/util.ts +294 -14
  342. package/src/index.ts +40 -0
  343. package/src/interpretation/README.md +60 -0
  344. package/src/interpretation/collection.ts +19 -0
  345. package/src/interpretation/index.ts +332 -0
  346. package/src/interpretation/siLanguage.ts +18 -0
  347. package/src/locus-info/controlsUtils.ts +110 -0
  348. package/src/locus-info/index.ts +449 -61
  349. package/src/locus-info/infoUtils.ts +14 -2
  350. package/src/locus-info/mediaSharesUtils.ts +64 -0
  351. package/src/locus-info/parser.ts +258 -47
  352. package/src/locus-info/selfUtils.ts +85 -2
  353. package/src/media/index.ts +153 -370
  354. package/src/media/properties.ts +106 -136
  355. package/src/media/util.ts +0 -21
  356. package/src/mediaQualityMetrics/config.ts +244 -377
  357. package/src/meeting/in-meeting-actions.ts +176 -0
  358. package/src/meeting/index.ts +3895 -2448
  359. package/src/meeting/locusMediaRequest.ts +313 -0
  360. package/src/meeting/muteState.ts +224 -138
  361. package/src/meeting/request.ts +207 -127
  362. package/src/meeting/request.type.ts +13 -0
  363. package/src/meeting/util.ts +590 -423
  364. package/src/meeting-info/index.ts +81 -8
  365. package/src/meeting-info/meeting-info-v2.ts +163 -13
  366. package/src/meeting-info/util.ts +1 -1
  367. package/src/meeting-info/utilv2.ts +28 -28
  368. package/src/meetings/collection.ts +33 -0
  369. package/src/meetings/index.ts +486 -126
  370. package/src/meetings/meetings.types.ts +12 -0
  371. package/src/meetings/request.ts +2 -0
  372. package/src/meetings/util.ts +116 -5
  373. package/src/member/index.ts +52 -1
  374. package/src/member/types.ts +38 -0
  375. package/src/member/util.ts +139 -28
  376. package/src/members/collection.ts +8 -0
  377. package/src/members/index.ts +196 -7
  378. package/src/members/request.ts +97 -17
  379. package/src/members/types.ts +29 -0
  380. package/src/members/util.ts +333 -240
  381. package/src/metrics/constants.ts +15 -6
  382. package/src/metrics/index.ts +1 -471
  383. package/src/multistream/mediaRequestManager.ts +440 -0
  384. package/src/multistream/receiveSlot.ts +184 -0
  385. package/src/multistream/receiveSlotManager.ts +166 -0
  386. package/src/multistream/remoteMedia.ts +254 -0
  387. package/src/multistream/remoteMediaGroup.ts +284 -0
  388. package/src/multistream/remoteMediaManager.ts +1145 -0
  389. package/src/multistream/sendSlotManager.ts +170 -0
  390. package/src/networkQualityMonitor/index.ts +6 -6
  391. package/src/reachability/index.ts +238 -45
  392. package/src/reachability/request.ts +17 -8
  393. package/src/reactions/constants.ts +4 -0
  394. package/src/reactions/reactions.ts +4 -4
  395. package/src/reactions/reactions.type.ts +30 -4
  396. package/src/reconnection-manager/index.ts +168 -156
  397. package/src/recording-controller/index.ts +20 -3
  398. package/src/recording-controller/util.ts +26 -9
  399. package/src/roap/index.ts +98 -241
  400. package/src/roap/request.ts +74 -148
  401. package/src/roap/turnDiscovery.ts +62 -56
  402. package/src/rtcMetrics/constants.ts +3 -0
  403. package/src/rtcMetrics/index.ts +124 -0
  404. package/src/statsAnalyzer/global.ts +1 -84
  405. package/src/statsAnalyzer/index.ts +413 -642
  406. package/src/statsAnalyzer/mqaUtil.ts +111 -114
  407. package/src/webinar/collection.ts +31 -0
  408. package/src/webinar/index.ts +62 -0
  409. package/test/integration/spec/converged-space-meetings.js +233 -0
  410. package/test/integration/spec/journey.js +320 -264
  411. package/test/integration/spec/space-meeting.js +77 -4
  412. package/test/unit/spec/annotation/index.ts +418 -0
  413. package/test/unit/spec/breakouts/breakout.ts +237 -0
  414. package/test/unit/spec/breakouts/collection.ts +15 -0
  415. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  416. package/test/unit/spec/breakouts/events.ts +89 -0
  417. package/test/unit/spec/breakouts/index.ts +1790 -0
  418. package/test/unit/spec/breakouts/request.ts +104 -0
  419. package/test/unit/spec/breakouts/utils.js +72 -0
  420. package/test/unit/spec/common/queue.js +31 -2
  421. package/test/unit/spec/controls-options-manager/index.js +163 -0
  422. package/test/unit/spec/controls-options-manager/util.js +576 -60
  423. package/test/unit/spec/fixture/locus.js +1 -0
  424. package/test/unit/spec/interpretation/collection.ts +15 -0
  425. package/test/unit/spec/interpretation/index.ts +589 -0
  426. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  427. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  428. package/test/unit/spec/locus-info/index.js +1390 -16
  429. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  430. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  431. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  432. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  433. package/test/unit/spec/locus-info/parser.js +116 -35
  434. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  435. package/test/unit/spec/media/index.ts +290 -0
  436. package/test/unit/spec/media/properties.ts +75 -84
  437. package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
  438. package/test/unit/spec/meeting/index.js +8181 -2770
  439. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  440. package/test/unit/spec/meeting/muteState.js +409 -213
  441. package/test/unit/spec/meeting/request.js +512 -42
  442. package/test/unit/spec/meeting/utils.js +741 -24
  443. package/test/unit/spec/meeting-info/index.js +300 -0
  444. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  445. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  446. package/test/unit/spec/meetings/collection.js +26 -0
  447. package/test/unit/spec/meetings/index.js +1284 -217
  448. package/test/unit/spec/meetings/utils.js +202 -2
  449. package/test/unit/spec/member/index.js +38 -8
  450. package/test/unit/spec/member/util.js +499 -29
  451. package/test/unit/spec/members/index.js +597 -3
  452. package/test/unit/spec/members/request.js +206 -27
  453. package/test/unit/spec/members/utils.js +210 -0
  454. package/test/unit/spec/metrics/index.js +1 -50
  455. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  456. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  457. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  458. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  459. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  460. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  461. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  462. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  463. package/test/unit/spec/reachability/index.ts +598 -24
  464. package/test/unit/spec/reachability/request.js +68 -0
  465. package/test/unit/spec/reconnection-manager/index.js +162 -24
  466. package/test/unit/spec/recording-controller/index.js +293 -218
  467. package/test/unit/spec/recording-controller/util.js +223 -96
  468. package/test/unit/spec/roap/index.ts +200 -76
  469. package/test/unit/spec/roap/request.ts +232 -0
  470. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  471. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  472. package/test/unit/spec/stats-analyzer/index.js +188 -174
  473. package/test/unit/spec/webinar/collection.ts +13 -0
  474. package/test/unit/spec/webinar/index.ts +60 -0
  475. package/test/utils/constants.js +9 -0
  476. package/test/utils/integrationTestUtils.js +46 -0
  477. package/test/utils/testUtils.js +0 -45
  478. package/test/utils/webex-config.js +4 -0
  479. package/test/utils/webex-test-users.js +7 -3
  480. package/dist/meeting/effectsState.d.ts +0 -42
  481. package/dist/meeting/effectsState.js +0 -260
  482. package/dist/meeting/effectsState.js.map +0 -1
  483. package/dist/metrics/config.d.ts +0 -169
  484. package/dist/metrics/config.js +0 -289
  485. package/dist/metrics/config.js.map +0 -1
  486. package/dist/peer-connection-manager/index.d.ts +0 -6
  487. package/dist/peer-connection-manager/index.js +0 -671
  488. package/dist/peer-connection-manager/index.js.map +0 -1
  489. package/dist/peer-connection-manager/util.d.ts +0 -6
  490. package/dist/peer-connection-manager/util.js +0 -110
  491. package/dist/peer-connection-manager/util.js.map +0 -1
  492. package/dist/roap/collection.d.ts +0 -10
  493. package/dist/roap/collection.js +0 -63
  494. package/dist/roap/collection.js.map +0 -1
  495. package/dist/roap/handler.d.ts +0 -47
  496. package/dist/roap/handler.js +0 -279
  497. package/dist/roap/handler.js.map +0 -1
  498. package/dist/roap/state.d.ts +0 -9
  499. package/dist/roap/state.js +0 -127
  500. package/dist/roap/state.js.map +0 -1
  501. package/dist/roap/util.d.ts +0 -2
  502. package/dist/roap/util.js +0 -76
  503. package/dist/roap/util.js.map +0 -1
  504. package/src/index.js +0 -15
  505. package/src/meeting/effectsState.ts +0 -209
  506. package/src/metrics/config.ts +0 -485
  507. package/src/peer-connection-manager/index.ts +0 -847
  508. package/src/peer-connection-manager/util.ts +0 -119
  509. package/src/roap/collection.ts +0 -62
  510. package/src/roap/handler.ts +0 -294
  511. package/src/roap/state.ts +0 -156
  512. package/src/roap/util.ts +0 -100
  513. package/test/unit/spec/meeting/effectsState.js +0 -281
  514. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  515. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  516. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  517. 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,83 @@ describe('plugin-meetings', () => {
366
816
  keyUrl: conversation.encryptionKeyUrl,
367
817
  kroUrl: conversation.kmsResourceObjectUrl,
368
818
  invitees: invitee,
819
+ installedOrgID: installedOrgID
820
+ },
821
+ });
822
+ assert.calledOnce(Metrics.sendBehavioralMetric);
823
+ assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
824
+ assert.deepEqual(result, {
825
+ body: conversation,
826
+ statusCode: 200
827
+ });
828
+ });
829
+
830
+ it('Make a request to /spaceInstant when conversationUrl with installed org ID', async () => {
831
+ const {invitee} = setup();
832
+
833
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
834
+
835
+ assert.calledWith(
836
+ webex.internal.conversation.get,
837
+ {url: conversationUrl},
838
+ {includeParticipants: true, disableTransform: true}
839
+ );
840
+
841
+ assert.calledWith(webex.request, {
842
+ method: 'POST',
843
+ uri: 'https://go.webex.com/wbxappapi/v2/meetings/spaceInstant',
844
+ body: {
845
+ title: conversation.displayName,
846
+ spaceUrl: conversation.url,
847
+ keyUrl: conversation.encryptionKeyUrl,
848
+ kroUrl: conversation.kmsResourceObjectUrl,
849
+ invitees: invitee,
850
+ installedOrgID,
369
851
  },
370
852
  });
371
853
  assert(Metrics.sendBehavioralMetric.calledOnce);
372
854
  assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
373
855
  });
856
+
857
+
858
+ forEach(
859
+ [
860
+ {errorCode: 403049},
861
+ {errorCode: 403104},
862
+ {errorCode: 403103},
863
+ {errorCode: 403048},
864
+ {errorCode: 403102},
865
+ {errorCode: 403101},
866
+ ],
867
+ ({errorCode}) => {
868
+ it(`should throw a MeetingInfoV2PolicyError for error code ${errorCode}`, async () => {
869
+ const message = 'a message';
870
+ const meetingInfoData = 'meeting info';
871
+
872
+ webex.request = sinon.stub().rejects({
873
+ statusCode: 403,
874
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
875
+ });
876
+ try {
877
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
878
+ assert.fail('createAdhocSpaceMeeting should have thrown, but has not done that');
879
+ } catch (err) {
880
+ assert.instanceOf(err, MeetingInfoV2PolicyError);
881
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
882
+ assert.equal(err.wbxAppApiCode, errorCode);
883
+ assert.deepEqual(err.meetingInfo, meetingInfoData);
884
+
885
+ assert(Metrics.sendBehavioralMetric.calledOnce);
886
+ assert.calledWith(
887
+ Metrics.sendBehavioralMetric,
888
+ BEHAVIORAL_METRICS.MEETING_INFO_POLICY_ERROR,
889
+ {code: errorCode}
890
+ );
891
+
892
+ }
893
+ });
894
+ }
895
+ );
374
896
  });
375
897
  });
376
898
  });
@@ -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
  });