@webex/plugin-meetings 3.0.0-beta.7 → 3.0.0-beta.71

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 (506) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +178 -0
  4. package/dist/breakouts/breakout.js.map +1 -0
  5. package/dist/breakouts/collection.js +23 -0
  6. package/dist/breakouts/collection.js.map +1 -0
  7. package/dist/breakouts/edit-lock-error.js +52 -0
  8. package/dist/breakouts/edit-lock-error.js.map +1 -0
  9. package/dist/breakouts/index.js +843 -0
  10. package/dist/breakouts/index.js.map +1 -0
  11. package/dist/breakouts/request.js +78 -0
  12. package/dist/breakouts/request.js.map +1 -0
  13. package/dist/breakouts/utils.js +56 -0
  14. package/dist/breakouts/utils.js.map +1 -0
  15. package/dist/common/browser-detection.js +1 -20
  16. package/dist/common/browser-detection.js.map +1 -1
  17. package/dist/common/collection.js +5 -20
  18. package/dist/common/collection.js.map +1 -1
  19. package/dist/common/config.js +0 -7
  20. package/dist/common/config.js.map +1 -1
  21. package/dist/common/errors/captcha-error.js +10 -24
  22. package/dist/common/errors/captcha-error.js.map +1 -1
  23. package/dist/common/errors/intent-to-join.js +11 -24
  24. package/dist/common/errors/intent-to-join.js.map +1 -1
  25. package/dist/common/errors/join-meeting.js +12 -25
  26. package/dist/common/errors/join-meeting.js.map +1 -1
  27. package/dist/common/errors/media.js +10 -24
  28. package/dist/common/errors/media.js.map +1 -1
  29. package/dist/common/errors/parameter.js +5 -33
  30. package/dist/common/errors/parameter.js.map +1 -1
  31. package/dist/common/errors/password-error.js +10 -24
  32. package/dist/common/errors/password-error.js.map +1 -1
  33. package/dist/common/errors/permission.js +9 -23
  34. package/dist/common/errors/permission.js.map +1 -1
  35. package/dist/common/errors/reconnection-in-progress.js +0 -17
  36. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  37. package/dist/common/errors/reconnection.js +10 -24
  38. package/dist/common/errors/reconnection.js.map +1 -1
  39. package/dist/common/errors/stats.js +10 -24
  40. package/dist/common/errors/stats.js.map +1 -1
  41. package/dist/common/errors/webex-errors.js +6 -41
  42. package/dist/common/errors/webex-errors.js.map +1 -1
  43. package/dist/common/errors/webex-meetings-error.js +5 -25
  44. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  45. package/dist/common/events/events-scope.js +0 -22
  46. package/dist/common/events/events-scope.js.map +1 -1
  47. package/dist/common/events/events.js +0 -23
  48. package/dist/common/events/events.js.map +1 -1
  49. package/dist/common/events/trigger-proxy.js +0 -12
  50. package/dist/common/events/trigger-proxy.js.map +1 -1
  51. package/dist/common/events/util.js +0 -15
  52. package/dist/common/events/util.js.map +1 -1
  53. package/dist/common/logs/logger-config.js +0 -4
  54. package/dist/common/logs/logger-config.js.map +1 -1
  55. package/dist/common/logs/logger-proxy.js +1 -8
  56. package/dist/common/logs/logger-proxy.js.map +1 -1
  57. package/dist/common/logs/request.js +37 -60
  58. package/dist/common/logs/request.js.map +1 -1
  59. package/dist/common/queue.js +4 -14
  60. package/dist/common/queue.js.map +1 -1
  61. package/dist/config.js +6 -6
  62. package/dist/config.js.map +1 -1
  63. package/dist/constants.js +143 -52
  64. package/dist/constants.js.map +1 -1
  65. package/dist/controls-options-manager/constants.js +14 -0
  66. package/dist/controls-options-manager/constants.js.map +1 -0
  67. package/dist/controls-options-manager/enums.js +16 -0
  68. package/dist/controls-options-manager/enums.js.map +1 -0
  69. package/dist/controls-options-manager/index.js +261 -0
  70. package/dist/controls-options-manager/index.js.map +1 -0
  71. package/dist/controls-options-manager/util.js +39 -0
  72. package/dist/controls-options-manager/util.js.map +1 -0
  73. package/dist/index.js +11 -18
  74. package/dist/index.js.map +1 -1
  75. package/dist/locus-info/controlsUtils.js +31 -29
  76. package/dist/locus-info/controlsUtils.js.map +1 -1
  77. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  78. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  79. package/dist/locus-info/fullState.js +0 -15
  80. package/dist/locus-info/fullState.js.map +1 -1
  81. package/dist/locus-info/hostUtils.js +4 -12
  82. package/dist/locus-info/hostUtils.js.map +1 -1
  83. package/dist/locus-info/index.js +237 -198
  84. package/dist/locus-info/index.js.map +1 -1
  85. package/dist/locus-info/infoUtils.js +3 -37
  86. package/dist/locus-info/infoUtils.js.map +1 -1
  87. package/dist/locus-info/mediaSharesUtils.js +12 -38
  88. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  89. package/dist/locus-info/parser.js +92 -118
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +80 -89
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.js +56 -146
  94. package/dist/media/index.js.map +1 -1
  95. package/dist/media/properties.js +83 -117
  96. package/dist/media/properties.js.map +1 -1
  97. package/dist/media/util.js +2 -9
  98. package/dist/media/util.js.map +1 -1
  99. package/dist/mediaQualityMetrics/config.js +505 -495
  100. package/dist/mediaQualityMetrics/config.js.map +1 -1
  101. package/dist/meeting/in-meeting-actions.js +31 -14
  102. package/dist/meeting/in-meeting-actions.js.map +1 -1
  103. package/dist/meeting/index.js +2225 -2244
  104. package/dist/meeting/index.js.map +1 -1
  105. package/dist/meeting/muteState.js +102 -100
  106. package/dist/meeting/muteState.js.map +1 -1
  107. package/dist/meeting/request.js +308 -264
  108. package/dist/meeting/request.js.map +1 -1
  109. package/dist/meeting/request.type.js +7 -0
  110. package/dist/meeting/request.type.js.map +1 -0
  111. package/dist/meeting/state.js +21 -31
  112. package/dist/meeting/state.js.map +1 -1
  113. package/dist/meeting/util.js +63 -217
  114. package/dist/meeting/util.js.map +1 -1
  115. package/dist/meeting-info/collection.js +6 -25
  116. package/dist/meeting-info/collection.js.map +1 -1
  117. package/dist/meeting-info/index.js +14 -32
  118. package/dist/meeting-info/index.js.map +1 -1
  119. package/dist/meeting-info/meeting-info-v2.js +193 -268
  120. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  121. package/dist/meeting-info/request.js +3 -15
  122. package/dist/meeting-info/request.js.map +1 -1
  123. package/dist/meeting-info/util.js +98 -183
  124. package/dist/meeting-info/util.js.map +1 -1
  125. package/dist/meeting-info/utilv2.js +137 -228
  126. package/dist/meeting-info/utilv2.js.map +1 -1
  127. package/dist/meetings/collection.js +26 -19
  128. package/dist/meetings/collection.js.map +1 -1
  129. package/dist/meetings/index.js +565 -552
  130. package/dist/meetings/index.js.map +1 -1
  131. package/dist/meetings/request.js +26 -41
  132. package/dist/meetings/request.js.map +1 -1
  133. package/dist/meetings/util.js +151 -155
  134. package/dist/meetings/util.js.map +1 -1
  135. package/dist/member/index.js +100 -85
  136. package/dist/member/index.js.map +1 -1
  137. package/dist/member/types.js +15 -0
  138. package/dist/member/types.js.map +1 -0
  139. package/dist/member/util.js +90 -68
  140. package/dist/member/util.js.map +1 -1
  141. package/dist/members/collection.js +13 -12
  142. package/dist/members/collection.js.map +1 -1
  143. package/dist/members/index.js +152 -204
  144. package/dist/members/index.js.map +1 -1
  145. package/dist/members/request.js +35 -39
  146. package/dist/members/request.js.map +1 -1
  147. package/dist/members/types.js +15 -0
  148. package/dist/members/types.js.map +1 -0
  149. package/dist/members/util.js +76 -46
  150. package/dist/members/util.js.map +1 -1
  151. package/dist/metrics/config.js +4 -14
  152. package/dist/metrics/config.js.map +1 -1
  153. package/dist/metrics/constants.js +1 -6
  154. package/dist/metrics/constants.js.map +1 -1
  155. package/dist/metrics/index.js +59 -156
  156. package/dist/metrics/index.js.map +1 -1
  157. package/dist/multistream/mediaRequestManager.js +116 -52
  158. package/dist/multistream/mediaRequestManager.js.map +1 -1
  159. package/dist/multistream/receiveSlot.js +58 -65
  160. package/dist/multistream/receiveSlot.js.map +1 -1
  161. package/dist/multistream/receiveSlotManager.js +58 -93
  162. package/dist/multistream/receiveSlotManager.js.map +1 -1
  163. package/dist/multistream/remoteMedia.js +55 -74
  164. package/dist/multistream/remoteMedia.js.map +1 -1
  165. package/dist/multistream/remoteMediaGroup.js +6 -40
  166. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  167. package/dist/multistream/remoteMediaManager.js +466 -442
  168. package/dist/multistream/remoteMediaManager.js.map +1 -1
  169. package/dist/networkQualityMonitor/index.js +40 -59
  170. package/dist/networkQualityMonitor/index.js.map +1 -1
  171. package/dist/personal-meeting-room/index.js +21 -45
  172. package/dist/personal-meeting-room/index.js.map +1 -1
  173. package/dist/personal-meeting-room/request.js +1 -31
  174. package/dist/personal-meeting-room/request.js.map +1 -1
  175. package/dist/personal-meeting-room/util.js +0 -13
  176. package/dist/personal-meeting-room/util.js.map +1 -1
  177. package/dist/reachability/index.js +192 -191
  178. package/dist/reachability/index.js.map +1 -1
  179. package/dist/reachability/request.js +15 -23
  180. package/dist/reachability/request.js.map +1 -1
  181. package/dist/reactions/constants.js +13 -0
  182. package/dist/reactions/constants.js.map +1 -0
  183. package/dist/reactions/reactions.js +109 -0
  184. package/dist/reactions/reactions.js.map +1 -0
  185. package/dist/reactions/reactions.type.js +36 -0
  186. package/dist/reactions/reactions.type.js.map +1 -0
  187. package/dist/reconnection-manager/index.js +342 -460
  188. package/dist/reconnection-manager/index.js.map +1 -1
  189. package/dist/recording-controller/enums.js +17 -0
  190. package/dist/recording-controller/enums.js.map +1 -0
  191. package/dist/recording-controller/index.js +343 -0
  192. package/dist/recording-controller/index.js.map +1 -0
  193. package/dist/recording-controller/util.js +63 -0
  194. package/dist/recording-controller/util.js.map +1 -0
  195. package/dist/roap/index.js +48 -70
  196. package/dist/roap/index.js.map +1 -1
  197. package/dist/roap/request.js +143 -131
  198. package/dist/roap/request.js.map +1 -1
  199. package/dist/roap/turnDiscovery.js +91 -98
  200. package/dist/roap/turnDiscovery.js.map +1 -1
  201. package/dist/statsAnalyzer/global.js +1 -95
  202. package/dist/statsAnalyzer/global.js.map +1 -1
  203. package/dist/statsAnalyzer/index.js +372 -455
  204. package/dist/statsAnalyzer/index.js.map +1 -1
  205. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  206. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  207. package/dist/transcription/index.js +22 -47
  208. package/dist/transcription/index.js.map +1 -1
  209. package/dist/types/breakouts/breakout.d.ts +8 -0
  210. package/dist/types/breakouts/collection.d.ts +5 -0
  211. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  212. package/dist/types/breakouts/index.d.ts +5 -0
  213. package/dist/types/breakouts/request.d.ts +22 -0
  214. package/dist/types/breakouts/utils.d.ts +8 -0
  215. package/dist/types/common/browser-detection.d.ts +9 -0
  216. package/dist/types/common/collection.d.ts +48 -0
  217. package/dist/types/common/config.d.ts +2 -0
  218. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  219. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  220. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  221. package/dist/types/common/errors/media.d.ts +15 -0
  222. package/dist/types/common/errors/parameter.d.ts +15 -0
  223. package/dist/types/common/errors/password-error.d.ts +15 -0
  224. package/dist/types/common/errors/permission.d.ts +14 -0
  225. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  226. package/dist/types/common/errors/reconnection.d.ts +15 -0
  227. package/dist/types/common/errors/stats.d.ts +15 -0
  228. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  229. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  230. package/dist/types/common/events/events-scope.d.ts +17 -0
  231. package/dist/types/common/events/events.d.ts +12 -0
  232. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  233. package/dist/types/common/events/util.d.ts +2 -0
  234. package/dist/types/common/logs/logger-config.d.ts +2 -0
  235. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  236. package/dist/types/common/logs/request.d.ts +34 -0
  237. package/dist/types/common/queue.d.ts +32 -0
  238. package/dist/types/config.d.ts +77 -0
  239. package/dist/types/constants.d.ts +944 -0
  240. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  241. package/dist/types/controls-options-manager/enums.d.ts +6 -0
  242. package/dist/types/controls-options-manager/index.d.ts +128 -0
  243. package/dist/types/controls-options-manager/util.d.ts +9 -0
  244. package/dist/types/index.d.ts +6 -0
  245. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  246. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  247. package/dist/types/locus-info/fullState.d.ts +2 -0
  248. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  249. package/dist/types/locus-info/index.d.ts +276 -0
  250. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  251. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  252. package/dist/types/locus-info/parser.d.ts +212 -0
  253. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  254. package/dist/types/media/index.d.ts +32 -0
  255. package/dist/types/media/properties.d.ts +108 -0
  256. package/dist/types/media/util.d.ts +2 -0
  257. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  258. package/dist/types/meeting/in-meeting-actions.d.ts +101 -0
  259. package/dist/types/meeting/index.d.ts +1720 -0
  260. package/dist/types/meeting/muteState.d.ts +132 -0
  261. package/dist/types/meeting/request.d.ts +271 -0
  262. package/dist/types/meeting/request.type.d.ts +11 -0
  263. package/dist/types/meeting/state.d.ts +9 -0
  264. package/dist/types/meeting/util.d.ts +2 -0
  265. package/dist/types/meeting-info/collection.d.ts +20 -0
  266. package/dist/types/meeting-info/index.d.ts +57 -0
  267. package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
  268. package/dist/types/meeting-info/request.d.ts +22 -0
  269. package/dist/types/meeting-info/util.d.ts +2 -0
  270. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  271. package/dist/types/meetings/collection.d.ts +31 -0
  272. package/dist/types/meetings/index.d.ts +315 -0
  273. package/dist/types/meetings/request.d.ts +27 -0
  274. package/dist/types/meetings/util.d.ts +18 -0
  275. package/dist/types/member/index.d.ts +156 -0
  276. package/dist/types/member/types.d.ts +21 -0
  277. package/dist/types/member/util.d.ts +2 -0
  278. package/dist/types/members/collection.d.ts +29 -0
  279. package/dist/types/members/index.d.ts +343 -0
  280. package/dist/types/members/request.d.ts +58 -0
  281. package/dist/types/members/types.d.ts +24 -0
  282. package/dist/types/members/util.d.ts +2 -0
  283. package/dist/types/metrics/config.d.ts +171 -0
  284. package/dist/types/metrics/constants.d.ts +53 -0
  285. package/dist/types/metrics/index.d.ts +152 -0
  286. package/dist/types/multistream/mediaRequestManager.d.ts +68 -0
  287. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  288. package/dist/types/multistream/receiveSlotManager.d.ts +49 -0
  289. package/dist/types/multistream/remoteMedia.d.ts +100 -0
  290. package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
  291. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  292. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  293. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  294. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  295. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  296. package/dist/types/reachability/index.d.ts +152 -0
  297. package/dist/types/reachability/request.d.ts +37 -0
  298. package/dist/types/reactions/constants.d.ts +3 -0
  299. package/dist/types/reactions/reactions.d.ts +4 -0
  300. package/dist/types/reactions/reactions.type.d.ts +52 -0
  301. package/dist/types/reconnection-manager/index.d.ts +126 -0
  302. package/dist/types/recording-controller/enums.d.ts +7 -0
  303. package/dist/types/recording-controller/index.d.ts +193 -0
  304. package/dist/types/recording-controller/util.d.ts +13 -0
  305. package/dist/types/roap/index.d.ts +77 -0
  306. package/dist/types/roap/request.d.ts +38 -0
  307. package/dist/types/roap/turnDiscovery.d.ts +74 -0
  308. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  309. package/dist/types/statsAnalyzer/index.d.ts +195 -0
  310. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  311. package/dist/types/transcription/index.d.ts +64 -0
  312. package/internal-README.md +7 -6
  313. package/package.json +27 -21
  314. package/src/breakouts/README.md +219 -0
  315. package/src/breakouts/breakout.ts +153 -0
  316. package/src/breakouts/collection.ts +19 -0
  317. package/src/breakouts/edit-lock-error.ts +25 -0
  318. package/src/breakouts/index.ts +745 -0
  319. package/src/breakouts/request.ts +55 -0
  320. package/src/breakouts/utils.ts +44 -0
  321. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  322. package/src/common/collection.ts +9 -7
  323. package/src/common/{config.js → config.ts} +1 -1
  324. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  325. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  326. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  327. package/src/common/errors/{media.js → media.ts} +11 -7
  328. package/src/common/errors/parameter.ts +11 -7
  329. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  330. package/src/common/errors/{permission.js → permission.ts} +10 -6
  331. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  332. package/src/common/errors/{stats.js → stats.ts} +11 -7
  333. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  334. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  335. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  336. package/src/common/events/{events.js → events.ts} +5 -1
  337. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  338. package/src/common/events/{util.js → util.ts} +2 -3
  339. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  340. package/src/common/logs/logger-proxy.ts +44 -0
  341. package/src/common/logs/{request.js → request.ts} +22 -9
  342. package/src/common/queue.ts +1 -2
  343. package/src/{config.js → config.ts} +17 -12
  344. package/src/constants.ts +92 -5
  345. package/src/controls-options-manager/constants.ts +5 -0
  346. package/src/controls-options-manager/enums.ts +7 -0
  347. package/src/controls-options-manager/index.ts +240 -0
  348. package/src/controls-options-manager/util.ts +30 -0
  349. package/src/index.js +4 -1
  350. package/src/locus-info/controlsUtils.ts +141 -0
  351. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  352. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  353. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  354. package/src/locus-info/{index.js → index.ts} +211 -71
  355. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  356. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  357. package/src/locus-info/{parser.js → parser.ts} +67 -79
  358. package/src/locus-info/{selfUtils.js → selfUtils.ts} +183 -67
  359. package/src/media/{index.js → index.ts} +179 -176
  360. package/src/media/{properties.js → properties.ts} +60 -37
  361. package/src/media/{util.js → util.ts} +2 -2
  362. package/src/mediaQualityMetrics/config.ts +384 -0
  363. package/src/meeting/in-meeting-actions.ts +67 -3
  364. package/src/meeting/{index.js → index.ts} +2605 -1605
  365. package/src/meeting/{muteState.js → muteState.ts} +138 -73
  366. package/src/meeting/{request.js → request.ts} +326 -142
  367. package/src/meeting/request.type.ts +13 -0
  368. package/src/meeting/{state.js → state.ts} +50 -35
  369. package/src/meeting/{util.js → util.ts} +131 -115
  370. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  371. package/src/meeting-info/{index.js → index.ts} +42 -36
  372. package/src/meeting-info/meeting-info-v2.ts +273 -0
  373. package/src/meeting-info/{request.js → request.ts} +14 -4
  374. package/src/meeting-info/{util.js → util.ts} +60 -51
  375. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  376. package/src/meetings/{collection.js → collection.ts} +26 -3
  377. package/src/meetings/index.ts +1275 -0
  378. package/src/meetings/{request.js → request.ts} +34 -25
  379. package/src/meetings/{util.js → util.ts} +99 -33
  380. package/src/member/{index.js → index.ts} +124 -56
  381. package/src/member/types.ts +24 -0
  382. package/src/member/{util.js → util.ts} +105 -25
  383. package/src/members/{collection.js → collection.ts} +10 -2
  384. package/src/members/{index.js → index.ts} +281 -144
  385. package/src/members/{request.js → request.ts} +80 -16
  386. package/src/members/types.ts +28 -0
  387. package/src/members/{util.js → util.ts} +108 -55
  388. package/src/metrics/{config.js → config.ts} +255 -92
  389. package/src/metrics/{constants.js → constants.ts} +0 -6
  390. package/src/metrics/{index.js → index.ts} +110 -94
  391. package/src/multistream/mediaRequestManager.ts +144 -40
  392. package/src/multistream/receiveSlot.ts +69 -26
  393. package/src/multistream/receiveSlotManager.ts +50 -38
  394. package/src/multistream/remoteMedia.ts +30 -4
  395. package/src/multistream/remoteMediaGroup.ts +4 -3
  396. package/src/multistream/remoteMediaManager.ts +230 -66
  397. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  398. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  399. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  400. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  401. package/src/reachability/{index.js → index.ts} +157 -94
  402. package/src/reachability/request.ts +46 -35
  403. package/src/reactions/constants.ts +4 -0
  404. package/src/reactions/reactions.ts +104 -0
  405. package/src/reactions/reactions.type.ts +62 -0
  406. package/src/reconnection-manager/{index.js → index.ts} +228 -120
  407. package/src/recording-controller/enums.ts +8 -0
  408. package/src/recording-controller/index.ts +315 -0
  409. package/src/recording-controller/util.ts +58 -0
  410. package/src/roap/{index.js → index.ts} +77 -60
  411. package/src/roap/request.ts +172 -0
  412. package/src/roap/turnDiscovery.ts +81 -41
  413. package/src/statsAnalyzer/global.ts +37 -0
  414. package/src/statsAnalyzer/index.ts +1242 -0
  415. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  416. package/src/transcription/{index.js → index.ts} +46 -39
  417. package/test/integration/spec/converged-space-meetings.js +176 -0
  418. package/test/integration/spec/journey.js +665 -464
  419. package/test/integration/spec/space-meeting.js +320 -206
  420. package/test/integration/spec/transcription.js +7 -8
  421. package/test/unit/spec/breakouts/breakout.ts +178 -0
  422. package/test/unit/spec/breakouts/collection.ts +15 -0
  423. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  424. package/test/unit/spec/breakouts/index.ts +1252 -0
  425. package/test/unit/spec/breakouts/request.ts +104 -0
  426. package/test/unit/spec/breakouts/utils.js +54 -0
  427. package/test/unit/spec/common/browser-detection.js +9 -28
  428. package/test/unit/spec/controls-options-manager/index.js +204 -0
  429. package/test/unit/spec/controls-options-manager/util.js +86 -0
  430. package/test/unit/spec/fixture/locus.js +92 -90
  431. package/test/unit/spec/locus-info/controlsUtils.js +133 -34
  432. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  433. package/test/unit/spec/locus-info/index.js +303 -2
  434. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  435. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  436. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  437. package/test/unit/spec/locus-info/parser.js +3 -9
  438. package/test/unit/spec/locus-info/selfConstant.js +101 -103
  439. package/test/unit/spec/locus-info/selfUtils.js +165 -12
  440. package/test/unit/spec/media/index.ts +72 -8
  441. package/test/unit/spec/media/properties.ts +9 -9
  442. package/test/unit/spec/meeting/in-meeting-actions.ts +29 -2
  443. package/test/unit/spec/meeting/index.js +2503 -802
  444. package/test/unit/spec/meeting/muteState.js +146 -61
  445. package/test/unit/spec/meeting/request.js +141 -43
  446. package/test/unit/spec/meeting/utils.js +135 -164
  447. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  448. package/test/unit/spec/meeting-info/request.js +7 -9
  449. package/test/unit/spec/meeting-info/util.js +11 -12
  450. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  451. package/test/unit/spec/meetings/collection.js +15 -1
  452. package/test/unit/spec/meetings/index.js +622 -263
  453. package/test/unit/spec/meetings/utils.js +65 -14
  454. package/test/unit/spec/member/index.js +24 -1
  455. package/test/unit/spec/member/util.js +359 -32
  456. package/test/unit/spec/members/index.js +294 -54
  457. package/test/unit/spec/members/request.js +50 -20
  458. package/test/unit/spec/members/utils.js +147 -4
  459. package/test/unit/spec/metrics/index.js +16 -21
  460. package/test/unit/spec/multistream/mediaRequestManager.ts +369 -68
  461. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  462. package/test/unit/spec/multistream/receiveSlotManager.ts +60 -38
  463. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  464. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  465. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  466. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  467. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  468. package/test/unit/spec/reachability/index.ts +176 -27
  469. package/test/unit/spec/reachability/request.js +66 -0
  470. package/test/unit/spec/reconnection-manager/index.js +58 -30
  471. package/test/unit/spec/recording-controller/index.js +231 -0
  472. package/test/unit/spec/recording-controller/util.js +102 -0
  473. package/test/unit/spec/roap/index.ts +12 -8
  474. package/test/unit/spec/roap/request.ts +217 -0
  475. package/test/unit/spec/roap/turnDiscovery.ts +72 -49
  476. package/test/unit/spec/stats-analyzer/index.js +108 -57
  477. package/test/utils/cmr.js +44 -42
  478. package/test/utils/constants.js +9 -0
  479. package/test/utils/testUtils.js +98 -77
  480. package/test/utils/webex-config.js +22 -18
  481. package/test/utils/webex-test-users.js +57 -50
  482. package/tsconfig.json +6 -0
  483. package/dist/media/internal-media-core-wrapper.js +0 -22
  484. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  485. package/dist/meeting/effectsState.js +0 -327
  486. package/dist/meeting/effectsState.js.map +0 -1
  487. package/dist/multistream/multistreamMedia.js +0 -116
  488. package/dist/multistream/multistreamMedia.js.map +0 -1
  489. package/dist/peer-connection-manager/util.js +0 -124
  490. package/dist/peer-connection-manager/util.js.map +0 -1
  491. package/src/common/logs/logger-proxy.js +0 -33
  492. package/src/locus-info/controlsUtils.js +0 -102
  493. package/src/media/internal-media-core-wrapper.ts +0 -9
  494. package/src/mediaQualityMetrics/config.js +0 -382
  495. package/src/meeting/effectsState.js +0 -205
  496. package/src/meeting-info/meeting-info-v2.js +0 -255
  497. package/src/meetings/index.js +0 -1015
  498. package/src/multistream/multistreamMedia.ts +0 -92
  499. package/src/peer-connection-manager/util.ts +0 -117
  500. package/src/roap/request.js +0 -127
  501. package/src/statsAnalyzer/global.js +0 -133
  502. package/src/statsAnalyzer/index.js +0 -1006
  503. package/src/statsAnalyzer/mqaUtil.js +0 -173
  504. package/test/unit/spec/meeting/effectsState.js +0 -291
  505. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  506. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -11,6 +11,7 @@ import sinon from 'sinon';
11
11
  import uuid from 'uuid';
12
12
  import StaticConfig from '@webex/plugin-meetings/src/common/config';
13
13
  import TriggerProxy from '@webex/plugin-meetings/src/common/events/trigger-proxy';
14
+ import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
14
15
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
15
16
  import Meeting from '@webex/plugin-meetings/src/meeting';
16
17
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
@@ -27,7 +28,7 @@ import {
27
28
  ONLINE,
28
29
  ROAP,
29
30
  LOCUSINFO,
30
- EVENT_TRIGGERS
31
+ EVENT_TRIGGERS,
31
32
  } from '../../../../src/constants';
32
33
 
33
34
  describe('plugin-meetings', () => {
@@ -37,17 +38,19 @@ describe('plugin-meetings', () => {
37
38
  error: () => {},
38
39
  warn: () => {},
39
40
  trace: () => {},
40
- debug: () => {}
41
+ debug: () => {},
41
42
  };
42
43
 
43
44
  beforeEach(() => {
44
45
  StaticConfig.set({
45
46
  bandwidth: {
46
- audio: 50, video: 500
47
- }
47
+ audio: 50,
48
+ video: 500,
49
+ },
48
50
  });
49
51
  LoggerConfig.set({
50
- verboseEvents: true, enable: false
52
+ verboseEvents: true,
53
+ enable: false,
51
54
  });
52
55
  TriggerProxy.trigger = sinon.stub().returns(true);
53
56
  });
@@ -71,13 +74,12 @@ describe('plugin-meetings', () => {
71
74
  children: {
72
75
  device: Device,
73
76
  mercury: Mercury,
74
- meetings: Meetings
75
- }
77
+ meetings: Meetings,
78
+ },
76
79
  });
77
80
 
78
-
79
81
  Object.assign(webex, {
80
- logging: logger
82
+ logging: logger,
81
83
  });
82
84
 
83
85
  Object.assign(webex.meetings.config, {
@@ -86,64 +88,66 @@ describe('plugin-meetings', () => {
86
88
  // the server supports, minimums have to be tested
87
89
  audio: 64000,
88
90
  video: 4000000,
89
- startBitrate: 2000
91
+ startBitrate: 2000,
90
92
  },
91
93
  experimental: {
92
- enableUnifiedMeetings: true
94
+ enableUnifiedMeetings: true,
93
95
  },
94
96
  logging: {
95
97
  enable: true,
96
- verboseEvents: true
97
- }
98
+ verboseEvents: true,
99
+ },
98
100
  });
99
101
 
100
102
  Object.assign(webex, {
101
- logger
103
+ logger,
102
104
  });
103
105
 
104
106
  Object.assign(webex.meetings, {
105
- startReachability: sinon.stub().returns(Promise.resolve())
107
+ startReachability: sinon.stub().returns(Promise.resolve()),
106
108
  });
107
109
 
108
110
  Object.assign(webex.internal, {
111
+ llm: {on: sinon.stub()},
109
112
  device: {
110
113
  deviceType: 'FAKE_DEVICE',
111
114
  register: sinon.stub().returns(Promise.resolve()),
112
- unregister: sinon.stub().returns(Promise.resolve())
115
+ unregister: sinon.stub().returns(Promise.resolve()),
113
116
  },
114
117
  mercury: {
115
118
  connect: sinon.stub().returns(Promise.resolve()),
116
119
  disconnect: sinon.stub().returns(Promise.resolve()),
117
120
  on: () => {},
118
- off: () => {}
121
+ off: () => {},
119
122
  },
120
123
  services: {
121
- getMeetingPreferences: sinon.stub().returns(Promise.resolve({
122
- sites: [
123
- {
124
- siteUrl: 'site1-example.webex.com',
125
- default: false
126
- },
127
- {
128
- siteUrl: 'site2-example.webex.com',
129
- default: false
130
- },
131
- {
132
- siteUrl: 'site3-example.webex.com',
133
- default: false
134
- },
135
- {
136
- siteUrl: 'go.webex.com',
137
- default: true
138
- }
139
- ]
140
- })),
141
- fetchClientRegionInfo: sinon.stub().returns(Promise.resolve())
124
+ getMeetingPreferences: sinon.stub().returns(
125
+ Promise.resolve({
126
+ sites: [
127
+ {
128
+ siteUrl: 'site1-example.webex.com',
129
+ default: false,
130
+ },
131
+ {
132
+ siteUrl: 'site2-example.webex.com',
133
+ default: false,
134
+ },
135
+ {
136
+ siteUrl: 'site3-example.webex.com',
137
+ default: false,
138
+ },
139
+ {
140
+ siteUrl: 'go.webex.com',
141
+ default: true,
142
+ },
143
+ ],
144
+ })
145
+ ),
146
+ fetchClientRegionInfo: sinon.stub().returns(Promise.resolve()),
142
147
  },
143
148
  metrics: {
144
- submitClientMetrics: sinon.stub().returns(Promise.resolve())
145
- }
146
-
149
+ submitClientMetrics: sinon.stub().returns(Promise.resolve()),
150
+ },
147
151
  });
148
152
  webex.emit('ready');
149
153
  });
@@ -177,10 +181,14 @@ describe('plugin-meetings', () => {
177
181
 
178
182
  describe('failure', () => {
179
183
  it('should not accept non boolean input', () => {
180
- const currentEnableUnifiedMeetings = webex.meetings.config.experimental.enableUnifiedMeetings;
184
+ const currentEnableUnifiedMeetings =
185
+ webex.meetings.config.experimental.enableUnifiedMeetings;
181
186
 
182
187
  webex.meetings._toggleUnifiedMeetings('test');
183
- assert.equal(webex.meetings.config.experimental.enableUnifiedMeetings, currentEnableUnifiedMeetings);
188
+ assert.equal(
189
+ webex.meetings.config.experimental.enableUnifiedMeetings,
190
+ currentEnableUnifiedMeetings
191
+ );
184
192
  });
185
193
  });
186
194
  });
@@ -202,7 +210,10 @@ describe('plugin-meetings', () => {
202
210
  const currentEnableAdhocMeetings = webex.meetings.config.experimental.enableAdhocMeetings;
203
211
 
204
212
  webex.meetings._toggleAdhocMeetings('test');
205
- assert.equal(webex.meetings.config.experimental.enableAdhocMeetings, currentEnableAdhocMeetings);
213
+ assert.equal(
214
+ webex.meetings.config.experimental.enableAdhocMeetings,
215
+ currentEnableAdhocMeetings
216
+ );
206
217
  });
207
218
  });
208
219
  });
@@ -227,18 +238,25 @@ describe('plugin-meetings', () => {
227
238
  const currentEnableTurnDiscovery = webex.meetings.config.experimental.enableTurnDiscovery;
228
239
 
229
240
  webex.meetings._toggleTurnDiscovery('test');
230
- assert.equal(webex.meetings.config.experimental.enableAdhocMeetings, currentEnableTurnDiscovery);
241
+ assert.equal(
242
+ webex.meetings.config.experimental.enableAdhocMeetings,
243
+ currentEnableTurnDiscovery
244
+ );
231
245
  });
232
246
  });
233
247
  });
234
248
 
235
-
236
249
  describe('Public API Contracts', () => {
237
250
  describe('#register', () => {
238
251
  it('emits an event and resolves when register succeeds', async () => {
239
252
  webex.canAuthorize = true;
240
253
  await webex.meetings.register();
241
- assert.calledWith(TriggerProxy.trigger, sinon.match.instanceOf(Meetings), {file: 'meetings', function: 'register'}, 'meetings:registered');
254
+ assert.calledWith(
255
+ TriggerProxy.trigger,
256
+ sinon.match.instanceOf(Meetings),
257
+ {file: 'meetings', function: 'register'},
258
+ 'meetings:registered'
259
+ );
242
260
  assert.isTrue(webex.meetings.registered);
243
261
  });
244
262
 
@@ -284,9 +302,15 @@ describe('plugin-meetings', () => {
284
302
  it('emits an event and resolves when unregister succeeds', (done) => {
285
303
  webex.meetings.registered = true;
286
304
  webex.meetings.unregister().then(() => {
287
- assert.calledWith(TriggerProxy.trigger, sinon.match.instanceOf(Meetings), {
288
- file: 'meetings', function: 'unregister'
289
- }, 'meetings:unregistered');
305
+ assert.calledWith(
306
+ TriggerProxy.trigger,
307
+ sinon.match.instanceOf(Meetings),
308
+ {
309
+ file: 'meetings',
310
+ function: 'unregister',
311
+ },
312
+ 'meetings:unregistered'
313
+ );
290
314
  assert.isFalse(webex.meetings.registered);
291
315
  done();
292
316
  });
@@ -324,7 +348,10 @@ describe('plugin-meetings', () => {
324
348
  it('does not get a reachability instance', () => {
325
349
  const reachability = webex.meetings.getReachability();
326
350
 
327
- assert.notExists(reachability, 'reachability is undefined because #setReachability has not been called');
351
+ assert.notExists(
352
+ reachability,
353
+ 'reachability is undefined because #setReachability has not been called'
354
+ );
328
355
  });
329
356
  });
330
357
  describe('after #setReachability', () => {
@@ -337,7 +364,10 @@ describe('plugin-meetings', () => {
337
364
  it('gets the reachability data instance from webex.meetings', () => {
338
365
  const reachability = webex.meetings.getReachability();
339
366
 
340
- assert.exists(reachability, 'reachability is defined because #setReachability has been called');
367
+ assert.exists(
368
+ reachability,
369
+ 'reachability is defined because #setReachability has been called'
370
+ );
341
371
  assert.instanceOf(reachability, Reachability, 'should be a reachability instance');
342
372
  });
343
373
  });
@@ -349,8 +379,15 @@ describe('plugin-meetings', () => {
349
379
  it('gets the personal meeting room instance from webex.meetings', () => {
350
380
  const personalMeetingRoom = webex.meetings.getPersonalMeetingRoom();
351
381
 
352
- assert.exists(personalMeetingRoom, 'personal meeting room instance is set up at object creation');
353
- assert.instanceOf(personalMeetingRoom, PersonalMeetingRoom, 'should be a personal meeting room instance');
382
+ assert.exists(
383
+ personalMeetingRoom,
384
+ 'personal meeting room instance is set up at object creation'
385
+ );
386
+ assert.instanceOf(
387
+ personalMeetingRoom,
388
+ PersonalMeetingRoom,
389
+ 'should be a personal meeting room instance'
390
+ );
354
391
  });
355
392
  });
356
393
  describe('Static shortcut proxy methods', () => {
@@ -379,11 +416,11 @@ describe('plugin-meetings', () => {
379
416
  describe('#getAllMeetings', () => {
380
417
  it('calls MeetingCollection to get all meetings with supplied options', () => {
381
418
  webex.meetings.getAllMeetings({
382
- test: test1
419
+ test: test1,
383
420
  });
384
421
  assert.calledOnce(webex.meetings.meetingCollection.getAll);
385
422
  assert.calledWith(webex.meetings.meetingCollection.getAll, {
386
- test: test1
423
+ test: test1,
387
424
  });
388
425
  });
389
426
  });
@@ -396,11 +433,15 @@ describe('plugin-meetings', () => {
396
433
  });
397
434
  describe('succesful requests', () => {
398
435
  beforeEach(() => {
399
- webex.meetings.request.getActiveMeetings = sinon.stub().returns(Promise.resolve({
400
- loci: [{
401
- url: url1
402
- }]
403
- }));
436
+ webex.meetings.request.getActiveMeetings = sinon.stub().returns(
437
+ Promise.resolve({
438
+ loci: [
439
+ {
440
+ url: url1,
441
+ },
442
+ ],
443
+ })
444
+ );
404
445
  });
405
446
  describe('when meeting is returned', () => {
406
447
  let parse;
@@ -409,8 +450,8 @@ describe('plugin-meetings', () => {
409
450
  parse = sinon.stub().returns(true);
410
451
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
411
452
  locusInfo: {
412
- parse
413
- }
453
+ parse,
454
+ },
414
455
  });
415
456
  });
416
457
  it('tests the sync meeting calls for existing meeting', async () => {
@@ -427,25 +468,31 @@ describe('plugin-meetings', () => {
427
468
  beforeEach(() => {
428
469
  initialSetup = sinon.stub().returns(true);
429
470
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns(null);
430
- webex.meetings.create = sinon.stub().returns(Promise.resolve({
431
- locusInfo: {
432
- initialSetup
433
- }
434
- }));
471
+ webex.meetings.create = sinon.stub().returns(
472
+ Promise.resolve({
473
+ locusInfo: {
474
+ initialSetup,
475
+ },
476
+ })
477
+ );
435
478
  });
436
479
  it('tests the sync meeting calls for not existing meeting', async () => {
437
480
  await webex.meetings.syncMeetings();
438
481
  assert.calledOnce(webex.meetings.request.getActiveMeetings);
439
- assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
482
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
440
483
  assert.calledOnce(initialSetup);
441
484
  assert.calledOnce(webex.meetings.create);
442
485
  assert.calledWith(webex.meetings.request.getActiveMeetings);
443
486
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
444
- assert.calledWith(webex.meetings.create, {
445
- url: url1
446
- }, 'LOCUS_ID');
487
+ assert.calledWith(
488
+ webex.meetings.create,
489
+ {
490
+ url: url1,
491
+ },
492
+ 'LOCUS_ID'
493
+ );
447
494
  assert.calledWith(initialSetup, {
448
- url: url1
495
+ url: url1,
449
496
  });
450
497
  });
451
498
  });
@@ -460,24 +507,29 @@ describe('plugin-meetings', () => {
460
507
  initialSetup = sinon.stub().returns(true);
461
508
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
462
509
  locusInfo: {
463
- parse
510
+ parse,
464
511
  },
465
- sendCallAnalyzerMetrics: sinon.stub()
512
+ sendCallAnalyzerMetrics: sinon.stub(),
466
513
  });
467
514
  webex.meetings.meetingCollection.getAll = sinon.stub().returns({
468
515
  meetingutk: {
469
- locusUrl: 'fdfdjfdhj', sendCallAnalyzerMetrics: sinon.stub()
470
- }
471
- });
472
- webex.meetings.create = sinon.stub().returns(Promise.resolve({
473
- locusInfo: {
474
- initialSetup
516
+ locusUrl: 'fdfdjfdhj',
517
+ sendCallAnalyzerMetrics: sinon.stub(),
475
518
  },
476
- sendCallAnalyzerMetrics: sinon.stub()
477
- }));
478
- webex.meetings.request.getActiveMeetings = sinon.stub().returns(Promise.resolve({
479
- loci: []
480
- }));
519
+ });
520
+ webex.meetings.create = sinon.stub().returns(
521
+ Promise.resolve({
522
+ locusInfo: {
523
+ initialSetup,
524
+ },
525
+ sendCallAnalyzerMetrics: sinon.stub(),
526
+ })
527
+ );
528
+ webex.meetings.request.getActiveMeetings = sinon.stub().returns(
529
+ Promise.resolve({
530
+ loci: [],
531
+ })
532
+ );
481
533
  MeetingUtil.cleanUp = sinon.stub().returns(Promise.resolve());
482
534
  });
483
535
  it('destroy non active meetings', async () => {
@@ -499,34 +551,29 @@ describe('plugin-meetings', () => {
499
551
  beforeEach(() => {
500
552
  infoOptions = {
501
553
  destination: 'dest-example',
502
- type: 'CONVERSATION_URL'
554
+ type: 'CONVERSATION_URL',
503
555
  };
504
556
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns();
505
- webex.meetings.createMeeting = sinon.stub().returns(Promise.resolve({
506
- on: () => true
507
- }));
557
+ webex.meetings.createMeeting = sinon.stub().returns(
558
+ Promise.resolve({
559
+ on: () => true,
560
+ })
561
+ );
508
562
  });
509
563
 
510
- it('should call MeetingInfo#fetchInfoOptions() with proper params',
511
- () => {
512
- webex.meetings.meetingInfo.fetchInfoOptions = sinon.stub().resolves(
513
- infoOptions
514
- );
564
+ it('should call MeetingInfo#fetchInfoOptions() with proper params', () => {
565
+ webex.meetings.meetingInfo.fetchInfoOptions = sinon.stub().resolves(infoOptions);
515
566
 
516
- return webex.meetings.create(
567
+ return webex.meetings.create(infoOptions.destination, infoOptions.type).then(() => {
568
+ assert.calledWith(
569
+ webex.meetings.meetingInfo.fetchInfoOptions,
517
570
  infoOptions.destination,
518
571
  infoOptions.type
519
- )
520
- .then(() => {
521
- assert.calledWith(
522
- webex.meetings.meetingInfo.fetchInfoOptions,
523
- infoOptions.destination,
524
- infoOptions.type
525
- );
526
-
527
- assert.calledTwice(webex.meetings.meetingCollection.getByKey);
528
- });
572
+ );
573
+
574
+ assert.calledTwice(webex.meetings.meetingCollection.getByKey);
529
575
  });
576
+ });
530
577
 
531
578
  it('calls createMeeting and returns its promise', async () => {
532
579
  const FAKE_USE_RANDOM_DELAY = true;
@@ -565,9 +612,9 @@ describe('plugin-meetings', () => {
565
612
  return undefined;
566
613
  });
567
614
 
568
- webex.meetings.meetingInfo.fetchInfoOptions = sinon.stub().resolves(
569
- scheduledMeetingFixture
570
- );
615
+ webex.meetings.meetingInfo.fetchInfoOptions = sinon
616
+ .stub()
617
+ .resolves(scheduledMeetingFixture);
571
618
 
572
619
  webex.meetings.meetingCollection.set(scheduledMeetingFixture);
573
620
 
@@ -602,28 +649,31 @@ describe('plugin-meetings', () => {
602
649
  it('doesnt call handle locus mercury for a locus roap event', () => {
603
650
  webex.meetings.handleLocusMercury({
604
651
  data: {
605
- eventType: 'locus.message.roap'
606
- }
652
+ eventType: 'locus.message.roap',
653
+ },
607
654
  });
608
655
  assert.notCalled(webex.meetings.handleLocusEvent);
609
656
  });
610
657
  it('doesnt call handle locus mercury for an undefined eventType', () => {
611
658
  webex.meetings.handleLocusMercury({
612
- data: {
613
- }
659
+ data: {},
614
660
  });
615
661
  assert.notCalled(webex.meetings.handleLocusEvent);
616
662
  });
617
663
  it('calls handle locus mercury for all locus events', () => {
618
664
  webex.meetings.handleLocusMercury({
619
665
  data: {
620
- eventType: test1
621
- }
666
+ eventType: test1,
667
+ },
622
668
  });
623
669
  assert.calledOnce(webex.meetings.handleLocusEvent);
624
- assert.calledWith(webex.meetings.handleLocusEvent, {
625
- eventType: test1
626
- }, true);
670
+ assert.calledWith(
671
+ webex.meetings.handleLocusEvent,
672
+ {
673
+ eventType: test1,
674
+ },
675
+ true
676
+ );
627
677
  });
628
678
  });
629
679
  describe('#handleLocusEvent', () => {
@@ -634,67 +684,85 @@ describe('plugin-meetings', () => {
634
684
  parse = sinon.stub().returns(true);
635
685
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
636
686
  locusInfo: {
637
- parse
638
- }
687
+ parse,
688
+ },
639
689
  });
640
690
  });
641
691
  it('should parse the meeting info', () => {
642
692
  webex.meetings.handleLocusEvent({
643
- locusUrl: url1
693
+ locusUrl: url1,
644
694
  });
645
695
  assert.calledOnce(webex.meetings.meetingCollection.getByKey);
646
696
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
647
697
  assert.calledOnce(parse);
648
- assert.calledWith(parse, {
649
- locusInfo: {
650
- parse
698
+ assert.calledWith(
699
+ parse,
700
+ {
701
+ locusInfo: {
702
+ parse,
703
+ },
704
+ },
705
+ {
706
+ locusUrl: url1,
651
707
  }
652
- }, {
653
- locusUrl: url1
654
- });
708
+ );
655
709
  });
656
710
  });
657
711
  describe('there was not a meeting', () => {
658
712
  let initialSetup;
713
+ const webExMeetingId = '123456';
659
714
 
660
715
  beforeEach(() => {
661
716
  initialSetup = sinon.stub().returns(true);
662
717
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns(undefined);
663
- webex.meetings.create = sinon.stub().returns(Promise.resolve({
664
- locusInfo: {
665
- initialSetup
666
- }
667
- }));
718
+ webex.meetings.create = sinon.stub().returns(
719
+ Promise.resolve({
720
+ locusInfo: {
721
+ initialSetup,
722
+ },
723
+ })
724
+ );
668
725
  });
669
726
  it('should setup the meeting by difference event', async () => {
670
727
  await webex.meetings.handleLocusEvent({
671
728
  locus: {
672
729
  id: uuid1,
673
- replaces: [{
674
- locusUrl: 'http:locusUrl'
675
- }],
730
+ replaces: [
731
+ {
732
+ locusUrl: 'http:locusUrl',
733
+ },
734
+ ],
676
735
  self: {
677
736
  callBackInfo: {
678
- callbackAddress: uri1
679
- }
680
- }
737
+ callbackAddress: uri1,
738
+ },
739
+ },
740
+ info: {
741
+ webExMeetingId
742
+ },
681
743
  },
682
744
  eventType: 'locus.difference',
683
- locusUrl: url1
745
+ locusUrl: url1,
684
746
  });
685
- assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
747
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 6);
686
748
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
749
+ assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', webExMeetingId);
687
750
  assert.calledOnce(initialSetup);
688
751
  assert.calledWith(initialSetup, {
689
752
  id: uuid1,
690
- replaces: [{
691
- locusUrl: 'http:locusUrl'
692
- }],
753
+ replaces: [
754
+ {
755
+ locusUrl: 'http:locusUrl',
756
+ },
757
+ ],
693
758
  self: {
694
759
  callBackInfo: {
695
- callbackAddress: uri1
696
- }
697
- }
760
+ callbackAddress: uri1,
761
+ },
762
+ },
763
+ info: {
764
+ webExMeetingId
765
+ },
698
766
  });
699
767
  });
700
768
  it('should setup the meeting by difference event without replaces', async () => {
@@ -703,23 +771,30 @@ describe('plugin-meetings', () => {
703
771
  id: uuid1,
704
772
  self: {
705
773
  callBackInfo: {
706
- callbackAddress: uri1
707
- }
708
- }
774
+ callbackAddress: uri1,
775
+ },
776
+ },
777
+ info: {
778
+ webExMeetingId
779
+ },
709
780
  },
710
781
  eventType: 'locus.difference',
711
- locusUrl: url1
782
+ locusUrl: url1,
712
783
  });
713
- assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
784
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
714
785
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
786
+ assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', webExMeetingId);
715
787
  assert.calledOnce(initialSetup);
716
788
  assert.calledWith(initialSetup, {
717
789
  id: uuid1,
718
790
  self: {
719
791
  callBackInfo: {
720
- callbackAddress: uri1
721
- }
722
- }
792
+ callbackAddress: uri1,
793
+ },
794
+ },
795
+ info: {
796
+ webExMeetingId
797
+ },
723
798
  });
724
799
  });
725
800
  it('should setup the meeting by a not difference event', async () => {
@@ -728,23 +803,30 @@ describe('plugin-meetings', () => {
728
803
  id: uuid1,
729
804
  self: {
730
805
  callBackInfo: {
731
- callbackAddress: uri1
732
- }
733
- }
806
+ callbackAddress: uri1,
807
+ },
808
+ },
809
+ info: {
810
+ webExMeetingId
811
+ },
734
812
  },
735
813
  eventType: test1,
736
- locusUrl: url1
814
+ locusUrl: url1,
737
815
  });
738
- assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
816
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
739
817
  assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
818
+ assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', webExMeetingId);
740
819
  assert.calledOnce(initialSetup);
741
820
  assert.calledWith(initialSetup, {
742
821
  id: uuid1,
743
822
  self: {
744
823
  callBackInfo: {
745
- callbackAddress: uri1
746
- }
747
- }
824
+ callbackAddress: uri1,
825
+ },
826
+ },
827
+ info: {
828
+ webExMeetingId
829
+ },
748
830
  });
749
831
  });
750
832
 
@@ -753,13 +835,13 @@ describe('plugin-meetings', () => {
753
835
  id: uuid1,
754
836
  self: {
755
837
  callbackInfo: {
756
- callbackAddress: uri1
757
- }
838
+ callbackAddress: uri1,
839
+ },
758
840
  },
759
841
  info: {
760
- isUnifiedSpaceMeeting
842
+ isUnifiedSpaceMeeting,
761
843
  },
762
- conversationUrl: 'fakeConvoUrl'
844
+ conversationUrl: 'fakeConvoUrl',
763
845
  },
764
846
  eventType: test1,
765
847
  locusUrl: url1,
@@ -767,19 +849,40 @@ describe('plugin-meetings', () => {
767
849
 
768
850
  it('should not try to match USM meetings by conversation url', async () => {
769
851
  await webex.meetings.handleLocusEvent(generateFakeLocusData(true));
770
- assert.callCount(webex.meetings.meetingCollection.getByKey, 3);
771
- assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(0).args, ['locusUrl', url1]);
772
- assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(1).args, ['correlationId', false]);
773
- assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(2).args, ['sipUri', uri1]);
852
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
853
+ assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(0).args, [
854
+ 'locusUrl',
855
+ url1,
856
+ ]);
857
+ assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(1).args, [
858
+ 'correlationId',
859
+ false,
860
+ ]);
861
+ assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(2).args, [
862
+ 'sipUri',
863
+ uri1,
864
+ ]);
774
865
  assert.calledOnce(initialSetup);
775
866
  });
776
867
  it('should try to match non-USM meetings by conversation url', async () => {
777
868
  await webex.meetings.handleLocusEvent(generateFakeLocusData(false));
778
- assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
779
- assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(0).args, ['locusUrl', url1]);
780
- assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(1).args, ['correlationId', false]);
781
- assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(2).args, ['sipUri', uri1]);
782
- assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(3).args, ['conversationUrl', 'fakeConvoUrl']);
869
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
870
+ assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(0).args, [
871
+ 'locusUrl',
872
+ url1,
873
+ ]);
874
+ assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(1).args, [
875
+ 'correlationId',
876
+ false,
877
+ ]);
878
+ assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(2).args, [
879
+ 'sipUri',
880
+ uri1,
881
+ ]);
882
+ assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(3).args, [
883
+ 'conversationUrl',
884
+ 'fakeConvoUrl',
885
+ ]);
783
886
  assert.calledOnce(initialSetup);
784
887
  });
785
888
  });
@@ -798,11 +901,14 @@ describe('plugin-meetings', () => {
798
901
  beforeEach(() => {
799
902
  clock = sinon.useFakeTimers();
800
903
  setTimeoutSpy = sinon.spy(clock, 'setTimeout');
801
- webex.meetings.meetingInfo.fetchMeetingInfo = sinon.stub().returns(Promise.resolve({
802
- body: {
803
- permissionToken: 'PT', meetingJoinUrl: 'meetingJoinUrl'
804
- }
805
- }));
904
+ webex.meetings.meetingInfo.fetchMeetingInfo = sinon.stub().returns(
905
+ Promise.resolve({
906
+ body: {
907
+ permissionToken: 'PT',
908
+ meetingJoinUrl: 'meetingJoinUrl',
909
+ },
910
+ })
911
+ );
806
912
  const nowTimeStamp = Date.now();
807
913
 
808
914
  FAKE_TIME_TO_START = 0.1 * 60 * 1000;
@@ -816,7 +922,12 @@ describe('plugin-meetings', () => {
816
922
  clock.restore();
817
923
  });
818
924
 
819
- const checkCreateWithoutDelay = (meeting, destination, type, expectedMeetingData = {}) => {
925
+ const checkCreateWithoutDelay = (
926
+ meeting,
927
+ destination,
928
+ type,
929
+ expectedMeetingData = {}
930
+ ) => {
820
931
  assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
821
932
  assert.calledOnce(MeetingsUtil.getMeetingAddedType);
822
933
  assert.notCalled(setTimeoutSpy);
@@ -832,12 +943,25 @@ describe('plugin-meetings', () => {
832
943
  }
833
944
  assert.equal(meeting.destination, destination);
834
945
  assert.equal(meeting.destinationType, type);
835
- assert.calledWith(TriggerProxy.trigger, sinon.match.instanceOf(Meetings), {
836
- file: 'meetings', function: 'createMeeting'
837
- }, 'meeting:added', {
838
- meeting: sinon.match.instanceOf(Meeting), type: 'test meeting added type'
839
- });
840
- assert.calledWith(TriggerProxy.trigger, meeting, {file: 'meetings', function: 'fetchMeetingInfo'}, 'meeting:meetingInfoAvailable');
946
+ assert.calledWith(
947
+ TriggerProxy.trigger,
948
+ sinon.match.instanceOf(Meetings),
949
+ {
950
+ file: 'meetings',
951
+ function: 'createMeeting',
952
+ },
953
+ 'meeting:added',
954
+ {
955
+ meeting: sinon.match.instanceOf(Meeting),
956
+ type: 'test meeting added type',
957
+ }
958
+ );
959
+ assert.calledWith(
960
+ TriggerProxy.trigger,
961
+ meeting,
962
+ {file: 'meetings', function: 'fetchMeetingInfo'},
963
+ 'meeting:meetingInfoAvailable'
964
+ );
841
965
  };
842
966
 
843
967
  it('creates the meeting from a successful meeting info fetch promise testing', async () => {
@@ -845,7 +969,7 @@ describe('plugin-meetings', () => {
845
969
 
846
970
  const expectedMeetingData = {
847
971
  permissionToken: 'PT',
848
- meetingJoinUrl: 'meetingJoinUrl'
972
+ meetingJoinUrl: 'meetingJoinUrl',
849
973
  };
850
974
 
851
975
  checkCreateWithoutDelay(meeting, 'test destination', 'test type', expectedMeetingData);
@@ -855,10 +979,14 @@ describe('plugin-meetings', () => {
855
979
  const meeting = await webex.meetings.createMeeting('test destination', 'test type');
856
980
  const expectedMeetingData = {
857
981
  permissionToken: 'PT',
858
- meetingJoinUrl: 'meetingJoinUrl'
982
+ meetingJoinUrl: 'meetingJoinUrl',
859
983
  };
860
984
 
861
- assert.instanceOf(meeting, Meeting, 'createMeeting should eventually resolve to a Meeting Object');
985
+ assert.instanceOf(
986
+ meeting,
987
+ Meeting,
988
+ 'createMeeting should eventually resolve to a Meeting Object'
989
+ );
862
990
  checkCreateWithoutDelay(meeting, 'test destination', 'test type', expectedMeetingData);
863
991
  });
864
992
 
@@ -869,19 +997,27 @@ describe('plugin-meetings', () => {
869
997
  info: {
870
998
  webExMeetingId: 'locusMeetingId',
871
999
  sipUri: 'locusSipUri',
872
- owner: 'locusOwner'
1000
+ owner: 'locusOwner',
873
1001
  },
874
1002
  meeting: {
875
- startTime: fakeMeetingStartTimeString
1003
+ startTime: fakeMeetingStartTimeString,
876
1004
  },
877
1005
  fullState: {
878
- active: false
879
- }
1006
+ active: false,
1007
+ },
880
1008
  };
881
1009
 
882
- const meeting = await webex.meetings.createMeeting(FAKE_LOCUS_MEETING, 'test type', true);
1010
+ const meeting = await webex.meetings.createMeeting(
1011
+ FAKE_LOCUS_MEETING,
1012
+ 'test type',
1013
+ true
1014
+ );
883
1015
 
884
- assert.instanceOf(meeting, Meeting, 'createMeeting should eventually resolve to a Meeting Object');
1016
+ assert.instanceOf(
1017
+ meeting,
1018
+ Meeting,
1019
+ 'createMeeting should eventually resolve to a Meeting Object'
1020
+ );
885
1021
  assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
886
1022
  assert.calledOnce(setTimeoutSpy);
887
1023
 
@@ -897,15 +1033,27 @@ describe('plugin-meetings', () => {
897
1033
  // Add meeting and send trigger
898
1034
  assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
899
1035
  assert.calledTwice(TriggerProxy.trigger);
900
- assert.calledWith(TriggerProxy.trigger, sinon.match.instanceOf(Meetings), {
901
- file: 'meetings', function: 'createMeeting'
902
- }, 'meeting:added', {
903
- meeting: sinon.match.instanceOf(Meeting), type: 'test meeting added type'
904
- });
1036
+ assert.calledWith(
1037
+ TriggerProxy.trigger,
1038
+ sinon.match.instanceOf(Meetings),
1039
+ {
1040
+ file: 'meetings',
1041
+ function: 'createMeeting',
1042
+ },
1043
+ 'meeting:added',
1044
+ {
1045
+ meeting: sinon.match.instanceOf(Meeting),
1046
+ type: 'test meeting added type',
1047
+ }
1048
+ );
905
1049
 
906
1050
  // When timer expires
907
1051
  clock.tick(FAKE_TIME_TO_START);
908
- assert.calledWith(webex.meetings.meetingInfo.fetchMeetingInfo, FAKE_LOCUS_MEETING, 'test type');
1052
+ assert.calledWith(
1053
+ webex.meetings.meetingInfo.fetchMeetingInfo,
1054
+ FAKE_LOCUS_MEETING,
1055
+ 'test type'
1056
+ );
909
1057
 
910
1058
  // Parse meeting info is called again with new meeting info
911
1059
  await testUtils.flushPromises();
@@ -917,7 +1065,12 @@ describe('plugin-meetings', () => {
917
1065
  assert.equal(meeting.owner, 'locusOwner');
918
1066
  assert.equal(meeting.permissionToken, 'PT');
919
1067
 
920
- assert.calledWith(TriggerProxy.trigger, meeting, {file: 'meetings', function: 'fetchMeetingInfo'}, 'meeting:meetingInfoAvailable');
1068
+ assert.calledWith(
1069
+ TriggerProxy.trigger,
1070
+ meeting,
1071
+ {file: 'meetings', function: 'fetchMeetingInfo'},
1072
+ 'meeting:meetingInfoAvailable'
1073
+ );
921
1074
  });
922
1075
 
923
1076
  it('creates the meeting from a successful meeting info fetch that has no random delay because it is active', async () => {
@@ -927,19 +1080,27 @@ describe('plugin-meetings', () => {
927
1080
  info: {
928
1081
  webExMeetingId: 'locusMeetingId',
929
1082
  sipUri: 'locusSipUri',
930
- owner: 'locusOwner'
1083
+ owner: 'locusOwner',
931
1084
  },
932
1085
  meeting: {
933
- startTime: fakeMeetingStartTimeString
1086
+ startTime: fakeMeetingStartTimeString,
934
1087
  },
935
1088
  fullState: {
936
- active: true
937
- }
1089
+ active: true,
1090
+ },
938
1091
  };
939
1092
 
940
- const meeting = await webex.meetings.createMeeting(FAKE_LOCUS_MEETING, 'test type', true);
1093
+ const meeting = await webex.meetings.createMeeting(
1094
+ FAKE_LOCUS_MEETING,
1095
+ 'test type',
1096
+ true
1097
+ );
941
1098
 
942
- assert.instanceOf(meeting, Meeting, 'createMeeting should eventually resolve to a Meeting Object');
1099
+ assert.instanceOf(
1100
+ meeting,
1101
+ Meeting,
1102
+ 'createMeeting should eventually resolve to a Meeting Object'
1103
+ );
943
1104
  checkCreateWithoutDelay(meeting, FAKE_LOCUS_MEETING, 'test type');
944
1105
  });
945
1106
 
@@ -950,27 +1111,35 @@ describe('plugin-meetings', () => {
950
1111
  info: {
951
1112
  webExMeetingId: 'locusMeetingId',
952
1113
  sipUri: 'locusSipUri',
953
- owner: 'locusOwner'
1114
+ owner: 'locusOwner',
954
1115
  },
955
1116
  meeting: {
956
- startTime: fakeMeetingStartTimeString - (1 * 60 * 60 * 1000)
1117
+ startTime: fakeMeetingStartTimeString - 1 * 60 * 60 * 1000,
957
1118
  },
958
1119
  fullState: {
959
- active: false
960
- }
1120
+ active: false,
1121
+ },
961
1122
  };
962
1123
 
963
- const meeting = await webex.meetings.createMeeting(FAKE_LOCUS_MEETING, 'test type', true);
1124
+ const meeting = await webex.meetings.createMeeting(
1125
+ FAKE_LOCUS_MEETING,
1126
+ 'test type',
1127
+ true
1128
+ );
964
1129
 
965
- assert.instanceOf(meeting, Meeting, 'createMeeting should eventually resolve to a Meeting Object');
1130
+ assert.instanceOf(
1131
+ meeting,
1132
+ Meeting,
1133
+ 'createMeeting should eventually resolve to a Meeting Object'
1134
+ );
966
1135
  checkCreateWithoutDelay(meeting, FAKE_LOCUS_MEETING, 'test type');
967
1136
  });
968
1137
 
969
1138
  it('creates the meeting from a successful meeting info fetch that has no random delay because enableUnifiedMeetings is disabled', async () => {
970
1139
  Object.assign(webex.meetings.config, {
971
1140
  experimental: {
972
- enableUnifiedMeetings: false
973
- }
1141
+ enableUnifiedMeetings: false,
1142
+ },
974
1143
  });
975
1144
  const FAKE_LOCUS_MEETING = {
976
1145
  conversationUrl: 'locusConvURL',
@@ -978,19 +1147,27 @@ describe('plugin-meetings', () => {
978
1147
  info: {
979
1148
  webExMeetingId: 'locusMeetingId',
980
1149
  sipUri: 'locusSipUri',
981
- owner: 'locusOwner'
1150
+ owner: 'locusOwner',
982
1151
  },
983
1152
  meeting: {
984
- startTime: fakeMeetingStartTimeString
1153
+ startTime: fakeMeetingStartTimeString,
985
1154
  },
986
1155
  fullState: {
987
- active: false
988
- }
1156
+ active: false,
1157
+ },
989
1158
  };
990
1159
 
991
- const meeting = await webex.meetings.createMeeting(FAKE_LOCUS_MEETING, 'test type', true);
1160
+ const meeting = await webex.meetings.createMeeting(
1161
+ FAKE_LOCUS_MEETING,
1162
+ 'test type',
1163
+ true
1164
+ );
992
1165
 
993
- assert.instanceOf(meeting, Meeting, 'createMeeting should eventually resolve to a Meeting Object');
1166
+ assert.instanceOf(
1167
+ meeting,
1168
+ Meeting,
1169
+ 'createMeeting should eventually resolve to a Meeting Object'
1170
+ );
994
1171
  checkCreateWithoutDelay(meeting, FAKE_LOCUS_MEETING, 'test type');
995
1172
  });
996
1173
  });
@@ -999,22 +1176,40 @@ describe('plugin-meetings', () => {
999
1176
  beforeEach(() => {
1000
1177
  console.error = sinon.stub().returns(false);
1001
1178
  TriggerProxy.trigger.reset();
1002
- webex.meetings.meetingInfo.fetchMeetingInfo = sinon.stub().returns(Promise.reject(new Error('test')));
1179
+ webex.meetings.meetingInfo.fetchMeetingInfo = sinon
1180
+ .stub()
1181
+ .returns(Promise.reject(new Error('test')));
1003
1182
  });
1004
1183
  it('creates the meeting from a rejected meeting info fetch', async () => {
1005
1184
  const meeting = await webex.meetings.createMeeting('test destination', 'test type');
1006
1185
 
1007
- assert.instanceOf(meeting, Meeting, 'createMeeting should eventually resolve to a Meeting Object');
1186
+ assert.instanceOf(
1187
+ meeting,
1188
+ Meeting,
1189
+ 'createMeeting should eventually resolve to a Meeting Object'
1190
+ );
1008
1191
  assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
1009
1192
  assert.calledOnce(MeetingsUtil.getMeetingAddedType);
1010
1193
  assert.calledTwice(TriggerProxy.trigger);
1011
- assert.calledWith(webex.meetings.meetingInfo.fetchMeetingInfo, 'test destination', 'test type');
1194
+ assert.calledWith(
1195
+ webex.meetings.meetingInfo.fetchMeetingInfo,
1196
+ 'test destination',
1197
+ 'test type'
1198
+ );
1012
1199
  assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1013
- assert.calledWith(TriggerProxy.trigger, sinon.match.instanceOf(Meetings), {
1014
- file: 'meetings', function: 'createMeeting'
1015
- }, 'meeting:added', {
1016
- meeting: sinon.match.instanceOf(Meeting), type: 'test meeting added type'
1017
- });
1200
+ assert.calledWith(
1201
+ TriggerProxy.trigger,
1202
+ sinon.match.instanceOf(Meetings),
1203
+ {
1204
+ file: 'meetings',
1205
+ function: 'createMeeting',
1206
+ },
1207
+ 'meeting:added',
1208
+ {
1209
+ meeting: sinon.match.instanceOf(Meeting),
1210
+ type: 'test meeting added type',
1211
+ }
1212
+ );
1018
1213
  });
1019
1214
  });
1020
1215
  });
@@ -1039,11 +1234,19 @@ describe('plugin-meetings', () => {
1039
1234
 
1040
1235
  assert.calledOnce(webex.meetings.meetingCollection.delete);
1041
1236
  assert.calledWith(webex.meetings.meetingCollection.delete, meeting.id);
1042
- assert.calledWith(TriggerProxy.trigger, sinon.match.instanceOf(Meetings), {
1043
- file: 'meetings', function: 'destroy'
1044
- }, 'meeting:removed', {
1045
- meetingId: meeting.id, reason: test1
1046
- });
1237
+ assert.calledWith(
1238
+ TriggerProxy.trigger,
1239
+ sinon.match.instanceOf(Meetings),
1240
+ {
1241
+ file: 'meetings',
1242
+ function: 'destroy',
1243
+ },
1244
+ 'meeting:removed',
1245
+ {
1246
+ meetingId: meeting.id,
1247
+ reason: test1,
1248
+ }
1249
+ );
1047
1250
  });
1048
1251
  });
1049
1252
 
@@ -1068,7 +1271,8 @@ describe('plugin-meetings', () => {
1068
1271
  it('should trigger event upon mercury disconnect', () => {
1069
1272
  const {meetings} = webex;
1070
1273
  const SCOPE = {
1071
- file: 'meetings/index', function: 'handleMercuryOffline'
1274
+ file: 'meetings/index',
1275
+ function: 'handleMercuryOffline',
1072
1276
  };
1073
1277
  const EVENT = 'network:disconnected';
1074
1278
 
@@ -1098,13 +1302,11 @@ describe('plugin-meetings', () => {
1098
1302
  services: {
1099
1303
  getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
1100
1304
  },
1101
-
1102
1305
  });
1103
1306
 
1104
- await webex.meetings.fetchUserPreferredWebexSite()
1105
- .then(() => {
1106
- assert.equal(webex.meetings.preferredWebexSite, '');
1107
- });
1307
+ await webex.meetings.fetchUserPreferredWebexSite().then(() => {
1308
+ assert.equal(webex.meetings.preferredWebexSite, '');
1309
+ });
1108
1310
  });
1109
1311
  });
1110
1312
  });
@@ -1120,11 +1322,14 @@ describe('plugin-meetings', () => {
1120
1322
  TriggerProxy.trigger.reset();
1121
1323
  // clock = sinon.useFakeTimers();
1122
1324
  // setTimeoutSpy = sinon.spy(clock, 'setTimeout');
1123
- webex.meetings.meetingInfo.fetchMeetingInfo = sinon.stub().returns(Promise.resolve({
1124
- body: {
1125
- permissionToken: 'PT', meetingJoinUrl: 'meetingJoinUrl'
1126
- }
1127
- }));
1325
+ webex.meetings.meetingInfo.fetchMeetingInfo = sinon.stub().returns(
1326
+ Promise.resolve({
1327
+ body: {
1328
+ permissionToken: 'PT',
1329
+ meetingJoinUrl: 'meetingJoinUrl',
1330
+ },
1331
+ })
1332
+ );
1128
1333
 
1129
1334
  meeting = await webex.meetings.createMeeting('test destination', 'test type');
1130
1335
 
@@ -1132,37 +1337,37 @@ describe('plugin-meetings', () => {
1132
1337
  });
1133
1338
 
1134
1339
  it('triggers correct event when CONTROLS_ENTRY_EXIT_TONE_UPDATED emitted', async () => {
1135
- await meeting.locusInfo.emitScoped(
1136
- {},
1137
- LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED,
1138
- {entryExitTone: 'foo'}
1139
- );
1340
+ await meeting.locusInfo.emitScoped({}, LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED, {
1341
+ entryExitTone: 'foo',
1342
+ });
1140
1343
 
1141
1344
  assert.calledOnce(TriggerProxy.trigger);
1142
- assert.calledWith(TriggerProxy.trigger, sinon.match.instanceOf(Meeting),
1345
+ assert.calledWith(
1346
+ TriggerProxy.trigger,
1347
+ sinon.match.instanceOf(Meeting),
1143
1348
  {
1144
1349
  file: 'meeting/index',
1145
- function: 'setupLocusControlsListener'
1350
+ function: 'setupLocusControlsListener',
1146
1351
  },
1147
1352
  EVENT_TRIGGERS.MEETING_ENTRY_EXIT_TONE_UPDATE,
1148
- {entryExitTone: 'foo'});
1353
+ {entryExitTone: 'foo'}
1354
+ );
1149
1355
  });
1150
1356
 
1151
1357
  const checkSelfTrigger = async (inEvent, outEvent) => {
1152
- await meeting.locusInfo.emitScoped(
1153
- {},
1154
- inEvent,
1155
- {foo: 'bar'}
1156
- );
1358
+ await meeting.locusInfo.emitScoped({}, inEvent, {foo: 'bar'});
1157
1359
 
1158
1360
  assert.calledOnce(TriggerProxy.trigger);
1159
- assert.calledWith(TriggerProxy.trigger, sinon.match.instanceOf(Meeting),
1361
+ assert.calledWith(
1362
+ TriggerProxy.trigger,
1363
+ sinon.match.instanceOf(Meeting),
1160
1364
  {
1161
1365
  file: 'meeting/index',
1162
- function: 'setUpLocusInfoSelfListener'
1366
+ function: 'setUpLocusInfoSelfListener',
1163
1367
  },
1164
1368
  outEvent,
1165
- {payload: {foo: 'bar'}});
1369
+ {payload: {foo: 'bar'}}
1370
+ );
1166
1371
  };
1167
1372
 
1168
1373
  it('triggers correct event when SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE emitted', async () => {
@@ -1186,5 +1391,159 @@ describe('plugin-meetings', () => {
1186
1391
  );
1187
1392
  });
1188
1393
  });
1394
+
1395
+ describe('#isNeedHandleMainLocus', () => {
1396
+ let meeting;
1397
+ let newLocus;
1398
+ beforeEach(() => {
1399
+ meeting = {
1400
+ controls: {},
1401
+ self: {},
1402
+ };
1403
+ newLocus = {
1404
+ controls: {},
1405
+ self: {},
1406
+ }
1407
+ });
1408
+ afterEach(() => {
1409
+ sinon.restore();
1410
+ });
1411
+ it('check normal case will return true', () => {
1412
+ sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns(null);
1413
+ LoggerProxy.logger.log = sinon.stub();
1414
+ const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
1415
+ assert.equal(result, true);
1416
+ assert.calledWith(
1417
+ LoggerProxy.logger.log,
1418
+ 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
1419
+ );
1420
+ });
1421
+
1422
+ it('check self joined and joined on this device, return true', () => {
1423
+ sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns(null);
1424
+ newLocus.self.state = 'JOINED';
1425
+ sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(true);
1426
+
1427
+ LoggerProxy.logger.log = sinon.stub();
1428
+ const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
1429
+ assert.equal(result, true);
1430
+ assert.calledWith(
1431
+ LoggerProxy.logger.log,
1432
+ 'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
1433
+ );
1434
+ });
1435
+
1436
+ it('if newLocus replaceAt time is expired, then return false', () => {
1437
+ sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns({joinedWith: {replaces: [{
1438
+ replaceAt: '2023-03-27T02:17:02.506Z',
1439
+ }]}});
1440
+ newLocus.self.state = 'JOINED';
1441
+ sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(true);
1442
+ sinon.stub(MeetingsUtil, 'getThisDevice').returns({
1443
+ replaces: [{
1444
+ replaceAt: '2023-03-27T02:17:01.506Z'
1445
+ }]
1446
+ })
1447
+
1448
+ LoggerProxy.logger.log = sinon.stub();
1449
+ const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
1450
+ assert.equal(result, false);
1451
+ assert.calledWith(
1452
+ LoggerProxy.logger.log,
1453
+ `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`
1454
+ );
1455
+ });
1456
+
1457
+ it('check current is in breakout join with this device, return false', () => {
1458
+ sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns({
1459
+ joinedWith: {
1460
+ correlationId: '111',
1461
+ },
1462
+ });
1463
+ newLocus.controls.breakout = {url: 'url'};
1464
+ meeting.correlationId = '111';
1465
+
1466
+ LoggerProxy.logger.log = sinon.stub();
1467
+ const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
1468
+ assert.equal(result, false);
1469
+ assert.calledWith(
1470
+ LoggerProxy.logger.log,
1471
+ `Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: url`
1472
+ );
1473
+ });
1474
+
1475
+ it('check self is moved and removed, return false', () => {
1476
+ webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
1477
+ newLocus.self.state = 'LEFT';
1478
+ newLocus.self.reason = 'MOVED';
1479
+ newLocus.self.removed = true;
1480
+ LoggerProxy.logger.log = sinon.stub();
1481
+ const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
1482
+ assert.equal(result, false);
1483
+ assert.calledWith(
1484
+ LoggerProxy.logger.log,
1485
+ 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status, not need to handle'
1486
+ );
1487
+ });
1488
+ });
1489
+
1490
+ describe('#isNeedHandleLocusDTO', () => {
1491
+ let meeting;
1492
+ let newLocus;
1493
+ beforeEach(() => {
1494
+ meeting = {
1495
+ controls: {},
1496
+ self: {},
1497
+ };
1498
+ newLocus = {
1499
+ controls: {},
1500
+ self: {},
1501
+ }
1502
+ });
1503
+ afterEach(() => {
1504
+ sinon.restore();
1505
+ });
1506
+ it('initial DTO , joined breakout session, return true', () => {
1507
+ newLocus.controls.breakout = {
1508
+ sessionType: 'BREAKOUT',
1509
+ };
1510
+ newLocus.self.state = 'JOINED';
1511
+ newLocus.fullState = {
1512
+ active: true,
1513
+ };
1514
+ LoggerProxy.logger.log = sinon.stub();
1515
+ const result = webex.meetings.isNeedHandleLocusDTO(null, newLocus);
1516
+ assert.equal(result, true);
1517
+ assert.calledWith(
1518
+ LoggerProxy.logger.log,
1519
+ `Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: true`
1520
+ );
1521
+ });
1522
+ it('others go to check isNeedHandleMainLocus', () => {
1523
+ newLocus.controls.breakout = {
1524
+ sessionType: 'MAIN',
1525
+ };
1526
+ newLocus.self.state = 'JOINED';
1527
+
1528
+ LoggerProxy.logger.log = sinon.stub();
1529
+ const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
1530
+ assert.equal(result, true);
1531
+ assert.calledWith(
1532
+ LoggerProxy.logger.log,
1533
+ 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
1534
+ );
1535
+ });
1536
+ it('joined breakout session, self status is moved, return false', () => {
1537
+ newLocus.controls.breakout = {
1538
+ sessionType: 'BREAKOUT',
1539
+ };
1540
+ newLocus.self.state = 'LEFT';
1541
+ newLocus.self.reason = 'MOVED';
1542
+
1543
+ LoggerProxy.logger.log = sinon.stub();
1544
+ const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
1545
+ assert.equal(result, false);
1546
+ });
1547
+ });
1189
1548
  });
1190
1549
  });