@webex/plugin-meetings 3.0.0-beta.31 → 3.0.0-beta.310

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 (378) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +94 -15
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +709 -35
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/utils.js +45 -1
  17. package/dist/breakouts/utils.js.map +1 -1
  18. package/dist/common/errors/no-meeting-info.js +51 -0
  19. package/dist/common/errors/no-meeting-info.js.map +1 -0
  20. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  21. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +48 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/logs/request.js +5 -1
  27. package/dist/common/logs/request.js.map +1 -1
  28. package/dist/common/queue.js +24 -9
  29. package/dist/common/queue.js.map +1 -1
  30. package/dist/config.js +5 -11
  31. package/dist/config.js.map +1 -1
  32. package/dist/constants.js +233 -29
  33. package/dist/constants.js.map +1 -1
  34. package/dist/controls-options-manager/enums.js +14 -2
  35. package/dist/controls-options-manager/enums.js.map +1 -1
  36. package/dist/controls-options-manager/index.js +109 -15
  37. package/dist/controls-options-manager/index.js.map +1 -1
  38. package/dist/controls-options-manager/types.js +7 -0
  39. package/dist/controls-options-manager/types.js.map +1 -0
  40. package/dist/controls-options-manager/util.js +309 -18
  41. package/dist/controls-options-manager/util.js.map +1 -1
  42. package/dist/index.js +112 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/interpretation/collection.js +23 -0
  45. package/dist/interpretation/collection.js.map +1 -0
  46. package/dist/interpretation/index.js +366 -0
  47. package/dist/interpretation/index.js.map +1 -0
  48. package/dist/interpretation/siLanguage.js +25 -0
  49. package/dist/interpretation/siLanguage.js.map +1 -0
  50. package/dist/locus-info/controlsUtils.js +91 -2
  51. package/dist/locus-info/controlsUtils.js.map +1 -1
  52. package/dist/locus-info/index.js +383 -62
  53. package/dist/locus-info/index.js.map +1 -1
  54. package/dist/locus-info/infoUtils.js +7 -1
  55. package/dist/locus-info/infoUtils.js.map +1 -1
  56. package/dist/locus-info/mediaSharesUtils.js +57 -1
  57. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  58. package/dist/locus-info/parser.js +249 -72
  59. package/dist/locus-info/parser.js.map +1 -1
  60. package/dist/locus-info/selfUtils.js +89 -14
  61. package/dist/locus-info/selfUtils.js.map +1 -1
  62. package/dist/media/index.js +61 -116
  63. package/dist/media/index.js.map +1 -1
  64. package/dist/media/properties.js +73 -124
  65. package/dist/media/properties.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +82 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +3777 -2929
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +292 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +230 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +260 -196
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +601 -417
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +73 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +192 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/util.js +1 -1
  83. package/dist/meeting-info/util.js.map +1 -1
  84. package/dist/meeting-info/utilv2.js +36 -36
  85. package/dist/meeting-info/utilv2.js.map +1 -1
  86. package/dist/meetings/collection.js +39 -0
  87. package/dist/meetings/collection.js.map +1 -1
  88. package/dist/meetings/index.js +415 -115
  89. package/dist/meetings/index.js.map +1 -1
  90. package/dist/meetings/meetings.types.js +7 -0
  91. package/dist/meetings/meetings.types.js.map +1 -0
  92. package/dist/meetings/request.js +2 -0
  93. package/dist/meetings/request.js.map +1 -1
  94. package/dist/meetings/util.js +72 -6
  95. package/dist/meetings/util.js.map +1 -1
  96. package/dist/member/index.js +58 -0
  97. package/dist/member/index.js.map +1 -1
  98. package/dist/member/types.js +25 -0
  99. package/dist/member/types.js.map +1 -0
  100. package/dist/member/util.js +132 -25
  101. package/dist/member/util.js.map +1 -1
  102. package/dist/members/collection.js +10 -0
  103. package/dist/members/collection.js.map +1 -1
  104. package/dist/members/index.js +102 -6
  105. package/dist/members/index.js.map +1 -1
  106. package/dist/members/request.js +106 -38
  107. package/dist/members/request.js.map +1 -1
  108. package/dist/members/types.js +15 -0
  109. package/dist/members/types.js.map +1 -0
  110. package/dist/members/util.js +326 -232
  111. package/dist/members/util.js.map +1 -1
  112. package/dist/metrics/constants.js +13 -5
  113. package/dist/metrics/constants.js.map +1 -1
  114. package/dist/metrics/index.js +1 -468
  115. package/dist/metrics/index.js.map +1 -1
  116. package/dist/multistream/mediaRequestManager.js +238 -49
  117. package/dist/multistream/mediaRequestManager.js.map +1 -1
  118. package/dist/multistream/receiveSlot.js +29 -16
  119. package/dist/multistream/receiveSlot.js.map +1 -1
  120. package/dist/multistream/receiveSlotManager.js +39 -36
  121. package/dist/multistream/receiveSlotManager.js.map +1 -1
  122. package/dist/multistream/remoteMedia.js +44 -18
  123. package/dist/multistream/remoteMedia.js.map +1 -1
  124. package/dist/multistream/remoteMediaGroup.js +60 -3
  125. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  126. package/dist/multistream/remoteMediaManager.js +209 -59
  127. package/dist/multistream/remoteMediaManager.js.map +1 -1
  128. package/dist/multistream/sendSlotManager.js +233 -0
  129. package/dist/multistream/sendSlotManager.js.map +1 -0
  130. package/dist/reachability/index.js +225 -59
  131. package/dist/reachability/index.js.map +1 -1
  132. package/dist/reachability/request.js +17 -8
  133. package/dist/reachability/request.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +201 -156
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -2
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +62 -32
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +112 -97
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +95 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +117 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/index.js +86 -78
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +11 -10
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  158. package/dist/types/breakouts/events.d.ts +8 -0
  159. package/dist/types/breakouts/utils.d.ts +14 -0
  160. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  161. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  162. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  163. package/dist/types/common/logs/request.d.ts +2 -0
  164. package/dist/types/common/queue.d.ts +9 -7
  165. package/dist/types/config.d.ts +1 -7
  166. package/dist/types/constants.d.ts +194 -24
  167. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  168. package/dist/types/controls-options-manager/index.d.ts +17 -1
  169. package/dist/types/controls-options-manager/types.d.ts +43 -0
  170. package/dist/types/controls-options-manager/util.d.ts +1 -7
  171. package/dist/types/index.d.ts +6 -4
  172. package/dist/types/interpretation/collection.d.ts +5 -0
  173. package/dist/types/interpretation/index.d.ts +5 -0
  174. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  175. package/dist/types/locus-info/index.d.ts +57 -4
  176. package/dist/types/locus-info/parser.d.ts +67 -6
  177. package/dist/types/media/index.d.ts +2 -0
  178. package/dist/types/media/properties.d.ts +34 -48
  179. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  180. package/dist/types/meeting/index.d.ts +463 -510
  181. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  182. package/dist/types/meeting/muteState.d.ts +99 -23
  183. package/dist/types/meeting/request.d.ts +72 -43
  184. package/dist/types/meeting/util.d.ts +101 -1
  185. package/dist/types/meeting-info/index.d.ts +13 -1
  186. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  187. package/dist/types/meetings/collection.d.ts +17 -0
  188. package/dist/types/meetings/index.d.ts +98 -20
  189. package/dist/types/meetings/meetings.types.d.ts +4 -0
  190. package/dist/types/member/index.d.ts +14 -0
  191. package/dist/types/member/types.d.ts +32 -0
  192. package/dist/types/members/collection.d.ts +5 -0
  193. package/dist/types/members/index.d.ts +35 -2
  194. package/dist/types/members/request.d.ts +73 -9
  195. package/dist/types/members/types.d.ts +25 -0
  196. package/dist/types/members/util.d.ts +214 -1
  197. package/dist/types/metrics/constants.d.ts +12 -4
  198. package/dist/types/metrics/index.d.ts +4 -119
  199. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  200. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  201. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  202. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  203. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  204. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  205. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  206. package/dist/types/reachability/index.d.ts +61 -7
  207. package/dist/types/reachability/request.d.ts +7 -3
  208. package/dist/types/reconnection-manager/index.d.ts +9 -0
  209. package/dist/types/recording-controller/index.d.ts +15 -1
  210. package/dist/types/recording-controller/util.d.ts +5 -4
  211. package/dist/types/roap/index.d.ts +2 -1
  212. package/dist/types/roap/request.d.ts +15 -11
  213. package/dist/types/roap/turnDiscovery.d.ts +21 -3
  214. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  215. package/dist/types/rtcMetrics/index.d.ts +47 -0
  216. package/dist/types/statsAnalyzer/index.d.ts +7 -1
  217. package/dist/types/webinar/collection.d.ts +16 -0
  218. package/dist/types/webinar/index.d.ts +5 -0
  219. package/dist/webinar/collection.js +44 -0
  220. package/dist/webinar/collection.js.map +1 -0
  221. package/dist/webinar/index.js +69 -0
  222. package/dist/webinar/index.js.map +1 -0
  223. package/package.json +23 -20
  224. package/src/annotation/annotation.types.ts +50 -0
  225. package/src/annotation/constants.ts +36 -0
  226. package/src/annotation/index.ts +328 -0
  227. package/src/breakouts/README.md +42 -12
  228. package/src/breakouts/breakout.ts +67 -9
  229. package/src/breakouts/edit-lock-error.ts +25 -0
  230. package/src/breakouts/events.ts +56 -0
  231. package/src/breakouts/index.ts +592 -20
  232. package/src/breakouts/utils.ts +42 -0
  233. package/src/common/errors/no-meeting-info.ts +24 -0
  234. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  235. package/src/common/errors/webex-errors.ts +44 -2
  236. package/src/common/logs/logger-proxy.ts +1 -1
  237. package/src/common/logs/request.ts +5 -1
  238. package/src/common/queue.ts +22 -8
  239. package/src/config.ts +4 -10
  240. package/src/constants.ts +221 -19
  241. package/src/controls-options-manager/enums.ts +12 -0
  242. package/src/controls-options-manager/index.ts +116 -21
  243. package/src/controls-options-manager/types.ts +59 -0
  244. package/src/controls-options-manager/util.ts +294 -14
  245. package/src/index.ts +40 -0
  246. package/src/interpretation/README.md +60 -0
  247. package/src/interpretation/collection.ts +19 -0
  248. package/src/interpretation/index.ts +332 -0
  249. package/src/interpretation/siLanguage.ts +18 -0
  250. package/src/locus-info/controlsUtils.ts +108 -0
  251. package/src/locus-info/index.ts +413 -59
  252. package/src/locus-info/infoUtils.ts +10 -2
  253. package/src/locus-info/mediaSharesUtils.ts +64 -0
  254. package/src/locus-info/parser.ts +258 -47
  255. package/src/locus-info/selfUtils.ts +81 -5
  256. package/src/media/index.ts +102 -122
  257. package/src/media/properties.ts +87 -110
  258. package/src/meeting/in-meeting-actions.ts +163 -3
  259. package/src/meeting/index.ts +3132 -2541
  260. package/src/meeting/locusMediaRequest.ts +313 -0
  261. package/src/meeting/muteState.ts +229 -131
  262. package/src/meeting/request.ts +177 -121
  263. package/src/meeting/util.ts +588 -394
  264. package/src/meeting-info/index.ts +81 -8
  265. package/src/meeting-info/meeting-info-v2.ts +170 -14
  266. package/src/meeting-info/util.ts +1 -1
  267. package/src/meeting-info/utilv2.ts +23 -23
  268. package/src/meetings/collection.ts +33 -0
  269. package/src/meetings/index.ts +445 -123
  270. package/src/meetings/meetings.types.ts +12 -0
  271. package/src/meetings/request.ts +2 -0
  272. package/src/meetings/util.ts +80 -11
  273. package/src/member/index.ts +58 -0
  274. package/src/member/types.ts +38 -0
  275. package/src/member/util.ts +141 -25
  276. package/src/members/collection.ts +8 -0
  277. package/src/members/index.ts +134 -8
  278. package/src/members/request.ts +97 -17
  279. package/src/members/types.ts +29 -0
  280. package/src/members/util.ts +333 -240
  281. package/src/metrics/constants.ts +12 -4
  282. package/src/metrics/index.ts +1 -490
  283. package/src/multistream/mediaRequestManager.ts +289 -79
  284. package/src/multistream/receiveSlot.ts +31 -17
  285. package/src/multistream/receiveSlotManager.ts +34 -24
  286. package/src/multistream/remoteMedia.ts +27 -2
  287. package/src/multistream/remoteMediaGroup.ts +59 -0
  288. package/src/multistream/remoteMediaManager.ts +148 -30
  289. package/src/multistream/sendSlotManager.ts +170 -0
  290. package/src/reachability/index.ts +228 -37
  291. package/src/reachability/request.ts +17 -8
  292. package/src/reconnection-manager/index.ts +83 -56
  293. package/src/recording-controller/index.ts +20 -3
  294. package/src/recording-controller/util.ts +26 -9
  295. package/src/roap/index.ts +63 -32
  296. package/src/roap/request.ts +100 -104
  297. package/src/roap/turnDiscovery.ts +48 -26
  298. package/src/rtcMetrics/constants.ts +3 -0
  299. package/src/rtcMetrics/index.ts +100 -0
  300. package/src/statsAnalyzer/index.ts +105 -91
  301. package/src/statsAnalyzer/mqaUtil.ts +13 -14
  302. package/src/webinar/collection.ts +31 -0
  303. package/src/webinar/index.ts +62 -0
  304. package/test/integration/spec/converged-space-meetings.js +60 -3
  305. package/test/integration/spec/journey.js +320 -261
  306. package/test/integration/spec/space-meeting.js +76 -3
  307. package/test/unit/spec/annotation/index.ts +418 -0
  308. package/test/unit/spec/breakouts/breakout.ts +118 -28
  309. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  310. package/test/unit/spec/breakouts/events.ts +89 -0
  311. package/test/unit/spec/breakouts/index.ts +1395 -69
  312. package/test/unit/spec/breakouts/utils.js +52 -1
  313. package/test/unit/spec/common/queue.js +31 -2
  314. package/test/unit/spec/controls-options-manager/index.js +163 -0
  315. package/test/unit/spec/controls-options-manager/util.js +576 -60
  316. package/test/unit/spec/fixture/locus.js +1 -0
  317. package/test/unit/spec/interpretation/collection.ts +15 -0
  318. package/test/unit/spec/interpretation/index.ts +589 -0
  319. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  320. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  321. package/test/unit/spec/locus-info/index.js +1304 -33
  322. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  323. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  324. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  325. package/test/unit/spec/locus-info/parser.js +116 -35
  326. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  327. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  328. package/test/unit/spec/media/index.ts +104 -37
  329. package/test/unit/spec/media/properties.ts +2 -2
  330. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  331. package/test/unit/spec/meeting/index.js +5216 -1956
  332. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  333. package/test/unit/spec/meeting/muteState.js +408 -208
  334. package/test/unit/spec/meeting/request.js +483 -49
  335. package/test/unit/spec/meeting/utils.js +679 -64
  336. package/test/unit/spec/meeting-info/index.js +300 -0
  337. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  338. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  339. package/test/unit/spec/meetings/collection.js +26 -0
  340. package/test/unit/spec/meetings/index.js +1011 -205
  341. package/test/unit/spec/meetings/utils.js +202 -2
  342. package/test/unit/spec/member/index.js +61 -6
  343. package/test/unit/spec/member/util.js +510 -34
  344. package/test/unit/spec/members/index.js +432 -1
  345. package/test/unit/spec/members/request.js +206 -27
  346. package/test/unit/spec/members/utils.js +210 -0
  347. package/test/unit/spec/metrics/index.js +1 -50
  348. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  349. package/test/unit/spec/multistream/receiveSlot.ts +28 -20
  350. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  351. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  352. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  353. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  354. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  355. package/test/unit/spec/reachability/index.ts +549 -9
  356. package/test/unit/spec/reachability/request.js +68 -0
  357. package/test/unit/spec/reconnection-manager/index.js +85 -9
  358. package/test/unit/spec/recording-controller/index.js +294 -218
  359. package/test/unit/spec/recording-controller/util.js +223 -96
  360. package/test/unit/spec/roap/index.ts +178 -64
  361. package/test/unit/spec/roap/request.ts +203 -85
  362. package/test/unit/spec/roap/turnDiscovery.ts +82 -36
  363. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  364. package/test/unit/spec/stats-analyzer/index.js +136 -2
  365. package/test/unit/spec/webinar/collection.ts +13 -0
  366. package/test/unit/spec/webinar/index.ts +60 -0
  367. package/test/utils/integrationTestUtils.js +46 -0
  368. package/test/utils/testUtils.js +0 -52
  369. package/dist/meeting/effectsState.js +0 -262
  370. package/dist/meeting/effectsState.js.map +0 -1
  371. package/dist/metrics/config.js +0 -299
  372. package/dist/metrics/config.js.map +0 -1
  373. package/dist/types/meeting/effectsState.d.ts +0 -42
  374. package/dist/types/metrics/config.d.ts +0 -178
  375. package/src/index.js +0 -16
  376. package/src/meeting/effectsState.ts +0 -211
  377. package/src/metrics/config.ts +0 -495
  378. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -6,9 +6,11 @@ import {skipInNode} from '@webex/test-helper-mocha';
6
6
  import sinon from 'sinon';
7
7
 
8
8
  import BrowserDetection from '@webex/plugin-meetings/dist/common/browser-detection';
9
+ import {createCameraStream, createDisplayStream, createMicrophoneStream, LocalTrackEvents, LocalStreamEventNames} from '@webex/plugin-meetings';
9
10
 
10
- import DEFAULT_RESOLUTIONS from '../../../src/config';
11
11
  import testUtils from '../../utils/testUtils';
12
+ import integrationTestUtils from '../../utils/integrationTestUtils';
13
+ import {EVENT_TRIGGERS} from '../../../src/constants';
12
14
 
13
15
  require('dotenv').config();
14
16
 
@@ -18,6 +20,42 @@ const {isBrowser} = BrowserDetection();
18
20
 
19
21
  let userSet, alice, bob, chris, enumerateSpy, channelUrlA, channelUrlB;
20
22
 
23
+ const localStreams = {
24
+ alice: {
25
+ microphone: undefined,
26
+ camera: undefined,
27
+ screenShare: {
28
+ video: undefined,
29
+ }
30
+ },
31
+ bob: {
32
+ microphone: undefined,
33
+ camera: undefined,
34
+ screenShare: {
35
+ video: undefined,
36
+ }
37
+ },
38
+ chris: {
39
+ microphone: undefined,
40
+ camera: undefined,
41
+ screenShare: {
42
+ video: undefined,
43
+ }
44
+ },
45
+ };
46
+
47
+ // Updated expectedPublished from a boolean value to an object containing the stream and status properties
48
+ const waitForPublished = (meeting, expectedPublished, description) => {
49
+ return testUtils.waitForEvents([{
50
+ scope: meeting,
51
+ event: EVENT_TRIGGERS.MEETING_STREAM_PUBLISH_STATE_CHANGED,
52
+ match: (event) => {
53
+ console.log(`${description} is now ${event.isPublished ? 'published': 'not published'}`);
54
+ return (event.isPublished === expectedPublished.status && event.stream.id === expectedPublished.stream.id) ;
55
+ }
56
+ }]);
57
+ };
58
+
21
59
  skipInNode(describe)('plugin-meetings', () => {
22
60
  describe('journey', () => {
23
61
  before(() =>
@@ -274,6 +312,11 @@ skipInNode(describe)('plugin-meetings', () => {
274
312
  );
275
313
  });
276
314
 
315
+ it('alice creates local microphone and camera tracks', async () => {
316
+ localStreams.alice.microphone = await createMicrophoneStream();
317
+ localStreams.alice.camera = await createCameraStream();
318
+ });
319
+
277
320
  it('alice dials bob and adds media', () =>
278
321
  Promise.all([
279
322
  testUtils.delayedPromise(alice.webex.meetings.create(bob.emailAddress)),
@@ -301,7 +344,7 @@ skipInNode(describe)('plugin-meetings', () => {
301
344
  })
302
345
  .then(() =>
303
346
  Promise.all([
304
- testUtils.addMedia(alice),
347
+ integrationTestUtils.addMedia(alice, {microphone: localStreams.alice.microphone, camera: localStreams.alice.camera}),
305
348
  testUtils.waitForEvents([
306
349
  {scope: alice.meeting, event: 'meeting:media:local:start', user: alice},
307
350
  ]),
@@ -328,9 +371,14 @@ skipInNode(describe)('plugin-meetings', () => {
328
371
  ]);
329
372
  });
330
373
 
374
+ it('bob creates local microphone and camera tracks', async () => {
375
+ localStreams.bob.microphone = await createMicrophoneStream();
376
+ localStreams.bob.camera = await createCameraStream();
377
+ });
378
+
331
379
  it('bob adds media to the meeting', () =>
332
380
  Promise.all([
333
- testUtils.addMedia(bob),
381
+ integrationTestUtils.addMedia(bob, {microphone: localStreams.bob.microphone, camera: localStreams.bob.camera}),
334
382
  testUtils
335
383
  .waitForEvents([
336
384
  {scope: bob.meeting, event: 'meeting:media:local:start', user: bob},
@@ -372,133 +420,126 @@ skipInNode(describe)('plugin-meetings', () => {
372
420
  assert.exists(alice.meeting.members.selfId, 'selfId not present');
373
421
  });
374
422
 
375
- it('alice Audio Mute ', () => {
423
+ it('alice Audio Mute ', async () => {
376
424
  const checkEvent = (event) =>
377
425
  !!event.delta.updated.find(
378
426
  (member) => alice.meeting.members.selfId === member.id && member.isAudioMuted === true
379
427
  );
380
428
 
381
- return Promise.all([
382
- testUtils.delayedPromise(alice.meeting.muteAudio()),
383
- testUtils.waitForEvents([
384
- {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
385
- ]),
386
- ]).then(() => {
387
- assert.equal(alice.meeting.audio.muted, true);
388
- assert.equal(alice.meeting.isAudioMuted(), true);
389
- });
429
+ await testUtils.waitUntil(2000);
430
+
431
+ const membersUpdate = testUtils.waitForEvents([
432
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
433
+ ]);
434
+
435
+ localStreams.alice.microphone.setMuted(true);
436
+
437
+ await membersUpdate;
438
+
439
+ assert.equal(localStreams.alice.microphone.muted, true);
390
440
  });
391
441
 
392
- it('alice Audio unMute ', () => {
442
+ it('alice Audio unMute ', async () => {
393
443
  const checkEvent = (event) =>
394
444
  !!event.delta.updated.find(
395
445
  (member) => alice.meeting.members.selfId === member.id && member.isAudioMuted === false
396
446
  );
397
447
 
398
- return Promise.all([
399
- testUtils.delayedPromise(alice.meeting.unmuteAudio()),
400
- testUtils.waitForEvents([
401
- {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
402
- ]),
403
- ]).then(() => {
404
- assert.equal(alice.meeting.audio.muted, false);
405
- assert.equal(alice.meeting.isAudioMuted(), false);
406
- });
448
+ await testUtils.waitUntil(2000);
449
+
450
+ const membersUpdate = testUtils.waitForEvents([
451
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
452
+ ]);
453
+
454
+ localStreams.alice.microphone.setMuted(false);
455
+
456
+ await membersUpdate;
457
+
458
+ assert.equal(localStreams.alice.microphone.muted, false);
407
459
  });
408
460
 
409
- it('alice Video Mute', () => {
461
+ it('alice video mute', async () => {
410
462
  const checkEvent = (event) =>
411
463
  !!event.delta.updated.find(
412
464
  (member) => alice.meeting.members.selfId === member.id && member.isVideoMuted === true
413
465
  );
414
466
 
415
- return Promise.all([
416
- testUtils.delayedPromise(alice.meeting.muteVideo()),
417
- testUtils.waitForEvents([
418
- {scope: alice.meeting.members, event: 'members:update', match: checkEvent},
419
- ]),
420
- ]).then(() => {
421
- assert.equal(alice.meeting.video.muted, true);
422
- assert.equal(alice.meeting.isVideoMuted(), true);
423
- });
467
+ await testUtils.waitUntil(2000);
468
+
469
+ const membersUpdate = testUtils.waitForEvents([
470
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
471
+ ]);
472
+
473
+ localStreams.alice.camera.setMuted(true);
474
+
475
+ await membersUpdate;
476
+
477
+ assert.equal(localStreams.alice.camera.muted, true);
424
478
  });
425
479
 
426
- it('alice video unMute', () => {
480
+ it('alice video unmute', async () => {
427
481
  const checkEvent = (event) =>
428
482
  !!event.delta.updated.find(
429
483
  (member) => alice.meeting.members.selfId === member.id && member.isVideoMuted === false
430
484
  );
431
485
 
432
- return Promise.all([
433
- testUtils.delayedPromise(alice.meeting.unmuteVideo()),
434
- testUtils.waitForEvents([
435
- {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
436
- ]),
437
- ]).then(() => {
438
- assert.equal(alice.meeting.video.muted, false);
439
- assert.equal(alice.meeting.isVideoMuted(), false);
440
- });
486
+ await testUtils.waitUntil(2000);
487
+
488
+ const membersUpdate = testUtils.waitForEvents([
489
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
490
+ ]);
491
+
492
+ localStreams.alice.camera.setMuted(false);
493
+
494
+ await membersUpdate;
495
+
496
+ assert.equal(localStreams.alice.camera.muted, false);
441
497
  });
442
498
 
443
- it('alice update Audio', () => {
444
- const oldVideoTrackId = alice.meeting.mediaProperties.videoTrack.id;
499
+ it('alice update Audio', async () => {
500
+ const newMicrophoneStream = await createMicrophoneStream();
501
+ const newStreamPublished = waitForPublished(alice.meeting, {stream: newMicrophoneStream, status: true}, "Alice AUDIO: new microphone stream");
445
502
 
446
- return alice.meeting.getMediaStreams({sendAudio: true}).then((response) =>
447
- Promise.all([
448
- testUtils.delayedPromise(
449
- alice.meeting
450
- .updateAudio({
451
- sendAudio: true,
452
- receiveAudio: true,
453
- stream: response[0],
454
- })
455
- .then(() => {
456
- console.log('AUDIO ', alice.meeting.mediaProperties.audioTrack);
457
- assert.equal(
458
- alice.meeting.mediaProperties.audioTrack.id,
459
- response[0].getAudioTracks()[0].id
460
- );
461
- assert.equal(alice.meeting.mediaProperties.videoTrack.id, oldVideoTrackId);
462
- })
463
- ),
464
- testUtils
465
- .waitForEvents([{scope: alice.meeting, event: 'media:ready'}])
466
- .then((response) => {
467
- console.log('MEDIA:READY event ', response[0].result);
468
- assert.equal(response[0].result.type === 'local', true);
469
- }),
470
- ])
471
- );
503
+ await testUtils.delayedPromise(
504
+ alice.meeting
505
+ .publishStreams({
506
+ microphone: newMicrophoneStream,
507
+ })
508
+ .then(() => {
509
+ console.log('Alice AUDIO: new stream on meeting object:', alice.meeting.mediaProperties.audioStream);
510
+ assert.equal(
511
+ alice.meeting.mediaProperties.audioStream.id,
512
+ newMicrophoneStream.id
513
+ );
514
+ })
515
+ );
516
+
517
+ await newStreamPublished;
518
+
519
+ localStreams.alice.microphone = newMicrophoneStream;
472
520
  });
473
521
 
474
- it('alice update video', () => {
475
- const oldAudioTrackId = alice.meeting.mediaProperties.audioTrack.id;
522
+ it('alice update video', async () => {
523
+ const newCameraStream = await createCameraStream();
524
+ const newStreamPublished = waitForPublished(alice.meeting, {stream: newCameraStream, status: true}, "Alice VIDEO: new camera stream");
476
525
 
477
- return alice.meeting.getMediaStreams({sendVideo: true}).then((response) =>
478
- Promise.all([
479
- testUtils.delayedPromise(
480
- alice.meeting
481
- .updateVideo({
482
- sendVideo: true,
483
- receiveVideo: true,
484
- stream: response[0],
485
- })
486
- .then(() => {
487
- assert.equal(
488
- alice.meeting.mediaProperties.videoTrack.id,
489
- response[0].getVideoTracks()[0].id
490
- );
491
- assert.equal(alice.meeting.mediaProperties.audioTrack.id, oldAudioTrackId);
492
- })
493
- ),
494
- testUtils
495
- .waitForEvents([{scope: alice.meeting, event: 'media:ready'}])
496
- .then((response) => {
497
- console.log('MEDIA:READY event ', response[0].result);
498
- assert.equal(response[0].result.type === 'local', true);
499
- }),
500
- ])
501
- );
526
+ await testUtils.delayedPromise(
527
+ alice.meeting
528
+ .publishStreams({
529
+ camera: newCameraStream,
530
+ })
531
+ .then(() => {
532
+ console.log('Alice VIDEO: new stream on meeting:', alice.meeting.mediaProperties.videoStream);
533
+ assert.equal(
534
+ alice.meeting.mediaProperties.videoStream.id,
535
+ newCameraStream.id
536
+ );
537
+ })
538
+ );
539
+
540
+ await newStreamPublished;
541
+
542
+ localStreams.alice.camera = newCameraStream;
502
543
  });
503
544
 
504
545
  it('alice mutes bob', () =>
@@ -522,27 +563,25 @@ skipInNode(describe)('plugin-meetings', () => {
522
563
  }),
523
564
  ]));
524
565
 
525
- it('bob audio mute, so alice cannot unmute bob', (done) => {
566
+ it('bob audio mute, so alice cannot unmute bob', async () => {
526
567
  const checkEvent = (event) =>
527
568
  !!event.delta.updated.find(
528
569
  (member) => bob.meeting.members.selfId === member.id && member.isAudioMuted === true
529
570
  );
530
571
 
572
+ const membersUpdate = testUtils.waitForEvents([
573
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
574
+ ]);
575
+
531
576
  // first bob mutes himself
532
- Promise.all([
533
- testUtils.delayedPromise(bob.meeting.muteAudio()),
534
- testUtils.waitForEvents([
535
- {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
536
- ]),
537
- ])
538
- .then(() => {
539
- assert.equal(bob.meeting.audio.muted, true);
540
- assert.equal(bob.meeting.isAudioMuted(), true);
541
- })
542
- // now alice tries to unmmut bob
543
- .then(() =>
544
- testUtils.delayedPromise(alice.meeting.mute(bob.meeting.members.selfId, false))
545
- )
577
+ localStreams.bob.microphone.setMuted(true);
578
+
579
+ await membersUpdate;
580
+
581
+ assert.equal(localStreams.bob.microphone.muted, true);
582
+
583
+ // now alice tries to unmmute bob
584
+ await testUtils.delayedPromise(alice.meeting.mute(bob.meeting.members.selfId, false))
546
585
  // expect the waitForEvents to timeout
547
586
  .then(() =>
548
587
  testUtils.waitForEvents(
@@ -554,126 +593,121 @@ skipInNode(describe)('plugin-meetings', () => {
554
593
  assert.fail('bob received unexpected meeting:self:unmutedByOthers event');
555
594
  })
556
595
  .catch(() => {
557
- assert.equal(bob.meeting.audio.muted, true);
558
- assert.equal(bob.meeting.isAudioMuted(), true);
559
- done();
596
+ assert.equal(localStreams.bob.microphone.muted, true);
560
597
  });
561
598
  });
562
599
 
563
- it('bob audio unmute ', () => {
600
+ it('bob audio unmute ', async () => {
564
601
  const checkEvent = (event) =>
565
602
  !!event.delta.updated.find(
566
603
  (member) => bob.meeting.members.selfId === member.id && member.isAudioMuted === false
567
604
  );
568
605
 
569
- return Promise.all([
570
- testUtils.delayedPromise(bob.meeting.unmuteAudio()),
571
- testUtils.waitForEvents([
572
- {scope: alice.meeting.members, event: 'members:update', match: checkEvent},
573
- ]),
574
- ]).then(() => {
575
- assert.equal(bob.meeting.audio.muted, false);
576
- assert.equal(bob.meeting.isAudioMuted(), false);
577
- });
606
+ const membersUpdate = testUtils.waitForEvents([
607
+ {scope: alice.meeting.members, event: 'members:update', match: checkEvent},
608
+ ]);
609
+
610
+ localStreams.bob.microphone.setMuted(false);
611
+
612
+ await membersUpdate;
613
+
614
+ assert.equal(localStreams.bob.microphone.muted, false);
578
615
  });
579
616
 
580
- it('alice shares the screen with highFrameRate', () =>
581
- Promise.all([
582
- testUtils.delayedPromise(
583
- alice.meeting.shareScreen({sharePreferences: {highFrameRate: true}})
584
- ),
585
- testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingLocal'}]),
586
- testUtils
587
- .waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingRemote'}])
588
- .then((response) => {
589
- assert.equal(response[0].result.memberId, alice.meeting.selfId);
590
- }),
591
- testUtils
592
- .waitForEvents([{scope: bob.meeting.members, event: 'members:update'}])
593
- .then((response) => {
594
- console.log(
595
- 'SCREEN SHARE RESPONSE ',
596
- JSON.stringify(response, testUtils.getCircularReplacer())
597
- );
598
- }),
599
- testUtils
600
- .waitForEvents([{scope: alice.meeting, event: 'media:ready'}])
601
- .then((response) => {
602
- console.log('MEDIA:READY event ', response[0].result);
603
- assert.equal(response[0].result.type === 'localShare', true);
604
- }),
605
- ]).then(() => {
606
- // TODO: Re-eanable Safari when screensharing issues have been resolved
607
- if (!isBrowser('safari')) {
608
- assert.equal(alice.meeting.mediaProperties.shareTrack.getConstraints().height, 720);
609
- }
610
- assert.equal(alice.meeting.isSharing, true);
611
- assert.equal(alice.meeting.shareStatus, 'local_share_active');
612
- assert.equal(bob.meeting.shareStatus, 'remote_share_active');
613
- console.log(
614
- 'SCREEN SHARE PARTICIPANTS ',
615
- JSON.stringify(alice.meeting.locusInfo.participants)
616
- );
617
+ it('alice shares the screen with highFrameRate', async () => {
618
+ localStreams.alice.screenShare.video = await createDisplayStream();
617
619
 
618
- return testUtils.waitUntil(10000);
619
- }));
620
+ const startedSharingLocal = testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingLocal'}]);
621
+ const startedSharingRemote = testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingRemote'}])
622
+ .then((response) => {
623
+ assert.equal(response[0].result.memberId, alice.meeting.selfId);
624
+ });
625
+ const bobReceivesMembersUpdate = testUtils.waitForEvents([{scope: bob.meeting.members, event: 'members:update'}])
626
+ .then((response) => {
627
+ console.log(
628
+ 'SCREEN SHARE RESPONSE ',
629
+ JSON.stringify(response, testUtils.getCircularReplacer())
630
+ );
631
+ });
620
632
 
621
- it('bob steals the screen share from alice', () =>
622
- Promise.all([
623
- testUtils.delayedPromise(bob.meeting.shareScreen()),
624
- testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingLocal'}]),
625
- testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingLocal'}]),
626
- testUtils
627
- .waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingRemote'}])
628
- .then((response) => {
629
- assert.equal(response[0].result.memberId, bob.meeting.selfId);
630
- }),
631
- testUtils
632
- .waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
633
- .then((response) => {
634
- console.log(
635
- 'SCREEN SHARE RESPONSE ',
636
- JSON.stringify(response, testUtils.getCircularReplacer())
637
- );
638
- }),
639
- testUtils.waitForEvents([{scope: bob.meeting, event: 'media:ready'}]).then((response) => {
640
- console.log('MEDIA:READY event ', response[0].result);
641
- assert.equal(response[0].result.type === 'localShare', true);
642
- }),
643
- ]).then(() => {
644
- const heightResolution = DEFAULT_RESOLUTIONS.meetings.screenResolution.idealHeight;
633
+ const screenShareVideoPublished = waitForPublished(alice.meeting, {stream: localStreams.alice.screenShare.video, status: true}, "alice's screen share video stream");
634
+
635
+ await testUtils.delayedPromise(alice.meeting.publishStreams({screenShare: {video: localStreams.alice.screenShare.video}}));
636
+
637
+ await screenShareVideoPublished;
638
+ await startedSharingLocal;
639
+ await startedSharingRemote;
640
+ await bobReceivesMembersUpdate;
641
+
642
+ assert.equal(alice.meeting.screenShareFloorState, 'floor_request_granted');
643
+ assert.equal(alice.meeting.shareStatus, 'local_share_active');
644
+ assert.equal(bob.meeting.shareStatus, 'remote_share_active');
645
+ console.log(
646
+ 'SCREEN SHARE PARTICIPANTS ',
647
+ JSON.stringify(alice.meeting.locusInfo.participants)
648
+ );
649
+
650
+ await testUtils.waitUntil(10000);
651
+ });
645
652
 
646
- // TODO: Re-eanable Safari when screensharing issues have been resolved
647
- if (!isBrowser('safari')) {
648
- assert.equal(
649
- bob.meeting.mediaProperties.shareTrack.getConstraints().height,
650
- heightResolution
653
+ it('bob steals the screen share from alice', async () => {
654
+ localStreams.bob.screenShare.video = await createDisplayStream();
655
+
656
+ const stoppedSharingLocal = testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingLocal'}]);
657
+ const startedSharingLocal = testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingLocal'}]);
658
+ const startedSharingRemote = testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingRemote'}])
659
+ .then((response) => {
660
+ assert.equal(response[0].result.memberId, bob.meeting.selfId);
661
+ });
662
+ const aliceReceivesMembersUpdate = testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
663
+ .then((response) => {
664
+ console.log(
665
+ 'SCREEN SHARE RESPONSE ',
666
+ JSON.stringify(response, testUtils.getCircularReplacer())
651
667
  );
652
- }
653
- assert.equal(bob.meeting.isSharing, true);
654
- assert.equal(bob.meeting.shareStatus, 'local_share_active');
655
- assert.equal(alice.meeting.shareStatus, 'remote_share_active');
668
+ });
669
+ const aliceScreenShareVideoUnpublished = waitForPublished(alice.meeting, {stream: localStreams.alice.screenShare.video, status: false}, "alice's screen share video stream");
670
+ const bobScreenShareVideoPublished = waitForPublished(bob.meeting, {stream: localStreams.bob.screenShare.video, status: true}, "bob's screen share video stream");
656
671
 
657
- return testUtils.waitUntil(10000);
658
- }));
672
+ await testUtils.delayedPromise(bob.meeting.publishStreams({screenShare: {video: localStreams.bob.screenShare.video}}));
659
673
 
660
- it('bob stops sharing ', () =>
661
- Promise.all([
662
- // Wait for peerConnection to stabalize
663
- testUtils.waitUntil(20000),
664
- testUtils.delayedPromise(
665
- bob.meeting.updateShare({
666
- sendShare: false,
667
- receiveShare: true,
668
- })
669
- ),
670
- testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:stoppedSharingLocal'}]),
671
- testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingRemote'}]),
672
- ]).then(() => {
673
- assert.equal(bob.meeting.isSharing, false);
674
- assert.equal(bob.meeting.shareStatus, 'no_share');
675
- assert.equal(alice.meeting.shareStatus, 'no_share');
676
- }));
674
+ await bobScreenShareVideoPublished;
675
+ await aliceScreenShareVideoUnpublished;
676
+ await stoppedSharingLocal;
677
+ await startedSharingLocal;
678
+ await startedSharingRemote;
679
+ await aliceReceivesMembersUpdate;
680
+
681
+ localStreams.alice.screenShare.video.stop();
682
+ localStreams.alice.screenShare.video = undefined;
683
+
684
+ assert.equal(bob.meeting.screenShareFloorState, 'floor_request_granted');
685
+ assert.equal(bob.meeting.shareStatus, 'local_share_active');
686
+ assert.equal(alice.meeting.shareStatus, 'remote_share_active');
687
+
688
+ await testUtils.waitUntil(10000);
689
+ });
690
+
691
+ it('bob stops sharing', async () => {
692
+ const screenShareVideoUnpublished = waitForPublished(bob.meeting, {stream: localStreams.bob.screenShare.video, status: false}, "bob's screen share video stream");
693
+ const stoppedSharingLocal = testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:stoppedSharingLocal'}]);
694
+ const stoppedSharingRemote = testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingRemote'}]);
695
+
696
+ await testUtils.delayedPromise(bob.meeting.unpublishStreams([localStreams.bob.screenShare.video]));
697
+
698
+ await screenShareVideoUnpublished;
699
+ await stoppedSharingLocal;
700
+ await stoppedSharingRemote;
701
+
702
+ localStreams.bob.screenShare.video.stop();
703
+ localStreams.bob.screenShare.video = undefined;
704
+
705
+ assert.equal(bob.meeting.screenShareFloorState, 'floor_released');
706
+ assert.equal(bob.meeting.shareStatus, 'no_share');
707
+ assert.equal(alice.meeting.shareStatus, 'no_share');
708
+
709
+ await testUtils.waitUntil(10000);
710
+ });
677
711
 
678
712
  it('alice shares whiteboard A', () =>
679
713
  Promise.all([
@@ -698,7 +732,7 @@ skipInNode(describe)('plugin-meetings', () => {
698
732
  );
699
733
  }),
700
734
  ]).then(() => {
701
- assert.equal(alice.meeting.isSharing, false);
735
+ assert.equal(alice.meeting.screenShareFloorState, 'floor_released');
702
736
  assert.equal(alice.meeting.shareStatus, 'whiteboard_share_active');
703
737
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
704
738
  }));
@@ -726,12 +760,12 @@ skipInNode(describe)('plugin-meetings', () => {
726
760
  );
727
761
  }),
728
762
  ]).then(() => {
729
- assert.equal(bob.meeting.isSharing, false);
763
+ assert.equal(bob.meeting.screenShareFloorState, 'floor_released');
730
764
  assert.equal(alice.meeting.shareStatus, 'whiteboard_share_active');
731
765
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
732
766
  }));
733
767
 
734
- it('bob stops sharing ', () =>
768
+ it('bob stops sharing again', () =>
735
769
  Promise.all([
736
770
  // Wait for peerConnection to stabalize
737
771
  testUtils.waitUntil(20000),
@@ -743,7 +777,7 @@ skipInNode(describe)('plugin-meetings', () => {
743
777
  {scope: alice.meeting, event: 'meeting:stoppedSharingWhiteboard'},
744
778
  ]),
745
779
  ]).then(() => {
746
- assert.equal(bob.meeting.isSharing, false);
780
+ assert.equal(bob.meeting.screenShareFloorState, 'floor_released');
747
781
  assert.equal(bob.meeting.shareStatus, 'no_share');
748
782
  assert.equal(alice.meeting.shareStatus, 'no_share');
749
783
  }));
@@ -771,51 +805,43 @@ skipInNode(describe)('plugin-meetings', () => {
771
805
  );
772
806
  }),
773
807
  ]).then(() => {
774
- assert.equal(alice.meeting.isSharing, false);
808
+ assert.equal(alice.meeting.screenShareFloorState, 'floor_released');
775
809
  assert.equal(alice.meeting.shareStatus, 'whiteboard_share_active');
776
810
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
777
811
  }));
778
812
 
779
- it('bob steals the share from alice with desktop share', () =>
780
- Promise.all([
781
- testUtils.delayedPromise(bob.meeting.shareScreen()),
782
- testUtils.waitForEvents([
783
- {scope: alice.meeting, event: 'meeting:stoppedSharingWhiteboard'},
784
- ]),
785
- testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingLocal'}]),
786
- testUtils
787
- .waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingRemote'}])
788
- .then((response) => {
789
- assert.equal(response[0].result.memberId, bob.meeting.selfId);
790
- }),
791
- testUtils
792
- .waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
793
- .then((response) => {
794
- console.log(
795
- 'SCREEN SHARE RESPONSE ',
796
- JSON.stringify(response, testUtils.getCircularReplacer())
797
- );
798
- }),
799
- testUtils.waitForEvents([{scope: bob.meeting, event: 'media:ready'}]).then((response) => {
800
- console.log('MEDIA:READY event ', response[0].result);
801
- assert.equal(response[0].result.type === 'localShare', true);
802
- }),
803
- ]).then(() => {
804
- const heightResolution = DEFAULT_RESOLUTIONS.meetings.screenResolution.idealHeight;
813
+ it('bob steals the share from alice with desktop share', async () => {
814
+ localStreams.bob.screenShare.video = await createDisplayStream();
805
815
 
806
- // TODO: Re-eanable Safari when screensharing issues have been resolved
807
- if (!isBrowser('safari')) {
808
- assert.equal(
809
- bob.meeting.mediaProperties.shareTrack.getConstraints().height,
810
- heightResolution
816
+ const stoppedSharingWhiteboard = testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingWhiteboard'}]);
817
+ const startedSharingLocal = testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingLocal'}]);
818
+ const startedSharingRemote = testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingRemote'}])
819
+ .then((response) => {
820
+ assert.equal(response[0].result.memberId, bob.meeting.selfId);
821
+ });
822
+ const aliceReceivesMembersUpdate = testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
823
+ .then((response) => {
824
+ console.log(
825
+ 'SCREEN SHARE RESPONSE ',
826
+ JSON.stringify(response, testUtils.getCircularReplacer())
811
827
  );
812
- }
813
- assert.equal(bob.meeting.isSharing, true);
814
- assert.equal(bob.meeting.shareStatus, 'local_share_active');
815
- assert.equal(alice.meeting.shareStatus, 'remote_share_active');
828
+ });
829
+ const bobScreenShareVideoPublished = waitForPublished(bob.meeting, {stream: localStreams.bob.screenShare.video, status: true}, "bob's screen share video stream");
816
830
 
817
- return testUtils.waitUntil(10000);
818
- }));
831
+ await testUtils.delayedPromise(bob.meeting.publishStreams({screenShare: {video: localStreams.bob.screenShare.video}}));
832
+
833
+ await bobScreenShareVideoPublished;
834
+ await stoppedSharingWhiteboard;
835
+ await startedSharingLocal;
836
+ await startedSharingRemote;
837
+ await aliceReceivesMembersUpdate;
838
+
839
+ assert.equal(bob.meeting.screenShareFloorState, 'floor_request_granted');
840
+ assert.equal(bob.meeting.shareStatus, 'local_share_active');
841
+ assert.equal(alice.meeting.shareStatus, 'remote_share_active');
842
+
843
+ await testUtils.waitUntil(10000);
844
+ });
819
845
 
820
846
  it('bob shares whiteboard B', () =>
821
847
  Promise.all([
@@ -840,7 +866,7 @@ skipInNode(describe)('plugin-meetings', () => {
840
866
  );
841
867
  }),
842
868
  ]).then(() => {
843
- assert.equal(bob.meeting.isSharing, false);
869
+ assert.equal(bob.meeting.screenShareFloorState, 'floor_released');
844
870
  assert.equal(alice.meeting.shareStatus, 'whiteboard_share_active');
845
871
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
846
872
  }));
@@ -886,7 +912,11 @@ skipInNode(describe)('plugin-meetings', () => {
886
912
  );
887
913
  })
888
914
  .then(() => testUtils.waitForStateChange(chris.meeting, 'JOINED'))
889
- .then(() => testUtils.addMedia(chris))
915
+ .then(async () => {
916
+ localStreams.chris.microphone = await createMicrophoneStream();
917
+ localStreams.chris.camera = await createCameraStream();
918
+ })
919
+ .then(() => integrationTestUtils.addMedia(chris, {microphone: localStreams.chris.microphone, camera: localStreams.chris.camera}))
890
920
  .then(() => assert(enumerateSpy.called));
891
921
  })
892
922
  .then(() =>
@@ -933,6 +963,35 @@ skipInNode(describe)('plugin-meetings', () => {
933
963
  assert.equal(bob.webex.meetings.getMeetingByType('sipUri', alice.emailAddress), null);
934
964
  });
935
965
  });
966
+
967
+ it('stop all local streams', () => {
968
+ if (localStreams.alice.microphone) {
969
+ localStreams.alice.microphone.stop();
970
+ localStreams.alice.microphone = undefined;
971
+ }
972
+ if (localStreams.alice.camera) {
973
+ localStreams.alice.camera.stop();
974
+ localStreams.alice.camera = undefined;
975
+ }
976
+
977
+ if (localStreams.bob.microphone) {
978
+ localStreams.bob.microphone.stop();
979
+ localStreams.bob.microphone = undefined;
980
+ }
981
+ if (localStreams.bob.camera) {
982
+ localStreams.bob.camera.stop();
983
+ localStreams.bob.camera = undefined;
984
+ }
985
+
986
+ if (localStreams.chris.microphone) {
987
+ localStreams.chris.microphone.stop();
988
+ localStreams.chris.microphone = undefined;
989
+ }
990
+ if (localStreams.chris.camera) {
991
+ localStreams.chris.camera.stop();
992
+ localStreams.chris.camera = undefined;
993
+ }
994
+ });
936
995
  });
937
996
  });
938
997
  });