@webex/plugin-meetings 3.0.0-beta.16 → 3.0.0-beta.161

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 (424) hide show
  1. package/README.md +45 -1
  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 +359 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +212 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +23 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +52 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +43 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1046 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +78 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +67 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +3 -2
  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/config.js +6 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +175 -26
  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 +300 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +77 -0
  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 +214 -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 +92 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +317 -24
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/mediaSharesUtils.js +43 -1
  53. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  54. package/dist/locus-info/parser.js +2 -1
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +97 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +39 -134
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +19 -97
  61. package/dist/media/properties.js.map +1 -1
  62. package/dist/mediaQualityMetrics/config.js +505 -493
  63. package/dist/mediaQualityMetrics/config.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +79 -1
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2349 -2178
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +291 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +229 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +191 -167
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/request.type.js.map +1 -1
  75. package/dist/meeting/util.js +444 -443
  76. package/dist/meeting/util.js.map +1 -1
  77. package/dist/meeting-info/meeting-info-v2.js +157 -49
  78. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  79. package/dist/meeting-info/utilv2.js +20 -5
  80. package/dist/meeting-info/utilv2.js.map +1 -1
  81. package/dist/meetings/collection.js +22 -0
  82. package/dist/meetings/collection.js.map +1 -1
  83. package/dist/meetings/index.js +365 -73
  84. package/dist/meetings/index.js.map +1 -1
  85. package/dist/meetings/meetings.types.js +7 -0
  86. package/dist/meetings/meetings.types.js.map +1 -0
  87. package/dist/meetings/request.js +16 -12
  88. package/dist/meetings/request.js.map +1 -1
  89. package/dist/meetings/util.js +88 -1
  90. package/dist/meetings/util.js.map +1 -1
  91. package/dist/member/index.js +43 -0
  92. package/dist/member/index.js.map +1 -1
  93. package/dist/member/types.js +15 -0
  94. package/dist/member/types.js.map +1 -0
  95. package/dist/member/util.js +97 -3
  96. package/dist/member/util.js.map +1 -1
  97. package/dist/members/collection.js +10 -0
  98. package/dist/members/collection.js.map +1 -1
  99. package/dist/members/index.js +94 -11
  100. package/dist/members/index.js.map +1 -1
  101. package/dist/members/request.js +109 -39
  102. package/dist/members/request.js.map +1 -1
  103. package/dist/members/types.js +15 -0
  104. package/dist/members/types.js.map +1 -0
  105. package/dist/members/util.js +316 -233
  106. package/dist/members/util.js.map +1 -1
  107. package/dist/metrics/config.js +50 -14
  108. package/dist/metrics/config.js.map +1 -1
  109. package/dist/metrics/constants.js +3 -5
  110. package/dist/metrics/constants.js.map +1 -1
  111. package/dist/metrics/index.js +48 -29
  112. package/dist/metrics/index.js.map +1 -1
  113. package/dist/multistream/mediaRequestManager.js +265 -36
  114. package/dist/multistream/mediaRequestManager.js.map +1 -1
  115. package/dist/multistream/receiveSlot.js +52 -19
  116. package/dist/multistream/receiveSlot.js.map +1 -1
  117. package/dist/multistream/receiveSlotManager.js +53 -33
  118. package/dist/multistream/receiveSlotManager.js.map +1 -1
  119. package/dist/multistream/remoteMedia.js +44 -18
  120. package/dist/multistream/remoteMedia.js.map +1 -1
  121. package/dist/multistream/remoteMediaGroup.js +60 -3
  122. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  123. package/dist/multistream/remoteMediaManager.js +322 -103
  124. package/dist/multistream/remoteMediaManager.js.map +1 -1
  125. package/dist/networkQualityMonitor/index.js +4 -2
  126. package/dist/networkQualityMonitor/index.js.map +1 -1
  127. package/dist/reachability/index.js +117 -60
  128. package/dist/reachability/index.js.map +1 -1
  129. package/dist/reachability/request.js +12 -5
  130. package/dist/reachability/request.js.map +1 -1
  131. package/dist/reactions/constants.js +13 -0
  132. package/dist/reactions/constants.js.map +1 -0
  133. package/dist/reactions/reactions.js +2 -2
  134. package/dist/reactions/reactions.js.map +1 -1
  135. package/dist/reactions/reactions.type.js +18 -18
  136. package/dist/reactions/reactions.type.js.map +1 -1
  137. package/dist/reconnection-manager/index.js +190 -145
  138. package/dist/reconnection-manager/index.js.map +1 -1
  139. package/dist/recording-controller/enums.js +17 -0
  140. package/dist/recording-controller/enums.js.map +1 -0
  141. package/dist/recording-controller/index.js +343 -0
  142. package/dist/recording-controller/index.js.map +1 -0
  143. package/dist/recording-controller/util.js +63 -0
  144. package/dist/recording-controller/util.js.map +1 -0
  145. package/dist/roap/index.js +21 -29
  146. package/dist/roap/index.js.map +1 -1
  147. package/dist/roap/request.js +127 -92
  148. package/dist/roap/request.js.map +1 -1
  149. package/dist/roap/turnDiscovery.js +135 -53
  150. package/dist/roap/turnDiscovery.js.map +1 -1
  151. package/dist/statsAnalyzer/global.js +1 -93
  152. package/dist/statsAnalyzer/global.js.map +1 -1
  153. package/dist/statsAnalyzer/index.js +329 -314
  154. package/dist/statsAnalyzer/index.js.map +1 -1
  155. package/dist/statsAnalyzer/mqaUtil.js +103 -54
  156. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  157. package/dist/types/annotation/annotation.types.d.ts +43 -0
  158. package/dist/types/annotation/constants.d.ts +31 -0
  159. package/dist/types/annotation/index.d.ts +124 -0
  160. package/dist/types/breakouts/breakout.d.ts +8 -0
  161. package/dist/types/breakouts/collection.d.ts +5 -0
  162. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  163. package/dist/types/breakouts/events.d.ts +2 -0
  164. package/dist/types/breakouts/index.d.ts +5 -0
  165. package/dist/types/breakouts/request.d.ts +22 -0
  166. package/dist/types/breakouts/utils.d.ts +15 -0
  167. package/dist/types/common/browser-detection.d.ts +9 -0
  168. package/dist/types/common/collection.d.ts +48 -0
  169. package/dist/types/common/config.d.ts +2 -0
  170. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  171. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  172. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  173. package/dist/types/common/errors/media.d.ts +15 -0
  174. package/dist/types/common/errors/parameter.d.ts +15 -0
  175. package/dist/types/common/errors/password-error.d.ts +15 -0
  176. package/dist/types/common/errors/permission.d.ts +14 -0
  177. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  178. package/dist/types/common/errors/reconnection.d.ts +15 -0
  179. package/dist/types/common/errors/stats.d.ts +15 -0
  180. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  181. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  182. package/dist/types/common/events/events-scope.d.ts +17 -0
  183. package/dist/types/common/events/events.d.ts +12 -0
  184. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  185. package/dist/types/common/events/util.d.ts +2 -0
  186. package/dist/types/common/logs/logger-config.d.ts +2 -0
  187. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  188. package/dist/types/common/logs/request.d.ts +34 -0
  189. package/dist/types/common/queue.d.ts +32 -0
  190. package/dist/types/config.d.ts +72 -0
  191. package/dist/types/constants.d.ts +987 -0
  192. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  193. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  194. package/dist/types/controls-options-manager/index.d.ts +136 -0
  195. package/dist/types/controls-options-manager/types.d.ts +43 -0
  196. package/dist/types/controls-options-manager/util.d.ts +1 -0
  197. package/dist/types/index.d.ts +7 -0
  198. package/dist/types/interpretation/collection.d.ts +5 -0
  199. package/dist/types/interpretation/index.d.ts +5 -0
  200. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  201. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  202. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  203. package/dist/types/locus-info/fullState.d.ts +2 -0
  204. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  205. package/dist/types/locus-info/index.d.ts +315 -0
  206. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  207. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  208. package/dist/types/locus-info/parser.d.ts +212 -0
  209. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  210. package/dist/types/media/index.d.ts +34 -0
  211. package/dist/types/media/properties.d.ts +86 -0
  212. package/dist/types/media/util.d.ts +2 -0
  213. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  214. package/dist/types/meeting/in-meeting-actions.d.ts +149 -0
  215. package/dist/types/meeting/index.d.ts +1524 -0
  216. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  217. package/dist/types/meeting/muteState.d.ts +184 -0
  218. package/dist/types/meeting/request.d.ts +270 -0
  219. package/dist/types/meeting/request.type.d.ts +11 -0
  220. package/dist/types/meeting/state.d.ts +9 -0
  221. package/dist/types/meeting/util.d.ts +75 -0
  222. package/dist/types/meeting-info/collection.d.ts +20 -0
  223. package/dist/types/meeting-info/index.d.ts +57 -0
  224. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  225. package/dist/types/meeting-info/request.d.ts +22 -0
  226. package/dist/types/meeting-info/util.d.ts +2 -0
  227. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  228. package/dist/types/meetings/collection.d.ts +31 -0
  229. package/dist/types/meetings/index.d.ts +364 -0
  230. package/dist/types/meetings/meetings.types.d.ts +4 -0
  231. package/dist/types/meetings/request.d.ts +27 -0
  232. package/dist/types/meetings/util.d.ts +18 -0
  233. package/dist/types/member/index.d.ts +158 -0
  234. package/dist/types/member/types.d.ts +21 -0
  235. package/dist/types/member/util.d.ts +2 -0
  236. package/dist/types/members/collection.d.ts +29 -0
  237. package/dist/types/members/index.d.ts +353 -0
  238. package/dist/types/members/request.d.ts +114 -0
  239. package/dist/types/members/types.d.ts +24 -0
  240. package/dist/types/members/util.d.ts +210 -0
  241. package/dist/types/metrics/config.d.ts +195 -0
  242. package/dist/types/metrics/constants.d.ts +55 -0
  243. package/dist/types/metrics/index.d.ts +169 -0
  244. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  245. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  246. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  247. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  248. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  249. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  250. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  251. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  252. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  253. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  254. package/dist/types/reachability/index.d.ts +152 -0
  255. package/dist/types/reachability/request.d.ts +37 -0
  256. package/dist/types/reactions/constants.d.ts +3 -0
  257. package/dist/types/reactions/reactions.d.ts +4 -0
  258. package/dist/types/reactions/reactions.type.d.ts +52 -0
  259. package/dist/types/reconnection-manager/index.d.ts +126 -0
  260. package/dist/types/recording-controller/enums.d.ts +7 -0
  261. package/dist/types/recording-controller/index.d.ts +193 -0
  262. package/dist/types/recording-controller/util.d.ts +13 -0
  263. package/dist/types/roap/index.d.ts +77 -0
  264. package/dist/types/roap/request.d.ts +36 -0
  265. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  266. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  267. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  268. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  269. package/dist/types/transcription/index.d.ts +64 -0
  270. package/package.json +28 -21
  271. package/src/annotation/annotation.types.ts +52 -0
  272. package/src/annotation/constants.ts +36 -0
  273. package/src/annotation/index.ts +343 -0
  274. package/src/breakouts/README.md +220 -0
  275. package/src/breakouts/breakout.ts +180 -0
  276. package/src/breakouts/collection.ts +19 -0
  277. package/src/breakouts/edit-lock-error.ts +25 -0
  278. package/src/breakouts/events.ts +37 -0
  279. package/src/breakouts/index.ts +921 -0
  280. package/src/breakouts/request.ts +55 -0
  281. package/src/breakouts/utils.ts +57 -0
  282. package/src/common/errors/webex-errors.ts +6 -2
  283. package/src/common/logs/logger-proxy.ts +1 -1
  284. package/src/config.ts +5 -7
  285. package/src/constants.ts +165 -20
  286. package/src/controls-options-manager/constants.ts +5 -0
  287. package/src/controls-options-manager/enums.ts +18 -0
  288. package/src/controls-options-manager/index.ts +278 -0
  289. package/src/controls-options-manager/types.ts +59 -0
  290. package/src/controls-options-manager/util.ts +286 -0
  291. package/src/index.ts +34 -0
  292. package/src/interpretation/README.md +51 -0
  293. package/src/interpretation/collection.ts +19 -0
  294. package/src/interpretation/index.ts +182 -0
  295. package/src/interpretation/siLanguage.ts +18 -0
  296. package/src/locus-info/controlsUtils.ts +110 -0
  297. package/src/locus-info/index.ts +339 -21
  298. package/src/locus-info/mediaSharesUtils.ts +48 -0
  299. package/src/locus-info/parser.ts +2 -1
  300. package/src/locus-info/selfUtils.ts +86 -2
  301. package/src/media/index.ts +70 -142
  302. package/src/media/properties.ts +41 -104
  303. package/src/mediaQualityMetrics/config.ts +379 -377
  304. package/src/meeting/in-meeting-actions.ts +156 -0
  305. package/src/meeting/index.ts +1779 -1741
  306. package/src/meeting/locusMediaRequest.ts +309 -0
  307. package/src/meeting/muteState.ts +228 -132
  308. package/src/meeting/request.ts +100 -91
  309. package/src/meeting/request.type.ts +2 -0
  310. package/src/meeting/util.ts +422 -421
  311. package/src/meeting-info/meeting-info-v2.ts +134 -13
  312. package/src/meeting-info/utilv2.ts +13 -3
  313. package/src/meetings/collection.ts +20 -0
  314. package/src/meetings/index.ts +385 -83
  315. package/src/meetings/meetings.types.ts +12 -0
  316. package/src/meetings/request.ts +3 -1
  317. package/src/meetings/util.ts +103 -4
  318. package/src/member/index.ts +42 -0
  319. package/src/member/types.ts +24 -0
  320. package/src/member/util.ts +95 -1
  321. package/src/members/collection.ts +8 -0
  322. package/src/members/index.ts +108 -6
  323. package/src/members/request.ts +98 -17
  324. package/src/members/types.ts +28 -0
  325. package/src/members/util.ts +319 -240
  326. package/src/metrics/config.ts +49 -10
  327. package/src/metrics/constants.ts +2 -4
  328. package/src/metrics/index.ts +43 -27
  329. package/src/multistream/mediaRequestManager.ts +337 -63
  330. package/src/multistream/receiveSlot.ts +68 -26
  331. package/src/multistream/receiveSlotManager.ts +61 -38
  332. package/src/multistream/remoteMedia.ts +29 -3
  333. package/src/multistream/remoteMediaGroup.ts +61 -2
  334. package/src/multistream/remoteMediaManager.ts +260 -66
  335. package/src/networkQualityMonitor/index.ts +6 -6
  336. package/src/reachability/index.ts +75 -25
  337. package/src/reachability/request.ts +10 -5
  338. package/src/reactions/constants.ts +4 -0
  339. package/src/reactions/reactions.ts +4 -4
  340. package/src/reactions/reactions.type.ts +28 -3
  341. package/src/reconnection-manager/index.ts +53 -32
  342. package/src/recording-controller/enums.ts +8 -0
  343. package/src/recording-controller/index.ts +315 -0
  344. package/src/recording-controller/util.ts +58 -0
  345. package/src/roap/index.ts +21 -30
  346. package/src/roap/request.ts +51 -52
  347. package/src/roap/turnDiscovery.ts +51 -27
  348. package/src/statsAnalyzer/global.ts +1 -94
  349. package/src/statsAnalyzer/index.ts +380 -390
  350. package/src/statsAnalyzer/mqaUtil.ts +106 -99
  351. package/test/integration/spec/converged-space-meetings.js +233 -0
  352. package/test/integration/spec/journey.js +331 -254
  353. package/test/integration/spec/space-meeting.js +77 -4
  354. package/test/unit/spec/annotation/index.ts +436 -0
  355. package/test/unit/spec/breakouts/breakout.ts +233 -0
  356. package/test/unit/spec/breakouts/collection.ts +15 -0
  357. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  358. package/test/unit/spec/breakouts/events.ts +77 -0
  359. package/test/unit/spec/breakouts/index.ts +1790 -0
  360. package/test/unit/spec/breakouts/request.ts +104 -0
  361. package/test/unit/spec/breakouts/utils.js +72 -0
  362. package/test/unit/spec/controls-options-manager/index.js +287 -0
  363. package/test/unit/spec/controls-options-manager/util.js +518 -0
  364. package/test/unit/spec/fixture/locus.js +1 -0
  365. package/test/unit/spec/interpretation/collection.ts +15 -0
  366. package/test/unit/spec/interpretation/index.ts +329 -0
  367. package/test/unit/spec/interpretation/siLanguage.ts +26 -0
  368. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  369. package/test/unit/spec/locus-info/index.js +680 -4
  370. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  371. package/test/unit/spec/locus-info/selfConstant.js +48 -0
  372. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  373. package/test/unit/spec/media/index.ts +118 -22
  374. package/test/unit/spec/media/properties.ts +9 -9
  375. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -0
  376. package/test/unit/spec/meeting/index.js +2695 -1513
  377. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  378. package/test/unit/spec/meeting/muteState.js +370 -208
  379. package/test/unit/spec/meeting/request.js +354 -42
  380. package/test/unit/spec/meeting/utils.js +270 -156
  381. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  382. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  383. package/test/unit/spec/meetings/collection.js +14 -0
  384. package/test/unit/spec/meetings/index.js +866 -120
  385. package/test/unit/spec/meetings/utils.js +206 -2
  386. package/test/unit/spec/member/index.js +31 -0
  387. package/test/unit/spec/member/util.js +408 -32
  388. package/test/unit/spec/members/index.js +320 -1
  389. package/test/unit/spec/members/request.js +206 -27
  390. package/test/unit/spec/members/utils.js +184 -0
  391. package/test/unit/spec/metrics/index.js +98 -0
  392. package/test/unit/spec/multistream/mediaRequestManager.ts +1012 -109
  393. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  394. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  395. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  396. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  397. package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
  398. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  399. package/test/unit/spec/reachability/index.ts +176 -25
  400. package/test/unit/spec/reachability/request.js +66 -0
  401. package/test/unit/spec/reconnection-manager/index.js +46 -13
  402. package/test/unit/spec/recording-controller/index.js +231 -0
  403. package/test/unit/spec/recording-controller/util.js +102 -0
  404. package/test/unit/spec/roap/index.ts +21 -51
  405. package/test/unit/spec/roap/request.ts +187 -0
  406. package/test/unit/spec/roap/turnDiscovery.ts +73 -34
  407. package/test/unit/spec/stats-analyzer/index.js +94 -43
  408. package/test/utils/constants.js +9 -0
  409. package/test/utils/integrationTestUtils.js +46 -0
  410. package/test/utils/testUtils.js +0 -45
  411. package/test/utils/webex-config.js +4 -0
  412. package/test/utils/webex-test-users.js +7 -3
  413. package/tsconfig.json +6 -0
  414. package/dist/media/internal-media-core-wrapper.js +0 -18
  415. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  416. package/dist/meeting/effectsState.js +0 -262
  417. package/dist/meeting/effectsState.js.map +0 -1
  418. package/dist/multistream/multistreamMedia.js +0 -106
  419. package/dist/multistream/multistreamMedia.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/media/internal-media-core-wrapper.ts +0 -9
  422. package/src/meeting/effectsState.ts +0 -211
  423. package/src/multistream/multistreamMedia.ts +0 -93
  424. package/test/unit/spec/meeting/effectsState.js +0 -281
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable valid-jsdoc */
2
- import {cloneDeep, remove} from 'lodash';
2
+ import {cloneDeep, forEach, remove} from 'lodash';
3
3
  import {EventMap} from 'typed-emitter';
4
- import {MediaConnection as MC} from '@webex/internal-media-core';
4
+ import {MediaType} from '@webex/internal-media-core';
5
5
 
6
6
  import LoggerProxy from '../common/logs/logger-proxy';
7
7
  import EventsScope from '../common/events/events-scope';
@@ -31,8 +31,8 @@ export interface MemberVideoPane {
31
31
  }
32
32
 
33
33
  export interface VideoLayout {
34
- screenShareVideo: {
35
- size: PaneSize | null; // null if you don't want to receive any screen share video
34
+ screenShareVideo?: {
35
+ size: PaneSize;
36
36
  };
37
37
  activeSpeakerVideoPaneGroups?: ActiveSpeakerVideoPaneGroup[]; // list of active speaker video pane groups
38
38
  memberVideoPanes?: MemberVideoPane[]; // list of video panes for specific members, CSI values can be changed later via setVideoPaneCsi()
@@ -41,6 +41,7 @@ export interface VideoLayout {
41
41
  export interface Configuration {
42
42
  audio: {
43
43
  numOfActiveSpeakerStreams: number; // number of audio streams we want to receive
44
+ numOfScreenShareStreams: number; // 1 should be enough, because in webex only 1 person at a time can be presenting screen share
44
45
  };
45
46
  video: {
46
47
  preferLiveVideo: boolean; // applies to all pane groups with active speaker policy
@@ -48,17 +49,12 @@ export interface Configuration {
48
49
 
49
50
  layouts: {[key: LayoutId]: VideoLayout}; // a map of all available layouts, a layout can be set via setLayout() method
50
51
  };
51
- screenShare: {
52
- audio: boolean; // whether we ever want to receive screen share audio at all
53
- video: boolean; // whether we ever want to receive screen share video at all
54
- };
55
52
  }
56
53
 
57
54
  /* Predefined layouts: */
58
55
 
59
56
  // An "all equal" grid, with size up to 3 x 3 = 9:
60
57
  const AllEqualLayout: VideoLayout = {
61
- screenShareVideo: {size: null},
62
58
  activeSpeakerVideoPaneGroups: [
63
59
  {
64
60
  id: 'main',
@@ -71,7 +67,6 @@ const AllEqualLayout: VideoLayout = {
71
67
 
72
68
  // A layout with just a single remote active speaker video pane:
73
69
  const SingleLayout: VideoLayout = {
74
- screenShareVideo: {size: null},
75
70
  activeSpeakerVideoPaneGroups: [
76
71
  {
77
72
  id: 'main',
@@ -84,7 +79,6 @@ const SingleLayout: VideoLayout = {
84
79
 
85
80
  // A layout with 1 big pane for the highest priority active speaker and 5 small panes for other active speakers:
86
81
  const OnePlusFiveLayout: VideoLayout = {
87
- screenShareVideo: {size: null},
88
82
  activeSpeakerVideoPaneGroups: [
89
83
  {
90
84
  id: 'mainBigOne',
@@ -102,8 +96,8 @@ const OnePlusFiveLayout: VideoLayout = {
102
96
  };
103
97
 
104
98
  // A layout with 2 big panes for 2 main active speakers and a strip of 6 small panes for other active speakers:
99
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
105
100
  const TwoMainPlusSixSmallLayout: VideoLayout = {
106
- screenShareVideo: {size: null},
107
101
  activeSpeakerVideoPaneGroups: [
108
102
  {
109
103
  id: 'mainGroupWith2BigPanes',
@@ -135,7 +129,6 @@ const RemoteScreenShareWithSmallThumbnailsLayout: VideoLayout = {
135
129
 
136
130
  // A staged layout with 4 pre-selected meeting participants in the main 2x2 grid and 6 small panes for other active speakers at the top:
137
131
  const Stage2x2With6ThumbnailsLayout: VideoLayout = {
138
- screenShareVideo: {size: null},
139
132
  activeSpeakerVideoPaneGroups: [
140
133
  {
141
134
  id: 'thumbnails',
@@ -161,6 +154,7 @@ const Stage2x2With6ThumbnailsLayout: VideoLayout = {
161
154
  export const DefaultConfiguration: Configuration = {
162
155
  audio: {
163
156
  numOfActiveSpeakerStreams: 3,
157
+ numOfScreenShareStreams: 1,
164
158
  },
165
159
  video: {
166
160
  preferLiveVideo: true,
@@ -174,16 +168,12 @@ export const DefaultConfiguration: Configuration = {
174
168
  ScreenShareView: RemoteScreenShareWithSmallThumbnailsLayout,
175
169
  },
176
170
  },
177
- screenShare: {
178
- audio: true,
179
- video: true,
180
- },
181
171
  };
182
172
 
183
173
  export enum Event {
184
174
  // events for audio streams
185
175
  AudioCreated = 'AudioCreated',
186
- ScreenShareAudioCreated = 'ScreenShareCreated',
176
+ ScreenShareAudioCreated = 'ScreenShareAudioCreated',
187
177
 
188
178
  // events for video streams
189
179
  VideoLayoutChanged = 'VideoLayoutChanged',
@@ -200,7 +190,7 @@ export interface VideoLayoutChangedEventData {
200
190
  export interface Events extends EventMap {
201
191
  // audio
202
192
  [Event.AudioCreated]: (audio: RemoteMediaGroup) => void;
203
- [Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMedia) => void;
193
+ [Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMediaGroup) => void;
204
194
 
205
195
  // video
206
196
  [Event.VideoLayoutChanged]: (data: VideoLayoutChangedEventData) => void;
@@ -224,14 +214,18 @@ export class RemoteMediaManager extends EventsScope {
224
214
  private mediaRequestManagers: {
225
215
  audio: MediaRequestManager;
226
216
  video: MediaRequestManager;
217
+ screenShareAudio: MediaRequestManager;
218
+ screenShareVideo: MediaRequestManager;
227
219
  };
228
220
 
229
221
  private currentLayout?: VideoLayout;
230
222
 
231
223
  private slots: {
232
224
  audio: ReceiveSlot[];
233
- screenShareAudio?: ReceiveSlot;
234
- screenShareVideo?: ReceiveSlot;
225
+ screenShare: {
226
+ audio: ReceiveSlot[];
227
+ video?: ReceiveSlot;
228
+ };
235
229
  video: {
236
230
  unused: ReceiveSlot[];
237
231
  activeSpeaker: ReceiveSlot[];
@@ -247,6 +241,10 @@ export class RemoteMediaManager extends EventsScope {
247
241
  };
248
242
  memberPanes: {[key: PaneId]: RemoteMedia};
249
243
  };
244
+ screenShare: {
245
+ audio?: RemoteMediaGroup;
246
+ video?: RemoteMediaGroup;
247
+ };
250
248
  };
251
249
 
252
250
  private receiveSlotAllocations: {
@@ -268,6 +266,8 @@ export class RemoteMediaManager extends EventsScope {
268
266
  mediaRequestManagers: {
269
267
  audio: MediaRequestManager;
270
268
  video: MediaRequestManager;
269
+ screenShareAudio: MediaRequestManager;
270
+ screenShareVideo: MediaRequestManager;
271
271
  },
272
272
  config: Configuration = DefaultConfiguration
273
273
  ) {
@@ -282,14 +282,20 @@ export class RemoteMediaManager extends EventsScope {
282
282
  activeSpeakerGroups: {},
283
283
  memberPanes: {},
284
284
  },
285
+ screenShare: {
286
+ audio: undefined,
287
+ video: undefined,
288
+ },
285
289
  };
286
290
 
287
291
  this.checkConfigValidity();
288
292
 
289
293
  this.slots = {
290
294
  audio: [],
291
- screenShareAudio: undefined,
292
- screenShareVideo: undefined,
295
+ screenShare: {
296
+ audio: [],
297
+ video: undefined,
298
+ },
293
299
  video: {
294
300
  unused: [],
295
301
  activeSpeaker: [],
@@ -360,8 +366,8 @@ export class RemoteMediaManager extends EventsScope {
360
366
 
361
367
  await this.createAudioMedia();
362
368
 
363
- // todo: create screen share audio remote media (SPARK-377812)
364
- // todo: create screen share video receive slot (SPARK-377812)
369
+ await this.createScreenShareReceiveSlots();
370
+ this.createScreenShareAudioMedia();
365
371
 
366
372
  await this.preallocateVideoReceiveSlots();
367
373
 
@@ -374,14 +380,27 @@ export class RemoteMediaManager extends EventsScope {
374
380
  */
375
381
  public stop() {
376
382
  // invalidate all remoteMedia objects
377
- this.invalidateCurrentRemoteMedia({audio: true, video: true, commit: true});
383
+ this.invalidateCurrentRemoteMedia({
384
+ audio: true,
385
+ video: true,
386
+ screenShareAudio: true,
387
+ screenShareVideo: true,
388
+ commit: true,
389
+ });
378
390
 
379
391
  // release all audio receive slots
380
392
  this.slots.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
381
393
  this.slots.audio.length = 0;
382
394
 
383
- // todo: screenshare slots... (SPARK-377812)
395
+ // release screen share slots
396
+ this.slots.screenShare.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
397
+ this.slots.screenShare.audio.length = 0;
398
+ if (this.slots.screenShare.video) {
399
+ this.receiveSlotManager.releaseSlot(this.slots.screenShare.video);
400
+ this.slots.screenShare.video = undefined;
401
+ }
384
402
 
403
+ // release video slots
385
404
  this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
386
405
 
387
406
  this.slots.video.unused.push(...this.slots.video.activeSpeaker);
@@ -434,7 +453,7 @@ export class RemoteMediaManager extends EventsScope {
434
453
  // eslint-disable-next-line no-await-in-loop
435
454
  this.slots.video.unused.push(
436
455
  // eslint-disable-next-line no-await-in-loop
437
- await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)
456
+ await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
438
457
  );
439
458
  }
440
459
  }
@@ -459,6 +478,7 @@ export class RemoteMediaManager extends EventsScope {
459
478
 
460
479
  await this.updateVideoReceiveSlots();
461
480
  this.updateVideoRemoteMediaObjects();
481
+ this.updateScreenShareVideoRemoteMediaObject();
462
482
  this.emitVideoLayoutChangedEvent();
463
483
  }
464
484
 
@@ -471,6 +491,38 @@ export class RemoteMediaManager extends EventsScope {
471
491
  return this.currentLayoutId;
472
492
  }
473
493
 
494
+ /**
495
+ * sets the preferLiveVideo
496
+ */
497
+ public setPreferLiveVideo(preferLiveVideo: boolean) {
498
+ LoggerProxy.logger.log(
499
+ `RemoteMediaManager#setPreferLiveVideo --> setPreferLiveVideo is called to set preferLiveVideo to ${preferLiveVideo}`
500
+ );
501
+ this.config.video.preferLiveVideo = preferLiveVideo;
502
+ Object.values(this.media.video.activeSpeakerGroups).forEach((activeSpeakerGroup) => {
503
+ activeSpeakerGroup.setPreferLiveVideo(preferLiveVideo, false);
504
+ });
505
+ this.mediaRequestManagers.video.commit();
506
+ }
507
+
508
+ /**
509
+ * Sets CSIs for multiple RemoteMedia instances belonging to RemoteMediaGroup.
510
+ * For each entry in the remoteMediaCsis array:
511
+ * - if csi is specified, the RemoteMedia instance is pinned to that CSI
512
+ * - if csi is undefined, the RemoteMedia instance is unpinned
513
+ */
514
+ public setActiveSpeakerCsis(remoteMediaCsis: {remoteMedia: RemoteMedia; csi?: number}[]) {
515
+ Object.values(this.media.video.activeSpeakerGroups).forEach((remoteMediaGroup) => {
516
+ const groupRemoteMediaCsis = remoteMediaCsis.filter(({remoteMedia}) =>
517
+ remoteMediaGroup.includes(remoteMedia)
518
+ );
519
+ if (groupRemoteMediaCsis.length > 0) {
520
+ remoteMediaGroup.setActiveSpeakerCsis(groupRemoteMediaCsis, false);
521
+ }
522
+ });
523
+ this.mediaRequestManagers.video.commit();
524
+ }
525
+
474
526
  /**
475
527
  * Creates the audio slots
476
528
  */
@@ -478,7 +530,7 @@ export class RemoteMediaManager extends EventsScope {
478
530
  // create the audio receive slots
479
531
  for (let i = 0; i < this.config.audio.numOfActiveSpeakerStreams; i += 1) {
480
532
  // eslint-disable-next-line no-await-in-loop
481
- const slot = await this.receiveSlotManager.allocateSlot(MC.MediaType.AudioMain);
533
+ const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioMain);
482
534
 
483
535
  this.slots.audio.push(slot);
484
536
  }
@@ -498,6 +550,50 @@ export class RemoteMediaManager extends EventsScope {
498
550
  );
499
551
  }
500
552
 
553
+ /**
554
+ * Creates receive slots required for receiving screen share audio and video
555
+ */
556
+ private async createScreenShareReceiveSlots() {
557
+ // audio
558
+ for (let i = 0; i < this.config.audio.numOfScreenShareStreams; i += 1) {
559
+ // eslint-disable-next-line no-await-in-loop
560
+ const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioSlides);
561
+
562
+ this.slots.screenShare.audio.push(slot);
563
+ }
564
+
565
+ // video
566
+ const isAnyLayoutContainingScreenShareVideo = Object.values(this.config.video.layouts).some(
567
+ (layout) => !!layout.screenShareVideo
568
+ );
569
+
570
+ if (isAnyLayoutContainingScreenShareVideo) {
571
+ this.slots.screenShare.video = await this.receiveSlotManager.allocateSlot(
572
+ MediaType.VideoSlides
573
+ );
574
+ }
575
+ }
576
+
577
+ /**
578
+ * Creates RemoteMedia objects for screen share
579
+ */
580
+ private createScreenShareAudioMedia() {
581
+ if (this.slots.screenShare.audio.length > 0) {
582
+ this.media.screenShare.audio = new RemoteMediaGroup(
583
+ this.mediaRequestManagers.screenShareAudio,
584
+ this.slots.screenShare.audio,
585
+ 255,
586
+ true
587
+ );
588
+
589
+ this.emit(
590
+ {file: 'multistream/remoteMediaManager', function: 'createScreenShareAudioMedia'},
591
+ Event.ScreenShareAudioCreated,
592
+ this.media.screenShare.audio
593
+ );
594
+ }
595
+ }
596
+
501
597
  /**
502
598
  * Goes over all receiver-selected slots and keeps only the ones that are required by a given layout,
503
599
  * the rest are all moved to the "unused" list
@@ -538,25 +634,37 @@ export class RemoteMediaManager extends EventsScope {
538
634
  }
539
635
 
540
636
  /**
541
- * Allocates receive slots to all video panes in the current selected layout
637
+ * Allocates receive slots to all active speaker video panes
638
+ * in the current selected layout.
639
+ *
640
+ * Allocation tries to keep the same order of the slots between the previous
641
+ * layout and the new one. Sorting helps making sure that highest priority slots
642
+ * go in the same order in the new layout.
542
643
  */
543
- private allocateSlotsToVideoPaneGroups() {
544
- this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
545
-
546
- this.currentLayout?.activeSpeakerVideoPaneGroups?.forEach((group) => {
547
- this.receiveSlotAllocations.activeSpeaker[group.id] = {slots: []};
548
-
549
- for (let paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {
550
- // allocate a slot from the "unused" list
551
- const freeSlot = this.slots.video.unused.pop();
552
-
553
- if (freeSlot) {
554
- this.slots.video.activeSpeaker.push(freeSlot);
555
- this.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);
644
+ private allocateSlotsToActiveSpeakerPaneGroups() {
645
+ this.currentLayout?.activeSpeakerVideoPaneGroups
646
+ // sorting in descending order based on group priority
647
+ ?.sort((a, b) => (a.priority < b.priority ? 1 : -1))
648
+ ?.forEach((group) => {
649
+ this.receiveSlotAllocations.activeSpeaker[group.id] = {slots: []};
650
+
651
+ for (let paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {
652
+ // allocate a slot from the "unused" list, by grabbing in same order (shift) as previous layout
653
+ const freeSlot = this.slots.video.unused.shift();
654
+
655
+ if (freeSlot) {
656
+ this.slots.video.activeSpeaker.push(freeSlot);
657
+ this.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);
658
+ }
556
659
  }
557
- }
558
- });
660
+ });
661
+ }
559
662
 
663
+ /**
664
+ * Allocates receive slots to all receiver selected video panes
665
+ * in the current selected layout
666
+ */
667
+ private allocateSlotsToReceiverSelectedVideoPaneGroups() {
560
668
  this.currentLayout?.memberVideoPanes?.forEach((memberPane) => {
561
669
  // check if there is existing slot for this csi
562
670
  const existingSlot = this.slots.video.receiverSelected.find(
@@ -583,19 +691,15 @@ export class RemoteMediaManager extends EventsScope {
583
691
  }
584
692
 
585
693
  /**
586
- * Makes sure we have the right number of receive slots created for the current layout
587
- * and allocates them to the right video panes / pane groups
588
- *
589
- * @returns {Promise}
694
+ * Ensures that we have enough slots for the current layout.
590
695
  */
591
- private async updateVideoReceiveSlots() {
696
+ private async refillRequiredSlotsIfNeeded() {
592
697
  const requiredNumSlots = this.getRequiredNumVideoSlotsForLayout(this.currentLayout);
593
698
  const totalNumSlots =
594
699
  this.slots.video.unused.length +
595
700
  this.slots.video.activeSpeaker.length +
596
701
  this.slots.video.receiverSelected.length;
597
702
 
598
- // ensure we have enough total slots for current layout
599
703
  if (totalNumSlots < requiredNumSlots) {
600
704
  let numSlotsToCreate = requiredNumSlots - totalNumSlots;
601
705
 
@@ -603,25 +707,65 @@ export class RemoteMediaManager extends EventsScope {
603
707
  // eslint-disable-next-line no-await-in-loop
604
708
  this.slots.video.unused.push(
605
709
  // eslint-disable-next-line no-await-in-loop
606
- await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)
710
+ await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
607
711
  );
608
712
  numSlotsToCreate -= 1;
609
713
  }
610
714
  }
715
+ }
611
716
 
612
- // move all no longer needed receiver-selected slots to "unused"
613
- this.trimReceiverSelectedSlots();
614
-
615
- // move all active speaker slots to "unused"
717
+ /**
718
+ * Move all active speaker slots to "unused"
719
+ */
720
+ private trimActiveSpeakerSlots() {
616
721
  this.slots.video.unused.push(...this.slots.video.activeSpeaker);
617
722
  this.slots.video.activeSpeaker.length = 0;
723
+ }
618
724
 
619
- // allocate the slots to the right panes / pane groups
620
- this.allocateSlotsToVideoPaneGroups();
725
+ /**
726
+ * Logs the state of the receive slots
727
+ */
728
+ private logReceieveSlots() {
729
+ let logMessage = '';
730
+ forEach(this.receiveSlotAllocations.activeSpeaker, (group, groupName) => {
731
+ logMessage += `group: ${groupName}\n${group.slots.map((slot) => slot.logString).join(' ')}`;
732
+ });
733
+
734
+ logMessage += '\nreceiverSelected:\n';
735
+ forEach(this.receiveSlotAllocations.receiverSelected, (slot, key) => {
736
+ logMessage += ` ${key}: ${slot.logString}\n`;
737
+ });
621
738
 
622
739
  LoggerProxy.logger.log(
623
- `RemoteMediaManager#updateVideoReceiveSlots --> receive slots updated: unused=${this.slots.video.unused.length}, activeSpeaker=${this.slots.video.activeSpeaker.length}, receiverSelected=${this.slots.video.receiverSelected.length}`
740
+ `RemoteMediaManager#updateVideoReceiveSlots --> receive slots updated: unused=${this.slots.video.unused.length}, activeSpeaker=${this.slots.video.activeSpeaker.length}, receiverSelected=${this.slots.video.receiverSelected.length}\n${logMessage}`
624
741
  );
742
+ }
743
+
744
+ /**
745
+ * Makes sure we have the right number of receive slots created for the current layout
746
+ * and allocates them to the right video panes / pane groups
747
+ *
748
+ * @returns {Promise}
749
+ */
750
+ private async updateVideoReceiveSlots() {
751
+ // move all active speaker slots to "unused"
752
+ this.trimActiveSpeakerSlots();
753
+
754
+ // move all no longer needed receiver-selected slots to "unused"
755
+ this.trimReceiverSelectedSlots();
756
+
757
+ // ensure we have enough total slots for current layout
758
+ await this.refillRequiredSlotsIfNeeded();
759
+
760
+ // allocate the slots to the right panes / pane groups
761
+ // reset allocations
762
+ this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
763
+ // allocate active speaker
764
+ this.allocateSlotsToActiveSpeakerPaneGroups();
765
+ // allocate receiver selected
766
+ this.allocateSlotsToReceiverSelectedVideoPaneGroups();
767
+
768
+ this.logReceieveSlots();
625
769
 
626
770
  // If this is the initial layout, there may be some "unused" slots left because of the preallocation
627
771
  // done in this.preallocateVideoReceiveSlots(), so release them now
@@ -634,7 +778,13 @@ export class RemoteMediaManager extends EventsScope {
634
778
  */
635
779
  private updateVideoRemoteMediaObjects() {
636
780
  // invalidate all the previous remote media objects and cancel their media requests
637
- this.invalidateCurrentRemoteMedia({audio: false, video: true, commit: false});
781
+ this.invalidateCurrentRemoteMedia({
782
+ audio: false,
783
+ video: true,
784
+ screenShareAudio: false,
785
+ screenShareVideo: false,
786
+ commit: false,
787
+ });
638
788
 
639
789
  // create new remoteMediaGroup objects
640
790
  this.media.video.activeSpeakerGroups = {};
@@ -689,16 +839,53 @@ export class RemoteMediaManager extends EventsScope {
689
839
  );
690
840
  }
691
841
  }
692
- // todo: screenshare (SPARK-377812)
693
842
 
694
843
  this.mediaRequestManagers.video.commit();
695
844
  }
696
845
 
846
+ /**
847
+ * Checks if current layout requires a screen share.
848
+ * If it does, it creates new RemoteMediaGroup object for screen share
849
+ * and sends the media requests for it.
850
+ * If it doesn't, it makes sure we clean up any RemoteMediaGroup objects
851
+ * created earlier for screen share (for previous layout).
852
+ */
853
+ private updateScreenShareVideoRemoteMediaObject() {
854
+ this.invalidateCurrentRemoteMedia({
855
+ audio: false,
856
+ video: false,
857
+ screenShareAudio: false,
858
+ screenShareVideo: true,
859
+ commit: false,
860
+ });
861
+
862
+ this.media.screenShare.video = undefined;
863
+
864
+ if (this.currentLayout?.screenShareVideo) {
865
+ // we create a group of 1, because for screen share we need to use the "active speaker" policy
866
+ this.media.screenShare.video = new RemoteMediaGroup(
867
+ this.mediaRequestManagers.screenShareVideo,
868
+ [this.slots.screenShare.video],
869
+ 255,
870
+ false,
871
+ {resolution: this.currentLayout.screenShareVideo.size}
872
+ );
873
+ }
874
+
875
+ this.mediaRequestManagers.screenShareVideo.commit();
876
+ }
877
+
697
878
  /**
698
879
  * Invalidates all remote media objects belonging to currently selected layout
699
880
  */
700
- private invalidateCurrentRemoteMedia(options: {audio: boolean; video: boolean; commit: boolean}) {
701
- const {audio, video, commit} = options;
881
+ private invalidateCurrentRemoteMedia(options: {
882
+ audio: boolean;
883
+ video: boolean;
884
+ screenShareAudio: boolean;
885
+ screenShareVideo: boolean;
886
+ commit: boolean;
887
+ }) {
888
+ const {audio, video, screenShareAudio, screenShareVideo, commit} = options;
702
889
 
703
890
  if (audio && this.media.audio) {
704
891
  this.media.audio.stop(commit);
@@ -714,12 +901,19 @@ export class RemoteMediaManager extends EventsScope {
714
901
  this.mediaRequestManagers.video.commit();
715
902
  }
716
903
  }
904
+
905
+ if (screenShareAudio && this.media.screenShare.audio) {
906
+ this.media.screenShare.audio.stop(commit);
907
+ }
908
+ if (screenShareVideo && this.media.screenShare.video) {
909
+ this.media.screenShare.video.stop(commit);
910
+ }
717
911
  }
718
912
 
719
913
  /** emits Event.VideoLayoutChanged */
720
914
  private emitVideoLayoutChangedEvent() {
721
915
  // todo: at this point the receive slots might still be showing a participant from previous layout, we should
722
- // wait for our media requests to be fullfilled, but there is no API for that right now (we could wait for source updates
916
+ // wait for our media requests to be fulfilled, but there is no API for that right now (we could wait for source updates
723
917
  // but in some cases they might never come, or would need to always make sure to use a new set of receiver slots)
724
918
  // for now it's fine to have it like this, we will re-evaluate if it needs improving after more testing
725
919
 
@@ -733,7 +927,7 @@ export class RemoteMediaManager extends EventsScope {
733
927
  layoutId: this.currentLayoutId,
734
928
  activeSpeakerVideoPanes: this.media.video.activeSpeakerGroups,
735
929
  memberVideoPanes: this.media.video.memberPanes,
736
- screenShareVideo: undefined, // todo: screen share (SPARK-377812)
930
+ screenShareVideo: this.media.screenShare.video?.getRemoteMedia()[0],
737
931
  }
738
932
  );
739
933
  }
@@ -781,7 +975,7 @@ export class RemoteMediaManager extends EventsScope {
781
975
 
782
976
  this.currentLayout.memberVideoPanes.push(newPane);
783
977
 
784
- const receiveSlot = await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain);
978
+ const receiveSlot = await this.receiveSlotManager.allocateSlot(MediaType.VideoMain);
785
979
 
786
980
  this.slots.video.receiverSelected.push(receiveSlot);
787
981
 
@@ -1,5 +1,5 @@
1
1
  import EventsScope from '../common/events/events-scope';
2
- import {EVENT_TRIGGERS, STATS} from '../constants';
2
+ import {EVENT_TRIGGERS} from '../constants';
3
3
 
4
4
  /**
5
5
  * Meeting - network quality event
@@ -49,11 +49,7 @@ export default class NetworkQualityMonitor extends EventsScope {
49
49
  });
50
50
  this.networkQualityScore = 1;
51
51
  this.networkQualityStatus = {
52
- [this.frequencyTypes.UPLINK]: {
53
- [STATS.VIDEO_CORRELATE]: {},
54
- [STATS.AUDIO_CORRELATE]: {},
55
- [STATS.SHARE_CORRELATE]: {},
56
- },
52
+ [this.frequencyTypes.UPLINK]: {},
57
53
  };
58
54
  this.mediaType = null;
59
55
  }
@@ -172,6 +168,10 @@ export default class NetworkQualityMonitor extends EventsScope {
172
168
  const determineIfUndefined = (value: number | undefined) =>
173
169
  typeof value === 'undefined' ? null : value;
174
170
 
171
+ if (!this.networkQualityStatus[UPLINK][mediaType]) {
172
+ this.networkQualityStatus[UPLINK][mediaType] = {};
173
+ }
174
+
175
175
  /**
176
176
  * Values for some browsers specifically Safari will be undefined we explicitly set to null
177
177
  * https://bugs.webkit.org/show_bug.cgi?id=206645