@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.131

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