@webex/plugin-meetings 2.60.0-next.9 → 2.60.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. package/README.md +8 -46
  2. package/dist/common/browser-detection.js +3 -2
  3. package/dist/common/browser-detection.js.map +1 -1
  4. package/dist/common/collection.js +4 -3
  5. package/dist/common/collection.js.map +1 -1
  6. package/dist/common/config.js +2 -1
  7. package/dist/common/config.js.map +1 -1
  8. package/dist/common/errors/captcha-error.js +2 -1
  9. package/dist/common/errors/captcha-error.js.map +1 -1
  10. package/dist/common/errors/intent-to-join.js +2 -1
  11. package/dist/common/errors/intent-to-join.js.map +1 -1
  12. package/dist/common/errors/join-meeting.js +2 -1
  13. package/dist/common/errors/join-meeting.js.map +1 -1
  14. package/dist/common/errors/media.js +2 -1
  15. package/dist/common/errors/media.js.map +1 -1
  16. package/dist/common/errors/parameter.js +4 -3
  17. package/dist/common/errors/parameter.js.map +1 -1
  18. package/dist/common/errors/password-error.js +2 -1
  19. package/dist/common/errors/password-error.js.map +1 -1
  20. package/dist/common/errors/permission.js +2 -1
  21. package/dist/common/errors/permission.js.map +1 -1
  22. package/dist/common/errors/{reclaim-host-role-errors.js → reclaim-host-role-error.js} +11 -7
  23. package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
  24. package/dist/common/errors/reconnection-in-progress.js +2 -1
  25. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  26. package/dist/common/errors/reconnection.js +2 -1
  27. package/dist/common/errors/reconnection.js.map +1 -1
  28. package/dist/common/errors/stats.js +2 -1
  29. package/dist/common/errors/stats.js.map +1 -1
  30. package/dist/common/errors/webex-errors.d.ts +8 -20
  31. package/dist/common/errors/webex-errors.js +28 -48
  32. package/dist/common/errors/webex-errors.js.map +1 -1
  33. package/dist/common/errors/webex-meetings-error.js +2 -1
  34. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  35. package/dist/common/events/events-scope.js +2 -1
  36. package/dist/common/events/events-scope.js.map +1 -1
  37. package/dist/common/events/events.js +2 -1
  38. package/dist/common/events/events.js.map +1 -1
  39. package/dist/common/events/trigger-proxy.js +2 -1
  40. package/dist/common/events/trigger-proxy.js.map +1 -1
  41. package/dist/common/events/util.js +2 -1
  42. package/dist/common/events/util.js.map +1 -1
  43. package/dist/common/logs/logger-config.js +2 -1
  44. package/dist/common/logs/logger-config.js.map +1 -1
  45. package/dist/common/logs/logger-proxy.js +3 -2
  46. package/dist/common/logs/logger-proxy.js.map +1 -1
  47. package/dist/common/logs/request.d.ts +1 -3
  48. package/dist/common/logs/request.js +5 -8
  49. package/dist/common/logs/request.js.map +1 -1
  50. package/dist/common/queue.d.ts +7 -9
  51. package/dist/common/queue.js +9 -22
  52. package/dist/common/queue.js.map +1 -1
  53. package/dist/config.d.ts +7 -5
  54. package/dist/config.js +11 -8
  55. package/dist/config.js.map +1 -1
  56. package/dist/constants.d.ts +97 -217
  57. package/dist/constants.js +441 -416
  58. package/dist/constants.js.map +1 -1
  59. package/dist/controls-options-manager/constants.js +6 -3
  60. package/dist/controls-options-manager/constants.js.map +1 -1
  61. package/dist/controls-options-manager/enums.d.ts +1 -11
  62. package/dist/controls-options-manager/enums.js +6 -15
  63. package/dist/controls-options-manager/enums.js.map +1 -1
  64. package/dist/controls-options-manager/index.d.ts +1 -17
  65. package/dist/controls-options-manager/index.js +38 -127
  66. package/dist/controls-options-manager/index.js.map +1 -1
  67. package/dist/controls-options-manager/util.d.ts +7 -1
  68. package/dist/controls-options-manager/util.js +19 -309
  69. package/dist/controls-options-manager/util.js.map +1 -1
  70. package/dist/index.d.ts +3 -6
  71. package/dist/index.js +4 -116
  72. package/dist/index.js.map +1 -1
  73. package/dist/locus-info/controlsUtils.js +11 -100
  74. package/dist/locus-info/controlsUtils.js.map +1 -1
  75. package/dist/locus-info/embeddedAppsUtils.js +4 -3
  76. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  77. package/dist/locus-info/fullState.js +2 -1
  78. package/dist/locus-info/fullState.js.map +1 -1
  79. package/dist/locus-info/hostUtils.js +2 -1
  80. package/dist/locus-info/hostUtils.js.map +1 -1
  81. package/dist/locus-info/index.d.ts +4 -57
  82. package/dist/locus-info/index.js +84 -425
  83. package/dist/locus-info/index.js.map +1 -1
  84. package/dist/locus-info/infoUtils.js +5 -13
  85. package/dist/locus-info/infoUtils.js.map +1 -1
  86. package/dist/locus-info/mediaSharesUtils.js +3 -58
  87. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  88. package/dist/locus-info/parser.d.ts +6 -66
  89. package/dist/locus-info/parser.js +80 -253
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +13 -97
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.d.ts +0 -2
  94. package/dist/media/index.js +319 -107
  95. package/dist/media/index.js.map +1 -1
  96. package/dist/media/properties.d.ts +53 -38
  97. package/dist/media/properties.js +153 -96
  98. package/dist/media/properties.js.map +1 -1
  99. package/dist/media/util.js +22 -1
  100. package/dist/media/util.js.map +1 -1
  101. package/dist/mediaQualityMetrics/config.d.ts +230 -234
  102. package/dist/mediaQualityMetrics/config.js +498 -302
  103. package/dist/mediaQualityMetrics/config.js.map +1 -1
  104. package/dist/meeting/effectsState.d.ts +42 -0
  105. package/dist/meeting/effectsState.js +260 -0
  106. package/dist/meeting/effectsState.js.map +1 -0
  107. package/dist/meeting/in-meeting-actions.d.ts +0 -88
  108. package/dist/meeting/in-meeting-actions.js +3 -94
  109. package/dist/meeting/in-meeting-actions.js.map +1 -1
  110. package/dist/meeting/index.d.ts +494 -591
  111. package/dist/meeting/index.js +2969 -4707
  112. package/dist/meeting/index.js.map +1 -1
  113. package/dist/meeting/muteState.d.ts +25 -93
  114. package/dist/meeting/muteState.js +133 -224
  115. package/dist/meeting/muteState.js.map +1 -1
  116. package/dist/meeting/request.d.ts +47 -82
  117. package/dist/meeting/request.js +199 -297
  118. package/dist/meeting/request.js.map +1 -1
  119. package/dist/meeting/state.js +2 -1
  120. package/dist/meeting/state.js.map +1 -1
  121. package/dist/meeting/util.d.ts +1 -102
  122. package/dist/meeting/util.js +435 -605
  123. package/dist/meeting/util.js.map +1 -1
  124. package/dist/meeting-info/collection.js +4 -3
  125. package/dist/meeting-info/collection.js.map +1 -1
  126. package/dist/meeting-info/index.d.ts +1 -13
  127. package/dist/meeting-info/index.js +7 -74
  128. package/dist/meeting-info/index.js.map +1 -1
  129. package/dist/meeting-info/meeting-info-v2.d.ts +1 -31
  130. package/dist/meeting-info/meeting-info-v2.js +63 -200
  131. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  132. package/dist/meeting-info/request.js +2 -1
  133. package/dist/meeting-info/request.js.map +1 -1
  134. package/dist/meeting-info/util.js +3 -2
  135. package/dist/meeting-info/util.js.map +1 -1
  136. package/dist/meeting-info/utilv2.js +41 -39
  137. package/dist/meeting-info/utilv2.js.map +1 -1
  138. package/dist/meetings/collection.d.ts +0 -17
  139. package/dist/meetings/collection.js +4 -42
  140. package/dist/meetings/collection.js.map +1 -1
  141. package/dist/meetings/index.d.ts +21 -103
  142. package/dist/meetings/index.js +124 -486
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +3 -4
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +6 -107
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.d.ts +1 -13
  149. package/dist/member/index.js +2 -45
  150. package/dist/member/index.js.map +1 -1
  151. package/dist/member/member.types.js +4 -3
  152. package/dist/member/member.types.js.map +1 -1
  153. package/dist/member/util.js +29 -120
  154. package/dist/member/util.js.map +1 -1
  155. package/dist/members/collection.d.ts +0 -5
  156. package/dist/members/collection.js +2 -11
  157. package/dist/members/collection.js.map +1 -1
  158. package/dist/members/index.d.ts +11 -56
  159. package/dist/members/index.js +47 -174
  160. package/dist/members/index.js.map +1 -1
  161. package/dist/members/request.d.ts +11 -67
  162. package/dist/members/request.js +54 -102
  163. package/dist/members/request.js.map +1 -1
  164. package/dist/members/types.js +4 -3
  165. package/dist/members/types.js.map +1 -1
  166. package/dist/members/util.d.ts +1 -214
  167. package/dist/members/util.js +284 -327
  168. package/dist/members/util.js.map +1 -1
  169. package/dist/metrics/config.d.ts +169 -0
  170. package/dist/metrics/config.js +289 -0
  171. package/dist/metrics/config.js.map +1 -0
  172. package/dist/metrics/constants.d.ts +6 -15
  173. package/dist/metrics/constants.js +9 -17
  174. package/dist/metrics/constants.js.map +1 -1
  175. package/dist/metrics/index.d.ts +111 -4
  176. package/dist/metrics/index.js +452 -4
  177. package/dist/metrics/index.js.map +1 -1
  178. package/dist/networkQualityMonitor/index.js +4 -5
  179. package/dist/networkQualityMonitor/index.js.map +1 -1
  180. package/dist/peer-connection-manager/index.d.ts +6 -0
  181. package/dist/peer-connection-manager/index.js +671 -0
  182. package/dist/peer-connection-manager/index.js.map +1 -0
  183. package/dist/peer-connection-manager/util.d.ts +6 -0
  184. package/dist/peer-connection-manager/util.js +110 -0
  185. package/dist/peer-connection-manager/util.js.map +1 -0
  186. package/dist/personal-meeting-room/index.js +3 -2
  187. package/dist/personal-meeting-room/index.js.map +1 -1
  188. package/dist/personal-meeting-room/request.js +3 -2
  189. package/dist/personal-meeting-room/request.js.map +1 -1
  190. package/dist/personal-meeting-room/util.js +2 -1
  191. package/dist/personal-meeting-room/util.js.map +1 -1
  192. package/dist/reachability/index.d.ts +7 -62
  193. package/dist/reachability/index.js +72 -265
  194. package/dist/reachability/index.js.map +1 -1
  195. package/dist/reachability/request.d.ts +3 -7
  196. package/dist/reachability/request.js +10 -18
  197. package/dist/reachability/request.js.map +1 -1
  198. package/dist/reactions/reactions.d.ts +2 -2
  199. package/dist/reactions/reactions.js +6 -4
  200. package/dist/reactions/reactions.js.map +1 -1
  201. package/dist/reactions/reactions.type.d.ts +3 -23
  202. package/dist/reactions/reactions.type.js +23 -21
  203. package/dist/reactions/reactions.type.js.map +1 -1
  204. package/dist/reconnection-manager/index.d.ts +8 -32
  205. package/dist/reconnection-manager/index.js +231 -282
  206. package/dist/reconnection-manager/index.js.map +1 -1
  207. package/dist/recording-controller/enums.js +5 -4
  208. package/dist/recording-controller/enums.js.map +1 -1
  209. package/dist/recording-controller/index.d.ts +1 -15
  210. package/dist/recording-controller/index.js +46 -57
  211. package/dist/recording-controller/index.js.map +1 -1
  212. package/dist/recording-controller/util.d.ts +4 -5
  213. package/dist/recording-controller/util.js +10 -10
  214. package/dist/recording-controller/util.js.map +1 -1
  215. package/dist/roap/collection.d.ts +10 -0
  216. package/dist/roap/collection.js +63 -0
  217. package/dist/roap/collection.js.map +1 -0
  218. package/dist/roap/handler.d.ts +47 -0
  219. package/dist/roap/handler.js +279 -0
  220. package/dist/roap/handler.js.map +1 -0
  221. package/dist/roap/index.d.ts +47 -9
  222. package/dist/roap/index.js +235 -101
  223. package/dist/roap/index.js.map +1 -1
  224. package/dist/roap/request.d.ts +12 -18
  225. package/dist/roap/request.js +180 -126
  226. package/dist/roap/request.js.map +1 -1
  227. package/dist/roap/state.d.ts +9 -0
  228. package/dist/roap/state.js +127 -0
  229. package/dist/roap/state.js.map +1 -0
  230. package/dist/roap/turnDiscovery.d.ts +16 -27
  231. package/dist/roap/turnDiscovery.js +105 -115
  232. package/dist/roap/turnDiscovery.js.map +1 -1
  233. package/dist/roap/util.d.ts +2 -0
  234. package/dist/roap/util.js +76 -0
  235. package/dist/roap/util.js.map +1 -0
  236. package/dist/statsAnalyzer/global.d.ts +83 -1
  237. package/dist/statsAnalyzer/global.js +85 -2
  238. package/dist/statsAnalyzer/global.js.map +1 -1
  239. package/dist/statsAnalyzer/index.d.ts +30 -28
  240. package/dist/statsAnalyzer/index.js +509 -374
  241. package/dist/statsAnalyzer/index.js.map +1 -1
  242. package/dist/statsAnalyzer/mqaUtil.d.ts +6 -8
  243. package/dist/statsAnalyzer/mqaUtil.js +83 -116
  244. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  245. package/dist/transcription/index.js +2 -1
  246. package/dist/transcription/index.js.map +1 -1
  247. package/package.json +26 -35
  248. package/src/common/errors/webex-errors.ts +12 -36
  249. package/src/common/logs/logger-proxy.ts +1 -1
  250. package/src/common/logs/request.ts +1 -5
  251. package/src/common/queue.ts +8 -22
  252. package/src/config.ts +7 -5
  253. package/src/constants.ts +97 -244
  254. package/src/controls-options-manager/enums.ts +0 -12
  255. package/src/controls-options-manager/index.ts +21 -116
  256. package/src/controls-options-manager/util.ts +14 -294
  257. package/src/index.js +15 -0
  258. package/src/locus-info/controlsUtils.ts +0 -110
  259. package/src/locus-info/index.ts +61 -449
  260. package/src/locus-info/infoUtils.ts +2 -14
  261. package/src/locus-info/mediaSharesUtils.ts +0 -64
  262. package/src/locus-info/parser.ts +47 -258
  263. package/src/locus-info/selfUtils.ts +2 -85
  264. package/src/media/index.ts +370 -153
  265. package/src/media/properties.ts +136 -106
  266. package/src/media/util.ts +21 -0
  267. package/src/mediaQualityMetrics/config.ts +377 -244
  268. package/src/meeting/effectsState.ts +209 -0
  269. package/src/meeting/in-meeting-actions.ts +0 -176
  270. package/src/meeting/index.ts +2482 -3929
  271. package/src/meeting/muteState.ts +138 -224
  272. package/src/meeting/request.ts +127 -207
  273. package/src/meeting/util.ts +423 -590
  274. package/src/meeting-info/index.ts +8 -81
  275. package/src/meeting-info/meeting-info-v2.ts +13 -163
  276. package/src/meeting-info/util.ts +1 -1
  277. package/src/meeting-info/utilv2.ts +28 -28
  278. package/src/meetings/collection.ts +0 -33
  279. package/src/meetings/index.ts +126 -486
  280. package/src/meetings/request.ts +0 -2
  281. package/src/meetings/util.ts +5 -116
  282. package/src/member/index.ts +1 -43
  283. package/src/member/util.ts +28 -125
  284. package/src/members/collection.ts +0 -8
  285. package/src/members/index.ts +52 -187
  286. package/src/members/request.ts +27 -87
  287. package/src/members/util.ts +291 -332
  288. package/src/metrics/config.ts +485 -0
  289. package/src/metrics/constants.ts +6 -15
  290. package/src/metrics/index.ts +471 -1
  291. package/src/networkQualityMonitor/index.ts +6 -6
  292. package/src/peer-connection-manager/index.ts +847 -0
  293. package/src/peer-connection-manager/util.ts +119 -0
  294. package/src/reachability/index.ts +45 -238
  295. package/src/reachability/request.ts +8 -17
  296. package/src/reactions/reactions.ts +4 -4
  297. package/src/reactions/reactions.type.ts +4 -30
  298. package/src/reconnection-manager/index.ts +156 -168
  299. package/src/recording-controller/index.ts +3 -20
  300. package/src/recording-controller/util.ts +9 -26
  301. package/src/roap/collection.ts +62 -0
  302. package/src/roap/handler.ts +294 -0
  303. package/src/roap/index.ts +241 -98
  304. package/src/roap/request.ts +148 -74
  305. package/src/roap/state.ts +156 -0
  306. package/src/roap/turnDiscovery.ts +56 -62
  307. package/src/roap/util.ts +100 -0
  308. package/src/statsAnalyzer/global.ts +84 -1
  309. package/src/statsAnalyzer/index.ts +642 -413
  310. package/src/statsAnalyzer/mqaUtil.ts +114 -111
  311. package/test/integration/spec/journey.js +264 -320
  312. package/test/integration/spec/space-meeting.js +4 -77
  313. package/test/unit/spec/common/queue.js +2 -31
  314. package/test/unit/spec/controls-options-manager/index.js +0 -163
  315. package/test/unit/spec/controls-options-manager/util.js +60 -576
  316. package/test/unit/spec/fixture/locus.js +0 -1
  317. package/test/unit/spec/locus-info/controlsUtils.js +30 -323
  318. package/test/unit/spec/locus-info/index.js +15 -1389
  319. package/test/unit/spec/locus-info/infoUtils.js +16 -54
  320. package/test/unit/spec/locus-info/lib/SeqCmp.json +0 -16
  321. package/test/unit/spec/locus-info/lib/selfConstant.js +0 -48
  322. package/test/unit/spec/locus-info/parser.js +35 -116
  323. package/test/unit/spec/locus-info/selfUtils.js +0 -275
  324. package/test/unit/spec/media/properties.ts +84 -75
  325. package/test/unit/spec/meeting/effectsState.js +281 -0
  326. package/test/unit/spec/meeting/in-meeting-actions.ts +0 -86
  327. package/test/unit/spec/meeting/index.js +3136 -8547
  328. package/test/unit/spec/meeting/muteState.js +213 -409
  329. package/test/unit/spec/meeting/request.js +42 -512
  330. package/test/unit/spec/meeting/utils.js +24 -741
  331. package/test/unit/spec/meeting-info/meetinginfov2.js +5 -527
  332. package/test/unit/spec/meeting-info/utilv2.js +0 -21
  333. package/test/unit/spec/meetings/collection.js +0 -26
  334. package/test/unit/spec/meetings/index.js +211 -1278
  335. package/test/unit/spec/meetings/utils.js +2 -202
  336. package/test/unit/spec/member/index.js +9 -32
  337. package/test/unit/spec/member/util.js +61 -499
  338. package/test/unit/spec/members/index.js +5 -394
  339. package/test/unit/spec/members/request.js +27 -206
  340. package/test/unit/spec/members/utils.js +38 -173
  341. package/test/unit/spec/metrics/index.js +50 -1
  342. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  343. package/test/unit/spec/peerconnection-manager/index.js +218 -0
  344. package/test/unit/spec/peerconnection-manager/utils.js +49 -0
  345. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +388 -0
  346. package/test/unit/spec/reachability/index.ts +24 -598
  347. package/test/unit/spec/reconnection-manager/index.js +24 -162
  348. package/test/unit/spec/recording-controller/index.js +218 -293
  349. package/test/unit/spec/recording-controller/util.js +96 -223
  350. package/test/unit/spec/roap/index.ts +76 -200
  351. package/test/unit/spec/roap/turnDiscovery.ts +48 -86
  352. package/test/unit/spec/roap/util.js +30 -0
  353. package/test/unit/spec/stats-analyzer/index.js +174 -188
  354. package/test/utils/testUtils.js +45 -0
  355. package/test/utils/webex-config.js +0 -4
  356. package/test/utils/webex-test-users.js +3 -7
  357. package/dist/annotation/annotation.types.d.ts +0 -42
  358. package/dist/annotation/annotation.types.js +0 -7
  359. package/dist/annotation/annotation.types.js.map +0 -1
  360. package/dist/annotation/constants.d.ts +0 -31
  361. package/dist/annotation/constants.js +0 -41
  362. package/dist/annotation/constants.js.map +0 -1
  363. package/dist/annotation/index.d.ts +0 -117
  364. package/dist/annotation/index.js +0 -357
  365. package/dist/annotation/index.js.map +0 -1
  366. package/dist/breakouts/breakout.d.ts +0 -8
  367. package/dist/breakouts/breakout.js +0 -215
  368. package/dist/breakouts/breakout.js.map +0 -1
  369. package/dist/breakouts/collection.d.ts +0 -5
  370. package/dist/breakouts/collection.js +0 -22
  371. package/dist/breakouts/collection.js.map +0 -1
  372. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  373. package/dist/breakouts/edit-lock-error.js +0 -51
  374. package/dist/breakouts/edit-lock-error.js.map +0 -1
  375. package/dist/breakouts/events.d.ts +0 -8
  376. package/dist/breakouts/events.js +0 -44
  377. package/dist/breakouts/events.js.map +0 -1
  378. package/dist/breakouts/index.d.ts +0 -5
  379. package/dist/breakouts/index.js +0 -1047
  380. package/dist/breakouts/index.js.map +0 -1
  381. package/dist/breakouts/request.d.ts +0 -22
  382. package/dist/breakouts/request.js +0 -77
  383. package/dist/breakouts/request.js.map +0 -1
  384. package/dist/breakouts/utils.d.ts +0 -15
  385. package/dist/breakouts/utils.js +0 -64
  386. package/dist/breakouts/utils.js.map +0 -1
  387. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  388. package/dist/common/errors/no-meeting-info.js +0 -50
  389. package/dist/common/errors/no-meeting-info.js.map +0 -1
  390. package/dist/common/errors/reclaim-host-role-errors.js.map +0 -1
  391. package/dist/controls-options-manager/types.d.ts +0 -43
  392. package/dist/controls-options-manager/types.js +0 -7
  393. package/dist/controls-options-manager/types.js.map +0 -1
  394. package/dist/interpretation/collection.d.ts +0 -5
  395. package/dist/interpretation/collection.js +0 -22
  396. package/dist/interpretation/collection.js.map +0 -1
  397. package/dist/interpretation/index.d.ts +0 -5
  398. package/dist/interpretation/index.js +0 -365
  399. package/dist/interpretation/index.js.map +0 -1
  400. package/dist/interpretation/siLanguage.d.ts +0 -5
  401. package/dist/interpretation/siLanguage.js +0 -24
  402. package/dist/interpretation/siLanguage.js.map +0 -1
  403. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  404. package/dist/meeting/locusMediaRequest.js +0 -291
  405. package/dist/meeting/locusMediaRequest.js.map +0 -1
  406. package/dist/meeting/request.type.d.ts +0 -11
  407. package/dist/meeting/request.type.js +0 -7
  408. package/dist/meeting/request.type.js.map +0 -1
  409. package/dist/meetings/meetings.types.d.ts +0 -4
  410. package/dist/meetings/meetings.types.js +0 -7
  411. package/dist/meetings/meetings.types.js.map +0 -1
  412. package/dist/member/types.d.ts +0 -32
  413. package/dist/member/types.js +0 -23
  414. package/dist/member/types.js.map +0 -1
  415. package/dist/multistream/mediaRequestManager.d.ts +0 -118
  416. package/dist/multistream/mediaRequestManager.js +0 -344
  417. package/dist/multistream/mediaRequestManager.js.map +0 -1
  418. package/dist/multistream/receiveSlot.d.ts +0 -68
  419. package/dist/multistream/receiveSlot.js +0 -200
  420. package/dist/multistream/receiveSlot.js.map +0 -1
  421. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  422. package/dist/multistream/receiveSlotManager.js +0 -174
  423. package/dist/multistream/receiveSlotManager.js.map +0 -1
  424. package/dist/multistream/remoteMedia.d.ts +0 -72
  425. package/dist/multistream/remoteMedia.js +0 -268
  426. package/dist/multistream/remoteMedia.js.map +0 -1
  427. package/dist/multistream/remoteMediaGroup.d.ts +0 -47
  428. package/dist/multistream/remoteMediaGroup.js +0 -267
  429. package/dist/multistream/remoteMediaGroup.js.map +0 -1
  430. package/dist/multistream/remoteMediaManager.d.ts +0 -285
  431. package/dist/multistream/remoteMediaManager.js +0 -1211
  432. package/dist/multistream/remoteMediaManager.js.map +0 -1
  433. package/dist/multistream/sendSlotManager.d.ts +0 -61
  434. package/dist/multistream/sendSlotManager.js +0 -236
  435. package/dist/multistream/sendSlotManager.js.map +0 -1
  436. package/dist/reactions/constants.d.ts +0 -3
  437. package/dist/reactions/constants.js +0 -12
  438. package/dist/reactions/constants.js.map +0 -1
  439. package/dist/rtcMetrics/constants.d.ts +0 -4
  440. package/dist/rtcMetrics/constants.js +0 -11
  441. package/dist/rtcMetrics/constants.js.map +0 -1
  442. package/dist/rtcMetrics/index.d.ts +0 -54
  443. package/dist/rtcMetrics/index.js +0 -140
  444. package/dist/rtcMetrics/index.js.map +0 -1
  445. package/dist/webinar/collection.d.ts +0 -16
  446. package/dist/webinar/collection.js +0 -43
  447. package/dist/webinar/collection.js.map +0 -1
  448. package/dist/webinar/index.d.ts +0 -5
  449. package/dist/webinar/index.js +0 -68
  450. package/dist/webinar/index.js.map +0 -1
  451. package/src/annotation/annotation.types.ts +0 -50
  452. package/src/annotation/constants.ts +0 -36
  453. package/src/annotation/index.ts +0 -328
  454. package/src/breakouts/README.md +0 -220
  455. package/src/breakouts/breakout.ts +0 -188
  456. package/src/breakouts/collection.ts +0 -19
  457. package/src/breakouts/edit-lock-error.ts +0 -25
  458. package/src/breakouts/events.ts +0 -56
  459. package/src/breakouts/index.ts +0 -925
  460. package/src/breakouts/request.ts +0 -55
  461. package/src/breakouts/utils.ts +0 -57
  462. package/src/common/errors/no-meeting-info.ts +0 -24
  463. package/src/controls-options-manager/types.ts +0 -59
  464. package/src/index.ts +0 -40
  465. package/src/interpretation/README.md +0 -60
  466. package/src/interpretation/collection.ts +0 -19
  467. package/src/interpretation/index.ts +0 -332
  468. package/src/interpretation/siLanguage.ts +0 -18
  469. package/src/meeting/locusMediaRequest.ts +0 -313
  470. package/src/meeting/request.type.ts +0 -13
  471. package/src/meetings/meetings.types.ts +0 -12
  472. package/src/member/types.ts +0 -38
  473. package/src/multistream/mediaRequestManager.ts +0 -440
  474. package/src/multistream/receiveSlot.ts +0 -184
  475. package/src/multistream/receiveSlotManager.ts +0 -166
  476. package/src/multistream/remoteMedia.ts +0 -254
  477. package/src/multistream/remoteMediaGroup.ts +0 -284
  478. package/src/multistream/remoteMediaManager.ts +0 -1145
  479. package/src/multistream/sendSlotManager.ts +0 -170
  480. package/src/reactions/constants.ts +0 -4
  481. package/src/rtcMetrics/constants.ts +0 -3
  482. package/src/rtcMetrics/index.ts +0 -124
  483. package/src/webinar/collection.ts +0 -31
  484. package/src/webinar/index.ts +0 -62
  485. package/test/integration/spec/converged-space-meetings.js +0 -233
  486. package/test/unit/spec/annotation/index.ts +0 -418
  487. package/test/unit/spec/breakouts/breakout.ts +0 -237
  488. package/test/unit/spec/breakouts/collection.ts +0 -15
  489. package/test/unit/spec/breakouts/edit-lock-error.ts +0 -30
  490. package/test/unit/spec/breakouts/events.ts +0 -89
  491. package/test/unit/spec/breakouts/index.ts +0 -1790
  492. package/test/unit/spec/breakouts/request.ts +0 -104
  493. package/test/unit/spec/breakouts/utils.js +0 -72
  494. package/test/unit/spec/interpretation/collection.ts +0 -15
  495. package/test/unit/spec/interpretation/index.ts +0 -589
  496. package/test/unit/spec/interpretation/siLanguage.ts +0 -28
  497. package/test/unit/spec/locus-info/mediaSharesUtils.ts +0 -32
  498. package/test/unit/spec/media/index.ts +0 -290
  499. package/test/unit/spec/meeting/locusMediaRequest.ts +0 -442
  500. package/test/unit/spec/meeting-info/index.js +0 -300
  501. package/test/unit/spec/multistream/mediaRequestManager.ts +0 -1418
  502. package/test/unit/spec/multistream/receiveSlot.ts +0 -163
  503. package/test/unit/spec/multistream/receiveSlotManager.ts +0 -203
  504. package/test/unit/spec/multistream/remoteMedia.ts +0 -255
  505. package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -662
  506. package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1924
  507. package/test/unit/spec/multistream/sendSlotManager.ts +0 -242
  508. package/test/unit/spec/reachability/request.js +0 -68
  509. package/test/unit/spec/roap/request.ts +0 -232
  510. package/test/unit/spec/rtcMetrics/index.ts +0 -93
  511. package/test/unit/spec/webinar/collection.ts +0 -13
  512. package/test/unit/spec/webinar/index.ts +0 -60
  513. package/test/utils/constants.js +0 -9
  514. package/test/utils/integrationTestUtils.js +0 -46
  515. /package/dist/common/errors/{reclaim-host-role-errors.d.ts → reclaim-host-role-error.d.ts} +0 -0
  516. /package/src/common/errors/{reclaim-host-role-errors.ts → reclaim-host-role-error.ts} +0 -0
@@ -3,10 +3,6 @@
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
-
10
6
  import Device from '@webex/internal-plugin-device';
11
7
  import Mercury from '@webex/internal-plugin-mercury';
12
8
  import {assert} from '@webex/test-helper-chai';
@@ -15,8 +11,8 @@ import sinon from 'sinon';
15
11
  import uuid from 'uuid';
16
12
  import StaticConfig from '@webex/plugin-meetings/src/common/config';
17
13
  import TriggerProxy from '@webex/plugin-meetings/src/common/events/trigger-proxy';
18
- import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
19
14
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
15
+ import MediaUtil from '@webex/plugin-meetings/src/media/util';
20
16
  import Meeting from '@webex/plugin-meetings/src/meeting';
21
17
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
22
18
  import Meetings from '@webex/plugin-meetings/src/meetings';
@@ -24,7 +20,6 @@ import MeetingCollection from '@webex/plugin-meetings/src/meetings/collection';
24
20
  import MeetingsUtil from '@webex/plugin-meetings/src/meetings/util';
25
21
  import PersonalMeetingRoom from '@webex/plugin-meetings/src/personal-meeting-room';
26
22
  import Reachability from '@webex/plugin-meetings/src/reachability';
27
- import Metrics from '@webex/plugin-meetings/src/metrics';
28
23
 
29
24
  import testUtils from '../../../utils/testUtils';
30
25
  import {
@@ -35,12 +30,6 @@ import {
35
30
  LOCUSINFO,
36
31
  EVENT_TRIGGERS,
37
32
  } from '../../../../src/constants';
38
- import CaptchaError from '@webex/plugin-meetings/src/common/errors/captcha-error';
39
- import {forEach} from 'lodash';
40
- import PasswordError from '@webex/plugin-meetings/src/common/errors/password-error';
41
- import PermissionError from '@webex/plugin-meetings/src/common/errors/permission';
42
- import {NoiseReductionEffect, VirtualBackgroundEffect} from '@webex/media-helpers';
43
- import NoMeetingInfoError from '../../../../src/common/errors/no-meeting-info';
44
33
 
45
34
  describe('plugin-meetings', () => {
46
35
  const logger = {
@@ -52,8 +41,6 @@ describe('plugin-meetings', () => {
52
41
  debug: () => {},
53
42
  };
54
43
 
55
- let triggerProxyStub;
56
-
57
44
  beforeEach(() => {
58
45
  StaticConfig.set({
59
46
  bandwidth: {
@@ -65,7 +52,7 @@ describe('plugin-meetings', () => {
65
52
  verboseEvents: true,
66
53
  enable: false,
67
54
  });
68
- triggerProxyStub = sinon.stub(TriggerProxy, 'trigger').returns(true);
55
+ TriggerProxy.trigger = sinon.stub().returns(true);
69
56
  });
70
57
 
71
58
  let webex;
@@ -74,20 +61,15 @@ describe('plugin-meetings', () => {
74
61
  let url1;
75
62
  let test1;
76
63
  let test2;
77
- let locusInfo;
78
64
 
79
65
  describe('meetings index', () => {
80
66
  beforeEach(() => {
81
67
  MeetingsUtil.checkH264Support = sinon.stub();
82
- uuid1 = uuid.v4();
68
+ uuid1 = uuid.v4();
83
69
  url1 = `https://example.com/${uuid.v4()}`;
84
70
  uri1 = `test-${uuid.v4()}@example.com`;
85
71
  test1 = `test-${uuid.v4()}`;
86
72
  test2 = `test2-${uuid.v4()}`;
87
- locusInfo = {
88
- parse: sinon.stub().returns(true),
89
- updateMainSessionLocusCache: sinon.stub(),
90
- };
91
73
  webex = new MockWebex({
92
74
  children: {
93
75
  device: Device,
@@ -126,7 +108,6 @@ describe('plugin-meetings', () => {
126
108
  });
127
109
 
128
110
  Object.assign(webex.internal, {
129
- llm: {on: sinon.stub()},
130
111
  device: {
131
112
  deviceType: 'FAKE_DEVICE',
132
113
  register: sinon.stub().returns(Promise.resolve()),
@@ -170,10 +151,6 @@ describe('plugin-meetings', () => {
170
151
  webex.emit('ready');
171
152
  });
172
153
 
173
- afterEach(() => {
174
- sinon.restore();
175
- });
176
-
177
154
  it('has a webex instance with a meetings property', () => {
178
155
  assert.exists(webex, 'webex was initialized with children');
179
156
  assert.exists(webex.meetings, 'meetings child was set up on the webex instance');
@@ -240,6 +217,34 @@ describe('plugin-meetings', () => {
240
217
  });
241
218
  });
242
219
 
220
+ describe('#_toggleTurnDiscovery', () => {
221
+ it('should have toggleAdhocMeetings', () => {
222
+ assert.equal(typeof webex.meetings._toggleTurnDiscovery, 'function');
223
+ });
224
+
225
+ describe('success', () => {
226
+ it('should update meetings to do TURN discovery', () => {
227
+ webex.meetings._toggleTurnDiscovery(true);
228
+ assert.equal(webex.meetings.config.experimental.enableTurnDiscovery, true);
229
+
230
+ webex.meetings._toggleTurnDiscovery(false);
231
+ assert.equal(webex.meetings.config.experimental.enableTurnDiscovery, false);
232
+ });
233
+ });
234
+
235
+ describe('failure', () => {
236
+ it('should not accept non boolean input', () => {
237
+ const currentEnableTurnDiscovery = webex.meetings.config.experimental.enableTurnDiscovery;
238
+
239
+ webex.meetings._toggleTurnDiscovery('test');
240
+ assert.equal(
241
+ webex.meetings.config.experimental.enableAdhocMeetings,
242
+ currentEnableTurnDiscovery
243
+ );
244
+ });
245
+ });
246
+ });
247
+
243
248
  describe('Public API Contracts', () => {
244
249
  describe('#register', () => {
245
250
  it('emits an event and resolves when register succeeds', async () => {
@@ -333,110 +338,37 @@ describe('plugin-meetings', () => {
333
338
  });
334
339
  });
335
340
 
336
- describe('virtual background effect', () => {
337
- beforeEach(() => {
338
- webex.credentials = {
339
- supertoken: {
340
- access_token: 'fake_token',
341
- },
342
- };
343
- });
344
-
345
- it('creates background effect', async () => {
346
- const result = await webex.meetings.createVirtualBackgroundEffect();
347
-
348
- assert.exists(result);
349
- assert.instanceOf(result, VirtualBackgroundEffect);
350
- assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'options']);
351
- assert.deepEqual(result.options, {
352
- mode: 'BLUR',
353
- blurStrength: 'STRONG',
354
- generator: 'worker',
355
- quality: 'LOW',
356
- authToken: 'fake_token',
357
- mirror: false,
358
- });
359
- assert.exists(result.enable);
360
- assert.exists(result.disable);
361
- assert.exists(result.dispose);
362
- });
363
-
364
- it('creates background effect with custom options passed', async () => {
365
- const effectOptions = {
366
- generator: 'local',
367
- frameRate: 45,
368
- mode: 'IMAGE',
369
- mirror: false,
370
- quality: 'HIGH',
371
- blurStrength: 'STRONG',
372
- bgImageUrl: 'https://test.webex.com/landscape.5a535788.jpg',
373
- };
374
-
375
- const result = await webex.meetings.createVirtualBackgroundEffect(effectOptions);
376
-
377
- assert.exists(result);
378
- assert.instanceOf(result, VirtualBackgroundEffect);
379
- assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'options']);
380
- assert.deepEqual(result.options, {...effectOptions, authToken: 'fake_token'});
381
- assert.exists(result.enable);
382
- assert.exists(result.disable);
383
- assert.exists(result.dispose);
384
- });
385
- });
386
-
387
- describe('noise reduction effect', () => {
388
- beforeEach(() => {
389
- webex.credentials = {
390
- supertoken: {
391
- access_token: 'fake_token',
392
- },
393
- };
394
- });
395
-
396
- it('creates noise reduction effect', async () => {
397
- const result = await webex.meetings.createNoiseReductionEffect({audioContext: {}});
398
-
399
- assert.exists(result);
400
- assert.instanceOf(result, NoiseReductionEffect);
401
- assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
402
- assert.deepEqual(result.options, {
403
- authToken: 'fake_token',
404
- audioContext: {},
405
- });
406
- assert.exists(result.enable);
407
- assert.exists(result.disable);
408
- assert.exists(result.dispose);
409
- });
410
-
411
- it('creates noise reduction effect with custom options passed', async () => {
412
- const effectOptions = {
413
- audioContext: {},
414
- mode: 'WORKLET',
415
- env: 'prod',
416
- };
417
-
418
- const result = await webex.meetings.createNoiseReductionEffect(effectOptions);
419
-
420
- assert.exists(result);
421
- assert.instanceOf(result, NoiseReductionEffect);
422
- assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
423
- assert.deepEqual(result.options, {...effectOptions, authToken: 'fake_token'});
424
- assert.exists(result.enable);
425
- assert.exists(result.disable);
426
- assert.exists(result.dispose);
427
- });
428
- });
429
-
430
341
  describe('gets', () => {
431
342
  describe('#getReachability', () => {
432
343
  it('should have #getReachability', () => {
433
344
  assert.exists(webex.meetings.getReachability);
434
345
  });
435
- it('gets the reachability data instance from webex.meetings', () => {
436
- const reachability = webex.meetings.getReachability();
346
+ describe('before #setReachability', () => {
347
+ it('does not get a reachability instance', () => {
348
+ const reachability = webex.meetings.getReachability();
349
+
350
+ assert.notExists(
351
+ reachability,
352
+ 'reachability is undefined because #setReachability has not been called'
353
+ );
354
+ });
355
+ });
356
+ describe('after #setReachability', () => {
357
+ beforeEach(() => {
358
+ webex.meetings.setReachability();
359
+ const reachabilityMocker = webex.meetings.getReachability();
360
+
361
+ sinon.stub(reachabilityMocker, 'gatherReachability').returns(true);
362
+ });
363
+ it('gets the reachability data instance from webex.meetings', () => {
364
+ const reachability = webex.meetings.getReachability();
437
365
 
438
- assert.exists(reachability, 'reachability is defined');
439
- assert.instanceOf(reachability, Reachability, 'should be a reachability instance');
366
+ assert.exists(
367
+ reachability,
368
+ 'reachability is defined because #setReachability has been called'
369
+ );
370
+ assert.instanceOf(reachability, Reachability, 'should be a reachability instance');
371
+ });
440
372
  });
441
373
  });
442
374
  describe('#getPersonalMeetingRoom', () => {
@@ -511,16 +443,21 @@ describe('plugin-meetings', () => {
511
443
  );
512
444
  });
513
445
  describe('when meeting is returned', () => {
446
+ let parse;
447
+
514
448
  beforeEach(() => {
449
+ parse = sinon.stub().returns(true);
515
450
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
516
- locusInfo,
451
+ locusInfo: {
452
+ parse,
453
+ },
517
454
  });
518
455
  });
519
456
  it('tests the sync meeting calls for existing meeting', async () => {
520
457
  await webex.meetings.syncMeetings();
521
458
  assert.calledOnce(webex.meetings.request.getActiveMeetings);
522
459
  assert.calledOnce(webex.meetings.meetingCollection.getByKey);
523
- assert.calledOnce(locusInfo.parse);
460
+ assert.calledOnce(parse);
524
461
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
525
462
  });
526
463
  });
@@ -533,7 +470,6 @@ describe('plugin-meetings', () => {
533
470
  webex.meetings.create = sinon.stub().returns(
534
471
  Promise.resolve({
535
472
  locusInfo: {
536
- ...locusInfo,
537
473
  initialSetup,
538
474
  },
539
475
  })
@@ -542,7 +478,7 @@ describe('plugin-meetings', () => {
542
478
  it('tests the sync meeting calls for not existing meeting', async () => {
543
479
  await webex.meetings.syncMeetings();
544
480
  assert.calledOnce(webex.meetings.request.getActiveMeetings);
545
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
481
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
546
482
  assert.calledOnce(initialSetup);
547
483
  assert.calledOnce(webex.meetings.create);
548
484
  assert.calledWith(webex.meetings.request.getActiveMeetings);
@@ -566,9 +502,12 @@ describe('plugin-meetings', () => {
566
502
 
567
503
  beforeEach(() => {
568
504
  destroySpy = sinon.spy(webex.meetings, 'destroy');
505
+ parse = sinon.stub().returns(true);
569
506
  initialSetup = sinon.stub().returns(true);
570
507
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
571
- locusInfo,
508
+ locusInfo: {
509
+ parse,
510
+ },
572
511
  sendCallAnalyzerMetrics: sinon.stub(),
573
512
  });
574
513
  webex.meetings.meetingCollection.getAll = sinon.stub().returns({
@@ -635,104 +574,14 @@ describe('plugin-meetings', () => {
635
574
  });
636
575
  });
637
576
 
638
- const FAKE_USE_RANDOM_DELAY = true;
639
- const correlationId = 'my-correlationId';
640
- const callStateForMetrics = {
641
- correlationId: 'my-correlationId2',
642
- joinTrigger: 'my-join-trigger',
643
- loginType: 'my-login-type',
644
- };
645
-
646
- it('should call setCallStateForMetrics on any pre-existing meeting', async () => {
647
- const fakeMeeting = {setCallStateForMetrics: sinon.mock()};
648
- webex.meetings.meetingCollection.getByKey = sinon.stub().returns(fakeMeeting);
649
- await webex.meetings.create(
650
- test1,
651
- test2,
652
- FAKE_USE_RANDOM_DELAY,
653
- {},
654
- correlationId,
655
- true,
656
- callStateForMetrics
657
- );
658
- assert.calledOnceWithExactly(fakeMeeting.setCallStateForMetrics, {
659
- ...callStateForMetrics,
660
- correlationId,
661
- });
662
- });
663
-
664
- const checkCallCreateMeeting = async (createParameters, createMeetingParameters) => {
665
- const create = webex.meetings.create(...createParameters);
666
-
667
- assert.exists(create.then);
668
- await create;
669
- assert.calledOnce(webex.meetings.createMeeting);
670
- assert.calledWith(webex.meetings.createMeeting, ...createMeetingParameters);
671
- };
672
-
673
577
  it('calls createMeeting and returns its promise', async () => {
674
- await checkCallCreateMeeting(
675
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true],
676
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, true]
677
- );
678
- });
679
-
680
- it('calls createMeeting when failOnMissingMeetinginfo is undefined and returns its promise', async () => {
681
- await checkCallCreateMeeting(
682
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, undefined],
683
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, false]
684
- );
685
- });
686
-
687
- it('calls createMeeting when failOnMissingMeetinginfo is false and returns its promise', async () => {
688
- await checkCallCreateMeeting(
689
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, false],
690
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, false]
691
- );
692
- });
693
-
694
- it('calls createMeeting with callStateForMetrics and returns its promise', async () => {
695
- await checkCallCreateMeeting(
696
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, undefined, true, callStateForMetrics],
697
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, callStateForMetrics, true]
698
- );
699
- });
700
-
701
- it('calls createMeeting with callStateForMetrics overwritten with correlationId and returns its promise', async () => {
702
- await checkCallCreateMeeting(
703
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true, callStateForMetrics],
704
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {...callStateForMetrics, correlationId}, true]
705
- );
706
- });
707
-
708
- it('calls createMeeting with extra info params and returns its promise', async () => {
709
- const FAKE_USE_RANDOM_DELAY = false;
710
- const correlationId = 'my-correlationId';
711
-
712
- const FAKE_INFO_EXTRA_PARAMS = {
713
- mtid: 'm9fe0afd8c435e892afcce9ea25b97046',
714
- joinTXId: 'TSmrX61wNF',
715
- };
716
- const create = webex.meetings.create(
717
- test1,
718
- test2,
719
- FAKE_USE_RANDOM_DELAY,
720
- FAKE_INFO_EXTRA_PARAMS,
721
- correlationId
722
- );
578
+ const FAKE_USE_RANDOM_DELAY = true;
579
+ const create = webex.meetings.create(test1, test2, FAKE_USE_RANDOM_DELAY);
723
580
 
724
581
  assert.exists(create.then);
725
582
  await create;
726
583
  assert.calledOnce(webex.meetings.createMeeting);
727
- assert.calledWith(
728
- webex.meetings.createMeeting,
729
- test1,
730
- test2,
731
- FAKE_USE_RANDOM_DELAY,
732
- FAKE_INFO_EXTRA_PARAMS,
733
- {correlationId},
734
- false
735
- );
584
+ assert.calledWith(webex.meetings.createMeeting, test1, test2, FAKE_USE_RANDOM_DELAY);
736
585
  });
737
586
 
738
587
  it('creates a new meeting when a scheduled meeting exists in the conversation', async () => {
@@ -828,51 +677,45 @@ describe('plugin-meetings', () => {
828
677
  });
829
678
  describe('#handleLocusEvent', () => {
830
679
  describe('there was a meeting', () => {
680
+ let parse;
681
+
831
682
  beforeEach(() => {
683
+ parse = sinon.stub().returns(true);
832
684
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
833
- locusInfo,
685
+ locusInfo: {
686
+ parse,
687
+ },
834
688
  });
835
689
  });
836
- it('should parse the meeting info and update main session locus cache', () => {
837
- sinon.stub(MeetingsUtil, 'isBreakoutLocusDTO').returns(false);
690
+ it('should parse the meeting info', () => {
838
691
  webex.meetings.handleLocusEvent({
839
692
  locusUrl: url1,
840
693
  });
841
694
  assert.calledOnce(webex.meetings.meetingCollection.getByKey);
842
695
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
843
- assert.calledOnce(locusInfo.parse);
844
- assert.calledOnce(locusInfo.updateMainSessionLocusCache);
696
+ assert.calledOnce(parse);
845
697
  assert.calledWith(
846
- locusInfo.parse,
698
+ parse,
847
699
  {
848
- locusInfo,
700
+ locusInfo: {
701
+ parse,
702
+ },
849
703
  },
850
704
  {
851
705
  locusUrl: url1,
852
706
  }
853
707
  );
854
708
  });
855
-
856
- it('should not update main session locus cache', () => {
857
- sinon.stub(MeetingsUtil, 'isBreakoutLocusDTO').returns(true);
858
- webex.meetings.handleLocusEvent({
859
- locusUrl: url1,
860
- });
861
- assert.notCalled(locusInfo.updateMainSessionLocusCache);
862
- });
863
709
  });
864
710
  describe('there was not a meeting', () => {
865
711
  let initialSetup;
866
- const webExMeetingId = '123456';
867
712
 
868
713
  beforeEach(() => {
869
714
  initialSetup = sinon.stub().returns(true);
870
715
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns(undefined);
871
716
  webex.meetings.create = sinon.stub().returns(
872
717
  Promise.resolve({
873
- id: 'meeting-id',
874
718
  locusInfo: {
875
- ...locusInfo,
876
719
  initialSetup,
877
720
  },
878
721
  })
@@ -892,20 +735,12 @@ describe('plugin-meetings', () => {
892
735
  callbackAddress: uri1,
893
736
  },
894
737
  },
895
- info: {
896
- webExMeetingId,
897
- },
898
738
  },
899
739
  eventType: 'locus.difference',
900
740
  locusUrl: url1,
901
741
  });
902
- assert.callCount(webex.meetings.meetingCollection.getByKey, 6);
742
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
903
743
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
904
- assert.calledWith(
905
- webex.meetings.meetingCollection.getByKey,
906
- 'meetingNumber',
907
- webExMeetingId
908
- );
909
744
  assert.calledOnce(initialSetup);
910
745
  assert.calledWith(initialSetup, {
911
746
  id: uuid1,
@@ -919,9 +754,6 @@ describe('plugin-meetings', () => {
919
754
  callbackAddress: uri1,
920
755
  },
921
756
  },
922
- info: {
923
- webExMeetingId,
924
- },
925
757
  });
926
758
  });
927
759
  it('should setup the meeting by difference event without replaces', async () => {
@@ -933,20 +765,12 @@ describe('plugin-meetings', () => {
933
765
  callbackAddress: uri1,
934
766
  },
935
767
  },
936
- info: {
937
- webExMeetingId,
938
- },
939
768
  },
940
769
  eventType: 'locus.difference',
941
770
  locusUrl: url1,
942
771
  });
943
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
772
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
944
773
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
945
- assert.calledWith(
946
- webex.meetings.meetingCollection.getByKey,
947
- 'meetingNumber',
948
- webExMeetingId
949
- );
950
774
  assert.calledOnce(initialSetup);
951
775
  assert.calledWith(initialSetup, {
952
776
  id: uuid1,
@@ -955,44 +779,8 @@ describe('plugin-meetings', () => {
955
779
  callbackAddress: uri1,
956
780
  },
957
781
  },
958
- info: {
959
- webExMeetingId,
960
- },
961
- });
962
- });
963
-
964
- it('sends client event correctly on finally', async () => {
965
- webex.meetings.getMeetingByType = sinon.stub().returns(true);
966
-
967
- await webex.meetings.handleLocusEvent({
968
- locus: {
969
- id: uuid1,
970
- self: {
971
- callBackInfo: {
972
- callbackAddress: uri1,
973
- },
974
- },
975
- info: {
976
- webExMeetingId,
977
- },
978
- },
979
- eventType: 'locus.difference',
980
- locusUrl: url1,
981
- });
982
-
983
- await testUtils.flushPromises();
984
-
985
- assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
986
- name: 'client.call.remote-started',
987
- payload: {
988
- trigger: 'mercury-event',
989
- },
990
- options: {
991
- meetingId: 'meeting-id',
992
- },
993
782
  });
994
783
  });
995
-
996
784
  it('should setup the meeting by a not difference event', async () => {
997
785
  await webex.meetings.handleLocusEvent({
998
786
  locus: {
@@ -1002,20 +790,12 @@ describe('plugin-meetings', () => {
1002
790
  callbackAddress: uri1,
1003
791
  },
1004
792
  },
1005
- info: {
1006
- webExMeetingId,
1007
- },
1008
793
  },
1009
794
  eventType: test1,
1010
795
  locusUrl: url1,
1011
796
  });
1012
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
797
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
1013
798
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
1014
- assert.calledWith(
1015
- webex.meetings.meetingCollection.getByKey,
1016
- 'meetingNumber',
1017
- webExMeetingId
1018
- );
1019
799
  assert.calledOnce(initialSetup);
1020
800
  assert.calledWith(initialSetup, {
1021
801
  id: uuid1,
@@ -1024,9 +804,6 @@ describe('plugin-meetings', () => {
1024
804
  callbackAddress: uri1,
1025
805
  },
1026
806
  },
1027
- info: {
1028
- webExMeetingId,
1029
- },
1030
807
  });
1031
808
  });
1032
809
 
@@ -1049,7 +826,7 @@ describe('plugin-meetings', () => {
1049
826
 
1050
827
  it('should not try to match USM meetings by conversation url', async () => {
1051
828
  await webex.meetings.handleLocusEvent(generateFakeLocusData(true));
1052
- assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
829
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 3);
1053
830
  assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(0).args, [
1054
831
  'locusUrl',
1055
832
  url1,
@@ -1066,7 +843,7 @@ describe('plugin-meetings', () => {
1066
843
  });
1067
844
  it('should try to match non-USM meetings by conversation url', async () => {
1068
845
  await webex.meetings.handleLocusEvent(generateFakeLocusData(false));
1069
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
846
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
1070
847
  assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(0).args, [
1071
848
  'locusUrl',
1072
849
  url1,
@@ -1089,6 +866,7 @@ describe('plugin-meetings', () => {
1089
866
  });
1090
867
  describe('#createMeeting', () => {
1091
868
  beforeEach(() => {
869
+ MediaUtil.createPeerConnection = sinon.stub().returns(true);
1092
870
  webex.internal.device.userId = uuid1;
1093
871
  webex.internal.device.url = url1;
1094
872
  MeetingCollection.set = sinon.stub().returns(true);
@@ -1097,10 +875,6 @@ describe('plugin-meetings', () => {
1097
875
  });
1098
876
  describe('successful MeetingInfo.#fetchMeetingInfo', () => {
1099
877
  let clock, setTimeoutSpy, fakeMeetingStartTimeString, FAKE_TIME_TO_START;
1100
- const FAKE_INFO_EXTRA_PARAMS = {
1101
- mtid: 'm9fe0afd8c435e892afcce9ea25b97046',
1102
- joinTXId: 'TSmrX61wNF',
1103
- };
1104
878
 
1105
879
  beforeEach(() => {
1106
880
  clock = sinon.useFakeTimers();
@@ -1130,25 +904,13 @@ describe('plugin-meetings', () => {
1130
904
  meeting,
1131
905
  destination,
1132
906
  type,
1133
- extraParams = {},
1134
- expectedMeetingData = {},
1135
- sendCAevents = false
907
+ expectedMeetingData = {}
1136
908
  ) => {
1137
909
  assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
1138
910
  assert.calledOnce(MeetingsUtil.getMeetingAddedType);
1139
911
  assert.notCalled(setTimeoutSpy);
1140
- assert.callCount(TriggerProxy.trigger, 5);
1141
- assert.calledWith(
1142
- webex.meetings.meetingInfo.fetchMeetingInfo,
1143
- destination,
1144
- type,
1145
- null,
1146
- null,
1147
- undefined,
1148
- undefined,
1149
- extraParams,
1150
- {meetingId: meeting.id, sendCAevents}
1151
- );
912
+ assert.calledThrice(TriggerProxy.trigger);
913
+ assert.calledWith(webex.meetings.meetingInfo.fetchMeetingInfo, destination, type);
1152
914
  assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1153
915
 
1154
916
  if (expectedMeetingData.permissionToken) {
@@ -1157,15 +919,6 @@ describe('plugin-meetings', () => {
1157
919
  if (expectedMeetingData.meetingJoinUrl) {
1158
920
  assert.equal(meeting.meetingJoinUrl, expectedMeetingData.meetingJoinUrl);
1159
921
  }
1160
- if (expectedMeetingData.correlationId) {
1161
- assert.equal(meeting.correlationId, expectedMeetingData.correlationId);
1162
- }
1163
- if (expectedMeetingData.callStateForMetrics) {
1164
- assert.deepEqual(
1165
- meeting.callStateForMetrics,
1166
- expectedMeetingData.callStateForMetrics
1167
- );
1168
- }
1169
922
  assert.equal(meeting.destination, destination);
1170
923
  assert.equal(meeting.destinationType, type);
1171
924
  assert.calledWith(
@@ -1195,139 +948,107 @@ describe('plugin-meetings', () => {
1195
948
  const expectedMeetingData = {
1196
949
  permissionToken: 'PT',
1197
950
  meetingJoinUrl: 'meetingJoinUrl',
1198
- correlationId: meeting.id,
1199
951
  };
1200
952
 
1201
- checkCreateWithoutDelay(
953
+ checkCreateWithoutDelay(meeting, 'test destination', 'test type', expectedMeetingData);
954
+ });
955
+
956
+ it('creates the meeting from a successful meeting info fetch meeting resolve testing', async () => {
957
+ const meeting = await webex.meetings.createMeeting('test destination', 'test type');
958
+ const expectedMeetingData = {
959
+ permissionToken: 'PT',
960
+ meetingJoinUrl: 'meetingJoinUrl',
961
+ };
962
+
963
+ assert.instanceOf(
1202
964
  meeting,
1203
- 'test destination',
1204
- 'test type',
1205
- {},
1206
- expectedMeetingData
965
+ Meeting,
966
+ 'createMeeting should eventually resolve to a Meeting Object'
1207
967
  );
968
+ checkCreateWithoutDelay(meeting, 'test destination', 'test type', expectedMeetingData);
1208
969
  });
1209
970
 
1210
- [undefined, FAKE_INFO_EXTRA_PARAMS].forEach((infoExtraParams) => {
1211
- const infoExtraParamsProvided = infoExtraParams !== undefined;
1212
-
1213
- it(`creates the meeting from a successful meeting info fetch meeting resolve testing${
1214
- infoExtraParamsProvided ? ' with infoExtraParams' : ''
1215
- }`, async () => {
1216
- const meeting = await webex.meetings.createMeeting(
1217
- 'test destination',
1218
- 'test type',
1219
- false,
1220
- infoExtraParams
1221
- );
1222
- const expectedMeetingData = {
1223
- permissionToken: 'PT',
1224
- meetingJoinUrl: 'meetingJoinUrl',
1225
- };
1226
-
1227
- assert.instanceOf(
1228
- meeting,
1229
- Meeting,
1230
- 'createMeeting should eventually resolve to a Meeting Object'
1231
- );
1232
- checkCreateWithoutDelay(
1233
- meeting,
1234
- 'test destination',
1235
- 'test type',
1236
- infoExtraParamsProvided ? infoExtraParams : {},
1237
- expectedMeetingData
1238
- );
1239
- });
1240
-
1241
- it(`creates the meeting from a successful meeting info fetch with random delay${
1242
- infoExtraParamsProvided ? ' with infoExtraParams' : ''
1243
- }`, async () => {
1244
- const FAKE_LOCUS_MEETING = {
1245
- conversationUrl: 'locusConvURL',
1246
- url: 'locusUrl',
1247
- info: {
1248
- webExMeetingId: 'locusMeetingId',
1249
- sipUri: 'locusSipUri',
1250
- owner: 'locusOwner',
1251
- },
1252
- meeting: {
1253
- startTime: fakeMeetingStartTimeString,
1254
- },
1255
- fullState: {
1256
- active: false,
1257
- },
1258
- };
971
+ it('creates the meeting from a successful meeting info fetch with random delay', async () => {
972
+ const FAKE_LOCUS_MEETING = {
973
+ conversationUrl: 'locusConvURL',
974
+ url: 'locusUrl',
975
+ info: {
976
+ webExMeetingId: 'locusMeetingId',
977
+ sipUri: 'locusSipUri',
978
+ owner: 'locusOwner',
979
+ },
980
+ meeting: {
981
+ startTime: fakeMeetingStartTimeString,
982
+ },
983
+ fullState: {
984
+ active: false,
985
+ },
986
+ };
1259
987
 
1260
- const meeting = await webex.meetings.createMeeting(
1261
- FAKE_LOCUS_MEETING,
1262
- 'test type',
1263
- true,
1264
- infoExtraParams
1265
- );
988
+ const meeting = await webex.meetings.createMeeting(
989
+ FAKE_LOCUS_MEETING,
990
+ 'test type',
991
+ true
992
+ );
1266
993
 
1267
- assert.instanceOf(
1268
- meeting,
1269
- Meeting,
1270
- 'createMeeting should eventually resolve to a Meeting Object'
1271
- );
1272
- assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
1273
- assert.calledOnce(setTimeoutSpy);
1274
-
1275
- // Parse meeting info with locus object
1276
- assert.equal(meeting.conversationUrl, 'locusConvURL');
1277
- assert.equal(meeting.locusUrl, 'locusUrl');
1278
- assert.equal(meeting.sipUri, 'locusSipUri');
1279
- assert.equal(meeting.meetingNumber, 'locusMeetingId');
1280
- assert.isUndefined(meeting.meetingJoinUrl);
1281
- assert.equal(meeting.owner, 'locusOwner');
1282
- assert.isUndefined(meeting.permissionToken);
1283
-
1284
- // Add meeting and send trigger
1285
- assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1286
- assert.calledTwice(TriggerProxy.trigger);
1287
- assert.calledWith(
1288
- TriggerProxy.trigger,
1289
- sinon.match.instanceOf(Meetings),
1290
- {
1291
- file: 'meetings',
1292
- function: 'createMeeting',
1293
- },
1294
- 'meeting:added',
1295
- {
1296
- meeting: sinon.match.instanceOf(Meeting),
1297
- type: 'test meeting added type',
1298
- }
1299
- );
994
+ assert.instanceOf(
995
+ meeting,
996
+ Meeting,
997
+ 'createMeeting should eventually resolve to a Meeting Object'
998
+ );
999
+ assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
1000
+ assert.calledOnce(setTimeoutSpy);
1001
+
1002
+ // Parse meeting info with locus object
1003
+ assert.equal(meeting.conversationUrl, 'locusConvURL');
1004
+ assert.equal(meeting.locusUrl, 'locusUrl');
1005
+ assert.equal(meeting.sipUri, 'locusSipUri');
1006
+ assert.equal(meeting.meetingNumber, 'locusMeetingId');
1007
+ assert.isUndefined(meeting.meetingJoinUrl);
1008
+ assert.equal(meeting.owner, 'locusOwner');
1009
+ assert.isUndefined(meeting.permissionToken);
1010
+
1011
+ // Add meeting and send trigger
1012
+ assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1013
+ assert.calledTwice(TriggerProxy.trigger);
1014
+ assert.calledWith(
1015
+ TriggerProxy.trigger,
1016
+ sinon.match.instanceOf(Meetings),
1017
+ {
1018
+ file: 'meetings',
1019
+ function: 'createMeeting',
1020
+ },
1021
+ 'meeting:added',
1022
+ {
1023
+ meeting: sinon.match.instanceOf(Meeting),
1024
+ type: 'test meeting added type',
1025
+ }
1026
+ );
1300
1027
 
1301
- // When timer expires
1302
- clock.tick(FAKE_TIME_TO_START);
1303
- assert.calledWith(
1304
- webex.meetings.meetingInfo.fetchMeetingInfo,
1305
- FAKE_LOCUS_MEETING,
1306
- 'test type',
1307
- null,
1308
- null,
1309
- undefined,
1310
- undefined,
1311
- infoExtraParamsProvided ? infoExtraParams : {}
1312
- );
1028
+ // When timer expires
1029
+ clock.tick(FAKE_TIME_TO_START);
1030
+ assert.calledWith(
1031
+ webex.meetings.meetingInfo.fetchMeetingInfo,
1032
+ FAKE_LOCUS_MEETING,
1033
+ 'test type'
1034
+ );
1313
1035
 
1314
- // Parse meeting info is called again with new meeting info
1315
- await testUtils.flushPromises();
1316
- assert.equal(meeting.conversationUrl, 'locusConvURL');
1317
- assert.equal(meeting.locusUrl, 'locusUrl');
1318
- assert.equal(meeting.sipUri, 'locusSipUri');
1319
- assert.equal(meeting.meetingNumber, 'locusMeetingId');
1320
- assert.equal(meeting.meetingJoinUrl, 'meetingJoinUrl');
1321
- assert.equal(meeting.owner, 'locusOwner');
1322
- assert.equal(meeting.permissionToken, 'PT');
1036
+ // Parse meeting info is called again with new meeting info
1037
+ await testUtils.flushPromises();
1038
+ assert.equal(meeting.conversationUrl, 'locusConvURL');
1039
+ assert.equal(meeting.locusUrl, 'locusUrl');
1040
+ assert.equal(meeting.sipUri, 'locusSipUri');
1041
+ assert.equal(meeting.meetingNumber, 'locusMeetingId');
1042
+ assert.equal(meeting.meetingJoinUrl, 'meetingJoinUrl');
1043
+ assert.equal(meeting.owner, 'locusOwner');
1044
+ assert.equal(meeting.permissionToken, 'PT');
1323
1045
 
1324
- assert.calledWith(
1325
- TriggerProxy.trigger,
1326
- meeting,
1327
- {file: 'meetings', function: 'fetchMeetingInfo'},
1328
- 'meeting:meetingInfoAvailable'
1329
- );
1330
- });
1046
+ assert.calledWith(
1047
+ TriggerProxy.trigger,
1048
+ meeting,
1049
+ {file: 'meetings', function: 'fetchMeetingInfo'},
1050
+ 'meeting:meetingInfoAvailable'
1051
+ );
1331
1052
  });
1332
1053
 
1333
1054
  it('creates the meeting from a successful meeting info fetch that has no random delay because it is active', async () => {
@@ -1427,62 +1148,7 @@ describe('plugin-meetings', () => {
1427
1148
  );
1428
1149
  checkCreateWithoutDelay(meeting, FAKE_LOCUS_MEETING, 'test type');
1429
1150
  });
1430
-
1431
- it('creates meeting with the correlationId provided', async () => {
1432
- const meeting = await webex.meetings.createMeeting(
1433
- 'test destination',
1434
- 'test type',
1435
- false,
1436
- {},
1437
- {correlationId: 'my-correlationId'}
1438
- );
1439
-
1440
- const expectedMeetingData = {
1441
- correlationId: 'my-correlationId',
1442
- };
1443
-
1444
- checkCreateWithoutDelay(
1445
- meeting,
1446
- 'test destination',
1447
- 'test type',
1448
- {},
1449
- expectedMeetingData,
1450
- true
1451
- );
1452
- });
1453
-
1454
- it('creates meeting with the callStateForMetrics provided', async () => {
1455
- const meeting = await webex.meetings.createMeeting(
1456
- 'test destination',
1457
- 'test type',
1458
- false,
1459
- {},
1460
- {
1461
- correlationId: 'my-correlationId',
1462
- joinTrigger: 'my-join-trigger',
1463
- loginType: 'my-login-type',
1464
- }
1465
- );
1466
-
1467
- const expectedMeetingData = {
1468
- correlationId: 'my-correlationId',
1469
- callStateForMetrics: {
1470
- correlationId: 'my-correlationId',
1471
- joinTrigger: 'my-join-trigger',
1472
- loginType: 'my-login-type',
1473
- },
1474
- };
1475
-
1476
- checkCreateWithoutDelay(
1477
- meeting,
1478
- 'test destination',
1479
- 'test type',
1480
- {},
1481
- expectedMeetingData,
1482
- true
1483
- );
1484
- });
1485
- });
1151
+ });
1486
1152
 
1487
1153
  describe('rejected MeetingInfo.#fetchMeetingInfo', () => {
1488
1154
  beforeEach(() => {
@@ -1491,136 +1157,45 @@ describe('plugin-meetings', () => {
1491
1157
  webex.meetings.meetingInfo.fetchMeetingInfo = sinon
1492
1158
  .stub()
1493
1159
  .returns(Promise.reject(new Error('test')));
1494
- webex.meetings.destroy = sinon.stub().returns(Promise.resolve());
1495
- webex.meetings.createMeeting = sinon.spy(webex.meetings.createMeeting);
1496
1160
  });
1497
-
1498
- const checkCreateMeetingWithNoMeetingInfo = async (failOnMissingMeetingInfo, destroy) => {
1499
- try {
1500
- const meeting = await webex.meetings.createMeeting(
1501
- 'test destination',
1502
- 'test type',
1503
- undefined,
1504
- undefined,
1505
- undefined,
1506
- failOnMissingMeetingInfo
1507
- );
1508
-
1509
- assert.instanceOf(
1510
- meeting,
1511
- Meeting,
1512
- 'createMeeting should eventually resolve to a Meeting Object'
1513
- );
1514
- assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
1515
- assert.calledOnce(MeetingsUtil.getMeetingAddedType);
1516
- assert.calledThrice(TriggerProxy.trigger);
1517
- assert.calledWith(
1518
- webex.meetings.meetingInfo.fetchMeetingInfo,
1519
- 'test destination',
1520
- 'test type'
1521
- );
1522
-
1523
- if (destroy) {
1524
- assert.calledWith(
1525
- webex.meetings.destroy,
1526
- sinon.match.instanceOf(Meeting),
1527
- 'MISSING_MEETING_INFO'
1528
- );
1529
- assert.notCalled(MeetingsUtil.getMeetingAddedType);
1530
- assert.notCalled(TriggerProxy.trigger);
1531
- assert.throw(webex.meetings.createMeeting, 'meeting information not found');
1532
- } else {
1533
- assert.notCalled(webex.meetings.destroy);
1534
- assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1535
- assert.calledWith(
1536
- TriggerProxy.trigger,
1537
- sinon.match.instanceOf(Meetings),
1538
- {
1539
- file: 'meetings',
1540
- function: 'createMeeting',
1541
- },
1542
- 'meeting:added',
1543
- {
1544
- meeting: sinon.match.instanceOf(Meeting),
1545
- type: 'test meeting added type',
1546
- }
1547
- );
1548
- }
1549
- } catch (err) {
1550
- assert.instanceOf(err, NoMeetingInfoError);
1551
- }
1552
- };
1553
-
1554
1161
  it('creates the meeting from a rejected meeting info fetch', async () => {
1555
- checkCreateMeetingWithNoMeetingInfo(false, false);
1556
- });
1557
-
1558
- it('creates the meeting from a rejected meeting info fetch and destroys it if failOnMissingMeetingInfo', async () => {
1559
- checkCreateMeetingWithNoMeetingInfo(true, true);
1560
- });
1561
- });
1162
+ const meeting = await webex.meetings.createMeeting('test destination', 'test type');
1562
1163
 
1563
- describe('rejected MeetingInfo.#fetchMeetingInfo - does not log for known Error types', () => {
1564
- forEach(
1565
- [
1566
- {
1567
- error: new CaptchaError(),
1568
- debugLogMessage:
1569
- 'Meetings:index#createMeeting --> Debug CaptchaError: Captcha is required. fetching /meetingInfo for creation.',
1570
- },
1571
- {
1572
- error: new PasswordError(),
1573
- debugLogMessage:
1574
- 'Meetings:index#createMeeting --> Debug PasswordError: Password is required, please use verifyPassword() fetching /meetingInfo for creation.',
1575
- },
1164
+ assert.instanceOf(
1165
+ meeting,
1166
+ Meeting,
1167
+ 'createMeeting should eventually resolve to a Meeting Object'
1168
+ );
1169
+ assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
1170
+ assert.calledOnce(MeetingsUtil.getMeetingAddedType);
1171
+ assert.calledTwice(TriggerProxy.trigger);
1172
+ assert.calledWith(
1173
+ webex.meetings.meetingInfo.fetchMeetingInfo,
1174
+ 'test destination',
1175
+ 'test type'
1176
+ );
1177
+ assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1178
+ assert.calledWith(
1179
+ TriggerProxy.trigger,
1180
+ sinon.match.instanceOf(Meetings),
1576
1181
  {
1577
- error: new PermissionError(),
1578
- debugLogMessage:
1579
- 'Meetings:index#createMeeting --> Debug PermissionError: Not allowed to execute the function, some properties on server, or local client state do not allow you to complete this action. fetching /meetingInfo for creation.',
1182
+ file: 'meetings',
1183
+ function: 'createMeeting',
1580
1184
  },
1185
+ 'meeting:added',
1581
1186
  {
1582
- error: new Error(),
1583
- infoLogMessage: true,
1584
- debugLogMessage:
1585
- 'Meetings:index#createMeeting --> Debug Error fetching /meetingInfo for creation.',
1586
- },
1587
- ],
1588
- ({error, debugLogMessage, infoLogMessage}) => {
1589
- it('creates the meeting from a rejected meeting info fetch', async () => {
1590
- webex.meetings.meetingInfo.fetchMeetingInfo = sinon
1591
- .stub()
1592
- .returns(Promise.reject(error));
1593
-
1594
- LoggerProxy.logger.debug = sinon.stub();
1595
- LoggerProxy.logger.info = sinon.stub();
1596
-
1597
- const meeting = await webex.meetings.createMeeting('test destination', 'test type');
1598
-
1599
- assert.instanceOf(
1600
- meeting,
1601
- Meeting,
1602
- 'createMeeting should eventually resolve to a Meeting Object'
1603
- );
1604
-
1605
- assert.calledWith(LoggerProxy.logger.debug, debugLogMessage);
1606
-
1607
- if (infoLogMessage) {
1608
- assert.calledWith(
1609
- LoggerProxy.logger.info,
1610
- 'Meetings:index#createMeeting --> Info Unable to fetch meeting info for test destination.'
1611
- );
1612
- } else {
1613
- assert.notCalled(LoggerProxy.logger.info);
1614
- }
1615
- });
1616
- }
1617
- );
1187
+ meeting: sinon.match.instanceOf(Meeting),
1188
+ type: 'test meeting added type',
1189
+ }
1190
+ );
1191
+ });
1618
1192
  });
1619
1193
  });
1620
1194
  });
1621
1195
  describe('Public Event Triggers', () => {
1622
1196
  describe('#destroy', () => {
1623
1197
  beforeEach(() => {
1198
+ MediaUtil.createPeerConnection = sinon.stub().returns(true);
1624
1199
  MeetingUtil.cleanUp = sinon.stub();
1625
1200
  });
1626
1201
  it('should have #destroy', () => {
@@ -1694,8 +1269,6 @@ describe('plugin-meetings', () => {
1694
1269
  });
1695
1270
 
1696
1271
  describe('#fetchUserPreferredWebexSite', () => {
1697
- let loggerProxySpy;
1698
-
1699
1272
  it('should call request.getMeetingPreferences to get the preferred webex site ', async () => {
1700
1273
  assert.isDefined(webex.meetings.preferredWebexSite);
1701
1274
  await webex.meetings.fetchUserPreferredWebexSite();
@@ -1703,22 +1276,7 @@ describe('plugin-meetings', () => {
1703
1276
  assert.equal(webex.meetings.preferredWebexSite, 'go.webex.com');
1704
1277
  });
1705
1278
 
1706
- const setup = ({user} = {}) => {
1707
- loggerProxySpy = sinon.spy(LoggerProxy.logger, 'error');
1708
-
1709
- Object.assign(webex.internal, {
1710
- services: {
1711
- getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
1712
- },
1713
- user: {
1714
- get: sinon.stub().returns(Promise.resolve(user)),
1715
- },
1716
- });
1717
- };
1718
-
1719
1279
  it('should not fail if UserPreferred info is not fetched ', async () => {
1720
- setup();
1721
-
1722
1280
  Object.assign(webex.internal, {
1723
1281
  services: {
1724
1282
  getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
@@ -1728,115 +1286,7 @@ describe('plugin-meetings', () => {
1728
1286
  await webex.meetings.fetchUserPreferredWebexSite().then(() => {
1729
1287
  assert.equal(webex.meetings.preferredWebexSite, '');
1730
1288
  });
1731
- assert.calledOnceWithExactly(
1732
- loggerProxySpy,
1733
- 'Failed to fetch preferred site from user - no site will be set'
1734
- );
1735
- });
1736
-
1737
- it('should fall back to fetching the site from the user', async () => {
1738
- setup({
1739
- user: {
1740
- userPreferences: {
1741
- userPreferencesItems: {
1742
- preferredWebExSite: 'site.webex.com',
1743
- },
1744
- },
1745
- },
1746
- });
1747
-
1748
- await webex.meetings.fetchUserPreferredWebexSite();
1749
-
1750
- assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
1751
- assert.notCalled(loggerProxySpy);
1752
- });
1753
-
1754
- forEach(
1755
- [
1756
- {user: undefined},
1757
- {user: {userPreferences: {}}},
1758
- {user: {userPreferences: {userPreferencesItems: {}}}},
1759
- {user: {userPreferences: {userPreferencesItems: {preferredWebExSite: undefined}}}},
1760
- ],
1761
- ({user}) => {
1762
- it(`should handle invalid user data ${user}`, async () => {
1763
- setup({user});
1764
-
1765
- await webex.meetings.fetchUserPreferredWebexSite();
1766
-
1767
- assert.equal(webex.meetings.preferredWebexSite, '');
1768
- assert.calledOnceWithExactly(
1769
- loggerProxySpy,
1770
- 'Failed to fetch preferred site from user - no site will be set'
1771
- );
1772
- });
1773
- }
1774
- );
1775
-
1776
- it('should handle a get user failure', async () => {
1777
- setup();
1778
-
1779
- webex.internal.user.get.rejects(new Error());
1780
-
1781
- await webex.meetings.fetchUserPreferredWebexSite();
1782
-
1783
- assert.equal(webex.meetings.preferredWebexSite, '');
1784
- assert.calledOnceWithExactly(
1785
- loggerProxySpy,
1786
- 'Failed to fetch preferred site from user - no site will be set'
1787
- );
1788
1289
  });
1789
-
1790
- it('should fall back to fetching the site from the user', async () => {
1791
- setup({
1792
- user: {
1793
- userPreferences: {
1794
- userPreferencesItems: {
1795
- preferredWebExSite: 'site.webex.com',
1796
- },
1797
- },
1798
- },
1799
- });
1800
-
1801
- await webex.meetings.fetchUserPreferredWebexSite();
1802
-
1803
- assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
1804
- assert.notCalled(loggerProxySpy);
1805
- });
1806
-
1807
- forEach([
1808
- {user: undefined},
1809
- {user: {userPreferences: {}}},
1810
- {user: {userPreferences: {userPreferencesItems: {}}}},
1811
- {user: {userPreferences: {userPreferencesItems: {preferredWebExSite: undefined}}}},
1812
- ], ({user}) => {
1813
- it(`should handle invalid user data ${user}`, async () => {
1814
- setup({user});
1815
-
1816
- await webex.meetings.fetchUserPreferredWebexSite();
1817
-
1818
- assert.equal(webex.meetings.preferredWebexSite, '');
1819
- assert.calledOnceWithExactly(
1820
- loggerProxySpy,
1821
- 'Failed to fetch preferred site from user - no site will be set'
1822
- );
1823
- });
1824
- });
1825
-
1826
- it('should handle a get user failure', async () => {
1827
- setup();
1828
-
1829
- webex.internal.user.get.rejects(new Error());
1830
-
1831
- await webex.meetings.fetchUserPreferredWebexSite();
1832
-
1833
- assert.equal(webex.meetings.preferredWebexSite, '');
1834
- assert.calledOnceWithExactly(
1835
- loggerProxySpy,
1836
- 'Failed to fetch preferred site from user - no site will be set'
1837
- );
1838
- });
1839
-
1840
1290
  });
1841
1291
  });
1842
1292
 
@@ -1844,6 +1294,7 @@ describe('plugin-meetings', () => {
1844
1294
  let meeting;
1845
1295
 
1846
1296
  beforeEach(async () => {
1297
+ MediaUtil.createPeerConnection = sinon.stub().returns(true);
1847
1298
  webex.internal.device.userId = uuid1;
1848
1299
  webex.internal.device.url = url1;
1849
1300
  MeetingCollection.set = sinon.stub().returns(true);
@@ -1920,523 +1371,5 @@ describe('plugin-meetings', () => {
1920
1371
  );
1921
1372
  });
1922
1373
  });
1923
-
1924
- describe('#isNeedHandleMainLocus', () => {
1925
- let meeting;
1926
- let newLocus;
1927
- beforeEach(() => {
1928
- meeting = {
1929
- controls: {},
1930
- self: {},
1931
- };
1932
- newLocus = {
1933
- controls: {},
1934
- self: {},
1935
- };
1936
- });
1937
- afterEach(() => {
1938
- sinon.restore();
1939
- });
1940
- it('check normal case will return true', () => {
1941
- sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns(null);
1942
- LoggerProxy.logger.log = sinon.stub();
1943
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
1944
- assert.equal(result, true);
1945
- assert.calledWith(
1946
- LoggerProxy.logger.log,
1947
- 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
1948
- );
1949
- });
1950
-
1951
- it('check self joined and joined on this device, return true', () => {
1952
- sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns(null);
1953
- newLocus.self.state = 'JOINED';
1954
- sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(true);
1955
-
1956
- LoggerProxy.logger.log = sinon.stub();
1957
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
1958
- assert.equal(result, true);
1959
- assert.calledWith(
1960
- LoggerProxy.logger.log,
1961
- 'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
1962
- );
1963
- });
1964
-
1965
- it('if newLocus replaceAt time is expired, then return false', () => {
1966
- sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns({
1967
- joinedWith: {
1968
- replaces: [
1969
- {
1970
- replaceAt: '2023-03-27T02:17:02.506Z',
1971
- },
1972
- ],
1973
- },
1974
- });
1975
- newLocus.self.state = 'JOINED';
1976
- sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(true);
1977
- sinon.stub(MeetingsUtil, 'getThisDevice').returns({
1978
- replaces: [
1979
- {
1980
- replaceAt: '2023-03-27T02:17:01.506Z',
1981
- },
1982
- ],
1983
- });
1984
-
1985
- LoggerProxy.logger.log = sinon.stub();
1986
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
1987
- assert.equal(result, false);
1988
- assert.calledWith(
1989
- LoggerProxy.logger.log,
1990
- `Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt 2023-03-27T02:17:01.506Z bo replacedAt 2023-03-27T02:17:02.506Z`
1991
- );
1992
- });
1993
-
1994
- it('check current is in breakout join with this device, return false', () => {
1995
- sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns({
1996
- joinedWith: {
1997
- correlationId: '111',
1998
- },
1999
- });
2000
- newLocus.controls.breakout = {url: 'url'};
2001
- meeting.correlationId = '111';
2002
-
2003
- LoggerProxy.logger.log = sinon.stub();
2004
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
2005
- assert.equal(result, false);
2006
- assert.calledWith(
2007
- LoggerProxy.logger.log,
2008
- `Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: url`
2009
- );
2010
- });
2011
-
2012
- it('check self is moved and removed, return false', () => {
2013
- webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
2014
- newLocus.self.state = 'LEFT';
2015
- newLocus.self.reason = 'MOVED';
2016
- newLocus.self.removed = true;
2017
- LoggerProxy.logger.log = sinon.stub();
2018
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
2019
- assert.equal(result, false);
2020
- assert.calledWith(
2021
- LoggerProxy.logger.log,
2022
- 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
2023
- );
2024
- });
2025
-
2026
- it('check self is moved and device resource removed, return false', () => {
2027
- webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
2028
- newLocus.self.state = 'LEFT';
2029
- newLocus.self.reason = 'MOVED';
2030
- sinon.stub(MeetingsUtil, 'getThisDevice').returns({
2031
- state: 'LEFT',
2032
- reason: 'MOVED',
2033
- });
2034
- LoggerProxy.logger.log = sinon.stub();
2035
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
2036
- assert.equal(result, false);
2037
- assert.calledWith(
2038
- LoggerProxy.logger.log,
2039
- 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
2040
- );
2041
- });
2042
-
2043
- it('check self is joined but device resource removed, return false', () => {
2044
- webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
2045
- sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(false);
2046
- newLocus.self.state = 'JOINED';
2047
- sinon.stub(MeetingsUtil, 'getThisDevice').returns({
2048
- state: 'LEFT',
2049
- reason: 'MOVED',
2050
- });
2051
- LoggerProxy.logger.log = sinon.stub();
2052
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
2053
- assert.equal(result, false);
2054
- assert.calledWith(
2055
- LoggerProxy.logger.log,
2056
- 'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'
2057
- );
2058
- });
2059
- });
2060
-
2061
- describe('#isNeedHandleLocusDTO', () => {
2062
- let meeting;
2063
- let newLocus;
2064
- beforeEach(() => {
2065
- meeting = {
2066
- controls: {},
2067
- self: {},
2068
- };
2069
- newLocus = {
2070
- controls: {},
2071
- self: {},
2072
- };
2073
- });
2074
- afterEach(() => {
2075
- sinon.restore();
2076
- });
2077
- it('initial DTO , joined breakout session, return true', () => {
2078
- newLocus.controls.breakout = {
2079
- sessionType: 'BREAKOUT',
2080
- };
2081
- newLocus.self.state = 'JOINED';
2082
- newLocus.fullState = {
2083
- active: true,
2084
- };
2085
- LoggerProxy.logger.log = sinon.stub();
2086
- const result = webex.meetings.isNeedHandleLocusDTO(null, newLocus);
2087
- assert.equal(result, true);
2088
- assert.calledWith(
2089
- LoggerProxy.logger.log,
2090
- `Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: true`
2091
- );
2092
- });
2093
- it('others go to check isNeedHandleMainLocus', () => {
2094
- newLocus.controls.breakout = {
2095
- sessionType: 'MAIN',
2096
- };
2097
- newLocus.self.state = 'JOINED';
2098
-
2099
- LoggerProxy.logger.log = sinon.stub();
2100
- const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
2101
- assert.equal(result, true);
2102
- assert.calledWith(
2103
- LoggerProxy.logger.log,
2104
- 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
2105
- );
2106
- });
2107
- it('joined breakout session, self status is moved, return false', () => {
2108
- newLocus.controls.breakout = {
2109
- sessionType: 'BREAKOUT',
2110
- };
2111
- newLocus.self.state = 'LEFT';
2112
- newLocus.self.reason = 'MOVED';
2113
-
2114
- LoggerProxy.logger.log = sinon.stub();
2115
- const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
2116
- assert.equal(result, false);
2117
- });
2118
- });
2119
-
2120
- describe('#getCorrespondingMeetingByLocus', () => {
2121
- let locus;
2122
- let mockReturnMeeting = {meeting: 'meeting1'};
2123
- const mockGetByKey = (keyWillReturnMeeting) => {
2124
- webex.meetings.meetingCollection.getByKey = sinon.stub().callsFake((key) => {
2125
- if (key === keyWillReturnMeeting) {
2126
- return mockReturnMeeting;
2127
- }
2128
- return null;
2129
- });
2130
- };
2131
-
2132
- beforeEach(() => {
2133
- locus = {
2134
- controls: {},
2135
- self: {
2136
- callbackInfo: {
2137
- callbackAddress: 'address1',
2138
- },
2139
- },
2140
- info: {
2141
- webExMeetingId: '123456',
2142
- isUnifiedSpaceMeeting: false,
2143
- },
2144
- conversationUrl: 'conversationUrl1',
2145
- };
2146
-
2147
- sinon.stub(MeetingsUtil, 'checkForCorrelationId').returns('correlationId1');
2148
- });
2149
- afterEach(() => {
2150
- sinon.restore();
2151
- });
2152
- it('check the calls when no meeting found in meetingCollection', () => {
2153
- mockGetByKey();
2154
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2155
- assert.isNull(result);
2156
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
2157
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
2158
- assert.calledWith(
2159
- webex.meetings.meetingCollection.getByKey,
2160
- 'correlationId',
2161
- 'correlationId1'
2162
- );
2163
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
2164
- assert.calledWith(
2165
- webex.meetings.meetingCollection.getByKey,
2166
- 'conversationUrl',
2167
- 'conversationUrl1'
2168
- );
2169
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', '123456');
2170
- });
2171
-
2172
- it('not try getByKey "conversationUrl" when isUnifiedSpaceMeeting is true', () => {
2173
- mockGetByKey();
2174
- locus.info.isUnifiedSpaceMeeting = true;
2175
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2176
- assert.isNull(result);
2177
- assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
2178
- });
2179
-
2180
- it('check the calls when meeting found by key: locusUrl', () => {
2181
- mockGetByKey('locusUrl');
2182
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2183
- assert.deepEqual(result, mockReturnMeeting);
2184
- assert.callCount(webex.meetings.meetingCollection.getByKey, 1);
2185
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
2186
- });
2187
-
2188
- it('check the calls when meeting found by key: correlationId', () => {
2189
- mockGetByKey('correlationId');
2190
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2191
- assert.deepEqual(result, mockReturnMeeting);
2192
- assert.callCount(webex.meetings.meetingCollection.getByKey, 2);
2193
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
2194
- assert.calledWith(
2195
- webex.meetings.meetingCollection.getByKey,
2196
- 'correlationId',
2197
- 'correlationId1'
2198
- );
2199
- });
2200
-
2201
- it('check the calls when meeting found by key: sipUri', () => {
2202
- mockGetByKey('sipUri');
2203
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2204
- assert.deepEqual(result, mockReturnMeeting);
2205
- assert.callCount(webex.meetings.meetingCollection.getByKey, 3);
2206
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
2207
- assert.calledWith(
2208
- webex.meetings.meetingCollection.getByKey,
2209
- 'correlationId',
2210
- 'correlationId1'
2211
- );
2212
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
2213
- });
2214
-
2215
- it('check the calls when meeting found by key: conversationUrl', () => {
2216
- mockGetByKey('conversationUrl');
2217
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2218
- assert.deepEqual(result, mockReturnMeeting);
2219
- assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
2220
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
2221
- assert.calledWith(
2222
- webex.meetings.meetingCollection.getByKey,
2223
- 'correlationId',
2224
- 'correlationId1'
2225
- );
2226
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
2227
- assert.calledWith(
2228
- webex.meetings.meetingCollection.getByKey,
2229
- 'conversationUrl',
2230
- 'conversationUrl1'
2231
- );
2232
- });
2233
-
2234
- it('check the calls when meeting found by key: meetingNumber', () => {
2235
- mockGetByKey('meetingNumber');
2236
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2237
- assert.deepEqual(result, mockReturnMeeting);
2238
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
2239
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
2240
- assert.calledWith(
2241
- webex.meetings.meetingCollection.getByKey,
2242
- 'correlationId',
2243
- 'correlationId1'
2244
- );
2245
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
2246
- assert.calledWith(
2247
- webex.meetings.meetingCollection.getByKey,
2248
- 'conversationUrl',
2249
- 'conversationUrl1'
2250
- );
2251
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', '123456');
2252
- });
2253
- });
2254
-
2255
- describe('#sortLocusArrayToUpdate', () => {
2256
- let lociArray;
2257
- let mainLocus;
2258
- let breakoutLocus;
2259
- beforeEach(() => {
2260
- mainLocus = {
2261
- url: 'mainUrl1',
2262
- controls: {
2263
- breakout: {
2264
- sessionType: 'MAIN',
2265
- url: 'breakoutUnifiedUrl1',
2266
- },
2267
- },
2268
- };
2269
- breakoutLocus = {
2270
- url: 'breakoutUrl1',
2271
- controls: {
2272
- breakout: {
2273
- sessionType: 'BREAKOUT',
2274
- url: 'breakoutUnifiedUrl1',
2275
- },
2276
- },
2277
- };
2278
- lociArray = [mainLocus, breakoutLocus];
2279
-
2280
- sinon.stub(MeetingsUtil, 'isValidBreakoutLocus').callsFake((locus) => {
2281
- return locus.url === 'breakoutUrl1';
2282
- });
2283
- });
2284
- afterEach(() => {
2285
- sinon.restore();
2286
- });
2287
-
2288
- it('if both main and breakout locus is in array for non-exist meeting, return main locus to create first', () => {
2289
- webex.meetings.meetingCollection.getByKey = sinon.stub().returns(undefined);
2290
- const result = webex.meetings.sortLocusArrayToUpdate(lociArray);
2291
- assert.deepEqual(result, [mainLocus]);
2292
- assert.deepEqual(webex.meetings.breakoutLocusForHandleLater, [breakoutLocus]);
2293
- });
2294
-
2295
- it('if both main and breakout locus is in array for an exist meeting, return all locus', () => {
2296
- webex.meetings.meetingCollection.getByKey = sinon.stub().returns({});
2297
- const result = webex.meetings.sortLocusArrayToUpdate(lociArray);
2298
- assert.deepEqual(result, [mainLocus, breakoutLocus]);
2299
- assert.deepEqual(webex.meetings.breakoutLocusForHandleLater, []);
2300
- });
2301
-
2302
- it('if the breakout locus has no associated main locus, return all', () => {
2303
- webex.meetings.meetingCollection.getByKey = sinon.stub().returns({});
2304
- breakoutLocus.controls.breakout.url = 'testUrl';
2305
- const result = webex.meetings.sortLocusArrayToUpdate(lociArray);
2306
- assert.deepEqual(result, [mainLocus, breakoutLocus]);
2307
- });
2308
- });
2309
-
2310
- describe('#checkHandleBreakoutLocus', () => {
2311
- let breakoutLocus;
2312
- beforeEach(() => {
2313
- breakoutLocus = {
2314
- url: 'breakoutUrl1',
2315
- controls: {
2316
- breakout: {
2317
- sessionType: 'BREAKOUT',
2318
- url: 'breakoutUnifiedUrl1',
2319
- },
2320
- },
2321
- };
2322
-
2323
- webex.meetings.handleLocusEvent = sinon.stub();
2324
- });
2325
- afterEach(() => {
2326
- sinon.restore();
2327
- });
2328
- it('do nothing if new created locus is null/no cached breakouts for updating', () => {
2329
- webex.meetings.checkHandleBreakoutLocus(null);
2330
- webex.meetings.breakoutLocusForHandleLater = null;
2331
- webex.meetings.checkHandleBreakoutLocus({});
2332
- webex.meetings.breakoutLocusForHandleLater = [];
2333
- webex.meetings.checkHandleBreakoutLocus({});
2334
- assert.notCalled(webex.meetings.handleLocusEvent);
2335
- });
2336
-
2337
- it('do nothing if new created locus is breakout locus', () => {
2338
- webex.meetings.breakoutLocusForHandleLater = [breakoutLocus];
2339
- webex.meetings.checkHandleBreakoutLocus(breakoutLocus);
2340
- assert.notCalled(webex.meetings.handleLocusEvent);
2341
- });
2342
-
2343
- it('do nothing if no cached locus is associated with the new created locus', () => {
2344
- webex.meetings.breakoutLocusForHandleLater = [breakoutLocus];
2345
- webex.meetings.checkHandleBreakoutLocus({
2346
- controls: {
2347
- breakout: {
2348
- sessionType: 'MAIN',
2349
- url: 'breakoutUnifiedUrl2',
2350
- },
2351
- },
2352
- });
2353
- assert.notCalled(webex.meetings.handleLocusEvent);
2354
- });
2355
-
2356
- it('update the cached breakout locus which associate the new created locus', () => {
2357
- webex.meetings.breakoutLocusForHandleLater = [breakoutLocus];
2358
- webex.meetings.checkHandleBreakoutLocus({
2359
- controls: {
2360
- breakout: {
2361
- sessionType: 'MAIN',
2362
- url: 'breakoutUnifiedUrl1',
2363
- },
2364
- },
2365
- });
2366
- assert.calledWith(webex.meetings.handleLocusEvent, {
2367
- locus: breakoutLocus,
2368
- locusUrl: breakoutLocus.url,
2369
- });
2370
- });
2371
- });
2372
-
2373
- describe('uploading of logs', () => {
2374
- let metricsSpy;
2375
- let meeting;
2376
-
2377
- beforeEach(async () => {
2378
- webex.meetings.config.autoUploadLogs = true;
2379
- webex.meetings.loggerRequest.uploadLogs = sinon.stub().resolves();
2380
-
2381
- sinon.stub(webex.meetings.meetingInfo, 'fetchInfoOptions').resolves({});
2382
- sinon.stub(webex.meetings.meetingInfo, 'fetchMeetingInfo').resolves({});
2383
-
2384
- triggerProxyStub.restore();
2385
-
2386
- metricsSpy = sinon.stub(Metrics, 'sendBehavioralMetric');
2387
-
2388
- meeting = await webex.meetings.create('test');
2389
-
2390
- meeting.locusId = 'locus id';
2391
- meeting.correlationId = 'correlation id';
2392
- meeting.locusInfo = {
2393
- fullState: {lastActive: 'last active', sessionId: 'locus session id'},
2394
- info: {webExMeetingId: 'meeting id'},
2395
- };
2396
- });
2397
-
2398
- afterEach(() => {
2399
- sinon.restore();
2400
- });
2401
-
2402
- it('sends metrics on success', async () => {
2403
- await meeting.uploadLogs();
2404
-
2405
- await testUtils.flushPromises();
2406
-
2407
- assert.calledOnceWithExactly(metricsSpy, 'js_sdk_upload_logs_success', {
2408
- callStart: 'last active',
2409
- correlationId: 'correlation id',
2410
- feedbackId: 'correlation id',
2411
- locusId: 'locus id',
2412
- meetingId: 'meeting id',
2413
- autoupload: true,
2414
- locussessionid: 'locus session id',
2415
- });
2416
- });
2417
-
2418
- it('sends metrics on failure', async () => {
2419
- webex.meetings.loggerRequest.uploadLogs.rejects(new Error('fake error'));
2420
-
2421
- await meeting.uploadLogs();
2422
-
2423
- await testUtils.flushPromises();
2424
-
2425
- assert.calledOnceWithExactly(
2426
- metricsSpy,
2427
- 'js_sdk_upload_logs_failure',
2428
- sinon.match({
2429
- callStart: 'last active',
2430
- correlationId: 'correlation id',
2431
- feedbackId: 'correlation id',
2432
- locusId: 'locus id',
2433
- meetingId: 'meeting id',
2434
- reason: 'fake error',
2435
- autoupload: true,
2436
- locussessionid: 'locus session id',
2437
- })
2438
- );
2439
- });
2440
- });
2441
1374
  });
2442
1375
  });