@webex/plugin-meetings 3.0.0-beta.14 → 3.0.0-beta.140

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 (519) hide show
  1. package/README.md +45 -1
  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 +48 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +355 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +193 -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 +43 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +1012 -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 +5 -26
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +5 -26
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +6 -27
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +5 -26
  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 +5 -26
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +4 -25
  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 +5 -26
  47. package/dist/common/errors/reconnection.js.map +1 -1
  48. package/dist/common/errors/stats.js +5 -26
  49. package/dist/common/errors/stats.js.map +1 -1
  50. package/dist/common/errors/webex-errors.js +6 -41
  51. package/dist/common/errors/webex-errors.js.map +1 -1
  52. package/dist/common/errors/webex-meetings-error.js +1 -24
  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 +35 -61
  67. package/dist/common/logs/request.js.map +1 -1
  68. package/dist/common/queue.js +4 -14
  69. package/dist/common/queue.js.map +1 -1
  70. package/dist/config.js +6 -6
  71. package/dist/config.js.map +1 -1
  72. package/dist/constants.js +204 -53
  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 +300 -0
  83. package/dist/controls-options-manager/util.js.map +1 -0
  84. package/dist/index.js +72 -17
  85. package/dist/index.js.map +1 -1
  86. package/dist/locus-info/controlsUtils.js +100 -29
  87. package/dist/locus-info/controlsUtils.js.map +1 -1
  88. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  89. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  90. package/dist/locus-info/fullState.js +0 -15
  91. package/dist/locus-info/fullState.js.map +1 -1
  92. package/dist/locus-info/hostUtils.js +4 -12
  93. package/dist/locus-info/hostUtils.js.map +1 -1
  94. package/dist/locus-info/index.js +398 -216
  95. package/dist/locus-info/index.js.map +1 -1
  96. package/dist/locus-info/infoUtils.js +0 -38
  97. package/dist/locus-info/infoUtils.js.map +1 -1
  98. package/dist/locus-info/mediaSharesUtils.js +54 -38
  99. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  100. package/dist/locus-info/parser.js +89 -124
  101. package/dist/locus-info/parser.js.map +1 -1
  102. package/dist/locus-info/selfUtils.js +94 -92
  103. package/dist/locus-info/selfUtils.js.map +1 -1
  104. package/dist/media/index.js +55 -165
  105. package/dist/media/index.js.map +1 -1
  106. package/dist/media/properties.js +71 -117
  107. package/dist/media/properties.js.map +1 -1
  108. package/dist/media/util.js +2 -9
  109. package/dist/media/util.js.map +1 -1
  110. package/dist/mediaQualityMetrics/config.js +505 -495
  111. package/dist/mediaQualityMetrics/config.js.map +1 -1
  112. package/dist/meeting/in-meeting-actions.js +77 -14
  113. package/dist/meeting/in-meeting-actions.js.map +1 -1
  114. package/dist/meeting/index.js +2576 -2455
  115. package/dist/meeting/index.js.map +1 -1
  116. package/dist/meeting/locusMediaRequest.js +291 -0
  117. package/dist/meeting/locusMediaRequest.js.map +1 -0
  118. package/dist/meeting/muteState.js +292 -138
  119. package/dist/meeting/muteState.js.map +1 -1
  120. package/dist/meeting/request.js +296 -342
  121. package/dist/meeting/request.js.map +1 -1
  122. package/dist/meeting/request.type.js +0 -1
  123. package/dist/meeting/request.type.js.map +1 -1
  124. package/dist/meeting/state.js +21 -31
  125. package/dist/meeting/state.js.map +1 -1
  126. package/dist/meeting/util.js +463 -583
  127. package/dist/meeting/util.js.map +1 -1
  128. package/dist/meeting-info/collection.js +3 -25
  129. package/dist/meeting-info/collection.js.map +1 -1
  130. package/dist/meeting-info/index.js +10 -33
  131. package/dist/meeting-info/index.js.map +1 -1
  132. package/dist/meeting-info/meeting-info-v2.js +305 -286
  133. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  134. package/dist/meeting-info/request.js +1 -16
  135. package/dist/meeting-info/request.js.map +1 -1
  136. package/dist/meeting-info/util.js +98 -183
  137. package/dist/meeting-info/util.js.map +1 -1
  138. package/dist/meeting-info/utilv2.js +156 -232
  139. package/dist/meeting-info/utilv2.js.map +1 -1
  140. package/dist/meetings/collection.js +24 -20
  141. package/dist/meetings/collection.js.map +1 -1
  142. package/dist/meetings/index.js +692 -593
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +23 -42
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +186 -155
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +89 -88
  149. package/dist/member/index.js.map +1 -1
  150. package/dist/member/types.js +15 -0
  151. package/dist/member/types.js.map +1 -0
  152. package/dist/member/util.js +101 -69
  153. package/dist/member/util.js.map +1 -1
  154. package/dist/members/collection.js +12 -12
  155. package/dist/members/collection.js.map +1 -1
  156. package/dist/members/index.js +166 -205
  157. package/dist/members/index.js.map +1 -1
  158. package/dist/members/request.js +120 -85
  159. package/dist/members/request.js.map +1 -1
  160. package/dist/members/types.js +15 -0
  161. package/dist/members/types.js.map +1 -0
  162. package/dist/members/util.js +314 -260
  163. package/dist/members/util.js.map +1 -1
  164. package/dist/metrics/config.js +50 -16
  165. package/dist/metrics/config.js.map +1 -1
  166. package/dist/metrics/constants.js +4 -7
  167. package/dist/metrics/constants.js.map +1 -1
  168. package/dist/metrics/index.js +93 -162
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +167 -50
  171. package/dist/multistream/mediaRequestManager.js.map +1 -1
  172. package/dist/multistream/receiveSlot.js +58 -65
  173. package/dist/multistream/receiveSlot.js.map +1 -1
  174. package/dist/multistream/receiveSlotManager.js +74 -93
  175. package/dist/multistream/receiveSlotManager.js.map +1 -1
  176. package/dist/multistream/remoteMedia.js +55 -74
  177. package/dist/multistream/remoteMedia.js.map +1 -1
  178. package/dist/multistream/remoteMediaGroup.js +14 -40
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +481 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +32 -59
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +10 -45
  185. package/dist/personal-meeting-room/index.js.map +1 -1
  186. package/dist/personal-meeting-room/request.js +2 -33
  187. package/dist/personal-meeting-room/request.js.map +1 -1
  188. package/dist/personal-meeting-room/util.js +0 -13
  189. package/dist/personal-meeting-room/util.js.map +1 -1
  190. package/dist/reachability/index.js +190 -199
  191. package/dist/reachability/index.js.map +1 -1
  192. package/dist/reachability/request.js +14 -23
  193. package/dist/reachability/request.js.map +1 -1
  194. package/dist/reactions/constants.js +13 -0
  195. package/dist/reactions/constants.js.map +1 -0
  196. package/dist/reactions/reactions.js +2 -4
  197. package/dist/reactions/reactions.js.map +1 -1
  198. package/dist/reactions/reactions.type.js +19 -23
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +326 -465
  201. package/dist/reconnection-manager/index.js.map +1 -1
  202. package/dist/recording-controller/enums.js +17 -0
  203. package/dist/recording-controller/enums.js.map +1 -0
  204. package/dist/recording-controller/index.js +343 -0
  205. package/dist/recording-controller/index.js.map +1 -0
  206. package/dist/recording-controller/util.js +63 -0
  207. package/dist/recording-controller/util.js.map +1 -0
  208. package/dist/roap/index.js +31 -75
  209. package/dist/roap/index.js.map +1 -1
  210. package/dist/roap/request.js +129 -136
  211. package/dist/roap/request.js.map +1 -1
  212. package/dist/roap/turnDiscovery.js +143 -103
  213. package/dist/roap/turnDiscovery.js.map +1 -1
  214. package/dist/statsAnalyzer/global.js +1 -95
  215. package/dist/statsAnalyzer/global.js.map +1 -1
  216. package/dist/statsAnalyzer/index.js +369 -462
  217. package/dist/statsAnalyzer/index.js.map +1 -1
  218. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  219. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  220. package/dist/transcription/index.js +13 -45
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +35 -0
  223. package/dist/types/annotation/constants.d.ts +31 -0
  224. package/dist/types/annotation/index.d.ts +124 -0
  225. package/dist/types/breakouts/breakout.d.ts +8 -0
  226. package/dist/types/breakouts/collection.d.ts +5 -0
  227. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  228. package/dist/types/breakouts/events.d.ts +2 -0
  229. package/dist/types/breakouts/index.d.ts +5 -0
  230. package/dist/types/breakouts/request.d.ts +22 -0
  231. package/dist/types/breakouts/utils.d.ts +15 -0
  232. package/dist/types/common/browser-detection.d.ts +9 -0
  233. package/dist/types/common/collection.d.ts +48 -0
  234. package/dist/types/common/config.d.ts +2 -0
  235. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  236. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  237. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  238. package/dist/types/common/errors/media.d.ts +15 -0
  239. package/dist/types/common/errors/parameter.d.ts +15 -0
  240. package/dist/types/common/errors/password-error.d.ts +15 -0
  241. package/dist/types/common/errors/permission.d.ts +14 -0
  242. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  243. package/dist/types/common/errors/reconnection.d.ts +15 -0
  244. package/dist/types/common/errors/stats.d.ts +15 -0
  245. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  246. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  247. package/dist/types/common/events/events-scope.d.ts +17 -0
  248. package/dist/types/common/events/events.d.ts +12 -0
  249. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  250. package/dist/types/common/events/util.d.ts +2 -0
  251. package/dist/types/common/logs/logger-config.d.ts +2 -0
  252. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  253. package/dist/types/common/logs/request.d.ts +34 -0
  254. package/dist/types/common/queue.d.ts +32 -0
  255. package/dist/types/config.d.ts +78 -0
  256. package/dist/types/constants.d.ts +994 -0
  257. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  258. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  259. package/dist/types/controls-options-manager/index.d.ts +136 -0
  260. package/dist/types/controls-options-manager/types.d.ts +43 -0
  261. package/dist/types/controls-options-manager/util.d.ts +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  264. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  265. package/dist/types/locus-info/fullState.d.ts +2 -0
  266. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  267. package/dist/types/locus-info/index.d.ts +315 -0
  268. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  269. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  270. package/dist/types/locus-info/parser.d.ts +212 -0
  271. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  272. package/dist/types/media/index.d.ts +34 -0
  273. package/dist/types/media/properties.d.ts +108 -0
  274. package/dist/types/media/util.d.ts +2 -0
  275. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  276. package/dist/types/meeting/in-meeting-actions.d.ts +147 -0
  277. package/dist/types/meeting/index.d.ts +1762 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +186 -0
  280. package/dist/types/meeting/request.d.ts +269 -0
  281. package/dist/types/meeting/request.type.d.ts +11 -0
  282. package/dist/types/meeting/state.d.ts +9 -0
  283. package/dist/types/meeting/util.d.ts +76 -0
  284. package/dist/types/meeting-info/collection.d.ts +20 -0
  285. package/dist/types/meeting-info/index.d.ts +57 -0
  286. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  287. package/dist/types/meeting-info/request.d.ts +22 -0
  288. package/dist/types/meeting-info/util.d.ts +2 -0
  289. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  290. package/dist/types/meetings/collection.d.ts +31 -0
  291. package/dist/types/meetings/index.d.ts +345 -0
  292. package/dist/types/meetings/request.d.ts +27 -0
  293. package/dist/types/meetings/util.d.ts +18 -0
  294. package/dist/types/member/index.d.ts +157 -0
  295. package/dist/types/member/types.d.ts +21 -0
  296. package/dist/types/member/util.d.ts +2 -0
  297. package/dist/types/members/collection.d.ts +29 -0
  298. package/dist/types/members/index.d.ts +353 -0
  299. package/dist/types/members/request.d.ts +114 -0
  300. package/dist/types/members/types.d.ts +24 -0
  301. package/dist/types/members/util.d.ts +210 -0
  302. package/dist/types/metrics/config.d.ts +195 -0
  303. package/dist/types/metrics/constants.d.ts +55 -0
  304. package/dist/types/metrics/index.d.ts +169 -0
  305. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  306. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  307. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  308. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  309. package/dist/types/multistream/remoteMediaGroup.d.ts +48 -0
  310. package/dist/types/multistream/remoteMediaManager.d.ts +267 -0
  311. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  312. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  313. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  314. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  315. package/dist/types/reachability/index.d.ts +152 -0
  316. package/dist/types/reachability/request.d.ts +37 -0
  317. package/dist/types/reactions/constants.d.ts +3 -0
  318. package/dist/types/reactions/reactions.d.ts +4 -0
  319. package/dist/types/reactions/reactions.type.d.ts +52 -0
  320. package/dist/types/reconnection-manager/index.d.ts +126 -0
  321. package/dist/types/recording-controller/enums.d.ts +7 -0
  322. package/dist/types/recording-controller/index.d.ts +193 -0
  323. package/dist/types/recording-controller/util.d.ts +13 -0
  324. package/dist/types/roap/index.d.ts +77 -0
  325. package/dist/types/roap/request.d.ts +36 -0
  326. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  327. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  328. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  329. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  330. package/dist/types/transcription/index.d.ts +64 -0
  331. package/internal-README.md +7 -6
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +42 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +339 -0
  336. package/src/breakouts/README.md +220 -0
  337. package/src/breakouts/breakout.ts +163 -0
  338. package/src/breakouts/collection.ts +19 -0
  339. package/src/breakouts/edit-lock-error.ts +25 -0
  340. package/src/breakouts/events.ts +37 -0
  341. package/src/breakouts/index.ts +888 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/browser-detection.ts +9 -6
  345. package/src/common/collection.ts +3 -1
  346. package/src/common/errors/captcha-error.ts +6 -6
  347. package/src/common/errors/intent-to-join.ts +6 -6
  348. package/src/common/errors/join-meeting.ts +12 -8
  349. package/src/common/errors/media.ts +6 -6
  350. package/src/common/errors/parameter.ts +9 -6
  351. package/src/common/errors/password-error.ts +6 -6
  352. package/src/common/errors/permission.ts +5 -5
  353. package/src/common/errors/reconnection.ts +6 -6
  354. package/src/common/errors/stats.ts +6 -6
  355. package/src/common/errors/webex-errors.ts +7 -5
  356. package/src/common/errors/webex-meetings-error.ts +1 -1
  357. package/src/common/events/events-scope.ts +5 -1
  358. package/src/common/events/events.ts +5 -1
  359. package/src/common/events/trigger-proxy.ts +8 -3
  360. package/src/common/events/util.ts +1 -2
  361. package/src/common/logs/logger-proxy.ts +22 -11
  362. package/src/common/logs/request.ts +11 -8
  363. package/src/config.ts +16 -12
  364. package/src/constants.ts +154 -7
  365. package/src/controls-options-manager/constants.ts +5 -0
  366. package/src/controls-options-manager/enums.ts +18 -0
  367. package/src/controls-options-manager/index.ts +278 -0
  368. package/src/controls-options-manager/types.ts +59 -0
  369. package/src/controls-options-manager/util.ts +286 -0
  370. package/src/index.ts +33 -0
  371. package/src/locus-info/controlsUtils.ts +142 -24
  372. package/src/locus-info/fullState.ts +15 -11
  373. package/src/locus-info/hostUtils.ts +4 -3
  374. package/src/locus-info/index.ts +335 -55
  375. package/src/locus-info/infoUtils.ts +12 -4
  376. package/src/locus-info/mediaSharesUtils.ts +52 -4
  377. package/src/locus-info/parser.ts +47 -69
  378. package/src/locus-info/selfUtils.ts +175 -56
  379. package/src/media/index.ts +139 -196
  380. package/src/media/properties.ts +43 -36
  381. package/src/media/util.ts +1 -1
  382. package/src/mediaQualityMetrics/config.ts +380 -378
  383. package/src/meeting/in-meeting-actions.ts +159 -3
  384. package/src/meeting/index.ts +2809 -1589
  385. package/src/meeting/locusMediaRequest.ts +309 -0
  386. package/src/meeting/muteState.ts +290 -72
  387. package/src/meeting/request.ts +229 -182
  388. package/src/meeting/request.type.ts +10 -8
  389. package/src/meeting/state.ts +45 -30
  390. package/src/meeting/util.ts +445 -395
  391. package/src/meeting-info/collection.ts +2 -1
  392. package/src/meeting-info/index.ts +32 -30
  393. package/src/meeting-info/meeting-info-v2.ts +235 -116
  394. package/src/meeting-info/request.ts +9 -3
  395. package/src/meeting-info/util.ts +54 -46
  396. package/src/meeting-info/utilv2.ts +71 -55
  397. package/src/meetings/collection.ts +21 -1
  398. package/src/meetings/index.ts +771 -437
  399. package/src/meetings/request.ts +29 -25
  400. package/src/meetings/util.ts +132 -33
  401. package/src/member/index.ts +95 -49
  402. package/src/member/types.ts +24 -0
  403. package/src/member/util.ts +106 -13
  404. package/src/members/collection.ts +8 -1
  405. package/src/members/index.ts +288 -130
  406. package/src/members/request.ts +144 -31
  407. package/src/members/types.ts +28 -0
  408. package/src/members/util.ts +316 -235
  409. package/src/metrics/config.ts +302 -90
  410. package/src/metrics/constants.ts +2 -6
  411. package/src/metrics/index.ts +124 -95
  412. package/src/multistream/mediaRequestManager.ts +203 -45
  413. package/src/multistream/receiveSlot.ts +69 -26
  414. package/src/multistream/receiveSlotManager.ts +62 -38
  415. package/src/multistream/remoteMedia.ts +30 -4
  416. package/src/multistream/remoteMediaGroup.ts +11 -3
  417. package/src/multistream/remoteMediaManager.ts +245 -66
  418. package/src/networkQualityMonitor/index.ts +24 -27
  419. package/src/personal-meeting-room/index.ts +12 -16
  420. package/src/personal-meeting-room/request.ts +10 -3
  421. package/src/personal-meeting-room/util.ts +3 -3
  422. package/src/reachability/index.ts +131 -79
  423. package/src/reachability/request.ts +43 -34
  424. package/src/reactions/constants.ts +4 -0
  425. package/src/reactions/reactions.ts +8 -8
  426. package/src/reactions/reactions.type.ts +31 -5
  427. package/src/reconnection-manager/index.ts +193 -112
  428. package/src/recording-controller/enums.ts +8 -0
  429. package/src/recording-controller/index.ts +315 -0
  430. package/src/recording-controller/util.ts +58 -0
  431. package/src/roap/index.ts +53 -53
  432. package/src/roap/request.ts +77 -65
  433. package/src/roap/turnDiscovery.ts +101 -48
  434. package/src/statsAnalyzer/global.ts +8 -104
  435. package/src/statsAnalyzer/index.ts +624 -377
  436. package/src/statsAnalyzer/mqaUtil.ts +203 -90
  437. package/src/transcription/index.ts +34 -32
  438. package/test/integration/spec/converged-space-meetings.js +177 -0
  439. package/test/integration/spec/journey.js +670 -466
  440. package/test/integration/spec/space-meeting.js +320 -204
  441. package/test/integration/spec/transcription.js +7 -8
  442. package/test/unit/spec/annotation/index.ts +433 -0
  443. package/test/unit/spec/breakouts/breakout.ts +203 -0
  444. package/test/unit/spec/breakouts/collection.ts +15 -0
  445. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  446. package/test/unit/spec/breakouts/events.ts +77 -0
  447. package/test/unit/spec/breakouts/index.ts +1685 -0
  448. package/test/unit/spec/breakouts/request.ts +104 -0
  449. package/test/unit/spec/breakouts/utils.js +72 -0
  450. package/test/unit/spec/common/browser-detection.js +9 -28
  451. package/test/unit/spec/controls-options-manager/index.js +287 -0
  452. package/test/unit/spec/controls-options-manager/util.js +518 -0
  453. package/test/unit/spec/fixture/locus.js +93 -90
  454. package/test/unit/spec/locus-info/controlsUtils.js +305 -32
  455. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  456. package/test/unit/spec/locus-info/index.js +615 -5
  457. package/test/unit/spec/locus-info/infoUtils.js +26 -33
  458. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  459. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  460. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  461. package/test/unit/spec/locus-info/parser.js +3 -9
  462. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  463. package/test/unit/spec/locus-info/selfUtils.js +221 -12
  464. package/test/unit/spec/media/index.ts +104 -8
  465. package/test/unit/spec/media/properties.ts +9 -9
  466. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -3
  467. package/test/unit/spec/meeting/index.js +3077 -923
  468. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  469. package/test/unit/spec/meeting/muteState.js +421 -94
  470. package/test/unit/spec/meeting/request.js +408 -85
  471. package/test/unit/spec/meeting/utils.js +326 -189
  472. package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
  473. package/test/unit/spec/meeting-info/request.js +7 -9
  474. package/test/unit/spec/meeting-info/util.js +11 -12
  475. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  476. package/test/unit/spec/meetings/collection.js +15 -1
  477. package/test/unit/spec/meetings/index.js +1126 -328
  478. package/test/unit/spec/meetings/utils.js +220 -14
  479. package/test/unit/spec/member/index.js +24 -1
  480. package/test/unit/spec/member/util.js +383 -32
  481. package/test/unit/spec/members/index.js +424 -55
  482. package/test/unit/spec/members/request.js +228 -40
  483. package/test/unit/spec/members/utils.js +191 -4
  484. package/test/unit/spec/metrics/index.js +113 -20
  485. package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
  486. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  487. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  488. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  489. package/test/unit/spec/multistream/remoteMediaGroup.ts +52 -5
  490. package/test/unit/spec/multistream/remoteMediaManager.ts +585 -65
  491. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  492. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  493. package/test/unit/spec/reachability/index.ts +176 -27
  494. package/test/unit/spec/reachability/request.js +66 -0
  495. package/test/unit/spec/reconnection-manager/index.js +62 -31
  496. package/test/unit/spec/recording-controller/index.js +231 -0
  497. package/test/unit/spec/recording-controller/util.js +102 -0
  498. package/test/unit/spec/roap/index.ts +19 -49
  499. package/test/unit/spec/roap/request.ts +187 -0
  500. package/test/unit/spec/roap/turnDiscovery.ts +92 -50
  501. package/test/unit/spec/stats-analyzer/index.js +116 -60
  502. package/test/utils/cmr.js +44 -42
  503. package/test/utils/constants.js +9 -0
  504. package/test/utils/integrationTestUtils.js +64 -0
  505. package/test/utils/testUtils.js +63 -99
  506. package/test/utils/webex-config.js +22 -18
  507. package/test/utils/webex-test-users.js +57 -50
  508. package/tsconfig.json +6 -0
  509. package/dist/media/internal-media-core-wrapper.js +0 -22
  510. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  511. package/dist/meeting/effectsState.js +0 -334
  512. package/dist/meeting/effectsState.js.map +0 -1
  513. package/dist/multistream/multistreamMedia.js +0 -116
  514. package/dist/multistream/multistreamMedia.js.map +0 -1
  515. package/src/index.js +0 -15
  516. package/src/media/internal-media-core-wrapper.ts +0 -9
  517. package/src/meeting/effectsState.ts +0 -211
  518. package/src/multistream/multistreamMedia.ts +0 -92
  519. package/test/unit/spec/meeting/effectsState.js +0 -291
@@ -1,4 +1,5 @@
1
1
  /* eslint-disable valid-jsdoc */
2
+ import {MediaType, StreamState} from '@webex/internal-media-core';
2
3
  import LoggerProxy from '../common/logs/logger-proxy';
3
4
  import EventsScope from '../common/events/events-scope';
4
5
 
@@ -56,7 +57,7 @@ export function getMaxFs(paneSize: RemoteVideoResolution): number {
56
57
  }
57
58
 
58
59
  type Options = {
59
- resolution?: RemoteVideoResolution; // applies only to groups of type MC.MediaType.VideoMain and MC.MediaType.VideoSlides
60
+ resolution?: RemoteVideoResolution; // applies only to groups of type MediaType.VideoMain and MediaType.VideoSlides
60
61
  };
61
62
 
62
63
  export type RemoteMediaId = string;
@@ -101,6 +102,31 @@ export class RemoteMedia extends EventsScope {
101
102
  this.id = `RM${remoteMediaCounter}-${this.receiveSlot.id}`;
102
103
  }
103
104
 
105
+ /**
106
+ * Supply the width and height of the video element
107
+ * to restrict the requested resolution to this size
108
+ * @param width width of the video element
109
+ * @param height height of the video element
110
+ */
111
+ public setSizeHint(width, height) {
112
+ // only base on height for now
113
+ let fs: number;
114
+
115
+ if (height < 135) {
116
+ fs = 60;
117
+ } else if (height < 270) {
118
+ fs = 240;
119
+ } else if (height < 540) {
120
+ fs = 920;
121
+ } else if (height <= 720) {
122
+ fs = 3600;
123
+ } else {
124
+ fs = 8192;
125
+ }
126
+
127
+ this.receiveSlot?.setMaxFs(fs);
128
+ }
129
+
104
130
  /**
105
131
  * Invalidates the remote media by clearing the reference to a receive slot and
106
132
  * cancelling the media request.
@@ -109,7 +135,7 @@ export class RemoteMedia extends EventsScope {
109
135
  * @param {boolean} commit - whether to commit the cancellation of the media request
110
136
  * @internal
111
137
  */
112
- public stop(commit: boolean = true) {
138
+ public stop(commit = true) {
113
139
  this.cancelMediaRequest(commit);
114
140
  this.receiveSlot?.removeAllListeners();
115
141
  this.receiveSlot = undefined;
@@ -186,7 +212,7 @@ export class RemoteMedia extends EventsScope {
186
212
  /**
187
213
  * Getter for mediaType
188
214
  */
189
- public get mediaType() {
215
+ public get mediaType(): MediaType {
190
216
  return this.receiveSlot?.mediaType;
191
217
  }
192
218
 
@@ -207,7 +233,7 @@ export class RemoteMedia extends EventsScope {
207
233
  /**
208
234
  * Getter for source state
209
235
  */
210
- public get sourceState() {
236
+ public get sourceState(): StreamState {
211
237
  return this.receiveSlot?.sourceState;
212
238
  }
213
239
 
@@ -8,8 +8,8 @@ import {MediaRequestId, MediaRequestManager} from './mediaRequestManager';
8
8
  import {CSI, ReceiveSlot} from './receiveSlot';
9
9
 
10
10
  type Options = {
11
- resolution?: RemoteVideoResolution; // applies only to groups of type MC.MediaType.VideoMain and MC.MediaType.VideoSlides
12
- preferLiveVideo?: boolean; // applies only to groups of type MC.MediaType.VideoMain and MC.MediaType.VideoSlides
11
+ resolution?: RemoteVideoResolution; // applies only to groups of type MediaType.VideoMain and MediaType.VideoSlides
12
+ preferLiveVideo?: boolean; // applies only to groups of type MediaType.VideoMain and MediaType.VideoSlides
13
13
  };
14
14
 
15
15
  export class RemoteMediaGroup {
@@ -62,6 +62,7 @@ export class RemoteMediaGroup {
62
62
  // return a shallow copy so that the client cannot modify this.pinnedRemoteMedia array
63
63
  return [...this.pinnedRemoteMedia];
64
64
  }
65
+
65
66
  return [...this.unpinnedRemoteMedia, ...this.pinnedRemoteMedia];
66
67
  }
67
68
 
@@ -150,6 +151,13 @@ export class RemoteMediaGroup {
150
151
  throw new Error(`remote media object ${remoteMedia.id} not found in the group`);
151
152
  }
152
153
 
154
+ public setPreferLiveVideo(preferLiveVideo: boolean, commit: boolean) {
155
+ if (this.options.preferLiveVideo !== preferLiveVideo) {
156
+ this.options.preferLiveVideo = preferLiveVideo;
157
+ this.sendActiveSpeakerMediaRequest(commit);
158
+ }
159
+ }
160
+
153
161
  private sendActiveSpeakerMediaRequest(commit: boolean) {
154
162
  this.cancelActiveSpeakerMediaRequest(false);
155
163
 
@@ -189,7 +197,7 @@ export class RemoteMediaGroup {
189
197
  * @param{boolean} commit whether to commit the cancellation of media requests
190
198
  * @internal
191
199
  */
192
- public stop(commit: boolean = true) {
200
+ public stop(commit = true) {
193
201
  this.unpinnedRemoteMedia.forEach((remoteMedia) => remoteMedia.stop(false));
194
202
  this.pinnedRemoteMedia.forEach((remoteMedia) => remoteMedia.stop(false));
195
203
  this.cancelActiveSpeakerMediaRequest(false);
@@ -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,20 @@ 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
+
472
508
  /**
473
509
  * Creates the audio slots
474
510
  */
@@ -476,7 +512,7 @@ export class RemoteMediaManager extends EventsScope {
476
512
  // create the audio receive slots
477
513
  for (let i = 0; i < this.config.audio.numOfActiveSpeakerStreams; i += 1) {
478
514
  // eslint-disable-next-line no-await-in-loop
479
- const slot = await this.receiveSlotManager.allocateSlot(MC.MediaType.AudioMain);
515
+ const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioMain);
480
516
 
481
517
  this.slots.audio.push(slot);
482
518
  }
@@ -496,6 +532,50 @@ export class RemoteMediaManager extends EventsScope {
496
532
  );
497
533
  }
498
534
 
535
+ /**
536
+ * Creates receive slots required for receiving screen share audio and video
537
+ */
538
+ private async createScreenShareReceiveSlots() {
539
+ // audio
540
+ for (let i = 0; i < this.config.audio.numOfScreenShareStreams; i += 1) {
541
+ // eslint-disable-next-line no-await-in-loop
542
+ const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioSlides);
543
+
544
+ this.slots.screenShare.audio.push(slot);
545
+ }
546
+
547
+ // video
548
+ const isAnyLayoutContainingScreenShareVideo = Object.values(this.config.video.layouts).some(
549
+ (layout) => !!layout.screenShareVideo
550
+ );
551
+
552
+ if (isAnyLayoutContainingScreenShareVideo) {
553
+ this.slots.screenShare.video = await this.receiveSlotManager.allocateSlot(
554
+ MediaType.VideoSlides
555
+ );
556
+ }
557
+ }
558
+
559
+ /**
560
+ * Creates RemoteMedia objects for screen share
561
+ */
562
+ private createScreenShareAudioMedia() {
563
+ if (this.slots.screenShare.audio.length > 0) {
564
+ this.media.screenShare.audio = new RemoteMediaGroup(
565
+ this.mediaRequestManagers.screenShareAudio,
566
+ this.slots.screenShare.audio,
567
+ 255,
568
+ true
569
+ );
570
+
571
+ this.emit(
572
+ {file: 'multistream/remoteMediaManager', function: 'createScreenShareAudioMedia'},
573
+ Event.ScreenShareAudioCreated,
574
+ this.media.screenShare.audio
575
+ );
576
+ }
577
+ }
578
+
499
579
  /**
500
580
  * Goes over all receiver-selected slots and keeps only the ones that are required by a given layout,
501
581
  * the rest are all moved to the "unused" list
@@ -536,25 +616,37 @@ export class RemoteMediaManager extends EventsScope {
536
616
  }
537
617
 
538
618
  /**
539
- * Allocates receive slots to all video panes in the current selected layout
619
+ * Allocates receive slots to all active speaker video panes
620
+ * in the current selected layout.
621
+ *
622
+ * Allocation tries to keep the same order of the slots between the previous
623
+ * layout and the new one. Sorting helps making sure that highest priority slots
624
+ * go in the same order in the new layout.
540
625
  */
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);
626
+ private allocateSlotsToActiveSpeakerPaneGroups() {
627
+ this.currentLayout?.activeSpeakerVideoPaneGroups
628
+ // sorting in descending order based on group priority
629
+ ?.sort((a, b) => (a.priority < b.priority ? 1 : -1))
630
+ ?.forEach((group) => {
631
+ this.receiveSlotAllocations.activeSpeaker[group.id] = {slots: []};
632
+
633
+ for (let paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {
634
+ // allocate a slot from the "unused" list, by grabbing in same order (shift) as previous layout
635
+ const freeSlot = this.slots.video.unused.shift();
636
+
637
+ if (freeSlot) {
638
+ this.slots.video.activeSpeaker.push(freeSlot);
639
+ this.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);
640
+ }
554
641
  }
555
- }
556
- });
642
+ });
643
+ }
557
644
 
645
+ /**
646
+ * Allocates receive slots to all receiver selected video panes
647
+ * in the current selected layout
648
+ */
649
+ private allocateSlotsToReceiverSelectedVideoPaneGroups() {
558
650
  this.currentLayout?.memberVideoPanes?.forEach((memberPane) => {
559
651
  // check if there is existing slot for this csi
560
652
  const existingSlot = this.slots.video.receiverSelected.find(
@@ -581,44 +673,81 @@ export class RemoteMediaManager extends EventsScope {
581
673
  }
582
674
 
583
675
  /**
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}
676
+ * Ensures that we have enough slots for the current layout.
588
677
  */
589
- private async updateVideoReceiveSlots() {
678
+ private async refillRequiredSlotsIfNeeded() {
590
679
  const requiredNumSlots = this.getRequiredNumVideoSlotsForLayout(this.currentLayout);
591
680
  const totalNumSlots =
592
681
  this.slots.video.unused.length +
593
682
  this.slots.video.activeSpeaker.length +
594
683
  this.slots.video.receiverSelected.length;
595
684
 
596
- // ensure we have enough total slots for current layout
597
685
  if (totalNumSlots < requiredNumSlots) {
598
686
  let numSlotsToCreate = requiredNumSlots - totalNumSlots;
599
687
 
600
688
  while (numSlotsToCreate > 0) {
601
689
  // eslint-disable-next-line no-await-in-loop
602
690
  this.slots.video.unused.push(
603
- await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)
691
+ // eslint-disable-next-line no-await-in-loop
692
+ await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
604
693
  );
605
694
  numSlotsToCreate -= 1;
606
695
  }
607
696
  }
697
+ }
608
698
 
609
- // move all no longer needed receiver-selected slots to "unused"
610
- this.trimReceiverSelectedSlots();
611
-
612
- // move all active speaker slots to "unused"
699
+ /**
700
+ * Move all active speaker slots to "unused"
701
+ */
702
+ private trimActiveSpeakerSlots() {
613
703
  this.slots.video.unused.push(...this.slots.video.activeSpeaker);
614
704
  this.slots.video.activeSpeaker.length = 0;
705
+ }
615
706
 
616
- // allocate the slots to the right panes / pane groups
617
- this.allocateSlotsToVideoPaneGroups();
707
+ /**
708
+ * Logs the state of the receive slots
709
+ */
710
+ private logReceieveSlots() {
711
+ let logMessage = '';
712
+ forEach(this.receiveSlotAllocations.activeSpeaker, (group, groupName) => {
713
+ logMessage += `group: ${groupName}\n${group.slots.map((slot) => slot.logString).join(' ')}`;
714
+ });
715
+
716
+ logMessage += '\nreceiverSelected:\n';
717
+ forEach(this.receiveSlotAllocations.receiverSelected, (slot, key) => {
718
+ logMessage += ` ${key}: ${slot.logString}\n`;
719
+ });
618
720
 
619
721
  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}`
722
+ `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
723
  );
724
+ }
725
+
726
+ /**
727
+ * Makes sure we have the right number of receive slots created for the current layout
728
+ * and allocates them to the right video panes / pane groups
729
+ *
730
+ * @returns {Promise}
731
+ */
732
+ private async updateVideoReceiveSlots() {
733
+ // move all active speaker slots to "unused"
734
+ this.trimActiveSpeakerSlots();
735
+
736
+ // move all no longer needed receiver-selected slots to "unused"
737
+ this.trimReceiverSelectedSlots();
738
+
739
+ // ensure we have enough total slots for current layout
740
+ await this.refillRequiredSlotsIfNeeded();
741
+
742
+ // allocate the slots to the right panes / pane groups
743
+ // reset allocations
744
+ this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
745
+ // allocate active speaker
746
+ this.allocateSlotsToActiveSpeakerPaneGroups();
747
+ // allocate receiver selected
748
+ this.allocateSlotsToReceiverSelectedVideoPaneGroups();
749
+
750
+ this.logReceieveSlots();
622
751
 
623
752
  // If this is the initial layout, there may be some "unused" slots left because of the preallocation
624
753
  // done in this.preallocateVideoReceiveSlots(), so release them now
@@ -631,7 +760,13 @@ export class RemoteMediaManager extends EventsScope {
631
760
  */
632
761
  private updateVideoRemoteMediaObjects() {
633
762
  // invalidate all the previous remote media objects and cancel their media requests
634
- this.invalidateCurrentRemoteMedia({audio: false, video: true, commit: false});
763
+ this.invalidateCurrentRemoteMedia({
764
+ audio: false,
765
+ video: true,
766
+ screenShareAudio: false,
767
+ screenShareVideo: false,
768
+ commit: false,
769
+ });
635
770
 
636
771
  // create new remoteMediaGroup objects
637
772
  this.media.video.activeSpeakerGroups = {};
@@ -686,16 +821,53 @@ export class RemoteMediaManager extends EventsScope {
686
821
  );
687
822
  }
688
823
  }
689
- // todo: screenshare (SPARK-377812)
690
824
 
691
825
  this.mediaRequestManagers.video.commit();
692
826
  }
693
827
 
828
+ /**
829
+ * Checks if current layout requires a screen share.
830
+ * If it does, it creates new RemoteMediaGroup object for screen share
831
+ * and sends the media requests for it.
832
+ * If it doesn't, it makes sure we clean up any RemoteMediaGroup objects
833
+ * created earlier for screen share (for previous layout).
834
+ */
835
+ private updateScreenShareVideoRemoteMediaObject() {
836
+ this.invalidateCurrentRemoteMedia({
837
+ audio: false,
838
+ video: false,
839
+ screenShareAudio: false,
840
+ screenShareVideo: true,
841
+ commit: false,
842
+ });
843
+
844
+ this.media.screenShare.video = undefined;
845
+
846
+ if (this.currentLayout?.screenShareVideo) {
847
+ // we create a group of 1, because for screen share we need to use the "active speaker" policy
848
+ this.media.screenShare.video = new RemoteMediaGroup(
849
+ this.mediaRequestManagers.screenShareVideo,
850
+ [this.slots.screenShare.video],
851
+ 255,
852
+ false,
853
+ {resolution: this.currentLayout.screenShareVideo.size}
854
+ );
855
+ }
856
+
857
+ this.mediaRequestManagers.screenShareVideo.commit();
858
+ }
859
+
694
860
  /**
695
861
  * Invalidates all remote media objects belonging to currently selected layout
696
862
  */
697
- private invalidateCurrentRemoteMedia(options: {audio: boolean; video: boolean; commit: boolean}) {
698
- const {audio, video, commit} = options;
863
+ private invalidateCurrentRemoteMedia(options: {
864
+ audio: boolean;
865
+ video: boolean;
866
+ screenShareAudio: boolean;
867
+ screenShareVideo: boolean;
868
+ commit: boolean;
869
+ }) {
870
+ const {audio, video, screenShareAudio, screenShareVideo, commit} = options;
699
871
 
700
872
  if (audio && this.media.audio) {
701
873
  this.media.audio.stop(commit);
@@ -711,12 +883,19 @@ export class RemoteMediaManager extends EventsScope {
711
883
  this.mediaRequestManagers.video.commit();
712
884
  }
713
885
  }
886
+
887
+ if (screenShareAudio && this.media.screenShare.audio) {
888
+ this.media.screenShare.audio.stop(commit);
889
+ }
890
+ if (screenShareVideo && this.media.screenShare.video) {
891
+ this.media.screenShare.video.stop(commit);
892
+ }
714
893
  }
715
894
 
716
895
  /** emits Event.VideoLayoutChanged */
717
896
  private emitVideoLayoutChangedEvent() {
718
897
  // 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
898
+ // wait for our media requests to be fulfilled, but there is no API for that right now (we could wait for source updates
720
899
  // but in some cases they might never come, or would need to always make sure to use a new set of receiver slots)
721
900
  // for now it's fine to have it like this, we will re-evaluate if it needs improving after more testing
722
901
 
@@ -730,7 +909,7 @@ export class RemoteMediaManager extends EventsScope {
730
909
  layoutId: this.currentLayoutId,
731
910
  activeSpeakerVideoPanes: this.media.video.activeSpeakerGroups,
732
911
  memberVideoPanes: this.media.video.memberPanes,
733
- screenShareVideo: undefined, // todo: screen share (SPARK-377812)
912
+ screenShareVideo: this.media.screenShare.video?.getRemoteMedia()[0],
734
913
  }
735
914
  );
736
915
  }
@@ -778,7 +957,7 @@ export class RemoteMediaManager extends EventsScope {
778
957
 
779
958
  this.currentLayout.memberVideoPanes.push(newPane);
780
959
 
781
- const receiveSlot = await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain);
960
+ const receiveSlot = await this.receiveSlotManager.allocateSlot(MediaType.VideoMain);
782
961
 
783
962
  this.slots.video.receiverSelected.push(receiveSlot);
784
963