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

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 (539) hide show
  1. package/README.md +8 -58
  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 -6
  54. package/dist/config.js +10 -8
  55. package/dist/config.js.map +1 -1
  56. package/dist/constants.d.ts +100 -234
  57. package/dist/constants.js +444 -433
  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 +5 -121
  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 +520 -705
  111. package/dist/meeting/index.js +3083 -5041
  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 -304
  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 -118
  122. package/dist/meeting/util.js +435 -676
  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 +20 -114
  142. package/dist/meetings/index.js +133 -540
  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 +95 -61
  193. package/dist/reachability/index.js +392 -304
  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 +232 -285
  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 +238 -100
  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 -50
  240. package/dist/statsAnalyzer/index.js +511 -436
  241. package/dist/statsAnalyzer/index.js.map +1 -1
  242. package/dist/statsAnalyzer/mqaUtil.d.ts +6 -8
  243. package/dist/statsAnalyzer/mqaUtil.js +90 -130
  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 -39
  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 -6
  253. package/src/constants.ts +100 -265
  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 -450
  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 +2581 -4306
  271. package/src/meeting/muteState.ts +138 -224
  272. package/src/meeting/request.ts +127 -214
  273. package/src/meeting/util.ts +423 -687
  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 +136 -531
  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 +347 -246
  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 -96
  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 +645 -479
  310. package/src/statsAnalyzer/mqaUtil.ts +126 -128
  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 -1437
  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 +2313 -8384
  328. package/test/unit/spec/meeting/muteState.js +213 -409
  329. package/test/unit/spec/meeting/request.js +43 -523
  330. package/test/unit/spec/meeting/utils.js +24 -834
  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 +232 -1445
  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 -532
  347. package/test/unit/spec/reconnection-manager/index.js +24 -163
  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 +77 -187
  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 +165 -644
  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/interceptors/index.d.ts +0 -2
  395. package/dist/interceptors/index.js +0 -15
  396. package/dist/interceptors/index.js.map +0 -1
  397. package/dist/interceptors/locusRetry.d.ts +0 -27
  398. package/dist/interceptors/locusRetry.js +0 -94
  399. package/dist/interceptors/locusRetry.js.map +0 -1
  400. package/dist/interpretation/collection.d.ts +0 -5
  401. package/dist/interpretation/collection.js +0 -22
  402. package/dist/interpretation/collection.js.map +0 -1
  403. package/dist/interpretation/index.d.ts +0 -5
  404. package/dist/interpretation/index.js +0 -365
  405. package/dist/interpretation/index.js.map +0 -1
  406. package/dist/interpretation/siLanguage.d.ts +0 -5
  407. package/dist/interpretation/siLanguage.js +0 -24
  408. package/dist/interpretation/siLanguage.js.map +0 -1
  409. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  410. package/dist/meeting/locusMediaRequest.js +0 -291
  411. package/dist/meeting/locusMediaRequest.js.map +0 -1
  412. package/dist/meeting/request.type.d.ts +0 -11
  413. package/dist/meeting/request.type.js +0 -7
  414. package/dist/meeting/request.type.js.map +0 -1
  415. package/dist/meeting/voicea-meeting.d.ts +0 -20
  416. package/dist/meeting/voicea-meeting.js +0 -201
  417. package/dist/meeting/voicea-meeting.js.map +0 -1
  418. package/dist/meetings/meetings.types.d.ts +0 -4
  419. package/dist/meetings/meetings.types.js +0 -7
  420. package/dist/meetings/meetings.types.js.map +0 -1
  421. package/dist/member/types.d.ts +0 -32
  422. package/dist/member/types.js +0 -23
  423. package/dist/member/types.js.map +0 -1
  424. package/dist/multistream/mediaRequestManager.d.ts +0 -118
  425. package/dist/multistream/mediaRequestManager.js +0 -344
  426. package/dist/multistream/mediaRequestManager.js.map +0 -1
  427. package/dist/multistream/receiveSlot.d.ts +0 -68
  428. package/dist/multistream/receiveSlot.js +0 -200
  429. package/dist/multistream/receiveSlot.js.map +0 -1
  430. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  431. package/dist/multistream/receiveSlotManager.js +0 -174
  432. package/dist/multistream/receiveSlotManager.js.map +0 -1
  433. package/dist/multistream/remoteMedia.d.ts +0 -72
  434. package/dist/multistream/remoteMedia.js +0 -268
  435. package/dist/multistream/remoteMedia.js.map +0 -1
  436. package/dist/multistream/remoteMediaGroup.d.ts +0 -47
  437. package/dist/multistream/remoteMediaGroup.js +0 -267
  438. package/dist/multistream/remoteMediaGroup.js.map +0 -1
  439. package/dist/multistream/remoteMediaManager.d.ts +0 -285
  440. package/dist/multistream/remoteMediaManager.js +0 -1211
  441. package/dist/multistream/remoteMediaManager.js.map +0 -1
  442. package/dist/multistream/sendSlotManager.d.ts +0 -61
  443. package/dist/multistream/sendSlotManager.js +0 -236
  444. package/dist/multistream/sendSlotManager.js.map +0 -1
  445. package/dist/reachability/clusterReachability.d.ts +0 -109
  446. package/dist/reachability/clusterReachability.js +0 -357
  447. package/dist/reachability/clusterReachability.js.map +0 -1
  448. package/dist/reachability/util.d.ts +0 -8
  449. package/dist/reachability/util.js +0 -29
  450. package/dist/reachability/util.js.map +0 -1
  451. package/dist/reactions/constants.d.ts +0 -3
  452. package/dist/reactions/constants.js +0 -12
  453. package/dist/reactions/constants.js.map +0 -1
  454. package/dist/rtcMetrics/constants.d.ts +0 -4
  455. package/dist/rtcMetrics/constants.js +0 -11
  456. package/dist/rtcMetrics/constants.js.map +0 -1
  457. package/dist/rtcMetrics/index.d.ts +0 -54
  458. package/dist/rtcMetrics/index.js +0 -140
  459. package/dist/rtcMetrics/index.js.map +0 -1
  460. package/dist/webinar/collection.d.ts +0 -16
  461. package/dist/webinar/collection.js +0 -43
  462. package/dist/webinar/collection.js.map +0 -1
  463. package/dist/webinar/index.d.ts +0 -5
  464. package/dist/webinar/index.js +0 -68
  465. package/dist/webinar/index.js.map +0 -1
  466. package/src/annotation/annotation.types.ts +0 -50
  467. package/src/annotation/constants.ts +0 -36
  468. package/src/annotation/index.ts +0 -328
  469. package/src/breakouts/README.md +0 -220
  470. package/src/breakouts/breakout.ts +0 -188
  471. package/src/breakouts/collection.ts +0 -19
  472. package/src/breakouts/edit-lock-error.ts +0 -25
  473. package/src/breakouts/events.ts +0 -56
  474. package/src/breakouts/index.ts +0 -925
  475. package/src/breakouts/request.ts +0 -55
  476. package/src/breakouts/utils.ts +0 -57
  477. package/src/common/errors/no-meeting-info.ts +0 -24
  478. package/src/controls-options-manager/types.ts +0 -59
  479. package/src/index.ts +0 -44
  480. package/src/interceptors/index.ts +0 -3
  481. package/src/interceptors/locusRetry.ts +0 -67
  482. package/src/interpretation/README.md +0 -60
  483. package/src/interpretation/collection.ts +0 -19
  484. package/src/interpretation/index.ts +0 -332
  485. package/src/interpretation/siLanguage.ts +0 -18
  486. package/src/meeting/locusMediaRequest.ts +0 -313
  487. package/src/meeting/request.type.ts +0 -13
  488. package/src/meeting/voicea-meeting.ts +0 -161
  489. package/src/meetings/meetings.types.ts +0 -12
  490. package/src/member/types.ts +0 -38
  491. package/src/multistream/mediaRequestManager.ts +0 -440
  492. package/src/multistream/receiveSlot.ts +0 -184
  493. package/src/multistream/receiveSlotManager.ts +0 -166
  494. package/src/multistream/remoteMedia.ts +0 -254
  495. package/src/multistream/remoteMediaGroup.ts +0 -284
  496. package/src/multistream/remoteMediaManager.ts +0 -1145
  497. package/src/multistream/sendSlotManager.ts +0 -170
  498. package/src/reachability/clusterReachability.ts +0 -320
  499. package/src/reachability/util.ts +0 -24
  500. package/src/reactions/constants.ts +0 -4
  501. package/src/rtcMetrics/constants.ts +0 -3
  502. package/src/rtcMetrics/index.ts +0 -124
  503. package/src/webinar/collection.ts +0 -31
  504. package/src/webinar/index.ts +0 -62
  505. package/test/integration/spec/converged-space-meetings.js +0 -233
  506. package/test/unit/spec/annotation/index.ts +0 -418
  507. package/test/unit/spec/breakouts/breakout.ts +0 -237
  508. package/test/unit/spec/breakouts/collection.ts +0 -15
  509. package/test/unit/spec/breakouts/edit-lock-error.ts +0 -30
  510. package/test/unit/spec/breakouts/events.ts +0 -89
  511. package/test/unit/spec/breakouts/index.ts +0 -1790
  512. package/test/unit/spec/breakouts/request.ts +0 -104
  513. package/test/unit/spec/breakouts/utils.js +0 -72
  514. package/test/unit/spec/interceptors/locusRetry.ts +0 -131
  515. package/test/unit/spec/interpretation/collection.ts +0 -15
  516. package/test/unit/spec/interpretation/index.ts +0 -589
  517. package/test/unit/spec/interpretation/siLanguage.ts +0 -28
  518. package/test/unit/spec/locus-info/mediaSharesUtils.ts +0 -32
  519. package/test/unit/spec/media/index.ts +0 -290
  520. package/test/unit/spec/meeting/locusMediaRequest.ts +0 -442
  521. package/test/unit/spec/meeting-info/index.js +0 -300
  522. package/test/unit/spec/multistream/mediaRequestManager.ts +0 -1418
  523. package/test/unit/spec/multistream/receiveSlot.ts +0 -163
  524. package/test/unit/spec/multistream/receiveSlotManager.ts +0 -203
  525. package/test/unit/spec/multistream/remoteMedia.ts +0 -255
  526. package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -662
  527. package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1924
  528. package/test/unit/spec/multistream/sendSlotManager.ts +0 -242
  529. package/test/unit/spec/reachability/clusterReachability.ts +0 -279
  530. package/test/unit/spec/reachability/request.js +0 -68
  531. package/test/unit/spec/reachability/util.ts +0 -40
  532. package/test/unit/spec/roap/request.ts +0 -255
  533. package/test/unit/spec/rtcMetrics/index.ts +0 -93
  534. package/test/unit/spec/webinar/collection.ts +0 -13
  535. package/test/unit/spec/webinar/index.ts +0 -60
  536. package/test/utils/constants.js +0 -9
  537. package/test/utils/integrationTestUtils.js +0 -46
  538. /package/dist/common/errors/{reclaim-host-role-errors.d.ts → reclaim-host-role-error.d.ts} +0 -0
  539. /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,16 +11,15 @@ 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';
20
- import Meeting, {CallStateForMetrics} from '@webex/plugin-meetings/src/meeting';
15
+ import MediaUtil from '@webex/plugin-meetings/src/media/util';
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';
23
19
  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,
@@ -119,6 +101,11 @@ describe('plugin-meetings', () => {
119
101
 
120
102
  Object.assign(webex, {
121
103
  logger,
104
+ people: {
105
+ _getMe: sinon.stub().resolves({
106
+ type: 'validuser',
107
+ }),
108
+ }
122
109
  });
123
110
 
124
111
  Object.assign(webex.meetings, {
@@ -126,7 +113,6 @@ describe('plugin-meetings', () => {
126
113
  });
127
114
 
128
115
  Object.assign(webex.internal, {
129
- llm: {on: sinon.stub()},
130
116
  device: {
131
117
  deviceType: 'FAKE_DEVICE',
132
118
  register: sinon.stub().returns(Promise.resolve()),
@@ -170,10 +156,6 @@ describe('plugin-meetings', () => {
170
156
  webex.emit('ready');
171
157
  });
172
158
 
173
- afterEach(() => {
174
- sinon.restore();
175
- });
176
-
177
159
  it('has a webex instance with a meetings property', () => {
178
160
  assert.exists(webex, 'webex was initialized with children');
179
161
  assert.exists(webex.meetings, 'meetings child was set up on the webex instance');
@@ -240,15 +222,30 @@ describe('plugin-meetings', () => {
240
222
  });
241
223
  });
242
224
 
243
- describe('#_toggleTcpReachability', () => {
244
- it('should have _toggleTcpReachability', () => {
245
- assert.equal(typeof webex.meetings._toggleTcpReachability, 'function');
225
+ describe('#_toggleTurnDiscovery', () => {
226
+ it('should have toggleAdhocMeetings', () => {
227
+ assert.equal(typeof webex.meetings._toggleTurnDiscovery, 'function');
246
228
  });
247
229
 
248
230
  describe('success', () => {
249
- it('should update meetings to do TCP reachability', () => {
250
- webex.meetings._toggleTcpReachability(true);
251
- assert.equal(webex.meetings.config.experimental.enableTcpReachability, true);
231
+ it('should update meetings to do TURN discovery', () => {
232
+ webex.meetings._toggleTurnDiscovery(true);
233
+ assert.equal(webex.meetings.config.experimental.enableTurnDiscovery, true);
234
+
235
+ webex.meetings._toggleTurnDiscovery(false);
236
+ assert.equal(webex.meetings.config.experimental.enableTurnDiscovery, false);
237
+ });
238
+ });
239
+
240
+ describe('failure', () => {
241
+ it('should not accept non boolean input', () => {
242
+ const currentEnableTurnDiscovery = webex.meetings.config.experimental.enableTurnDiscovery;
243
+
244
+ webex.meetings._toggleTurnDiscovery('test');
245
+ assert.equal(
246
+ webex.meetings.config.experimental.enableAdhocMeetings,
247
+ currentEnableTurnDiscovery
248
+ );
252
249
  });
253
250
  });
254
251
  });
@@ -346,110 +343,37 @@ describe('plugin-meetings', () => {
346
343
  });
347
344
  });
348
345
 
349
- describe('virtual background effect', () => {
350
- beforeEach(() => {
351
- webex.credentials = {
352
- supertoken: {
353
- access_token: 'fake_token',
354
- },
355
- };
356
- });
357
-
358
- it('creates background effect', async () => {
359
- const result = await webex.meetings.createVirtualBackgroundEffect();
360
-
361
- assert.exists(result);
362
- assert.instanceOf(result, VirtualBackgroundEffect);
363
- assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'options']);
364
- assert.deepEqual(result.options, {
365
- mode: 'BLUR',
366
- blurStrength: 'STRONG',
367
- generator: 'worker',
368
- quality: 'LOW',
369
- authToken: 'fake_token',
370
- mirror: false,
371
- });
372
- assert.exists(result.enable);
373
- assert.exists(result.disable);
374
- assert.exists(result.dispose);
375
- });
376
-
377
- it('creates background effect with custom options passed', async () => {
378
- const effectOptions = {
379
- generator: 'local',
380
- frameRate: 45,
381
- mode: 'IMAGE',
382
- mirror: false,
383
- quality: 'HIGH',
384
- blurStrength: 'STRONG',
385
- bgImageUrl: 'https://test.webex.com/landscape.5a535788.jpg',
386
- };
387
-
388
- const result = await webex.meetings.createVirtualBackgroundEffect(effectOptions);
389
-
390
- assert.exists(result);
391
- assert.instanceOf(result, VirtualBackgroundEffect);
392
- assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'options']);
393
- assert.deepEqual(result.options, {...effectOptions, authToken: 'fake_token'});
394
- assert.exists(result.enable);
395
- assert.exists(result.disable);
396
- assert.exists(result.dispose);
397
- });
398
- });
399
-
400
- describe('noise reduction effect', () => {
401
- beforeEach(() => {
402
- webex.credentials = {
403
- supertoken: {
404
- access_token: 'fake_token',
405
- },
406
- };
407
- });
408
-
409
- it('creates noise reduction effect', async () => {
410
- const result = await webex.meetings.createNoiseReductionEffect({audioContext: {}});
411
-
412
- assert.exists(result);
413
- assert.instanceOf(result, NoiseReductionEffect);
414
- assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
415
- assert.deepEqual(result.options, {
416
- authToken: 'fake_token',
417
- audioContext: {},
418
- });
419
- assert.exists(result.enable);
420
- assert.exists(result.disable);
421
- assert.exists(result.dispose);
422
- });
423
-
424
- it('creates noise reduction effect with custom options passed', async () => {
425
- const effectOptions = {
426
- audioContext: {},
427
- mode: 'WORKLET',
428
- env: 'prod',
429
- };
430
-
431
- const result = await webex.meetings.createNoiseReductionEffect(effectOptions);
432
-
433
- assert.exists(result);
434
- assert.instanceOf(result, NoiseReductionEffect);
435
- assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
436
- assert.deepEqual(result.options, {...effectOptions, authToken: 'fake_token'});
437
- assert.exists(result.enable);
438
- assert.exists(result.disable);
439
- assert.exists(result.dispose);
440
- });
441
- });
442
-
443
346
  describe('gets', () => {
444
347
  describe('#getReachability', () => {
445
348
  it('should have #getReachability', () => {
446
349
  assert.exists(webex.meetings.getReachability);
447
350
  });
448
- it('gets the reachability data instance from webex.meetings', () => {
449
- const reachability = webex.meetings.getReachability();
351
+ describe('before #setReachability', () => {
352
+ it('does not get a reachability instance', () => {
353
+ const reachability = webex.meetings.getReachability();
354
+
355
+ assert.notExists(
356
+ reachability,
357
+ 'reachability is undefined because #setReachability has not been called'
358
+ );
359
+ });
360
+ });
361
+ describe('after #setReachability', () => {
362
+ beforeEach(() => {
363
+ webex.meetings.setReachability();
364
+ const reachabilityMocker = webex.meetings.getReachability();
365
+
366
+ sinon.stub(reachabilityMocker, 'gatherReachability').returns(true);
367
+ });
368
+ it('gets the reachability data instance from webex.meetings', () => {
369
+ const reachability = webex.meetings.getReachability();
450
370
 
451
- assert.exists(reachability, 'reachability is defined');
452
- assert.instanceOf(reachability, Reachability, 'should be a reachability instance');
371
+ assert.exists(
372
+ reachability,
373
+ 'reachability is defined because #setReachability has been called'
374
+ );
375
+ assert.instanceOf(reachability, Reachability, 'should be a reachability instance');
376
+ });
453
377
  });
454
378
  });
455
379
  describe('#getPersonalMeetingRoom', () => {
@@ -524,16 +448,21 @@ describe('plugin-meetings', () => {
524
448
  );
525
449
  });
526
450
  describe('when meeting is returned', () => {
451
+ let parse;
452
+
527
453
  beforeEach(() => {
454
+ parse = sinon.stub().returns(true);
528
455
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
529
- locusInfo,
456
+ locusInfo: {
457
+ parse,
458
+ },
530
459
  });
531
460
  });
532
461
  it('tests the sync meeting calls for existing meeting', async () => {
533
462
  await webex.meetings.syncMeetings();
534
463
  assert.calledOnce(webex.meetings.request.getActiveMeetings);
535
464
  assert.calledOnce(webex.meetings.meetingCollection.getByKey);
536
- assert.calledOnce(locusInfo.parse);
465
+ assert.calledOnce(parse);
537
466
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
538
467
  });
539
468
  });
@@ -546,7 +475,6 @@ describe('plugin-meetings', () => {
546
475
  webex.meetings.create = sinon.stub().returns(
547
476
  Promise.resolve({
548
477
  locusInfo: {
549
- ...locusInfo,
550
478
  initialSetup,
551
479
  },
552
480
  })
@@ -555,7 +483,7 @@ describe('plugin-meetings', () => {
555
483
  it('tests the sync meeting calls for not existing meeting', async () => {
556
484
  await webex.meetings.syncMeetings();
557
485
  assert.calledOnce(webex.meetings.request.getActiveMeetings);
558
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
486
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
559
487
  assert.calledOnce(initialSetup);
560
488
  assert.calledOnce(webex.meetings.create);
561
489
  assert.calledWith(webex.meetings.request.getActiveMeetings);
@@ -572,71 +500,46 @@ describe('plugin-meetings', () => {
572
500
  });
573
501
  });
574
502
  });
575
- describe('when destroying meeting is needed', () => {
503
+ describe('destory non active meeting', () => {
504
+ let initialSetup;
505
+ let parse;
576
506
  let destroySpy;
577
507
 
578
- const meetingCollectionMeetings = {
579
- stillValidLocusMeeting: {
580
- locusUrl: 'still-valid-locus-url',
581
- sendCallAnalyzerMetrics: sinon.stub(),
582
- },
583
- noLongerValidLocusMeeting: {
584
- locusUrl: 'no-longer-valid-locus-url',
585
- sendCallAnalyzerMetrics: sinon.stub(),
586
- },
587
- otherNonLocusMeeting1: {
588
- locusUrl: null,
589
- sendCallAnalyzerMetrics: sinon.stub(),
590
- },
591
- otherNonLocusMeeting2: {
592
- locusUrl: undefined,
593
- sendCallAnalyzerMetrics: sinon.stub(),
594
- },
595
- };
596
-
597
508
  beforeEach(() => {
598
509
  destroySpy = sinon.spy(webex.meetings, 'destroy');
599
- webex.meetings.meetingCollection.getAll = sinon
600
- .stub()
601
- .returns(meetingCollectionMeetings);
510
+ parse = sinon.stub().returns(true);
511
+ initialSetup = sinon.stub().returns(true);
512
+ webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
513
+ locusInfo: {
514
+ parse,
515
+ },
516
+ sendCallAnalyzerMetrics: sinon.stub(),
517
+ });
518
+ webex.meetings.meetingCollection.getAll = sinon.stub().returns({
519
+ meetingutk: {
520
+ locusUrl: 'fdfdjfdhj',
521
+ sendCallAnalyzerMetrics: sinon.stub(),
522
+ },
523
+ });
524
+ webex.meetings.create = sinon.stub().returns(
525
+ Promise.resolve({
526
+ locusInfo: {
527
+ initialSetup,
528
+ },
529
+ sendCallAnalyzerMetrics: sinon.stub(),
530
+ })
531
+ );
602
532
  webex.meetings.request.getActiveMeetings = sinon.stub().returns(
603
533
  Promise.resolve({
604
- loci: [{url: 'still-valid-locus-url'}],
534
+ loci: [],
605
535
  })
606
536
  );
607
537
  MeetingUtil.cleanUp = sinon.stub().returns(Promise.resolve());
608
538
  });
609
-
610
- it('destroy any meeting that has no active locus url if keepOnlyLocusMeetings is not defined', async () => {
539
+ it('destroy non active meetings', async () => {
611
540
  await webex.meetings.syncMeetings();
612
541
  assert.calledOnce(webex.meetings.request.getActiveMeetings);
613
- assert.calledOnce(webex.meetings.meetingCollection.getAll);
614
- assert.calledWith(destroySpy, meetingCollectionMeetings.noLongerValidLocusMeeting);
615
- assert.calledWith(destroySpy, meetingCollectionMeetings.otherNonLocusMeeting1);
616
- assert.calledWith(destroySpy, meetingCollectionMeetings.otherNonLocusMeeting2);
617
- assert.callCount(destroySpy, 3);
618
-
619
- assert.callCount(MeetingUtil.cleanUp, 3);
620
- });
621
-
622
- it('destroy any meeting that has no active locus url if keepOnlyLocusMeetings === true', async () => {
623
- await webex.meetings.syncMeetings({keepOnlyLocusMeetings: true});
624
- assert.calledOnce(webex.meetings.request.getActiveMeetings);
625
- assert.calledOnce(webex.meetings.meetingCollection.getAll);
626
- assert.calledWith(destroySpy, meetingCollectionMeetings.noLongerValidLocusMeeting);
627
- assert.calledWith(destroySpy, meetingCollectionMeetings.otherNonLocusMeeting1);
628
- assert.calledWith(destroySpy, meetingCollectionMeetings.otherNonLocusMeeting2);
629
- assert.callCount(destroySpy, 3);
630
-
631
- assert.callCount(MeetingUtil.cleanUp, 3);
632
- });
633
-
634
- it('destroy any LOCUS meetings that have no active locus url if keepOnlyLocusMeetings === false', async () => {
635
- await webex.meetings.syncMeetings({keepOnlyLocusMeetings: false});
636
- assert.calledOnce(webex.meetings.request.getActiveMeetings);
637
- assert.calledOnce(webex.meetings.meetingCollection.getAll);
638
- assert.calledWith(destroySpy, meetingCollectionMeetings.noLongerValidLocusMeeting);
639
- assert.callCount(destroySpy, 1);
542
+ assert.calledOnce(destroySpy);
640
543
 
641
544
  assert.calledOnce(MeetingUtil.cleanUp);
642
545
  });
@@ -676,139 +579,14 @@ describe('plugin-meetings', () => {
676
579
  });
677
580
  });
678
581
 
679
- const FAKE_USE_RANDOM_DELAY = true;
680
- const correlationId = 'my-correlationId';
681
- const callStateForMetrics = {
682
- correlationId: 'my-correlationId2',
683
- joinTrigger: 'my-join-trigger',
684
- loginType: 'my-login-type',
685
- };
686
-
687
- it('should call setCallStateForMetrics on any pre-existing meeting', async () => {
688
- const fakeMeeting = {setCallStateForMetrics: sinon.mock()};
689
- webex.meetings.meetingCollection.getByKey = sinon.stub().returns(fakeMeeting);
690
- await webex.meetings.create(
691
- test1,
692
- test2,
693
- FAKE_USE_RANDOM_DELAY,
694
- {},
695
- correlationId,
696
- true,
697
- callStateForMetrics
698
- );
699
- assert.calledOnceWithExactly(fakeMeeting.setCallStateForMetrics, {
700
- ...callStateForMetrics,
701
- correlationId,
702
- });
703
- });
704
-
705
- const checkCallCreateMeeting = async (createParameters, createMeetingParameters) => {
706
- const create = webex.meetings.create(...createParameters);
707
-
708
- assert.exists(create.then);
709
- await create;
710
- assert.calledOnce(webex.meetings.createMeeting);
711
- assert.calledWith(webex.meetings.createMeeting, ...createMeetingParameters);
712
- };
713
-
714
582
  it('calls createMeeting and returns its promise', async () => {
715
- await checkCallCreateMeeting(
716
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true],
717
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, true]
718
- );
719
- });
720
-
721
- it('calls createMeeting, pass the meeting info param and returns its promise', async () => {
722
- const meetingInfo = {};
723
- await checkCallCreateMeeting(
724
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true, undefined, meetingInfo],
725
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, true, meetingInfo]
726
- );
727
- });
728
-
729
- it('calls createMeeting, pass the meeting info and meetingLookupURL param and returns its promise', async () => {
730
- const meetingInfo = {};
731
- await checkCallCreateMeeting(
732
- [
733
- test1,
734
- test2,
735
- FAKE_USE_RANDOM_DELAY,
736
- {},
737
- correlationId,
738
- true,
739
- undefined,
740
- meetingInfo,
741
- 'meetingLookupURL',
742
- ],
743
- [
744
- test1,
745
- test2,
746
- FAKE_USE_RANDOM_DELAY,
747
- {},
748
- {correlationId},
749
- true,
750
- meetingInfo,
751
- 'meetingLookupURL',
752
- ]
753
- );
754
- });
755
-
756
- it('calls createMeeting when failOnMissingMeetinginfo is undefined and returns its promise', async () => {
757
- await checkCallCreateMeeting(
758
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, undefined],
759
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, false]
760
- );
761
- });
762
-
763
- it('calls createMeeting when failOnMissingMeetinginfo is false and returns its promise', async () => {
764
- await checkCallCreateMeeting(
765
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, false],
766
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, false]
767
- );
768
- });
769
-
770
- it('calls createMeeting with callStateForMetrics and returns its promise', async () => {
771
- await checkCallCreateMeeting(
772
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, undefined, true, callStateForMetrics],
773
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, callStateForMetrics, true]
774
- );
775
- });
776
-
777
- it('calls createMeeting with callStateForMetrics overwritten with correlationId and returns its promise', async () => {
778
- await checkCallCreateMeeting(
779
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true, callStateForMetrics],
780
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {...callStateForMetrics, correlationId}, true]
781
- );
782
- });
783
-
784
- it('calls createMeeting with extra info params and returns its promise', async () => {
785
- const FAKE_USE_RANDOM_DELAY = false;
786
- const correlationId = 'my-correlationId';
787
-
788
- const FAKE_INFO_EXTRA_PARAMS = {
789
- mtid: 'm9fe0afd8c435e892afcce9ea25b97046',
790
- joinTXId: 'TSmrX61wNF',
791
- };
792
- const create = webex.meetings.create(
793
- test1,
794
- test2,
795
- FAKE_USE_RANDOM_DELAY,
796
- FAKE_INFO_EXTRA_PARAMS,
797
- correlationId
798
- );
583
+ const FAKE_USE_RANDOM_DELAY = true;
584
+ const create = webex.meetings.create(test1, test2, FAKE_USE_RANDOM_DELAY);
799
585
 
800
586
  assert.exists(create.then);
801
587
  await create;
802
588
  assert.calledOnce(webex.meetings.createMeeting);
803
- assert.calledWith(
804
- webex.meetings.createMeeting,
805
- test1,
806
- test2,
807
- FAKE_USE_RANDOM_DELAY,
808
- FAKE_INFO_EXTRA_PARAMS,
809
- {correlationId},
810
- false
811
- );
589
+ assert.calledWith(webex.meetings.createMeeting, test1, test2, FAKE_USE_RANDOM_DELAY);
812
590
  });
813
591
 
814
592
  it('creates a new meeting when a scheduled meeting exists in the conversation', async () => {
@@ -904,51 +682,45 @@ describe('plugin-meetings', () => {
904
682
  });
905
683
  describe('#handleLocusEvent', () => {
906
684
  describe('there was a meeting', () => {
685
+ let parse;
686
+
907
687
  beforeEach(() => {
688
+ parse = sinon.stub().returns(true);
908
689
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
909
- locusInfo,
690
+ locusInfo: {
691
+ parse,
692
+ },
910
693
  });
911
694
  });
912
- it('should parse the meeting info and update main session locus cache', () => {
913
- sinon.stub(MeetingsUtil, 'isBreakoutLocusDTO').returns(false);
695
+ it('should parse the meeting info', () => {
914
696
  webex.meetings.handleLocusEvent({
915
697
  locusUrl: url1,
916
698
  });
917
699
  assert.calledOnce(webex.meetings.meetingCollection.getByKey);
918
700
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
919
- assert.calledOnce(locusInfo.parse);
920
- assert.calledOnce(locusInfo.updateMainSessionLocusCache);
701
+ assert.calledOnce(parse);
921
702
  assert.calledWith(
922
- locusInfo.parse,
703
+ parse,
923
704
  {
924
- locusInfo,
705
+ locusInfo: {
706
+ parse,
707
+ },
925
708
  },
926
709
  {
927
710
  locusUrl: url1,
928
711
  }
929
712
  );
930
713
  });
931
-
932
- it('should not update main session locus cache', () => {
933
- sinon.stub(MeetingsUtil, 'isBreakoutLocusDTO').returns(true);
934
- webex.meetings.handleLocusEvent({
935
- locusUrl: url1,
936
- });
937
- assert.notCalled(locusInfo.updateMainSessionLocusCache);
938
- });
939
714
  });
940
715
  describe('there was not a meeting', () => {
941
716
  let initialSetup;
942
- const webExMeetingId = '123456';
943
717
 
944
718
  beforeEach(() => {
945
719
  initialSetup = sinon.stub().returns(true);
946
720
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns(undefined);
947
721
  webex.meetings.create = sinon.stub().returns(
948
722
  Promise.resolve({
949
- id: 'meeting-id',
950
723
  locusInfo: {
951
- ...locusInfo,
952
724
  initialSetup,
953
725
  },
954
726
  })
@@ -968,20 +740,12 @@ describe('plugin-meetings', () => {
968
740
  callbackAddress: uri1,
969
741
  },
970
742
  },
971
- info: {
972
- webExMeetingId,
973
- },
974
743
  },
975
744
  eventType: 'locus.difference',
976
745
  locusUrl: url1,
977
746
  });
978
- assert.callCount(webex.meetings.meetingCollection.getByKey, 6);
747
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
979
748
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
980
- assert.calledWith(
981
- webex.meetings.meetingCollection.getByKey,
982
- 'meetingNumber',
983
- webExMeetingId
984
- );
985
749
  assert.calledOnce(initialSetup);
986
750
  assert.calledWith(initialSetup, {
987
751
  id: uuid1,
@@ -995,9 +759,6 @@ describe('plugin-meetings', () => {
995
759
  callbackAddress: uri1,
996
760
  },
997
761
  },
998
- info: {
999
- webExMeetingId,
1000
- },
1001
762
  });
1002
763
  });
1003
764
  it('should setup the meeting by difference event without replaces', async () => {
@@ -1009,20 +770,12 @@ describe('plugin-meetings', () => {
1009
770
  callbackAddress: uri1,
1010
771
  },
1011
772
  },
1012
- info: {
1013
- webExMeetingId,
1014
- },
1015
773
  },
1016
774
  eventType: 'locus.difference',
1017
775
  locusUrl: url1,
1018
776
  });
1019
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
777
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
1020
778
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
1021
- assert.calledWith(
1022
- webex.meetings.meetingCollection.getByKey,
1023
- 'meetingNumber',
1024
- webExMeetingId
1025
- );
1026
779
  assert.calledOnce(initialSetup);
1027
780
  assert.calledWith(initialSetup, {
1028
781
  id: uuid1,
@@ -1031,44 +784,8 @@ describe('plugin-meetings', () => {
1031
784
  callbackAddress: uri1,
1032
785
  },
1033
786
  },
1034
- info: {
1035
- webExMeetingId,
1036
- },
1037
- });
1038
- });
1039
-
1040
- it('sends client event correctly on finally', async () => {
1041
- webex.meetings.getMeetingByType = sinon.stub().returns(true);
1042
-
1043
- await webex.meetings.handleLocusEvent({
1044
- locus: {
1045
- id: uuid1,
1046
- self: {
1047
- callBackInfo: {
1048
- callbackAddress: uri1,
1049
- },
1050
- },
1051
- info: {
1052
- webExMeetingId,
1053
- },
1054
- },
1055
- eventType: 'locus.difference',
1056
- locusUrl: url1,
1057
- });
1058
-
1059
- await testUtils.flushPromises();
1060
-
1061
- assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
1062
- name: 'client.call.remote-started',
1063
- payload: {
1064
- trigger: 'mercury-event',
1065
- },
1066
- options: {
1067
- meetingId: 'meeting-id',
1068
- },
1069
787
  });
1070
788
  });
1071
-
1072
789
  it('should setup the meeting by a not difference event', async () => {
1073
790
  await webex.meetings.handleLocusEvent({
1074
791
  locus: {
@@ -1078,20 +795,12 @@ describe('plugin-meetings', () => {
1078
795
  callbackAddress: uri1,
1079
796
  },
1080
797
  },
1081
- info: {
1082
- webExMeetingId,
1083
- },
1084
798
  },
1085
799
  eventType: test1,
1086
800
  locusUrl: url1,
1087
801
  });
1088
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
802
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
1089
803
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
1090
- assert.calledWith(
1091
- webex.meetings.meetingCollection.getByKey,
1092
- 'meetingNumber',
1093
- webExMeetingId
1094
- );
1095
804
  assert.calledOnce(initialSetup);
1096
805
  assert.calledWith(initialSetup, {
1097
806
  id: uuid1,
@@ -1100,9 +809,6 @@ describe('plugin-meetings', () => {
1100
809
  callbackAddress: uri1,
1101
810
  },
1102
811
  },
1103
- info: {
1104
- webExMeetingId,
1105
- },
1106
812
  });
1107
813
  });
1108
814
 
@@ -1125,7 +831,7 @@ describe('plugin-meetings', () => {
1125
831
 
1126
832
  it('should not try to match USM meetings by conversation url', async () => {
1127
833
  await webex.meetings.handleLocusEvent(generateFakeLocusData(true));
1128
- assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
834
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 3);
1129
835
  assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(0).args, [
1130
836
  'locusUrl',
1131
837
  url1,
@@ -1142,7 +848,7 @@ describe('plugin-meetings', () => {
1142
848
  });
1143
849
  it('should try to match non-USM meetings by conversation url', async () => {
1144
850
  await webex.meetings.handleLocusEvent(generateFakeLocusData(false));
1145
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
851
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
1146
852
  assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(0).args, [
1147
853
  'locusUrl',
1148
854
  url1,
@@ -1165,6 +871,7 @@ describe('plugin-meetings', () => {
1165
871
  });
1166
872
  describe('#createMeeting', () => {
1167
873
  beforeEach(() => {
874
+ MediaUtil.createPeerConnection = sinon.stub().returns(true);
1168
875
  webex.internal.device.userId = uuid1;
1169
876
  webex.internal.device.url = url1;
1170
877
  MeetingCollection.set = sinon.stub().returns(true);
@@ -1173,10 +880,6 @@ describe('plugin-meetings', () => {
1173
880
  });
1174
881
  describe('successful MeetingInfo.#fetchMeetingInfo', () => {
1175
882
  let clock, setTimeoutSpy, fakeMeetingStartTimeString, FAKE_TIME_TO_START;
1176
- const FAKE_INFO_EXTRA_PARAMS = {
1177
- mtid: 'm9fe0afd8c435e892afcce9ea25b97046',
1178
- joinTXId: 'TSmrX61wNF',
1179
- };
1180
883
 
1181
884
  beforeEach(() => {
1182
885
  clock = sinon.useFakeTimers();
@@ -1206,37 +909,13 @@ describe('plugin-meetings', () => {
1206
909
  meeting,
1207
910
  destination,
1208
911
  type,
1209
- extraParams = {},
1210
- expectedMeetingData = {},
1211
- sendCAevents = false,
1212
- injectMeetingInfo = false
912
+ expectedMeetingData = {}
1213
913
  ) => {
1214
- if (injectMeetingInfo) {
1215
- assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
1216
- } else {
1217
- assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
1218
- }
1219
-
914
+ assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
1220
915
  assert.calledOnce(MeetingsUtil.getMeetingAddedType);
1221
916
  assert.notCalled(setTimeoutSpy);
1222
- assert.callCount(TriggerProxy.trigger, 5);
1223
-
1224
- if (injectMeetingInfo) {
1225
- assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
1226
- } else {
1227
- assert.calledWith(
1228
- webex.meetings.meetingInfo.fetchMeetingInfo,
1229
- destination,
1230
- type,
1231
- null,
1232
- null,
1233
- undefined,
1234
- undefined,
1235
- extraParams,
1236
- {meetingId: meeting.id, sendCAevents}
1237
- );
1238
- }
1239
-
917
+ assert.calledThrice(TriggerProxy.trigger);
918
+ assert.calledWith(webex.meetings.meetingInfo.fetchMeetingInfo, destination, type);
1240
919
  assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1241
920
 
1242
921
  if (expectedMeetingData.permissionToken) {
@@ -1245,21 +924,6 @@ describe('plugin-meetings', () => {
1245
924
  if (expectedMeetingData.meetingJoinUrl) {
1246
925
  assert.equal(meeting.meetingJoinUrl, expectedMeetingData.meetingJoinUrl);
1247
926
  }
1248
- if (expectedMeetingData.correlationId) {
1249
- assert.equal(meeting.correlationId, expectedMeetingData.correlationId);
1250
- }
1251
- if (expectedMeetingData.callStateForMetrics) {
1252
- assert.deepEqual(
1253
- meeting.callStateForMetrics,
1254
- expectedMeetingData.callStateForMetrics
1255
- );
1256
- }
1257
- if (expectedMeetingData.meetingLookupUrl) {
1258
- assert.equal(
1259
- meeting.meetingInfo.meetingLookupUrl,
1260
- expectedMeetingData.meetingLookupUrl
1261
- );
1262
- }
1263
927
  assert.equal(meeting.destination, destination);
1264
928
  assert.equal(meeting.destinationType, type);
1265
929
  assert.calledWith(
@@ -1289,207 +953,107 @@ describe('plugin-meetings', () => {
1289
953
  const expectedMeetingData = {
1290
954
  permissionToken: 'PT',
1291
955
  meetingJoinUrl: 'meetingJoinUrl',
1292
- correlationId: meeting.id,
1293
956
  };
1294
957
 
1295
- checkCreateWithoutDelay(
1296
- meeting,
1297
- 'test destination',
1298
- 'test type',
1299
- {},
1300
- expectedMeetingData
1301
- );
958
+ checkCreateWithoutDelay(meeting, 'test destination', 'test type', expectedMeetingData);
1302
959
  });
1303
960
 
1304
- it('accepts injected meeting info', async () => {
1305
- const meetingInfo = {
961
+ it('creates the meeting from a successful meeting info fetch meeting resolve testing', async () => {
962
+ const meeting = await webex.meetings.createMeeting('test destination', 'test type');
963
+ const expectedMeetingData = {
1306
964
  permissionToken: 'PT',
1307
965
  meetingJoinUrl: 'meetingJoinUrl',
1308
966
  };
1309
967
 
1310
- const meeting = await webex.meetings.createMeeting(
1311
- 'test destination',
1312
- 'test type',
1313
- false,
1314
- {},
1315
- undefined,
1316
- false,
1317
- meetingInfo
1318
- );
1319
-
1320
- const expectedMeetingData = {
1321
- ...meetingInfo,
1322
- correlationId: meeting.id,
1323
- };
1324
-
1325
- checkCreateWithoutDelay(
968
+ assert.instanceOf(
1326
969
  meeting,
1327
- 'test destination',
1328
- 'test type',
1329
- {},
1330
- expectedMeetingData,
1331
- false,
1332
- true
970
+ Meeting,
971
+ 'createMeeting should eventually resolve to a Meeting Object'
1333
972
  );
973
+ checkCreateWithoutDelay(meeting, 'test destination', 'test type', expectedMeetingData);
1334
974
  });
1335
975
 
1336
- it('accepts injected meeting info with meeting lookup url', async () => {
1337
- const meetingInfo = {
1338
- permissionToken: 'PT',
1339
- meetingJoinUrl: 'meetingJoinUrl',
976
+ it('creates the meeting from a successful meeting info fetch with random delay', async () => {
977
+ const FAKE_LOCUS_MEETING = {
978
+ conversationUrl: 'locusConvURL',
979
+ url: 'locusUrl',
980
+ info: {
981
+ webExMeetingId: 'locusMeetingId',
982
+ sipUri: 'locusSipUri',
983
+ owner: 'locusOwner',
984
+ },
985
+ meeting: {
986
+ startTime: fakeMeetingStartTimeString,
987
+ },
988
+ fullState: {
989
+ active: false,
990
+ },
1340
991
  };
1341
992
 
1342
993
  const meeting = await webex.meetings.createMeeting(
1343
- 'test destination',
994
+ FAKE_LOCUS_MEETING,
1344
995
  'test type',
1345
- false,
1346
- {},
1347
- undefined,
1348
- false,
1349
- meetingInfo,
1350
- 'meetingLookupUrl'
996
+ true
1351
997
  );
1352
998
 
1353
- const expectedMeetingData = {
1354
- ...meetingInfo,
1355
- meetingLookupUrl: 'meetingLookupUrl',
1356
- correlationId: meeting.id,
1357
- };
1358
-
1359
- checkCreateWithoutDelay(
999
+ assert.instanceOf(
1360
1000
  meeting,
1361
- 'test destination',
1362
- 'test type',
1363
- {},
1364
- expectedMeetingData,
1365
- false,
1366
- true
1001
+ Meeting,
1002
+ 'createMeeting should eventually resolve to a Meeting Object'
1003
+ );
1004
+ assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
1005
+ assert.calledOnce(setTimeoutSpy);
1006
+
1007
+ // Parse meeting info with locus object
1008
+ assert.equal(meeting.conversationUrl, 'locusConvURL');
1009
+ assert.equal(meeting.locusUrl, 'locusUrl');
1010
+ assert.equal(meeting.sipUri, 'locusSipUri');
1011
+ assert.equal(meeting.meetingNumber, 'locusMeetingId');
1012
+ assert.isUndefined(meeting.meetingJoinUrl);
1013
+ assert.equal(meeting.owner, 'locusOwner');
1014
+ assert.isUndefined(meeting.permissionToken);
1015
+
1016
+ // Add meeting and send trigger
1017
+ assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1018
+ assert.calledTwice(TriggerProxy.trigger);
1019
+ assert.calledWith(
1020
+ TriggerProxy.trigger,
1021
+ sinon.match.instanceOf(Meetings),
1022
+ {
1023
+ file: 'meetings',
1024
+ function: 'createMeeting',
1025
+ },
1026
+ 'meeting:added',
1027
+ {
1028
+ meeting: sinon.match.instanceOf(Meeting),
1029
+ type: 'test meeting added type',
1030
+ }
1367
1031
  );
1368
- });
1369
-
1370
- [undefined, FAKE_INFO_EXTRA_PARAMS].forEach((infoExtraParams) => {
1371
- const infoExtraParamsProvided = infoExtraParams !== undefined;
1372
-
1373
- it(`creates the meeting from a successful meeting info fetch meeting resolve testing${
1374
- infoExtraParamsProvided ? ' with infoExtraParams' : ''
1375
- }`, async () => {
1376
- const meeting = await webex.meetings.createMeeting(
1377
- 'test destination',
1378
- 'test type',
1379
- false,
1380
- infoExtraParams
1381
- );
1382
- const expectedMeetingData = {
1383
- permissionToken: 'PT',
1384
- meetingJoinUrl: 'meetingJoinUrl',
1385
- };
1386
-
1387
- assert.instanceOf(
1388
- meeting,
1389
- Meeting,
1390
- 'createMeeting should eventually resolve to a Meeting Object'
1391
- );
1392
- checkCreateWithoutDelay(
1393
- meeting,
1394
- 'test destination',
1395
- 'test type',
1396
- infoExtraParamsProvided ? infoExtraParams : {},
1397
- expectedMeetingData
1398
- );
1399
- });
1400
-
1401
- it(`creates the meeting from a successful meeting info fetch with random delay${
1402
- infoExtraParamsProvided ? ' with infoExtraParams' : ''
1403
- }`, async () => {
1404
- const FAKE_LOCUS_MEETING = {
1405
- conversationUrl: 'locusConvURL',
1406
- url: 'locusUrl',
1407
- info: {
1408
- webExMeetingId: 'locusMeetingId',
1409
- sipUri: 'locusSipUri',
1410
- owner: 'locusOwner',
1411
- },
1412
- meeting: {
1413
- startTime: fakeMeetingStartTimeString,
1414
- },
1415
- fullState: {
1416
- active: false,
1417
- },
1418
- };
1419
-
1420
- const meeting = await webex.meetings.createMeeting(
1421
- FAKE_LOCUS_MEETING,
1422
- 'test type',
1423
- true,
1424
- infoExtraParams
1425
- );
1426
-
1427
- assert.instanceOf(
1428
- meeting,
1429
- Meeting,
1430
- 'createMeeting should eventually resolve to a Meeting Object'
1431
- );
1432
- assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
1433
- assert.calledOnce(setTimeoutSpy);
1434
-
1435
- // Parse meeting info with locus object
1436
- assert.equal(meeting.conversationUrl, 'locusConvURL');
1437
- assert.equal(meeting.locusUrl, 'locusUrl');
1438
- assert.equal(meeting.sipUri, 'locusSipUri');
1439
- assert.equal(meeting.meetingNumber, 'locusMeetingId');
1440
- assert.isUndefined(meeting.meetingJoinUrl);
1441
- assert.equal(meeting.owner, 'locusOwner');
1442
- assert.isUndefined(meeting.permissionToken);
1443
-
1444
- // Add meeting and send trigger
1445
- assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1446
- assert.calledTwice(TriggerProxy.trigger);
1447
- assert.calledWith(
1448
- TriggerProxy.trigger,
1449
- sinon.match.instanceOf(Meetings),
1450
- {
1451
- file: 'meetings',
1452
- function: 'createMeeting',
1453
- },
1454
- 'meeting:added',
1455
- {
1456
- meeting: sinon.match.instanceOf(Meeting),
1457
- type: 'test meeting added type',
1458
- }
1459
- );
1460
-
1461
- // When timer expires
1462
- clock.tick(FAKE_TIME_TO_START);
1463
- await testUtils.flushPromises();
1464
1032
 
1465
- assert.calledWith(
1466
- webex.meetings.meetingInfo.fetchMeetingInfo,
1467
- FAKE_LOCUS_MEETING,
1468
- 'test type',
1469
- null,
1470
- null,
1471
- undefined,
1472
- undefined,
1473
- infoExtraParamsProvided ? infoExtraParams : {}
1474
- );
1033
+ // When timer expires
1034
+ clock.tick(FAKE_TIME_TO_START);
1035
+ assert.calledWith(
1036
+ webex.meetings.meetingInfo.fetchMeetingInfo,
1037
+ FAKE_LOCUS_MEETING,
1038
+ 'test type'
1039
+ );
1475
1040
 
1476
- // Parse meeting info is called again with new meeting info
1477
- await testUtils.flushPromises();
1478
- assert.equal(meeting.conversationUrl, 'locusConvURL');
1479
- assert.equal(meeting.locusUrl, 'locusUrl');
1480
- assert.equal(meeting.sipUri, 'locusSipUri');
1481
- assert.equal(meeting.meetingNumber, 'locusMeetingId');
1482
- assert.equal(meeting.meetingJoinUrl, 'meetingJoinUrl');
1483
- assert.equal(meeting.owner, 'locusOwner');
1484
- assert.equal(meeting.permissionToken, 'PT');
1041
+ // Parse meeting info is called again with new meeting info
1042
+ await testUtils.flushPromises();
1043
+ assert.equal(meeting.conversationUrl, 'locusConvURL');
1044
+ assert.equal(meeting.locusUrl, 'locusUrl');
1045
+ assert.equal(meeting.sipUri, 'locusSipUri');
1046
+ assert.equal(meeting.meetingNumber, 'locusMeetingId');
1047
+ assert.equal(meeting.meetingJoinUrl, 'meetingJoinUrl');
1048
+ assert.equal(meeting.owner, 'locusOwner');
1049
+ assert.equal(meeting.permissionToken, 'PT');
1485
1050
 
1486
- assert.calledWith(
1487
- TriggerProxy.trigger,
1488
- meeting,
1489
- {file: 'meetings', function: 'fetchMeetingInfo'},
1490
- 'meeting:meetingInfoAvailable'
1491
- );
1492
- });
1051
+ assert.calledWith(
1052
+ TriggerProxy.trigger,
1053
+ meeting,
1054
+ {file: 'meetings', function: 'fetchMeetingInfo'},
1055
+ 'meeting:meetingInfoAvailable'
1056
+ );
1493
1057
  });
1494
1058
 
1495
1059
  it('creates the meeting from a successful meeting info fetch that has no random delay because it is active', async () => {
@@ -1589,61 +1153,6 @@ describe('plugin-meetings', () => {
1589
1153
  );
1590
1154
  checkCreateWithoutDelay(meeting, FAKE_LOCUS_MEETING, 'test type');
1591
1155
  });
1592
-
1593
- it('creates meeting with the correlationId provided', async () => {
1594
- const meeting = await webex.meetings.createMeeting(
1595
- 'test destination',
1596
- 'test type',
1597
- false,
1598
- {},
1599
- {correlationId: 'my-correlationId'}
1600
- );
1601
-
1602
- const expectedMeetingData = {
1603
- correlationId: 'my-correlationId',
1604
- };
1605
-
1606
- checkCreateWithoutDelay(
1607
- meeting,
1608
- 'test destination',
1609
- 'test type',
1610
- {},
1611
- expectedMeetingData,
1612
- true
1613
- );
1614
- });
1615
-
1616
- it('creates meeting with the callStateForMetrics provided', async () => {
1617
- const meeting = await webex.meetings.createMeeting(
1618
- 'test destination',
1619
- 'test type',
1620
- false,
1621
- {},
1622
- {
1623
- correlationId: 'my-correlationId',
1624
- joinTrigger: 'my-join-trigger',
1625
- loginType: 'my-login-type',
1626
- }
1627
- );
1628
-
1629
- const expectedMeetingData = {
1630
- correlationId: 'my-correlationId',
1631
- callStateForMetrics: {
1632
- correlationId: 'my-correlationId',
1633
- joinTrigger: 'my-join-trigger',
1634
- loginType: 'my-login-type',
1635
- },
1636
- };
1637
-
1638
- checkCreateWithoutDelay(
1639
- meeting,
1640
- 'test destination',
1641
- 'test type',
1642
- {},
1643
- expectedMeetingData,
1644
- true
1645
- );
1646
- });
1647
1156
  });
1648
1157
 
1649
1158
  describe('rejected MeetingInfo.#fetchMeetingInfo', () => {
@@ -1653,136 +1162,45 @@ describe('plugin-meetings', () => {
1653
1162
  webex.meetings.meetingInfo.fetchMeetingInfo = sinon
1654
1163
  .stub()
1655
1164
  .returns(Promise.reject(new Error('test')));
1656
- webex.meetings.destroy = sinon.stub().returns(Promise.resolve());
1657
- webex.meetings.createMeeting = sinon.spy(webex.meetings.createMeeting);
1658
1165
  });
1659
-
1660
- const checkCreateMeetingWithNoMeetingInfo = async (failOnMissingMeetingInfo, destroy) => {
1661
- try {
1662
- const meeting = await webex.meetings.createMeeting(
1663
- 'test destination',
1664
- 'test type',
1665
- undefined,
1666
- undefined,
1667
- undefined,
1668
- failOnMissingMeetingInfo
1669
- );
1670
-
1671
- assert.instanceOf(
1672
- meeting,
1673
- Meeting,
1674
- 'createMeeting should eventually resolve to a Meeting Object'
1675
- );
1676
- assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
1677
- assert.calledOnce(MeetingsUtil.getMeetingAddedType);
1678
- assert.calledThrice(TriggerProxy.trigger);
1679
- assert.calledWith(
1680
- webex.meetings.meetingInfo.fetchMeetingInfo,
1681
- 'test destination',
1682
- 'test type'
1683
- );
1684
-
1685
- if (destroy) {
1686
- assert.calledWith(
1687
- webex.meetings.destroy,
1688
- sinon.match.instanceOf(Meeting),
1689
- 'MISSING_MEETING_INFO'
1690
- );
1691
- assert.notCalled(MeetingsUtil.getMeetingAddedType);
1692
- assert.notCalled(TriggerProxy.trigger);
1693
- assert.throw(webex.meetings.createMeeting, 'meeting information not found');
1694
- } else {
1695
- assert.notCalled(webex.meetings.destroy);
1696
- assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1697
- assert.calledWith(
1698
- TriggerProxy.trigger,
1699
- sinon.match.instanceOf(Meetings),
1700
- {
1701
- file: 'meetings',
1702
- function: 'createMeeting',
1703
- },
1704
- 'meeting:added',
1705
- {
1706
- meeting: sinon.match.instanceOf(Meeting),
1707
- type: 'test meeting added type',
1708
- }
1709
- );
1710
- }
1711
- } catch (err) {
1712
- assert.instanceOf(err, NoMeetingInfoError);
1713
- }
1714
- };
1715
-
1716
1166
  it('creates the meeting from a rejected meeting info fetch', async () => {
1717
- checkCreateMeetingWithNoMeetingInfo(false, false);
1718
- });
1719
-
1720
- it('creates the meeting from a rejected meeting info fetch and destroys it if failOnMissingMeetingInfo', async () => {
1721
- checkCreateMeetingWithNoMeetingInfo(true, true);
1722
- });
1723
- });
1167
+ const meeting = await webex.meetings.createMeeting('test destination', 'test type');
1724
1168
 
1725
- describe('rejected MeetingInfo.#fetchMeetingInfo - does not log for known Error types', () => {
1726
- forEach(
1727
- [
1728
- {
1729
- error: new CaptchaError(),
1730
- debugLogMessage:
1731
- 'Meetings:index#createMeeting --> Debug CaptchaError: Captcha is required. fetching /meetingInfo for creation.',
1732
- },
1733
- {
1734
- error: new PasswordError(),
1735
- debugLogMessage:
1736
- 'Meetings:index#createMeeting --> Debug PasswordError: Password is required, please use verifyPassword() fetching /meetingInfo for creation.',
1737
- },
1169
+ assert.instanceOf(
1170
+ meeting,
1171
+ Meeting,
1172
+ 'createMeeting should eventually resolve to a Meeting Object'
1173
+ );
1174
+ assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
1175
+ assert.calledOnce(MeetingsUtil.getMeetingAddedType);
1176
+ assert.calledTwice(TriggerProxy.trigger);
1177
+ assert.calledWith(
1178
+ webex.meetings.meetingInfo.fetchMeetingInfo,
1179
+ 'test destination',
1180
+ 'test type'
1181
+ );
1182
+ assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1183
+ assert.calledWith(
1184
+ TriggerProxy.trigger,
1185
+ sinon.match.instanceOf(Meetings),
1738
1186
  {
1739
- error: new PermissionError(),
1740
- debugLogMessage:
1741
- '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.',
1187
+ file: 'meetings',
1188
+ function: 'createMeeting',
1742
1189
  },
1190
+ 'meeting:added',
1743
1191
  {
1744
- error: new Error(),
1745
- infoLogMessage: true,
1746
- debugLogMessage:
1747
- 'Meetings:index#createMeeting --> Debug Error fetching /meetingInfo for creation.',
1748
- },
1749
- ],
1750
- ({error, debugLogMessage, infoLogMessage}) => {
1751
- it('creates the meeting from a rejected meeting info fetch', async () => {
1752
- webex.meetings.meetingInfo.fetchMeetingInfo = sinon
1753
- .stub()
1754
- .returns(Promise.reject(error));
1755
-
1756
- LoggerProxy.logger.debug = sinon.stub();
1757
- LoggerProxy.logger.info = sinon.stub();
1758
-
1759
- const meeting = await webex.meetings.createMeeting('test destination', 'test type');
1760
-
1761
- assert.instanceOf(
1762
- meeting,
1763
- Meeting,
1764
- 'createMeeting should eventually resolve to a Meeting Object'
1765
- );
1766
-
1767
- assert.calledWith(LoggerProxy.logger.debug, debugLogMessage);
1768
-
1769
- if (infoLogMessage) {
1770
- assert.calledWith(
1771
- LoggerProxy.logger.info,
1772
- 'Meetings:index#createMeeting --> Info Unable to fetch meeting info for test destination.'
1773
- );
1774
- } else {
1775
- assert.notCalled(LoggerProxy.logger.info);
1776
- }
1777
- });
1778
- }
1779
- );
1192
+ meeting: sinon.match.instanceOf(Meeting),
1193
+ type: 'test meeting added type',
1194
+ }
1195
+ );
1196
+ });
1780
1197
  });
1781
1198
  });
1782
1199
  });
1783
1200
  describe('Public Event Triggers', () => {
1784
1201
  describe('#destroy', () => {
1785
1202
  beforeEach(() => {
1203
+ MediaUtil.createPeerConnection = sinon.stub().returns(true);
1786
1204
  MeetingUtil.cleanUp = sinon.stub();
1787
1205
  });
1788
1206
  it('should have #destroy', () => {
@@ -1856,8 +1274,6 @@ describe('plugin-meetings', () => {
1856
1274
  });
1857
1275
 
1858
1276
  describe('#fetchUserPreferredWebexSite', () => {
1859
- let loggerProxySpy;
1860
-
1861
1277
  it('should call request.getMeetingPreferences to get the preferred webex site ', async () => {
1862
1278
  assert.isDefined(webex.meetings.preferredWebexSite);
1863
1279
  await webex.meetings.fetchUserPreferredWebexSite();
@@ -1865,22 +1281,18 @@ describe('plugin-meetings', () => {
1865
1281
  assert.equal(webex.meetings.preferredWebexSite, 'go.webex.com');
1866
1282
  });
1867
1283
 
1868
- const setup = ({user} = {}) => {
1869
- loggerProxySpy = sinon.spy(LoggerProxy.logger, 'error');
1870
-
1871
- Object.assign(webex.internal, {
1872
- services: {
1873
- getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
1874
- },
1875
- user: {
1876
- get: sinon.stub().returns(Promise.resolve(user)),
1877
- },
1878
- });
1879
- };
1284
+ it('should not call request.getMeetingPreferences if user is a guest', async () => {
1285
+ Object.assign(webex.people,{
1286
+ _getMe: sinon.stub().returns(Promise.resolve({type: 'appuser'})),
1287
+ })
1288
+
1289
+ await webex.meetings.fetchUserPreferredWebexSite();
1290
+
1291
+ assert.equal(webex.meetings.preferredWebexSite, '');
1292
+ assert.notCalled(webex.internal.services.getMeetingPreferences);
1293
+ });
1880
1294
 
1881
1295
  it('should not fail if UserPreferred info is not fetched ', async () => {
1882
- setup();
1883
-
1884
1296
  Object.assign(webex.internal, {
1885
1297
  services: {
1886
1298
  getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
@@ -1890,115 +1302,7 @@ describe('plugin-meetings', () => {
1890
1302
  await webex.meetings.fetchUserPreferredWebexSite().then(() => {
1891
1303
  assert.equal(webex.meetings.preferredWebexSite, '');
1892
1304
  });
1893
- assert.calledOnceWithExactly(
1894
- loggerProxySpy,
1895
- 'Failed to fetch preferred site from user - no site will be set'
1896
- );
1897
- });
1898
-
1899
- it('should fall back to fetching the site from the user', async () => {
1900
- setup({
1901
- user: {
1902
- userPreferences: {
1903
- userPreferencesItems: {
1904
- preferredWebExSite: 'site.webex.com',
1905
- },
1906
- },
1907
- },
1908
- });
1909
-
1910
- await webex.meetings.fetchUserPreferredWebexSite();
1911
-
1912
- assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
1913
- assert.notCalled(loggerProxySpy);
1914
- });
1915
-
1916
- forEach(
1917
- [
1918
- {user: undefined},
1919
- {user: {userPreferences: {}}},
1920
- {user: {userPreferences: {userPreferencesItems: {}}}},
1921
- {user: {userPreferences: {userPreferencesItems: {preferredWebExSite: undefined}}}},
1922
- ],
1923
- ({user}) => {
1924
- it(`should handle invalid user data ${user}`, async () => {
1925
- setup({user});
1926
-
1927
- await webex.meetings.fetchUserPreferredWebexSite();
1928
-
1929
- assert.equal(webex.meetings.preferredWebexSite, '');
1930
- assert.calledOnceWithExactly(
1931
- loggerProxySpy,
1932
- 'Failed to fetch preferred site from user - no site will be set'
1933
- );
1934
- });
1935
- }
1936
- );
1937
-
1938
- it('should handle a get user failure', async () => {
1939
- setup();
1940
-
1941
- webex.internal.user.get.rejects(new Error());
1942
-
1943
- await webex.meetings.fetchUserPreferredWebexSite();
1944
-
1945
- assert.equal(webex.meetings.preferredWebexSite, '');
1946
- assert.calledOnceWithExactly(
1947
- loggerProxySpy,
1948
- 'Failed to fetch preferred site from user - no site will be set'
1949
- );
1950
- });
1951
-
1952
- it('should fall back to fetching the site from the user', async () => {
1953
- setup({
1954
- user: {
1955
- userPreferences: {
1956
- userPreferencesItems: {
1957
- preferredWebExSite: 'site.webex.com',
1958
- },
1959
- },
1960
- },
1961
- });
1962
-
1963
- await webex.meetings.fetchUserPreferredWebexSite();
1964
-
1965
- assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
1966
- assert.notCalled(loggerProxySpy);
1967
- });
1968
-
1969
- forEach([
1970
- {user: undefined},
1971
- {user: {userPreferences: {}}},
1972
- {user: {userPreferences: {userPreferencesItems: {}}}},
1973
- {user: {userPreferences: {userPreferencesItems: {preferredWebExSite: undefined}}}},
1974
- ], ({user}) => {
1975
- it(`should handle invalid user data ${user}`, async () => {
1976
- setup({user});
1977
-
1978
- await webex.meetings.fetchUserPreferredWebexSite();
1979
-
1980
- assert.equal(webex.meetings.preferredWebexSite, '');
1981
- assert.calledOnceWithExactly(
1982
- loggerProxySpy,
1983
- 'Failed to fetch preferred site from user - no site will be set'
1984
- );
1985
- });
1986
- });
1987
-
1988
- it('should handle a get user failure', async () => {
1989
- setup();
1990
-
1991
- webex.internal.user.get.rejects(new Error());
1992
-
1993
- await webex.meetings.fetchUserPreferredWebexSite();
1994
-
1995
- assert.equal(webex.meetings.preferredWebexSite, '');
1996
- assert.calledOnceWithExactly(
1997
- loggerProxySpy,
1998
- 'Failed to fetch preferred site from user - no site will be set'
1999
- );
2000
1305
  });
2001
-
2002
1306
  });
2003
1307
  });
2004
1308
 
@@ -2006,6 +1310,7 @@ describe('plugin-meetings', () => {
2006
1310
  let meeting;
2007
1311
 
2008
1312
  beforeEach(async () => {
1313
+ MediaUtil.createPeerConnection = sinon.stub().returns(true);
2009
1314
  webex.internal.device.userId = uuid1;
2010
1315
  webex.internal.device.url = url1;
2011
1316
  MeetingCollection.set = sinon.stub().returns(true);
@@ -2082,523 +1387,5 @@ describe('plugin-meetings', () => {
2082
1387
  );
2083
1388
  });
2084
1389
  });
2085
-
2086
- describe('#isNeedHandleMainLocus', () => {
2087
- let meeting;
2088
- let newLocus;
2089
- beforeEach(() => {
2090
- meeting = {
2091
- controls: {},
2092
- self: {},
2093
- };
2094
- newLocus = {
2095
- controls: {},
2096
- self: {},
2097
- };
2098
- });
2099
- afterEach(() => {
2100
- sinon.restore();
2101
- });
2102
- it('check normal case will return true', () => {
2103
- sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns(null);
2104
- LoggerProxy.logger.log = sinon.stub();
2105
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
2106
- assert.equal(result, true);
2107
- assert.calledWith(
2108
- LoggerProxy.logger.log,
2109
- 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
2110
- );
2111
- });
2112
-
2113
- it('check self joined and joined on this device, return true', () => {
2114
- sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns(null);
2115
- newLocus.self.state = 'JOINED';
2116
- sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(true);
2117
-
2118
- LoggerProxy.logger.log = sinon.stub();
2119
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
2120
- assert.equal(result, true);
2121
- assert.calledWith(
2122
- LoggerProxy.logger.log,
2123
- 'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
2124
- );
2125
- });
2126
-
2127
- it('if newLocus replaceAt time is expired, then return false', () => {
2128
- sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns({
2129
- joinedWith: {
2130
- replaces: [
2131
- {
2132
- replaceAt: '2023-03-27T02:17:02.506Z',
2133
- },
2134
- ],
2135
- },
2136
- });
2137
- newLocus.self.state = 'JOINED';
2138
- sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(true);
2139
- sinon.stub(MeetingsUtil, 'getThisDevice').returns({
2140
- replaces: [
2141
- {
2142
- replaceAt: '2023-03-27T02:17:01.506Z',
2143
- },
2144
- ],
2145
- });
2146
-
2147
- LoggerProxy.logger.log = sinon.stub();
2148
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
2149
- assert.equal(result, false);
2150
- assert.calledWith(
2151
- LoggerProxy.logger.log,
2152
- `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`
2153
- );
2154
- });
2155
-
2156
- it('check current is in breakout join with this device, return false', () => {
2157
- sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns({
2158
- joinedWith: {
2159
- correlationId: '111',
2160
- },
2161
- });
2162
- newLocus.controls.breakout = {url: 'url'};
2163
- meeting.correlationId = '111';
2164
-
2165
- LoggerProxy.logger.log = sinon.stub();
2166
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
2167
- assert.equal(result, false);
2168
- assert.calledWith(
2169
- LoggerProxy.logger.log,
2170
- `Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: url`
2171
- );
2172
- });
2173
-
2174
- it('check self is moved and removed, return false', () => {
2175
- webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
2176
- newLocus.self.state = 'LEFT';
2177
- newLocus.self.reason = 'MOVED';
2178
- newLocus.self.removed = true;
2179
- LoggerProxy.logger.log = sinon.stub();
2180
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
2181
- assert.equal(result, false);
2182
- assert.calledWith(
2183
- LoggerProxy.logger.log,
2184
- 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
2185
- );
2186
- });
2187
-
2188
- it('check self is moved and device resource removed, return false', () => {
2189
- webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
2190
- newLocus.self.state = 'LEFT';
2191
- newLocus.self.reason = 'MOVED';
2192
- sinon.stub(MeetingsUtil, 'getThisDevice').returns({
2193
- state: 'LEFT',
2194
- reason: 'MOVED',
2195
- });
2196
- LoggerProxy.logger.log = sinon.stub();
2197
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
2198
- assert.equal(result, false);
2199
- assert.calledWith(
2200
- LoggerProxy.logger.log,
2201
- 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
2202
- );
2203
- });
2204
-
2205
- it('check self is joined but device resource removed, return false', () => {
2206
- webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
2207
- sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(false);
2208
- newLocus.self.state = 'JOINED';
2209
- sinon.stub(MeetingsUtil, 'getThisDevice').returns({
2210
- state: 'LEFT',
2211
- reason: 'MOVED',
2212
- });
2213
- LoggerProxy.logger.log = sinon.stub();
2214
- const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
2215
- assert.equal(result, false);
2216
- assert.calledWith(
2217
- LoggerProxy.logger.log,
2218
- 'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'
2219
- );
2220
- });
2221
- });
2222
-
2223
- describe('#isNeedHandleLocusDTO', () => {
2224
- let meeting;
2225
- let newLocus;
2226
- beforeEach(() => {
2227
- meeting = {
2228
- controls: {},
2229
- self: {},
2230
- };
2231
- newLocus = {
2232
- controls: {},
2233
- self: {},
2234
- };
2235
- });
2236
- afterEach(() => {
2237
- sinon.restore();
2238
- });
2239
- it('initial DTO , joined breakout session, return true', () => {
2240
- newLocus.controls.breakout = {
2241
- sessionType: 'BREAKOUT',
2242
- };
2243
- newLocus.self.state = 'JOINED';
2244
- newLocus.fullState = {
2245
- active: true,
2246
- };
2247
- LoggerProxy.logger.log = sinon.stub();
2248
- const result = webex.meetings.isNeedHandleLocusDTO(null, newLocus);
2249
- assert.equal(result, true);
2250
- assert.calledWith(
2251
- LoggerProxy.logger.log,
2252
- `Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: true`
2253
- );
2254
- });
2255
- it('others go to check isNeedHandleMainLocus', () => {
2256
- newLocus.controls.breakout = {
2257
- sessionType: 'MAIN',
2258
- };
2259
- newLocus.self.state = 'JOINED';
2260
-
2261
- LoggerProxy.logger.log = sinon.stub();
2262
- const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
2263
- assert.equal(result, true);
2264
- assert.calledWith(
2265
- LoggerProxy.logger.log,
2266
- 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
2267
- );
2268
- });
2269
- it('joined breakout session, self status is moved, return false', () => {
2270
- newLocus.controls.breakout = {
2271
- sessionType: 'BREAKOUT',
2272
- };
2273
- newLocus.self.state = 'LEFT';
2274
- newLocus.self.reason = 'MOVED';
2275
-
2276
- LoggerProxy.logger.log = sinon.stub();
2277
- const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
2278
- assert.equal(result, false);
2279
- });
2280
- });
2281
-
2282
- describe('#getCorrespondingMeetingByLocus', () => {
2283
- let locus;
2284
- let mockReturnMeeting = {meeting: 'meeting1'};
2285
- const mockGetByKey = (keyWillReturnMeeting) => {
2286
- webex.meetings.meetingCollection.getByKey = sinon.stub().callsFake((key) => {
2287
- if (key === keyWillReturnMeeting) {
2288
- return mockReturnMeeting;
2289
- }
2290
- return null;
2291
- });
2292
- };
2293
-
2294
- beforeEach(() => {
2295
- locus = {
2296
- controls: {},
2297
- self: {
2298
- callbackInfo: {
2299
- callbackAddress: 'address1',
2300
- },
2301
- },
2302
- info: {
2303
- webExMeetingId: '123456',
2304
- isUnifiedSpaceMeeting: false,
2305
- },
2306
- conversationUrl: 'conversationUrl1',
2307
- };
2308
-
2309
- sinon.stub(MeetingsUtil, 'checkForCorrelationId').returns('correlationId1');
2310
- });
2311
- afterEach(() => {
2312
- sinon.restore();
2313
- });
2314
- it('check the calls when no meeting found in meetingCollection', () => {
2315
- mockGetByKey();
2316
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2317
- assert.isNull(result);
2318
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
2319
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
2320
- assert.calledWith(
2321
- webex.meetings.meetingCollection.getByKey,
2322
- 'correlationId',
2323
- 'correlationId1'
2324
- );
2325
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
2326
- assert.calledWith(
2327
- webex.meetings.meetingCollection.getByKey,
2328
- 'conversationUrl',
2329
- 'conversationUrl1'
2330
- );
2331
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', '123456');
2332
- });
2333
-
2334
- it('not try getByKey "conversationUrl" when isUnifiedSpaceMeeting is true', () => {
2335
- mockGetByKey();
2336
- locus.info.isUnifiedSpaceMeeting = true;
2337
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2338
- assert.isNull(result);
2339
- assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
2340
- });
2341
-
2342
- it('check the calls when meeting found by key: locusUrl', () => {
2343
- mockGetByKey('locusUrl');
2344
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2345
- assert.deepEqual(result, mockReturnMeeting);
2346
- assert.callCount(webex.meetings.meetingCollection.getByKey, 1);
2347
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
2348
- });
2349
-
2350
- it('check the calls when meeting found by key: correlationId', () => {
2351
- mockGetByKey('correlationId');
2352
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2353
- assert.deepEqual(result, mockReturnMeeting);
2354
- assert.callCount(webex.meetings.meetingCollection.getByKey, 2);
2355
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
2356
- assert.calledWith(
2357
- webex.meetings.meetingCollection.getByKey,
2358
- 'correlationId',
2359
- 'correlationId1'
2360
- );
2361
- });
2362
-
2363
- it('check the calls when meeting found by key: sipUri', () => {
2364
- mockGetByKey('sipUri');
2365
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2366
- assert.deepEqual(result, mockReturnMeeting);
2367
- assert.callCount(webex.meetings.meetingCollection.getByKey, 3);
2368
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
2369
- assert.calledWith(
2370
- webex.meetings.meetingCollection.getByKey,
2371
- 'correlationId',
2372
- 'correlationId1'
2373
- );
2374
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
2375
- });
2376
-
2377
- it('check the calls when meeting found by key: conversationUrl', () => {
2378
- mockGetByKey('conversationUrl');
2379
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2380
- assert.deepEqual(result, mockReturnMeeting);
2381
- assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
2382
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
2383
- assert.calledWith(
2384
- webex.meetings.meetingCollection.getByKey,
2385
- 'correlationId',
2386
- 'correlationId1'
2387
- );
2388
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
2389
- assert.calledWith(
2390
- webex.meetings.meetingCollection.getByKey,
2391
- 'conversationUrl',
2392
- 'conversationUrl1'
2393
- );
2394
- });
2395
-
2396
- it('check the calls when meeting found by key: meetingNumber', () => {
2397
- mockGetByKey('meetingNumber');
2398
- const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
2399
- assert.deepEqual(result, mockReturnMeeting);
2400
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
2401
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
2402
- assert.calledWith(
2403
- webex.meetings.meetingCollection.getByKey,
2404
- 'correlationId',
2405
- 'correlationId1'
2406
- );
2407
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
2408
- assert.calledWith(
2409
- webex.meetings.meetingCollection.getByKey,
2410
- 'conversationUrl',
2411
- 'conversationUrl1'
2412
- );
2413
- assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', '123456');
2414
- });
2415
- });
2416
-
2417
- describe('#sortLocusArrayToUpdate', () => {
2418
- let lociArray;
2419
- let mainLocus;
2420
- let breakoutLocus;
2421
- beforeEach(() => {
2422
- mainLocus = {
2423
- url: 'mainUrl1',
2424
- controls: {
2425
- breakout: {
2426
- sessionType: 'MAIN',
2427
- url: 'breakoutUnifiedUrl1',
2428
- },
2429
- },
2430
- };
2431
- breakoutLocus = {
2432
- url: 'breakoutUrl1',
2433
- controls: {
2434
- breakout: {
2435
- sessionType: 'BREAKOUT',
2436
- url: 'breakoutUnifiedUrl1',
2437
- },
2438
- },
2439
- };
2440
- lociArray = [mainLocus, breakoutLocus];
2441
-
2442
- sinon.stub(MeetingsUtil, 'isValidBreakoutLocus').callsFake((locus) => {
2443
- return locus.url === 'breakoutUrl1';
2444
- });
2445
- });
2446
- afterEach(() => {
2447
- sinon.restore();
2448
- });
2449
-
2450
- it('if both main and breakout locus is in array for non-exist meeting, return main locus to create first', () => {
2451
- webex.meetings.meetingCollection.getByKey = sinon.stub().returns(undefined);
2452
- const result = webex.meetings.sortLocusArrayToUpdate(lociArray);
2453
- assert.deepEqual(result, [mainLocus]);
2454
- assert.deepEqual(webex.meetings.breakoutLocusForHandleLater, [breakoutLocus]);
2455
- });
2456
-
2457
- it('if both main and breakout locus is in array for an exist meeting, return all locus', () => {
2458
- webex.meetings.meetingCollection.getByKey = sinon.stub().returns({});
2459
- const result = webex.meetings.sortLocusArrayToUpdate(lociArray);
2460
- assert.deepEqual(result, [mainLocus, breakoutLocus]);
2461
- assert.deepEqual(webex.meetings.breakoutLocusForHandleLater, []);
2462
- });
2463
-
2464
- it('if the breakout locus has no associated main locus, return all', () => {
2465
- webex.meetings.meetingCollection.getByKey = sinon.stub().returns({});
2466
- breakoutLocus.controls.breakout.url = 'testUrl';
2467
- const result = webex.meetings.sortLocusArrayToUpdate(lociArray);
2468
- assert.deepEqual(result, [mainLocus, breakoutLocus]);
2469
- });
2470
- });
2471
-
2472
- describe('#checkHandleBreakoutLocus', () => {
2473
- let breakoutLocus;
2474
- beforeEach(() => {
2475
- breakoutLocus = {
2476
- url: 'breakoutUrl1',
2477
- controls: {
2478
- breakout: {
2479
- sessionType: 'BREAKOUT',
2480
- url: 'breakoutUnifiedUrl1',
2481
- },
2482
- },
2483
- };
2484
-
2485
- webex.meetings.handleLocusEvent = sinon.stub();
2486
- });
2487
- afterEach(() => {
2488
- sinon.restore();
2489
- });
2490
- it('do nothing if new created locus is null/no cached breakouts for updating', () => {
2491
- webex.meetings.checkHandleBreakoutLocus(null);
2492
- webex.meetings.breakoutLocusForHandleLater = null;
2493
- webex.meetings.checkHandleBreakoutLocus({});
2494
- webex.meetings.breakoutLocusForHandleLater = [];
2495
- webex.meetings.checkHandleBreakoutLocus({});
2496
- assert.notCalled(webex.meetings.handleLocusEvent);
2497
- });
2498
-
2499
- it('do nothing if new created locus is breakout locus', () => {
2500
- webex.meetings.breakoutLocusForHandleLater = [breakoutLocus];
2501
- webex.meetings.checkHandleBreakoutLocus(breakoutLocus);
2502
- assert.notCalled(webex.meetings.handleLocusEvent);
2503
- });
2504
-
2505
- it('do nothing if no cached locus is associated with the new created locus', () => {
2506
- webex.meetings.breakoutLocusForHandleLater = [breakoutLocus];
2507
- webex.meetings.checkHandleBreakoutLocus({
2508
- controls: {
2509
- breakout: {
2510
- sessionType: 'MAIN',
2511
- url: 'breakoutUnifiedUrl2',
2512
- },
2513
- },
2514
- });
2515
- assert.notCalled(webex.meetings.handleLocusEvent);
2516
- });
2517
-
2518
- it('update the cached breakout locus which associate the new created locus', () => {
2519
- webex.meetings.breakoutLocusForHandleLater = [breakoutLocus];
2520
- webex.meetings.checkHandleBreakoutLocus({
2521
- controls: {
2522
- breakout: {
2523
- sessionType: 'MAIN',
2524
- url: 'breakoutUnifiedUrl1',
2525
- },
2526
- },
2527
- });
2528
- assert.calledWith(webex.meetings.handleLocusEvent, {
2529
- locus: breakoutLocus,
2530
- locusUrl: breakoutLocus.url,
2531
- });
2532
- });
2533
- });
2534
-
2535
- describe('uploading of logs', () => {
2536
- let metricsSpy;
2537
- let meeting;
2538
-
2539
- beforeEach(async () => {
2540
- webex.meetings.config.autoUploadLogs = true;
2541
- webex.meetings.loggerRequest.uploadLogs = sinon.stub().resolves();
2542
-
2543
- sinon.stub(webex.meetings.meetingInfo, 'fetchInfoOptions').resolves({});
2544
- sinon.stub(webex.meetings.meetingInfo, 'fetchMeetingInfo').resolves({});
2545
-
2546
- triggerProxyStub.restore();
2547
-
2548
- metricsSpy = sinon.stub(Metrics, 'sendBehavioralMetric');
2549
-
2550
- meeting = await webex.meetings.create('test');
2551
-
2552
- meeting.locusId = 'locus id';
2553
- meeting.correlationId = 'correlation id';
2554
- meeting.locusInfo = {
2555
- fullState: {lastActive: 'last active', sessionId: 'locus session id'},
2556
- info: {webExMeetingId: 'meeting id'},
2557
- };
2558
- });
2559
-
2560
- afterEach(() => {
2561
- sinon.restore();
2562
- });
2563
-
2564
- it('sends metrics on success', async () => {
2565
- await meeting.uploadLogs();
2566
-
2567
- await testUtils.flushPromises();
2568
-
2569
- assert.calledOnceWithExactly(metricsSpy, 'js_sdk_upload_logs_success', {
2570
- callStart: 'last active',
2571
- correlationId: 'correlation id',
2572
- feedbackId: 'correlation id',
2573
- locusId: 'locus id',
2574
- meetingId: 'meeting id',
2575
- autoupload: true,
2576
- locussessionid: 'locus session id',
2577
- });
2578
- });
2579
-
2580
- it('sends metrics on failure', async () => {
2581
- webex.meetings.loggerRequest.uploadLogs.rejects(new Error('fake error'));
2582
-
2583
- await meeting.uploadLogs();
2584
-
2585
- await testUtils.flushPromises();
2586
-
2587
- assert.calledOnceWithExactly(
2588
- metricsSpy,
2589
- 'js_sdk_upload_logs_failure',
2590
- sinon.match({
2591
- callStart: 'last active',
2592
- correlationId: 'correlation id',
2593
- feedbackId: 'correlation id',
2594
- locusId: 'locus id',
2595
- meetingId: 'meeting id',
2596
- reason: 'fake error',
2597
- autoupload: true,
2598
- locussessionid: 'locus session id',
2599
- })
2600
- );
2601
- });
2602
- });
2603
1390
  });
2604
1391
  });