@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.131

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 +994 -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 +203 -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 +294 -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 +406 -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 +88 -123
  101. package/dist/locus-info/parser.js.map +1 -1
  102. package/dist/locus-info/selfUtils.js +105 -91
  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 +2603 -2462
  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 +315 -336
  121. package/dist/meeting/request.js.map +1 -1
  122. package/dist/meeting/request.type.js +7 -0
  123. package/dist/meeting/request.type.js.map +1 -0
  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 +6 -40
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +466 -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 -461
  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 +993 -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 +47 -0
  310. package/dist/types/multistream/remoteMediaManager.d.ts +263 -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 +860 -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 +21 -10
  362. package/src/common/logs/request.ts +11 -8
  363. package/src/config.ts +16 -12
  364. package/src/constants.ts +153 -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 +281 -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 +346 -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 +46 -68
  378. package/src/locus-info/selfUtils.ts +195 -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 +2803 -1584
  385. package/src/meeting/locusMediaRequest.ts +309 -0
  386. package/src/meeting/muteState.ts +290 -72
  387. package/src/meeting/request.ts +247 -178
  388. package/src/meeting/request.type.ts +13 -0
  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 +772 -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 +4 -3
  417. package/src/multistream/remoteMediaManager.ts +230 -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 -111
  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 -64
  433. package/src/roap/turnDiscovery.ts +101 -48
  434. package/src/statsAnalyzer/global.ts +8 -104
  435. package/src/statsAnalyzer/index.ts +624 -376
  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 +1609 -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 +504 -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 +636 -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 +252 -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 +3112 -921
  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 +421 -79
  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 +5 -5
  490. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -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
 
@@ -189,7 +190,7 @@ export class RemoteMediaGroup {
189
190
  * @param{boolean} commit whether to commit the cancellation of media requests
190
191
  * @internal
191
192
  */
192
- public stop(commit: boolean = true) {
193
+ public stop(commit = true) {
193
194
  this.unpinnedRemoteMedia.forEach((remoteMedia) => remoteMedia.stop(false));
194
195
  this.pinnedRemoteMedia.forEach((remoteMedia) => remoteMedia.stop(false));
195
196
  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',
@@ -102,7 +97,6 @@ const OnePlusFiveLayout: VideoLayout = {
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:
104
99
  const TwoMainPlusSixSmallLayout: VideoLayout = {
105
- screenShareVideo: {size: null},
106
100
  activeSpeakerVideoPaneGroups: [
107
101
  {
108
102
  id: 'mainGroupWith2BigPanes',
@@ -134,7 +128,6 @@ const RemoteScreenShareWithSmallThumbnailsLayout: VideoLayout = {
134
128
 
135
129
  // 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
130
  const Stage2x2With6ThumbnailsLayout: VideoLayout = {
137
- screenShareVideo: {size: null},
138
131
  activeSpeakerVideoPaneGroups: [
139
132
  {
140
133
  id: 'thumbnails',
@@ -160,6 +153,7 @@ const Stage2x2With6ThumbnailsLayout: VideoLayout = {
160
153
  export const DefaultConfiguration: Configuration = {
161
154
  audio: {
162
155
  numOfActiveSpeakerStreams: 3,
156
+ numOfScreenShareStreams: 1,
163
157
  },
164
158
  video: {
165
159
  preferLiveVideo: true,
@@ -173,16 +167,12 @@ export const DefaultConfiguration: Configuration = {
173
167
  ScreenShareView: RemoteScreenShareWithSmallThumbnailsLayout,
174
168
  },
175
169
  },
176
- screenShare: {
177
- audio: true,
178
- video: true,
179
- },
180
170
  };
181
171
 
182
172
  export enum Event {
183
173
  // events for audio streams
184
174
  AudioCreated = 'AudioCreated',
185
- ScreenShareAudioCreated = 'ScreenShareCreated',
175
+ ScreenShareAudioCreated = 'ScreenShareAudioCreated',
186
176
 
187
177
  // events for video streams
188
178
  VideoLayoutChanged = 'VideoLayoutChanged',
@@ -199,7 +189,7 @@ export interface VideoLayoutChangedEventData {
199
189
  export interface Events extends EventMap {
200
190
  // audio
201
191
  [Event.AudioCreated]: (audio: RemoteMediaGroup) => void;
202
- [Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMedia) => void;
192
+ [Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMediaGroup) => void;
203
193
 
204
194
  // video
205
195
  [Event.VideoLayoutChanged]: (data: VideoLayoutChangedEventData) => void;
@@ -223,14 +213,18 @@ export class RemoteMediaManager extends EventsScope {
223
213
  private mediaRequestManagers: {
224
214
  audio: MediaRequestManager;
225
215
  video: MediaRequestManager;
216
+ screenShareAudio: MediaRequestManager;
217
+ screenShareVideo: MediaRequestManager;
226
218
  };
227
219
 
228
220
  private currentLayout?: VideoLayout;
229
221
 
230
222
  private slots: {
231
223
  audio: ReceiveSlot[];
232
- screenShareAudio?: ReceiveSlot;
233
- screenShareVideo?: ReceiveSlot;
224
+ screenShare: {
225
+ audio: ReceiveSlot[];
226
+ video?: ReceiveSlot;
227
+ };
234
228
  video: {
235
229
  unused: ReceiveSlot[];
236
230
  activeSpeaker: ReceiveSlot[];
@@ -246,6 +240,10 @@ export class RemoteMediaManager extends EventsScope {
246
240
  };
247
241
  memberPanes: {[key: PaneId]: RemoteMedia};
248
242
  };
243
+ screenShare: {
244
+ audio?: RemoteMediaGroup;
245
+ video?: RemoteMediaGroup;
246
+ };
249
247
  };
250
248
 
251
249
  private receiveSlotAllocations: {
@@ -267,6 +265,8 @@ export class RemoteMediaManager extends EventsScope {
267
265
  mediaRequestManagers: {
268
266
  audio: MediaRequestManager;
269
267
  video: MediaRequestManager;
268
+ screenShareAudio: MediaRequestManager;
269
+ screenShareVideo: MediaRequestManager;
270
270
  },
271
271
  config: Configuration = DefaultConfiguration
272
272
  ) {
@@ -281,14 +281,20 @@ export class RemoteMediaManager extends EventsScope {
281
281
  activeSpeakerGroups: {},
282
282
  memberPanes: {},
283
283
  },
284
+ screenShare: {
285
+ audio: undefined,
286
+ video: undefined,
287
+ },
284
288
  };
285
289
 
286
290
  this.checkConfigValidity();
287
291
 
288
292
  this.slots = {
289
293
  audio: [],
290
- screenShareAudio: undefined,
291
- screenShareVideo: undefined,
294
+ screenShare: {
295
+ audio: [],
296
+ video: undefined,
297
+ },
292
298
  video: {
293
299
  unused: [],
294
300
  activeSpeaker: [],
@@ -359,8 +365,8 @@ export class RemoteMediaManager extends EventsScope {
359
365
 
360
366
  await this.createAudioMedia();
361
367
 
362
- // todo: create screen share audio remote media (SPARK-377812)
363
- // todo: create screen share video receive slot (SPARK-377812)
368
+ await this.createScreenShareReceiveSlots();
369
+ this.createScreenShareAudioMedia();
364
370
 
365
371
  await this.preallocateVideoReceiveSlots();
366
372
 
@@ -373,14 +379,27 @@ export class RemoteMediaManager extends EventsScope {
373
379
  */
374
380
  public stop() {
375
381
  // invalidate all remoteMedia objects
376
- this.invalidateCurrentRemoteMedia({audio: true, video: true, commit: true});
382
+ this.invalidateCurrentRemoteMedia({
383
+ audio: true,
384
+ video: true,
385
+ screenShareAudio: true,
386
+ screenShareVideo: true,
387
+ commit: true,
388
+ });
377
389
 
378
390
  // release all audio receive slots
379
391
  this.slots.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
380
392
  this.slots.audio.length = 0;
381
393
 
382
- // todo: screenshare slots... (SPARK-377812)
394
+ // release screen share slots
395
+ this.slots.screenShare.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
396
+ this.slots.screenShare.audio.length = 0;
397
+ if (this.slots.screenShare.video) {
398
+ this.receiveSlotManager.releaseSlot(this.slots.screenShare.video);
399
+ this.slots.screenShare.video = undefined;
400
+ }
383
401
 
402
+ // release video slots
384
403
  this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
385
404
 
386
405
  this.slots.video.unused.push(...this.slots.video.activeSpeaker);
@@ -432,7 +451,8 @@ export class RemoteMediaManager extends EventsScope {
432
451
  while (this.slots.video.unused.length < maxNumVideoPanesRequired) {
433
452
  // eslint-disable-next-line no-await-in-loop
434
453
  this.slots.video.unused.push(
435
- await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)
454
+ // eslint-disable-next-line no-await-in-loop
455
+ await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
436
456
  );
437
457
  }
438
458
  }
@@ -457,6 +477,7 @@ export class RemoteMediaManager extends EventsScope {
457
477
 
458
478
  await this.updateVideoReceiveSlots();
459
479
  this.updateVideoRemoteMediaObjects();
480
+ this.updateScreenShareVideoRemoteMediaObject();
460
481
  this.emitVideoLayoutChangedEvent();
461
482
  }
462
483
 
@@ -476,7 +497,7 @@ export class RemoteMediaManager extends EventsScope {
476
497
  // create the audio receive slots
477
498
  for (let i = 0; i < this.config.audio.numOfActiveSpeakerStreams; i += 1) {
478
499
  // eslint-disable-next-line no-await-in-loop
479
- const slot = await this.receiveSlotManager.allocateSlot(MC.MediaType.AudioMain);
500
+ const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioMain);
480
501
 
481
502
  this.slots.audio.push(slot);
482
503
  }
@@ -496,6 +517,50 @@ export class RemoteMediaManager extends EventsScope {
496
517
  );
497
518
  }
498
519
 
520
+ /**
521
+ * Creates receive slots required for receiving screen share audio and video
522
+ */
523
+ private async createScreenShareReceiveSlots() {
524
+ // audio
525
+ for (let i = 0; i < this.config.audio.numOfScreenShareStreams; i += 1) {
526
+ // eslint-disable-next-line no-await-in-loop
527
+ const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioSlides);
528
+
529
+ this.slots.screenShare.audio.push(slot);
530
+ }
531
+
532
+ // video
533
+ const isAnyLayoutContainingScreenShareVideo = Object.values(this.config.video.layouts).some(
534
+ (layout) => !!layout.screenShareVideo
535
+ );
536
+
537
+ if (isAnyLayoutContainingScreenShareVideo) {
538
+ this.slots.screenShare.video = await this.receiveSlotManager.allocateSlot(
539
+ MediaType.VideoSlides
540
+ );
541
+ }
542
+ }
543
+
544
+ /**
545
+ * Creates RemoteMedia objects for screen share
546
+ */
547
+ private createScreenShareAudioMedia() {
548
+ if (this.slots.screenShare.audio.length > 0) {
549
+ this.media.screenShare.audio = new RemoteMediaGroup(
550
+ this.mediaRequestManagers.screenShareAudio,
551
+ this.slots.screenShare.audio,
552
+ 255,
553
+ true
554
+ );
555
+
556
+ this.emit(
557
+ {file: 'multistream/remoteMediaManager', function: 'createScreenShareAudioMedia'},
558
+ Event.ScreenShareAudioCreated,
559
+ this.media.screenShare.audio
560
+ );
561
+ }
562
+ }
563
+
499
564
  /**
500
565
  * Goes over all receiver-selected slots and keeps only the ones that are required by a given layout,
501
566
  * the rest are all moved to the "unused" list
@@ -536,25 +601,37 @@ export class RemoteMediaManager extends EventsScope {
536
601
  }
537
602
 
538
603
  /**
539
- * Allocates receive slots to all video panes in the current selected layout
604
+ * Allocates receive slots to all active speaker video panes
605
+ * in the current selected layout.
606
+ *
607
+ * Allocation tries to keep the same order of the slots between the previous
608
+ * layout and the new one. Sorting helps making sure that highest priority slots
609
+ * go in the same order in the new layout.
540
610
  */
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);
611
+ private allocateSlotsToActiveSpeakerPaneGroups() {
612
+ this.currentLayout?.activeSpeakerVideoPaneGroups
613
+ // sorting in descending order based on group priority
614
+ ?.sort((a, b) => (a.priority < b.priority ? 1 : -1))
615
+ ?.forEach((group) => {
616
+ this.receiveSlotAllocations.activeSpeaker[group.id] = {slots: []};
617
+
618
+ for (let paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {
619
+ // allocate a slot from the "unused" list, by grabbing in same order (shift) as previous layout
620
+ const freeSlot = this.slots.video.unused.shift();
621
+
622
+ if (freeSlot) {
623
+ this.slots.video.activeSpeaker.push(freeSlot);
624
+ this.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);
625
+ }
554
626
  }
555
- }
556
- });
627
+ });
628
+ }
557
629
 
630
+ /**
631
+ * Allocates receive slots to all receiver selected video panes
632
+ * in the current selected layout
633
+ */
634
+ private allocateSlotsToReceiverSelectedVideoPaneGroups() {
558
635
  this.currentLayout?.memberVideoPanes?.forEach((memberPane) => {
559
636
  // check if there is existing slot for this csi
560
637
  const existingSlot = this.slots.video.receiverSelected.find(
@@ -581,44 +658,81 @@ export class RemoteMediaManager extends EventsScope {
581
658
  }
582
659
 
583
660
  /**
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}
661
+ * Ensures that we have enough slots for the current layout.
588
662
  */
589
- private async updateVideoReceiveSlots() {
663
+ private async refillRequiredSlotsIfNeeded() {
590
664
  const requiredNumSlots = this.getRequiredNumVideoSlotsForLayout(this.currentLayout);
591
665
  const totalNumSlots =
592
666
  this.slots.video.unused.length +
593
667
  this.slots.video.activeSpeaker.length +
594
668
  this.slots.video.receiverSelected.length;
595
669
 
596
- // ensure we have enough total slots for current layout
597
670
  if (totalNumSlots < requiredNumSlots) {
598
671
  let numSlotsToCreate = requiredNumSlots - totalNumSlots;
599
672
 
600
673
  while (numSlotsToCreate > 0) {
601
674
  // eslint-disable-next-line no-await-in-loop
602
675
  this.slots.video.unused.push(
603
- await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)
676
+ // eslint-disable-next-line no-await-in-loop
677
+ await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
604
678
  );
605
679
  numSlotsToCreate -= 1;
606
680
  }
607
681
  }
682
+ }
608
683
 
609
- // move all no longer needed receiver-selected slots to "unused"
610
- this.trimReceiverSelectedSlots();
611
-
612
- // move all active speaker slots to "unused"
684
+ /**
685
+ * Move all active speaker slots to "unused"
686
+ */
687
+ private trimActiveSpeakerSlots() {
613
688
  this.slots.video.unused.push(...this.slots.video.activeSpeaker);
614
689
  this.slots.video.activeSpeaker.length = 0;
690
+ }
615
691
 
616
- // allocate the slots to the right panes / pane groups
617
- this.allocateSlotsToVideoPaneGroups();
692
+ /**
693
+ * Logs the state of the receive slots
694
+ */
695
+ private logReceieveSlots() {
696
+ let logMessage = '';
697
+ forEach(this.receiveSlotAllocations.activeSpeaker, (group, groupName) => {
698
+ logMessage += `group: ${groupName}\n${group.slots.map((slot) => slot.logString).join(' ')}`;
699
+ });
700
+
701
+ logMessage += '\nreceiverSelected:\n';
702
+ forEach(this.receiveSlotAllocations.receiverSelected, (slot, key) => {
703
+ logMessage += ` ${key}: ${slot.logString}\n`;
704
+ });
618
705
 
619
706
  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}`
707
+ `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
708
  );
709
+ }
710
+
711
+ /**
712
+ * Makes sure we have the right number of receive slots created for the current layout
713
+ * and allocates them to the right video panes / pane groups
714
+ *
715
+ * @returns {Promise}
716
+ */
717
+ private async updateVideoReceiveSlots() {
718
+ // move all active speaker slots to "unused"
719
+ this.trimActiveSpeakerSlots();
720
+
721
+ // move all no longer needed receiver-selected slots to "unused"
722
+ this.trimReceiverSelectedSlots();
723
+
724
+ // ensure we have enough total slots for current layout
725
+ await this.refillRequiredSlotsIfNeeded();
726
+
727
+ // allocate the slots to the right panes / pane groups
728
+ // reset allocations
729
+ this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
730
+ // allocate active speaker
731
+ this.allocateSlotsToActiveSpeakerPaneGroups();
732
+ // allocate receiver selected
733
+ this.allocateSlotsToReceiverSelectedVideoPaneGroups();
734
+
735
+ this.logReceieveSlots();
622
736
 
623
737
  // If this is the initial layout, there may be some "unused" slots left because of the preallocation
624
738
  // done in this.preallocateVideoReceiveSlots(), so release them now
@@ -631,7 +745,13 @@ export class RemoteMediaManager extends EventsScope {
631
745
  */
632
746
  private updateVideoRemoteMediaObjects() {
633
747
  // invalidate all the previous remote media objects and cancel their media requests
634
- this.invalidateCurrentRemoteMedia({audio: false, video: true, commit: false});
748
+ this.invalidateCurrentRemoteMedia({
749
+ audio: false,
750
+ video: true,
751
+ screenShareAudio: false,
752
+ screenShareVideo: false,
753
+ commit: false,
754
+ });
635
755
 
636
756
  // create new remoteMediaGroup objects
637
757
  this.media.video.activeSpeakerGroups = {};
@@ -686,16 +806,53 @@ export class RemoteMediaManager extends EventsScope {
686
806
  );
687
807
  }
688
808
  }
689
- // todo: screenshare (SPARK-377812)
690
809
 
691
810
  this.mediaRequestManagers.video.commit();
692
811
  }
693
812
 
813
+ /**
814
+ * Checks if current layout requires a screen share.
815
+ * If it does, it creates new RemoteMediaGroup object for screen share
816
+ * and sends the media requests for it.
817
+ * If it doesn't, it makes sure we clean up any RemoteMediaGroup objects
818
+ * created earlier for screen share (for previous layout).
819
+ */
820
+ private updateScreenShareVideoRemoteMediaObject() {
821
+ this.invalidateCurrentRemoteMedia({
822
+ audio: false,
823
+ video: false,
824
+ screenShareAudio: false,
825
+ screenShareVideo: true,
826
+ commit: false,
827
+ });
828
+
829
+ this.media.screenShare.video = undefined;
830
+
831
+ if (this.currentLayout?.screenShareVideo) {
832
+ // we create a group of 1, because for screen share we need to use the "active speaker" policy
833
+ this.media.screenShare.video = new RemoteMediaGroup(
834
+ this.mediaRequestManagers.screenShareVideo,
835
+ [this.slots.screenShare.video],
836
+ 255,
837
+ false,
838
+ {resolution: this.currentLayout.screenShareVideo.size}
839
+ );
840
+ }
841
+
842
+ this.mediaRequestManagers.screenShareVideo.commit();
843
+ }
844
+
694
845
  /**
695
846
  * Invalidates all remote media objects belonging to currently selected layout
696
847
  */
697
- private invalidateCurrentRemoteMedia(options: {audio: boolean; video: boolean; commit: boolean}) {
698
- const {audio, video, commit} = options;
848
+ private invalidateCurrentRemoteMedia(options: {
849
+ audio: boolean;
850
+ video: boolean;
851
+ screenShareAudio: boolean;
852
+ screenShareVideo: boolean;
853
+ commit: boolean;
854
+ }) {
855
+ const {audio, video, screenShareAudio, screenShareVideo, commit} = options;
699
856
 
700
857
  if (audio && this.media.audio) {
701
858
  this.media.audio.stop(commit);
@@ -711,12 +868,19 @@ export class RemoteMediaManager extends EventsScope {
711
868
  this.mediaRequestManagers.video.commit();
712
869
  }
713
870
  }
871
+
872
+ if (screenShareAudio && this.media.screenShare.audio) {
873
+ this.media.screenShare.audio.stop(commit);
874
+ }
875
+ if (screenShareVideo && this.media.screenShare.video) {
876
+ this.media.screenShare.video.stop(commit);
877
+ }
714
878
  }
715
879
 
716
880
  /** emits Event.VideoLayoutChanged */
717
881
  private emitVideoLayoutChangedEvent() {
718
882
  // 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
883
+ // wait for our media requests to be fulfilled, but there is no API for that right now (we could wait for source updates
720
884
  // but in some cases they might never come, or would need to always make sure to use a new set of receiver slots)
721
885
  // for now it's fine to have it like this, we will re-evaluate if it needs improving after more testing
722
886
 
@@ -730,7 +894,7 @@ export class RemoteMediaManager extends EventsScope {
730
894
  layoutId: this.currentLayoutId,
731
895
  activeSpeakerVideoPanes: this.media.video.activeSpeakerGroups,
732
896
  memberVideoPanes: this.media.video.memberPanes,
733
- screenShareVideo: undefined, // todo: screen share (SPARK-377812)
897
+ screenShareVideo: this.media.screenShare.video?.getRemoteMedia()[0],
734
898
  }
735
899
  );
736
900
  }
@@ -778,7 +942,7 @@ export class RemoteMediaManager extends EventsScope {
778
942
 
779
943
  this.currentLayout.memberVideoPanes.push(newPane);
780
944
 
781
- const receiveSlot = await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain);
945
+ const receiveSlot = await this.receiveSlotManager.allocateSlot(MediaType.VideoMain);
782
946
 
783
947
  this.slots.video.receiverSelected.push(receiveSlot);
784
948