@webex/plugin-meetings 3.0.0-beta.2 → 3.0.0-beta.200

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 (576) hide show
  1. package/README.md +45 -7
  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/parameter.js +5 -33
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +10 -24
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +9 -23
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reconnection-in-progress.js +0 -17
  45. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  46. package/dist/common/errors/reconnection.js +10 -24
  47. package/dist/common/errors/reconnection.js.map +1 -1
  48. package/dist/common/errors/stats.js +10 -24
  49. package/dist/common/errors/stats.js.map +1 -1
  50. package/dist/common/errors/webex-errors.js +9 -43
  51. package/dist/common/errors/webex-errors.js.map +1 -1
  52. package/dist/common/errors/webex-meetings-error.js +5 -25
  53. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  54. package/dist/common/events/events-scope.js +0 -22
  55. package/dist/common/events/events-scope.js.map +1 -1
  56. package/dist/common/events/events.js +0 -23
  57. package/dist/common/events/events.js.map +1 -1
  58. package/dist/common/events/trigger-proxy.js +0 -12
  59. package/dist/common/events/trigger-proxy.js.map +1 -1
  60. package/dist/common/events/util.js +0 -15
  61. package/dist/common/events/util.js.map +1 -1
  62. package/dist/common/logs/logger-config.js +0 -4
  63. package/dist/common/logs/logger-config.js.map +1 -1
  64. package/dist/common/logs/logger-proxy.js +1 -8
  65. package/dist/common/logs/logger-proxy.js.map +1 -1
  66. package/dist/common/logs/request.js +37 -60
  67. package/dist/common/logs/request.js.map +1 -1
  68. package/dist/common/queue.js +28 -23
  69. package/dist/common/queue.js.map +1 -1
  70. package/dist/config.js +8 -13
  71. package/dist/config.js.map +1 -1
  72. package/dist/constants.js +250 -66
  73. package/dist/constants.js.map +1 -1
  74. package/dist/controls-options-manager/constants.js +14 -0
  75. package/dist/controls-options-manager/constants.js.map +1 -0
  76. package/dist/controls-options-manager/enums.js +27 -0
  77. package/dist/controls-options-manager/enums.js.map +1 -0
  78. package/dist/controls-options-manager/index.js +297 -0
  79. package/dist/controls-options-manager/index.js.map +1 -0
  80. package/dist/controls-options-manager/types.js +7 -0
  81. package/dist/controls-options-manager/types.js.map +1 -0
  82. package/dist/controls-options-manager/util.js +319 -0
  83. package/dist/controls-options-manager/util.js.map +1 -0
  84. package/dist/index.js +108 -17
  85. package/dist/index.js.map +1 -1
  86. package/dist/interpretation/collection.js +23 -0
  87. package/dist/interpretation/collection.js.map +1 -0
  88. package/dist/interpretation/index.js +366 -0
  89. package/dist/interpretation/index.js.map +1 -0
  90. package/dist/interpretation/siLanguage.js +25 -0
  91. package/dist/interpretation/siLanguage.js.map +1 -0
  92. package/dist/locus-info/controlsUtils.js +101 -29
  93. package/dist/locus-info/controlsUtils.js.map +1 -1
  94. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  95. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  96. package/dist/locus-info/fullState.js +0 -15
  97. package/dist/locus-info/fullState.js.map +1 -1
  98. package/dist/locus-info/hostUtils.js +4 -12
  99. package/dist/locus-info/hostUtils.js.map +1 -1
  100. package/dist/locus-info/index.js +532 -240
  101. package/dist/locus-info/index.js.map +1 -1
  102. package/dist/locus-info/infoUtils.js +3 -37
  103. package/dist/locus-info/infoUtils.js.map +1 -1
  104. package/dist/locus-info/mediaSharesUtils.js +54 -38
  105. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  106. package/dist/locus-info/parser.js +284 -154
  107. package/dist/locus-info/parser.js.map +1 -1
  108. package/dist/locus-info/selfUtils.js +110 -92
  109. package/dist/locus-info/selfUtils.js.map +1 -1
  110. package/dist/media/index.js +95 -226
  111. package/dist/media/index.js.map +1 -1
  112. package/dist/media/properties.js +99 -194
  113. package/dist/media/properties.js.map +1 -1
  114. package/dist/media/util.js +2 -9
  115. package/dist/media/util.js.map +1 -1
  116. package/dist/mediaQualityMetrics/config.js +505 -495
  117. package/dist/mediaQualityMetrics/config.js.map +1 -1
  118. package/dist/meeting/in-meeting-actions.js +83 -14
  119. package/dist/meeting/in-meeting-actions.js.map +1 -1
  120. package/dist/meeting/index.js +3478 -3563
  121. package/dist/meeting/index.js.map +1 -1
  122. package/dist/meeting/locusMediaRequest.js +291 -0
  123. package/dist/meeting/locusMediaRequest.js.map +1 -0
  124. package/dist/meeting/muteState.js +247 -183
  125. package/dist/meeting/muteState.js.map +1 -1
  126. package/dist/meeting/request.js +344 -344
  127. package/dist/meeting/request.js.map +1 -1
  128. package/dist/meeting/request.type.js +7 -0
  129. package/dist/meeting/request.type.js.map +1 -0
  130. package/dist/meeting/state.js +21 -31
  131. package/dist/meeting/state.js.map +1 -1
  132. package/dist/meeting/util.js +529 -588
  133. package/dist/meeting/util.js.map +1 -1
  134. package/dist/meeting-info/collection.js +6 -25
  135. package/dist/meeting-info/collection.js.map +1 -1
  136. package/dist/meeting-info/index.js +62 -39
  137. package/dist/meeting-info/index.js.map +1 -1
  138. package/dist/meeting-info/meeting-info-v2.js +328 -283
  139. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  140. package/dist/meeting-info/request.js +3 -15
  141. package/dist/meeting-info/request.js.map +1 -1
  142. package/dist/meeting-info/util.js +98 -183
  143. package/dist/meeting-info/util.js.map +1 -1
  144. package/dist/meeting-info/utilv2.js +156 -232
  145. package/dist/meeting-info/utilv2.js.map +1 -1
  146. package/dist/meetings/collection.js +26 -19
  147. package/dist/meetings/collection.js.map +1 -1
  148. package/dist/meetings/index.js +795 -574
  149. package/dist/meetings/index.js.map +1 -1
  150. package/dist/meetings/meetings.types.js +7 -0
  151. package/dist/meetings/meetings.types.js.map +1 -0
  152. package/dist/meetings/request.js +26 -41
  153. package/dist/meetings/request.js.map +1 -1
  154. package/dist/meetings/util.js +186 -155
  155. package/dist/meetings/util.js.map +1 -1
  156. package/dist/member/index.js +126 -85
  157. package/dist/member/index.js.map +1 -1
  158. package/dist/member/types.js +25 -0
  159. package/dist/member/types.js.map +1 -0
  160. package/dist/member/util.js +147 -88
  161. package/dist/member/util.js.map +1 -1
  162. package/dist/members/collection.js +13 -12
  163. package/dist/members/collection.js.map +1 -1
  164. package/dist/members/index.js +178 -204
  165. package/dist/members/index.js.map +1 -1
  166. package/dist/members/request.js +113 -68
  167. package/dist/members/request.js.map +1 -1
  168. package/dist/members/types.js +15 -0
  169. package/dist/members/types.js.map +1 -0
  170. package/dist/members/util.js +314 -260
  171. package/dist/members/util.js.map +1 -1
  172. package/dist/metrics/constants.js +4 -7
  173. package/dist/metrics/constants.js.map +1 -1
  174. package/dist/metrics/index.js +11 -558
  175. package/dist/metrics/index.js.map +1 -1
  176. package/dist/multistream/mediaRequestManager.js +264 -50
  177. package/dist/multistream/mediaRequestManager.js.map +1 -1
  178. package/dist/multistream/receiveSlot.js +58 -65
  179. package/dist/multistream/receiveSlot.js.map +1 -1
  180. package/dist/multistream/receiveSlotManager.js +76 -95
  181. package/dist/multistream/receiveSlotManager.js.map +1 -1
  182. package/dist/multistream/remoteMedia.js +62 -76
  183. package/dist/multistream/remoteMedia.js.map +1 -1
  184. package/dist/multistream/remoteMediaGroup.js +66 -43
  185. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  186. package/dist/multistream/remoteMediaManager.js +502 -442
  187. package/dist/multistream/remoteMediaManager.js.map +1 -1
  188. package/dist/networkQualityMonitor/index.js +40 -59
  189. package/dist/networkQualityMonitor/index.js.map +1 -1
  190. package/dist/personal-meeting-room/index.js +21 -45
  191. package/dist/personal-meeting-room/index.js.map +1 -1
  192. package/dist/personal-meeting-room/request.js +1 -31
  193. package/dist/personal-meeting-room/request.js.map +1 -1
  194. package/dist/personal-meeting-room/util.js +0 -13
  195. package/dist/personal-meeting-room/util.js.map +1 -1
  196. package/dist/reachability/index.js +192 -191
  197. package/dist/reachability/index.js.map +1 -1
  198. package/dist/reachability/request.js +15 -23
  199. package/dist/reachability/request.js.map +1 -1
  200. package/dist/reactions/constants.js +13 -0
  201. package/dist/reactions/constants.js.map +1 -0
  202. package/dist/reactions/reactions.js +109 -0
  203. package/dist/reactions/reactions.js.map +1 -0
  204. package/dist/reactions/reactions.type.js +36 -0
  205. package/dist/reactions/reactions.type.js.map +1 -0
  206. package/dist/reconnection-manager/index.js +384 -476
  207. package/dist/reconnection-manager/index.js.map +1 -1
  208. package/dist/recording-controller/enums.js +17 -0
  209. package/dist/recording-controller/enums.js.map +1 -0
  210. package/dist/recording-controller/index.js +363 -0
  211. package/dist/recording-controller/index.js.map +1 -0
  212. package/dist/recording-controller/util.js +64 -0
  213. package/dist/recording-controller/util.js.map +1 -0
  214. package/dist/roap/index.js +58 -91
  215. package/dist/roap/index.js.map +1 -1
  216. package/dist/roap/request.js +137 -135
  217. package/dist/roap/request.js.map +1 -1
  218. package/dist/roap/turnDiscovery.js +148 -100
  219. package/dist/roap/turnDiscovery.js.map +1 -1
  220. package/dist/rtcMetrics/constants.js +12 -0
  221. package/dist/rtcMetrics/constants.js.map +1 -0
  222. package/dist/rtcMetrics/index.js +115 -0
  223. package/dist/rtcMetrics/index.js.map +1 -0
  224. package/dist/statsAnalyzer/global.js +1 -95
  225. package/dist/statsAnalyzer/global.js.map +1 -1
  226. package/dist/statsAnalyzer/index.js +385 -460
  227. package/dist/statsAnalyzer/index.js.map +1 -1
  228. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  229. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  230. package/dist/transcription/index.js +22 -47
  231. package/dist/transcription/index.js.map +1 -1
  232. package/dist/types/annotation/annotation.types.d.ts +42 -0
  233. package/dist/types/annotation/constants.d.ts +31 -0
  234. package/dist/types/annotation/index.d.ts +117 -0
  235. package/dist/types/breakouts/breakout.d.ts +8 -0
  236. package/dist/types/breakouts/collection.d.ts +5 -0
  237. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  238. package/dist/types/breakouts/events.d.ts +8 -0
  239. package/dist/types/breakouts/index.d.ts +5 -0
  240. package/dist/types/breakouts/request.d.ts +22 -0
  241. package/dist/types/breakouts/utils.d.ts +15 -0
  242. package/dist/types/common/browser-detection.d.ts +9 -0
  243. package/dist/types/common/collection.d.ts +48 -0
  244. package/dist/types/common/config.d.ts +2 -0
  245. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  246. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  247. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  248. package/dist/types/common/errors/media.d.ts +15 -0
  249. package/dist/types/common/errors/parameter.d.ts +15 -0
  250. package/dist/types/common/errors/password-error.d.ts +15 -0
  251. package/dist/types/common/errors/permission.d.ts +14 -0
  252. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  253. package/dist/types/common/errors/reconnection.d.ts +15 -0
  254. package/dist/types/common/errors/stats.d.ts +15 -0
  255. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  256. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  257. package/dist/types/common/events/events-scope.d.ts +17 -0
  258. package/dist/types/common/events/events.d.ts +12 -0
  259. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  260. package/dist/types/common/events/util.d.ts +2 -0
  261. package/dist/types/common/logs/logger-config.d.ts +2 -0
  262. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  263. package/dist/types/common/logs/request.d.ts +34 -0
  264. package/dist/types/common/queue.d.ts +34 -0
  265. package/dist/types/config.d.ts +72 -0
  266. package/dist/types/constants.d.ts +1016 -0
  267. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  268. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  269. package/dist/types/controls-options-manager/index.d.ts +136 -0
  270. package/dist/types/controls-options-manager/types.d.ts +43 -0
  271. package/dist/types/controls-options-manager/util.d.ts +1 -0
  272. package/dist/types/index.d.ts +7 -0
  273. package/dist/types/interpretation/collection.d.ts +5 -0
  274. package/dist/types/interpretation/index.d.ts +5 -0
  275. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  276. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  277. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  278. package/dist/types/locus-info/fullState.d.ts +2 -0
  279. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  280. package/dist/types/locus-info/index.d.ts +322 -0
  281. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  282. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  283. package/dist/types/locus-info/parser.d.ts +271 -0
  284. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  285. package/dist/types/media/index.d.ts +34 -0
  286. package/dist/types/media/properties.d.ts +93 -0
  287. package/dist/types/media/util.d.ts +2 -0
  288. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  289. package/dist/types/meeting/in-meeting-actions.d.ts +153 -0
  290. package/dist/types/meeting/index.d.ts +1471 -0
  291. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  292. package/dist/types/meeting/muteState.d.ts +184 -0
  293. package/dist/types/meeting/request.d.ts +257 -0
  294. package/dist/types/meeting/request.type.d.ts +11 -0
  295. package/dist/types/meeting/state.d.ts +9 -0
  296. package/dist/types/meeting/util.d.ts +78 -0
  297. package/dist/types/meeting-info/collection.d.ts +20 -0
  298. package/dist/types/meeting-info/index.d.ts +62 -0
  299. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  300. package/dist/types/meeting-info/request.d.ts +22 -0
  301. package/dist/types/meeting-info/util.d.ts +2 -0
  302. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  303. package/dist/types/meetings/collection.d.ts +31 -0
  304. package/dist/types/meetings/index.d.ts +367 -0
  305. package/dist/types/meetings/meetings.types.d.ts +4 -0
  306. package/dist/types/meetings/request.d.ts +27 -0
  307. package/dist/types/meetings/util.d.ts +18 -0
  308. package/dist/types/member/index.d.ts +159 -0
  309. package/dist/types/member/types.d.ts +32 -0
  310. package/dist/types/member/util.d.ts +2 -0
  311. package/dist/types/members/collection.d.ts +29 -0
  312. package/dist/types/members/index.d.ts +353 -0
  313. package/dist/types/members/request.d.ts +114 -0
  314. package/dist/types/members/types.d.ts +24 -0
  315. package/dist/types/members/util.d.ts +210 -0
  316. package/dist/types/metrics/constants.d.ts +55 -0
  317. package/dist/types/metrics/index.d.ts +45 -0
  318. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  319. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  320. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  321. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  322. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  323. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  324. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  325. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  326. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  327. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  328. package/dist/types/reachability/index.d.ts +152 -0
  329. package/dist/types/reachability/request.d.ts +37 -0
  330. package/dist/types/reactions/constants.d.ts +3 -0
  331. package/dist/types/reactions/reactions.d.ts +4 -0
  332. package/dist/types/reactions/reactions.type.d.ts +52 -0
  333. package/dist/types/reconnection-manager/index.d.ts +126 -0
  334. package/dist/types/recording-controller/enums.d.ts +7 -0
  335. package/dist/types/recording-controller/index.d.ts +208 -0
  336. package/dist/types/recording-controller/util.d.ts +14 -0
  337. package/dist/types/roap/index.d.ts +77 -0
  338. package/dist/types/roap/request.d.ts +36 -0
  339. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  340. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  341. package/dist/types/rtcMetrics/index.d.ts +46 -0
  342. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  343. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  344. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  345. package/dist/types/transcription/index.d.ts +64 -0
  346. package/internal-README.md +7 -6
  347. package/package.json +29 -21
  348. package/src/annotation/annotation.types.ts +50 -0
  349. package/src/annotation/constants.ts +36 -0
  350. package/src/annotation/index.ts +328 -0
  351. package/src/breakouts/README.md +220 -0
  352. package/src/breakouts/breakout.ts +188 -0
  353. package/src/breakouts/collection.ts +19 -0
  354. package/src/breakouts/edit-lock-error.ts +25 -0
  355. package/src/breakouts/events.ts +56 -0
  356. package/src/breakouts/index.ts +925 -0
  357. package/src/breakouts/request.ts +55 -0
  358. package/src/breakouts/utils.ts +57 -0
  359. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  360. package/src/common/collection.ts +9 -7
  361. package/src/common/{config.js → config.ts} +1 -1
  362. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  363. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  364. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  365. package/src/common/errors/{media.js → media.ts} +11 -7
  366. package/src/common/errors/parameter.ts +11 -7
  367. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  368. package/src/common/errors/{permission.js → permission.ts} +10 -6
  369. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  370. package/src/common/errors/{stats.js → stats.ts} +11 -7
  371. package/src/common/errors/{webex-errors.js → webex-errors.ts} +14 -9
  372. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  373. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  374. package/src/common/events/{events.js → events.ts} +5 -1
  375. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  376. package/src/common/events/{util.js → util.ts} +2 -3
  377. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  378. package/src/common/logs/logger-proxy.ts +44 -0
  379. package/src/common/logs/{request.js → request.ts} +22 -9
  380. package/src/common/queue.ts +22 -9
  381. package/src/{config.js → config.ts} +17 -17
  382. package/src/constants.ts +197 -22
  383. package/src/controls-options-manager/constants.ts +5 -0
  384. package/src/controls-options-manager/enums.ts +18 -0
  385. package/src/controls-options-manager/index.ts +278 -0
  386. package/src/controls-options-manager/types.ts +59 -0
  387. package/src/controls-options-manager/util.ts +300 -0
  388. package/src/index.ts +39 -0
  389. package/src/interpretation/README.md +60 -0
  390. package/src/interpretation/collection.ts +19 -0
  391. package/src/interpretation/index.ts +332 -0
  392. package/src/interpretation/siLanguage.ts +18 -0
  393. package/src/locus-info/controlsUtils.ts +222 -0
  394. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  395. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  396. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  397. package/src/locus-info/{index.js → index.ts} +518 -111
  398. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  399. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +65 -17
  400. package/src/locus-info/{parser.js → parser.ts} +271 -98
  401. package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
  402. package/src/media/index.ts +456 -0
  403. package/src/media/{properties.js → properties.ts} +80 -102
  404. package/src/media/{util.js → util.ts} +2 -2
  405. package/src/mediaQualityMetrics/config.ts +384 -0
  406. package/src/meeting/in-meeting-actions.ts +171 -3
  407. package/src/meeting/index.ts +7070 -0
  408. package/src/meeting/locusMediaRequest.ts +309 -0
  409. package/src/meeting/muteState.ts +450 -0
  410. package/src/meeting/{request.js → request.ts} +354 -214
  411. package/src/meeting/request.type.ts +13 -0
  412. package/src/meeting/{state.js → state.ts} +50 -35
  413. package/src/meeting/util.ts +615 -0
  414. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  415. package/src/meeting-info/index.ts +183 -0
  416. package/src/meeting-info/meeting-info-v2.ts +407 -0
  417. package/src/meeting-info/{request.js → request.ts} +14 -4
  418. package/src/meeting-info/{util.js → util.ts} +60 -51
  419. package/src/meeting-info/{utilv2.js → utilv2.ts} +77 -60
  420. package/src/meetings/{collection.js → collection.ts} +26 -3
  421. package/src/meetings/index.ts +1467 -0
  422. package/src/meetings/meetings.types.ts +12 -0
  423. package/src/meetings/{request.js → request.ts} +34 -25
  424. package/src/meetings/{util.js → util.ts} +137 -36
  425. package/src/member/{index.js → index.ts} +151 -56
  426. package/src/member/types.ts +38 -0
  427. package/src/member/util.ts +383 -0
  428. package/src/members/{collection.js → collection.ts} +10 -2
  429. package/src/members/{index.js → index.ts} +323 -145
  430. package/src/members/request.ts +255 -0
  431. package/src/members/types.ts +28 -0
  432. package/src/members/util.ts +339 -0
  433. package/src/metrics/{constants.js → constants.ts} +2 -6
  434. package/src/metrics/index.ts +73 -0
  435. package/src/multistream/mediaRequestManager.ts +337 -61
  436. package/src/multistream/receiveSlot.ts +69 -26
  437. package/src/multistream/receiveSlotManager.ts +66 -42
  438. package/src/multistream/remoteMedia.ts +40 -5
  439. package/src/multistream/remoteMediaGroup.ts +63 -3
  440. package/src/multistream/remoteMediaManager.ts +263 -66
  441. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  442. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  443. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  444. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  445. package/src/reachability/{index.js → index.ts} +157 -94
  446. package/src/reachability/request.ts +46 -35
  447. package/src/reactions/constants.ts +4 -0
  448. package/src/reactions/reactions.ts +104 -0
  449. package/src/reactions/reactions.type.ts +62 -0
  450. package/src/reconnection-manager/{index.js → index.ts} +254 -136
  451. package/src/recording-controller/enums.ts +8 -0
  452. package/src/recording-controller/index.ts +333 -0
  453. package/src/recording-controller/util.ts +75 -0
  454. package/src/roap/{index.js → index.ts} +86 -78
  455. package/src/roap/request.ts +163 -0
  456. package/src/roap/turnDiscovery.ts +111 -49
  457. package/src/rtcMetrics/constants.ts +3 -0
  458. package/src/rtcMetrics/index.ts +96 -0
  459. package/src/statsAnalyzer/global.ts +37 -0
  460. package/src/statsAnalyzer/index.ts +1272 -0
  461. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  462. package/src/transcription/{index.js → index.ts} +46 -39
  463. package/test/integration/spec/converged-space-meetings.js +233 -0
  464. package/test/integration/spec/journey.js +804 -526
  465. package/test/integration/spec/space-meeting.js +391 -204
  466. package/test/integration/spec/transcription.js +7 -8
  467. package/test/unit/spec/annotation/index.ts +418 -0
  468. package/test/unit/spec/breakouts/breakout.ts +237 -0
  469. package/test/unit/spec/breakouts/collection.ts +15 -0
  470. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  471. package/test/unit/spec/breakouts/events.ts +89 -0
  472. package/test/unit/spec/breakouts/index.ts +1790 -0
  473. package/test/unit/spec/breakouts/request.ts +104 -0
  474. package/test/unit/spec/breakouts/utils.js +72 -0
  475. package/test/unit/spec/common/browser-detection.js +9 -28
  476. package/test/unit/spec/common/queue.js +31 -2
  477. package/test/unit/spec/controls-options-manager/index.js +287 -0
  478. package/test/unit/spec/controls-options-manager/util.js +582 -0
  479. package/test/unit/spec/fixture/locus.js +93 -90
  480. package/test/unit/spec/interpretation/collection.ts +15 -0
  481. package/test/unit/spec/interpretation/index.ts +589 -0
  482. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  483. package/test/unit/spec/locus-info/controlsUtils.js +325 -32
  484. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  485. package/test/unit/spec/locus-info/index.js +1176 -18
  486. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  487. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  488. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  489. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  490. package/test/unit/spec/locus-info/parser.js +65 -31
  491. package/test/unit/spec/locus-info/selfConstant.js +120 -103
  492. package/test/unit/spec/locus-info/selfUtils.js +296 -12
  493. package/test/unit/spec/media/index.ts +162 -68
  494. package/test/unit/spec/media/properties.ts +9 -9
  495. package/test/unit/spec/meeting/in-meeting-actions.ts +82 -3
  496. package/test/unit/spec/meeting/index.js +4569 -1773
  497. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  498. package/test/unit/spec/meeting/muteState.js +382 -211
  499. package/test/unit/spec/meeting/request.js +444 -78
  500. package/test/unit/spec/meeting/utils.js +517 -192
  501. package/test/unit/spec/meeting-info/index.js +181 -0
  502. package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
  503. package/test/unit/spec/meeting-info/request.js +7 -9
  504. package/test/unit/spec/meeting-info/util.js +11 -12
  505. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  506. package/test/unit/spec/meetings/collection.js +15 -1
  507. package/test/unit/spec/meetings/index.js +1254 -330
  508. package/test/unit/spec/meetings/utils.js +220 -14
  509. package/test/unit/spec/member/index.js +58 -5
  510. package/test/unit/spec/member/util.js +494 -26
  511. package/test/unit/spec/members/index.js +423 -55
  512. package/test/unit/spec/members/request.js +228 -40
  513. package/test/unit/spec/members/utils.js +191 -4
  514. package/test/unit/spec/metrics/index.js +12 -66
  515. package/test/unit/spec/multistream/mediaRequestManager.ts +1013 -106
  516. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  517. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  518. package/test/unit/spec/multistream/remoteMedia.ts +40 -2
  519. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  520. package/test/unit/spec/multistream/remoteMediaManager.ts +730 -65
  521. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  522. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  523. package/test/unit/spec/reachability/index.ts +176 -27
  524. package/test/unit/spec/reachability/request.js +66 -0
  525. package/test/unit/spec/reconnection-manager/index.js +155 -9
  526. package/test/unit/spec/recording-controller/index.js +307 -0
  527. package/test/unit/spec/recording-controller/util.js +229 -0
  528. package/test/unit/spec/roap/index.ts +28 -52
  529. package/test/unit/spec/roap/request.ts +225 -0
  530. package/test/unit/spec/roap/turnDiscovery.ts +92 -50
  531. package/test/unit/spec/rtcMetrics/index.ts +60 -0
  532. package/test/unit/spec/stats-analyzer/index.js +116 -60
  533. package/test/utils/cmr.js +44 -42
  534. package/test/utils/constants.js +9 -0
  535. package/test/utils/integrationTestUtils.js +46 -0
  536. package/test/utils/testUtils.js +63 -99
  537. package/test/utils/webex-config.js +22 -18
  538. package/test/utils/webex-test-users.js +57 -50
  539. package/tsconfig.json +6 -0
  540. package/dist/media/internal-media-core-wrapper.js +0 -22
  541. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  542. package/dist/meeting/effectsState.js +0 -327
  543. package/dist/meeting/effectsState.js.map +0 -1
  544. package/dist/metrics/config.js +0 -301
  545. package/dist/metrics/config.js.map +0 -1
  546. package/dist/multistream/multistreamMedia.js +0 -116
  547. package/dist/multistream/multistreamMedia.js.map +0 -1
  548. package/dist/peer-connection-manager/util.js +0 -124
  549. package/dist/peer-connection-manager/util.js.map +0 -1
  550. package/src/common/logs/logger-proxy.js +0 -33
  551. package/src/index.js +0 -15
  552. package/src/locus-info/controlsUtils.js +0 -102
  553. package/src/media/index.js +0 -459
  554. package/src/media/internal-media-core-wrapper.ts +0 -9
  555. package/src/mediaQualityMetrics/config.js +0 -382
  556. package/src/meeting/effectsState.js +0 -205
  557. package/src/meeting/index.js +0 -6284
  558. package/src/meeting/muteState.js +0 -318
  559. package/src/meeting/util.js +0 -506
  560. package/src/meeting-info/index.js +0 -131
  561. package/src/meeting-info/meeting-info-v2.js +0 -255
  562. package/src/meetings/index.js +0 -1015
  563. package/src/member/util.js +0 -254
  564. package/src/members/request.js +0 -131
  565. package/src/members/util.js +0 -258
  566. package/src/metrics/config.js +0 -324
  567. package/src/metrics/index.js +0 -530
  568. package/src/multistream/multistreamMedia.ts +0 -92
  569. package/src/peer-connection-manager/util.ts +0 -117
  570. package/src/roap/request.js +0 -127
  571. package/src/statsAnalyzer/global.js +0 -133
  572. package/src/statsAnalyzer/index.js +0 -1006
  573. package/src/statsAnalyzer/mqaUtil.js +0 -173
  574. package/test/unit/spec/meeting/effectsState.js +0 -291
  575. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  576. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -1,6 +1,7 @@
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';
4
5
 
5
6
  import LoggerProxy from '../common/logs/logger-proxy';
6
7
  import EventsScope from '../common/events/events-scope';
@@ -30,8 +31,8 @@ export interface MemberVideoPane {
30
31
  }
31
32
 
32
33
  export interface VideoLayout {
33
- screenShareVideo: {
34
- size: PaneSize | null; // null if you don't want to receive any screen share video
34
+ screenShareVideo?: {
35
+ size: PaneSize;
35
36
  };
36
37
  activeSpeakerVideoPaneGroups?: ActiveSpeakerVideoPaneGroup[]; // list of active speaker video pane groups
37
38
  memberVideoPanes?: MemberVideoPane[]; // list of video panes for specific members, CSI values can be changed later via setVideoPaneCsi()
@@ -40,6 +41,7 @@ export interface VideoLayout {
40
41
  export interface Configuration {
41
42
  audio: {
42
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
43
45
  };
44
46
  video: {
45
47
  preferLiveVideo: boolean; // applies to all pane groups with active speaker policy
@@ -47,17 +49,12 @@ export interface Configuration {
47
49
 
48
50
  layouts: {[key: LayoutId]: VideoLayout}; // a map of all available layouts, a layout can be set via setLayout() method
49
51
  };
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
52
  }
55
53
 
56
54
  /* Predefined layouts: */
57
55
 
58
56
  // An "all equal" grid, with size up to 3 x 3 = 9:
59
57
  const AllEqualLayout: VideoLayout = {
60
- screenShareVideo: {size: null},
61
58
  activeSpeakerVideoPaneGroups: [
62
59
  {
63
60
  id: 'main',
@@ -70,7 +67,6 @@ const AllEqualLayout: VideoLayout = {
70
67
 
71
68
  // A layout with just a single remote active speaker video pane:
72
69
  const SingleLayout: VideoLayout = {
73
- screenShareVideo: {size: null},
74
70
  activeSpeakerVideoPaneGroups: [
75
71
  {
76
72
  id: 'main',
@@ -83,7 +79,6 @@ const SingleLayout: VideoLayout = {
83
79
 
84
80
  // A layout with 1 big pane for the highest priority active speaker and 5 small panes for other active speakers:
85
81
  const OnePlusFiveLayout: VideoLayout = {
86
- screenShareVideo: {size: null},
87
82
  activeSpeakerVideoPaneGroups: [
88
83
  {
89
84
  id: 'mainBigOne',
@@ -101,8 +96,8 @@ const OnePlusFiveLayout: VideoLayout = {
101
96
  };
102
97
 
103
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
104
100
  const TwoMainPlusSixSmallLayout: VideoLayout = {
105
- screenShareVideo: {size: null},
106
101
  activeSpeakerVideoPaneGroups: [
107
102
  {
108
103
  id: 'mainGroupWith2BigPanes',
@@ -134,7 +129,6 @@ const RemoteScreenShareWithSmallThumbnailsLayout: VideoLayout = {
134
129
 
135
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:
136
131
  const Stage2x2With6ThumbnailsLayout: VideoLayout = {
137
- screenShareVideo: {size: null},
138
132
  activeSpeakerVideoPaneGroups: [
139
133
  {
140
134
  id: 'thumbnails',
@@ -160,6 +154,7 @@ const Stage2x2With6ThumbnailsLayout: VideoLayout = {
160
154
  export const DefaultConfiguration: Configuration = {
161
155
  audio: {
162
156
  numOfActiveSpeakerStreams: 3,
157
+ numOfScreenShareStreams: 1,
163
158
  },
164
159
  video: {
165
160
  preferLiveVideo: true,
@@ -173,16 +168,12 @@ export const DefaultConfiguration: Configuration = {
173
168
  ScreenShareView: RemoteScreenShareWithSmallThumbnailsLayout,
174
169
  },
175
170
  },
176
- screenShare: {
177
- audio: true,
178
- video: true,
179
- },
180
171
  };
181
172
 
182
173
  export enum Event {
183
174
  // events for audio streams
184
175
  AudioCreated = 'AudioCreated',
185
- ScreenShareAudioCreated = 'ScreenShareCreated',
176
+ ScreenShareAudioCreated = 'ScreenShareAudioCreated',
186
177
 
187
178
  // events for video streams
188
179
  VideoLayoutChanged = 'VideoLayoutChanged',
@@ -199,7 +190,7 @@ export interface VideoLayoutChangedEventData {
199
190
  export interface Events extends EventMap {
200
191
  // audio
201
192
  [Event.AudioCreated]: (audio: RemoteMediaGroup) => void;
202
- [Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMedia) => void;
193
+ [Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMediaGroup) => void;
203
194
 
204
195
  // video
205
196
  [Event.VideoLayoutChanged]: (data: VideoLayoutChangedEventData) => void;
@@ -223,14 +214,18 @@ export class RemoteMediaManager extends EventsScope {
223
214
  private mediaRequestManagers: {
224
215
  audio: MediaRequestManager;
225
216
  video: MediaRequestManager;
217
+ screenShareAudio: MediaRequestManager;
218
+ screenShareVideo: MediaRequestManager;
226
219
  };
227
220
 
228
221
  private currentLayout?: VideoLayout;
229
222
 
230
223
  private slots: {
231
224
  audio: ReceiveSlot[];
232
- screenShareAudio?: ReceiveSlot;
233
- screenShareVideo?: ReceiveSlot;
225
+ screenShare: {
226
+ audio: ReceiveSlot[];
227
+ video?: ReceiveSlot;
228
+ };
234
229
  video: {
235
230
  unused: ReceiveSlot[];
236
231
  activeSpeaker: ReceiveSlot[];
@@ -246,6 +241,10 @@ export class RemoteMediaManager extends EventsScope {
246
241
  };
247
242
  memberPanes: {[key: PaneId]: RemoteMedia};
248
243
  };
244
+ screenShare: {
245
+ audio?: RemoteMediaGroup;
246
+ video?: RemoteMediaGroup;
247
+ };
249
248
  };
250
249
 
251
250
  private receiveSlotAllocations: {
@@ -267,6 +266,8 @@ export class RemoteMediaManager extends EventsScope {
267
266
  mediaRequestManagers: {
268
267
  audio: MediaRequestManager;
269
268
  video: MediaRequestManager;
269
+ screenShareAudio: MediaRequestManager;
270
+ screenShareVideo: MediaRequestManager;
270
271
  },
271
272
  config: Configuration = DefaultConfiguration
272
273
  ) {
@@ -281,14 +282,20 @@ export class RemoteMediaManager extends EventsScope {
281
282
  activeSpeakerGroups: {},
282
283
  memberPanes: {},
283
284
  },
285
+ screenShare: {
286
+ audio: undefined,
287
+ video: undefined,
288
+ },
284
289
  };
285
290
 
286
291
  this.checkConfigValidity();
287
292
 
288
293
  this.slots = {
289
294
  audio: [],
290
- screenShareAudio: undefined,
291
- screenShareVideo: undefined,
295
+ screenShare: {
296
+ audio: [],
297
+ video: undefined,
298
+ },
292
299
  video: {
293
300
  unused: [],
294
301
  activeSpeaker: [],
@@ -359,8 +366,8 @@ export class RemoteMediaManager extends EventsScope {
359
366
 
360
367
  await this.createAudioMedia();
361
368
 
362
- // todo: create screen share audio remote media (SPARK-377812)
363
- // todo: create screen share video receive slot (SPARK-377812)
369
+ await this.createScreenShareReceiveSlots();
370
+ this.createScreenShareAudioMedia();
364
371
 
365
372
  await this.preallocateVideoReceiveSlots();
366
373
 
@@ -373,14 +380,27 @@ export class RemoteMediaManager extends EventsScope {
373
380
  */
374
381
  public stop() {
375
382
  // invalidate all remoteMedia objects
376
- 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
+ });
377
390
 
378
391
  // release all audio receive slots
379
392
  this.slots.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
380
393
  this.slots.audio.length = 0;
381
394
 
382
- // 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
+ }
383
402
 
403
+ // release video slots
384
404
  this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
385
405
 
386
406
  this.slots.video.unused.push(...this.slots.video.activeSpeaker);
@@ -432,7 +452,8 @@ export class RemoteMediaManager extends EventsScope {
432
452
  while (this.slots.video.unused.length < maxNumVideoPanesRequired) {
433
453
  // eslint-disable-next-line no-await-in-loop
434
454
  this.slots.video.unused.push(
435
- await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)
455
+ // eslint-disable-next-line no-await-in-loop
456
+ await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
436
457
  );
437
458
  }
438
459
  }
@@ -457,6 +478,7 @@ export class RemoteMediaManager extends EventsScope {
457
478
 
458
479
  await this.updateVideoReceiveSlots();
459
480
  this.updateVideoRemoteMediaObjects();
481
+ this.updateScreenShareVideoRemoteMediaObject();
460
482
  this.emitVideoLayoutChangedEvent();
461
483
  }
462
484
 
@@ -469,6 +491,38 @@ export class RemoteMediaManager extends EventsScope {
469
491
  return this.currentLayoutId;
470
492
  }
471
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
+
472
526
  /**
473
527
  * Creates the audio slots
474
528
  */
@@ -476,7 +530,7 @@ export class RemoteMediaManager extends EventsScope {
476
530
  // create the audio receive slots
477
531
  for (let i = 0; i < this.config.audio.numOfActiveSpeakerStreams; i += 1) {
478
532
  // eslint-disable-next-line no-await-in-loop
479
- const slot = await this.receiveSlotManager.allocateSlot(MC.MediaType.AudioMain);
533
+ const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioMain);
480
534
 
481
535
  this.slots.audio.push(slot);
482
536
  }
@@ -496,6 +550,50 @@ export class RemoteMediaManager extends EventsScope {
496
550
  );
497
551
  }
498
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
+
499
597
  /**
500
598
  * Goes over all receiver-selected slots and keeps only the ones that are required by a given layout,
501
599
  * the rest are all moved to the "unused" list
@@ -536,25 +634,37 @@ export class RemoteMediaManager extends EventsScope {
536
634
  }
537
635
 
538
636
  /**
539
- * 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.
540
643
  */
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);
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
+ }
554
659
  }
555
- }
556
- });
660
+ });
661
+ }
557
662
 
663
+ /**
664
+ * Allocates receive slots to all receiver selected video panes
665
+ * in the current selected layout
666
+ */
667
+ private allocateSlotsToReceiverSelectedVideoPaneGroups() {
558
668
  this.currentLayout?.memberVideoPanes?.forEach((memberPane) => {
559
669
  // check if there is existing slot for this csi
560
670
  const existingSlot = this.slots.video.receiverSelected.find(
@@ -581,44 +691,81 @@ export class RemoteMediaManager extends EventsScope {
581
691
  }
582
692
 
583
693
  /**
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}
694
+ * Ensures that we have enough slots for the current layout.
588
695
  */
589
- private async updateVideoReceiveSlots() {
696
+ private async refillRequiredSlotsIfNeeded() {
590
697
  const requiredNumSlots = this.getRequiredNumVideoSlotsForLayout(this.currentLayout);
591
698
  const totalNumSlots =
592
699
  this.slots.video.unused.length +
593
700
  this.slots.video.activeSpeaker.length +
594
701
  this.slots.video.receiverSelected.length;
595
702
 
596
- // ensure we have enough total slots for current layout
597
703
  if (totalNumSlots < requiredNumSlots) {
598
704
  let numSlotsToCreate = requiredNumSlots - totalNumSlots;
599
705
 
600
706
  while (numSlotsToCreate > 0) {
601
707
  // eslint-disable-next-line no-await-in-loop
602
708
  this.slots.video.unused.push(
603
- await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)
709
+ // eslint-disable-next-line no-await-in-loop
710
+ await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
604
711
  );
605
712
  numSlotsToCreate -= 1;
606
713
  }
607
714
  }
715
+ }
608
716
 
609
- // move all no longer needed receiver-selected slots to "unused"
610
- this.trimReceiverSelectedSlots();
611
-
612
- // move all active speaker slots to "unused"
717
+ /**
718
+ * Move all active speaker slots to "unused"
719
+ */
720
+ private trimActiveSpeakerSlots() {
613
721
  this.slots.video.unused.push(...this.slots.video.activeSpeaker);
614
722
  this.slots.video.activeSpeaker.length = 0;
723
+ }
615
724
 
616
- // allocate the slots to the right panes / pane groups
617
- 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
+ });
618
738
 
619
739
  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}`
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}`
621
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();
622
769
 
623
770
  // If this is the initial layout, there may be some "unused" slots left because of the preallocation
624
771
  // done in this.preallocateVideoReceiveSlots(), so release them now
@@ -631,7 +778,13 @@ export class RemoteMediaManager extends EventsScope {
631
778
  */
632
779
  private updateVideoRemoteMediaObjects() {
633
780
  // invalidate all the previous remote media objects and cancel their media requests
634
- 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
+ });
635
788
 
636
789
  // create new remoteMediaGroup objects
637
790
  this.media.video.activeSpeakerGroups = {};
@@ -686,16 +839,53 @@ export class RemoteMediaManager extends EventsScope {
686
839
  );
687
840
  }
688
841
  }
689
- // todo: screenshare (SPARK-377812)
690
842
 
691
843
  this.mediaRequestManagers.video.commit();
692
844
  }
693
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
+
694
878
  /**
695
879
  * Invalidates all remote media objects belonging to currently selected layout
696
880
  */
697
- private invalidateCurrentRemoteMedia(options: {audio: boolean; video: boolean; commit: boolean}) {
698
- 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;
699
889
 
700
890
  if (audio && this.media.audio) {
701
891
  this.media.audio.stop(commit);
@@ -711,12 +901,19 @@ export class RemoteMediaManager extends EventsScope {
711
901
  this.mediaRequestManagers.video.commit();
712
902
  }
713
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
+ }
714
911
  }
715
912
 
716
913
  /** emits Event.VideoLayoutChanged */
717
914
  private emitVideoLayoutChangedEvent() {
718
915
  // 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
916
+ // wait for our media requests to be fulfilled, but there is no API for that right now (we could wait for source updates
720
917
  // but in some cases they might never come, or would need to always make sure to use a new set of receiver slots)
721
918
  // for now it's fine to have it like this, we will re-evaluate if it needs improving after more testing
722
919
 
@@ -730,7 +927,7 @@ export class RemoteMediaManager extends EventsScope {
730
927
  layoutId: this.currentLayoutId,
731
928
  activeSpeakerVideoPanes: this.media.video.activeSpeakerGroups,
732
929
  memberVideoPanes: this.media.video.memberPanes,
733
- screenShareVideo: undefined, // todo: screen share (SPARK-377812)
930
+ screenShareVideo: this.media.screenShare.video?.getRemoteMedia()[0],
734
931
  }
735
932
  );
736
933
  }
@@ -778,7 +975,7 @@ export class RemoteMediaManager extends EventsScope {
778
975
 
779
976
  this.currentLayout.memberVideoPanes.push(newPane);
780
977
 
781
- const receiveSlot = await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain);
978
+ const receiveSlot = await this.receiveSlotManager.allocateSlot(MediaType.VideoMain);
782
979
 
783
980
  this.slots.video.receiverSelected.push(receiveSlot);
784
981