@webex/plugin-meetings 3.0.0-beta.3 → 3.0.0-beta.300

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