@webex/plugin-meetings 3.0.0-beta.21 → 3.0.0-beta.211

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 (422) hide show
  1. package/README.md +45 -7
  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 +114 -14
  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 +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +3 -2
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +3 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +179 -30
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +319 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +106 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +359 -64
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/infoUtils.js +7 -1
  53. package/dist/locus-info/infoUtils.js.map +1 -1
  54. package/dist/locus-info/mediaSharesUtils.js +43 -1
  55. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  56. package/dist/locus-info/parser.js +219 -63
  57. package/dist/locus-info/parser.js.map +1 -1
  58. package/dist/locus-info/selfUtils.js +89 -14
  59. package/dist/locus-info/selfUtils.js.map +1 -1
  60. package/dist/media/index.js +48 -135
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +29 -90
  63. package/dist/media/properties.js.map +1 -1
  64. package/dist/mediaQualityMetrics/config.js +505 -493
  65. package/dist/mediaQualityMetrics/config.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +90 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +2770 -2547
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +291 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +229 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +199 -193
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +532 -414
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +48 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +171 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/utilv2.js +20 -5
  83. package/dist/meeting-info/utilv2.js.map +1 -1
  84. package/dist/meetings/collection.js +22 -0
  85. package/dist/meetings/collection.js.map +1 -1
  86. package/dist/meetings/index.js +357 -66
  87. package/dist/meetings/index.js.map +1 -1
  88. package/dist/meetings/meetings.types.js +7 -0
  89. package/dist/meetings/meetings.types.js.map +1 -0
  90. package/dist/meetings/request.js +2 -0
  91. package/dist/meetings/request.js.map +1 -1
  92. package/dist/meetings/util.js +88 -1
  93. package/dist/meetings/util.js.map +1 -1
  94. package/dist/member/index.js +49 -0
  95. package/dist/member/index.js.map +1 -1
  96. package/dist/member/types.js +25 -0
  97. package/dist/member/types.js.map +1 -0
  98. package/dist/member/util.js +121 -25
  99. package/dist/member/util.js.map +1 -1
  100. package/dist/members/collection.js +10 -0
  101. package/dist/members/collection.js.map +1 -1
  102. package/dist/members/index.js +86 -5
  103. package/dist/members/index.js.map +1 -1
  104. package/dist/members/request.js +106 -38
  105. package/dist/members/request.js.map +1 -1
  106. package/dist/members/types.js +15 -0
  107. package/dist/members/types.js.map +1 -0
  108. package/dist/members/util.js +316 -233
  109. package/dist/members/util.js.map +1 -1
  110. package/dist/metrics/constants.js +3 -5
  111. package/dist/metrics/constants.js.map +1 -1
  112. package/dist/metrics/index.js +1 -468
  113. package/dist/metrics/index.js.map +1 -1
  114. package/dist/multistream/mediaRequestManager.js +238 -49
  115. package/dist/multistream/mediaRequestManager.js.map +1 -1
  116. package/dist/multistream/receiveSlot.js +49 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +52 -34
  119. package/dist/multistream/receiveSlotManager.js.map +1 -1
  120. package/dist/multistream/remoteMedia.js +44 -18
  121. package/dist/multistream/remoteMedia.js.map +1 -1
  122. package/dist/multistream/remoteMediaGroup.js +60 -3
  123. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  124. package/dist/multistream/remoteMediaManager.js +173 -59
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/networkQualityMonitor/index.js +4 -2
  127. package/dist/networkQualityMonitor/index.js.map +1 -1
  128. package/dist/reachability/index.js +72 -27
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +12 -5
  131. package/dist/reachability/request.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +196 -155
  133. package/dist/reconnection-manager/index.js.map +1 -1
  134. package/dist/recording-controller/index.js +21 -2
  135. package/dist/recording-controller/index.js.map +1 -1
  136. package/dist/recording-controller/util.js +9 -8
  137. package/dist/recording-controller/util.js.map +1 -1
  138. package/dist/roap/index.js +21 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +110 -89
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +93 -36
  143. package/dist/roap/turnDiscovery.js.map +1 -1
  144. package/dist/rtcMetrics/constants.js +12 -0
  145. package/dist/rtcMetrics/constants.js.map +1 -0
  146. package/dist/rtcMetrics/index.js +117 -0
  147. package/dist/rtcMetrics/index.js.map +1 -0
  148. package/dist/statsAnalyzer/global.js +1 -93
  149. package/dist/statsAnalyzer/global.js.map +1 -1
  150. package/dist/statsAnalyzer/index.js +326 -311
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  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/breakout.d.ts +8 -0
  158. package/dist/types/breakouts/collection.d.ts +5 -0
  159. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  160. package/dist/types/breakouts/events.d.ts +8 -0
  161. package/dist/types/breakouts/index.d.ts +5 -0
  162. package/dist/types/breakouts/request.d.ts +22 -0
  163. package/dist/types/breakouts/utils.d.ts +15 -0
  164. package/dist/types/common/browser-detection.d.ts +9 -0
  165. package/dist/types/common/collection.d.ts +48 -0
  166. package/dist/types/common/config.d.ts +2 -0
  167. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  168. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  169. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  170. package/dist/types/common/errors/media.d.ts +15 -0
  171. package/dist/types/common/errors/parameter.d.ts +15 -0
  172. package/dist/types/common/errors/password-error.d.ts +15 -0
  173. package/dist/types/common/errors/permission.d.ts +14 -0
  174. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  175. package/dist/types/common/errors/reconnection.d.ts +15 -0
  176. package/dist/types/common/errors/stats.d.ts +15 -0
  177. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  178. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  179. package/dist/types/common/events/events-scope.d.ts +17 -0
  180. package/dist/types/common/events/events.d.ts +12 -0
  181. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  182. package/dist/types/common/events/util.d.ts +2 -0
  183. package/dist/types/common/logs/logger-config.d.ts +2 -0
  184. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  185. package/dist/types/common/logs/request.d.ts +34 -0
  186. package/dist/types/common/queue.d.ts +34 -0
  187. package/dist/types/config.d.ts +72 -0
  188. package/dist/types/constants.d.ts +1020 -0
  189. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  190. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  191. package/dist/types/controls-options-manager/index.d.ts +136 -0
  192. package/dist/types/controls-options-manager/types.d.ts +43 -0
  193. package/dist/types/controls-options-manager/util.d.ts +1 -0
  194. package/dist/types/index.d.ts +7 -0
  195. package/dist/types/interpretation/collection.d.ts +5 -0
  196. package/dist/types/interpretation/index.d.ts +5 -0
  197. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  198. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  199. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  200. package/dist/types/locus-info/fullState.d.ts +2 -0
  201. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  202. package/dist/types/locus-info/index.d.ts +322 -0
  203. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  204. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  205. package/dist/types/locus-info/parser.d.ts +271 -0
  206. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  207. package/dist/types/media/index.d.ts +34 -0
  208. package/dist/types/media/properties.d.ts +93 -0
  209. package/dist/types/media/util.d.ts +2 -0
  210. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  211. package/dist/types/meeting/in-meeting-actions.d.ts +163 -0
  212. package/dist/types/meeting/index.d.ts +1482 -0
  213. package/dist/types/meeting/locusMediaRequest.d.ts +72 -0
  214. package/dist/types/meeting/muteState.d.ts +184 -0
  215. package/dist/types/meeting/request.d.ts +257 -0
  216. package/dist/types/meeting/request.type.d.ts +11 -0
  217. package/dist/types/meeting/state.d.ts +9 -0
  218. package/dist/types/meeting/util.d.ts +79 -0
  219. package/dist/types/meeting-info/collection.d.ts +20 -0
  220. package/dist/types/meeting-info/index.d.ts +62 -0
  221. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  222. package/dist/types/meeting-info/request.d.ts +22 -0
  223. package/dist/types/meeting-info/util.d.ts +2 -0
  224. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  225. package/dist/types/meetings/collection.d.ts +31 -0
  226. package/dist/types/meetings/index.d.ts +367 -0
  227. package/dist/types/meetings/meetings.types.d.ts +4 -0
  228. package/dist/types/meetings/request.d.ts +27 -0
  229. package/dist/types/meetings/util.d.ts +18 -0
  230. package/dist/types/member/index.d.ts +159 -0
  231. package/dist/types/member/types.d.ts +32 -0
  232. package/dist/types/member/util.d.ts +2 -0
  233. package/dist/types/members/collection.d.ts +29 -0
  234. package/dist/types/members/index.d.ts +353 -0
  235. package/dist/types/members/request.d.ts +114 -0
  236. package/dist/types/members/types.d.ts +24 -0
  237. package/dist/types/members/util.d.ts +210 -0
  238. package/dist/types/metrics/constants.d.ts +55 -0
  239. package/dist/types/metrics/index.d.ts +45 -0
  240. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  241. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  242. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  243. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  244. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  245. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  246. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  247. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  248. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  249. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  250. package/dist/types/reachability/index.d.ts +152 -0
  251. package/dist/types/reachability/request.d.ts +37 -0
  252. package/dist/types/reactions/constants.d.ts +3 -0
  253. package/dist/types/reactions/reactions.d.ts +4 -0
  254. package/dist/types/reactions/reactions.type.d.ts +52 -0
  255. package/dist/types/reconnection-manager/index.d.ts +126 -0
  256. package/dist/types/recording-controller/enums.d.ts +7 -0
  257. package/dist/types/recording-controller/index.d.ts +207 -0
  258. package/dist/types/recording-controller/util.d.ts +14 -0
  259. package/dist/types/roap/index.d.ts +77 -0
  260. package/dist/types/roap/request.d.ts +36 -0
  261. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  262. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  263. package/dist/types/rtcMetrics/index.d.ts +46 -0
  264. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  265. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  266. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  267. package/dist/types/transcription/index.d.ts +64 -0
  268. package/package.json +23 -20
  269. package/src/annotation/annotation.types.ts +50 -0
  270. package/src/annotation/constants.ts +36 -0
  271. package/src/annotation/index.ts +328 -0
  272. package/src/breakouts/README.md +44 -14
  273. package/src/breakouts/breakout.ts +87 -9
  274. package/src/breakouts/edit-lock-error.ts +25 -0
  275. package/src/breakouts/events.ts +56 -0
  276. package/src/breakouts/index.ts +710 -10
  277. package/src/breakouts/request.ts +55 -0
  278. package/src/breakouts/utils.ts +57 -0
  279. package/src/common/errors/webex-errors.ts +6 -2
  280. package/src/common/logs/logger-proxy.ts +1 -1
  281. package/src/common/queue.ts +22 -8
  282. package/src/config.ts +2 -7
  283. package/src/constants.ts +165 -21
  284. package/src/controls-options-manager/constants.ts +5 -0
  285. package/src/controls-options-manager/enums.ts +18 -0
  286. package/src/controls-options-manager/index.ts +278 -0
  287. package/src/controls-options-manager/types.ts +59 -0
  288. package/src/controls-options-manager/util.ts +300 -0
  289. package/src/index.ts +39 -0
  290. package/src/interpretation/README.md +60 -0
  291. package/src/interpretation/collection.ts +19 -0
  292. package/src/interpretation/index.ts +332 -0
  293. package/src/interpretation/siLanguage.ts +18 -0
  294. package/src/locus-info/controlsUtils.ts +108 -0
  295. package/src/locus-info/index.ts +383 -61
  296. package/src/locus-info/infoUtils.ts +10 -2
  297. package/src/locus-info/mediaSharesUtils.ts +48 -0
  298. package/src/locus-info/parser.ts +224 -39
  299. package/src/locus-info/selfUtils.ts +81 -5
  300. package/src/media/index.ts +87 -140
  301. package/src/media/properties.ts +49 -90
  302. package/src/mediaQualityMetrics/config.ts +379 -377
  303. package/src/meeting/in-meeting-actions.ts +179 -3
  304. package/src/meeting/index.ts +2099 -2083
  305. package/src/meeting/locusMediaRequest.ts +311 -0
  306. package/src/meeting/muteState.ts +228 -132
  307. package/src/meeting/request.ts +105 -115
  308. package/src/meeting/util.ts +511 -397
  309. package/src/meeting-info/index.ts +54 -8
  310. package/src/meeting-info/meeting-info-v2.ts +148 -14
  311. package/src/meeting-info/utilv2.ts +13 -3
  312. package/src/meetings/collection.ts +20 -0
  313. package/src/meetings/index.ts +392 -84
  314. package/src/meetings/meetings.types.ts +12 -0
  315. package/src/meetings/request.ts +2 -0
  316. package/src/meetings/util.ts +103 -4
  317. package/src/member/index.ts +49 -0
  318. package/src/member/types.ts +38 -0
  319. package/src/member/util.ts +127 -25
  320. package/src/members/collection.ts +8 -0
  321. package/src/members/index.ts +107 -6
  322. package/src/members/request.ts +97 -17
  323. package/src/members/types.ts +28 -0
  324. package/src/members/util.ts +319 -240
  325. package/src/metrics/constants.ts +2 -4
  326. package/src/metrics/index.ts +1 -490
  327. package/src/multistream/mediaRequestManager.ts +289 -79
  328. package/src/multistream/receiveSlot.ts +55 -18
  329. package/src/multistream/receiveSlotManager.ts +46 -24
  330. package/src/multistream/remoteMedia.ts +27 -2
  331. package/src/multistream/remoteMediaGroup.ts +59 -0
  332. package/src/multistream/remoteMediaManager.ts +113 -32
  333. package/src/networkQualityMonitor/index.ts +6 -6
  334. package/src/reachability/index.ts +62 -15
  335. package/src/reachability/request.ts +10 -5
  336. package/src/reconnection-manager/index.ts +68 -43
  337. package/src/recording-controller/index.ts +20 -3
  338. package/src/recording-controller/util.ts +26 -9
  339. package/src/roap/index.ts +21 -30
  340. package/src/roap/request.ts +101 -95
  341. package/src/roap/turnDiscovery.ts +47 -25
  342. package/src/rtcMetrics/constants.ts +3 -0
  343. package/src/rtcMetrics/index.ts +100 -0
  344. package/src/statsAnalyzer/global.ts +1 -94
  345. package/src/statsAnalyzer/index.ts +376 -386
  346. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  347. package/test/integration/spec/converged-space-meetings.js +233 -0
  348. package/test/integration/spec/journey.js +336 -259
  349. package/test/integration/spec/space-meeting.js +77 -4
  350. package/test/unit/spec/annotation/index.ts +418 -0
  351. package/test/unit/spec/breakouts/breakout.ts +142 -24
  352. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  353. package/test/unit/spec/breakouts/events.ts +89 -0
  354. package/test/unit/spec/breakouts/index.ts +1545 -48
  355. package/test/unit/spec/breakouts/request.ts +104 -0
  356. package/test/unit/spec/breakouts/utils.js +72 -0
  357. package/test/unit/spec/common/queue.js +31 -2
  358. package/test/unit/spec/controls-options-manager/index.js +287 -0
  359. package/test/unit/spec/controls-options-manager/util.js +582 -0
  360. package/test/unit/spec/fixture/locus.js +1 -0
  361. package/test/unit/spec/interpretation/collection.ts +15 -0
  362. package/test/unit/spec/interpretation/index.ts +589 -0
  363. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  364. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  365. package/test/unit/spec/locus-info/index.js +1169 -36
  366. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  367. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  368. package/test/unit/spec/locus-info/parser.js +62 -22
  369. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  370. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  371. package/test/unit/spec/media/index.ts +138 -28
  372. package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
  373. package/test/unit/spec/meeting/index.js +3573 -1663
  374. package/test/unit/spec/meeting/locusMediaRequest.ts +438 -0
  375. package/test/unit/spec/meeting/muteState.js +370 -208
  376. package/test/unit/spec/meeting/request.js +339 -44
  377. package/test/unit/spec/meeting/utils.js +456 -53
  378. package/test/unit/spec/meeting-info/index.js +181 -0
  379. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  380. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  381. package/test/unit/spec/meetings/collection.js +14 -0
  382. package/test/unit/spec/meetings/index.js +867 -125
  383. package/test/unit/spec/meetings/utils.js +206 -2
  384. package/test/unit/spec/member/index.js +58 -4
  385. package/test/unit/spec/member/util.js +479 -35
  386. package/test/unit/spec/members/index.js +319 -1
  387. package/test/unit/spec/members/request.js +206 -27
  388. package/test/unit/spec/members/utils.js +184 -0
  389. package/test/unit/spec/metrics/index.js +1 -50
  390. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  391. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  392. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  393. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  394. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  395. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  396. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  397. package/test/unit/spec/reachability/index.ts +125 -8
  398. package/test/unit/spec/reachability/request.js +66 -0
  399. package/test/unit/spec/reconnection-manager/index.js +59 -6
  400. package/test/unit/spec/recording-controller/index.js +294 -218
  401. package/test/unit/spec/recording-controller/util.js +223 -96
  402. package/test/unit/spec/roap/index.ts +26 -51
  403. package/test/unit/spec/roap/request.ts +196 -85
  404. package/test/unit/spec/roap/turnDiscovery.ts +30 -7
  405. package/test/unit/spec/rtcMetrics/index.ts +60 -0
  406. package/test/unit/spec/stats-analyzer/index.js +92 -41
  407. package/test/utils/constants.js +9 -0
  408. package/test/utils/integrationTestUtils.js +46 -0
  409. package/test/utils/testUtils.js +0 -45
  410. package/test/utils/webex-config.js +4 -0
  411. package/test/utils/webex-test-users.js +6 -3
  412. package/dist/meeting/effectsState.js +0 -262
  413. package/dist/meeting/effectsState.js.map +0 -1
  414. package/dist/metrics/config.js +0 -299
  415. package/dist/metrics/config.js.map +0 -1
  416. package/dist/multistream/multistreamMedia.js +0 -110
  417. package/dist/multistream/multistreamMedia.js.map +0 -1
  418. package/src/index.js +0 -16
  419. package/src/meeting/effectsState.ts +0 -211
  420. package/src/metrics/config.ts +0 -495
  421. package/src/multistream/multistreamMedia.ts +0 -97
  422. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -6,9 +6,10 @@ 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 {createCameraTrack, createDisplayTrack, createMicrophoneTrack, LocalTrackEvents} 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';
12
13
 
13
14
  require('dotenv').config();
14
15
 
@@ -18,6 +19,42 @@ const {isBrowser} = BrowserDetection();
18
19
 
19
20
  let userSet, alice, bob, chris, enumerateSpy, channelUrlA, channelUrlB;
20
21
 
22
+ const localTracks = {
23
+ alice: {
24
+ microphone: undefined,
25
+ camera: undefined,
26
+ screenShare: {
27
+ video: undefined,
28
+ }
29
+ },
30
+ bob: {
31
+ microphone: undefined,
32
+ camera: undefined,
33
+ screenShare: {
34
+ video: undefined,
35
+ }
36
+ },
37
+ chris: {
38
+ microphone: undefined,
39
+ camera: undefined,
40
+ screenShare: {
41
+ video: undefined,
42
+ }
43
+ },
44
+ };
45
+
46
+
47
+ const waitForPublished = (track, expectedPublished, description) => {
48
+ return testUtils.waitForEvents([{
49
+ scope: track,
50
+ event: LocalTrackEvents.PublishedStateUpdate,
51
+ match: ({isPublished}) => {
52
+ console.log(`${description} is now ${isPublished ? 'published': 'not published'}`);
53
+ return (isPublished === expectedPublished);
54
+ }
55
+ }]);
56
+ };
57
+
21
58
  skipInNode(describe)('plugin-meetings', () => {
22
59
  describe('journey', () => {
23
60
  before(() =>
@@ -274,6 +311,11 @@ skipInNode(describe)('plugin-meetings', () => {
274
311
  );
275
312
  });
276
313
 
314
+ it('alice creates local microphone and camera tracks', async () => {
315
+ localTracks.alice.microphone = await createMicrophoneTrack();
316
+ localTracks.alice.camera = await createCameraTrack();
317
+ });
318
+
277
319
  it('alice dials bob and adds media', () =>
278
320
  Promise.all([
279
321
  testUtils.delayedPromise(alice.webex.meetings.create(bob.emailAddress)),
@@ -301,7 +343,7 @@ skipInNode(describe)('plugin-meetings', () => {
301
343
  })
302
344
  .then(() =>
303
345
  Promise.all([
304
- testUtils.addMedia(alice),
346
+ integrationTestUtils.addMedia(alice, {microphone: localTracks.alice.microphone, camera: localTracks.alice.camera}),
305
347
  testUtils.waitForEvents([
306
348
  {scope: alice.meeting, event: 'meeting:media:local:start', user: alice},
307
349
  ]),
@@ -328,9 +370,14 @@ skipInNode(describe)('plugin-meetings', () => {
328
370
  ]);
329
371
  });
330
372
 
373
+ it('bob creates local microphone and camera tracks', async () => {
374
+ localTracks.bob.microphone = await createMicrophoneTrack();
375
+ localTracks.bob.camera = await createCameraTrack();
376
+ });
377
+
331
378
  it('bob adds media to the meeting', () =>
332
379
  Promise.all([
333
- testUtils.addMedia(bob),
380
+ integrationTestUtils.addMedia(bob, {microphone: localTracks.bob.microphone, camera: localTracks.bob.camera}),
334
381
  testUtils
335
382
  .waitForEvents([
336
383
  {scope: bob.meeting, event: 'meeting:media:local:start', user: bob},
@@ -372,133 +419,146 @@ skipInNode(describe)('plugin-meetings', () => {
372
419
  assert.exists(alice.meeting.members.selfId, 'selfId not present');
373
420
  });
374
421
 
375
- it('alice Audio Mute ', () => {
422
+ it('alice Audio Mute ', async () => {
376
423
  const checkEvent = (event) =>
377
424
  !!event.delta.updated.find(
378
425
  (member) => alice.meeting.members.selfId === member.id && member.isAudioMuted === true
379
426
  );
380
427
 
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
- });
428
+ await testUtils.waitUntil(2000);
429
+
430
+ const membersUpdate = testUtils.waitForEvents([
431
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
432
+ ]);
433
+
434
+ localTracks.alice.microphone.setMuted(true);
435
+
436
+ await membersUpdate;
437
+
438
+ assert.equal(localTracks.alice.microphone.muted, true);
390
439
  });
391
440
 
392
- it('alice Audio unMute ', () => {
441
+ it('alice Audio unMute ', async () => {
393
442
  const checkEvent = (event) =>
394
443
  !!event.delta.updated.find(
395
444
  (member) => alice.meeting.members.selfId === member.id && member.isAudioMuted === false
396
445
  );
397
446
 
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
- });
447
+ await testUtils.waitUntil(2000);
448
+
449
+ const membersUpdate = testUtils.waitForEvents([
450
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
451
+ ]);
452
+
453
+ localTracks.alice.microphone.setMuted(false);
454
+
455
+ await membersUpdate;
456
+
457
+ assert.equal(localTracks.alice.microphone.muted, false);
407
458
  });
408
459
 
409
- it('alice Video Mute', () => {
460
+ it('alice video mute', async () => {
410
461
  const checkEvent = (event) =>
411
462
  !!event.delta.updated.find(
412
463
  (member) => alice.meeting.members.selfId === member.id && member.isVideoMuted === true
413
464
  );
414
465
 
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
- });
466
+ await testUtils.waitUntil(2000);
467
+
468
+ const membersUpdate = testUtils.waitForEvents([
469
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
470
+ ]);
471
+
472
+ localTracks.alice.camera.setMuted(true);
473
+
474
+ await membersUpdate;
475
+
476
+ assert.equal(localTracks.alice.camera.muted, true);
424
477
  });
425
478
 
426
- it('alice video unMute', () => {
479
+ it('alice video unmute', async () => {
427
480
  const checkEvent = (event) =>
428
481
  !!event.delta.updated.find(
429
482
  (member) => alice.meeting.members.selfId === member.id && member.isVideoMuted === false
430
483
  );
431
484
 
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
- });
485
+ await testUtils.waitUntil(2000);
486
+
487
+ const membersUpdate = testUtils.waitForEvents([
488
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
489
+ ]);
490
+
491
+ localTracks.alice.camera.setMuted(false);
492
+
493
+ await membersUpdate;
494
+
495
+ assert.equal(localTracks.alice.camera.muted, false);
441
496
  });
442
497
 
443
- it('alice update Audio', () => {
498
+ it('alice update Audio', async () => {
444
499
  const oldVideoTrackId = alice.meeting.mediaProperties.videoTrack.id;
445
500
 
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
- );
501
+ const oldMicrophoneTrack = localTracks.alice.microphone;
502
+ const newMicrophoneTrack = await createMicrophoneTrack();
503
+
504
+ assert.equal(oldMicrophoneTrack.published, true);
505
+ assert.notEqual(oldMicrophoneTrack.id, newMicrophoneTrack.id);
506
+
507
+ const oldTrackUnpublished = waitForPublished(oldMicrophoneTrack, false, "Alice AUDIO: old microphone track");
508
+ const newTrackPublished = waitForPublished(newMicrophoneTrack, true, "Alice AUDIO: new microphone track");
509
+
510
+ await testUtils.delayedPromise(
511
+ alice.meeting
512
+ .publishTracks({
513
+ microphone: newMicrophoneTrack,
514
+ })
515
+ .then(() => {
516
+ console.log('Alice AUDIO: new track on meeting object:', alice.meeting.mediaProperties.audioTrack);
517
+ assert.equal(
518
+ alice.meeting.mediaProperties.audioTrack.id,
519
+ newMicrophoneTrack.id
520
+ );
521
+ assert.equal(alice.meeting.mediaProperties.videoTrack.id, oldVideoTrackId);
522
+ })
523
+ );
524
+
525
+ await oldTrackUnpublished;
526
+ await newTrackPublished;
527
+
528
+ localTracks.alice.microphone = newMicrophoneTrack;
472
529
  });
473
530
 
474
- it('alice update video', () => {
531
+ it('alice update video', async () => {
475
532
  const oldAudioTrackId = alice.meeting.mediaProperties.audioTrack.id;
476
533
 
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
- );
534
+ const oldCameraTrack = localTracks.alice.camera;
535
+ const newCameraTrack = await createCameraTrack();
536
+
537
+ assert.equal(oldCameraTrack.published, true);
538
+ assert.notEqual(oldCameraTrack.id, newCameraTrack.id);
539
+
540
+ const oldTrackUnpublished = waitForPublished(oldCameraTrack, false, "Alice VIDEO: old camera track");
541
+ const newTrackPublished = waitForPublished(newCameraTrack, true, "Alice VIDEO: new camera track");
542
+
543
+ await testUtils.delayedPromise(
544
+ alice.meeting
545
+ .publishTracks({
546
+ camera: newCameraTrack,
547
+ })
548
+ .then(() => {
549
+ console.log('Alice VIDEO: new track on meeting:', alice.meeting.mediaProperties.videoTrack);
550
+ assert.equal(
551
+ alice.meeting.mediaProperties.videoTrack.id,
552
+ newCameraTrack.id
553
+ );
554
+ assert.equal(alice.meeting.mediaProperties.audioTrack.id, oldAudioTrackId);
555
+ })
556
+ );
557
+
558
+ await oldTrackUnpublished;
559
+ await newTrackPublished;
560
+
561
+ localTracks.alice.camera = newCameraTrack;
502
562
  });
503
563
 
504
564
  it('alice mutes bob', () =>
@@ -522,27 +582,25 @@ skipInNode(describe)('plugin-meetings', () => {
522
582
  }),
523
583
  ]));
524
584
 
525
- it('bob audio mute, so alice cannot unmute bob', (done) => {
585
+ it('bob audio mute, so alice cannot unmute bob', async () => {
526
586
  const checkEvent = (event) =>
527
587
  !!event.delta.updated.find(
528
588
  (member) => bob.meeting.members.selfId === member.id && member.isAudioMuted === true
529
589
  );
530
590
 
591
+ const membersUpdate = testUtils.waitForEvents([
592
+ {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
593
+ ]);
594
+
531
595
  // 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
- )
596
+ localTracks.bob.microphone.setMuted(true);
597
+
598
+ await membersUpdate;
599
+
600
+ assert.equal(localTracks.bob.microphone.muted, true);
601
+
602
+ // now alice tries to unmmute bob
603
+ await testUtils.delayedPromise(alice.meeting.mute(bob.meeting.members.selfId, false))
546
604
  // expect the waitForEvents to timeout
547
605
  .then(() =>
548
606
  testUtils.waitForEvents(
@@ -554,126 +612,120 @@ skipInNode(describe)('plugin-meetings', () => {
554
612
  assert.fail('bob received unexpected meeting:self:unmutedByOthers event');
555
613
  })
556
614
  .catch(() => {
557
- assert.equal(bob.meeting.audio.muted, true);
558
- assert.equal(bob.meeting.isAudioMuted(), true);
559
- done();
615
+ assert.equal(localTracks.bob.microphone.muted, true);
560
616
  });
561
617
  });
562
618
 
563
- it('bob audio unmute ', () => {
619
+ it('bob audio unmute ', async () => {
564
620
  const checkEvent = (event) =>
565
621
  !!event.delta.updated.find(
566
622
  (member) => bob.meeting.members.selfId === member.id && member.isAudioMuted === false
567
623
  );
568
624
 
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
- });
625
+ const membersUpdate = testUtils.waitForEvents([
626
+ {scope: alice.meeting.members, event: 'members:update', match: checkEvent},
627
+ ]);
628
+
629
+ localTracks.bob.microphone.setMuted(false);
630
+
631
+ await membersUpdate;
632
+
633
+ assert.equal(localTracks.bob.microphone.muted, false);
578
634
  });
579
635
 
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
- );
636
+ it('alice shares the screen with highFrameRate', async () => {
637
+ localTracks.alice.screenShare.video = await createDisplayTrack();
617
638
 
618
- return testUtils.waitUntil(10000);
619
- }));
639
+ const startedSharingLocal = testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingLocal'}]);
640
+ const startedSharingRemote = testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingRemote'}])
641
+ .then((response) => {
642
+ assert.equal(response[0].result.memberId, alice.meeting.selfId);
643
+ });
644
+ const bobReceivesMembersUpdate = testUtils.waitForEvents([{scope: bob.meeting.members, event: 'members:update'}])
645
+ .then((response) => {
646
+ console.log(
647
+ 'SCREEN SHARE RESPONSE ',
648
+ JSON.stringify(response, testUtils.getCircularReplacer())
649
+ );
650
+ });
651
+ const screenShareVideoPublished = waitForPublished(localTracks.alice.screenShare.video, true, "alice's screen share video track");
620
652
 
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;
653
+ await testUtils.delayedPromise(alice.meeting.publishTracks({screenShare: {video: localTracks.alice.screenShare.video}}));
654
+
655
+ await screenShareVideoPublished;
656
+ await startedSharingLocal;
657
+ await startedSharingRemote;
658
+ await bobReceivesMembersUpdate;
659
+
660
+ assert.equal(alice.meeting.screenShareFloorState, 'floor_request_granted');
661
+ assert.equal(alice.meeting.shareStatus, 'local_share_active');
662
+ assert.equal(bob.meeting.shareStatus, 'remote_share_active');
663
+ console.log(
664
+ 'SCREEN SHARE PARTICIPANTS ',
665
+ JSON.stringify(alice.meeting.locusInfo.participants)
666
+ );
645
667
 
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
668
+ await testUtils.waitUntil(10000);
669
+ });
670
+
671
+ it('bob steals the screen share from alice', async () => {
672
+ localTracks.bob.screenShare.video = await createDisplayTrack();
673
+
674
+ const stoppedSharingLocal = testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingLocal'}]);
675
+ const startedSharingLocal = testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingLocal'}]);
676
+ const startedSharingRemote = testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingRemote'}])
677
+ .then((response) => {
678
+ assert.equal(response[0].result.memberId, bob.meeting.selfId);
679
+ });
680
+ const aliceReceivesMembersUpdate = testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
681
+ .then((response) => {
682
+ console.log(
683
+ 'SCREEN SHARE RESPONSE ',
684
+ JSON.stringify(response, testUtils.getCircularReplacer())
651
685
  );
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');
686
+ });
687
+ const aliceScreenShareVideoUnpublished = waitForPublished(localTracks.alice.screenShare.video, false, "alice's screen share video track");
688
+ const bobScreenShareVideoPublished = waitForPublished(localTracks.bob.screenShare.video, true, "bob's screen share video track");
656
689
 
657
- return testUtils.waitUntil(10000);
658
- }));
690
+ await testUtils.delayedPromise(bob.meeting.publishTracks({screenShare: {video: localTracks.bob.screenShare.video}}));
659
691
 
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
- }));
692
+ await bobScreenShareVideoPublished;
693
+ await aliceScreenShareVideoUnpublished;
694
+ await stoppedSharingLocal;
695
+ await startedSharingLocal;
696
+ await startedSharingRemote;
697
+ await aliceReceivesMembersUpdate;
698
+
699
+ localTracks.alice.screenShare.video.stop();
700
+ localTracks.alice.screenShare.video = undefined;
701
+
702
+ assert.equal(bob.meeting.screenShareFloorState, 'floor_request_granted');
703
+ assert.equal(bob.meeting.shareStatus, 'local_share_active');
704
+ assert.equal(alice.meeting.shareStatus, 'remote_share_active');
705
+
706
+ await testUtils.waitUntil(10000);
707
+ });
708
+
709
+ it('bob stops sharing', async () => {
710
+ const screenShareVideoUnpublished = waitForPublished(localTracks.bob.screenShare.video, false, "bob's screen share video track");
711
+ const stoppedSharingLocal = testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:stoppedSharingLocal'}]);
712
+ const stoppedSharingRemote = testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingRemote'}]);
713
+
714
+ await testUtils.delayedPromise(bob.meeting.unpublishTracks([localTracks.bob.screenShare.video]));
715
+
716
+ await screenShareVideoUnpublished;
717
+ await stoppedSharingLocal;
718
+ await stoppedSharingRemote;
719
+
720
+ localTracks.bob.screenShare.video.stop();
721
+ localTracks.bob.screenShare.video = undefined;
722
+
723
+ assert.equal(bob.meeting.screenShareFloorState, 'floor_released');
724
+ assert.equal(bob.meeting.shareStatus, 'no_share');
725
+ assert.equal(alice.meeting.shareStatus, 'no_share');
726
+
727
+ await testUtils.waitUntil(10000);
728
+ });
677
729
 
678
730
  it('alice shares whiteboard A', () =>
679
731
  Promise.all([
@@ -698,7 +750,7 @@ skipInNode(describe)('plugin-meetings', () => {
698
750
  );
699
751
  }),
700
752
  ]).then(() => {
701
- assert.equal(alice.meeting.isSharing, false);
753
+ assert.equal(alice.meeting.screenShareFloorState, 'floor_released');
702
754
  assert.equal(alice.meeting.shareStatus, 'whiteboard_share_active');
703
755
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
704
756
  }));
@@ -726,12 +778,12 @@ skipInNode(describe)('plugin-meetings', () => {
726
778
  );
727
779
  }),
728
780
  ]).then(() => {
729
- assert.equal(bob.meeting.isSharing, false);
781
+ assert.equal(bob.meeting.screenShareFloorState, 'floor_released');
730
782
  assert.equal(alice.meeting.shareStatus, 'whiteboard_share_active');
731
783
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
732
784
  }));
733
785
 
734
- it('bob stops sharing ', () =>
786
+ it('bob stops sharing again', () =>
735
787
  Promise.all([
736
788
  // Wait for peerConnection to stabalize
737
789
  testUtils.waitUntil(20000),
@@ -743,7 +795,7 @@ skipInNode(describe)('plugin-meetings', () => {
743
795
  {scope: alice.meeting, event: 'meeting:stoppedSharingWhiteboard'},
744
796
  ]),
745
797
  ]).then(() => {
746
- assert.equal(bob.meeting.isSharing, false);
798
+ assert.equal(bob.meeting.screenShareFloorState, 'floor_released');
747
799
  assert.equal(bob.meeting.shareStatus, 'no_share');
748
800
  assert.equal(alice.meeting.shareStatus, 'no_share');
749
801
  }));
@@ -771,51 +823,43 @@ skipInNode(describe)('plugin-meetings', () => {
771
823
  );
772
824
  }),
773
825
  ]).then(() => {
774
- assert.equal(alice.meeting.isSharing, false);
826
+ assert.equal(alice.meeting.screenShareFloorState, 'floor_released');
775
827
  assert.equal(alice.meeting.shareStatus, 'whiteboard_share_active');
776
828
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
777
829
  }));
778
830
 
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;
831
+ it('bob steals the share from alice with desktop share', async () => {
832
+ localTracks.bob.screenShare.video = await createDisplayTrack();
805
833
 
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
834
+ const stoppedSharingWhiteboard = testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:stoppedSharingWhiteboard'}]);
835
+ const startedSharingLocal = testUtils.waitForEvents([{scope: bob.meeting, event: 'meeting:startedSharingLocal'}]);
836
+ const startedSharingRemote = testUtils.waitForEvents([{scope: alice.meeting, event: 'meeting:startedSharingRemote'}])
837
+ .then((response) => {
838
+ assert.equal(response[0].result.memberId, bob.meeting.selfId);
839
+ });
840
+ const aliceReceivesMembersUpdate = testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
841
+ .then((response) => {
842
+ console.log(
843
+ 'SCREEN SHARE RESPONSE ',
844
+ JSON.stringify(response, testUtils.getCircularReplacer())
811
845
  );
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');
846
+ });
847
+ const bobScreenShareVideoPublished = waitForPublished(localTracks.bob.screenShare.video, true, "bob's screen share video track");
816
848
 
817
- return testUtils.waitUntil(10000);
818
- }));
849
+ await testUtils.delayedPromise(bob.meeting.publishTracks({screenShare: {video: localTracks.bob.screenShare.video}}));
850
+
851
+ await bobScreenShareVideoPublished;
852
+ await stoppedSharingWhiteboard;
853
+ await startedSharingLocal;
854
+ await startedSharingRemote;
855
+ await aliceReceivesMembersUpdate;
856
+
857
+ assert.equal(bob.meeting.screenShareFloorState, 'floor_request_granted');
858
+ assert.equal(bob.meeting.shareStatus, 'local_share_active');
859
+ assert.equal(alice.meeting.shareStatus, 'remote_share_active');
860
+
861
+ await testUtils.waitUntil(10000);
862
+ });
819
863
 
820
864
  it('bob shares whiteboard B', () =>
821
865
  Promise.all([
@@ -840,7 +884,7 @@ skipInNode(describe)('plugin-meetings', () => {
840
884
  );
841
885
  }),
842
886
  ]).then(() => {
843
- assert.equal(bob.meeting.isSharing, false);
887
+ assert.equal(bob.meeting.screenShareFloorState, 'floor_released');
844
888
  assert.equal(alice.meeting.shareStatus, 'whiteboard_share_active');
845
889
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
846
890
  }));
@@ -886,7 +930,11 @@ skipInNode(describe)('plugin-meetings', () => {
886
930
  );
887
931
  })
888
932
  .then(() => testUtils.waitForStateChange(chris.meeting, 'JOINED'))
889
- .then(() => testUtils.addMedia(chris))
933
+ .then(async () => {
934
+ localTracks.chris.microphone = await createMicrophoneTrack();
935
+ localTracks.chris.camera = await createCameraTrack();
936
+ })
937
+ .then(() => integrationTestUtils.addMedia(chris, {microphone: localTracks.chris.microphone, camera: localTracks.chris.camera}))
890
938
  .then(() => assert(enumerateSpy.called));
891
939
  })
892
940
  .then(() =>
@@ -933,6 +981,35 @@ skipInNode(describe)('plugin-meetings', () => {
933
981
  assert.equal(bob.webex.meetings.getMeetingByType('sipUri', alice.emailAddress), null);
934
982
  });
935
983
  });
984
+
985
+ it('stop all local tracks', () => {
986
+ if (localTracks.alice.microphone) {
987
+ localTracks.alice.microphone.stop();
988
+ localTracks.alice.microphone = undefined;
989
+ }
990
+ if (localTracks.alice.camera) {
991
+ localTracks.alice.camera.stop();
992
+ localTracks.alice.camera = undefined;
993
+ }
994
+
995
+ if (localTracks.bob.microphone) {
996
+ localTracks.bob.microphone.stop();
997
+ localTracks.bob.microphone = undefined;
998
+ }
999
+ if (localTracks.bob.camera) {
1000
+ localTracks.bob.camera.stop();
1001
+ localTracks.bob.camera = undefined;
1002
+ }
1003
+
1004
+ if (localTracks.chris.microphone) {
1005
+ localTracks.chris.microphone.stop();
1006
+ localTracks.chris.microphone = undefined;
1007
+ }
1008
+ if (localTracks.chris.camera) {
1009
+ localTracks.chris.camera.stop();
1010
+ localTracks.chris.camera = undefined;
1011
+ }
1012
+ });
936
1013
  });
937
1014
  });
938
1015
  });