@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.104

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 (548) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.js +48 -0
  6. package/dist/annotation/constants.js.map +1 -0
  7. package/dist/annotation/index.js +357 -0
  8. package/dist/annotation/index.js.map +1 -0
  9. package/dist/breakouts/breakout.js +176 -0
  10. package/dist/breakouts/breakout.js.map +1 -0
  11. package/dist/breakouts/collection.js +23 -0
  12. package/dist/breakouts/collection.js.map +1 -0
  13. package/dist/breakouts/edit-lock-error.js +52 -0
  14. package/dist/breakouts/edit-lock-error.js.map +1 -0
  15. package/dist/breakouts/events.js +43 -0
  16. package/dist/breakouts/events.js.map +1 -0
  17. package/dist/breakouts/index.js +919 -0
  18. package/dist/breakouts/index.js.map +1 -0
  19. package/dist/breakouts/request.js +78 -0
  20. package/dist/breakouts/request.js.map +1 -0
  21. package/dist/breakouts/utils.js +67 -0
  22. package/dist/breakouts/utils.js.map +1 -0
  23. package/dist/common/browser-detection.js +1 -20
  24. package/dist/common/browser-detection.js.map +1 -1
  25. package/dist/common/collection.js +5 -20
  26. package/dist/common/collection.js.map +1 -1
  27. package/dist/common/config.js +0 -7
  28. package/dist/common/config.js.map +1 -1
  29. package/dist/common/errors/captcha-error.js +10 -24
  30. package/dist/common/errors/captcha-error.js.map +1 -1
  31. package/dist/common/errors/intent-to-join.js +11 -24
  32. package/dist/common/errors/intent-to-join.js.map +1 -1
  33. package/dist/common/errors/join-meeting.js +12 -25
  34. package/dist/common/errors/join-meeting.js.map +1 -1
  35. package/dist/common/errors/media.js +10 -24
  36. package/dist/common/errors/media.js.map +1 -1
  37. package/dist/common/errors/parameter.js +5 -33
  38. package/dist/common/errors/parameter.js.map +1 -1
  39. package/dist/common/errors/password-error.js +10 -24
  40. package/dist/common/errors/password-error.js.map +1 -1
  41. package/dist/common/errors/permission.js +9 -23
  42. package/dist/common/errors/permission.js.map +1 -1
  43. package/dist/common/errors/reconnection-in-progress.js +0 -17
  44. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  45. package/dist/common/errors/reconnection.js +10 -24
  46. package/dist/common/errors/reconnection.js.map +1 -1
  47. package/dist/common/errors/stats.js +10 -24
  48. package/dist/common/errors/stats.js.map +1 -1
  49. package/dist/common/errors/webex-errors.js +10 -69
  50. package/dist/common/errors/webex-errors.js.map +1 -1
  51. package/dist/common/errors/webex-meetings-error.js +5 -25
  52. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  53. package/dist/common/events/events-scope.js +0 -22
  54. package/dist/common/events/events-scope.js.map +1 -1
  55. package/dist/common/events/events.js +0 -23
  56. package/dist/common/events/events.js.map +1 -1
  57. package/dist/common/events/trigger-proxy.js +0 -12
  58. package/dist/common/events/trigger-proxy.js.map +1 -1
  59. package/dist/common/events/util.js +0 -15
  60. package/dist/common/events/util.js.map +1 -1
  61. package/dist/common/logs/logger-config.js +0 -4
  62. package/dist/common/logs/logger-config.js.map +1 -1
  63. package/dist/common/logs/logger-proxy.js +1 -8
  64. package/dist/common/logs/logger-proxy.js.map +1 -1
  65. package/dist/common/logs/request.js +37 -60
  66. package/dist/common/logs/request.js.map +1 -1
  67. package/dist/common/queue.js +4 -14
  68. package/dist/common/queue.js.map +1 -1
  69. package/dist/config.js +7 -6
  70. package/dist/config.js.map +1 -1
  71. package/dist/constants.js +184 -122
  72. package/dist/constants.js.map +1 -1
  73. package/dist/controls-options-manager/constants.js +14 -0
  74. package/dist/controls-options-manager/constants.js.map +1 -0
  75. package/dist/controls-options-manager/enums.js +25 -0
  76. package/dist/controls-options-manager/enums.js.map +1 -0
  77. package/dist/controls-options-manager/index.js +297 -0
  78. package/dist/controls-options-manager/index.js.map +1 -0
  79. package/dist/controls-options-manager/types.js +7 -0
  80. package/dist/controls-options-manager/types.js.map +1 -0
  81. package/dist/controls-options-manager/util.js +250 -0
  82. package/dist/controls-options-manager/util.js.map +1 -0
  83. package/dist/index.js +72 -17
  84. package/dist/index.js.map +1 -1
  85. package/dist/locus-info/controlsUtils.js +56 -29
  86. package/dist/locus-info/controlsUtils.js.map +1 -1
  87. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  88. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  89. package/dist/locus-info/fullState.js +0 -15
  90. package/dist/locus-info/fullState.js.map +1 -1
  91. package/dist/locus-info/hostUtils.js +4 -12
  92. package/dist/locus-info/hostUtils.js.map +1 -1
  93. package/dist/locus-info/index.js +362 -208
  94. package/dist/locus-info/index.js.map +1 -1
  95. package/dist/locus-info/infoUtils.js +3 -37
  96. package/dist/locus-info/infoUtils.js.map +1 -1
  97. package/dist/locus-info/mediaSharesUtils.js +12 -38
  98. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  99. package/dist/locus-info/parser.js +92 -118
  100. package/dist/locus-info/parser.js.map +1 -1
  101. package/dist/locus-info/selfUtils.js +99 -91
  102. package/dist/locus-info/selfUtils.js.map +1 -1
  103. package/dist/media/index.js +113 -337
  104. package/dist/media/index.js.map +1 -1
  105. package/dist/media/properties.js +96 -135
  106. package/dist/media/properties.js.map +1 -1
  107. package/dist/media/util.js +1 -35
  108. package/dist/media/util.js.map +1 -1
  109. package/dist/mediaQualityMetrics/config.js +505 -495
  110. package/dist/mediaQualityMetrics/config.js.map +1 -1
  111. package/dist/meeting/in-meeting-actions.js +59 -14
  112. package/dist/meeting/in-meeting-actions.js.map +1 -1
  113. package/dist/meeting/index.js +2909 -2398
  114. package/dist/meeting/index.js.map +1 -1
  115. package/dist/meeting/muteState.js +257 -112
  116. package/dist/meeting/muteState.js.map +1 -1
  117. package/dist/meeting/request.js +330 -264
  118. package/dist/meeting/request.js.map +1 -1
  119. package/dist/meeting/request.type.js +7 -0
  120. package/dist/meeting/request.type.js.map +1 -0
  121. package/dist/meeting/state.js +21 -31
  122. package/dist/meeting/state.js.map +1 -1
  123. package/dist/meeting/util.js +63 -261
  124. package/dist/meeting/util.js.map +1 -1
  125. package/dist/meeting-info/collection.js +6 -25
  126. package/dist/meeting-info/collection.js.map +1 -1
  127. package/dist/meeting-info/index.js +14 -32
  128. package/dist/meeting-info/index.js.map +1 -1
  129. package/dist/meeting-info/meeting-info-v2.js +273 -280
  130. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  131. package/dist/meeting-info/request.js +3 -15
  132. package/dist/meeting-info/request.js.map +1 -1
  133. package/dist/meeting-info/util.js +98 -183
  134. package/dist/meeting-info/util.js.map +1 -1
  135. package/dist/meeting-info/utilv2.js +155 -232
  136. package/dist/meeting-info/utilv2.js.map +1 -1
  137. package/dist/meetings/collection.js +26 -19
  138. package/dist/meetings/collection.js.map +1 -1
  139. package/dist/meetings/index.js +741 -548
  140. package/dist/meetings/index.js.map +1 -1
  141. package/dist/meetings/request.js +26 -41
  142. package/dist/meetings/request.js.map +1 -1
  143. package/dist/meetings/util.js +194 -149
  144. package/dist/meetings/util.js.map +1 -1
  145. package/dist/member/index.js +100 -85
  146. package/dist/member/index.js.map +1 -1
  147. package/dist/member/types.js +15 -0
  148. package/dist/member/types.js.map +1 -0
  149. package/dist/member/util.js +90 -68
  150. package/dist/member/util.js.map +1 -1
  151. package/dist/members/collection.js +13 -12
  152. package/dist/members/collection.js.map +1 -1
  153. package/dist/members/index.js +227 -188
  154. package/dist/members/index.js.map +1 -1
  155. package/dist/members/request.js +54 -39
  156. package/dist/members/request.js.map +1 -1
  157. package/dist/members/types.js +15 -0
  158. package/dist/members/types.js.map +1 -0
  159. package/dist/members/util.js +107 -44
  160. package/dist/members/util.js.map +1 -1
  161. package/dist/metrics/config.js +5 -14
  162. package/dist/metrics/config.js.map +1 -1
  163. package/dist/metrics/constants.js +3 -7
  164. package/dist/metrics/constants.js.map +1 -1
  165. package/dist/metrics/index.js +67 -159
  166. package/dist/metrics/index.js.map +1 -1
  167. package/dist/multistream/mediaRequestManager.js +250 -0
  168. package/dist/multistream/mediaRequestManager.js.map +1 -0
  169. package/dist/multistream/receiveSlot.js +202 -0
  170. package/dist/multistream/receiveSlot.js.map +1 -0
  171. package/dist/multistream/receiveSlotManager.js +176 -0
  172. package/dist/multistream/receiveSlotManager.js.map +1 -0
  173. package/dist/multistream/remoteMedia.js +270 -0
  174. package/dist/multistream/remoteMedia.js.map +1 -0
  175. package/dist/multistream/remoteMediaGroup.js +209 -0
  176. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  177. package/dist/multistream/remoteMediaManager.js +1137 -0
  178. package/dist/multistream/remoteMediaManager.js.map +1 -0
  179. package/dist/networkQualityMonitor/index.js +40 -59
  180. package/dist/networkQualityMonitor/index.js.map +1 -1
  181. package/dist/personal-meeting-room/index.js +21 -45
  182. package/dist/personal-meeting-room/index.js.map +1 -1
  183. package/dist/personal-meeting-room/request.js +1 -31
  184. package/dist/personal-meeting-room/request.js.map +1 -1
  185. package/dist/personal-meeting-room/util.js +0 -13
  186. package/dist/personal-meeting-room/util.js.map +1 -1
  187. package/dist/reachability/index.js +192 -191
  188. package/dist/reachability/index.js.map +1 -1
  189. package/dist/reachability/request.js +15 -23
  190. package/dist/reachability/request.js.map +1 -1
  191. package/dist/reactions/constants.js +13 -0
  192. package/dist/reactions/constants.js.map +1 -0
  193. package/dist/reactions/reactions.js +109 -0
  194. package/dist/reactions/reactions.js.map +1 -0
  195. package/dist/reactions/reactions.type.js +36 -0
  196. package/dist/reactions/reactions.type.js.map +1 -0
  197. package/dist/reconnection-manager/index.js +386 -527
  198. package/dist/reconnection-manager/index.js.map +1 -1
  199. package/dist/recording-controller/enums.js +17 -0
  200. package/dist/recording-controller/enums.js.map +1 -0
  201. package/dist/recording-controller/index.js +343 -0
  202. package/dist/recording-controller/index.js.map +1 -0
  203. package/dist/recording-controller/util.js +63 -0
  204. package/dist/recording-controller/util.js.map +1 -0
  205. package/dist/roap/index.js +84 -286
  206. package/dist/roap/index.js.map +1 -1
  207. package/dist/roap/request.js +138 -238
  208. package/dist/roap/request.js.map +1 -1
  209. package/dist/roap/turnDiscovery.js +164 -102
  210. package/dist/roap/turnDiscovery.js.map +1 -1
  211. package/dist/statsAnalyzer/global.js +1 -93
  212. package/dist/statsAnalyzer/global.js.map +1 -1
  213. package/dist/statsAnalyzer/index.js +399 -470
  214. package/dist/statsAnalyzer/index.js.map +1 -1
  215. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  216. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  217. package/dist/transcription/index.js +22 -47
  218. package/dist/transcription/index.js.map +1 -1
  219. package/dist/types/annotation/annotation.types.d.ts +34 -0
  220. package/dist/types/annotation/constants.d.ts +31 -0
  221. package/dist/types/annotation/index.d.ts +124 -0
  222. package/dist/types/breakouts/breakout.d.ts +8 -0
  223. package/dist/types/breakouts/collection.d.ts +5 -0
  224. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  225. package/dist/types/breakouts/events.d.ts +2 -0
  226. package/dist/types/breakouts/index.d.ts +5 -0
  227. package/dist/types/breakouts/request.d.ts +22 -0
  228. package/dist/types/breakouts/utils.d.ts +15 -0
  229. package/dist/types/common/browser-detection.d.ts +9 -0
  230. package/dist/types/common/collection.d.ts +48 -0
  231. package/dist/types/common/config.d.ts +2 -0
  232. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  233. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  234. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  235. package/dist/types/common/errors/media.d.ts +15 -0
  236. package/dist/types/common/errors/parameter.d.ts +15 -0
  237. package/dist/types/common/errors/password-error.d.ts +15 -0
  238. package/dist/types/common/errors/permission.d.ts +14 -0
  239. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  240. package/dist/types/common/errors/reconnection.d.ts +15 -0
  241. package/dist/types/common/errors/stats.d.ts +15 -0
  242. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  243. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  244. package/dist/types/common/events/events-scope.d.ts +17 -0
  245. package/dist/types/common/events/events.d.ts +12 -0
  246. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  247. package/dist/types/common/events/util.d.ts +2 -0
  248. package/dist/types/common/logs/logger-config.d.ts +2 -0
  249. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  250. package/dist/types/common/logs/request.d.ts +34 -0
  251. package/dist/types/common/queue.d.ts +32 -0
  252. package/dist/types/config.d.ts +78 -0
  253. package/dist/types/constants.d.ts +968 -0
  254. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  255. package/dist/types/controls-options-manager/enums.d.ts +13 -0
  256. package/dist/types/controls-options-manager/index.d.ts +136 -0
  257. package/dist/types/controls-options-manager/types.d.ts +37 -0
  258. package/dist/types/controls-options-manager/util.d.ts +1 -0
  259. package/dist/types/index.d.ts +7 -0
  260. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  261. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  262. package/dist/types/locus-info/fullState.d.ts +2 -0
  263. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  264. package/dist/types/locus-info/index.d.ts +315 -0
  265. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  266. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  267. package/dist/types/locus-info/parser.d.ts +212 -0
  268. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  269. package/dist/types/media/index.d.ts +34 -0
  270. package/dist/types/media/properties.d.ts +108 -0
  271. package/dist/types/media/util.d.ts +2 -0
  272. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  273. package/dist/types/meeting/in-meeting-actions.d.ts +129 -0
  274. package/dist/types/meeting/index.d.ts +1748 -0
  275. package/dist/types/meeting/muteState.d.ts +185 -0
  276. package/dist/types/meeting/request.d.ts +275 -0
  277. package/dist/types/meeting/request.type.d.ts +11 -0
  278. package/dist/types/meeting/state.d.ts +9 -0
  279. package/dist/types/meeting/util.d.ts +2 -0
  280. package/dist/types/meeting-info/collection.d.ts +20 -0
  281. package/dist/types/meeting-info/index.d.ts +57 -0
  282. package/dist/types/meeting-info/meeting-info-v2.d.ts +112 -0
  283. package/dist/types/meeting-info/request.d.ts +22 -0
  284. package/dist/types/meeting-info/util.d.ts +2 -0
  285. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  286. package/dist/types/meetings/collection.d.ts +31 -0
  287. package/dist/types/meetings/index.d.ts +345 -0
  288. package/dist/types/meetings/request.d.ts +27 -0
  289. package/dist/types/meetings/util.d.ts +18 -0
  290. package/dist/types/member/index.d.ts +156 -0
  291. package/dist/types/member/types.d.ts +21 -0
  292. package/dist/types/member/util.d.ts +2 -0
  293. package/dist/types/members/collection.d.ts +29 -0
  294. package/dist/types/members/index.d.ts +353 -0
  295. package/dist/types/members/request.d.ts +69 -0
  296. package/dist/types/members/types.d.ts +24 -0
  297. package/dist/types/members/util.d.ts +2 -0
  298. package/dist/types/metrics/config.d.ts +172 -0
  299. package/dist/types/metrics/constants.d.ts +54 -0
  300. package/dist/types/metrics/index.d.ts +152 -0
  301. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  302. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  303. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  304. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  305. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  306. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  307. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  308. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  309. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  310. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  311. package/dist/types/reachability/index.d.ts +152 -0
  312. package/dist/types/reachability/request.d.ts +37 -0
  313. package/dist/types/reactions/constants.d.ts +3 -0
  314. package/dist/types/reactions/reactions.d.ts +4 -0
  315. package/dist/types/reactions/reactions.type.d.ts +52 -0
  316. package/dist/types/reconnection-manager/index.d.ts +126 -0
  317. package/dist/types/recording-controller/enums.d.ts +7 -0
  318. package/dist/types/recording-controller/index.d.ts +193 -0
  319. package/dist/types/recording-controller/util.d.ts +13 -0
  320. package/dist/types/roap/index.d.ts +77 -0
  321. package/dist/types/roap/request.d.ts +38 -0
  322. package/dist/types/roap/turnDiscovery.d.ts +88 -0
  323. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  324. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  325. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  326. package/dist/types/transcription/index.d.ts +64 -0
  327. package/internal-README.md +7 -6
  328. package/package.json +29 -21
  329. package/src/annotation/annotation.types.ts +41 -0
  330. package/src/annotation/constants.ts +36 -0
  331. package/src/annotation/index.ts +339 -0
  332. package/src/breakouts/README.md +219 -0
  333. package/src/breakouts/breakout.ts +141 -0
  334. package/src/breakouts/collection.ts +19 -0
  335. package/src/breakouts/edit-lock-error.ts +25 -0
  336. package/src/breakouts/events.ts +37 -0
  337. package/src/breakouts/index.ts +823 -0
  338. package/src/breakouts/request.ts +55 -0
  339. package/src/breakouts/utils.ts +57 -0
  340. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  341. package/src/common/collection.ts +9 -7
  342. package/src/common/{config.js → config.ts} +1 -1
  343. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  344. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  345. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  346. package/src/common/errors/{media.js → media.ts} +11 -7
  347. package/src/common/errors/parameter.ts +11 -7
  348. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  349. package/src/common/errors/{permission.js → permission.ts} +10 -6
  350. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  351. package/src/common/errors/{stats.js → stats.ts} +11 -7
  352. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -25
  353. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  354. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  355. package/src/common/events/{events.js → events.ts} +5 -1
  356. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  357. package/src/common/events/{util.js → util.ts} +2 -3
  358. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  359. package/src/common/logs/logger-proxy.ts +44 -0
  360. package/src/common/logs/{request.js → request.ts} +22 -9
  361. package/src/common/queue.ts +1 -2
  362. package/src/{config.js → config.ts} +18 -12
  363. package/src/constants.ts +256 -183
  364. package/src/controls-options-manager/constants.ts +5 -0
  365. package/src/controls-options-manager/enums.ts +16 -0
  366. package/src/controls-options-manager/index.ts +278 -0
  367. package/src/controls-options-manager/types.ts +49 -0
  368. package/src/controls-options-manager/util.ts +229 -0
  369. package/src/index.ts +33 -0
  370. package/src/locus-info/controlsUtils.ts +169 -0
  371. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  372. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  373. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  374. package/src/locus-info/{index.js → index.ts} +331 -80
  375. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  376. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  377. package/src/locus-info/{parser.js → parser.ts} +67 -79
  378. package/src/locus-info/{selfUtils.js → selfUtils.ts} +196 -67
  379. package/src/media/index.ts +488 -0
  380. package/src/media/{properties.js → properties.ts} +67 -54
  381. package/src/media/util.ts +16 -0
  382. package/src/mediaQualityMetrics/config.ts +384 -0
  383. package/src/meeting/in-meeting-actions.ts +123 -3
  384. package/src/meeting/{index.js → index.ts} +3334 -1775
  385. package/src/meeting/muteState.ts +526 -0
  386. package/src/meeting/{request.js → request.ts} +350 -142
  387. package/src/meeting/request.type.ts +13 -0
  388. package/src/meeting/{state.js → state.ts} +50 -35
  389. package/src/meeting/{util.js → util.ts} +126 -159
  390. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  391. package/src/meeting-info/{index.js → index.ts} +42 -36
  392. package/src/meeting-info/meeting-info-v2.ts +345 -0
  393. package/src/meeting-info/{request.js → request.ts} +14 -4
  394. package/src/meeting-info/{util.js → util.ts} +60 -51
  395. package/src/meeting-info/{utilv2.js → utilv2.ts} +76 -60
  396. package/src/meetings/{collection.js → collection.ts} +26 -3
  397. package/src/meetings/index.ts +1394 -0
  398. package/src/meetings/{request.js → request.ts} +34 -25
  399. package/src/meetings/util.ts +288 -0
  400. package/src/member/{index.js → index.ts} +124 -56
  401. package/src/member/types.ts +24 -0
  402. package/src/member/{util.js → util.ts} +105 -25
  403. package/src/members/{collection.js → collection.ts} +10 -2
  404. package/src/members/{index.js → index.ts} +359 -139
  405. package/src/members/request.ts +215 -0
  406. package/src/members/types.ts +28 -0
  407. package/src/members/{util.js → util.ts} +145 -54
  408. package/src/metrics/{config.js → config.ts} +256 -92
  409. package/src/metrics/{constants.js → constants.ts} +1 -6
  410. package/src/metrics/{index.js → index.ts} +116 -97
  411. package/src/multistream/mediaRequestManager.ts +324 -0
  412. package/src/multistream/receiveSlot.ts +184 -0
  413. package/src/multistream/receiveSlotManager.ts +166 -0
  414. package/src/multistream/remoteMedia.ts +254 -0
  415. package/src/multistream/remoteMediaGroup.ts +225 -0
  416. package/src/multistream/remoteMediaManager.ts +1075 -0
  417. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  418. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  419. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  420. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  421. package/src/reachability/{index.js → index.ts} +157 -94
  422. package/src/reachability/request.ts +46 -35
  423. package/src/reactions/constants.ts +4 -0
  424. package/src/reactions/reactions.ts +104 -0
  425. package/src/reactions/reactions.type.ts +62 -0
  426. package/src/reconnection-manager/{index.js → index.ts} +261 -163
  427. package/src/recording-controller/enums.ts +8 -0
  428. package/src/recording-controller/index.ts +315 -0
  429. package/src/recording-controller/util.ts +58 -0
  430. package/src/roap/index.ts +241 -0
  431. package/src/roap/request.ts +172 -0
  432. package/src/roap/turnDiscovery.ts +127 -53
  433. package/src/statsAnalyzer/global.ts +37 -0
  434. package/src/statsAnalyzer/index.ts +1273 -0
  435. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  436. package/src/transcription/{index.js → index.ts} +46 -39
  437. package/test/integration/spec/converged-space-meetings.js +177 -0
  438. package/test/integration/spec/journey.js +666 -464
  439. package/test/integration/spec/space-meeting.js +321 -206
  440. package/test/integration/spec/transcription.js +7 -8
  441. package/test/unit/spec/annotation/index.ts +435 -0
  442. package/test/unit/spec/breakouts/breakout.ts +184 -0
  443. package/test/unit/spec/breakouts/collection.ts +15 -0
  444. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  445. package/test/unit/spec/breakouts/events.ts +77 -0
  446. package/test/unit/spec/breakouts/index.ts +1504 -0
  447. package/test/unit/spec/breakouts/request.ts +104 -0
  448. package/test/unit/spec/breakouts/utils.js +72 -0
  449. package/test/unit/spec/common/browser-detection.js +9 -28
  450. package/test/unit/spec/controls-options-manager/index.js +287 -0
  451. package/test/unit/spec/controls-options-manager/util.js +403 -0
  452. package/test/unit/spec/fixture/locus.js +92 -90
  453. package/test/unit/spec/locus-info/controlsUtils.js +177 -32
  454. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  455. package/test/unit/spec/locus-info/index.js +493 -3
  456. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  457. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  458. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  459. package/test/unit/spec/locus-info/parser.js +3 -9
  460. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  461. package/test/unit/spec/locus-info/selfUtils.js +236 -12
  462. package/test/unit/spec/media/index.ts +303 -0
  463. package/test/unit/spec/media/properties.ts +73 -82
  464. package/test/unit/spec/meeting/in-meeting-actions.ts +58 -3
  465. package/test/unit/spec/meeting/index.js +3127 -975
  466. package/test/unit/spec/meeting/muteState.js +375 -70
  467. package/test/unit/spec/meeting/request.js +217 -43
  468. package/test/unit/spec/meeting/utils.js +205 -163
  469. package/test/unit/spec/meeting-info/meetinginfov2.js +268 -74
  470. package/test/unit/spec/meeting-info/request.js +7 -9
  471. package/test/unit/spec/meeting-info/util.js +11 -12
  472. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  473. package/test/unit/spec/meetings/collection.js +15 -1
  474. package/test/unit/spec/meetings/index.js +1052 -333
  475. package/test/unit/spec/meetings/utils.js +163 -14
  476. package/test/unit/spec/member/index.js +24 -1
  477. package/test/unit/spec/member/util.js +359 -32
  478. package/test/unit/spec/members/index.js +547 -37
  479. package/test/unit/spec/members/request.js +76 -20
  480. package/test/unit/spec/members/utils.js +191 -4
  481. package/test/unit/spec/metrics/index.js +46 -20
  482. package/test/unit/spec/multistream/mediaRequestManager.ts +1060 -0
  483. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  484. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  485. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  486. package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
  487. package/test/unit/spec/multistream/remoteMediaManager.ts +1793 -0
  488. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  489. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  490. package/test/unit/spec/reachability/index.ts +176 -27
  491. package/test/unit/spec/reachability/request.js +66 -0
  492. package/test/unit/spec/reconnection-manager/index.js +106 -9
  493. package/test/unit/spec/recording-controller/index.js +231 -0
  494. package/test/unit/spec/recording-controller/util.js +102 -0
  495. package/test/unit/spec/roap/index.ts +78 -45
  496. package/test/unit/spec/roap/request.ts +217 -0
  497. package/test/unit/spec/roap/turnDiscovery.ts +93 -49
  498. package/test/unit/spec/stats-analyzer/index.js +118 -65
  499. package/test/utils/cmr.js +44 -42
  500. package/test/utils/constants.js +9 -0
  501. package/test/utils/integrationTestUtils.js +64 -0
  502. package/test/utils/testUtils.js +63 -99
  503. package/test/utils/webex-config.js +22 -18
  504. package/test/utils/webex-test-users.js +57 -50
  505. package/tsconfig.json +6 -0
  506. package/dist/meeting/effectsState.js +0 -327
  507. package/dist/meeting/effectsState.js.map +0 -1
  508. package/dist/peer-connection-manager/index.js +0 -794
  509. package/dist/peer-connection-manager/index.js.map +0 -1
  510. package/dist/peer-connection-manager/util.js +0 -124
  511. package/dist/peer-connection-manager/util.js.map +0 -1
  512. package/dist/roap/collection.js +0 -73
  513. package/dist/roap/collection.js.map +0 -1
  514. package/dist/roap/handler.js +0 -337
  515. package/dist/roap/handler.js.map +0 -1
  516. package/dist/roap/state.js +0 -164
  517. package/dist/roap/state.js.map +0 -1
  518. package/dist/roap/util.js +0 -102
  519. package/dist/roap/util.js.map +0 -1
  520. package/src/common/logs/logger-proxy.js +0 -33
  521. package/src/index.js +0 -15
  522. package/src/locus-info/controlsUtils.js +0 -102
  523. package/src/media/index.js +0 -593
  524. package/src/media/util.js +0 -38
  525. package/src/mediaQualityMetrics/config.js +0 -382
  526. package/src/meeting/effectsState.js +0 -205
  527. package/src/meeting/muteState.js +0 -318
  528. package/src/meeting-info/meeting-info-v2.js +0 -255
  529. package/src/meetings/index.js +0 -986
  530. package/src/meetings/util.js +0 -176
  531. package/src/members/request.js +0 -131
  532. package/src/peer-connection-manager/index.js +0 -723
  533. package/src/peer-connection-manager/util.ts +0 -117
  534. package/src/roap/collection.js +0 -63
  535. package/src/roap/handler.js +0 -252
  536. package/src/roap/index.js +0 -380
  537. package/src/roap/request.js +0 -198
  538. package/src/roap/state.js +0 -149
  539. package/src/roap/util.js +0 -93
  540. package/src/statsAnalyzer/global.js +0 -131
  541. package/src/statsAnalyzer/index.js +0 -1020
  542. package/src/statsAnalyzer/mqaUtil.js +0 -173
  543. package/test/unit/spec/meeting/effectsState.js +0 -293
  544. package/test/unit/spec/peerconnection-manager/index.js +0 -188
  545. package/test/unit/spec/peerconnection-manager/utils.js +0 -48
  546. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  547. package/test/unit/spec/roap/util.js +0 -30
  548. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -5,10 +5,11 @@ import {assert} from '@webex/test-helper-chai';
5
5
  import {skipInNode} from '@webex/test-helper-mocha';
6
6
  import sinon from 'sinon';
7
7
 
8
- import BrowserDetection from '@webex/plugin-meetings/src/common/browser-detection';
8
+ import BrowserDetection from '@webex/plugin-meetings/dist/common/browser-detection';
9
9
 
10
10
  import DEFAULT_RESOLUTIONS from '../../../src/config';
11
11
  import testUtils from '../../utils/testUtils';
12
+ import integrationTestUtils from '../../utils/integrationTestUtils';
12
13
 
13
14
  require('dotenv').config();
14
15
 
@@ -20,29 +21,35 @@ let userSet, alice, bob, chris, enumerateSpy, channelUrlA, channelUrlB;
20
21
 
21
22
  skipInNode(describe)('plugin-meetings', () => {
22
23
  describe('journey', () => {
23
- before(() => webexTestUsers.generateTestUsers({
24
- count: 3,
25
- whistler: process.env.WHISTLER || process.env.JENKINS
26
- })
27
- .then((users) => {
28
- userSet = users;
29
- alice = userSet[0];
30
- bob = userSet[1];
31
- chris = userSet[2];
32
- alice.name = 'alice';
33
- bob.name = 'bob';
34
- chris.name = 'chris';
35
- alice.webex.meetings.name = 'alice';
36
- bob.webex.meetings.name = 'bob';
37
- chris.webex.meetings.name = 'chris';
38
- channelUrlA = 'https://board-a.wbx2.com/board/api/v1/channels/49cfb550-5517-11eb-a2af-1b9e4bc3da13';
39
- channelUrlB = 'https://board-a.wbx2.com/board/api/v1/channels/977a7330-54f4-11eb-b1ef-91f5eefc7bf3';
40
- })
41
- .then(() => Promise.all([testUtils.syncAndEndMeeting(alice),
42
- testUtils.syncAndEndMeeting(bob)]))
43
- .catch((error) => {
44
- throw error;
45
- }));
24
+ before(() =>
25
+ webexTestUsers
26
+ .generateTestUsers({
27
+ count: 3,
28
+ whistler: process.env.WHISTLER || process.env.JENKINS,
29
+ })
30
+ .then((users) => {
31
+ userSet = users;
32
+ alice = userSet[0];
33
+ bob = userSet[1];
34
+ chris = userSet[2];
35
+ alice.name = 'alice';
36
+ bob.name = 'bob';
37
+ chris.name = 'chris';
38
+ alice.webex.meetings.name = 'alice';
39
+ bob.webex.meetings.name = 'bob';
40
+ chris.webex.meetings.name = 'chris';
41
+ channelUrlA =
42
+ 'https://board-a.wbx2.com/board/api/v1/channels/49cfb550-5517-11eb-a2af-1b9e4bc3da13';
43
+ channelUrlB =
44
+ 'https://board-a.wbx2.com/board/api/v1/channels/977a7330-54f4-11eb-b1ef-91f5eefc7bf3';
45
+ })
46
+ .then(() =>
47
+ Promise.all([testUtils.syncAndEndMeeting(alice), testUtils.syncAndEndMeeting(bob)])
48
+ )
49
+ .catch((error) => {
50
+ throw error;
51
+ })
52
+ );
46
53
 
47
54
  before(() => {
48
55
  enumerateSpy = sinon.spy(navigator.mediaDevices, 'enumerateDevices');
@@ -68,40 +75,51 @@ skipInNode(describe)('plugin-meetings', () => {
68
75
  bob.meeting = null;
69
76
  });
70
77
 
71
- it('Alice Ends a outgoing meeting', () => Promise.all([
72
- testUtils.delayedPromise(alice.webex.meetings.create(bob.emailAddress)),
73
- testUtils.waitForEvents([{scope: alice.webex.meetings, event: 'meeting:added', user: alice}])
74
- ])
75
- .then(() => Promise.all([
76
- testUtils.delayedPromise(alice.meeting.join()),
77
- testUtils.waitForEvents([{scope: bob.webex.meetings, event: 'meeting:added', user: bob}])
78
- ]))
79
- .then(() => {
80
- // bob and alice have meeting object
81
- bob.meeting.acknowledge('INCOMING');
82
- assert.equal(bob.meeting.sipUri, alice.emailAddress);
83
- assert.equal(alice.meeting.sipUri, bob.emailAddress);
84
- assert.equal(bob.meeting.state, 'IDLE');
85
- assert.equal(alice.meeting.state, 'JOINED');
86
- })
87
- .then(function aliceLeavesMeetingAndBobGetsMeetingRemoved() {
88
- return Promise.all([
89
- testUtils.delayedPromise(alice.meeting.leave()),
90
- testUtils.waitForEvents([{scope: bob.webex.meetings, event: 'meeting:removed', user: bob}])
91
- ]);
92
- })
93
- .then(() => testUtils.waitForStateChange(alice.meeting, 'LEFT'))
94
- .then(() => Promise.all([
95
- testUtils.waitForCallEnded(alice, bob.emailAddress),
96
- testUtils.waitForCallEnded(bob, alice.emailAddress)
97
- ]))
98
- .then(() => {
99
- assert.equal(alice.webex.meetings.getMeetingByType('sipUri', bob.emailAddress), null);
100
- assert.equal(bob.webex.meetings.getMeetingByType('sipUri', alice.emailAddress), null);
101
- })
102
- .catch((err) => {
103
- throw err;
104
- }));
78
+ it('Alice Ends a outgoing meeting', () =>
79
+ Promise.all([
80
+ testUtils.delayedPromise(alice.webex.meetings.create(bob.emailAddress)),
81
+ testUtils.waitForEvents([
82
+ {scope: alice.webex.meetings, event: 'meeting:added', user: alice},
83
+ ]),
84
+ ])
85
+ .then(() =>
86
+ Promise.all([
87
+ testUtils.delayedPromise(alice.meeting.join()),
88
+ testUtils.waitForEvents([
89
+ {scope: bob.webex.meetings, event: 'meeting:added', user: bob},
90
+ ]),
91
+ ])
92
+ )
93
+ .then(() => {
94
+ // bob and alice have meeting object
95
+ bob.meeting.acknowledge('INCOMING');
96
+ assert.equal(bob.meeting.sipUri, alice.emailAddress);
97
+ assert.equal(alice.meeting.sipUri, bob.emailAddress);
98
+ assert.equal(bob.meeting.state, 'IDLE');
99
+ assert.equal(alice.meeting.state, 'JOINED');
100
+ })
101
+ .then(function aliceLeavesMeetingAndBobGetsMeetingRemoved() {
102
+ return Promise.all([
103
+ testUtils.delayedPromise(alice.meeting.leave()),
104
+ testUtils.waitForEvents([
105
+ {scope: bob.webex.meetings, event: 'meeting:removed', user: bob},
106
+ ]),
107
+ ]);
108
+ })
109
+ .then(() => testUtils.waitForStateChange(alice.meeting, 'LEFT'))
110
+ .then(() =>
111
+ Promise.all([
112
+ testUtils.waitForCallEnded(alice, bob.emailAddress),
113
+ testUtils.waitForCallEnded(bob, alice.emailAddress),
114
+ ])
115
+ )
116
+ .then(() => {
117
+ assert.equal(alice.webex.meetings.getMeetingByType('sipUri', bob.emailAddress), null);
118
+ assert.equal(bob.webex.meetings.getMeetingByType('sipUri', alice.emailAddress), null);
119
+ })
120
+ .catch((err) => {
121
+ throw err;
122
+ }));
105
123
  });
106
124
 
107
125
  // The event was coming but incomplete
@@ -109,62 +127,77 @@ skipInNode(describe)('plugin-meetings', () => {
109
127
 
110
128
  // Alice calls bob and bob rejects it
111
129
  xdescribe('reject Incoming Call', () => {
112
- it('alice dials bob and bob receives meeting added', () => Promise.all([
113
- testUtils.delayedPromise(alice.webex.meetings.create(bob.emailAddress)),
114
- testUtils.waitForEvents([{scope: alice.webex.meetings, event: 'meeting:added', user: alice}])
115
- ])
116
- .then(() => Promise.all([
117
- testUtils.delayedPromise(alice.meeting.join()),
118
- testUtils.waitForEvents([{scope: bob.webex.meetings, event: 'meeting:added', user: bob}])
119
- ]))
120
- .then(function alicebobJoined() {
121
- assert.exists(bob.meeting);
122
- assert.exists(alice.meeting);
123
- assert.equal(bob.meeting.sipUri, alice.emailAddress);
124
- assert.equal(alice.meeting.sipUri, bob.emailAddress);
125
- assert.exists(bob.meeting.partner);
126
- assert.exists(alice.meeting.partner);
127
- })
128
- .then(function bobState() {
129
- testUtils.waitForStateChange(bob.meeting, 'IDLE');
130
- })
131
- .then(function aliceState() {
132
- testUtils.waitForStateChange(alice.meeting, 'JOINED');
133
- })
134
- .then(function bobDeclinedCall() {
135
- return bob.meeting.acknowledge('INCOMING')
136
- .then(() => bob.meeting.decline('BUSY'))
137
- .then(() => testUtils.waitForStateChange(bob.meeting, 'DECLINED'))
138
- .catch((e) => {
139
- console.error('Bob decline call not successful', e);
140
- throw e;
141
- });
142
- })
143
- .then(function aliceLeaveMeeting() {
144
- assert.equal(alice.meeting.state, 'JOINED');
145
-
146
- return alice.meeting.leave()
147
- .then(() => testUtils.waitForStateChange(alice.meeting, 'LEFT'))
148
- .then(() => testUtils.waitForStateChange(bob.meeting, 'DECLINED'))
149
- .catch((e) => {
150
- console.error('alice was not able to leave the meeting', e);
151
- throw e;
152
- });
153
- })
154
- .then(function WaitForMeetingEnd() {
155
- return Promise.all([
156
- testUtils.waitForCallEnded(alice, bob.emailAddress),
157
- testUtils.waitForCallEnded(bob, alice.emailAddress)
158
- ])
159
- .then(() => {
160
- assert.equal(alice.webex.meetings.getMeetingByType('sipUri', bob.emailAddress), null);
161
- assert.equal(bob.webex.meetings.getMeetingByType('sipUri', alice.emailAddress), null);
162
- })
163
- .catch((e) => {
164
- console.error('Alice bob meeting is deleted', e);
165
- throw e;
166
- });
167
- }));
130
+ it('alice dials bob and bob receives meeting added', () =>
131
+ Promise.all([
132
+ testUtils.delayedPromise(alice.webex.meetings.create(bob.emailAddress)),
133
+ testUtils.waitForEvents([
134
+ {scope: alice.webex.meetings, event: 'meeting:added', user: alice},
135
+ ]),
136
+ ])
137
+ .then(() =>
138
+ Promise.all([
139
+ testUtils.delayedPromise(alice.meeting.join()),
140
+ testUtils.waitForEvents([
141
+ {scope: bob.webex.meetings, event: 'meeting:added', user: bob},
142
+ ]),
143
+ ])
144
+ )
145
+ .then(function alicebobJoined() {
146
+ assert.exists(bob.meeting);
147
+ assert.exists(alice.meeting);
148
+ assert.equal(bob.meeting.sipUri, alice.emailAddress);
149
+ assert.equal(alice.meeting.sipUri, bob.emailAddress);
150
+ assert.exists(bob.meeting.partner);
151
+ assert.exists(alice.meeting.partner);
152
+ })
153
+ .then(function bobState() {
154
+ testUtils.waitForStateChange(bob.meeting, 'IDLE');
155
+ })
156
+ .then(function aliceState() {
157
+ testUtils.waitForStateChange(alice.meeting, 'JOINED');
158
+ })
159
+ .then(function bobDeclinedCall() {
160
+ return bob.meeting
161
+ .acknowledge('INCOMING')
162
+ .then(() => bob.meeting.decline('BUSY'))
163
+ .then(() => testUtils.waitForStateChange(bob.meeting, 'DECLINED'))
164
+ .catch((e) => {
165
+ console.error('Bob decline call not successful', e);
166
+ throw e;
167
+ });
168
+ })
169
+ .then(function aliceLeaveMeeting() {
170
+ assert.equal(alice.meeting.state, 'JOINED');
171
+
172
+ return alice.meeting
173
+ .leave()
174
+ .then(() => testUtils.waitForStateChange(alice.meeting, 'LEFT'))
175
+ .then(() => testUtils.waitForStateChange(bob.meeting, 'DECLINED'))
176
+ .catch((e) => {
177
+ console.error('alice was not able to leave the meeting', e);
178
+ throw e;
179
+ });
180
+ })
181
+ .then(function WaitForMeetingEnd() {
182
+ return Promise.all([
183
+ testUtils.waitForCallEnded(alice, bob.emailAddress),
184
+ testUtils.waitForCallEnded(bob, alice.emailAddress),
185
+ ])
186
+ .then(() => {
187
+ assert.equal(
188
+ alice.webex.meetings.getMeetingByType('sipUri', bob.emailAddress),
189
+ null
190
+ );
191
+ assert.equal(
192
+ bob.webex.meetings.getMeetingByType('sipUri', alice.emailAddress),
193
+ null
194
+ );
195
+ })
196
+ .catch((e) => {
197
+ console.error('Alice bob meeting is deleted', e);
198
+ throw e;
199
+ });
200
+ }));
168
201
  });
169
202
 
170
203
  // Enabled when config.enableUnifiedMeetings = true
@@ -174,30 +207,42 @@ skipInNode(describe)('plugin-meetings', () => {
174
207
  assert.equal(Object.keys(bob.webex.meetings.getAllMeetings()), 0);
175
208
  assert.equal(Object.keys(chris.webex.meetings.getAllMeetings()), 0);
176
209
 
177
- const conversation = await chris.webex.internal.conversation.create({participants: [bob]});
210
+ const conversation = await chris.webex.internal.conversation.create({
211
+ participants: [bob],
212
+ });
178
213
 
179
- await chris.webex.internal.conversation.post(conversation, {displayName: 'hello world how are you '});
214
+ await chris.webex.internal.conversation.post(conversation, {
215
+ displayName: 'hello world how are you ',
216
+ });
180
217
 
181
218
  await Promise.all([
182
- testUtils.delayedPromise(chris.webex.meetings.create(conversation.url, 'CONVERSATION_URL')),
183
- testUtils.waitForEvents([{scope: chris.webex.meetings, event: 'meeting:added', user: chris}])
184
- ])
185
- .then(function chrisJoinsMeeting() {
186
- return Promise.all([
187
- testUtils.delayedPromise(chris.meeting.join()),
188
- testUtils.waitForEvents([{scope: bob.webex.meetings, event: 'meeting:added', user: bob},
189
- {scope: chris.meeting, event: 'meeting:stateChange', user: chris}])
190
- .then((response) => {
191
- assert.equal(response[0].result.payload.currentState, 'ACTIVE');
192
- })
193
- ]);
194
- });
219
+ testUtils.delayedPromise(
220
+ chris.webex.meetings.create(conversation.url, 'CONVERSATION_URL')
221
+ ),
222
+ testUtils.waitForEvents([
223
+ {scope: chris.webex.meetings, event: 'meeting:added', user: chris},
224
+ ]),
225
+ ]).then(function chrisJoinsMeeting() {
226
+ return Promise.all([
227
+ testUtils.delayedPromise(chris.meeting.join()),
228
+ testUtils
229
+ .waitForEvents([
230
+ {scope: bob.webex.meetings, event: 'meeting:added', user: bob},
231
+ {scope: chris.meeting, event: 'meeting:stateChange', user: chris},
232
+ ])
233
+ .then((response) => {
234
+ assert.equal(response[0].result.payload.currentState, 'ACTIVE');
235
+ }),
236
+ ]);
237
+ });
195
238
  });
196
239
 
197
240
  it('Fetch meeting information with invalid conversation URL and throws error', () => {
198
- chris.webex.meetings.meetingInfo.fetchMeetingInfo('http://some-invalid.com', 'CONVERSATION_URL').then((response) => {
199
- assert(response.result === '404');
200
- });
241
+ chris.webex.meetings.meetingInfo
242
+ .fetchMeetingInfo('http://some-invalid.com', 'CONVERSATION_URL')
243
+ .then((response) => {
244
+ assert(response.result === '404');
245
+ });
201
246
  });
202
247
  });
203
248
  });
@@ -207,7 +252,11 @@ skipInNode(describe)('plugin-meetings', () => {
207
252
  // Workaround since getDisplayMedia requires a user gesture to be activated, and this is a integration tests
208
253
  // https://bugzilla.mozilla.org/show_bug.cgi?id=1580944
209
254
  if (isBrowser('firefox') || isBrowser('safari')) {
210
- sinon.replace(navigator.mediaDevices, 'getDisplayMedia', navigator.mediaDevices.getUserMedia);
255
+ sinon.replace(
256
+ navigator.mediaDevices,
257
+ 'getDisplayMedia',
258
+ navigator.mediaDevices.getUserMedia
259
+ );
211
260
  }
212
261
 
213
262
  this.timeout(80000);
@@ -217,76 +266,100 @@ skipInNode(describe)('plugin-meetings', () => {
217
266
  assert.equal(Object.keys(bob.webex.meetings.getAllMeetings()), 0);
218
267
  assert.equal(Object.keys(alice.webex.meetings.getAllMeetings()), 0);
219
268
 
220
- return alice.webex.internal.conversation.create({participants: [bob]})
221
- .then((conversation) => alice.webex.internal.conversation.post(conversation, {displayName: 'hello world how are you '}));
269
+ return alice.webex.internal.conversation
270
+ .create({participants: [bob]})
271
+ .then((conversation) =>
272
+ alice.webex.internal.conversation.post(conversation, {
273
+ displayName: 'hello world how are you ',
274
+ })
275
+ );
222
276
  });
223
277
 
224
- it('alice dials bob and adds media', () => Promise.all([
225
- testUtils.delayedPromise(alice.webex.meetings.create(bob.emailAddress)),
226
- testUtils.waitForEvents([{scope: alice.webex.meetings, event: 'meeting:added', user: alice}])
227
- ])
228
- .then(function aliceJoinsMeeting() {
229
- return Promise.all([
230
- testUtils.delayedPromise(alice.meeting.join()),
231
- testUtils.waitForEvents([{scope: bob.webex.meetings, event: 'meeting:added', user: bob},
232
- {scope: alice.meeting, event: 'meeting:stateChange', user: alice}])
233
- .then((response) => {
234
- assert.equal(response[0].result.payload.currentState, 'ACTIVE');
235
- })
236
- ]);
237
- })
238
- .then(() => {
239
- assert.equal(bob.meeting.partner.state, 'JOINED');
240
- // Wait for openH264 to finsish downloading and peerConnection to be stable
241
- testUtils.waitUntil(4000);
242
- })
243
- .then(() => Promise.all([
244
- testUtils.addMedia(alice),
278
+ it('alice dials bob and adds media', () =>
279
+ Promise.all([
280
+ testUtils.delayedPromise(alice.webex.meetings.create(bob.emailAddress)),
245
281
  testUtils.waitForEvents([
246
- {scope: alice.meeting, event: 'meeting:media:local:start', user: alice}
247
- ])
248
- ]))
249
- .then(() => assert(enumerateSpy.called)));
282
+ {scope: alice.webex.meetings, event: 'meeting:added', user: alice},
283
+ ]),
284
+ ])
285
+ .then(function aliceJoinsMeeting() {
286
+ return Promise.all([
287
+ testUtils.delayedPromise(alice.meeting.join()),
288
+ testUtils
289
+ .waitForEvents([
290
+ {scope: bob.webex.meetings, event: 'meeting:added', user: bob},
291
+ {scope: alice.meeting, event: 'meeting:stateChange', user: alice},
292
+ ])
293
+ .then((response) => {
294
+ assert.equal(response[0].result.payload.currentState, 'ACTIVE');
295
+ }),
296
+ ]);
297
+ })
298
+ .then(() => {
299
+ assert.equal(bob.meeting.partner.state, 'JOINED');
300
+ // Wait for openH264 to finsish downloading and peerConnection to be stable
301
+ testUtils.waitUntil(4000);
302
+ })
303
+ .then(() =>
304
+ Promise.all([
305
+ integrationTestUtils.addMedia(alice),
306
+ testUtils.waitForEvents([
307
+ {scope: alice.meeting, event: 'meeting:media:local:start', user: alice},
308
+ ]),
309
+ ])
310
+ )
311
+ .then(() => assert(enumerateSpy.called)));
250
312
 
251
313
  it('bob joins the meeting', () => {
252
- const checkBobIsInMeeting = (event) => !!event.delta.updated.find((member) => bob.meeting.members.selfId === member.id && member.status === 'IN_MEETING');
314
+ const checkBobIsInMeeting = (event) =>
315
+ !!event.delta.updated.find(
316
+ (member) => bob.meeting.members.selfId === member.id && member.status === 'IN_MEETING'
317
+ );
253
318
 
254
319
  return Promise.all([
255
320
  bob.meeting.acknowledge('INCOMING').then(() => bob.meeting.join()),
256
- testUtils.waitForEvents([{
257
- scope: alice.meeting.members, event: 'members:update', user: alice, match: checkBobIsInMeeting
258
- }])
321
+ testUtils.waitForEvents([
322
+ {
323
+ scope: alice.meeting.members,
324
+ event: 'members:update',
325
+ user: alice,
326
+ match: checkBobIsInMeeting,
327
+ },
328
+ ]),
259
329
  ]);
260
330
  });
261
331
 
262
- it('bob adds media to the meeting', () => Promise.all([
263
- testUtils.addMedia(bob),
264
- testUtils.waitForEvents([
265
- {scope: bob.meeting, event: 'meeting:media:local:start', user: bob},
266
- {scope: alice.meeting, event: 'meeting:media:remote:start', user: alice}
267
- ]).catch((e) => {
268
- console.error('Error on remote and local start event', e);
269
- throw e;
270
- })
271
- ])
272
- .then(() => {
273
- assert.equal(bob.meeting.sipUri, alice.id);
274
- assert.equal(alice.meeting.sipUri, bob.id);
275
- assert.exists(alice.meeting.members.locusUrl);
276
- assert.equal(alice.meeting.type, 'CALL');
277
- assert.equal(bob.meeting.type, 'CALL');
278
- assert(enumerateSpy.called);
279
- })
280
- .then(function bobState() {
281
- testUtils.waitForStateChange(bob.meeting, 'JOINED');
282
- })
283
- .then(function aliceState() {
284
- testUtils.waitForStateChange(alice.meeting, 'JOINED');
285
- })
286
- .catch((e) => {
287
- console.error('Error bob joins the meeting ', e);
288
- throw e;
289
- }));
332
+ it('bob adds media to the meeting', () =>
333
+ Promise.all([
334
+ integrationTestUtils.addMedia(bob),
335
+ testUtils
336
+ .waitForEvents([
337
+ {scope: bob.meeting, event: 'meeting:media:local:start', user: bob},
338
+ {scope: alice.meeting, event: 'meeting:media:remote:start', user: alice},
339
+ ])
340
+ .catch((e) => {
341
+ console.error('Error on remote and local start event', e);
342
+ throw e;
343
+ }),
344
+ ])
345
+ .then(() => {
346
+ assert.equal(bob.meeting.sipUri, alice.id);
347
+ assert.equal(alice.meeting.sipUri, bob.id);
348
+ assert.exists(alice.meeting.members.locusUrl);
349
+ assert.equal(alice.meeting.type, 'CALL');
350
+ assert.equal(bob.meeting.type, 'CALL');
351
+ assert(enumerateSpy.called);
352
+ })
353
+ .then(function bobState() {
354
+ testUtils.waitForStateChange(bob.meeting, 'JOINED');
355
+ })
356
+ .then(function aliceState() {
357
+ testUtils.waitForStateChange(alice.meeting, 'JOINED');
358
+ })
359
+ .catch((e) => {
360
+ console.error('Error bob joins the meeting ', e);
361
+ throw e;
362
+ }));
290
363
 
291
364
  it('check for meeting properties', () => {
292
365
  assert.exists(alice.meeting.userId, 'userId not present');
@@ -301,136 +374,183 @@ skipInNode(describe)('plugin-meetings', () => {
301
374
  });
302
375
 
303
376
  it('alice Audio Mute ', () => {
304
- const checkEvent = (event) => !!event.delta.updated.find((member) => alice.meeting.members.selfId === member.id && member.isAudioMuted === true);
305
-
377
+ const checkEvent = (event) =>
378
+ !!event.delta.updated.find(
379
+ (member) => alice.meeting.members.selfId === member.id && member.isAudioMuted === true
380
+ );
306
381
 
307
382
  return Promise.all([
308
383
  testUtils.delayedPromise(alice.meeting.muteAudio()),
309
- testUtils.waitForEvents([{scope: bob.meeting.members, event: 'members:update', match: checkEvent}])
310
- ])
311
- .then(() => {
312
- assert.equal(alice.meeting.audio.muted, true);
313
- assert.equal(alice.meeting.isAudioMuted(), true);
314
- });
384
+ testUtils.waitForEvents([
385
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
386
+ ]),
387
+ ]).then(() => {
388
+ assert.equal(alice.meeting.audio.muted, true);
389
+ assert.equal(alice.meeting.isAudioMuted(), true);
390
+ });
315
391
  });
316
392
 
317
393
  it('alice Audio unMute ', () => {
318
- const checkEvent = (event) => !!event.delta.updated.find((member) => alice.meeting.members.selfId === member.id && member.isAudioMuted === false);
394
+ const checkEvent = (event) =>
395
+ !!event.delta.updated.find(
396
+ (member) => alice.meeting.members.selfId === member.id && member.isAudioMuted === false
397
+ );
319
398
 
320
399
  return Promise.all([
321
400
  testUtils.delayedPromise(alice.meeting.unmuteAudio()),
322
- testUtils.waitForEvents([{scope: bob.meeting.members, event: 'members:update', match: checkEvent}])
323
- ])
324
- .then(() => {
325
- assert.equal(alice.meeting.audio.muted, false);
326
- assert.equal(alice.meeting.isAudioMuted(), false);
327
- });
401
+ testUtils.waitForEvents([
402
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
403
+ ]),
404
+ ]).then(() => {
405
+ assert.equal(alice.meeting.audio.muted, false);
406
+ assert.equal(alice.meeting.isAudioMuted(), false);
407
+ });
328
408
  });
329
409
 
330
410
  it('alice Video Mute', () => {
331
- const checkEvent = (event) => !!event.delta.updated.find((member) => alice.meeting.members.selfId === member.id && member.isVideoMuted === true);
411
+ const checkEvent = (event) =>
412
+ !!event.delta.updated.find(
413
+ (member) => alice.meeting.members.selfId === member.id && member.isVideoMuted === true
414
+ );
332
415
 
333
416
  return Promise.all([
334
417
  testUtils.delayedPromise(alice.meeting.muteVideo()),
335
- testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update', match: checkEvent}])
336
- ])
337
- .then(() => {
338
- assert.equal(alice.meeting.video.muted, true);
339
- assert.equal(alice.meeting.isVideoMuted(), true);
340
- });
418
+ testUtils.waitForEvents([
419
+ {scope: alice.meeting.members, event: 'members:update', match: checkEvent},
420
+ ]),
421
+ ]).then(() => {
422
+ assert.equal(alice.meeting.video.muted, true);
423
+ assert.equal(alice.meeting.isVideoMuted(), true);
424
+ });
341
425
  });
342
426
 
343
427
  it('alice video unMute', () => {
344
- const checkEvent = (event) => !!event.delta.updated.find((member) => alice.meeting.members.selfId === member.id && member.isVideoMuted === false);
428
+ const checkEvent = (event) =>
429
+ !!event.delta.updated.find(
430
+ (member) => alice.meeting.members.selfId === member.id && member.isVideoMuted === false
431
+ );
345
432
 
346
433
  return Promise.all([
347
434
  testUtils.delayedPromise(alice.meeting.unmuteVideo()),
348
- testUtils.waitForEvents([{scope: bob.meeting.members, event: 'members:update', match: checkEvent}])
349
- ])
350
- .then(() => {
351
- assert.equal(alice.meeting.video.muted, false);
352
- assert.equal(alice.meeting.isVideoMuted(), false);
353
- });
435
+ testUtils.waitForEvents([
436
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
437
+ ]),
438
+ ]).then(() => {
439
+ assert.equal(alice.meeting.video.muted, false);
440
+ assert.equal(alice.meeting.isVideoMuted(), false);
441
+ });
354
442
  });
355
443
 
356
444
  it('alice update Audio', () => {
357
445
  const oldVideoTrackId = alice.meeting.mediaProperties.videoTrack.id;
358
446
 
359
- return alice.meeting.getMediaStreams({sendAudio: true})
360
- .then((response) => Promise.all([
361
- testUtils.delayedPromise(alice.meeting.updateAudio({
362
- sendAudio: true,
363
- receiveAudio: true,
364
- stream: response[0]
365
- })
366
- .then(() => {
367
- console.log('AUDIO ', alice.meeting.mediaProperties.peerConnection.audioTransceiver.sender.track);
368
- assert.equal(alice.meeting.mediaProperties.audioTrack.id, response[0].getAudioTracks()[0].id);
369
- assert.equal(alice.meeting.mediaProperties.videoTrack.id, oldVideoTrackId);
370
- })),
371
- testUtils.waitForEvents([{scope: alice.meeting, event: 'media:ready'}])
447
+ return alice.meeting.getMediaStreams({sendAudio: true}).then((response) =>
448
+ Promise.all([
449
+ testUtils.delayedPromise(
450
+ alice.meeting
451
+ .updateAudio({
452
+ sendAudio: true,
453
+ receiveAudio: true,
454
+ stream: response[0],
455
+ })
456
+ .then(() => {
457
+ console.log('AUDIO ', alice.meeting.mediaProperties.audioTrack);
458
+ assert.equal(
459
+ alice.meeting.mediaProperties.audioTrack.id,
460
+ response[0].getAudioTracks()[0].id
461
+ );
462
+ assert.equal(alice.meeting.mediaProperties.videoTrack.id, oldVideoTrackId);
463
+ })
464
+ ),
465
+ testUtils
466
+ .waitForEvents([{scope: alice.meeting, event: 'media:ready'}])
372
467
  .then((response) => {
373
468
  console.log('MEDIA:READY event ', response[0].result);
374
469
  assert.equal(response[0].result.type === 'local', true);
375
- })
376
- ]));
470
+ }),
471
+ ])
472
+ );
377
473
  });
378
474
 
379
475
  it('alice update video', () => {
380
476
  const oldAudioTrackId = alice.meeting.mediaProperties.audioTrack.id;
381
477
 
382
- return alice.meeting.getMediaStreams({sendVideo: true})
383
- .then((response) => Promise.all([
384
- testUtils.delayedPromise(alice.meeting.updateVideo({
385
- sendVideo: true,
386
- receiveVideo: true,
387
- stream: response[0]
388
- })
389
- .then(() => {
390
- assert.equal(alice.meeting.mediaProperties.videoTrack.id, response[0].getVideoTracks()[0].id);
391
- assert.equal(alice.meeting.mediaProperties.audioTrack.id, oldAudioTrackId);
392
- })),
393
- testUtils.waitForEvents([{scope: alice.meeting, event: 'media:ready'}])
478
+ return alice.meeting.getMediaStreams({sendVideo: true}).then((response) =>
479
+ Promise.all([
480
+ testUtils.delayedPromise(
481
+ alice.meeting
482
+ .updateVideo({
483
+ sendVideo: true,
484
+ receiveVideo: true,
485
+ stream: response[0],
486
+ })
487
+ .then(() => {
488
+ assert.equal(
489
+ alice.meeting.mediaProperties.videoTrack.id,
490
+ response[0].getVideoTracks()[0].id
491
+ );
492
+ assert.equal(alice.meeting.mediaProperties.audioTrack.id, oldAudioTrackId);
493
+ })
494
+ ),
495
+ testUtils
496
+ .waitForEvents([{scope: alice.meeting, event: 'media:ready'}])
394
497
  .then((response) => {
395
498
  console.log('MEDIA:READY event ', response[0].result);
396
499
  assert.equal(response[0].result.type === 'local', true);
397
- })
398
- ]));
500
+ }),
501
+ ])
502
+ );
399
503
  });
400
504
 
401
- it('alice mutes bob', () => Promise.all([
402
- testUtils.delayedPromise(alice.meeting.mute(bob.meeting.members.selfId, true)),
403
- testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:self:mutedByOthers'}])
404
- .then((response) => {
405
- console.log('meeting:self:mutedByOthers event ', response[0].result);
406
- assert.equal(response[0].result.payload.unmuteAllowed, true);
407
- })
408
- ]));
409
-
410
- it('alice unmutes bob', () => Promise.all([
411
- testUtils.delayedPromise(alice.meeting.mute(bob.meeting.members.selfId, false)),
412
- testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:self:unmutedByOthers'}])
413
- .then((response) => {
414
- console.log('meeting:self:unmutedByOthers event ', response[0].result);
415
- })
416
- ]));
505
+ it('alice mutes bob', () =>
506
+ Promise.all([
507
+ testUtils.delayedPromise(alice.meeting.mute(bob.meeting.members.selfId, true)),
508
+ testUtils
509
+ .waitForEvents([{scope: bob.meeting, event: 'meeting:self:mutedByOthers'}])
510
+ .then((response) => {
511
+ console.log('meeting:self:mutedByOthers event ', response[0].result);
512
+ assert.equal(response[0].result.payload.unmuteAllowed, true);
513
+ }),
514
+ ]));
515
+
516
+ it('alice unmutes bob', () =>
517
+ Promise.all([
518
+ testUtils.delayedPromise(alice.meeting.mute(bob.meeting.members.selfId, false)),
519
+ testUtils
520
+ .waitForEvents([{scope: bob.meeting, event: 'meeting:self:unmutedByOthers'}])
521
+ .then((response) => {
522
+ console.log('meeting:self:unmutedByOthers event ', response[0].result);
523
+ }),
524
+ ]));
417
525
 
418
526
  it('bob audio mute, so alice cannot unmute bob', (done) => {
419
- const checkEvent = (event) => !!event.delta.updated.find((member) => bob.meeting.members.selfId === member.id && member.isAudioMuted === true);
527
+ const checkEvent = (event) =>
528
+ !!event.delta.updated.find(
529
+ (member) => bob.meeting.members.selfId === member.id && member.isAudioMuted === true
530
+ );
420
531
 
421
532
  // first bob mutes himself
422
533
  Promise.all([
423
534
  testUtils.delayedPromise(bob.meeting.muteAudio()),
424
- testUtils.waitForEvents([{scope: bob.meeting.members, event: 'members:update', match: checkEvent}])
535
+ testUtils.waitForEvents([
536
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
537
+ ]),
425
538
  ])
426
539
  .then(() => {
427
540
  assert.equal(bob.meeting.audio.muted, true);
428
541
  assert.equal(bob.meeting.isAudioMuted(), true);
429
542
  })
430
543
  // now alice tries to unmmut bob
431
- .then(() => testUtils.delayedPromise(alice.meeting.mute(bob.meeting.members.selfId, false)))
544
+ .then(() =>
545
+ testUtils.delayedPromise(alice.meeting.mute(bob.meeting.members.selfId, false))
546
+ )
432
547
  // expect the waitForEvents to timeout
433
- .then(() => testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:self:unmutedByOthers'}], 2000))
548
+ .then(() =>
549
+ testUtils.waitForEvents(
550
+ [{scope: bob.meeting, event: 'meeting:self:unmutedByOthers'}],
551
+ 2000
552
+ )
553
+ )
434
554
  .then(() => {
435
555
  assert.fail('bob received unexpected meeting:self:unmutedByOthers event');
436
556
  })
@@ -442,74 +562,94 @@ skipInNode(describe)('plugin-meetings', () => {
442
562
  });
443
563
 
444
564
  it('bob audio unmute ', () => {
445
- const checkEvent = (event) => !!event.delta.updated.find((member) => bob.meeting.members.selfId === member.id && member.isAudioMuted === false);
565
+ const checkEvent = (event) =>
566
+ !!event.delta.updated.find(
567
+ (member) => bob.meeting.members.selfId === member.id && member.isAudioMuted === false
568
+ );
446
569
 
447
570
  return Promise.all([
448
571
  testUtils.delayedPromise(bob.meeting.unmuteAudio()),
449
- testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update', match: checkEvent}])
450
- ])
451
- .then(() => {
452
- assert.equal(bob.meeting.audio.muted, false);
453
- assert.equal(bob.meeting.isAudioMuted(), false);
454
- });
572
+ testUtils.waitForEvents([
573
+ {scope: alice.meeting.members, event: 'members:update', match: checkEvent},
574
+ ]),
575
+ ]).then(() => {
576
+ assert.equal(bob.meeting.audio.muted, false);
577
+ assert.equal(bob.meeting.isAudioMuted(), false);
578
+ });
455
579
  });
456
580
 
457
- it('alice shares the screen with highFrameRate', () => Promise.all([
458
- testUtils.delayedPromise(alice.meeting.shareScreen({sharePreferences: {highFrameRate: true}})),
459
- testUtils.waitForEvents([
460
- {scope: alice.meeting, event: 'meeting:startedSharingLocal'}
461
- ]),
462
- testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingRemote'}])
463
- .then((response) => {
464
- assert.equal(response[0].result.memberId, alice.meeting.selfId);
465
- }),
466
- testUtils.waitForEvents([{scope: bob.meeting.members, event: 'members:update'}])
467
- .then((response) => {
468
- console.log('SCREEN SHARE RESPONSE ', JSON.stringify(response, testUtils.getCircularReplacer()));
469
- }),
470
- testUtils.waitForEvents([{scope: alice.meeting, event: 'media:ready'}])
471
- .then((response) => {
472
- console.log('MEDIA:READY event ', response[0].result);
473
- assert.equal(response[0].result.type === 'localShare', true);
474
- })
475
- ])
476
- .then(() => {
581
+ it('alice shares the screen with highFrameRate', () =>
582
+ Promise.all([
583
+ testUtils.delayedPromise(
584
+ alice.meeting.shareScreen({sharePreferences: {highFrameRate: true}})
585
+ ),
586
+ testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingLocal'}]),
587
+ testUtils
588
+ .waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingRemote'}])
589
+ .then((response) => {
590
+ assert.equal(response[0].result.memberId, alice.meeting.selfId);
591
+ }),
592
+ testUtils
593
+ .waitForEvents([{scope: bob.meeting.members, event: 'members:update'}])
594
+ .then((response) => {
595
+ console.log(
596
+ 'SCREEN SHARE RESPONSE ',
597
+ JSON.stringify(response, testUtils.getCircularReplacer())
598
+ );
599
+ }),
600
+ testUtils
601
+ .waitForEvents([{scope: alice.meeting, event: 'media:ready'}])
602
+ .then((response) => {
603
+ console.log('MEDIA:READY event ', response[0].result);
604
+ assert.equal(response[0].result.type === 'localShare', true);
605
+ }),
606
+ ]).then(() => {
477
607
  // TODO: Re-eanable Safari when screensharing issues have been resolved
478
608
  if (!isBrowser('safari')) {
479
- assert.equal(alice.meeting.mediaProperties.shareTrack.getConstraints().height, 720);
609
+ assert.equal(alice.meeting.mediaProperties.shareTrack.underlyingTrack.getConstraints().height, 720);
480
610
  }
481
611
  assert.equal(alice.meeting.isSharing, true);
482
612
  assert.equal(alice.meeting.shareStatus, 'local_share_active');
483
613
  assert.equal(bob.meeting.shareStatus, 'remote_share_active');
484
- console.log('SCREEN SHARE PARTICIPANTS ', JSON.stringify(alice.meeting.locusInfo.participants));
614
+ console.log(
615
+ 'SCREEN SHARE PARTICIPANTS ',
616
+ JSON.stringify(alice.meeting.locusInfo.participants)
617
+ );
485
618
 
486
619
  return testUtils.waitUntil(10000);
487
620
  }));
488
621
 
489
- it('bob steals the screen share from alice', () => Promise.all([
490
- testUtils.delayedPromise(bob.meeting.shareScreen()),
491
- testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingLocal'}]),
492
- testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingLocal'}]),
493
- testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingRemote'}])
494
- .then((response) => {
495
- assert.equal(response[0].result.memberId, bob.meeting.selfId);
496
- }),
497
- testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
498
- .then((response) => {
499
- console.log('SCREEN SHARE RESPONSE ', JSON.stringify(response, testUtils.getCircularReplacer()));
500
- }),
501
- testUtils.waitForEvents([{scope: bob.meeting, event: 'media:ready'}])
502
- .then((response) => {
622
+ it('bob steals the screen share from alice', () =>
623
+ Promise.all([
624
+ testUtils.delayedPromise(bob.meeting.shareScreen()),
625
+ testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingLocal'}]),
626
+ testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingLocal'}]),
627
+ testUtils
628
+ .waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingRemote'}])
629
+ .then((response) => {
630
+ assert.equal(response[0].result.memberId, bob.meeting.selfId);
631
+ }),
632
+ testUtils
633
+ .waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
634
+ .then((response) => {
635
+ console.log(
636
+ 'SCREEN SHARE RESPONSE ',
637
+ JSON.stringify(response, testUtils.getCircularReplacer())
638
+ );
639
+ }),
640
+ testUtils.waitForEvents([{scope: bob.meeting, event: 'media:ready'}]).then((response) => {
503
641
  console.log('MEDIA:READY event ', response[0].result);
504
642
  assert.equal(response[0].result.type === 'localShare', true);
505
- })
506
- ])
507
- .then(() => {
643
+ }),
644
+ ]).then(() => {
508
645
  const heightResolution = DEFAULT_RESOLUTIONS.meetings.screenResolution.idealHeight;
509
646
 
510
647
  // TODO: Re-eanable Safari when screensharing issues have been resolved
511
648
  if (!isBrowser('safari')) {
512
- assert.equal(bob.meeting.mediaProperties.shareTrack.getConstraints().height, heightResolution);
649
+ assert.equal(
650
+ bob.meeting.mediaProperties.shareTrack.underlyingTrack.getConstraints().height,
651
+ heightResolution
652
+ );
513
653
  }
514
654
  assert.equal(bob.meeting.isSharing, true);
515
655
  assert.equal(bob.meeting.shareStatus, 'local_share_active');
@@ -518,128 +658,158 @@ skipInNode(describe)('plugin-meetings', () => {
518
658
  return testUtils.waitUntil(10000);
519
659
  }));
520
660
 
521
- it('bob stops sharing ', () => Promise.all([
522
- // Wait for peerConnection to stabalize
523
- testUtils.waitUntil(20000),
524
- testUtils.delayedPromise(bob.meeting.updateShare({
525
- sendShare: false,
526
- receiveShare: true
527
- })),
528
- testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:stoppedSharingLocal'}]),
529
- testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingRemote'}])
530
- ])
531
- .then(() => {
661
+ it('bob stops sharing ', () =>
662
+ Promise.all([
663
+ // Wait for peerConnection to stabalize
664
+ testUtils.waitUntil(20000),
665
+ testUtils.delayedPromise(
666
+ bob.meeting.updateShare({
667
+ sendShare: false,
668
+ receiveShare: true,
669
+ })
670
+ ),
671
+ testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:stoppedSharingLocal'}]),
672
+ testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingRemote'}]),
673
+ ]).then(() => {
532
674
  assert.equal(bob.meeting.isSharing, false);
533
675
  assert.equal(bob.meeting.shareStatus, 'no_share');
534
676
  assert.equal(alice.meeting.shareStatus, 'no_share');
535
677
  }));
536
678
 
537
- it('alice shares whiteboard A', () => Promise.all([
538
- testUtils.delayedPromise(alice.meeting.startWhiteboardShare(channelUrlA)),
539
- testUtils.waitForEvents([
540
- {scope: alice.meeting, event: 'meeting:startedSharingWhiteboard'}
541
- ]),
542
- testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingWhiteboard'}])
543
- .then((response) => {
544
- const {memberId, resourceUrl} = response[0].result;
545
-
546
- assert.equal(memberId, alice.meeting.selfId);
547
- assert.equal(resourceUrl, channelUrlA);
548
- }),
549
- testUtils.waitForEvents([{scope: bob.meeting.members, event: 'members:update'}])
550
- .then((response) => {
551
- console.log('WHITEBOARD SHARE RESPONSE ', JSON.stringify(response, testUtils.getCircularReplacer()));
552
- })
553
- ])
554
- .then(() => {
679
+ it('alice shares whiteboard A', () =>
680
+ Promise.all([
681
+ testUtils.delayedPromise(alice.meeting.startWhiteboardShare(channelUrlA)),
682
+ testUtils.waitForEvents([
683
+ {scope: alice.meeting, event: 'meeting:startedSharingWhiteboard'},
684
+ ]),
685
+ testUtils
686
+ .waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingWhiteboard'}])
687
+ .then((response) => {
688
+ const {memberId, resourceUrl} = response[0].result;
689
+
690
+ assert.equal(memberId, alice.meeting.selfId);
691
+ assert.equal(resourceUrl, channelUrlA);
692
+ }),
693
+ testUtils
694
+ .waitForEvents([{scope: bob.meeting.members, event: 'members:update'}])
695
+ .then((response) => {
696
+ console.log(
697
+ 'WHITEBOARD SHARE RESPONSE ',
698
+ JSON.stringify(response, testUtils.getCircularReplacer())
699
+ );
700
+ }),
701
+ ]).then(() => {
555
702
  assert.equal(alice.meeting.isSharing, false);
556
703
  assert.equal(alice.meeting.shareStatus, 'whiteboard_share_active');
557
704
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
558
705
  }));
559
706
 
560
- it('bob steals share from alice with whiteboard B', () => Promise.all([
561
- testUtils.delayedPromise(bob.meeting.startWhiteboardShare(channelUrlB)),
562
- testUtils.waitForEvents([
563
- {scope: bob.meeting, event: 'meeting:startedSharingWhiteboard'}
564
- ]),
565
- testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingWhiteboard'}])
566
- .then((response) => {
567
- const {memberId, resourceUrl} = response[0].result;
568
-
569
- assert.equal(memberId, bob.meeting.selfId);
570
- assert.equal(resourceUrl, channelUrlB);
571
- }),
572
- testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
573
- .then((response) => {
574
- console.log('WHITEBOARD SHARE RESPONSE ', JSON.stringify(response, testUtils.getCircularReplacer()));
575
- })
576
- ])
577
- .then(() => {
707
+ it('bob steals share from alice with whiteboard B', () =>
708
+ Promise.all([
709
+ testUtils.delayedPromise(bob.meeting.startWhiteboardShare(channelUrlB)),
710
+ testUtils.waitForEvents([
711
+ {scope: bob.meeting, event: 'meeting:startedSharingWhiteboard'},
712
+ ]),
713
+ testUtils
714
+ .waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingWhiteboard'}])
715
+ .then((response) => {
716
+ const {memberId, resourceUrl} = response[0].result;
717
+
718
+ assert.equal(memberId, bob.meeting.selfId);
719
+ assert.equal(resourceUrl, channelUrlB);
720
+ }),
721
+ testUtils
722
+ .waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
723
+ .then((response) => {
724
+ console.log(
725
+ 'WHITEBOARD SHARE RESPONSE ',
726
+ JSON.stringify(response, testUtils.getCircularReplacer())
727
+ );
728
+ }),
729
+ ]).then(() => {
578
730
  assert.equal(bob.meeting.isSharing, false);
579
731
  assert.equal(alice.meeting.shareStatus, 'whiteboard_share_active');
580
732
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
581
733
  }));
582
734
 
583
- it('bob stops sharing ', () => Promise.all([
584
- // Wait for peerConnection to stabalize
585
- testUtils.waitUntil(20000),
586
- testUtils.delayedPromise(bob.meeting.stopWhiteboardShare(channelUrlB)),
587
- testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:stoppedSharingWhiteboard'}]),
588
- testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingWhiteboard'}])
589
- ])
590
- .then(() => {
735
+ it('bob stops sharing ', () =>
736
+ Promise.all([
737
+ // Wait for peerConnection to stabalize
738
+ testUtils.waitUntil(20000),
739
+ testUtils.delayedPromise(bob.meeting.stopWhiteboardShare(channelUrlB)),
740
+ testUtils.waitForEvents([
741
+ {scope: bob.meeting, event: 'meeting:stoppedSharingWhiteboard'},
742
+ ]),
743
+ testUtils.waitForEvents([
744
+ {scope: alice.meeting, event: 'meeting:stoppedSharingWhiteboard'},
745
+ ]),
746
+ ]).then(() => {
591
747
  assert.equal(bob.meeting.isSharing, false);
592
748
  assert.equal(bob.meeting.shareStatus, 'no_share');
593
749
  assert.equal(alice.meeting.shareStatus, 'no_share');
594
750
  }));
595
751
 
596
- it('alice shares whiteboard B', () => Promise.all([
597
- testUtils.delayedPromise(alice.meeting.startWhiteboardShare(channelUrlB)),
598
- testUtils.waitForEvents([
599
- {scope: alice.meeting, event: 'meeting:startedSharingWhiteboard'}
600
- ]),
601
- testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingWhiteboard'}])
602
- .then((response) => {
603
- const {memberId, resourceUrl} = response[0].result;
604
-
605
- assert.equal(memberId, alice.meeting.selfId);
606
- assert.equal(resourceUrl, channelUrlB);
607
- }),
608
- testUtils.waitForEvents([{scope: bob.meeting.members, event: 'members:update'}])
609
- .then((response) => {
610
- console.log('WHITEBOARD SHARE RESPONSE ', JSON.stringify(response, testUtils.getCircularReplacer()));
611
- })
612
- ])
613
- .then(() => {
752
+ it('alice shares whiteboard B', () =>
753
+ Promise.all([
754
+ testUtils.delayedPromise(alice.meeting.startWhiteboardShare(channelUrlB)),
755
+ testUtils.waitForEvents([
756
+ {scope: alice.meeting, event: 'meeting:startedSharingWhiteboard'},
757
+ ]),
758
+ testUtils
759
+ .waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingWhiteboard'}])
760
+ .then((response) => {
761
+ const {memberId, resourceUrl} = response[0].result;
762
+
763
+ assert.equal(memberId, alice.meeting.selfId);
764
+ assert.equal(resourceUrl, channelUrlB);
765
+ }),
766
+ testUtils
767
+ .waitForEvents([{scope: bob.meeting.members, event: 'members:update'}])
768
+ .then((response) => {
769
+ console.log(
770
+ 'WHITEBOARD SHARE RESPONSE ',
771
+ JSON.stringify(response, testUtils.getCircularReplacer())
772
+ );
773
+ }),
774
+ ]).then(() => {
614
775
  assert.equal(alice.meeting.isSharing, false);
615
776
  assert.equal(alice.meeting.shareStatus, 'whiteboard_share_active');
616
777
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
617
778
  }));
618
779
 
619
- it('bob steals the share from alice with desktop share', () => Promise.all([
620
- testUtils.delayedPromise(bob.meeting.shareScreen()),
621
- testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingWhiteboard'}]),
622
- testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingLocal'}]),
623
- testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingRemote'}])
624
- .then((response) => {
625
- assert.equal(response[0].result.memberId, bob.meeting.selfId);
626
- }),
627
- testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
628
- .then((response) => {
629
- console.log('SCREEN SHARE RESPONSE ', JSON.stringify(response, testUtils.getCircularReplacer()));
630
- }),
631
- testUtils.waitForEvents([{scope: bob.meeting, event: 'media:ready'}])
632
- .then((response) => {
780
+ it('bob steals the share from alice with desktop share', () =>
781
+ Promise.all([
782
+ testUtils.delayedPromise(bob.meeting.shareScreen()),
783
+ testUtils.waitForEvents([
784
+ {scope: alice.meeting, event: 'meeting:stoppedSharingWhiteboard'},
785
+ ]),
786
+ testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingLocal'}]),
787
+ testUtils
788
+ .waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingRemote'}])
789
+ .then((response) => {
790
+ assert.equal(response[0].result.memberId, bob.meeting.selfId);
791
+ }),
792
+ testUtils
793
+ .waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
794
+ .then((response) => {
795
+ console.log(
796
+ 'SCREEN SHARE RESPONSE ',
797
+ JSON.stringify(response, testUtils.getCircularReplacer())
798
+ );
799
+ }),
800
+ testUtils.waitForEvents([{scope: bob.meeting, event: 'media:ready'}]).then((response) => {
633
801
  console.log('MEDIA:READY event ', response[0].result);
634
802
  assert.equal(response[0].result.type === 'localShare', true);
635
- })
636
- ])
637
- .then(() => {
803
+ }),
804
+ ]).then(() => {
638
805
  const heightResolution = DEFAULT_RESOLUTIONS.meetings.screenResolution.idealHeight;
639
806
 
640
807
  // TODO: Re-eanable Safari when screensharing issues have been resolved
641
808
  if (!isBrowser('safari')) {
642
- assert.equal(bob.meeting.mediaProperties.shareTrack.getConstraints().height, heightResolution);
809
+ assert.equal(
810
+ bob.meeting.mediaProperties.shareTrack.underlyingTrack.getConstraints().height,
811
+ heightResolution
812
+ );
643
813
  }
644
814
  assert.equal(bob.meeting.isSharing, true);
645
815
  assert.equal(bob.meeting.shareStatus, 'local_share_active');
@@ -648,65 +818,94 @@ skipInNode(describe)('plugin-meetings', () => {
648
818
  return testUtils.waitUntil(10000);
649
819
  }));
650
820
 
651
- it('bob shares whiteboard B', () => Promise.all([
652
- testUtils.delayedPromise(bob.meeting.startWhiteboardShare(channelUrlB)),
653
- testUtils.waitForEvents([
654
- {scope: bob.meeting, event: 'meeting:startedSharingWhiteboard'}
655
- ]),
656
- testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingWhiteboard'}])
657
- .then((response) => {
658
- const {memberId, resourceUrl} = response[0].result;
659
-
660
- assert.equal(memberId, bob.meeting.selfId);
661
- assert.equal(resourceUrl, channelUrlB);
662
- }),
663
- testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
664
- .then((response) => {
665
- console.log('WHITEBOARD SHARE RESPONSE ', JSON.stringify(response, testUtils.getCircularReplacer()));
666
- })
667
- ])
668
- .then(() => {
821
+ it('bob shares whiteboard B', () =>
822
+ Promise.all([
823
+ testUtils.delayedPromise(bob.meeting.startWhiteboardShare(channelUrlB)),
824
+ testUtils.waitForEvents([
825
+ {scope: bob.meeting, event: 'meeting:startedSharingWhiteboard'},
826
+ ]),
827
+ testUtils
828
+ .waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingWhiteboard'}])
829
+ .then((response) => {
830
+ const {memberId, resourceUrl} = response[0].result;
831
+
832
+ assert.equal(memberId, bob.meeting.selfId);
833
+ assert.equal(resourceUrl, channelUrlB);
834
+ }),
835
+ testUtils
836
+ .waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
837
+ .then((response) => {
838
+ console.log(
839
+ 'WHITEBOARD SHARE RESPONSE ',
840
+ JSON.stringify(response, testUtils.getCircularReplacer())
841
+ );
842
+ }),
843
+ ]).then(() => {
669
844
  assert.equal(bob.meeting.isSharing, false);
670
845
  assert.equal(alice.meeting.shareStatus, 'whiteboard_share_active');
671
846
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
672
847
  }));
673
848
 
674
- it('alice adds chris as guest to 1:1 meeting', () => Promise.all([
675
- testUtils.delayedPromise(alice.meeting.invite({emailAddress: chris.emailAddress})),
676
- testUtils.waitForEvents([{scope: chris.webex.meetings, event: 'meeting:added', user: chris}]),
677
- testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
678
- .then((response) => {
679
- const chrisParticipant = response[0].result.delta.added.find((member) => member.participant.identity === chris.id);
680
-
681
- assert.equal(chrisParticipant.status, 'NOT_IN_MEETING');
849
+ it('alice adds chris as guest to 1:1 meeting', () =>
850
+ Promise.all([
851
+ testUtils.delayedPromise(alice.meeting.invite({emailAddress: chris.emailAddress})),
852
+ testUtils.waitForEvents([
853
+ {scope: chris.webex.meetings, event: 'meeting:added', user: chris},
854
+ ]),
855
+ testUtils
856
+ .waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
857
+ .then((response) => {
858
+ const chrisParticipant = response[0].result.delta.added.find(
859
+ (member) => member.participant.identity === chris.id
860
+ );
861
+
862
+ assert.equal(chrisParticipant.status, 'NOT_IN_MEETING');
863
+ }),
864
+ ])
865
+ .catch((e) => {
866
+ console.error('Error adding chris as guest ', e);
867
+ throw e;
682
868
  })
683
- ])
684
- .catch((e) => {
685
- console.error('Error adding chris as guest ', e);
686
- throw e;
687
- })
688
- .then(function memberUpdated() {
689
- assert.exists(chris.meeting);
690
-
691
- return Promise.all([
692
- testUtils.delayedPromise(chris.meeting.join()),
693
- testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update', match: testUtils.checkParticipantUpdatedStatus(chris, 'IN_MEETING')}])
694
- ])
695
- .then(() => {
696
- assert.equal(alice.meeting.members.membersCollection.get(chris.meeting.members.selfId).participant.state, 'JOINED');
697
- })
698
- .then(() => testUtils.waitForStateChange(chris.meeting, 'JOINED'))
699
- .then(() => testUtils.addMedia(chris))
700
- .then(() => assert(enumerateSpy.called));
701
- })
702
- .then(() => Promise.all([
703
- testUtils.delayedPromise(chris.meeting.leave()),
704
- testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update', match: testUtils.checkParticipantUpdatedStatus(chris, 'NOT_IN_MEETING')}])
705
- ]))
706
- .catch((e) => {
707
- console.error('Error chris joining the meeting ', e);
708
- throw e;
709
- }));
869
+ .then(function memberUpdated() {
870
+ assert.exists(chris.meeting);
871
+
872
+ return Promise.all([
873
+ testUtils.delayedPromise(chris.meeting.join()),
874
+ testUtils.waitForEvents([
875
+ {
876
+ scope: alice.meeting.members,
877
+ event: 'members:update',
878
+ match: testUtils.checkParticipantUpdatedStatus(chris, 'IN_MEETING'),
879
+ },
880
+ ]),
881
+ ])
882
+ .then(() => {
883
+ assert.equal(
884
+ alice.meeting.members.membersCollection.get(chris.meeting.members.selfId)
885
+ .participant.state,
886
+ 'JOINED'
887
+ );
888
+ })
889
+ .then(() => testUtils.waitForStateChange(chris.meeting, 'JOINED'))
890
+ .then(() => integrationTestUtils.addMedia(chris))
891
+ .then(() => assert(enumerateSpy.called));
892
+ })
893
+ .then(() =>
894
+ Promise.all([
895
+ testUtils.delayedPromise(chris.meeting.leave()),
896
+ testUtils.waitForEvents([
897
+ {
898
+ scope: alice.meeting.members,
899
+ event: 'members:update',
900
+ match: testUtils.checkParticipantUpdatedStatus(chris, 'NOT_IN_MEETING'),
901
+ },
902
+ ]),
903
+ ])
904
+ )
905
+ .catch((e) => {
906
+ console.error('Error chris joining the meeting ', e);
907
+ throw e;
908
+ }));
710
909
 
711
910
  it('leave on the meeting object', () => {
712
911
  const checkInactive = (result) => result.reason === 'CALL_INACTIVE';
@@ -716,10 +915,13 @@ skipInNode(describe)('plugin-meetings', () => {
716
915
  testUtils.waitForEvents([
717
916
  {scope: alice.meeting.members, event: 'members:update', user: alice},
718
917
  {
719
- scope: bob.webex.meetings, event: 'meeting:removed', user: bob, match: checkInactive
918
+ scope: bob.webex.meetings,
919
+ event: 'meeting:removed',
920
+ user: bob,
921
+ match: checkInactive,
720
922
  },
721
- {scope: alice.webex.meetings, event: 'meeting:removed', user: alice}
722
- ])
923
+ {scope: alice.webex.meetings, event: 'meeting:removed', user: alice},
924
+ ]),
723
925
  ])
724
926
  .then(() => {
725
927
  assert.equal(bob.meeting, null);