@webex/plugin-meetings 3.0.0-stream-classes.4 → 3.0.0

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 (469) hide show
  1. package/.eslintrc.js +6 -0
  2. package/README.md +12 -0
  3. package/babel.config.js +3 -0
  4. package/dist/annotation/constants.js +12 -20
  5. package/dist/annotation/constants.js.map +1 -1
  6. package/dist/annotation/index.js +25 -10
  7. package/dist/annotation/index.js.map +1 -1
  8. package/dist/breakouts/breakout.js +2 -3
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/collection.js +1 -2
  11. package/dist/breakouts/collection.js.map +1 -1
  12. package/dist/breakouts/edit-lock-error.js +1 -2
  13. package/dist/breakouts/edit-lock-error.js.map +1 -1
  14. package/dist/breakouts/events.js +1 -2
  15. package/dist/breakouts/events.js.map +1 -1
  16. package/dist/breakouts/index.js +13 -14
  17. package/dist/breakouts/index.js.map +1 -1
  18. package/dist/breakouts/request.js +1 -2
  19. package/dist/breakouts/request.js.map +1 -1
  20. package/dist/breakouts/utils.js +3 -6
  21. package/dist/breakouts/utils.js.map +1 -1
  22. package/dist/common/browser-detection.js +2 -3
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +3 -4
  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.d.ts +14 -0
  37. package/dist/common/errors/no-meeting-info.js +50 -0
  38. package/dist/common/errors/no-meeting-info.js.map +1 -0
  39. package/dist/common/errors/parameter.js +3 -4
  40. package/dist/common/errors/parameter.js.map +1 -1
  41. package/dist/common/errors/password-error.js +1 -2
  42. package/dist/common/errors/password-error.js.map +1 -1
  43. package/dist/common/errors/permission.js +1 -2
  44. package/dist/common/errors/permission.js.map +1 -1
  45. package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
  46. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  47. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  48. package/dist/common/errors/reconnection-in-progress.js +1 -2
  49. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  50. package/dist/common/errors/reconnection.js +1 -2
  51. package/dist/common/errors/reconnection.js.map +1 -1
  52. package/dist/common/errors/stats.js +1 -2
  53. package/dist/common/errors/stats.js.map +1 -1
  54. package/dist/{types/common → common}/errors/webex-errors.d.ts +13 -1
  55. package/dist/common/errors/webex-errors.js +35 -16
  56. package/dist/common/errors/webex-errors.js.map +1 -1
  57. package/dist/common/errors/webex-meetings-error.js +1 -2
  58. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  59. package/dist/common/events/events-scope.js +1 -2
  60. package/dist/common/events/events-scope.js.map +1 -1
  61. package/dist/common/events/events.js +1 -2
  62. package/dist/common/events/events.js.map +1 -1
  63. package/dist/common/events/trigger-proxy.js +1 -2
  64. package/dist/common/events/trigger-proxy.js.map +1 -1
  65. package/dist/common/events/util.js +1 -2
  66. package/dist/common/events/util.js.map +1 -1
  67. package/dist/common/logs/logger-config.js +1 -2
  68. package/dist/common/logs/logger-config.js.map +1 -1
  69. package/dist/common/logs/logger-proxy.js +1 -2
  70. package/dist/common/logs/logger-proxy.js.map +1 -1
  71. package/dist/{types/common → common}/logs/request.d.ts +3 -1
  72. package/dist/common/logs/request.js +8 -5
  73. package/dist/common/logs/request.js.map +1 -1
  74. package/dist/common/queue.js +2 -4
  75. package/dist/common/queue.js.map +1 -1
  76. package/dist/{types/config.d.ts → config.d.ts} +1 -1
  77. package/dist/config.js +3 -3
  78. package/dist/config.js.map +1 -1
  79. package/dist/{types/constants.d.ts → constants.d.ts} +72 -15
  80. package/dist/constants.js +254 -371
  81. package/dist/constants.js.map +1 -1
  82. package/dist/controls-options-manager/constants.js +3 -6
  83. package/dist/controls-options-manager/constants.js.map +1 -1
  84. package/dist/controls-options-manager/enums.js +7 -10
  85. package/dist/controls-options-manager/enums.js.map +1 -1
  86. package/dist/controls-options-manager/index.js +27 -32
  87. package/dist/controls-options-manager/index.js.map +1 -1
  88. package/dist/controls-options-manager/util.js +1 -2
  89. package/dist/controls-options-manager/util.js.map +1 -1
  90. package/dist/index.js +8 -5
  91. package/dist/index.js.map +1 -1
  92. package/dist/interceptors/index.d.ts +2 -0
  93. package/dist/interceptors/index.js +15 -0
  94. package/dist/interceptors/index.js.map +1 -0
  95. package/dist/interceptors/locusRetry.d.ts +27 -0
  96. package/dist/interceptors/locusRetry.js +94 -0
  97. package/dist/interceptors/locusRetry.js.map +1 -0
  98. package/dist/interpretation/collection.js +1 -2
  99. package/dist/interpretation/collection.js.map +1 -1
  100. package/dist/interpretation/index.js +2 -3
  101. package/dist/interpretation/index.js.map +1 -1
  102. package/dist/interpretation/siLanguage.js +2 -3
  103. package/dist/interpretation/siLanguage.js.map +1 -1
  104. package/dist/locus-info/controlsUtils.js +12 -13
  105. package/dist/locus-info/controlsUtils.js.map +1 -1
  106. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  107. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  108. package/dist/locus-info/fullState.js +1 -2
  109. package/dist/locus-info/fullState.js.map +1 -1
  110. package/dist/locus-info/hostUtils.js +1 -2
  111. package/dist/locus-info/hostUtils.js.map +1 -1
  112. package/dist/{types/locus-info → locus-info}/index.d.ts +1 -1
  113. package/dist/locus-info/index.js +63 -38
  114. package/dist/locus-info/index.js.map +1 -1
  115. package/dist/locus-info/infoUtils.js +3 -4
  116. package/dist/locus-info/infoUtils.js.map +1 -1
  117. package/dist/locus-info/mediaSharesUtils.js +16 -3
  118. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  119. package/dist/{types/locus-info → locus-info}/parser.d.ts +3 -2
  120. package/dist/locus-info/parser.js +48 -31
  121. package/dist/locus-info/parser.js.map +1 -1
  122. package/dist/locus-info/selfUtils.js +7 -6
  123. package/dist/locus-info/selfUtils.js.map +1 -1
  124. package/dist/media/index.js +15 -10
  125. package/dist/media/index.js.map +1 -1
  126. package/dist/media/properties.js +16 -7
  127. package/dist/media/properties.js.map +1 -1
  128. package/dist/media/util.js +1 -2
  129. package/dist/media/util.js.map +1 -1
  130. package/dist/mediaQualityMetrics/config.d.ts +241 -0
  131. package/dist/mediaQualityMetrics/config.js +135 -339
  132. package/dist/mediaQualityMetrics/config.js.map +1 -1
  133. package/dist/{types/meeting → meeting}/in-meeting-actions.d.ts +4 -0
  134. package/dist/meeting/in-meeting-actions.js +18 -2
  135. package/dist/meeting/in-meeting-actions.js.map +1 -1
  136. package/dist/{types/meeting → meeting}/index.d.ts +331 -44
  137. package/dist/meeting/index.js +2639 -1367
  138. package/dist/meeting/index.js.map +1 -1
  139. package/dist/{types/meeting → meeting}/locusMediaRequest.d.ts +1 -2
  140. package/dist/meeting/locusMediaRequest.js +4 -5
  141. package/dist/meeting/locusMediaRequest.js.map +1 -1
  142. package/dist/meeting/muteState.js +2 -4
  143. package/dist/meeting/muteState.js.map +1 -1
  144. package/dist/{types/meeting → meeting}/request.d.ts +4 -1
  145. package/dist/meeting/request.js +47 -32
  146. package/dist/meeting/request.js.map +1 -1
  147. package/dist/meeting/state.js +1 -2
  148. package/dist/meeting/state.js.map +1 -1
  149. package/dist/{types/meeting → meeting}/util.d.ts +26 -1
  150. package/dist/meeting/util.js +83 -10
  151. package/dist/meeting/util.js.map +1 -1
  152. package/dist/meeting/voicea-meeting.d.ts +16 -0
  153. package/dist/meeting/voicea-meeting.js +169 -0
  154. package/dist/meeting/voicea-meeting.js.map +1 -0
  155. package/dist/meeting-info/collection.js +3 -4
  156. package/dist/meeting-info/collection.js.map +1 -1
  157. package/dist/{types/meeting-info → meeting-info}/index.d.ts +7 -0
  158. package/dist/meeting-info/index.js +53 -27
  159. package/dist/meeting-info/index.js.map +1 -1
  160. package/dist/{types/meeting-info → meeting-info}/meeting-info-v2.d.ts +1 -0
  161. package/dist/meeting-info/meeting-info-v2.js +52 -33
  162. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  163. package/dist/meeting-info/request.js +1 -2
  164. package/dist/meeting-info/request.js.map +1 -1
  165. package/dist/meeting-info/util.js +8 -8
  166. package/dist/meeting-info/util.js.map +1 -1
  167. package/dist/meeting-info/utilv2.js +12 -9
  168. package/dist/meeting-info/utilv2.js.map +1 -1
  169. package/dist/{types/meetings → meetings}/collection.d.ts +9 -0
  170. package/dist/meetings/collection.js +21 -5
  171. package/dist/meetings/collection.js.map +1 -1
  172. package/dist/{types/meetings → meetings}/index.d.ts +45 -16
  173. package/dist/meetings/index.js +166 -74
  174. package/dist/meetings/index.js.map +1 -1
  175. package/dist/meetings/request.js +2 -3
  176. package/dist/meetings/request.js.map +1 -1
  177. package/dist/meetings/util.js +3 -10
  178. package/dist/meetings/util.js.map +1 -1
  179. package/dist/{types/member → member}/index.d.ts +1 -0
  180. package/dist/member/index.js +10 -3
  181. package/dist/member/index.js.map +1 -1
  182. package/dist/member/member.types.d.ts +11 -0
  183. package/dist/member/member.types.js +17 -0
  184. package/dist/member/member.types.js.map +1 -0
  185. package/dist/member/types.js +6 -8
  186. package/dist/member/types.js.map +1 -1
  187. package/dist/member/util.js +12 -2
  188. package/dist/member/util.js.map +1 -1
  189. package/dist/members/collection.js +1 -2
  190. package/dist/members/collection.js.map +1 -1
  191. package/dist/members/index.js +25 -8
  192. package/dist/members/index.js.map +1 -1
  193. package/dist/members/request.js +2 -3
  194. package/dist/members/request.js.map +1 -1
  195. package/dist/{types/members → members}/types.d.ts +1 -0
  196. package/dist/members/types.js +3 -4
  197. package/dist/members/types.js.map +1 -1
  198. package/dist/{types/members → members}/util.d.ts +6 -1
  199. package/dist/members/util.js +18 -8
  200. package/dist/members/util.js.map +1 -1
  201. package/dist/{types/metrics → metrics}/constants.d.ts +15 -0
  202. package/dist/metrics/constants.js +16 -3
  203. package/dist/metrics/constants.js.map +1 -1
  204. package/dist/metrics/index.js +3 -2
  205. package/dist/metrics/index.js.map +1 -1
  206. package/dist/multistream/mediaRequestManager.js +9 -11
  207. package/dist/multistream/mediaRequestManager.js.map +1 -1
  208. package/dist/multistream/receiveSlot.js +3 -5
  209. package/dist/multistream/receiveSlot.js.map +1 -1
  210. package/dist/multistream/receiveSlotManager.js +7 -9
  211. package/dist/multistream/receiveSlotManager.js.map +1 -1
  212. package/dist/multistream/remoteMedia.js +3 -5
  213. package/dist/multistream/remoteMedia.js.map +1 -1
  214. package/dist/multistream/remoteMediaGroup.js +7 -6
  215. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  216. package/dist/{types/multistream → multistream}/remoteMediaManager.d.ts +9 -1
  217. package/dist/multistream/remoteMediaManager.js +74 -36
  218. package/dist/multistream/remoteMediaManager.js.map +1 -1
  219. package/dist/multistream/sendSlotManager.js +9 -6
  220. package/dist/multistream/sendSlotManager.js.map +1 -1
  221. package/dist/networkQualityMonitor/index.js +1 -2
  222. package/dist/networkQualityMonitor/index.js.map +1 -1
  223. package/dist/personal-meeting-room/index.js +2 -3
  224. package/dist/personal-meeting-room/index.js.map +1 -1
  225. package/dist/personal-meeting-room/request.js +2 -3
  226. package/dist/personal-meeting-room/request.js.map +1 -1
  227. package/dist/personal-meeting-room/util.js +1 -2
  228. package/dist/personal-meeting-room/util.js.map +1 -1
  229. package/dist/reachability/clusterReachability.d.ts +109 -0
  230. package/dist/reachability/clusterReachability.js +357 -0
  231. package/dist/reachability/clusterReachability.js.map +1 -0
  232. package/dist/reachability/index.d.ts +105 -0
  233. package/dist/reachability/index.js +279 -436
  234. package/dist/reachability/index.js.map +1 -1
  235. package/dist/{types/reachability → reachability}/request.d.ts +1 -1
  236. package/dist/reachability/request.js +14 -11
  237. package/dist/reachability/request.js.map +1 -1
  238. package/dist/reachability/util.d.ts +8 -0
  239. package/dist/reachability/util.js +29 -0
  240. package/dist/reachability/util.js.map +1 -0
  241. package/dist/reactions/constants.js +1 -2
  242. package/dist/reactions/constants.js.map +1 -1
  243. package/dist/reactions/reactions.js +2 -4
  244. package/dist/reactions/reactions.js.map +1 -1
  245. package/dist/reactions/reactions.type.js +6 -8
  246. package/dist/reactions/reactions.type.js.map +1 -1
  247. package/dist/{types/reconnection-manager → reconnection-manager}/index.d.ts +10 -0
  248. package/dist/reconnection-manager/index.js +129 -106
  249. package/dist/reconnection-manager/index.js.map +1 -1
  250. package/dist/recording-controller/enums.js +4 -5
  251. package/dist/recording-controller/enums.js.map +1 -1
  252. package/dist/recording-controller/index.js +43 -51
  253. package/dist/recording-controller/index.js.map +1 -1
  254. package/dist/recording-controller/util.js +1 -2
  255. package/dist/recording-controller/util.js.map +1 -1
  256. package/dist/{types/roap → roap}/index.d.ts +2 -1
  257. package/dist/roap/index.js +59 -28
  258. package/dist/roap/index.js.map +1 -1
  259. package/dist/{types/roap → roap}/request.d.ts +2 -1
  260. package/dist/roap/request.js +14 -22
  261. package/dist/roap/request.js.map +1 -1
  262. package/dist/{types/roap → roap}/turnDiscovery.d.ts +21 -4
  263. package/dist/roap/turnDiscovery.js +182 -89
  264. package/dist/roap/turnDiscovery.js.map +1 -1
  265. package/dist/rtcMetrics/constants.js +1 -2
  266. package/dist/rtcMetrics/constants.js.map +1 -1
  267. package/dist/{types/rtcMetrics → rtcMetrics}/index.d.ts +15 -1
  268. package/dist/rtcMetrics/index.js +72 -12
  269. package/dist/rtcMetrics/index.js.map +1 -1
  270. package/dist/statsAnalyzer/global.js +1 -2
  271. package/dist/statsAnalyzer/global.js.map +1 -1
  272. package/dist/{types/statsAnalyzer → statsAnalyzer}/index.d.ts +28 -11
  273. package/dist/statsAnalyzer/index.js +371 -318
  274. package/dist/statsAnalyzer/index.js.map +1 -1
  275. package/dist/statsAnalyzer/mqaUtil.d.ts +48 -0
  276. package/dist/statsAnalyzer/mqaUtil.js +295 -162
  277. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  278. package/dist/transcription/index.js +1 -2
  279. package/dist/transcription/index.js.map +1 -1
  280. package/dist/webinar/collection.d.ts +16 -0
  281. package/dist/webinar/collection.js +43 -0
  282. package/dist/webinar/collection.js.map +1 -0
  283. package/dist/webinar/index.d.ts +5 -0
  284. package/dist/webinar/index.js +68 -0
  285. package/dist/webinar/index.js.map +1 -0
  286. package/jest.config.js +3 -0
  287. package/package.json +44 -24
  288. package/process +1 -0
  289. package/src/common/errors/no-meeting-info.ts +24 -0
  290. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  291. package/src/common/errors/webex-errors.ts +19 -2
  292. package/src/common/logs/request.ts +5 -1
  293. package/src/config.ts +3 -5
  294. package/src/constants.ts +78 -8
  295. package/src/index.ts +4 -0
  296. package/src/interceptors/index.ts +3 -0
  297. package/src/interceptors/locusRetry.ts +67 -0
  298. package/src/locus-info/index.ts +52 -16
  299. package/src/locus-info/mediaSharesUtils.ts +16 -0
  300. package/src/locus-info/parser.ts +47 -21
  301. package/src/media/index.ts +8 -6
  302. package/src/media/properties.ts +17 -2
  303. package/src/mediaQualityMetrics/config.ts +103 -238
  304. package/src/meeting/in-meeting-actions.ts +8 -0
  305. package/src/meeting/index.ts +1692 -627
  306. package/src/meeting/request.ts +19 -1
  307. package/src/meeting/util.ts +102 -1
  308. package/src/meeting/voicea-meeting.ts +122 -0
  309. package/src/meeting-info/index.ts +47 -20
  310. package/src/meeting-info/meeting-info-v2.ts +32 -16
  311. package/src/meeting-info/util.ts +12 -9
  312. package/src/meeting-info/utilv2.ts +25 -15
  313. package/src/meetings/collection.ts +13 -0
  314. package/src/meetings/index.ts +112 -31
  315. package/src/meetings/util.ts +2 -8
  316. package/src/member/index.ts +9 -1
  317. package/src/member/member.types.ts +13 -0
  318. package/src/member/util.ts +14 -0
  319. package/src/members/index.ts +29 -2
  320. package/src/members/types.ts +1 -0
  321. package/src/members/util.ts +15 -1
  322. package/src/metrics/constants.ts +14 -0
  323. package/src/multistream/remoteMediaManager.ts +41 -4
  324. package/src/reachability/clusterReachability.ts +320 -0
  325. package/src/reachability/index.ts +221 -382
  326. package/src/reachability/request.ts +1 -1
  327. package/src/reachability/util.ts +24 -0
  328. package/src/reconnection-manager/index.ts +87 -83
  329. package/src/roap/index.ts +60 -24
  330. package/src/roap/request.ts +4 -17
  331. package/src/roap/turnDiscovery.ts +112 -39
  332. package/src/rtcMetrics/index.ts +71 -5
  333. package/src/statsAnalyzer/index.ts +430 -427
  334. package/src/statsAnalyzer/mqaUtil.ts +317 -168
  335. package/src/webinar/collection.ts +31 -0
  336. package/src/webinar/index.ts +62 -0
  337. package/test/integration/spec/converged-space-meetings.js +7 -7
  338. package/test/integration/spec/journey.js +88 -106
  339. package/test/integration/spec/space-meeting.js +10 -10
  340. package/test/unit/spec/breakouts/breakout.ts +2 -1
  341. package/test/unit/spec/breakouts/index.ts +7 -4
  342. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  343. package/test/unit/spec/locus-info/index.js +206 -13
  344. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  345. package/test/unit/spec/locus-info/mediaSharesUtils.ts +10 -0
  346. package/test/unit/spec/locus-info/parser.js +54 -13
  347. package/test/unit/spec/locus-info/selfUtils.js +1 -1
  348. package/test/unit/spec/media/index.ts +25 -4
  349. package/test/unit/spec/media/properties.ts +2 -2
  350. package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
  351. package/test/unit/spec/meeting/index.js +4354 -1285
  352. package/test/unit/spec/meeting/request.js +63 -12
  353. package/test/unit/spec/meeting/utils.js +145 -10
  354. package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
  355. package/test/unit/spec/meeting-info/index.js +180 -61
  356. package/test/unit/spec/meeting-info/meetinginfov2.js +216 -68
  357. package/test/unit/spec/meetings/collection.js +12 -0
  358. package/test/unit/spec/meetings/index.js +676 -195
  359. package/test/unit/spec/meetings/utils.js +35 -12
  360. package/test/unit/spec/member/index.js +8 -7
  361. package/test/unit/spec/member/util.js +32 -0
  362. package/test/unit/spec/members/index.js +130 -17
  363. package/test/unit/spec/members/utils.js +26 -0
  364. package/test/unit/spec/metrics/index.js +1 -2
  365. package/test/unit/spec/multistream/mediaRequestManager.ts +1 -0
  366. package/test/unit/spec/multistream/remoteMediaManager.ts +10 -2
  367. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  368. package/test/unit/spec/reachability/index.ts +505 -135
  369. package/test/unit/spec/reachability/util.ts +40 -0
  370. package/test/unit/spec/reconnection-manager/index.js +74 -17
  371. package/test/unit/spec/recording-controller/index.js +0 -1
  372. package/test/unit/spec/roap/index.ts +181 -61
  373. package/test/unit/spec/roap/request.ts +27 -3
  374. package/test/unit/spec/roap/turnDiscovery.ts +363 -102
  375. package/test/unit/spec/rtcMetrics/index.ts +57 -3
  376. package/test/unit/spec/stats-analyzer/index.js +1225 -12
  377. package/test/unit/spec/webinar/collection.ts +13 -0
  378. package/test/unit/spec/webinar/index.ts +60 -0
  379. package/test/utils/integrationTestUtils.js +4 -4
  380. package/test/utils/webex-test-users.js +12 -4
  381. package/dist/types/mediaQualityMetrics/config.d.ts +0 -365
  382. package/dist/types/reachability/index.d.ts +0 -158
  383. package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -24
  384. /package/dist/{types/annotation → annotation}/annotation.types.d.ts +0 -0
  385. /package/dist/{types/annotation → annotation}/constants.d.ts +0 -0
  386. /package/dist/{types/annotation → annotation}/index.d.ts +0 -0
  387. /package/dist/{types/breakouts → breakouts}/breakout.d.ts +0 -0
  388. /package/dist/{types/breakouts → breakouts}/collection.d.ts +0 -0
  389. /package/dist/{types/breakouts → breakouts}/edit-lock-error.d.ts +0 -0
  390. /package/dist/{types/breakouts → breakouts}/events.d.ts +0 -0
  391. /package/dist/{types/breakouts → breakouts}/index.d.ts +0 -0
  392. /package/dist/{types/breakouts → breakouts}/request.d.ts +0 -0
  393. /package/dist/{types/breakouts → breakouts}/utils.d.ts +0 -0
  394. /package/dist/{types/common → common}/browser-detection.d.ts +0 -0
  395. /package/dist/{types/common → common}/collection.d.ts +0 -0
  396. /package/dist/{types/common → common}/config.d.ts +0 -0
  397. /package/dist/{types/common → common}/errors/captcha-error.d.ts +0 -0
  398. /package/dist/{types/common → common}/errors/intent-to-join.d.ts +0 -0
  399. /package/dist/{types/common → common}/errors/join-meeting.d.ts +0 -0
  400. /package/dist/{types/common → common}/errors/media.d.ts +0 -0
  401. /package/dist/{types/common → common}/errors/parameter.d.ts +0 -0
  402. /package/dist/{types/common → common}/errors/password-error.d.ts +0 -0
  403. /package/dist/{types/common → common}/errors/permission.d.ts +0 -0
  404. /package/dist/{types/common → common}/errors/reconnection-in-progress.d.ts +0 -0
  405. /package/dist/{types/common → common}/errors/reconnection.d.ts +0 -0
  406. /package/dist/{types/common → common}/errors/stats.d.ts +0 -0
  407. /package/dist/{types/common → common}/errors/webex-meetings-error.d.ts +0 -0
  408. /package/dist/{types/common → common}/events/events-scope.d.ts +0 -0
  409. /package/dist/{types/common → common}/events/events.d.ts +0 -0
  410. /package/dist/{types/common → common}/events/trigger-proxy.d.ts +0 -0
  411. /package/dist/{types/common → common}/events/util.d.ts +0 -0
  412. /package/dist/{types/common → common}/logs/logger-config.d.ts +0 -0
  413. /package/dist/{types/common → common}/logs/logger-proxy.d.ts +0 -0
  414. /package/dist/{types/common → common}/queue.d.ts +0 -0
  415. /package/dist/{types/controls-options-manager → controls-options-manager}/constants.d.ts +0 -0
  416. /package/dist/{types/controls-options-manager → controls-options-manager}/enums.d.ts +0 -0
  417. /package/dist/{types/controls-options-manager → controls-options-manager}/index.d.ts +0 -0
  418. /package/dist/{types/controls-options-manager → controls-options-manager}/types.d.ts +0 -0
  419. /package/dist/{types/controls-options-manager → controls-options-manager}/util.d.ts +0 -0
  420. /package/dist/{types/index.d.ts → index.d.ts} +0 -0
  421. /package/dist/{types/interpretation → interpretation}/collection.d.ts +0 -0
  422. /package/dist/{types/interpretation → interpretation}/index.d.ts +0 -0
  423. /package/dist/{types/interpretation → interpretation}/siLanguage.d.ts +0 -0
  424. /package/dist/{types/locus-info → locus-info}/controlsUtils.d.ts +0 -0
  425. /package/dist/{types/locus-info → locus-info}/embeddedAppsUtils.d.ts +0 -0
  426. /package/dist/{types/locus-info → locus-info}/fullState.d.ts +0 -0
  427. /package/dist/{types/locus-info → locus-info}/hostUtils.d.ts +0 -0
  428. /package/dist/{types/locus-info → locus-info}/infoUtils.d.ts +0 -0
  429. /package/dist/{types/locus-info → locus-info}/mediaSharesUtils.d.ts +0 -0
  430. /package/dist/{types/locus-info → locus-info}/selfUtils.d.ts +0 -0
  431. /package/dist/{types/media → media}/index.d.ts +0 -0
  432. /package/dist/{types/media → media}/properties.d.ts +0 -0
  433. /package/dist/{types/media → media}/util.d.ts +0 -0
  434. /package/dist/{types/meeting → meeting}/muteState.d.ts +0 -0
  435. /package/dist/{types/meeting → meeting}/request.type.d.ts +0 -0
  436. /package/dist/{types/meeting → meeting}/state.d.ts +0 -0
  437. /package/dist/{types/meeting-info → meeting-info}/collection.d.ts +0 -0
  438. /package/dist/{types/meeting-info → meeting-info}/request.d.ts +0 -0
  439. /package/dist/{types/meeting-info → meeting-info}/util.d.ts +0 -0
  440. /package/dist/{types/meeting-info → meeting-info}/utilv2.d.ts +0 -0
  441. /package/dist/{types/meetings → meetings}/meetings.types.d.ts +0 -0
  442. /package/dist/{types/meetings → meetings}/request.d.ts +0 -0
  443. /package/dist/{types/meetings → meetings}/util.d.ts +0 -0
  444. /package/dist/{types/member → member}/types.d.ts +0 -0
  445. /package/dist/{types/member → member}/util.d.ts +0 -0
  446. /package/dist/{types/members → members}/collection.d.ts +0 -0
  447. /package/dist/{types/members → members}/index.d.ts +0 -0
  448. /package/dist/{types/members → members}/request.d.ts +0 -0
  449. /package/dist/{types/metrics → metrics}/index.d.ts +0 -0
  450. /package/dist/{types/multistream → multistream}/mediaRequestManager.d.ts +0 -0
  451. /package/dist/{types/multistream → multistream}/receiveSlot.d.ts +0 -0
  452. /package/dist/{types/multistream → multistream}/receiveSlotManager.d.ts +0 -0
  453. /package/dist/{types/multistream → multistream}/remoteMedia.d.ts +0 -0
  454. /package/dist/{types/multistream → multistream}/remoteMediaGroup.d.ts +0 -0
  455. /package/dist/{types/multistream → multistream}/sendSlotManager.d.ts +0 -0
  456. /package/dist/{types/networkQualityMonitor → networkQualityMonitor}/index.d.ts +0 -0
  457. /package/dist/{types/personal-meeting-room → personal-meeting-room}/index.d.ts +0 -0
  458. /package/dist/{types/personal-meeting-room → personal-meeting-room}/request.d.ts +0 -0
  459. /package/dist/{types/personal-meeting-room → personal-meeting-room}/util.d.ts +0 -0
  460. /package/dist/{types/reactions → reactions}/constants.d.ts +0 -0
  461. /package/dist/{types/reactions → reactions}/reactions.d.ts +0 -0
  462. /package/dist/{types/reactions → reactions}/reactions.type.d.ts +0 -0
  463. /package/dist/{types/recording-controller → recording-controller}/enums.d.ts +0 -0
  464. /package/dist/{types/recording-controller → recording-controller}/index.d.ts +0 -0
  465. /package/dist/{types/recording-controller → recording-controller}/util.d.ts +0 -0
  466. /package/dist/{types/rtcMetrics → rtcMetrics}/constants.d.ts +0 -0
  467. /package/dist/{types/statsAnalyzer → statsAnalyzer}/global.d.ts +0 -0
  468. /package/dist/{types/transcription → transcription}/index.d.ts +0 -0
  469. /package/test/unit/spec/locus-info/{selfConstant.js → lib/selfConstant.js} +0 -0
@@ -3,6 +3,10 @@
3
3
  */
4
4
  import 'jsdom-global/register';
5
5
 
6
+ // Polyfill for crypto: https://github.com/jsdom/jsdom/issues/1612#issuecomment-663210638
7
+ import {Crypto} from '@peculiar/webcrypto';
8
+ global.crypto = new Crypto();
9
+
6
10
  import Device from '@webex/internal-plugin-device';
7
11
  import Mercury from '@webex/internal-plugin-mercury';
8
12
  import {assert} from '@webex/test-helper-chai';
@@ -13,7 +17,7 @@ import StaticConfig from '@webex/plugin-meetings/src/common/config';
13
17
  import TriggerProxy from '@webex/plugin-meetings/src/common/events/trigger-proxy';
14
18
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
15
19
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
16
- import Meeting from '@webex/plugin-meetings/src/meeting';
20
+ import Meeting, {CallStateForMetrics} from '@webex/plugin-meetings/src/meeting';
17
21
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
18
22
  import Meetings from '@webex/plugin-meetings/src/meetings';
19
23
  import MeetingCollection from '@webex/plugin-meetings/src/meetings/collection';
@@ -32,10 +36,11 @@ import {
32
36
  EVENT_TRIGGERS,
33
37
  } from '../../../../src/constants';
34
38
  import CaptchaError from '@webex/plugin-meetings/src/common/errors/captcha-error';
35
- import { forEach } from 'lodash';
39
+ import {forEach} from 'lodash';
36
40
  import PasswordError from '@webex/plugin-meetings/src/common/errors/password-error';
37
41
  import PermissionError from '@webex/plugin-meetings/src/common/errors/permission';
38
- import {NoiseReductionEffect,VirtualBackgroundEffect} from '@webex/media-helpers';
42
+ import {NoiseReductionEffect, VirtualBackgroundEffect} from '@webex/media-helpers';
43
+ import NoMeetingInfoError from '../../../../src/common/errors/no-meeting-info';
39
44
 
40
45
  describe('plugin-meetings', () => {
41
46
  const logger = {
@@ -74,7 +79,7 @@ describe('plugin-meetings', () => {
74
79
  describe('meetings index', () => {
75
80
  beforeEach(() => {
76
81
  MeetingsUtil.checkH264Support = sinon.stub();
77
- uuid1 = uuid.v4();
82
+ uuid1 = uuid.v4();
78
83
  url1 = `https://example.com/${uuid.v4()}`;
79
84
  uri1 = `test-${uuid.v4()}@example.com`;
80
85
  test1 = `test-${uuid.v4()}`;
@@ -235,30 +240,15 @@ describe('plugin-meetings', () => {
235
240
  });
236
241
  });
237
242
 
238
- describe('#_toggleTurnDiscovery', () => {
239
- it('should have toggleAdhocMeetings', () => {
240
- assert.equal(typeof webex.meetings._toggleTurnDiscovery, 'function');
243
+ describe('#_toggleTcpReachability', () => {
244
+ it('should have _toggleTcpReachability', () => {
245
+ assert.equal(typeof webex.meetings._toggleTcpReachability, 'function');
241
246
  });
242
247
 
243
248
  describe('success', () => {
244
- it('should update meetings to do TURN discovery', () => {
245
- webex.meetings._toggleTurnDiscovery(true);
246
- assert.equal(webex.meetings.config.experimental.enableTurnDiscovery, true);
247
-
248
- webex.meetings._toggleTurnDiscovery(false);
249
- assert.equal(webex.meetings.config.experimental.enableTurnDiscovery, false);
250
- });
251
- });
252
-
253
- describe('failure', () => {
254
- it('should not accept non boolean input', () => {
255
- const currentEnableTurnDiscovery = webex.meetings.config.experimental.enableTurnDiscovery;
256
-
257
- webex.meetings._toggleTurnDiscovery('test');
258
- assert.equal(
259
- webex.meetings.config.experimental.enableAdhocMeetings,
260
- currentEnableTurnDiscovery
261
- );
249
+ it('should update meetings to do TCP reachability', () => {
250
+ webex.meetings._toggleTcpReachability(true);
251
+ assert.equal(webex.meetings.config.experimental.enableTcpReachability, true);
262
252
  });
263
253
  });
264
254
  });
@@ -360,24 +350,24 @@ describe('plugin-meetings', () => {
360
350
  beforeEach(() => {
361
351
  webex.credentials = {
362
352
  supertoken: {
363
- access_token: "fake_token"
364
- }
353
+ access_token: 'fake_token',
354
+ },
365
355
  };
366
- })
356
+ });
367
357
 
368
358
  it('creates background effect', async () => {
369
359
  const result = await webex.meetings.createVirtualBackgroundEffect();
370
360
 
371
361
  assert.exists(result);
372
362
  assert.instanceOf(result, VirtualBackgroundEffect);
373
- assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'isLoaded', 'options']);
363
+ assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'options']);
374
364
  assert.deepEqual(result.options, {
375
365
  mode: 'BLUR',
376
366
  blurStrength: 'STRONG',
377
367
  generator: 'worker',
378
368
  quality: 'LOW',
379
369
  authToken: 'fake_token',
380
- mirror: false
370
+ mirror: false,
381
371
  });
382
372
  assert.exists(result.enable);
383
373
  assert.exists(result.disable);
@@ -386,35 +376,35 @@ describe('plugin-meetings', () => {
386
376
 
387
377
  it('creates background effect with custom options passed', async () => {
388
378
  const effectOptions = {
389
- generator: "local",
379
+ generator: 'local',
390
380
  frameRate: 45,
391
- mode: "IMAGE",
381
+ mode: 'IMAGE',
392
382
  mirror: false,
393
- quality: "HIGH",
394
- blurStrength: "STRONG",
395
- bgImageUrl: "https://test.webex.com/landscape.5a535788.jpg",
383
+ quality: 'HIGH',
384
+ blurStrength: 'STRONG',
385
+ bgImageUrl: 'https://test.webex.com/landscape.5a535788.jpg',
396
386
  };
397
387
 
398
388
  const result = await webex.meetings.createVirtualBackgroundEffect(effectOptions);
399
389
 
400
390
  assert.exists(result);
401
391
  assert.instanceOf(result, VirtualBackgroundEffect);
402
- assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'isLoaded', 'options']);
403
- assert.deepEqual(result.options, {...effectOptions, authToken: "fake_token"});
392
+ assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'options']);
393
+ assert.deepEqual(result.options, {...effectOptions, authToken: 'fake_token'});
404
394
  assert.exists(result.enable);
405
395
  assert.exists(result.disable);
406
396
  assert.exists(result.dispose);
407
397
  });
408
- })
398
+ });
409
399
 
410
400
  describe('noise reduction effect', () => {
411
401
  beforeEach(() => {
412
402
  webex.credentials = {
413
403
  supertoken: {
414
- access_token: "fake_token"
415
- }
404
+ access_token: 'fake_token',
405
+ },
416
406
  };
417
- })
407
+ });
418
408
 
419
409
  it('creates noise reduction effect', async () => {
420
410
  const result = await webex.meetings.createNoiseReductionEffect({audioContext: {}});
@@ -424,7 +414,7 @@ describe('plugin-meetings', () => {
424
414
  assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
425
415
  assert.deepEqual(result.options, {
426
416
  authToken: 'fake_token',
427
- audioContext: {}
417
+ audioContext: {},
428
418
  });
429
419
  assert.exists(result.enable);
430
420
  assert.exists(result.disable);
@@ -434,8 +424,8 @@ describe('plugin-meetings', () => {
434
424
  it('creates noise reduction effect with custom options passed', async () => {
435
425
  const effectOptions = {
436
426
  audioContext: {},
437
- mode: "WORKLET",
438
- env: "prod"
427
+ mode: 'WORKLET',
428
+ env: 'prod',
439
429
  };
440
430
 
441
431
  const result = await webex.meetings.createNoiseReductionEffect(effectOptions);
@@ -443,12 +433,12 @@ describe('plugin-meetings', () => {
443
433
  assert.exists(result);
444
434
  assert.instanceOf(result, NoiseReductionEffect);
445
435
  assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
446
- assert.deepEqual(result.options, {...effectOptions, authToken: "fake_token"});
436
+ assert.deepEqual(result.options, {...effectOptions, authToken: 'fake_token'});
447
437
  assert.exists(result.enable);
448
438
  assert.exists(result.disable);
449
439
  assert.exists(result.dispose);
450
440
  });
451
- })
441
+ });
452
442
 
453
443
  describe('gets', () => {
454
444
  describe('#getReachability', () => {
@@ -458,10 +448,7 @@ describe('plugin-meetings', () => {
458
448
  it('gets the reachability data instance from webex.meetings', () => {
459
449
  const reachability = webex.meetings.getReachability();
460
450
 
461
- assert.exists(
462
- reachability,
463
- 'reachability is defined'
464
- );
451
+ assert.exists(reachability, 'reachability is defined');
465
452
  assert.instanceOf(reachability, Reachability, 'should be a reachability instance');
466
453
  });
467
454
  });
@@ -524,6 +511,27 @@ describe('plugin-meetings', () => {
524
511
  it('should have #syncMeetings', () => {
525
512
  assert.exists(webex.meetings.syncMeetings);
526
513
  });
514
+ it('should do nothing and return a resolved promise if unverified guest', async () => {
515
+ webex.meetings.request.getActiveMeetings = sinon.stub().returns(
516
+ Promise.resolve({
517
+ loci: [
518
+ {
519
+ url: url1,
520
+ },
521
+ ],
522
+ })
523
+ );
524
+ webex.credentials.isUnverifiedGuest = true;
525
+ LoggerProxy.logger.info = sinon.stub();
526
+
527
+ await webex.meetings.syncMeetings();
528
+
529
+ assert.notCalled(webex.meetings.request.getActiveMeetings);
530
+ assert.calledWith(
531
+ LoggerProxy.logger.info,
532
+ 'Meetings:index#syncMeetings --> skipping meeting sync as unverified guest'
533
+ );
534
+ });
527
535
  describe('succesful requests', () => {
528
536
  beforeEach(() => {
529
537
  webex.meetings.request.getActiveMeetings = sinon.stub().returns(
@@ -537,7 +545,6 @@ describe('plugin-meetings', () => {
537
545
  );
538
546
  });
539
547
  describe('when meeting is returned', () => {
540
-
541
548
  beforeEach(() => {
542
549
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
543
550
  locusInfo,
@@ -586,43 +593,76 @@ describe('plugin-meetings', () => {
586
593
  });
587
594
  });
588
595
  });
589
- describe('destory non active meeting', () => {
590
- let initialSetup;
591
- let parse;
596
+ describe('when destroying meeting is needed', () => {
592
597
  let destroySpy;
598
+ let cleanUpSpy;
599
+
600
+ const meetingCollectionMeetings = {
601
+ stillValidLocusMeeting: {
602
+ locusUrl: 'still-valid-locus-url',
603
+ sendCallAnalyzerMetrics: sinon.stub(),
604
+ },
605
+ noLongerValidLocusMeeting: {
606
+ locusUrl: 'no-longer-valid-locus-url',
607
+ sendCallAnalyzerMetrics: sinon.stub(),
608
+ },
609
+ otherNonLocusMeeting1: {
610
+ locusUrl: null,
611
+ sendCallAnalyzerMetrics: sinon.stub(),
612
+ },
613
+ otherNonLocusMeeting2: {
614
+ locusUrl: undefined,
615
+ sendCallAnalyzerMetrics: sinon.stub(),
616
+ },
617
+ };
593
618
 
594
619
  beforeEach(() => {
595
620
  destroySpy = sinon.spy(webex.meetings, 'destroy');
596
- initialSetup = sinon.stub().returns(true);
597
- webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
598
- locusInfo,
599
- sendCallAnalyzerMetrics: sinon.stub(),
600
- });
601
- webex.meetings.meetingCollection.getAll = sinon.stub().returns({
602
- meetingutk: {
603
- locusUrl: 'fdfdjfdhj',
604
- sendCallAnalyzerMetrics: sinon.stub(),
605
- },
606
- });
607
- webex.meetings.create = sinon.stub().returns(
608
- Promise.resolve({
609
- locusInfo: {
610
- initialSetup,
611
- },
612
- sendCallAnalyzerMetrics: sinon.stub(),
613
- })
614
- );
621
+ webex.meetings.meetingCollection.getAll = sinon
622
+ .stub()
623
+ .returns(meetingCollectionMeetings);
615
624
  webex.meetings.request.getActiveMeetings = sinon.stub().returns(
616
625
  Promise.resolve({
617
- loci: [],
626
+ loci: [{url: 'still-valid-locus-url'}],
618
627
  })
619
628
  );
620
- MeetingUtil.cleanUp = sinon.stub().returns(Promise.resolve());
629
+ cleanUpSpy = sinon.stub(MeetingUtil, 'cleanUp').returns(Promise.resolve());
630
+ });
631
+
632
+ afterEach(() => {
633
+ cleanUpSpy.restore();
621
634
  });
622
- it('destroy non active meetings', async () => {
635
+
636
+ it('destroy any meeting that has no active locus url if keepOnlyLocusMeetings is not defined', async () => {
623
637
  await webex.meetings.syncMeetings();
624
638
  assert.calledOnce(webex.meetings.request.getActiveMeetings);
625
- assert.calledOnce(destroySpy);
639
+ assert.calledOnce(webex.meetings.meetingCollection.getAll);
640
+ assert.calledWith(destroySpy, meetingCollectionMeetings.noLongerValidLocusMeeting);
641
+ assert.calledWith(destroySpy, meetingCollectionMeetings.otherNonLocusMeeting1);
642
+ assert.calledWith(destroySpy, meetingCollectionMeetings.otherNonLocusMeeting2);
643
+ assert.callCount(destroySpy, 3);
644
+
645
+ assert.callCount(MeetingUtil.cleanUp, 3);
646
+ });
647
+
648
+ it('destroy any meeting that has no active locus url if keepOnlyLocusMeetings === true', async () => {
649
+ await webex.meetings.syncMeetings({keepOnlyLocusMeetings: true});
650
+ assert.calledOnce(webex.meetings.request.getActiveMeetings);
651
+ assert.calledOnce(webex.meetings.meetingCollection.getAll);
652
+ assert.calledWith(destroySpy, meetingCollectionMeetings.noLongerValidLocusMeeting);
653
+ assert.calledWith(destroySpy, meetingCollectionMeetings.otherNonLocusMeeting1);
654
+ assert.calledWith(destroySpy, meetingCollectionMeetings.otherNonLocusMeeting2);
655
+ assert.callCount(destroySpy, 3);
656
+
657
+ assert.callCount(MeetingUtil.cleanUp, 3);
658
+ });
659
+
660
+ it('destroy any LOCUS meetings that have no active locus url if keepOnlyLocusMeetings === false', async () => {
661
+ await webex.meetings.syncMeetings({keepOnlyLocusMeetings: false});
662
+ assert.calledOnce(webex.meetings.request.getActiveMeetings);
663
+ assert.calledOnce(webex.meetings.meetingCollection.getAll);
664
+ assert.calledWith(destroySpy, meetingCollectionMeetings.noLongerValidLocusMeeting);
665
+ assert.callCount(destroySpy, 1);
626
666
 
627
667
  assert.calledOnce(MeetingUtil.cleanUp);
628
668
  });
@@ -662,28 +702,139 @@ describe('plugin-meetings', () => {
662
702
  });
663
703
  });
664
704
 
665
- it('calls createMeeting and returns its promise', async () => {
666
- const FAKE_USE_RANDOM_DELAY = true;
667
- const correlationId = 'my-correlationId';
668
- const create = webex.meetings.create(test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId);
705
+ const FAKE_USE_RANDOM_DELAY = true;
706
+ const correlationId = 'my-correlationId';
707
+ const callStateForMetrics = {
708
+ correlationId: 'my-correlationId2',
709
+ joinTrigger: 'my-join-trigger',
710
+ loginType: 'my-login-type',
711
+ };
712
+
713
+ it('should call setCallStateForMetrics on any pre-existing meeting', async () => {
714
+ const fakeMeeting = {setCallStateForMetrics: sinon.mock()};
715
+ webex.meetings.meetingCollection.getByKey = sinon.stub().returns(fakeMeeting);
716
+ await webex.meetings.create(
717
+ test1,
718
+ test2,
719
+ FAKE_USE_RANDOM_DELAY,
720
+ {},
721
+ correlationId,
722
+ true,
723
+ callStateForMetrics
724
+ );
725
+ assert.calledOnceWithExactly(fakeMeeting.setCallStateForMetrics, {
726
+ ...callStateForMetrics,
727
+ correlationId,
728
+ });
729
+ });
730
+
731
+ const checkCallCreateMeeting = async (createParameters, createMeetingParameters) => {
732
+ const create = webex.meetings.create(...createParameters);
669
733
 
670
734
  assert.exists(create.then);
671
735
  await create;
672
736
  assert.calledOnce(webex.meetings.createMeeting);
673
- assert.calledWith(webex.meetings.createMeeting, test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId);
737
+ assert.calledWith(webex.meetings.createMeeting, ...createMeetingParameters);
738
+ };
739
+
740
+ it('calls createMeeting and returns its promise', async () => {
741
+ await checkCallCreateMeeting(
742
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true],
743
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, true]
744
+ );
745
+ });
746
+
747
+ it('calls createMeeting, pass the meeting info param and returns its promise', async () => {
748
+ const meetingInfo = {};
749
+ await checkCallCreateMeeting(
750
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true, undefined, meetingInfo],
751
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, true, meetingInfo]
752
+ );
753
+ });
754
+
755
+ it('calls createMeeting, pass the meeting info and meetingLookupURL param and returns its promise', async () => {
756
+ const meetingInfo = {};
757
+ await checkCallCreateMeeting(
758
+ [
759
+ test1,
760
+ test2,
761
+ FAKE_USE_RANDOM_DELAY,
762
+ {},
763
+ correlationId,
764
+ true,
765
+ undefined,
766
+ meetingInfo,
767
+ 'meetingLookupURL',
768
+ ],
769
+ [
770
+ test1,
771
+ test2,
772
+ FAKE_USE_RANDOM_DELAY,
773
+ {},
774
+ {correlationId},
775
+ true,
776
+ meetingInfo,
777
+ 'meetingLookupURL',
778
+ ]
779
+ );
780
+ });
781
+
782
+ it('calls createMeeting when failOnMissingMeetinginfo is undefined and returns its promise', async () => {
783
+ await checkCallCreateMeeting(
784
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, undefined],
785
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, false]
786
+ );
787
+ });
788
+
789
+ it('calls createMeeting when failOnMissingMeetinginfo is false and returns its promise', async () => {
790
+ await checkCallCreateMeeting(
791
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, false],
792
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, false]
793
+ );
794
+ });
795
+
796
+ it('calls createMeeting with callStateForMetrics and returns its promise', async () => {
797
+ await checkCallCreateMeeting(
798
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, undefined, true, callStateForMetrics],
799
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, callStateForMetrics, true]
800
+ );
801
+ });
802
+
803
+ it('calls createMeeting with callStateForMetrics overwritten with correlationId and returns its promise', async () => {
804
+ await checkCallCreateMeeting(
805
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true, callStateForMetrics],
806
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {...callStateForMetrics, correlationId}, true]
807
+ );
674
808
  });
675
809
 
676
810
  it('calls createMeeting with extra info params and returns its promise', async () => {
677
811
  const FAKE_USE_RANDOM_DELAY = false;
678
812
  const correlationId = 'my-correlationId';
679
813
 
680
- const FAKE_INFO_EXTRA_PARAMS = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'};
681
- const create = webex.meetings.create(test1, test2, FAKE_USE_RANDOM_DELAY, FAKE_INFO_EXTRA_PARAMS, correlationId);
814
+ const FAKE_INFO_EXTRA_PARAMS = {
815
+ mtid: 'm9fe0afd8c435e892afcce9ea25b97046',
816
+ joinTXId: 'TSmrX61wNF',
817
+ };
818
+ const create = webex.meetings.create(
819
+ test1,
820
+ test2,
821
+ FAKE_USE_RANDOM_DELAY,
822
+ FAKE_INFO_EXTRA_PARAMS,
823
+ correlationId
824
+ );
682
825
 
683
826
  assert.exists(create.then);
684
827
  await create;
685
828
  assert.calledOnce(webex.meetings.createMeeting);
686
- assert.calledWith(webex.meetings.createMeeting, test1, test2, FAKE_USE_RANDOM_DELAY, FAKE_INFO_EXTRA_PARAMS, correlationId);
829
+ assert.calledWith(
830
+ webex.meetings.createMeeting,
831
+ test1,
832
+ test2,
833
+ FAKE_USE_RANDOM_DELAY,
834
+ FAKE_INFO_EXTRA_PARAMS,
835
+ {correlationId},
836
+ false
837
+ );
687
838
  });
688
839
 
689
840
  it('creates a new meeting when a scheduled meeting exists in the conversation', async () => {
@@ -779,7 +930,6 @@ describe('plugin-meetings', () => {
779
930
  });
780
931
  describe('#handleLocusEvent', () => {
781
932
  describe('there was a meeting', () => {
782
-
783
933
  beforeEach(() => {
784
934
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
785
935
  locusInfo,
@@ -845,7 +995,7 @@ describe('plugin-meetings', () => {
845
995
  },
846
996
  },
847
997
  info: {
848
- webExMeetingId
998
+ webExMeetingId,
849
999
  },
850
1000
  },
851
1001
  eventType: 'locus.difference',
@@ -853,7 +1003,11 @@ describe('plugin-meetings', () => {
853
1003
  });
854
1004
  assert.callCount(webex.meetings.meetingCollection.getByKey, 6);
855
1005
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
856
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', webExMeetingId);
1006
+ assert.calledWith(
1007
+ webex.meetings.meetingCollection.getByKey,
1008
+ 'meetingNumber',
1009
+ webExMeetingId
1010
+ );
857
1011
  assert.calledOnce(initialSetup);
858
1012
  assert.calledWith(initialSetup, {
859
1013
  id: uuid1,
@@ -868,7 +1022,7 @@ describe('plugin-meetings', () => {
868
1022
  },
869
1023
  },
870
1024
  info: {
871
- webExMeetingId
1025
+ webExMeetingId,
872
1026
  },
873
1027
  });
874
1028
  });
@@ -882,7 +1036,7 @@ describe('plugin-meetings', () => {
882
1036
  },
883
1037
  },
884
1038
  info: {
885
- webExMeetingId
1039
+ webExMeetingId,
886
1040
  },
887
1041
  },
888
1042
  eventType: 'locus.difference',
@@ -890,7 +1044,11 @@ describe('plugin-meetings', () => {
890
1044
  });
891
1045
  assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
892
1046
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
893
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', webExMeetingId);
1047
+ assert.calledWith(
1048
+ webex.meetings.meetingCollection.getByKey,
1049
+ 'meetingNumber',
1050
+ webExMeetingId
1051
+ );
894
1052
  assert.calledOnce(initialSetup);
895
1053
  assert.calledWith(initialSetup, {
896
1054
  id: uuid1,
@@ -900,7 +1058,7 @@ describe('plugin-meetings', () => {
900
1058
  },
901
1059
  },
902
1060
  info: {
903
- webExMeetingId
1061
+ webExMeetingId,
904
1062
  },
905
1063
  });
906
1064
  });
@@ -947,7 +1105,7 @@ describe('plugin-meetings', () => {
947
1105
  },
948
1106
  },
949
1107
  info: {
950
- webExMeetingId
1108
+ webExMeetingId,
951
1109
  },
952
1110
  },
953
1111
  eventType: test1,
@@ -955,7 +1113,11 @@ describe('plugin-meetings', () => {
955
1113
  });
956
1114
  assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
957
1115
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
958
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', webExMeetingId);
1116
+ assert.calledWith(
1117
+ webex.meetings.meetingCollection.getByKey,
1118
+ 'meetingNumber',
1119
+ webExMeetingId
1120
+ );
959
1121
  assert.calledOnce(initialSetup);
960
1122
  assert.calledWith(initialSetup, {
961
1123
  id: uuid1,
@@ -965,7 +1127,7 @@ describe('plugin-meetings', () => {
965
1127
  },
966
1128
  },
967
1129
  info: {
968
- webExMeetingId
1130
+ webExMeetingId,
969
1131
  },
970
1132
  });
971
1133
  });
@@ -1037,7 +1199,10 @@ describe('plugin-meetings', () => {
1037
1199
  });
1038
1200
  describe('successful MeetingInfo.#fetchMeetingInfo', () => {
1039
1201
  let clock, setTimeoutSpy, fakeMeetingStartTimeString, FAKE_TIME_TO_START;
1040
- const FAKE_INFO_EXTRA_PARAMS = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'};
1202
+ const FAKE_INFO_EXTRA_PARAMS = {
1203
+ mtid: 'm9fe0afd8c435e892afcce9ea25b97046',
1204
+ joinTXId: 'TSmrX61wNF',
1205
+ };
1041
1206
 
1042
1207
  beforeEach(() => {
1043
1208
  clock = sinon.useFakeTimers();
@@ -1045,7 +1210,8 @@ describe('plugin-meetings', () => {
1045
1210
  webex.meetings.meetingInfo.fetchMeetingInfo = sinon.stub().returns(
1046
1211
  Promise.resolve({
1047
1212
  body: {
1048
- permissionToken: 'PT',
1213
+ permissionToken:
1214
+ 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOiIxMjM0NTYiLCJwZXJtaXNzaW9uIjp7InVzZXJQb2xpY2llcyI6eyJhIjp0cnVlfX19.wkTk0Hp8sUlq2wi2nP4-Ym4Xb7aEUHzyXA1kzk6f0V0',
1049
1215
  meetingJoinUrl: 'meetingJoinUrl',
1050
1216
  },
1051
1217
  })
@@ -1068,13 +1234,36 @@ describe('plugin-meetings', () => {
1068
1234
  destination,
1069
1235
  type,
1070
1236
  extraParams = {},
1071
- expectedMeetingData = {}
1237
+ expectedMeetingData = {},
1238
+ sendCAevents = false,
1239
+ injectMeetingInfo = false
1072
1240
  ) => {
1073
- assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
1241
+ if (injectMeetingInfo) {
1242
+ assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
1243
+ } else {
1244
+ assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
1245
+ }
1246
+
1074
1247
  assert.calledOnce(MeetingsUtil.getMeetingAddedType);
1075
1248
  assert.notCalled(setTimeoutSpy);
1076
1249
  assert.callCount(TriggerProxy.trigger, 5);
1077
- assert.calledWith(webex.meetings.meetingInfo.fetchMeetingInfo, destination, type, null, null, undefined, undefined, extraParams, {meetingId: meeting.id});
1250
+
1251
+ if (injectMeetingInfo) {
1252
+ assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
1253
+ } else {
1254
+ assert.calledWith(
1255
+ webex.meetings.meetingInfo.fetchMeetingInfo,
1256
+ destination,
1257
+ type,
1258
+ null,
1259
+ null,
1260
+ undefined,
1261
+ undefined,
1262
+ extraParams,
1263
+ {meetingId: meeting.id, sendCAevents}
1264
+ );
1265
+ }
1266
+
1078
1267
  assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1079
1268
 
1080
1269
  if (expectedMeetingData.permissionToken) {
@@ -1083,9 +1272,21 @@ describe('plugin-meetings', () => {
1083
1272
  if (expectedMeetingData.meetingJoinUrl) {
1084
1273
  assert.equal(meeting.meetingJoinUrl, expectedMeetingData.meetingJoinUrl);
1085
1274
  }
1086
- if(expectedMeetingData.correlationId) {
1275
+ if (expectedMeetingData.correlationId) {
1087
1276
  assert.equal(meeting.correlationId, expectedMeetingData.correlationId);
1088
1277
  }
1278
+ if (expectedMeetingData.callStateForMetrics) {
1279
+ assert.deepEqual(
1280
+ meeting.callStateForMetrics,
1281
+ expectedMeetingData.callStateForMetrics
1282
+ );
1283
+ }
1284
+ if (expectedMeetingData.meetingLookupUrl) {
1285
+ assert.equal(
1286
+ meeting.meetingInfo.meetingLookupUrl,
1287
+ expectedMeetingData.meetingLookupUrl
1288
+ );
1289
+ }
1089
1290
  assert.equal(meeting.destination, destination);
1090
1291
  assert.equal(meeting.destinationType, type);
1091
1292
  assert.calledWith(
@@ -1113,21 +1314,104 @@ describe('plugin-meetings', () => {
1113
1314
  const meeting = await webex.meetings.createMeeting('test destination', 'test type');
1114
1315
 
1115
1316
  const expectedMeetingData = {
1116
- permissionToken: 'PT',
1317
+ permissionToken:
1318
+ 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOiIxMjM0NTYiLCJwZXJtaXNzaW9uIjp7InVzZXJQb2xpY2llcyI6eyJhIjp0cnVlfX19.wkTk0Hp8sUlq2wi2nP4-Ym4Xb7aEUHzyXA1kzk6f0V0',
1117
1319
  meetingJoinUrl: 'meetingJoinUrl',
1118
1320
  correlationId: meeting.id,
1119
1321
  };
1120
1322
 
1121
- checkCreateWithoutDelay(meeting, 'test destination', 'test type', {}, expectedMeetingData);
1323
+ checkCreateWithoutDelay(
1324
+ meeting,
1325
+ 'test destination',
1326
+ 'test type',
1327
+ {},
1328
+ expectedMeetingData
1329
+ );
1330
+ });
1331
+
1332
+ it('accepts injected meeting info', async () => {
1333
+ const meetingInfo = {
1334
+ permissionToken:
1335
+ 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOiIxMjM0NTYiLCJwZXJtaXNzaW9uIjp7InVzZXJQb2xpY2llcyI6eyJhIjp0cnVlfX19.wkTk0Hp8sUlq2wi2nP4-Ym4Xb7aEUHzyXA1kzk6f0V0',
1336
+ meetingJoinUrl: 'meetingJoinUrl',
1337
+ };
1338
+
1339
+ const meeting = await webex.meetings.createMeeting(
1340
+ 'test destination',
1341
+ 'test type',
1342
+ false,
1343
+ {},
1344
+ undefined,
1345
+ false,
1346
+ meetingInfo
1347
+ );
1348
+
1349
+ const expectedMeetingData = {
1350
+ ...meetingInfo,
1351
+ correlationId: meeting.id,
1352
+ };
1353
+
1354
+ checkCreateWithoutDelay(
1355
+ meeting,
1356
+ 'test destination',
1357
+ 'test type',
1358
+ {},
1359
+ expectedMeetingData,
1360
+ false,
1361
+ true
1362
+ );
1363
+ });
1364
+
1365
+ it('accepts injected meeting info with meeting lookup url', async () => {
1366
+ const meetingInfo = {
1367
+ permissionToken:
1368
+ 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOiIxMjM0NTYiLCJwZXJtaXNzaW9uIjp7InVzZXJQb2xpY2llcyI6eyJhIjp0cnVlfX19.wkTk0Hp8sUlq2wi2nP4-Ym4Xb7aEUHzyXA1kzk6f0V0',
1369
+ meetingJoinUrl: 'meetingJoinUrl',
1370
+ };
1371
+
1372
+ const meeting = await webex.meetings.createMeeting(
1373
+ 'test destination',
1374
+ 'test type',
1375
+ false,
1376
+ {},
1377
+ undefined,
1378
+ false,
1379
+ meetingInfo,
1380
+ 'meetingLookupUrl'
1381
+ );
1382
+
1383
+ const expectedMeetingData = {
1384
+ ...meetingInfo,
1385
+ meetingLookupUrl: 'meetingLookupUrl',
1386
+ correlationId: meeting.id,
1387
+ };
1388
+
1389
+ checkCreateWithoutDelay(
1390
+ meeting,
1391
+ 'test destination',
1392
+ 'test type',
1393
+ {},
1394
+ expectedMeetingData,
1395
+ false,
1396
+ true
1397
+ );
1122
1398
  });
1123
1399
 
1124
1400
  [undefined, FAKE_INFO_EXTRA_PARAMS].forEach((infoExtraParams) => {
1125
1401
  const infoExtraParamsProvided = infoExtraParams !== undefined;
1126
1402
 
1127
- it(`creates the meeting from a successful meeting info fetch meeting resolve testing${infoExtraParamsProvided ? ' with infoExtraParams' : ''}`, async () => {
1128
- const meeting = await webex.meetings.createMeeting('test destination', 'test type', false, infoExtraParams);
1403
+ it(`creates the meeting from a successful meeting info fetch meeting resolve testing${
1404
+ infoExtraParamsProvided ? ' with infoExtraParams' : ''
1405
+ }`, async () => {
1406
+ const meeting = await webex.meetings.createMeeting(
1407
+ 'test destination',
1408
+ 'test type',
1409
+ false,
1410
+ infoExtraParams
1411
+ );
1129
1412
  const expectedMeetingData = {
1130
- permissionToken: 'PT',
1413
+ permissionToken:
1414
+ 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOiIxMjM0NTYiLCJwZXJtaXNzaW9uIjp7InVzZXJQb2xpY2llcyI6eyJhIjp0cnVlfX19.wkTk0Hp8sUlq2wi2nP4-Ym4Xb7aEUHzyXA1kzk6f0V0',
1131
1415
  meetingJoinUrl: 'meetingJoinUrl',
1132
1416
  };
1133
1417
 
@@ -1136,10 +1420,18 @@ describe('plugin-meetings', () => {
1136
1420
  Meeting,
1137
1421
  'createMeeting should eventually resolve to a Meeting Object'
1138
1422
  );
1139
- checkCreateWithoutDelay(meeting, 'test destination', 'test type', infoExtraParamsProvided ? infoExtraParams : {}, expectedMeetingData);
1423
+ checkCreateWithoutDelay(
1424
+ meeting,
1425
+ 'test destination',
1426
+ 'test type',
1427
+ infoExtraParamsProvided ? infoExtraParams : {},
1428
+ expectedMeetingData
1429
+ );
1140
1430
  });
1141
1431
 
1142
- it(`creates the meeting from a successful meeting info fetch with random delay${infoExtraParamsProvided ? ' with infoExtraParams' : ''}`, async () => {
1432
+ it(`creates the meeting from a successful meeting info fetch with random delay${
1433
+ infoExtraParamsProvided ? ' with infoExtraParams' : ''
1434
+ }`, async () => {
1143
1435
  const FAKE_LOCUS_MEETING = {
1144
1436
  conversationUrl: 'locusConvURL',
1145
1437
  url: 'locusUrl',
@@ -1199,6 +1491,8 @@ describe('plugin-meetings', () => {
1199
1491
 
1200
1492
  // When timer expires
1201
1493
  clock.tick(FAKE_TIME_TO_START);
1494
+ await testUtils.flushPromises();
1495
+
1202
1496
  assert.calledWith(
1203
1497
  webex.meetings.meetingInfo.fetchMeetingInfo,
1204
1498
  FAKE_LOCUS_MEETING,
@@ -1218,8 +1512,10 @@ describe('plugin-meetings', () => {
1218
1512
  assert.equal(meeting.meetingNumber, 'locusMeetingId');
1219
1513
  assert.equal(meeting.meetingJoinUrl, 'meetingJoinUrl');
1220
1514
  assert.equal(meeting.owner, 'locusOwner');
1221
- assert.equal(meeting.permissionToken, 'PT');
1222
-
1515
+ assert.equal(
1516
+ meeting.permissionToken,
1517
+ 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOiIxMjM0NTYiLCJwZXJtaXNzaW9uIjp7InVzZXJQb2xpY2llcyI6eyJhIjp0cnVlfX19.wkTk0Hp8sUlq2wi2nP4-Ym4Xb7aEUHzyXA1kzk6f0V0'
1518
+ );
1223
1519
  assert.calledWith(
1224
1520
  TriggerProxy.trigger,
1225
1521
  meeting,
@@ -1227,7 +1523,7 @@ describe('plugin-meetings', () => {
1227
1523
  'meeting:meetingInfoAvailable'
1228
1524
  );
1229
1525
  });
1230
- })
1526
+ });
1231
1527
 
1232
1528
  it('creates the meeting from a successful meeting info fetch that has no random delay because it is active', async () => {
1233
1529
  const FAKE_LOCUS_MEETING = {
@@ -1328,14 +1624,59 @@ describe('plugin-meetings', () => {
1328
1624
  });
1329
1625
 
1330
1626
  it('creates meeting with the correlationId provided', async () => {
1331
- const meeting = await webex.meetings.createMeeting('test destination', 'test type', false, {}, 'my-correlationId');
1627
+ const meeting = await webex.meetings.createMeeting(
1628
+ 'test destination',
1629
+ 'test type',
1630
+ false,
1631
+ {},
1632
+ {correlationId: 'my-correlationId'}
1633
+ );
1332
1634
 
1333
1635
  const expectedMeetingData = {
1334
1636
  correlationId: 'my-correlationId',
1335
1637
  };
1336
1638
 
1337
- checkCreateWithoutDelay(meeting, 'test destination', 'test type', {}, expectedMeetingData);
1338
- })
1639
+ checkCreateWithoutDelay(
1640
+ meeting,
1641
+ 'test destination',
1642
+ 'test type',
1643
+ {},
1644
+ expectedMeetingData,
1645
+ true
1646
+ );
1647
+ });
1648
+
1649
+ it('creates meeting with the callStateForMetrics provided', async () => {
1650
+ const meeting = await webex.meetings.createMeeting(
1651
+ 'test destination',
1652
+ 'test type',
1653
+ false,
1654
+ {},
1655
+ {
1656
+ correlationId: 'my-correlationId',
1657
+ joinTrigger: 'my-join-trigger',
1658
+ loginType: 'my-login-type',
1659
+ }
1660
+ );
1661
+
1662
+ const expectedMeetingData = {
1663
+ correlationId: 'my-correlationId',
1664
+ callStateForMetrics: {
1665
+ correlationId: 'my-correlationId',
1666
+ joinTrigger: 'my-join-trigger',
1667
+ loginType: 'my-login-type',
1668
+ },
1669
+ };
1670
+
1671
+ checkCreateWithoutDelay(
1672
+ meeting,
1673
+ 'test destination',
1674
+ 'test type',
1675
+ {},
1676
+ expectedMeetingData,
1677
+ true
1678
+ );
1679
+ });
1339
1680
  });
1340
1681
 
1341
1682
  describe('rejected MeetingInfo.#fetchMeetingInfo', () => {
@@ -1345,37 +1686,72 @@ describe('plugin-meetings', () => {
1345
1686
  webex.meetings.meetingInfo.fetchMeetingInfo = sinon
1346
1687
  .stub()
1347
1688
  .returns(Promise.reject(new Error('test')));
1689
+ webex.meetings.destroy = sinon.stub().returns(Promise.resolve());
1690
+ webex.meetings.createMeeting = sinon.spy(webex.meetings.createMeeting);
1348
1691
  });
1349
- it('creates the meeting from a rejected meeting info fetch', async () => {
1350
- const meeting = await webex.meetings.createMeeting('test destination', 'test type');
1351
1692
 
1352
- assert.instanceOf(
1353
- meeting,
1354
- Meeting,
1355
- 'createMeeting should eventually resolve to a Meeting Object'
1356
- );
1357
- assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
1358
- assert.calledOnce(MeetingsUtil.getMeetingAddedType);
1359
- assert.calledThrice(TriggerProxy.trigger);
1360
- assert.calledWith(
1361
- webex.meetings.meetingInfo.fetchMeetingInfo,
1362
- 'test destination',
1363
- 'test type'
1364
- );
1365
- assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1366
- assert.calledWith(
1367
- TriggerProxy.trigger,
1368
- sinon.match.instanceOf(Meetings),
1369
- {
1370
- file: 'meetings',
1371
- function: 'createMeeting',
1372
- },
1373
- 'meeting:added',
1374
- {
1375
- meeting: sinon.match.instanceOf(Meeting),
1376
- type: 'test meeting added type',
1693
+ const checkCreateMeetingWithNoMeetingInfo = async (failOnMissingMeetingInfo, destroy) => {
1694
+ try {
1695
+ const meeting = await webex.meetings.createMeeting(
1696
+ 'test destination',
1697
+ 'test type',
1698
+ undefined,
1699
+ undefined,
1700
+ undefined,
1701
+ failOnMissingMeetingInfo
1702
+ );
1703
+
1704
+ assert.instanceOf(
1705
+ meeting,
1706
+ Meeting,
1707
+ 'createMeeting should eventually resolve to a Meeting Object'
1708
+ );
1709
+ assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
1710
+ assert.calledOnce(MeetingsUtil.getMeetingAddedType);
1711
+ assert.calledThrice(TriggerProxy.trigger);
1712
+ assert.calledWith(
1713
+ webex.meetings.meetingInfo.fetchMeetingInfo,
1714
+ 'test destination',
1715
+ 'test type'
1716
+ );
1717
+
1718
+ if (destroy) {
1719
+ assert.calledWith(
1720
+ webex.meetings.destroy,
1721
+ sinon.match.instanceOf(Meeting),
1722
+ 'MISSING_MEETING_INFO'
1723
+ );
1724
+ assert.notCalled(MeetingsUtil.getMeetingAddedType);
1725
+ assert.notCalled(TriggerProxy.trigger);
1726
+ assert.throw(webex.meetings.createMeeting, 'meeting information not found');
1727
+ } else {
1728
+ assert.notCalled(webex.meetings.destroy);
1729
+ assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1730
+ assert.calledWith(
1731
+ TriggerProxy.trigger,
1732
+ sinon.match.instanceOf(Meetings),
1733
+ {
1734
+ file: 'meetings',
1735
+ function: 'createMeeting',
1736
+ },
1737
+ 'meeting:added',
1738
+ {
1739
+ meeting: sinon.match.instanceOf(Meeting),
1740
+ type: 'test meeting added type',
1741
+ }
1742
+ );
1377
1743
  }
1378
- );
1744
+ } catch (err) {
1745
+ assert.instanceOf(err, NoMeetingInfoError);
1746
+ }
1747
+ };
1748
+
1749
+ it('creates the meeting from a rejected meeting info fetch', async () => {
1750
+ checkCreateMeetingWithNoMeetingInfo(false, false);
1751
+ });
1752
+
1753
+ it('creates the meeting from a rejected meeting info fetch and destroys it if failOnMissingMeetingInfo', async () => {
1754
+ checkCreateMeetingWithNoMeetingInfo(true, true);
1379
1755
  });
1380
1756
  });
1381
1757
 
@@ -1438,9 +1814,13 @@ describe('plugin-meetings', () => {
1438
1814
  });
1439
1815
  });
1440
1816
  describe('Public Event Triggers', () => {
1817
+ let cleanUpSpy;
1441
1818
  describe('#destroy', () => {
1442
1819
  beforeEach(() => {
1443
- MeetingUtil.cleanUp = sinon.stub();
1820
+ cleanUpSpy = sinon.stub(MeetingUtil, 'cleanUp');
1821
+ });
1822
+ afterEach(() => {
1823
+ cleanUpSpy.restore();
1444
1824
  });
1445
1825
  it('should have #destroy', () => {
1446
1826
  assert.exists(webex.meetings.destroy);
@@ -1513,7 +1893,6 @@ describe('plugin-meetings', () => {
1513
1893
  });
1514
1894
 
1515
1895
  describe('#fetchUserPreferredWebexSite', () => {
1516
-
1517
1896
  let loggerProxySpy;
1518
1897
 
1519
1898
  it('should call request.getMeetingPreferences to get the preferred webex site ', async () => {
@@ -1531,12 +1910,10 @@ describe('plugin-meetings', () => {
1531
1910
  getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
1532
1911
  },
1533
1912
  user: {
1534
- get: sinon.stub().returns(
1535
- Promise.resolve(user)
1536
- ),
1913
+ get: sinon.stub().returns(Promise.resolve(user)),
1537
1914
  },
1538
1915
  });
1539
- }
1916
+ };
1540
1917
 
1541
1918
  it('should not fail if UserPreferred info is not fetched ', async () => {
1542
1919
  setup();
@@ -1573,6 +1950,59 @@ describe('plugin-meetings', () => {
1573
1950
  assert.notCalled(loggerProxySpy);
1574
1951
  });
1575
1952
 
1953
+ forEach(
1954
+ [
1955
+ {user: undefined},
1956
+ {user: {userPreferences: {}}},
1957
+ {user: {userPreferences: {userPreferencesItems: {}}}},
1958
+ {user: {userPreferences: {userPreferencesItems: {preferredWebExSite: undefined}}}},
1959
+ ],
1960
+ ({user}) => {
1961
+ it(`should handle invalid user data ${user}`, async () => {
1962
+ setup({user});
1963
+
1964
+ await webex.meetings.fetchUserPreferredWebexSite();
1965
+
1966
+ assert.equal(webex.meetings.preferredWebexSite, '');
1967
+ assert.calledOnceWithExactly(
1968
+ loggerProxySpy,
1969
+ 'Failed to fetch preferred site from user - no site will be set'
1970
+ );
1971
+ });
1972
+ }
1973
+ );
1974
+
1975
+ it('should handle a get user failure', async () => {
1976
+ setup();
1977
+
1978
+ webex.internal.user.get.rejects(new Error());
1979
+
1980
+ await webex.meetings.fetchUserPreferredWebexSite();
1981
+
1982
+ assert.equal(webex.meetings.preferredWebexSite, '');
1983
+ assert.calledOnceWithExactly(
1984
+ loggerProxySpy,
1985
+ 'Failed to fetch preferred site from user - no site will be set'
1986
+ );
1987
+ });
1988
+
1989
+ it('should fall back to fetching the site from the user', async () => {
1990
+ setup({
1991
+ user: {
1992
+ userPreferences: {
1993
+ userPreferencesItems: {
1994
+ preferredWebExSite: 'site.webex.com',
1995
+ },
1996
+ },
1997
+ },
1998
+ });
1999
+
2000
+ await webex.meetings.fetchUserPreferredWebexSite();
2001
+
2002
+ assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
2003
+ assert.notCalled(loggerProxySpy);
2004
+ });
2005
+
1576
2006
  forEach([
1577
2007
  {user: undefined},
1578
2008
  {user: {userPreferences: {}}},
@@ -1623,7 +2053,8 @@ describe('plugin-meetings', () => {
1623
2053
  webex.meetings.meetingInfo.fetchMeetingInfo = sinon.stub().returns(
1624
2054
  Promise.resolve({
1625
2055
  body: {
1626
- permissionToken: 'PT',
2056
+ permissionToken:
2057
+ 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOiIxMjM0NTYiLCJwZXJtaXNzaW9uIjp7InVzZXJQb2xpY2llcyI6eyJhIjp0cnVlfX19.wkTk0Hp8sUlq2wi2nP4-Ym4Xb7aEUHzyXA1kzk6f0V0',
1627
2058
  meetingJoinUrl: 'meetingJoinUrl',
1628
2059
  },
1629
2060
  })
@@ -1701,7 +2132,7 @@ describe('plugin-meetings', () => {
1701
2132
  newLocus = {
1702
2133
  controls: {},
1703
2134
  self: {},
1704
- }
2135
+ };
1705
2136
  });
1706
2137
  afterEach(() => {
1707
2138
  sinon.restore();
@@ -1732,16 +2163,24 @@ describe('plugin-meetings', () => {
1732
2163
  });
1733
2164
 
1734
2165
  it('if newLocus replaceAt time is expired, then return false', () => {
1735
- sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns({joinedWith: {replaces: [{
1736
- replaceAt: '2023-03-27T02:17:02.506Z',
1737
- }]}});
2166
+ sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns({
2167
+ joinedWith: {
2168
+ replaces: [
2169
+ {
2170
+ replaceAt: '2023-03-27T02:17:02.506Z',
2171
+ },
2172
+ ],
2173
+ },
2174
+ });
1738
2175
  newLocus.self.state = 'JOINED';
1739
2176
  sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(true);
1740
2177
  sinon.stub(MeetingsUtil, 'getThisDevice').returns({
1741
- replaces: [{
1742
- replaceAt: '2023-03-27T02:17:01.506Z'
1743
- }]
1744
- })
2178
+ replaces: [
2179
+ {
2180
+ replaceAt: '2023-03-27T02:17:01.506Z',
2181
+ },
2182
+ ],
2183
+ });
1745
2184
 
1746
2185
  LoggerProxy.logger.log = sinon.stub();
1747
2186
  const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
@@ -1830,7 +2269,7 @@ describe('plugin-meetings', () => {
1830
2269
  newLocus = {
1831
2270
  controls: {},
1832
2271
  self: {},
1833
- }
2272
+ };
1834
2273
  });
1835
2274
  afterEach(() => {
1836
2275
  sinon.restore();
@@ -1896,13 +2335,13 @@ describe('plugin-meetings', () => {
1896
2335
  self: {
1897
2336
  callbackInfo: {
1898
2337
  callbackAddress: 'address1',
1899
- }
2338
+ },
1900
2339
  },
1901
2340
  info: {
1902
2341
  webExMeetingId: '123456',
1903
2342
  isUnifiedSpaceMeeting: false,
1904
2343
  },
1905
- conversationUrl: 'conversationUrl1'
2344
+ conversationUrl: 'conversationUrl1',
1906
2345
  };
1907
2346
 
1908
2347
  sinon.stub(MeetingsUtil, 'checkForCorrelationId').returns('correlationId1');
@@ -1916,9 +2355,17 @@ describe('plugin-meetings', () => {
1916
2355
  assert.isNull(result);
1917
2356
  assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
1918
2357
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
1919
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'correlationId', 'correlationId1');
2358
+ assert.calledWith(
2359
+ webex.meetings.meetingCollection.getByKey,
2360
+ 'correlationId',
2361
+ 'correlationId1'
2362
+ );
1920
2363
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
1921
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'conversationUrl', 'conversationUrl1');
2364
+ assert.calledWith(
2365
+ webex.meetings.meetingCollection.getByKey,
2366
+ 'conversationUrl',
2367
+ 'conversationUrl1'
2368
+ );
1922
2369
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', '123456');
1923
2370
  });
1924
2371
 
@@ -1928,7 +2375,7 @@ describe('plugin-meetings', () => {
1928
2375
  const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
1929
2376
  assert.isNull(result);
1930
2377
  assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
1931
- })
2378
+ });
1932
2379
 
1933
2380
  it('check the calls when meeting found by key: locusUrl', () => {
1934
2381
  mockGetByKey('locusUrl');
@@ -1944,7 +2391,11 @@ describe('plugin-meetings', () => {
1944
2391
  assert.deepEqual(result, mockReturnMeeting);
1945
2392
  assert.callCount(webex.meetings.meetingCollection.getByKey, 2);
1946
2393
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
1947
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'correlationId', 'correlationId1');
2394
+ assert.calledWith(
2395
+ webex.meetings.meetingCollection.getByKey,
2396
+ 'correlationId',
2397
+ 'correlationId1'
2398
+ );
1948
2399
  });
1949
2400
 
1950
2401
  it('check the calls when meeting found by key: sipUri', () => {
@@ -1953,7 +2404,11 @@ describe('plugin-meetings', () => {
1953
2404
  assert.deepEqual(result, mockReturnMeeting);
1954
2405
  assert.callCount(webex.meetings.meetingCollection.getByKey, 3);
1955
2406
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
1956
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'correlationId', 'correlationId1');
2407
+ assert.calledWith(
2408
+ webex.meetings.meetingCollection.getByKey,
2409
+ 'correlationId',
2410
+ 'correlationId1'
2411
+ );
1957
2412
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
1958
2413
  });
1959
2414
 
@@ -1963,9 +2418,17 @@ describe('plugin-meetings', () => {
1963
2418
  assert.deepEqual(result, mockReturnMeeting);
1964
2419
  assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
1965
2420
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
1966
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'correlationId', 'correlationId1');
2421
+ assert.calledWith(
2422
+ webex.meetings.meetingCollection.getByKey,
2423
+ 'correlationId',
2424
+ 'correlationId1'
2425
+ );
1967
2426
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
1968
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'conversationUrl', 'conversationUrl1');
2427
+ assert.calledWith(
2428
+ webex.meetings.meetingCollection.getByKey,
2429
+ 'conversationUrl',
2430
+ 'conversationUrl1'
2431
+ );
1969
2432
  });
1970
2433
 
1971
2434
  it('check the calls when meeting found by key: meetingNumber', () => {
@@ -1974,9 +2437,17 @@ describe('plugin-meetings', () => {
1974
2437
  assert.deepEqual(result, mockReturnMeeting);
1975
2438
  assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
1976
2439
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
1977
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'correlationId', 'correlationId1');
2440
+ assert.calledWith(
2441
+ webex.meetings.meetingCollection.getByKey,
2442
+ 'correlationId',
2443
+ 'correlationId1'
2444
+ );
1978
2445
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
1979
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'conversationUrl', 'conversationUrl1');
2446
+ assert.calledWith(
2447
+ webex.meetings.meetingCollection.getByKey,
2448
+ 'conversationUrl',
2449
+ 'conversationUrl1'
2450
+ );
1980
2451
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', '123456');
1981
2452
  });
1982
2453
  });
@@ -1991,18 +2462,18 @@ describe('plugin-meetings', () => {
1991
2462
  controls: {
1992
2463
  breakout: {
1993
2464
  sessionType: 'MAIN',
1994
- url: 'breakoutUnifiedUrl1'
1995
- }
1996
- }
2465
+ url: 'breakoutUnifiedUrl1',
2466
+ },
2467
+ },
1997
2468
  };
1998
2469
  breakoutLocus = {
1999
2470
  url: 'breakoutUrl1',
2000
2471
  controls: {
2001
2472
  breakout: {
2002
2473
  sessionType: 'BREAKOUT',
2003
- url: 'breakoutUnifiedUrl1'
2004
- }
2005
- }
2474
+ url: 'breakoutUnifiedUrl1',
2475
+ },
2476
+ },
2006
2477
  };
2007
2478
  lociArray = [mainLocus, breakoutLocus];
2008
2479
 
@@ -2045,8 +2516,8 @@ describe('plugin-meetings', () => {
2045
2516
  breakout: {
2046
2517
  sessionType: 'BREAKOUT',
2047
2518
  url: 'breakoutUnifiedUrl1',
2048
- }
2049
- }
2519
+ },
2520
+ },
2050
2521
  };
2051
2522
 
2052
2523
  webex.meetings.handleLocusEvent = sinon.stub();
@@ -2076,8 +2547,8 @@ describe('plugin-meetings', () => {
2076
2547
  breakout: {
2077
2548
  sessionType: 'MAIN',
2078
2549
  url: 'breakoutUnifiedUrl2',
2079
- }
2080
- }
2550
+ },
2551
+ },
2081
2552
  });
2082
2553
  assert.notCalled(webex.meetings.handleLocusEvent);
2083
2554
  });
@@ -2089,10 +2560,13 @@ describe('plugin-meetings', () => {
2089
2560
  breakout: {
2090
2561
  sessionType: 'MAIN',
2091
2562
  url: 'breakoutUnifiedUrl1',
2092
- }
2093
- }
2563
+ },
2564
+ },
2565
+ });
2566
+ assert.calledWith(webex.meetings.handleLocusEvent, {
2567
+ locus: breakoutLocus,
2568
+ locusUrl: breakoutLocus.url,
2094
2569
  });
2095
- assert.calledWith(webex.meetings.handleLocusEvent, {locus: breakoutLocus, locusUrl: breakoutLocus.url});
2096
2570
  });
2097
2571
  });
2098
2572
 
@@ -2116,17 +2590,16 @@ describe('plugin-meetings', () => {
2116
2590
  meeting.locusId = 'locus id';
2117
2591
  meeting.correlationId = 'correlation id';
2118
2592
  meeting.locusInfo = {
2119
- fullState: { lastActive: 'last active'},
2120
- info: { webExMeetingId: 'meeting id'}
2121
- }
2593
+ fullState: {lastActive: 'last active', sessionId: 'locus session id'},
2594
+ info: {webExMeetingId: 'meeting id'},
2595
+ };
2122
2596
  });
2123
2597
 
2124
2598
  afterEach(() => {
2125
2599
  sinon.restore();
2126
- })
2600
+ });
2127
2601
 
2128
2602
  it('sends metrics on success', async () => {
2129
-
2130
2603
  await meeting.uploadLogs();
2131
2604
 
2132
2605
  await testUtils.flushPromises();
@@ -2137,6 +2610,8 @@ describe('plugin-meetings', () => {
2137
2610
  feedbackId: 'correlation id',
2138
2611
  locusId: 'locus id',
2139
2612
  meetingId: 'meeting id',
2613
+ autoupload: true,
2614
+ locussessionid: 'locus session id',
2140
2615
  });
2141
2616
  });
2142
2617
 
@@ -2147,14 +2622,20 @@ describe('plugin-meetings', () => {
2147
2622
 
2148
2623
  await testUtils.flushPromises();
2149
2624
 
2150
- assert.calledOnceWithExactly(metricsSpy, 'js_sdk_upload_logs_failure', sinon.match({
2151
- callStart: 'last active',
2152
- correlationId: 'correlation id',
2153
- feedbackId: 'correlation id',
2154
- locusId: 'locus id',
2155
- meetingId: 'meeting id',
2156
- reason: 'fake error',
2157
- }));
2625
+ assert.calledOnceWithExactly(
2626
+ metricsSpy,
2627
+ 'js_sdk_upload_logs_failure',
2628
+ sinon.match({
2629
+ callStart: 'last active',
2630
+ correlationId: 'correlation id',
2631
+ feedbackId: 'correlation id',
2632
+ locusId: 'locus id',
2633
+ meetingId: 'meeting id',
2634
+ reason: 'fake error',
2635
+ autoupload: true,
2636
+ locussessionid: 'locus session id',
2637
+ })
2638
+ );
2158
2639
  });
2159
2640
  });
2160
2641
  });