@webex/plugin-meetings 3.0.0-beta.4 → 3.0.0-beta.400

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 (629) hide show
  1. package/README.md +58 -8
  2. package/UPGRADING.md +9 -9
  3. package/browsers.js +19 -24
  4. package/dist/annotation/annotation.types.js +7 -0
  5. package/dist/annotation/annotation.types.js.map +1 -0
  6. package/dist/annotation/constants.js +49 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +342 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +216 -0
  11. package/dist/breakouts/breakout.js.map +1 -0
  12. package/dist/breakouts/collection.js +23 -0
  13. package/dist/breakouts/collection.js.map +1 -0
  14. package/dist/breakouts/edit-lock-error.js +52 -0
  15. package/dist/breakouts/edit-lock-error.js.map +1 -0
  16. package/dist/breakouts/events.js +45 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +1048 -0
  19. package/dist/breakouts/index.js.map +1 -0
  20. package/dist/breakouts/request.js +78 -0
  21. package/dist/breakouts/request.js.map +1 -0
  22. package/dist/breakouts/utils.js +67 -0
  23. package/dist/breakouts/utils.js.map +1 -0
  24. package/dist/common/browser-detection.js +1 -20
  25. package/dist/common/browser-detection.js.map +1 -1
  26. package/dist/common/collection.js +5 -20
  27. package/dist/common/collection.js.map +1 -1
  28. package/dist/common/config.js +0 -7
  29. package/dist/common/config.js.map +1 -1
  30. package/dist/common/errors/captcha-error.js +10 -24
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +11 -24
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +12 -25
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +10 -24
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/no-meeting-info.js +51 -0
  39. package/dist/common/errors/no-meeting-info.js.map +1 -0
  40. package/dist/common/errors/parameter.js +5 -33
  41. package/dist/common/errors/parameter.js.map +1 -1
  42. package/dist/common/errors/password-error.js +10 -24
  43. package/dist/common/errors/password-error.js.map +1 -1
  44. package/dist/common/errors/permission.js +9 -23
  45. package/dist/common/errors/permission.js.map +1 -1
  46. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  47. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  48. package/dist/common/errors/reconnection-in-progress.js +0 -17
  49. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  50. package/dist/common/errors/reconnection.js +10 -24
  51. package/dist/common/errors/reconnection.js.map +1 -1
  52. package/dist/common/errors/stats.js +10 -24
  53. package/dist/common/errors/stats.js.map +1 -1
  54. package/dist/common/errors/webex-errors.js +54 -48
  55. package/dist/common/errors/webex-errors.js.map +1 -1
  56. package/dist/common/errors/webex-meetings-error.js +5 -25
  57. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  58. package/dist/common/events/events-scope.js +0 -22
  59. package/dist/common/events/events-scope.js.map +1 -1
  60. package/dist/common/events/events.js +0 -23
  61. package/dist/common/events/events.js.map +1 -1
  62. package/dist/common/events/trigger-proxy.js +0 -12
  63. package/dist/common/events/trigger-proxy.js.map +1 -1
  64. package/dist/common/events/util.js +0 -15
  65. package/dist/common/events/util.js.map +1 -1
  66. package/dist/common/logs/logger-config.js +0 -4
  67. package/dist/common/logs/logger-config.js.map +1 -1
  68. package/dist/common/logs/logger-proxy.js +1 -8
  69. package/dist/common/logs/logger-proxy.js.map +1 -1
  70. package/dist/common/logs/request.js +41 -60
  71. package/dist/common/logs/request.js.map +1 -1
  72. package/dist/common/queue.js +28 -23
  73. package/dist/common/queue.js.map +1 -1
  74. package/dist/config.js +11 -15
  75. package/dist/config.js.map +1 -1
  76. package/dist/constants.js +347 -74
  77. package/dist/constants.js.map +1 -1
  78. package/dist/controls-options-manager/constants.js +14 -0
  79. package/dist/controls-options-manager/constants.js.map +1 -0
  80. package/dist/controls-options-manager/enums.js +27 -0
  81. package/dist/controls-options-manager/enums.js.map +1 -0
  82. package/dist/controls-options-manager/index.js +297 -0
  83. package/dist/controls-options-manager/index.js.map +1 -0
  84. package/dist/controls-options-manager/types.js +7 -0
  85. package/dist/controls-options-manager/types.js.map +1 -0
  86. package/dist/controls-options-manager/util.js +319 -0
  87. package/dist/controls-options-manager/util.js.map +1 -0
  88. package/dist/index.js +125 -18
  89. package/dist/index.js.map +1 -1
  90. package/dist/interceptors/index.js +15 -0
  91. package/dist/interceptors/index.js.map +1 -0
  92. package/dist/interceptors/locusRetry.js +93 -0
  93. package/dist/interceptors/locusRetry.js.map +1 -0
  94. package/dist/interpretation/collection.js +23 -0
  95. package/dist/interpretation/collection.js.map +1 -0
  96. package/dist/interpretation/index.js +380 -0
  97. package/dist/interpretation/index.js.map +1 -0
  98. package/dist/interpretation/siLanguage.js +25 -0
  99. package/dist/interpretation/siLanguage.js.map +1 -0
  100. package/dist/locus-info/controlsUtils.js +101 -29
  101. package/dist/locus-info/controlsUtils.js.map +1 -1
  102. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  103. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  104. package/dist/locus-info/fullState.js +0 -15
  105. package/dist/locus-info/fullState.js.map +1 -1
  106. package/dist/locus-info/hostUtils.js +4 -12
  107. package/dist/locus-info/hostUtils.js.map +1 -1
  108. package/dist/locus-info/index.js +564 -246
  109. package/dist/locus-info/index.js.map +1 -1
  110. package/dist/locus-info/infoUtils.js +10 -38
  111. package/dist/locus-info/infoUtils.js.map +1 -1
  112. package/dist/locus-info/mediaSharesUtils.js +82 -38
  113. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  114. package/dist/locus-info/parser.js +314 -163
  115. package/dist/locus-info/parser.js.map +1 -1
  116. package/dist/locus-info/selfUtils.js +110 -92
  117. package/dist/locus-info/selfUtils.js.map +1 -1
  118. package/dist/media/index.js +107 -231
  119. package/dist/media/index.js.map +1 -1
  120. package/dist/media/properties.js +137 -222
  121. package/dist/media/properties.js.map +1 -1
  122. package/dist/media/util.js +2 -9
  123. package/dist/media/util.js.map +1 -1
  124. package/dist/mediaQualityMetrics/config.js +316 -501
  125. package/dist/mediaQualityMetrics/config.js.map +1 -1
  126. package/dist/meeting/in-meeting-actions.js +97 -14
  127. package/dist/meeting/in-meeting-actions.js.map +1 -1
  128. package/dist/meeting/index.js +5311 -3871
  129. package/dist/meeting/index.js.map +1 -1
  130. package/dist/meeting/locusMediaRequest.js +292 -0
  131. package/dist/meeting/locusMediaRequest.js.map +1 -0
  132. package/dist/meeting/muteState.js +260 -183
  133. package/dist/meeting/muteState.js.map +1 -1
  134. package/dist/meeting/request.js +421 -347
  135. package/dist/meeting/request.js.map +1 -1
  136. package/dist/meeting/request.type.js +7 -0
  137. package/dist/meeting/request.type.js.map +1 -0
  138. package/dist/meeting/state.js +21 -31
  139. package/dist/meeting/state.js.map +1 -1
  140. package/dist/meeting/util.js +672 -585
  141. package/dist/meeting/util.js.map +1 -1
  142. package/dist/meeting/voicea-meeting.js +172 -0
  143. package/dist/meeting/voicea-meeting.js.map +1 -0
  144. package/dist/meeting-info/collection.js +6 -25
  145. package/dist/meeting-info/collection.js.map +1 -1
  146. package/dist/meeting-info/index.js +87 -39
  147. package/dist/meeting-info/index.js.map +1 -1
  148. package/dist/meeting-info/meeting-info-v2.js +352 -283
  149. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  150. package/dist/meeting-info/request.js +3 -15
  151. package/dist/meeting-info/request.js.map +1 -1
  152. package/dist/meeting-info/util.js +99 -183
  153. package/dist/meeting-info/util.js.map +1 -1
  154. package/dist/meeting-info/utilv2.js +147 -234
  155. package/dist/meeting-info/utilv2.js.map +1 -1
  156. package/dist/meetings/collection.js +43 -19
  157. package/dist/meetings/collection.js.map +1 -1
  158. package/dist/meetings/index.js +895 -600
  159. package/dist/meetings/index.js.map +1 -1
  160. package/dist/meetings/meetings.types.js +7 -0
  161. package/dist/meetings/meetings.types.js.map +1 -0
  162. package/dist/meetings/request.js +26 -41
  163. package/dist/meetings/request.js.map +1 -1
  164. package/dist/meetings/util.js +184 -157
  165. package/dist/meetings/util.js.map +1 -1
  166. package/dist/member/index.js +134 -85
  167. package/dist/member/index.js.map +1 -1
  168. package/dist/member/types.js +25 -0
  169. package/dist/member/types.js.map +1 -0
  170. package/dist/member/util.js +158 -88
  171. package/dist/member/util.js.map +1 -1
  172. package/dist/members/collection.js +13 -12
  173. package/dist/members/collection.js.map +1 -1
  174. package/dist/members/index.js +194 -204
  175. package/dist/members/index.js.map +1 -1
  176. package/dist/members/request.js +113 -68
  177. package/dist/members/request.js.map +1 -1
  178. package/dist/members/types.js +15 -0
  179. package/dist/members/types.js.map +1 -0
  180. package/dist/members/util.js +324 -259
  181. package/dist/members/util.js.map +1 -1
  182. package/dist/metrics/constants.js +19 -7
  183. package/dist/metrics/constants.js.map +1 -1
  184. package/dist/metrics/index.js +11 -558
  185. package/dist/metrics/index.js.map +1 -1
  186. package/dist/multistream/mediaRequestManager.js +263 -50
  187. package/dist/multistream/mediaRequestManager.js.map +1 -1
  188. package/dist/multistream/receiveSlot.js +58 -65
  189. package/dist/multistream/receiveSlot.js.map +1 -1
  190. package/dist/multistream/receiveSlotManager.js +76 -95
  191. package/dist/multistream/receiveSlotManager.js.map +1 -1
  192. package/dist/multistream/remoteMedia.js +62 -76
  193. package/dist/multistream/remoteMedia.js.map +1 -1
  194. package/dist/multistream/remoteMediaGroup.js +82 -45
  195. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  196. package/dist/multistream/remoteMediaManager.js +657 -448
  197. package/dist/multistream/remoteMediaManager.js.map +1 -1
  198. package/dist/multistream/sendSlotManager.js +255 -0
  199. package/dist/multistream/sendSlotManager.js.map +1 -0
  200. package/dist/networkQualityMonitor/index.js +40 -59
  201. package/dist/networkQualityMonitor/index.js.map +1 -1
  202. package/dist/personal-meeting-room/index.js +21 -45
  203. package/dist/personal-meeting-room/index.js.map +1 -1
  204. package/dist/personal-meeting-room/request.js +1 -31
  205. package/dist/personal-meeting-room/request.js.map +1 -1
  206. package/dist/personal-meeting-room/util.js +0 -13
  207. package/dist/personal-meeting-room/util.js.map +1 -1
  208. package/dist/reachability/clusterReachability.js +356 -0
  209. package/dist/reachability/clusterReachability.js.map +1 -0
  210. package/dist/reachability/index.js +297 -460
  211. package/dist/reachability/index.js.map +1 -1
  212. package/dist/reachability/request.js +20 -26
  213. package/dist/reachability/request.js.map +1 -1
  214. package/dist/reachability/util.js +29 -0
  215. package/dist/reachability/util.js.map +1 -0
  216. package/dist/reactions/constants.js +13 -0
  217. package/dist/reactions/constants.js.map +1 -0
  218. package/dist/reactions/reactions.js +109 -0
  219. package/dist/reactions/reactions.js.map +1 -0
  220. package/dist/reactions/reactions.type.js +36 -0
  221. package/dist/reactions/reactions.type.js.map +1 -0
  222. package/dist/reconnection-manager/index.js +413 -483
  223. package/dist/reconnection-manager/index.js.map +1 -1
  224. package/dist/recording-controller/enums.js +17 -0
  225. package/dist/recording-controller/enums.js.map +1 -0
  226. package/dist/recording-controller/index.js +362 -0
  227. package/dist/recording-controller/index.js.map +1 -0
  228. package/dist/recording-controller/util.js +64 -0
  229. package/dist/recording-controller/util.js.map +1 -0
  230. package/dist/roap/index.js +102 -86
  231. package/dist/roap/index.js.map +1 -1
  232. package/dist/roap/request.js +131 -135
  233. package/dist/roap/request.js.map +1 -1
  234. package/dist/roap/turnDiscovery.js +437 -116
  235. package/dist/roap/turnDiscovery.js.map +1 -1
  236. package/dist/rtcMetrics/constants.js +12 -0
  237. package/dist/rtcMetrics/constants.js.map +1 -0
  238. package/dist/rtcMetrics/index.js +179 -0
  239. package/dist/rtcMetrics/index.js.map +1 -0
  240. package/dist/statsAnalyzer/global.js +1 -95
  241. package/dist/statsAnalyzer/global.js.map +1 -1
  242. package/dist/statsAnalyzer/index.js +557 -583
  243. package/dist/statsAnalyzer/index.js.map +1 -1
  244. package/dist/statsAnalyzer/mqaUtil.js +326 -130
  245. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  246. package/dist/transcription/index.js +22 -47
  247. package/dist/transcription/index.js.map +1 -1
  248. package/dist/types/annotation/annotation.types.d.ts +42 -0
  249. package/dist/types/annotation/constants.d.ts +31 -0
  250. package/dist/types/annotation/index.d.ts +117 -0
  251. package/dist/types/breakouts/breakout.d.ts +8 -0
  252. package/dist/types/breakouts/collection.d.ts +5 -0
  253. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  254. package/dist/types/breakouts/events.d.ts +8 -0
  255. package/dist/types/breakouts/index.d.ts +5 -0
  256. package/dist/types/breakouts/request.d.ts +22 -0
  257. package/dist/types/breakouts/utils.d.ts +15 -0
  258. package/dist/types/common/browser-detection.d.ts +9 -0
  259. package/dist/types/common/collection.d.ts +48 -0
  260. package/dist/types/common/config.d.ts +2 -0
  261. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  262. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  263. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  264. package/dist/types/common/errors/media.d.ts +15 -0
  265. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  266. package/dist/types/common/errors/parameter.d.ts +15 -0
  267. package/dist/types/common/errors/password-error.d.ts +15 -0
  268. package/dist/types/common/errors/permission.d.ts +14 -0
  269. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  270. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  271. package/dist/types/common/errors/reconnection.d.ts +15 -0
  272. package/dist/types/common/errors/stats.d.ts +15 -0
  273. package/dist/types/common/errors/webex-errors.d.ts +93 -0
  274. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  275. package/dist/types/common/events/events-scope.d.ts +17 -0
  276. package/dist/types/common/events/events.d.ts +12 -0
  277. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  278. package/dist/types/common/events/util.d.ts +2 -0
  279. package/dist/types/common/logs/logger-config.d.ts +2 -0
  280. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  281. package/dist/types/common/logs/request.d.ts +36 -0
  282. package/dist/types/common/queue.d.ts +34 -0
  283. package/dist/types/config.d.ts +72 -0
  284. package/dist/types/constants.d.ts +1088 -0
  285. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  286. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  287. package/dist/types/controls-options-manager/index.d.ts +136 -0
  288. package/dist/types/controls-options-manager/types.d.ts +43 -0
  289. package/dist/types/controls-options-manager/util.d.ts +1 -0
  290. package/dist/types/index.d.ts +7 -0
  291. package/dist/types/interceptors/index.d.ts +2 -0
  292. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  293. package/dist/types/interpretation/collection.d.ts +5 -0
  294. package/dist/types/interpretation/index.d.ts +5 -0
  295. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  296. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  297. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  298. package/dist/types/locus-info/fullState.d.ts +2 -0
  299. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  300. package/dist/types/locus-info/index.d.ts +322 -0
  301. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  302. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  303. package/dist/types/locus-info/parser.d.ts +272 -0
  304. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  305. package/dist/types/media/index.d.ts +34 -0
  306. package/dist/types/media/properties.d.ts +93 -0
  307. package/dist/types/media/util.d.ts +2 -0
  308. package/dist/types/mediaQualityMetrics/config.d.ts +241 -0
  309. package/dist/types/meeting/in-meeting-actions.d.ts +167 -0
  310. package/dist/types/meeting/index.d.ts +1824 -0
  311. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  312. package/dist/types/meeting/muteState.d.ts +178 -0
  313. package/dist/types/meeting/request.d.ts +293 -0
  314. package/dist/types/meeting/request.type.d.ts +11 -0
  315. package/dist/types/meeting/state.d.ts +9 -0
  316. package/dist/types/meeting/util.d.ts +118 -0
  317. package/dist/types/meeting/voicea-meeting.d.ts +16 -0
  318. package/dist/types/meeting-info/collection.d.ts +20 -0
  319. package/dist/types/meeting-info/index.d.ts +69 -0
  320. package/dist/types/meeting-info/meeting-info-v2.d.ts +123 -0
  321. package/dist/types/meeting-info/request.d.ts +22 -0
  322. package/dist/types/meeting-info/util.d.ts +2 -0
  323. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  324. package/dist/types/meetings/collection.d.ts +40 -0
  325. package/dist/types/meetings/index.d.ts +389 -0
  326. package/dist/types/meetings/meetings.types.d.ts +4 -0
  327. package/dist/types/meetings/request.d.ts +27 -0
  328. package/dist/types/meetings/util.d.ts +18 -0
  329. package/dist/types/member/index.d.ts +160 -0
  330. package/dist/types/member/types.d.ts +32 -0
  331. package/dist/types/member/util.d.ts +2 -0
  332. package/dist/types/members/collection.d.ts +29 -0
  333. package/dist/types/members/index.d.ts +353 -0
  334. package/dist/types/members/request.d.ts +114 -0
  335. package/dist/types/members/types.d.ts +25 -0
  336. package/dist/types/members/util.d.ts +215 -0
  337. package/dist/types/metrics/constants.d.ts +70 -0
  338. package/dist/types/metrics/index.d.ts +45 -0
  339. package/dist/types/multistream/mediaRequestManager.d.ts +120 -0
  340. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  341. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  342. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  343. package/dist/types/multistream/remoteMediaGroup.d.ts +49 -0
  344. package/dist/types/multistream/remoteMediaManager.d.ts +301 -0
  345. package/dist/types/multistream/sendSlotManager.d.ts +70 -0
  346. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  347. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  348. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  349. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  350. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  351. package/dist/types/reachability/index.d.ts +105 -0
  352. package/dist/types/reachability/request.d.ts +39 -0
  353. package/dist/types/reachability/util.d.ts +8 -0
  354. package/dist/types/reactions/constants.d.ts +3 -0
  355. package/dist/types/reactions/reactions.d.ts +4 -0
  356. package/dist/types/reactions/reactions.type.d.ts +52 -0
  357. package/dist/types/reconnection-manager/index.d.ts +136 -0
  358. package/dist/types/recording-controller/enums.d.ts +7 -0
  359. package/dist/types/recording-controller/index.d.ts +207 -0
  360. package/dist/types/recording-controller/util.d.ts +14 -0
  361. package/dist/types/roap/index.d.ts +86 -0
  362. package/dist/types/roap/request.d.ts +39 -0
  363. package/dist/types/roap/turnDiscovery.d.ts +155 -0
  364. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  365. package/dist/types/rtcMetrics/index.d.ts +61 -0
  366. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  367. package/dist/types/statsAnalyzer/index.d.ts +217 -0
  368. package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
  369. package/dist/types/transcription/index.d.ts +64 -0
  370. package/dist/types/webinar/collection.d.ts +16 -0
  371. package/dist/types/webinar/index.d.ts +5 -0
  372. package/dist/webinar/collection.js +44 -0
  373. package/dist/webinar/collection.js.map +1 -0
  374. package/dist/webinar/index.js +69 -0
  375. package/dist/webinar/index.js.map +1 -0
  376. package/internal-README.md +7 -6
  377. package/package.json +30 -21
  378. package/src/annotation/annotation.types.ts +50 -0
  379. package/src/annotation/constants.ts +36 -0
  380. package/src/annotation/index.ts +328 -0
  381. package/src/breakouts/README.md +220 -0
  382. package/src/breakouts/breakout.ts +188 -0
  383. package/src/breakouts/collection.ts +19 -0
  384. package/src/breakouts/edit-lock-error.ts +25 -0
  385. package/src/breakouts/events.ts +56 -0
  386. package/src/breakouts/index.ts +925 -0
  387. package/src/breakouts/request.ts +55 -0
  388. package/src/breakouts/utils.ts +57 -0
  389. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  390. package/src/common/collection.ts +9 -7
  391. package/src/common/{config.js → config.ts} +1 -1
  392. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  393. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  394. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  395. package/src/common/errors/{media.js → media.ts} +11 -7
  396. package/src/common/errors/no-meeting-info.ts +24 -0
  397. package/src/common/errors/parameter.ts +11 -7
  398. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  399. package/src/common/errors/{permission.js → permission.ts} +10 -6
  400. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  401. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  402. package/src/common/errors/{stats.js → stats.ts} +11 -7
  403. package/src/common/errors/{webex-errors.js → webex-errors.ts} +51 -8
  404. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  405. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  406. package/src/common/events/{events.js → events.ts} +5 -1
  407. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  408. package/src/common/events/{util.js → util.ts} +2 -3
  409. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  410. package/src/common/logs/logger-proxy.ts +44 -0
  411. package/src/common/logs/{request.js → request.ts} +26 -9
  412. package/src/common/queue.ts +22 -9
  413. package/src/{config.js → config.ts} +19 -21
  414. package/src/constants.ts +296 -27
  415. package/src/controls-options-manager/constants.ts +5 -0
  416. package/src/controls-options-manager/enums.ts +18 -0
  417. package/src/controls-options-manager/index.ts +278 -0
  418. package/src/controls-options-manager/types.ts +59 -0
  419. package/src/controls-options-manager/util.ts +300 -0
  420. package/src/index.ts +45 -0
  421. package/src/interceptors/index.ts +3 -0
  422. package/src/interceptors/locusRetry.ts +67 -0
  423. package/src/interpretation/README.md +60 -0
  424. package/src/interpretation/collection.ts +19 -0
  425. package/src/interpretation/index.ts +349 -0
  426. package/src/interpretation/siLanguage.ts +18 -0
  427. package/src/locus-info/controlsUtils.ts +222 -0
  428. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  429. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  430. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  431. package/src/locus-info/{index.js → index.ts} +561 -119
  432. package/src/locus-info/{infoUtils.js → infoUtils.ts} +29 -10
  433. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +97 -17
  434. package/src/locus-info/{parser.js → parser.ts} +303 -104
  435. package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
  436. package/src/media/index.ts +460 -0
  437. package/src/media/properties.ts +283 -0
  438. package/src/media/{util.js → util.ts} +2 -2
  439. package/src/mediaQualityMetrics/config.ts +249 -0
  440. package/src/meeting/in-meeting-actions.ts +199 -3
  441. package/src/meeting/index.ts +8494 -0
  442. package/src/meeting/locusMediaRequest.ts +313 -0
  443. package/src/meeting/muteState.ts +465 -0
  444. package/src/meeting/request.ts +912 -0
  445. package/src/meeting/request.type.ts +13 -0
  446. package/src/meeting/{state.js → state.ts} +50 -35
  447. package/src/meeting/util.ts +799 -0
  448. package/src/meeting/voicea-meeting.ts +122 -0
  449. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  450. package/src/meeting-info/index.ts +210 -0
  451. package/src/meeting-info/meeting-info-v2.ts +423 -0
  452. package/src/meeting-info/{request.js → request.ts} +14 -4
  453. package/src/meeting-info/{util.js → util.ts} +70 -58
  454. package/src/meeting-info/{utilv2.js → utilv2.ts} +99 -82
  455. package/src/meetings/collection.ts +76 -0
  456. package/src/meetings/index.ts +1539 -0
  457. package/src/meetings/meetings.types.ts +12 -0
  458. package/src/meetings/{request.js → request.ts} +34 -25
  459. package/src/meetings/{util.js → util.ts} +133 -38
  460. package/src/member/{index.js → index.ts} +159 -56
  461. package/src/member/types.ts +38 -0
  462. package/src/member/util.ts +397 -0
  463. package/src/members/{collection.js → collection.ts} +10 -2
  464. package/src/members/{index.js → index.ts} +351 -146
  465. package/src/members/request.ts +255 -0
  466. package/src/members/types.ts +29 -0
  467. package/src/members/util.ts +353 -0
  468. package/src/metrics/{constants.js → constants.ts} +17 -6
  469. package/src/metrics/index.ts +73 -0
  470. package/src/multistream/mediaRequestManager.ts +341 -64
  471. package/src/multistream/receiveSlot.ts +69 -26
  472. package/src/multistream/receiveSlotManager.ts +66 -42
  473. package/src/multistream/remoteMedia.ts +40 -5
  474. package/src/multistream/remoteMediaGroup.ts +82 -3
  475. package/src/multistream/remoteMediaManager.ts +401 -81
  476. package/src/multistream/sendSlotManager.ts +199 -0
  477. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  478. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  479. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  480. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  481. package/src/reachability/clusterReachability.ts +320 -0
  482. package/src/reachability/index.ts +371 -0
  483. package/src/reachability/request.ts +50 -35
  484. package/src/reachability/util.ts +24 -0
  485. package/src/reactions/constants.ts +4 -0
  486. package/src/reactions/reactions.ts +104 -0
  487. package/src/reactions/reactions.type.ts +62 -0
  488. package/src/reconnection-manager/index.ts +643 -0
  489. package/src/recording-controller/enums.ts +8 -0
  490. package/src/recording-controller/index.ts +332 -0
  491. package/src/recording-controller/util.ts +75 -0
  492. package/src/roap/index.ts +288 -0
  493. package/src/roap/request.ts +153 -0
  494. package/src/roap/turnDiscovery.ts +374 -70
  495. package/src/rtcMetrics/constants.ts +3 -0
  496. package/src/rtcMetrics/index.ts +166 -0
  497. package/src/statsAnalyzer/global.ts +37 -0
  498. package/src/statsAnalyzer/index.ts +1275 -0
  499. package/src/statsAnalyzer/mqaUtil.ts +440 -0
  500. package/src/transcription/{index.js → index.ts} +46 -39
  501. package/src/webinar/collection.ts +31 -0
  502. package/src/webinar/index.ts +62 -0
  503. package/test/integration/spec/converged-space-meetings.js +233 -0
  504. package/test/integration/spec/journey.js +791 -531
  505. package/test/integration/spec/space-meeting.js +391 -204
  506. package/test/integration/spec/transcription.js +7 -8
  507. package/test/unit/spec/annotation/index.ts +418 -0
  508. package/test/unit/spec/breakouts/breakout.ts +238 -0
  509. package/test/unit/spec/breakouts/collection.ts +15 -0
  510. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  511. package/test/unit/spec/breakouts/events.ts +89 -0
  512. package/test/unit/spec/breakouts/index.ts +1793 -0
  513. package/test/unit/spec/breakouts/request.ts +104 -0
  514. package/test/unit/spec/breakouts/utils.js +72 -0
  515. package/test/unit/spec/common/browser-detection.js +9 -28
  516. package/test/unit/spec/common/queue.js +31 -2
  517. package/test/unit/spec/controls-options-manager/index.js +287 -0
  518. package/test/unit/spec/controls-options-manager/util.js +582 -0
  519. package/test/unit/spec/fixture/locus.js +93 -90
  520. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  521. package/test/unit/spec/interpretation/collection.ts +15 -0
  522. package/test/unit/spec/interpretation/index.ts +625 -0
  523. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  524. package/test/unit/spec/locus-info/controlsUtils.js +325 -32
  525. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  526. package/test/unit/spec/locus-info/index.js +1458 -21
  527. package/test/unit/spec/locus-info/infoUtils.js +71 -40
  528. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  529. package/test/unit/spec/locus-info/lib/SeqCmp.json +529 -685
  530. package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
  531. package/test/unit/spec/locus-info/parser.js +119 -44
  532. package/test/unit/spec/locus-info/selfConstant.js +120 -103
  533. package/test/unit/spec/locus-info/selfUtils.js +291 -12
  534. package/test/unit/spec/media/index.ts +194 -111
  535. package/test/unit/spec/media/properties.ts +11 -11
  536. package/test/unit/spec/meeting/in-meeting-actions.ts +96 -3
  537. package/test/unit/spec/meeting/index.js +8616 -1921
  538. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  539. package/test/unit/spec/meeting/muteState.js +568 -207
  540. package/test/unit/spec/meeting/request.js +602 -82
  541. package/test/unit/spec/meeting/utils.js +867 -179
  542. package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
  543. package/test/unit/spec/meeting-info/index.js +300 -0
  544. package/test/unit/spec/meeting-info/meetinginfov2.js +631 -78
  545. package/test/unit/spec/meeting-info/request.js +7 -9
  546. package/test/unit/spec/meeting-info/util.js +11 -12
  547. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  548. package/test/unit/spec/meetings/collection.js +27 -1
  549. package/test/unit/spec/meetings/index.js +1826 -374
  550. package/test/unit/spec/meetings/utils.js +243 -14
  551. package/test/unit/spec/member/index.js +61 -7
  552. package/test/unit/spec/member/util.js +526 -26
  553. package/test/unit/spec/members/index.js +536 -55
  554. package/test/unit/spec/members/request.js +228 -40
  555. package/test/unit/spec/members/utils.js +217 -4
  556. package/test/unit/spec/metrics/index.js +13 -68
  557. package/test/unit/spec/multistream/mediaRequestManager.ts +1032 -110
  558. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  559. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  560. package/test/unit/spec/multistream/remoteMedia.ts +40 -2
  561. package/test/unit/spec/multistream/remoteMediaGroup.ts +350 -5
  562. package/test/unit/spec/multistream/remoteMediaManager.ts +937 -65
  563. package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
  564. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  565. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  566. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  567. package/test/unit/spec/reachability/index.ts +606 -26
  568. package/test/unit/spec/reachability/request.js +68 -0
  569. package/test/unit/spec/reachability/util.ts +40 -0
  570. package/test/unit/spec/reconnection-manager/index.js +222 -34
  571. package/test/unit/spec/recording-controller/index.js +306 -0
  572. package/test/unit/spec/recording-controller/util.js +229 -0
  573. package/test/unit/spec/roap/index.ts +238 -82
  574. package/test/unit/spec/roap/request.ts +255 -0
  575. package/test/unit/spec/roap/turnDiscovery.ts +707 -110
  576. package/test/unit/spec/rtcMetrics/index.ts +122 -0
  577. package/test/unit/spec/stats-analyzer/index.js +1331 -62
  578. package/test/unit/spec/webinar/collection.ts +13 -0
  579. package/test/unit/spec/webinar/index.ts +60 -0
  580. package/test/utils/cmr.js +44 -42
  581. package/test/utils/constants.js +9 -0
  582. package/test/utils/integrationTestUtils.js +46 -0
  583. package/test/utils/testUtils.js +63 -99
  584. package/test/utils/webex-config.js +22 -18
  585. package/test/utils/webex-test-users.js +65 -50
  586. package/tsconfig.json +6 -0
  587. package/dist/media/internal-media-core-wrapper.js +0 -22
  588. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  589. package/dist/meeting/effectsState.js +0 -327
  590. package/dist/meeting/effectsState.js.map +0 -1
  591. package/dist/metrics/config.js +0 -301
  592. package/dist/metrics/config.js.map +0 -1
  593. package/dist/multistream/multistreamMedia.js +0 -116
  594. package/dist/multistream/multistreamMedia.js.map +0 -1
  595. package/dist/peer-connection-manager/util.js +0 -124
  596. package/dist/peer-connection-manager/util.js.map +0 -1
  597. package/src/common/logs/logger-proxy.js +0 -33
  598. package/src/index.js +0 -15
  599. package/src/locus-info/controlsUtils.js +0 -102
  600. package/src/media/index.js +0 -459
  601. package/src/media/internal-media-core-wrapper.ts +0 -9
  602. package/src/media/properties.js +0 -289
  603. package/src/mediaQualityMetrics/config.js +0 -382
  604. package/src/meeting/effectsState.js +0 -205
  605. package/src/meeting/index.js +0 -6284
  606. package/src/meeting/muteState.js +0 -318
  607. package/src/meeting/request.js +0 -684
  608. package/src/meeting/util.js +0 -506
  609. package/src/meeting-info/index.js +0 -131
  610. package/src/meeting-info/meeting-info-v2.js +0 -255
  611. package/src/meetings/collection.js +0 -40
  612. package/src/meetings/index.js +0 -1015
  613. package/src/member/util.js +0 -254
  614. package/src/members/request.js +0 -131
  615. package/src/members/util.js +0 -258
  616. package/src/metrics/config.js +0 -324
  617. package/src/metrics/index.js +0 -530
  618. package/src/multistream/multistreamMedia.ts +0 -92
  619. package/src/peer-connection-manager/util.ts +0 -117
  620. package/src/reachability/index.js +0 -464
  621. package/src/reconnection-manager/index.js +0 -519
  622. package/src/roap/index.js +0 -220
  623. package/src/roap/request.js +0 -127
  624. package/src/statsAnalyzer/global.js +0 -133
  625. package/src/statsAnalyzer/index.js +0 -1006
  626. package/src/statsAnalyzer/mqaUtil.js +0 -173
  627. package/test/unit/spec/meeting/effectsState.js +0 -291
  628. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  629. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -1,6 +1,8 @@
1
- import {cloneDeep, remove} from 'lodash';
1
+ /* eslint-disable valid-jsdoc */
2
+ import {cloneDeep, forEach, remove} from 'lodash';
2
3
  import {EventMap} from 'typed-emitter';
3
- import {MediaConnection as MC} from '@webex/internal-media-core';
4
+ import {MediaType} from '@webex/internal-media-core';
5
+ import {NamedMediaGroup} from '@webex/json-multistream';
4
6
 
5
7
  import LoggerProxy from '../common/logs/logger-proxy';
6
8
  import EventsScope from '../common/events/events-scope';
@@ -10,6 +12,7 @@ import {ReceiveSlot, CSI} from './receiveSlot';
10
12
  import {ReceiveSlotManager} from './receiveSlotManager';
11
13
  import {RemoteMediaGroup} from './remoteMediaGroup';
12
14
  import {MediaRequestManager} from './mediaRequestManager';
15
+ import {NAMED_MEDIA_GROUP_TYPE_AUDIO} from '../constants';
13
16
 
14
17
  export type PaneSize = RemoteVideoResolution;
15
18
  export type LayoutId = string;
@@ -30,8 +33,8 @@ export interface MemberVideoPane {
30
33
  }
31
34
 
32
35
  export interface VideoLayout {
33
- screenShareVideo: {
34
- size: PaneSize | null; // null if you don't want to receive any screen share video
36
+ screenShareVideo?: {
37
+ size: PaneSize;
35
38
  };
36
39
  activeSpeakerVideoPaneGroups?: ActiveSpeakerVideoPaneGroup[]; // list of active speaker video pane groups
37
40
  memberVideoPanes?: MemberVideoPane[]; // list of video panes for specific members, CSI values can be changed later via setVideoPaneCsi()
@@ -40,6 +43,7 @@ export interface VideoLayout {
40
43
  export interface Configuration {
41
44
  audio: {
42
45
  numOfActiveSpeakerStreams: number; // number of audio streams we want to receive
46
+ numOfScreenShareStreams: number; // 1 should be enough, because in webex only 1 person at a time can be presenting screen share
43
47
  };
44
48
  video: {
45
49
  preferLiveVideo: boolean; // applies to all pane groups with active speaker policy
@@ -47,17 +51,13 @@ export interface Configuration {
47
51
 
48
52
  layouts: {[key: LayoutId]: VideoLayout}; // a map of all available layouts, a layout can be set via setLayout() method
49
53
  };
50
- screenShare: {
51
- audio: boolean; // whether we ever want to receive screen share audio at all
52
- video: boolean; // whether we ever want to receive screen share video at all
53
- };
54
+ namedMediaGroup?: NamedMediaGroup;
54
55
  }
55
56
 
56
57
  /* Predefined layouts: */
57
58
 
58
59
  // An "all equal" grid, with size up to 3 x 3 = 9:
59
60
  const AllEqualLayout: VideoLayout = {
60
- screenShareVideo: {size: null},
61
61
  activeSpeakerVideoPaneGroups: [
62
62
  {
63
63
  id: 'main',
@@ -70,7 +70,6 @@ const AllEqualLayout: VideoLayout = {
70
70
 
71
71
  // A layout with just a single remote active speaker video pane:
72
72
  const SingleLayout: VideoLayout = {
73
- screenShareVideo: {size: null},
74
73
  activeSpeakerVideoPaneGroups: [
75
74
  {
76
75
  id: 'main',
@@ -83,7 +82,6 @@ const SingleLayout: VideoLayout = {
83
82
 
84
83
  // A layout with 1 big pane for the highest priority active speaker and 5 small panes for other active speakers:
85
84
  const OnePlusFiveLayout: VideoLayout = {
86
- screenShareVideo: {size: null},
87
85
  activeSpeakerVideoPaneGroups: [
88
86
  {
89
87
  id: 'mainBigOne',
@@ -101,8 +99,8 @@ const OnePlusFiveLayout: VideoLayout = {
101
99
  };
102
100
 
103
101
  // A layout with 2 big panes for 2 main active speakers and a strip of 6 small panes for other active speakers:
102
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
104
103
  const TwoMainPlusSixSmallLayout: VideoLayout = {
105
- screenShareVideo: {size: null},
106
104
  activeSpeakerVideoPaneGroups: [
107
105
  {
108
106
  id: 'mainGroupWith2BigPanes',
@@ -134,7 +132,6 @@ const RemoteScreenShareWithSmallThumbnailsLayout: VideoLayout = {
134
132
 
135
133
  // 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:
136
134
  const Stage2x2With6ThumbnailsLayout: VideoLayout = {
137
- screenShareVideo: {size: null},
138
135
  activeSpeakerVideoPaneGroups: [
139
136
  {
140
137
  id: 'thumbnails',
@@ -160,6 +157,7 @@ const Stage2x2With6ThumbnailsLayout: VideoLayout = {
160
157
  export const DefaultConfiguration: Configuration = {
161
158
  audio: {
162
159
  numOfActiveSpeakerStreams: 3,
160
+ numOfScreenShareStreams: 1,
163
161
  },
164
162
  video: {
165
163
  preferLiveVideo: true,
@@ -173,16 +171,13 @@ export const DefaultConfiguration: Configuration = {
173
171
  ScreenShareView: RemoteScreenShareWithSmallThumbnailsLayout,
174
172
  },
175
173
  },
176
- screenShare: {
177
- audio: true,
178
- video: true,
179
- },
180
174
  };
181
175
 
182
176
  export enum Event {
183
177
  // events for audio streams
184
178
  AudioCreated = 'AudioCreated',
185
- ScreenShareAudioCreated = 'ScreenShareCreated',
179
+ InterpretationAudioCreated = 'InterpretationAudioCreated',
180
+ ScreenShareAudioCreated = 'ScreenShareAudioCreated',
186
181
 
187
182
  // events for video streams
188
183
  VideoLayoutChanged = 'VideoLayoutChanged',
@@ -199,7 +194,7 @@ export interface VideoLayoutChangedEventData {
199
194
  export interface Events extends EventMap {
200
195
  // audio
201
196
  [Event.AudioCreated]: (audio: RemoteMediaGroup) => void;
202
- [Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMedia) => void;
197
+ [Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMediaGroup) => void;
203
198
 
204
199
  // video
205
200
  [Event.VideoLayoutChanged]: (data: VideoLayoutChangedEventData) => void;
@@ -223,14 +218,21 @@ export class RemoteMediaManager extends EventsScope {
223
218
  private mediaRequestManagers: {
224
219
  audio: MediaRequestManager;
225
220
  video: MediaRequestManager;
221
+ screenShareAudio: MediaRequestManager;
222
+ screenShareVideo: MediaRequestManager;
226
223
  };
227
224
 
228
225
  private currentLayout?: VideoLayout;
229
226
 
230
227
  private slots: {
231
- audio: ReceiveSlot[];
232
- screenShareAudio?: ReceiveSlot;
233
- screenShareVideo?: ReceiveSlot;
228
+ audio: {
229
+ main: ReceiveSlot[];
230
+ si: ReceiveSlot;
231
+ };
232
+ screenShare: {
233
+ audio: ReceiveSlot[];
234
+ video?: ReceiveSlot;
235
+ };
234
236
  video: {
235
237
  unused: ReceiveSlot[];
236
238
  activeSpeaker: ReceiveSlot[];
@@ -239,13 +241,20 @@ export class RemoteMediaManager extends EventsScope {
239
241
  };
240
242
 
241
243
  private media: {
242
- audio?: RemoteMediaGroup;
244
+ audio: {
245
+ main?: RemoteMediaGroup;
246
+ si?: RemoteMediaGroup;
247
+ };
243
248
  video: {
244
249
  activeSpeakerGroups: {
245
250
  [key: PaneGroupId]: RemoteMediaGroup;
246
251
  };
247
252
  memberPanes: {[key: PaneId]: RemoteMedia};
248
253
  };
254
+ screenShare: {
255
+ audio?: RemoteMediaGroup;
256
+ video?: RemoteMediaGroup;
257
+ };
249
258
  };
250
259
 
251
260
  private receiveSlotAllocations: {
@@ -267,6 +276,8 @@ export class RemoteMediaManager extends EventsScope {
267
276
  mediaRequestManagers: {
268
277
  audio: MediaRequestManager;
269
278
  video: MediaRequestManager;
279
+ screenShareAudio: MediaRequestManager;
280
+ screenShareVideo: MediaRequestManager;
270
281
  },
271
282
  config: Configuration = DefaultConfiguration
272
283
  ) {
@@ -276,19 +287,31 @@ export class RemoteMediaManager extends EventsScope {
276
287
  this.receiveSlotManager = receiveSlotManager;
277
288
  this.mediaRequestManagers = mediaRequestManagers;
278
289
  this.media = {
279
- audio: undefined,
290
+ audio: {
291
+ main: undefined,
292
+ si: undefined,
293
+ },
280
294
  video: {
281
295
  activeSpeakerGroups: {},
282
296
  memberPanes: {},
283
297
  },
298
+ screenShare: {
299
+ audio: undefined,
300
+ video: undefined,
301
+ },
284
302
  };
285
303
 
286
304
  this.checkConfigValidity();
287
305
 
288
306
  this.slots = {
289
- audio: [],
290
- screenShareAudio: undefined,
291
- screenShareVideo: undefined,
307
+ audio: {
308
+ main: [],
309
+ si: undefined,
310
+ },
311
+ screenShare: {
312
+ audio: [],
313
+ video: undefined,
314
+ },
292
315
  video: {
293
316
  unused: [],
294
317
  activeSpeaker: [],
@@ -359,8 +382,8 @@ export class RemoteMediaManager extends EventsScope {
359
382
 
360
383
  await this.createAudioMedia();
361
384
 
362
- // todo: create screen share audio remote media (SPARK-377812)
363
- // todo: create screen share video receive slot (SPARK-377812)
385
+ await this.createScreenShareReceiveSlots();
386
+ this.createScreenShareAudioMedia();
364
387
 
365
388
  await this.preallocateVideoReceiveSlots();
366
389
 
@@ -373,14 +396,30 @@ export class RemoteMediaManager extends EventsScope {
373
396
  */
374
397
  public stop() {
375
398
  // invalidate all remoteMedia objects
376
- this.invalidateCurrentRemoteMedia({audio: true, video: true, commit: true});
399
+ this.invalidateCurrentRemoteMedia({
400
+ audio: true,
401
+ video: true,
402
+ screenShareAudio: true,
403
+ screenShareVideo: true,
404
+ commit: true,
405
+ });
377
406
 
378
407
  // release all audio receive slots
379
- this.slots.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
380
- this.slots.audio.length = 0;
408
+ this.slots.audio.main.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
409
+ this.slots.audio.main.length = 0;
410
+ if (this.slots.audio.si) {
411
+ this.receiveSlotManager.releaseSlot(this.slots.audio.si);
412
+ }
381
413
 
382
- // todo: screenshare slots... (SPARK-377812)
414
+ // release screen share slots
415
+ this.slots.screenShare.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
416
+ this.slots.screenShare.audio.length = 0;
417
+ if (this.slots.screenShare.video) {
418
+ this.receiveSlotManager.releaseSlot(this.slots.screenShare.video);
419
+ this.slots.screenShare.video = undefined;
420
+ }
383
421
 
422
+ // release video slots
384
423
  this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
385
424
 
386
425
  this.slots.video.unused.push(...this.slots.video.activeSpeaker);
@@ -432,7 +471,8 @@ export class RemoteMediaManager extends EventsScope {
432
471
  while (this.slots.video.unused.length < maxNumVideoPanesRequired) {
433
472
  // eslint-disable-next-line no-await-in-loop
434
473
  this.slots.video.unused.push(
435
- await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)
474
+ // eslint-disable-next-line no-await-in-loop
475
+ await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
436
476
  );
437
477
  }
438
478
  }
@@ -452,11 +492,14 @@ export class RemoteMediaManager extends EventsScope {
452
492
  if (!this.started) {
453
493
  throw new Error('setLayout() called before start()');
454
494
  }
495
+ LoggerProxy.logger.log(`RemoteMediaManager#setLayout --> new layout selected: ${layoutId}`);
496
+
455
497
  this.currentLayoutId = layoutId;
456
498
  this.currentLayout = cloneDeep(this.config.video.layouts[this.currentLayoutId]);
457
499
 
458
500
  await this.updateVideoReceiveSlots();
459
501
  this.updateVideoRemoteMediaObjects();
502
+ this.updateScreenShareVideoRemoteMediaObject();
460
503
  this.emitVideoLayoutChangedEvent();
461
504
  }
462
505
 
@@ -469,22 +512,86 @@ export class RemoteMediaManager extends EventsScope {
469
512
  return this.currentLayoutId;
470
513
  }
471
514
 
515
+ /**
516
+ * sets the preferLiveVideo
517
+ */
518
+ public setPreferLiveVideo(preferLiveVideo: boolean) {
519
+ LoggerProxy.logger.log(
520
+ `RemoteMediaManager#setPreferLiveVideo --> setPreferLiveVideo is called to set preferLiveVideo to ${preferLiveVideo}`
521
+ );
522
+ this.config.video.preferLiveVideo = preferLiveVideo;
523
+ Object.values(this.media.video.activeSpeakerGroups).forEach((activeSpeakerGroup) => {
524
+ activeSpeakerGroup.setPreferLiveVideo(preferLiveVideo, false);
525
+ });
526
+ this.mediaRequestManagers.video.commit();
527
+ }
528
+
529
+ /**
530
+ * Sets CSIs for multiple RemoteMedia instances belonging to RemoteMediaGroup.
531
+ * For each entry in the remoteMediaCsis array:
532
+ * - if csi is specified, the RemoteMedia instance is pinned to that CSI
533
+ * - if csi is undefined, the RemoteMedia instance is unpinned
534
+ */
535
+ public setActiveSpeakerCsis(remoteMediaCsis: {remoteMedia: RemoteMedia; csi?: number}[]) {
536
+ Object.values(this.media.video.activeSpeakerGroups).forEach((remoteMediaGroup) => {
537
+ const groupRemoteMediaCsis = remoteMediaCsis.filter(({remoteMedia}) =>
538
+ remoteMediaGroup.includes(remoteMedia)
539
+ );
540
+ if (groupRemoteMediaCsis.length > 0) {
541
+ remoteMediaGroup.setActiveSpeakerCsis(groupRemoteMediaCsis, false);
542
+ }
543
+ });
544
+ this.mediaRequestManagers.video.commit();
545
+ }
546
+
547
+ /**
548
+ * Sets which named media group need receiving
549
+ * @param {MediaType} mediaType of the stream
550
+ * @param {number} languageCode of the stream. If the languageId is 0, the named media group request will be canceled,
551
+ * and only receive the main audio stream.
552
+ * @returns {void}
553
+ */
554
+ public async setReceiveNamedMediaGroup(mediaType: MediaType, languageId: number) {
555
+ if (mediaType !== MediaType.AudioMain) {
556
+ throw new Error(`cannot set receive named media group which media type is ${mediaType}`);
557
+ }
558
+
559
+ const value = languageId;
560
+ if (value === this.config.namedMediaGroup?.value) {
561
+ return;
562
+ }
563
+
564
+ this.config.namedMediaGroup = {
565
+ type: NAMED_MEDIA_GROUP_TYPE_AUDIO,
566
+ value,
567
+ };
568
+
569
+ if (!this.media.audio.si) {
570
+ await this.createInterpretationAudioMedia(true);
571
+ } else {
572
+ this.media.audio.si.setNamedMediaGroup(this.config.namedMediaGroup, true);
573
+ }
574
+ }
575
+
472
576
  /**
473
577
  * Creates the audio slots
474
578
  */
475
579
  private async createAudioMedia() {
476
- // create the audio receive slots
580
+ // create si audio request
581
+ await this.createInterpretationAudioMedia(false);
582
+
583
+ // create main audio receive slots
477
584
  for (let i = 0; i < this.config.audio.numOfActiveSpeakerStreams; i += 1) {
478
585
  // eslint-disable-next-line no-await-in-loop
479
- const slot = await this.receiveSlotManager.allocateSlot(MC.MediaType.AudioMain);
586
+ const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioMain);
480
587
 
481
- this.slots.audio.push(slot);
588
+ this.slots.audio.main.push(slot);
482
589
  }
483
590
 
484
- // create a remote media group
485
- this.media.audio = new RemoteMediaGroup(
591
+ // create a remote media group for main audio
592
+ this.media.audio.main = new RemoteMediaGroup(
486
593
  this.mediaRequestManagers.audio,
487
- this.slots.audio,
594
+ this.slots.audio.main,
488
595
  255,
489
596
  true
490
597
  );
@@ -492,10 +599,84 @@ export class RemoteMediaManager extends EventsScope {
492
599
  this.emit(
493
600
  {file: 'multistream/remoteMediaManager', function: 'createAudioMedia'},
494
601
  Event.AudioCreated,
495
- this.media.audio
602
+ this.media.audio.main
496
603
  );
497
604
  }
498
605
 
606
+ /**
607
+ * Creates the audio slots for named media
608
+ */
609
+ private async createInterpretationAudioMedia(commitRequest: boolean) {
610
+ // create slot for interpretation language audio
611
+ if (
612
+ this.config.namedMediaGroup?.type === NAMED_MEDIA_GROUP_TYPE_AUDIO &&
613
+ this.config.namedMediaGroup?.value
614
+ ) {
615
+ this.slots.audio.si = await this.receiveSlotManager.allocateSlot(MediaType.AudioMain);
616
+
617
+ // create a remote media group for si audio
618
+ this.media.audio.si = new RemoteMediaGroup(
619
+ this.mediaRequestManagers.audio,
620
+ [this.slots.audio.si],
621
+ 255,
622
+ commitRequest,
623
+ {
624
+ namedMediaGroup: this.config.namedMediaGroup,
625
+ }
626
+ );
627
+
628
+ this.emit(
629
+ {file: 'multistream/remoteMediaManager', function: 'createInterpretationAudioMedia'},
630
+ Event.InterpretationAudioCreated,
631
+ this.media.audio.si
632
+ );
633
+ }
634
+ }
635
+
636
+ /**
637
+ * Creates receive slots required for receiving screen share audio and video
638
+ */
639
+ private async createScreenShareReceiveSlots() {
640
+ // audio
641
+ for (let i = 0; i < this.config.audio.numOfScreenShareStreams; i += 1) {
642
+ // eslint-disable-next-line no-await-in-loop
643
+ const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioSlides);
644
+
645
+ this.slots.screenShare.audio.push(slot);
646
+ }
647
+
648
+ // video
649
+ const isAnyLayoutContainingScreenShareVideo = Object.values(this.config.video.layouts).some(
650
+ (layout) => !!layout.screenShareVideo
651
+ );
652
+
653
+ if (isAnyLayoutContainingScreenShareVideo) {
654
+ this.slots.screenShare.video = await this.receiveSlotManager.allocateSlot(
655
+ MediaType.VideoSlides
656
+ );
657
+ }
658
+ }
659
+
660
+ /**
661
+ * Creates RemoteMedia objects for screen share
662
+ */
663
+ private createScreenShareAudioMedia() {
664
+ if (this.slots.screenShare.audio.length > 0) {
665
+ this.media.screenShare.audio = new RemoteMediaGroup(
666
+ this.mediaRequestManagers.screenShareAudio,
667
+ this.slots.screenShare.audio,
668
+ 255,
669
+ true
670
+ );
671
+
672
+ this.emit(
673
+ {file: 'multistream/remoteMediaManager', function: 'createScreenShareAudioMedia'},
674
+ Event.ScreenShareAudioCreated,
675
+ this.media.screenShare.audio
676
+ );
677
+ }
678
+ }
679
+
499
680
  /**
500
681
  * Goes over all receiver-selected slots and keeps only the ones that are required by a given layout,
501
682
  * the rest are all moved to the "unused" list
@@ -536,25 +717,37 @@ export class RemoteMediaManager extends EventsScope {
536
717
  }
537
718
 
538
719
  /**
539
- * Allocates receive slots to all video panes in the current selected layout
720
+ * Allocates receive slots to all active speaker video panes
721
+ * in the current selected layout.
722
+ *
723
+ * Allocation tries to keep the same order of the slots between the previous
724
+ * layout and the new one. Sorting helps making sure that highest priority slots
725
+ * go in the same order in the new layout.
540
726
  */
541
- private allocateSlotsToVideoPaneGroups() {
542
- this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
543
-
544
- this.currentLayout?.activeSpeakerVideoPaneGroups?.forEach((group) => {
545
- this.receiveSlotAllocations.activeSpeaker[group.id] = {slots: []};
546
-
547
- for (let paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {
548
- // allocate a slot from the "unused" list
549
- const freeSlot = this.slots.video.unused.pop();
550
-
551
- if (freeSlot) {
552
- this.slots.video.activeSpeaker.push(freeSlot);
553
- this.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);
727
+ private allocateSlotsToActiveSpeakerPaneGroups() {
728
+ this.currentLayout?.activeSpeakerVideoPaneGroups
729
+ // sorting in descending order based on group priority
730
+ ?.sort((a, b) => (a.priority < b.priority ? 1 : -1))
731
+ ?.forEach((group) => {
732
+ this.receiveSlotAllocations.activeSpeaker[group.id] = {slots: []};
733
+
734
+ for (let paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {
735
+ // allocate a slot from the "unused" list, by grabbing in same order (shift) as previous layout
736
+ const freeSlot = this.slots.video.unused.shift();
737
+
738
+ if (freeSlot) {
739
+ this.slots.video.activeSpeaker.push(freeSlot);
740
+ this.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);
741
+ }
554
742
  }
555
- }
556
- });
743
+ });
744
+ }
557
745
 
746
+ /**
747
+ * Allocates receive slots to all receiver selected video panes
748
+ * in the current selected layout
749
+ */
750
+ private allocateSlotsToReceiverSelectedVideoPaneGroups() {
558
751
  this.currentLayout?.memberVideoPanes?.forEach((memberPane) => {
559
752
  // check if there is existing slot for this csi
560
753
  const existingSlot = this.slots.video.receiverSelected.find(
@@ -581,44 +774,116 @@ export class RemoteMediaManager extends EventsScope {
581
774
  }
582
775
 
583
776
  /**
584
- * Makes sure we have the right number of receive slots created for the current layout
585
- * and allocates them to the right video panes / pane groups
586
- *
587
- * @returns {Promise}
777
+ * Ensures that we have enough slots for the current layout.
588
778
  */
589
- private async updateVideoReceiveSlots() {
779
+ private async refillRequiredSlotsIfNeeded() {
590
780
  const requiredNumSlots = this.getRequiredNumVideoSlotsForLayout(this.currentLayout);
591
781
  const totalNumSlots =
592
782
  this.slots.video.unused.length +
593
783
  this.slots.video.activeSpeaker.length +
594
784
  this.slots.video.receiverSelected.length;
595
785
 
596
- // ensure we have enough total slots for current layout
597
786
  if (totalNumSlots < requiredNumSlots) {
598
787
  let numSlotsToCreate = requiredNumSlots - totalNumSlots;
599
788
 
600
789
  while (numSlotsToCreate > 0) {
601
790
  // eslint-disable-next-line no-await-in-loop
602
791
  this.slots.video.unused.push(
603
- await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)
792
+ // eslint-disable-next-line no-await-in-loop
793
+ await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
604
794
  );
605
795
  numSlotsToCreate -= 1;
606
796
  }
607
797
  }
798
+ }
608
799
 
609
- // move all no longer needed receiver-selected slots to "unused"
610
- this.trimReceiverSelectedSlots();
611
-
612
- // move all active speaker slots to "unused"
800
+ /**
801
+ * Move all active speaker slots to "unused"
802
+ */
803
+ private trimActiveSpeakerSlots() {
613
804
  this.slots.video.unused.push(...this.slots.video.activeSpeaker);
614
805
  this.slots.video.activeSpeaker.length = 0;
806
+ }
615
807
 
616
- // allocate the slots to the right panes / pane groups
617
- this.allocateSlotsToVideoPaneGroups();
808
+ /**
809
+ * Logs the state of the receive slots
810
+ */
811
+ private logMainVideoReceiveSlots() {
812
+ let logMessage = '';
813
+ forEach(this.receiveSlotAllocations.activeSpeaker, (group, groupName) => {
814
+ logMessage += `\ngroup: ${groupName}\n${group.slots
815
+ .map((slot) => slot.logString)
816
+ .join(', ')}`;
817
+ });
818
+
819
+ logMessage += '\nreceiverSelected:\n';
820
+ forEach(this.receiveSlotAllocations.receiverSelected, (slot, key) => {
821
+ logMessage += ` ${key}: ${slot.logString}\n`;
822
+ });
823
+
824
+ LoggerProxy.logger.log(
825
+ `RemoteMediaManager#logMainVideoReceiveSlots --> MAIN VIDEO receive slots: unused=${this.slots.video.unused.length}, activeSpeaker=${this.slots.video.activeSpeaker.length}, receiverSelected=${this.slots.video.receiverSelected.length}${logMessage}`
826
+ );
827
+ }
828
+
829
+ /** logs main audio slots */
830
+ private logMainAudioReceiveSlots() {
831
+ LoggerProxy.logger.log(
832
+ `RemoteMediaManager#logMainAudioReceiveSlots --> MAIN AUDIO receive slots: ${this.slots.audio.main
833
+ .map((slot) => slot.logString)
834
+ .join(', ')}`
835
+ );
836
+ }
618
837
 
838
+ /** logs slides video slots */
839
+ private logSlidesVideoReceiveSlots() {
619
840
  LoggerProxy.logger.log(
620
- `RemoteMediaManager#updateVideoReceiveSlots --> receive slots updated: unused=${this.slots.video.unused.length}, activeSpeaker=${this.slots.video.activeSpeaker.length}, receiverSelected=${this.slots.video.receiverSelected.length}`
841
+ `RemoteMediaManager#logSlidesVideoReceiveSlots --> SLIDES VIDEO receive slot: ${this.slots.screenShare.video?.logString}`
621
842
  );
843
+ }
844
+
845
+ /** logs slides audio slots */
846
+ private logSlidesAudioReceiveSlots() {
847
+ LoggerProxy.logger.log(
848
+ `RemoteMediaManager#logSlidesAudioReceiveSlots --> SLIDES AUDIO receive slots: ${this.slots.screenShare.audio
849
+ .map((slot) => slot.logString)
850
+ .join(', ')}`
851
+ );
852
+ }
853
+
854
+ /** Logs all current receive slots */
855
+ public logAllReceiveSlots() {
856
+ this.logMainVideoReceiveSlots();
857
+ this.logMainAudioReceiveSlots();
858
+ this.logSlidesVideoReceiveSlots();
859
+ this.logSlidesAudioReceiveSlots();
860
+ }
861
+
862
+ /**
863
+ * Makes sure we have the right number of receive slots created for the current layout
864
+ * and allocates them to the right video panes / pane groups
865
+ *
866
+ * @returns {Promise}
867
+ */
868
+ private async updateVideoReceiveSlots() {
869
+ // move all active speaker slots to "unused"
870
+ this.trimActiveSpeakerSlots();
871
+
872
+ // move all no longer needed receiver-selected slots to "unused"
873
+ this.trimReceiverSelectedSlots();
874
+
875
+ // ensure we have enough total slots for current layout
876
+ await this.refillRequiredSlotsIfNeeded();
877
+
878
+ // allocate the slots to the right panes / pane groups
879
+ // reset allocations
880
+ this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
881
+ // allocate active speaker
882
+ this.allocateSlotsToActiveSpeakerPaneGroups();
883
+ // allocate receiver selected
884
+ this.allocateSlotsToReceiverSelectedVideoPaneGroups();
885
+
886
+ this.logMainVideoReceiveSlots();
622
887
 
623
888
  // If this is the initial layout, there may be some "unused" slots left because of the preallocation
624
889
  // done in this.preallocateVideoReceiveSlots(), so release them now
@@ -631,7 +896,13 @@ export class RemoteMediaManager extends EventsScope {
631
896
  */
632
897
  private updateVideoRemoteMediaObjects() {
633
898
  // invalidate all the previous remote media objects and cancel their media requests
634
- this.invalidateCurrentRemoteMedia({audio: false, video: true, commit: false});
899
+ this.invalidateCurrentRemoteMedia({
900
+ audio: false,
901
+ video: true,
902
+ screenShareAudio: false,
903
+ screenShareVideo: false,
904
+ commit: false,
905
+ });
635
906
 
636
907
  // create new remoteMediaGroup objects
637
908
  this.media.video.activeSpeakerGroups = {};
@@ -686,19 +957,61 @@ export class RemoteMediaManager extends EventsScope {
686
957
  );
687
958
  }
688
959
  }
689
- // todo: screenshare (SPARK-377812)
690
960
 
691
961
  this.mediaRequestManagers.video.commit();
692
962
  }
693
963
 
694
964
  /**
695
- * Invalidates all remote media objects belonging to currently selected layout
965
+ * Checks if current layout requires a screen share.
966
+ * If it does, it creates new RemoteMediaGroup object for screen share
967
+ * and sends the media requests for it.
968
+ * If it doesn't, it makes sure we clean up any RemoteMediaGroup objects
969
+ * created earlier for screen share (for previous layout).
696
970
  */
697
- private invalidateCurrentRemoteMedia(options: {audio: boolean; video: boolean; commit: boolean}) {
698
- const {audio, video, commit} = options;
971
+ private updateScreenShareVideoRemoteMediaObject() {
972
+ this.invalidateCurrentRemoteMedia({
973
+ audio: false,
974
+ video: false,
975
+ screenShareAudio: false,
976
+ screenShareVideo: true,
977
+ commit: false,
978
+ });
699
979
 
700
- if (audio && this.media.audio) {
701
- this.media.audio.stop(commit);
980
+ this.media.screenShare.video = undefined;
981
+
982
+ if (this.currentLayout?.screenShareVideo) {
983
+ // we create a group of 1, because for screen share we need to use the "active speaker" policy
984
+ this.media.screenShare.video = new RemoteMediaGroup(
985
+ this.mediaRequestManagers.screenShareVideo,
986
+ [this.slots.screenShare.video],
987
+ 255,
988
+ false,
989
+ {resolution: this.currentLayout.screenShareVideo.size}
990
+ );
991
+ }
992
+
993
+ this.mediaRequestManagers.screenShareVideo.commit();
994
+ }
995
+
996
+ /**
997
+ * Invalidates all remote media objects belonging to currently selected layout
998
+ */
999
+ private invalidateCurrentRemoteMedia(options: {
1000
+ audio: boolean;
1001
+ video: boolean;
1002
+ screenShareAudio: boolean;
1003
+ screenShareVideo: boolean;
1004
+ commit: boolean;
1005
+ }) {
1006
+ const {audio, video, screenShareAudio, screenShareVideo, commit} = options;
1007
+
1008
+ if (audio) {
1009
+ if (this.media.audio.main) {
1010
+ this.media.audio.main.stop(commit);
1011
+ }
1012
+ if (this.media.audio.si) {
1013
+ this.media.audio.si.stop(commit);
1014
+ }
702
1015
  }
703
1016
  if (video) {
704
1017
  Object.values(this.media.video.activeSpeakerGroups).forEach((remoteMediaGroup) => {
@@ -711,12 +1024,19 @@ export class RemoteMediaManager extends EventsScope {
711
1024
  this.mediaRequestManagers.video.commit();
712
1025
  }
713
1026
  }
1027
+
1028
+ if (screenShareAudio && this.media.screenShare.audio) {
1029
+ this.media.screenShare.audio.stop(commit);
1030
+ }
1031
+ if (screenShareVideo && this.media.screenShare.video) {
1032
+ this.media.screenShare.video.stop(commit);
1033
+ }
714
1034
  }
715
1035
 
716
1036
  /** emits Event.VideoLayoutChanged */
717
1037
  private emitVideoLayoutChangedEvent() {
718
1038
  // todo: at this point the receive slots might still be showing a participant from previous layout, we should
719
- // wait for our media requests to be fullfilled, but there is no API for that right now (we could wait for source updates
1039
+ // wait for our media requests to be fulfilled, but there is no API for that right now (we could wait for source updates
720
1040
  // but in some cases they might never come, or would need to always make sure to use a new set of receiver slots)
721
1041
  // for now it's fine to have it like this, we will re-evaluate if it needs improving after more testing
722
1042
 
@@ -730,7 +1050,7 @@ export class RemoteMediaManager extends EventsScope {
730
1050
  layoutId: this.currentLayoutId,
731
1051
  activeSpeakerVideoPanes: this.media.video.activeSpeakerGroups,
732
1052
  memberVideoPanes: this.media.video.memberPanes,
733
- screenShareVideo: undefined, // todo: screen share (SPARK-377812)
1053
+ screenShareVideo: this.media.screenShare.video?.getRemoteMedia()[0],
734
1054
  }
735
1055
  );
736
1056
  }
@@ -778,7 +1098,7 @@ export class RemoteMediaManager extends EventsScope {
778
1098
 
779
1099
  this.currentLayout.memberVideoPanes.push(newPane);
780
1100
 
781
- const receiveSlot = await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain);
1101
+ const receiveSlot = await this.receiveSlotManager.allocateSlot(MediaType.VideoMain);
782
1102
 
783
1103
  this.slots.video.receiverSelected.push(receiveSlot);
784
1104