@webex/plugin-meetings 3.0.0-beta.39 → 3.0.0-beta.391

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 (393) hide show
  1. package/README.md +58 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +94 -15
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/events.js +45 -0
  11. package/dist/breakouts/events.js.map +1 -0
  12. package/dist/breakouts/index.js +671 -81
  13. package/dist/breakouts/index.js.map +1 -1
  14. package/dist/breakouts/utils.js +45 -1
  15. package/dist/breakouts/utils.js.map +1 -1
  16. package/dist/common/errors/no-meeting-info.js +51 -0
  17. package/dist/common/errors/no-meeting-info.js.map +1 -0
  18. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  19. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +48 -7
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/logs/request.js +5 -1
  25. package/dist/common/logs/request.js.map +1 -1
  26. package/dist/common/queue.js +24 -9
  27. package/dist/common/queue.js.map +1 -1
  28. package/dist/config.js +5 -10
  29. package/dist/config.js.map +1 -1
  30. package/dist/constants.js +242 -33
  31. package/dist/constants.js.map +1 -1
  32. package/dist/controls-options-manager/enums.js +14 -2
  33. package/dist/controls-options-manager/enums.js.map +1 -1
  34. package/dist/controls-options-manager/index.js +109 -15
  35. package/dist/controls-options-manager/index.js.map +1 -1
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +309 -18
  39. package/dist/controls-options-manager/util.js.map +1 -1
  40. package/dist/index.js +110 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/interceptors/index.js +15 -0
  43. package/dist/interceptors/index.js.map +1 -0
  44. package/dist/interceptors/locusRetry.js +93 -0
  45. package/dist/interceptors/locusRetry.js.map +1 -0
  46. package/dist/interpretation/collection.js +23 -0
  47. package/dist/interpretation/collection.js.map +1 -0
  48. package/dist/interpretation/index.js +380 -0
  49. package/dist/interpretation/index.js.map +1 -0
  50. package/dist/interpretation/siLanguage.js +25 -0
  51. package/dist/interpretation/siLanguage.js.map +1 -0
  52. package/dist/locus-info/controlsUtils.js +91 -2
  53. package/dist/locus-info/controlsUtils.js.map +1 -1
  54. package/dist/locus-info/index.js +386 -62
  55. package/dist/locus-info/index.js.map +1 -1
  56. package/dist/locus-info/infoUtils.js +7 -1
  57. package/dist/locus-info/infoUtils.js.map +1 -1
  58. package/dist/locus-info/mediaSharesUtils.js +71 -1
  59. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  60. package/dist/locus-info/parser.js +249 -72
  61. package/dist/locus-info/parser.js.map +1 -1
  62. package/dist/locus-info/selfUtils.js +89 -14
  63. package/dist/locus-info/selfUtils.js.map +1 -1
  64. package/dist/media/index.js +65 -102
  65. package/dist/media/index.js.map +1 -1
  66. package/dist/media/properties.js +73 -124
  67. package/dist/media/properties.js.map +1 -1
  68. package/dist/mediaQualityMetrics/config.js +135 -330
  69. package/dist/mediaQualityMetrics/config.js.map +1 -1
  70. package/dist/meeting/in-meeting-actions.js +86 -2
  71. package/dist/meeting/in-meeting-actions.js.map +1 -1
  72. package/dist/meeting/index.js +4075 -2827
  73. package/dist/meeting/index.js.map +1 -1
  74. package/dist/meeting/locusMediaRequest.js +292 -0
  75. package/dist/meeting/locusMediaRequest.js.map +1 -0
  76. package/dist/meeting/muteState.js +224 -136
  77. package/dist/meeting/muteState.js.map +1 -1
  78. package/dist/meeting/request.js +177 -152
  79. package/dist/meeting/request.js.map +1 -1
  80. package/dist/meeting/util.js +672 -417
  81. package/dist/meeting/util.js.map +1 -1
  82. package/dist/meeting-info/index.js +73 -7
  83. package/dist/meeting-info/index.js.map +1 -1
  84. package/dist/meeting-info/meeting-info-v2.js +192 -51
  85. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  86. package/dist/meeting-info/util.js +1 -1
  87. package/dist/meeting-info/util.js.map +1 -1
  88. package/dist/meeting-info/utilv2.js +36 -36
  89. package/dist/meeting-info/utilv2.js.map +1 -1
  90. package/dist/meetings/collection.js +39 -0
  91. package/dist/meetings/collection.js.map +1 -1
  92. package/dist/meetings/index.js +484 -119
  93. package/dist/meetings/index.js.map +1 -1
  94. package/dist/meetings/meetings.types.js +7 -0
  95. package/dist/meetings/meetings.types.js.map +1 -0
  96. package/dist/meetings/request.js +2 -0
  97. package/dist/meetings/request.js.map +1 -1
  98. package/dist/meetings/util.js +73 -7
  99. package/dist/meetings/util.js.map +1 -1
  100. package/dist/member/index.js +58 -0
  101. package/dist/member/index.js.map +1 -1
  102. package/dist/member/types.js +25 -0
  103. package/dist/member/types.js.map +1 -0
  104. package/dist/member/util.js +132 -25
  105. package/dist/member/util.js.map +1 -1
  106. package/dist/members/collection.js +10 -0
  107. package/dist/members/collection.js.map +1 -1
  108. package/dist/members/index.js +102 -6
  109. package/dist/members/index.js.map +1 -1
  110. package/dist/members/request.js +106 -38
  111. package/dist/members/request.js.map +1 -1
  112. package/dist/members/types.js +15 -0
  113. package/dist/members/types.js.map +1 -0
  114. package/dist/members/util.js +326 -232
  115. package/dist/members/util.js.map +1 -1
  116. package/dist/metrics/constants.js +18 -1
  117. package/dist/metrics/constants.js.map +1 -1
  118. package/dist/metrics/index.js +1 -446
  119. package/dist/metrics/index.js.map +1 -1
  120. package/dist/multistream/mediaRequestManager.js +223 -32
  121. package/dist/multistream/mediaRequestManager.js.map +1 -1
  122. package/dist/multistream/receiveSlot.js +10 -0
  123. package/dist/multistream/receiveSlot.js.map +1 -1
  124. package/dist/multistream/receiveSlotManager.js +39 -36
  125. package/dist/multistream/receiveSlotManager.js.map +1 -1
  126. package/dist/multistream/remoteMedia.js +3 -1
  127. package/dist/multistream/remoteMedia.js.map +1 -1
  128. package/dist/multistream/remoteMediaGroup.js +76 -5
  129. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  130. package/dist/multistream/remoteMediaManager.js +366 -104
  131. package/dist/multistream/remoteMediaManager.js.map +1 -1
  132. package/dist/multistream/sendSlotManager.js +255 -0
  133. package/dist/multistream/sendSlotManager.js.map +1 -0
  134. package/dist/reachability/clusterReachability.js +356 -0
  135. package/dist/reachability/clusterReachability.js.map +1 -0
  136. package/dist/reachability/index.js +263 -390
  137. package/dist/reachability/index.js.map +1 -1
  138. package/dist/reachability/request.js +6 -4
  139. package/dist/reachability/request.js.map +1 -1
  140. package/dist/reachability/util.js +29 -0
  141. package/dist/reachability/util.js.map +1 -0
  142. package/dist/reconnection-manager/index.js +266 -202
  143. package/dist/reconnection-manager/index.js.map +1 -1
  144. package/dist/recording-controller/index.js +21 -2
  145. package/dist/recording-controller/index.js.map +1 -1
  146. package/dist/recording-controller/util.js +9 -8
  147. package/dist/recording-controller/util.js.map +1 -1
  148. package/dist/roap/index.js +51 -28
  149. package/dist/roap/index.js.map +1 -1
  150. package/dist/roap/request.js +48 -64
  151. package/dist/roap/request.js.map +1 -1
  152. package/dist/roap/turnDiscovery.js +220 -70
  153. package/dist/roap/turnDiscovery.js.map +1 -1
  154. package/dist/rtcMetrics/constants.js +12 -0
  155. package/dist/rtcMetrics/constants.js.map +1 -0
  156. package/dist/rtcMetrics/index.js +179 -0
  157. package/dist/rtcMetrics/index.js.map +1 -0
  158. package/dist/statsAnalyzer/index.js +357 -295
  159. package/dist/statsAnalyzer/index.js.map +1 -1
  160. package/dist/statsAnalyzer/mqaUtil.js +296 -156
  161. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  162. package/dist/types/annotation/annotation.types.d.ts +42 -0
  163. package/dist/types/annotation/constants.d.ts +31 -0
  164. package/dist/types/annotation/index.d.ts +117 -0
  165. package/dist/types/breakouts/events.d.ts +8 -0
  166. package/dist/types/breakouts/utils.d.ts +14 -0
  167. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  168. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  169. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  170. package/dist/types/common/logs/request.d.ts +2 -0
  171. package/dist/types/common/queue.d.ts +9 -7
  172. package/dist/types/config.d.ts +2 -7
  173. package/dist/types/constants.d.ts +203 -31
  174. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  175. package/dist/types/controls-options-manager/index.d.ts +17 -1
  176. package/dist/types/controls-options-manager/types.d.ts +43 -0
  177. package/dist/types/controls-options-manager/util.d.ts +1 -7
  178. package/dist/types/index.d.ts +6 -5
  179. package/dist/types/interceptors/index.d.ts +2 -0
  180. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  181. package/dist/types/interpretation/collection.d.ts +5 -0
  182. package/dist/types/interpretation/index.d.ts +5 -0
  183. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  184. package/dist/types/locus-info/index.d.ts +57 -4
  185. package/dist/types/locus-info/parser.d.ts +66 -6
  186. package/dist/types/media/index.d.ts +2 -0
  187. package/dist/types/media/properties.d.ts +34 -49
  188. package/dist/types/mediaQualityMetrics/config.d.ts +99 -223
  189. package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
  190. package/dist/types/meeting/index.d.ts +567 -496
  191. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  192. package/dist/types/meeting/muteState.d.ts +93 -25
  193. package/dist/types/meeting/request.d.ts +64 -43
  194. package/dist/types/meeting/util.d.ts +117 -1
  195. package/dist/types/meeting-info/index.d.ts +13 -1
  196. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  197. package/dist/types/meetings/collection.d.ts +17 -0
  198. package/dist/types/meetings/index.d.ts +113 -21
  199. package/dist/types/meetings/meetings.types.d.ts +4 -0
  200. package/dist/types/member/index.d.ts +14 -0
  201. package/dist/types/member/types.d.ts +32 -0
  202. package/dist/types/members/collection.d.ts +5 -0
  203. package/dist/types/members/index.d.ts +35 -2
  204. package/dist/types/members/request.d.ts +73 -9
  205. package/dist/types/members/types.d.ts +25 -0
  206. package/dist/types/members/util.d.ts +214 -1
  207. package/dist/types/metrics/constants.d.ts +17 -0
  208. package/dist/types/metrics/index.d.ts +4 -111
  209. package/dist/types/multistream/mediaRequestManager.d.ts +72 -3
  210. package/dist/types/multistream/receiveSlot.d.ts +7 -3
  211. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  212. package/dist/types/multistream/remoteMedia.d.ts +3 -31
  213. package/dist/types/multistream/remoteMediaGroup.d.ts +2 -9
  214. package/dist/types/multistream/remoteMediaManager.d.ts +62 -2
  215. package/dist/types/multistream/sendSlotManager.d.ts +70 -0
  216. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  217. package/dist/types/reachability/index.d.ts +60 -95
  218. package/dist/types/reachability/request.d.ts +3 -1
  219. package/dist/types/reachability/util.d.ts +8 -0
  220. package/dist/types/reconnection-manager/index.d.ts +19 -0
  221. package/dist/types/recording-controller/index.d.ts +15 -1
  222. package/dist/types/recording-controller/util.d.ts +5 -4
  223. package/dist/types/roap/index.d.ts +2 -1
  224. package/dist/types/roap/request.d.ts +9 -8
  225. package/dist/types/roap/turnDiscovery.d.ts +39 -5
  226. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  227. package/dist/types/rtcMetrics/index.d.ts +61 -0
  228. package/dist/types/statsAnalyzer/index.d.ts +34 -12
  229. package/dist/types/statsAnalyzer/mqaUtil.d.ts +28 -4
  230. package/dist/types/webinar/collection.d.ts +16 -0
  231. package/dist/types/webinar/index.d.ts +5 -0
  232. package/dist/webinar/collection.js +44 -0
  233. package/dist/webinar/collection.js.map +1 -0
  234. package/dist/webinar/index.js +69 -0
  235. package/dist/webinar/index.js.map +1 -0
  236. package/package.json +22 -19
  237. package/src/annotation/annotation.types.ts +50 -0
  238. package/src/annotation/constants.ts +36 -0
  239. package/src/annotation/index.ts +328 -0
  240. package/src/breakouts/README.md +35 -11
  241. package/src/breakouts/breakout.ts +67 -9
  242. package/src/breakouts/events.ts +56 -0
  243. package/src/breakouts/index.ts +558 -59
  244. package/src/breakouts/utils.ts +42 -0
  245. package/src/common/errors/no-meeting-info.ts +24 -0
  246. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  247. package/src/common/errors/webex-errors.ts +44 -2
  248. package/src/common/logs/logger-proxy.ts +1 -1
  249. package/src/common/logs/request.ts +5 -1
  250. package/src/common/queue.ts +22 -8
  251. package/src/config.ts +4 -9
  252. package/src/constants.ts +229 -21
  253. package/src/controls-options-manager/enums.ts +12 -0
  254. package/src/controls-options-manager/index.ts +116 -21
  255. package/src/controls-options-manager/types.ts +59 -0
  256. package/src/controls-options-manager/util.ts +294 -14
  257. package/src/index.ts +44 -0
  258. package/src/interceptors/index.ts +3 -0
  259. package/src/interceptors/locusRetry.ts +67 -0
  260. package/src/interpretation/README.md +60 -0
  261. package/src/interpretation/collection.ts +19 -0
  262. package/src/interpretation/index.ts +349 -0
  263. package/src/interpretation/siLanguage.ts +18 -0
  264. package/src/locus-info/controlsUtils.ts +108 -0
  265. package/src/locus-info/index.ts +417 -59
  266. package/src/locus-info/infoUtils.ts +10 -2
  267. package/src/locus-info/mediaSharesUtils.ts +80 -0
  268. package/src/locus-info/parser.ts +258 -47
  269. package/src/locus-info/selfUtils.ts +81 -5
  270. package/src/media/index.ts +100 -108
  271. package/src/media/properties.ts +88 -117
  272. package/src/mediaQualityMetrics/config.ts +103 -238
  273. package/src/meeting/in-meeting-actions.ts +171 -3
  274. package/src/meeting/index.ts +3411 -2435
  275. package/src/meeting/locusMediaRequest.ts +313 -0
  276. package/src/meeting/muteState.ts +223 -136
  277. package/src/meeting/request.ts +155 -120
  278. package/src/meeting/util.ts +685 -395
  279. package/src/meeting-info/index.ts +81 -8
  280. package/src/meeting-info/meeting-info-v2.ts +170 -14
  281. package/src/meeting-info/util.ts +1 -1
  282. package/src/meeting-info/utilv2.ts +23 -23
  283. package/src/meetings/collection.ts +33 -0
  284. package/src/meetings/index.ts +507 -127
  285. package/src/meetings/meetings.types.ts +12 -0
  286. package/src/meetings/request.ts +2 -0
  287. package/src/meetings/util.ts +81 -12
  288. package/src/member/index.ts +58 -0
  289. package/src/member/types.ts +38 -0
  290. package/src/member/util.ts +141 -25
  291. package/src/members/collection.ts +8 -0
  292. package/src/members/index.ts +134 -8
  293. package/src/members/request.ts +97 -17
  294. package/src/members/types.ts +29 -0
  295. package/src/members/util.ts +333 -240
  296. package/src/metrics/constants.ts +17 -0
  297. package/src/metrics/index.ts +1 -469
  298. package/src/multistream/mediaRequestManager.ts +271 -56
  299. package/src/multistream/receiveSlot.ts +11 -4
  300. package/src/multistream/receiveSlotManager.ts +34 -24
  301. package/src/multistream/remoteMedia.ts +5 -3
  302. package/src/multistream/remoteMediaGroup.ts +78 -0
  303. package/src/multistream/remoteMediaManager.ts +248 -44
  304. package/src/multistream/sendSlotManager.ts +199 -0
  305. package/src/reachability/clusterReachability.ts +320 -0
  306. package/src/reachability/index.ts +229 -346
  307. package/src/reachability/request.ts +8 -4
  308. package/src/reachability/util.ts +24 -0
  309. package/src/reconnection-manager/index.ts +128 -97
  310. package/src/recording-controller/index.ts +20 -3
  311. package/src/recording-controller/util.ts +26 -9
  312. package/src/roap/index.ts +52 -23
  313. package/src/roap/request.ts +48 -67
  314. package/src/roap/turnDiscovery.ts +147 -49
  315. package/src/rtcMetrics/constants.ts +3 -0
  316. package/src/rtcMetrics/index.ts +166 -0
  317. package/src/statsAnalyzer/index.ts +457 -416
  318. package/src/statsAnalyzer/mqaUtil.ts +317 -170
  319. package/src/webinar/collection.ts +31 -0
  320. package/src/webinar/index.ts +62 -0
  321. package/test/integration/spec/converged-space-meetings.js +60 -3
  322. package/test/integration/spec/journey.js +320 -261
  323. package/test/integration/spec/space-meeting.js +76 -3
  324. package/test/unit/spec/annotation/index.ts +418 -0
  325. package/test/unit/spec/breakouts/breakout.ts +118 -28
  326. package/test/unit/spec/breakouts/events.ts +89 -0
  327. package/test/unit/spec/breakouts/index.ts +1349 -114
  328. package/test/unit/spec/breakouts/utils.js +52 -1
  329. package/test/unit/spec/common/queue.js +31 -2
  330. package/test/unit/spec/controls-options-manager/index.js +163 -0
  331. package/test/unit/spec/controls-options-manager/util.js +576 -60
  332. package/test/unit/spec/fixture/locus.js +1 -0
  333. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  334. package/test/unit/spec/interpretation/collection.ts +15 -0
  335. package/test/unit/spec/interpretation/index.ts +625 -0
  336. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  337. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  338. package/test/unit/spec/locus-info/index.js +1363 -37
  339. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  340. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  341. package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
  342. package/test/unit/spec/locus-info/parser.js +116 -35
  343. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  344. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  345. package/test/unit/spec/media/index.ts +173 -81
  346. package/test/unit/spec/media/properties.ts +2 -2
  347. package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
  348. package/test/unit/spec/meeting/index.js +6821 -2172
  349. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  350. package/test/unit/spec/meeting/muteState.js +402 -212
  351. package/test/unit/spec/meeting/request.js +473 -54
  352. package/test/unit/spec/meeting/utils.js +773 -67
  353. package/test/unit/spec/meeting-info/index.js +300 -0
  354. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  355. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  356. package/test/unit/spec/meetings/collection.js +26 -0
  357. package/test/unit/spec/meetings/index.js +1415 -213
  358. package/test/unit/spec/meetings/utils.js +229 -2
  359. package/test/unit/spec/member/index.js +61 -6
  360. package/test/unit/spec/member/util.js +510 -34
  361. package/test/unit/spec/members/index.js +432 -1
  362. package/test/unit/spec/members/request.js +206 -27
  363. package/test/unit/spec/members/utils.js +210 -0
  364. package/test/unit/spec/metrics/index.js +1 -50
  365. package/test/unit/spec/multistream/mediaRequestManager.ts +781 -114
  366. package/test/unit/spec/multistream/receiveSlot.ts +9 -1
  367. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  368. package/test/unit/spec/multistream/remoteMedia.ts +2 -0
  369. package/test/unit/spec/multistream/remoteMediaGroup.ts +345 -0
  370. package/test/unit/spec/multistream/remoteMediaManager.ts +525 -0
  371. package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
  372. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  373. package/test/unit/spec/reachability/index.ts +551 -14
  374. package/test/unit/spec/reachability/request.js +3 -1
  375. package/test/unit/spec/reachability/util.ts +40 -0
  376. package/test/unit/spec/reconnection-manager/index.js +171 -11
  377. package/test/unit/spec/recording-controller/index.js +294 -218
  378. package/test/unit/spec/recording-controller/util.js +223 -96
  379. package/test/unit/spec/roap/index.ts +180 -83
  380. package/test/unit/spec/roap/request.ts +100 -62
  381. package/test/unit/spec/roap/turnDiscovery.ts +388 -96
  382. package/test/unit/spec/rtcMetrics/index.ts +122 -0
  383. package/test/unit/spec/stats-analyzer/index.js +1252 -12
  384. package/test/unit/spec/webinar/collection.ts +13 -0
  385. package/test/unit/spec/webinar/index.ts +60 -0
  386. package/test/utils/integrationTestUtils.js +46 -0
  387. package/test/utils/testUtils.js +0 -57
  388. package/test/utils/webex-test-users.js +12 -4
  389. package/dist/metrics/config.js +0 -289
  390. package/dist/metrics/config.js.map +0 -1
  391. package/dist/types/metrics/config.d.ts +0 -169
  392. package/src/index.js +0 -18
  393. package/src/metrics/config.ts +0 -485
@@ -1,17 +1,20 @@
1
1
  /* eslint-disable require-jsdoc */
2
2
  import {
3
- MediaRequest as WcmeMediaRequest,
3
+ StreamRequest,
4
4
  Policy,
5
5
  ActiveSpeakerInfo,
6
6
  ReceiverSelectedInfo,
7
7
  CodecInfo as WcmeCodecInfo,
8
8
  H264Codec,
9
+ getRecommendedMaxBitrateForFrameSize,
10
+ RecommendedOpusBitrates,
9
11
  } from '@webex/internal-media-core';
10
- import {cloneDeep, debounce} from 'lodash';
12
+ import {cloneDeepWith, debounce, isEmpty} from 'lodash';
11
13
 
14
+ import {NamedMediaGroup} from '@webex/json-multistream';
12
15
  import LoggerProxy from '../common/logs/logger-proxy';
13
16
 
14
- import {ReceiveSlot, ReceiveSlotEvents, ReceiveSlotId} from './receiveSlot';
17
+ import {ReceiveSlot, ReceiveSlotEvents} from './receiveSlot';
15
18
  import {getMaxFs} from './remoteMedia';
16
19
 
17
20
  export interface ActiveSpeakerPolicyInfo {
@@ -20,6 +23,7 @@ export interface ActiveSpeakerPolicyInfo {
20
23
  crossPriorityDuplication: boolean;
21
24
  crossPolicyDuplication: boolean;
22
25
  preferLiveVideo: boolean;
26
+ namedMediaGroups?: NamedMediaGroup[];
23
27
  }
24
28
 
25
29
  export interface ReceiverSelectedPolicyInfo {
@@ -45,6 +49,7 @@ export interface MediaRequest {
45
49
  receiveSlots: Array<ReceiveSlot>;
46
50
  codecInfo?: CodecInfo;
47
51
  preferredMaxFs?: number;
52
+ handleMaxFs?: ({maxFs}: {maxFs: number}) => void;
48
53
  }
49
54
 
50
55
  export type MediaRequestId = string;
@@ -63,14 +68,25 @@ type DegradationPreferences = {
63
68
  maxMacroblocksLimit: number;
64
69
  };
65
70
 
66
- type SendMediaRequestsCallback = (mediaRequests: WcmeMediaRequest[]) => void;
71
+ type SendMediaRequestsCallback = (streamRequests: StreamRequest[]) => void;
72
+ type Kind = 'audio' | 'video';
73
+
74
+ type Options = {
75
+ degradationPreferences: DegradationPreferences;
76
+ kind: Kind;
77
+ trimRequestsToNumOfSources: boolean; // if enabled, AS speaker requests will be trimmed based on the calls to setNumCurrentSources()
78
+ };
79
+
80
+ type ClientRequestsMap = {[key: MediaRequestId]: MediaRequest};
67
81
 
68
82
  export class MediaRequestManager {
69
83
  private sendMediaRequestsCallback: SendMediaRequestsCallback;
70
84
 
85
+ private kind: Kind;
86
+
71
87
  private counter: number;
72
88
 
73
- private clientRequests: {[key: MediaRequestId]: MediaRequest};
89
+ private clientRequests: ClientRequestsMap;
74
90
 
75
91
  private degradationPreferences: DegradationPreferences;
76
92
 
@@ -78,14 +94,21 @@ export class MediaRequestManager {
78
94
 
79
95
  private debouncedSourceUpdateListener: () => void;
80
96
 
81
- constructor(
82
- degradationPreferences: DegradationPreferences,
83
- sendMediaRequestsCallback: SendMediaRequestsCallback
84
- ) {
97
+ private previousStreamRequests: Array<StreamRequest> = [];
98
+
99
+ private trimRequestsToNumOfSources: boolean;
100
+ private numTotalSources: number;
101
+ private numLiveSources: number;
102
+
103
+ constructor(sendMediaRequestsCallback: SendMediaRequestsCallback, options: Options) {
85
104
  this.sendMediaRequestsCallback = sendMediaRequestsCallback;
86
105
  this.counter = 0;
106
+ this.numLiveSources = 0;
107
+ this.numTotalSources = 0;
87
108
  this.clientRequests = {};
88
- this.degradationPreferences = degradationPreferences;
109
+ this.degradationPreferences = options.degradationPreferences;
110
+ this.kind = options.kind;
111
+ this.trimRequestsToNumOfSources = options.trimRequestsToNumOfSources;
89
112
  this.sourceUpdateListener = this.commit.bind(this);
90
113
  this.debouncedSourceUpdateListener = debounce(
91
114
  this.sourceUpdateListener,
@@ -98,8 +121,7 @@ export class MediaRequestManager {
98
121
  this.sendRequests(); // re-send requests after preferences are set
99
122
  }
100
123
 
101
- private getDegradedClientRequests() {
102
- const clientRequests = cloneDeep(this.clientRequests);
124
+ private getDegradedClientRequests(clientRequests: ClientRequestsMap) {
103
125
  const maxFsLimits = [
104
126
  getMaxFs('best'),
105
127
  getMaxFs('large'),
@@ -112,7 +134,7 @@ export class MediaRequestManager {
112
134
  // reduce max-fs until total macroblocks is below limit
113
135
  for (let i = 0; i < maxFsLimits.length; i += 1) {
114
136
  let totalMacroblocksRequested = 0;
115
- Object.entries(clientRequests).forEach(([id, mr]) => {
137
+ Object.values(clientRequests).forEach((mr) => {
116
138
  if (mr.codecInfo) {
117
139
  mr.codecInfo.maxFs = Math.min(
118
140
  mr.preferredMaxFs || CODEC_DEFAULTS.h264.maxFs,
@@ -120,9 +142,7 @@ export class MediaRequestManager {
120
142
  maxFsLimits[i]
121
143
  );
122
144
  // we only consider sources with "live" state
123
- const slotsWithLiveSource = this.clientRequests[id].receiveSlots.filter(
124
- (rs) => rs.sourceState === 'live'
125
- );
145
+ const slotsWithLiveSource = mr.receiveSlots.filter((rs) => rs.sourceState === 'live');
126
146
  totalMacroblocksRequested += mr.codecInfo.maxFs * slotsWithLiveSource.length;
127
147
  }
128
148
  });
@@ -139,50 +159,230 @@ export class MediaRequestManager {
139
159
  );
140
160
  }
141
161
  }
162
+ }
163
+
164
+ /**
165
+ * Returns true if two stream requests are the same, false otherwise.
166
+ *
167
+ * @param {StreamRequest} streamRequestA - Stream request A for comparison.
168
+ * @param {StreamRequest} streamRequestB - Stream request B for comparison.
169
+ * @returns {boolean} - Whether they are equal.
170
+ */
171
+ // eslint-disable-next-line class-methods-use-this
172
+ public isEqual(streamRequestA: StreamRequest, streamRequestB: StreamRequest) {
173
+ return (
174
+ JSON.stringify(streamRequestA._toJmpStreamRequest()) ===
175
+ JSON.stringify(streamRequestB._toJmpStreamRequest())
176
+ );
177
+ }
178
+
179
+ /**
180
+ * Compares new stream requests to previous ones and determines
181
+ * if they are the same.
182
+ *
183
+ * @param {StreamRequest[]} newRequests - Array with new requests.
184
+ * @returns {boolean} - True if they are equal, false otherwise.
185
+ */
186
+ private checkIsNewRequestsEqualToPrev(newRequests: StreamRequest[]) {
187
+ return (
188
+ !isEmpty(this.previousStreamRequests) &&
189
+ this.previousStreamRequests.length === newRequests.length &&
190
+ this.previousStreamRequests.every((req, idx) => this.isEqual(req, newRequests[idx]))
191
+ );
192
+ }
193
+
194
+ /**
195
+ * Returns the maxPayloadBitsPerSecond per Stream
196
+ *
197
+ * If MediaRequestManager kind is "audio", a constant bitrate will be returned.
198
+ * If MediaRequestManager kind is "video", the bitrate will be calculated based
199
+ * on maxFs (default h264 maxFs as fallback if maxFs is not defined)
200
+ *
201
+ * @param {MediaRequest} mediaRequest - mediaRequest to take data from
202
+ * @returns {number} maxPayloadBitsPerSecond
203
+ */
204
+ private getMaxPayloadBitsPerSecond(mediaRequest: MediaRequest): number {
205
+ if (this.kind === 'audio') {
206
+ // return mono_music bitrate default if the kind of mediarequest manager is audio:
207
+ return RecommendedOpusBitrates.FB_MONO_MUSIC;
208
+ }
209
+
210
+ return getRecommendedMaxBitrateForFrameSize(
211
+ mediaRequest.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs
212
+ );
213
+ }
214
+
215
+ /**
216
+ * Returns the max Macro Blocks per second (maxMbps) per H264 Stream
217
+ *
218
+ * The maxMbps will be calculated based on maxFs and maxFps
219
+ * (default h264 maxFps as fallback if maxFps is not defined)
220
+ *
221
+ * @param {MediaRequest} mediaRequest - mediaRequest to take data from
222
+ * @returns {number} maxMbps
223
+ */
224
+ // eslint-disable-next-line class-methods-use-this
225
+ private getH264MaxMbps(mediaRequest: MediaRequest): number {
226
+ // fallback for maxFps (not needed for maxFs, since there is a fallback already in getDegradedClientRequests)
227
+ const maxFps = mediaRequest.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps;
228
+
229
+ // divided by 100 since maxFps is 3000 (for 30 frames per seconds)
230
+ return (mediaRequest.codecInfo.maxFs * maxFps) / 100;
231
+ }
232
+
233
+ /**
234
+ * Clears the previous stream requests.
235
+ *
236
+ * @returns {void}
237
+ */
238
+ public clearPreviousRequests(): void {
239
+ this.previousStreamRequests = [];
240
+ }
241
+
242
+ /** Modifies the passed in clientRequests and makes sure that in total they don't ask
243
+ * for more streams than there are available.
244
+ *
245
+ * @param {Object} clientRequests
246
+ * @returns {void}
247
+ */
248
+ private trimRequests(clientRequests: ClientRequestsMap) {
249
+ const preferLiveVideo = this.getPreferLiveVideo();
250
+
251
+ if (!this.trimRequestsToNumOfSources) {
252
+ return;
253
+ }
254
+
255
+ // preferLiveVideo being undefined means that there are no active-speaker requests so we don't need to do any trimming
256
+ if (preferLiveVideo === undefined) {
257
+ return;
258
+ }
259
+
260
+ let numStreamsAvailable = preferLiveVideo ? this.numLiveSources : this.numTotalSources;
261
+
262
+ Object.values(clientRequests)
263
+ .sort((a, b) => {
264
+ // we have to count how many streams we're asking for
265
+ // and should not ask for more than numStreamsAvailable in total,
266
+ // so we might need to trim active-speaker requests and first ones to trim should be
267
+ // the ones with lowest priority
268
+
269
+ // receiver-selected requests have priority over active-speakers
270
+ if (a.policyInfo.policy === 'receiver-selected') {
271
+ return -1;
272
+ }
273
+ if (b.policyInfo.policy === 'receiver-selected') {
274
+ return 1;
275
+ }
142
276
 
143
- return clientRequests;
277
+ // and active-speakers are sorted by descending priority
278
+ return b.policyInfo.priority - a.policyInfo.priority;
279
+ })
280
+ .forEach((request) => {
281
+ // we only trim active-speaker requests
282
+ if (request.policyInfo.policy === 'active-speaker') {
283
+ const trimmedCount = Math.min(numStreamsAvailable, request.receiveSlots.length);
284
+
285
+ request.receiveSlots.length = trimmedCount;
286
+
287
+ numStreamsAvailable -= trimmedCount;
288
+ } else {
289
+ numStreamsAvailable -= request.receiveSlots.length;
290
+ }
291
+
292
+ if (numStreamsAvailable < 0) {
293
+ numStreamsAvailable = 0;
294
+ }
295
+ });
296
+ }
297
+
298
+ private getPreferLiveVideo(): boolean | undefined {
299
+ let preferLiveVideo;
300
+
301
+ Object.values(this.clientRequests).forEach((mr) => {
302
+ if (mr.policyInfo.policy === 'active-speaker') {
303
+ // take the value from first encountered active speaker request
304
+ if (preferLiveVideo === undefined) {
305
+ preferLiveVideo = mr.policyInfo.preferLiveVideo;
306
+ }
307
+
308
+ if (mr.policyInfo.preferLiveVideo !== preferLiveVideo) {
309
+ throw new Error(
310
+ 'a mix of active-speaker groups with different values for preferLiveVideo is not supported'
311
+ );
312
+ }
313
+ }
314
+ });
315
+
316
+ return preferLiveVideo;
317
+ }
318
+
319
+ private cloneClientRequests(): ClientRequestsMap {
320
+ // we clone the client requests but without cloning the ReceiveSlots that they reference
321
+ return cloneDeepWith(this.clientRequests, (value, key) => {
322
+ if (key === 'receiveSlots') {
323
+ return [...value];
324
+ }
325
+
326
+ return undefined;
327
+ });
144
328
  }
145
329
 
146
330
  private sendRequests() {
147
- const wcmeMediaRequests: WcmeMediaRequest[] = [];
331
+ const streamRequests: StreamRequest[] = [];
148
332
 
149
- const clientRequests = this.getDegradedClientRequests();
150
- const maxPayloadBitsPerSecond = 10 * 1000 * 1000;
333
+ // clone the requests so that any modifications we do to them don't affect the original ones
334
+ const clientRequests = this.cloneClientRequests();
151
335
 
152
- // map all the client media requests to wcme media requests
336
+ this.trimRequests(clientRequests);
337
+ this.getDegradedClientRequests(clientRequests);
338
+
339
+ // map all the client media requests to wcme stream requests
153
340
  Object.values(clientRequests).forEach((mr) => {
154
- wcmeMediaRequests.push(
155
- new WcmeMediaRequest(
156
- mr.policyInfo.policy === 'active-speaker'
157
- ? Policy.ActiveSpeaker
158
- : Policy.ReceiverSelected,
159
- mr.policyInfo.policy === 'active-speaker'
160
- ? new ActiveSpeakerInfo(
161
- mr.policyInfo.priority,
162
- mr.policyInfo.crossPriorityDuplication,
163
- mr.policyInfo.crossPolicyDuplication,
164
- mr.policyInfo.preferLiveVideo
165
- )
166
- : new ReceiverSelectedInfo(mr.policyInfo.csi),
167
- mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),
168
- maxPayloadBitsPerSecond,
169
- mr.codecInfo && [
170
- new WcmeCodecInfo(
171
- 0x80,
172
- new H264Codec(
173
- mr.codecInfo.maxFs,
174
- mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,
175
- mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,
176
- mr.codecInfo.maxWidth,
177
- mr.codecInfo.maxHeight
178
- )
179
- ),
180
- ]
181
- )
182
- );
341
+ if (mr.receiveSlots.length > 0) {
342
+ streamRequests.push(
343
+ new StreamRequest(
344
+ mr.policyInfo.policy === 'active-speaker'
345
+ ? Policy.ActiveSpeaker
346
+ : Policy.ReceiverSelected,
347
+ mr.policyInfo.policy === 'active-speaker'
348
+ ? new ActiveSpeakerInfo(
349
+ mr.policyInfo.priority,
350
+ mr.policyInfo.crossPriorityDuplication,
351
+ mr.policyInfo.crossPolicyDuplication,
352
+ mr.policyInfo.preferLiveVideo,
353
+ mr.policyInfo.namedMediaGroups
354
+ )
355
+ : new ReceiverSelectedInfo(mr.policyInfo.csi),
356
+ mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),
357
+ this.getMaxPayloadBitsPerSecond(mr),
358
+ mr.codecInfo && [
359
+ new WcmeCodecInfo(
360
+ 0x80,
361
+ new H264Codec(
362
+ mr.codecInfo.maxFs,
363
+ mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,
364
+ this.getH264MaxMbps(mr),
365
+ mr.codecInfo.maxWidth,
366
+ mr.codecInfo.maxHeight
367
+ )
368
+ ),
369
+ ]
370
+ )
371
+ );
372
+ }
183
373
  });
184
374
 
185
- this.sendMediaRequestsCallback(wcmeMediaRequests);
375
+ //! IMPORTANT: this is only a temporary fix. This will soon be done in the jmp layer (@webex/json-multistream)
376
+ // https://jira-eng-gpk2.cisco.com/jira/browse/WEBEX-326713
377
+ if (!this.checkIsNewRequestsEqualToPrev(streamRequests)) {
378
+ this.sendMediaRequestsCallback(streamRequests);
379
+ this.previousStreamRequests = streamRequests;
380
+ LoggerProxy.logger.info(`multistream:sendRequests --> media requests sent. `);
381
+ } else {
382
+ LoggerProxy.logger.info(
383
+ `multistream:sendRequests --> detected duplicate WCME requests, skipping them... `
384
+ );
385
+ }
186
386
  }
187
387
 
188
388
  public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {
@@ -191,12 +391,15 @@ export class MediaRequestManager {
191
391
 
192
392
  this.clientRequests[newId] = mediaRequest;
193
393
 
394
+ const eventHandler = ({maxFs}) => {
395
+ mediaRequest.preferredMaxFs = maxFs;
396
+ this.debouncedSourceUpdateListener();
397
+ };
398
+ mediaRequest.handleMaxFs = eventHandler;
399
+
194
400
  mediaRequest.receiveSlots.forEach((rs) => {
195
401
  rs.on(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);
196
- rs.on(ReceiveSlotEvents.MaxFsUpdate, ({maxFs}) => {
197
- mediaRequest.preferredMaxFs = maxFs;
198
- this.debouncedSourceUpdateListener();
199
- });
402
+ rs.on(ReceiveSlotEvents.MaxFsUpdate, mediaRequest.handleMaxFs);
200
403
  });
201
404
 
202
405
  if (commit) {
@@ -207,8 +410,11 @@ export class MediaRequestManager {
207
410
  }
208
411
 
209
412
  public cancelRequest(requestId: MediaRequestId, commit = true) {
210
- this.clientRequests[requestId]?.receiveSlots.forEach((rs) => {
413
+ const mediaRequest = this.clientRequests[requestId];
414
+
415
+ mediaRequest?.receiveSlots.forEach((rs) => {
211
416
  rs.off(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);
417
+ rs.off(ReceiveSlotEvents.MaxFsUpdate, mediaRequest.handleMaxFs);
212
418
  });
213
419
 
214
420
  delete this.clientRequests[requestId];
@@ -224,5 +430,14 @@ export class MediaRequestManager {
224
430
 
225
431
  public reset() {
226
432
  this.clientRequests = {};
433
+ this.numTotalSources = 0;
434
+ this.numLiveSources = 0;
435
+ }
436
+
437
+ public setNumCurrentSources(numTotalSources: number, numLiveSources: number) {
438
+ this.numTotalSources = numTotalSources;
439
+ this.numLiveSources = numLiveSources;
440
+
441
+ this.sendRequests();
227
442
  }
228
443
  }
@@ -3,7 +3,7 @@ import {
3
3
  MediaType,
4
4
  ReceiveSlot as WcmeReceiveSlot,
5
5
  ReceiveSlotEvents as WcmeReceiveSlotEvents,
6
- SourceState,
6
+ StreamState,
7
7
  } from '@webex/internal-media-core';
8
8
 
9
9
  import LoggerProxy from '../common/logs/logger-proxy';
@@ -14,7 +14,7 @@ export const ReceiveSlotEvents = {
14
14
  MaxFsUpdate: 'maxFsUpdate',
15
15
  };
16
16
 
17
- export type {SourceState} from '@webex/internal-media-core';
17
+ export type {StreamState} from '@webex/internal-media-core';
18
18
  export type CSI = number;
19
19
  export type MemberId = string;
20
20
  export type ReceiveSlotId = string;
@@ -40,7 +40,7 @@ export class ReceiveSlot extends EventsScope {
40
40
 
41
41
  #csi?: CSI;
42
42
 
43
- #sourceState: SourceState;
43
+ #sourceState: StreamState;
44
44
 
45
45
  /**
46
46
  * constructor - don't use it directly, you should always use meeting.receiveSlotManager.allocateSlot()
@@ -119,7 +119,7 @@ export class ReceiveSlot extends EventsScope {
119
119
 
120
120
  this.mcReceiveSlot.on(
121
121
  WcmeReceiveSlotEvents.SourceUpdate,
122
- (state: SourceState, csi?: number) => {
122
+ (state: StreamState, csi?: number) => {
123
123
  LoggerProxy.logger.log(
124
124
  `ReceiveSlot#setupEventListeners --> got source update on receive slot ${this.id}, mediaType=${this.mediaType}, csi=${csi}, state=${state}`
125
125
  );
@@ -159,6 +159,13 @@ export class ReceiveSlot extends EventsScope {
159
159
  }
160
160
  }
161
161
 
162
+ /**
163
+ * @returns {string} a log message used to identify the receive slot
164
+ */
165
+ public get logString() {
166
+ return `ReceiveSlot - ${this.id}: ${JSON.stringify(this.mcReceiveSlot.id)}`;
167
+ }
168
+
162
169
  /**
163
170
  * The MediaStream object associated with this slot.
164
171
  *
@@ -1,11 +1,13 @@
1
1
  /* eslint-disable valid-jsdoc */
2
2
  /* eslint-disable import/prefer-default-export */
3
- import {MediaType} from '@webex/internal-media-core';
4
-
3
+ import {MediaType, ReceiveSlot as WcmeReceiveSlot} from '@webex/internal-media-core';
5
4
  import LoggerProxy from '../common/logs/logger-proxy';
6
- import Meeting from '../meeting';
7
5
 
8
- import {CSI, ReceiveSlot} from './receiveSlot';
6
+ import {FindMemberIdCallback, ReceiveSlot} from './receiveSlot';
7
+
8
+ export type CreateSlotCallback = (mediaType: MediaType) => Promise<WcmeReceiveSlot>;
9
+
10
+ export type {CSI, FindMemberIdCallback} from './receiveSlot';
9
11
 
10
12
  /**
11
13
  * Manages all receive slots used by a meeting. WMCE receive slots cannot be ever deleted,
@@ -16,13 +18,18 @@ export class ReceiveSlotManager {
16
18
 
17
19
  private freeSlots: {[key in MediaType]: ReceiveSlot[]};
18
20
 
19
- private meeting: Meeting;
21
+ private createSlotCallback: CreateSlotCallback;
22
+
23
+ private findMemberIdByCsiCallback: FindMemberIdCallback;
20
24
 
21
25
  /**
22
26
  * Constructor
23
27
  * @param {Meeting} meeting
24
28
  */
25
- constructor(meeting) {
29
+ constructor(
30
+ createSlotCallback: CreateSlotCallback,
31
+ findMemberIdByCsiCallback: FindMemberIdCallback
32
+ ) {
26
33
  this.allocatedSlots = {
27
34
  [MediaType.AudioMain]: [],
28
35
  [MediaType.VideoMain]: [],
@@ -35,7 +42,8 @@ export class ReceiveSlotManager {
35
42
  [MediaType.AudioSlides]: [],
36
43
  [MediaType.VideoSlides]: [],
37
44
  };
38
- this.meeting = meeting;
45
+ this.createSlotCallback = createSlotCallback;
46
+ this.findMemberIdByCsiCallback = findMemberIdByCsiCallback;
39
47
  }
40
48
 
41
49
  /**
@@ -45,34 +53,24 @@ export class ReceiveSlotManager {
45
53
  * @returns {Promise<ReceiveSlot>}
46
54
  */
47
55
  async allocateSlot(mediaType: MediaType): Promise<ReceiveSlot> {
48
- if (!this.meeting?.mediaProperties?.webrtcMediaConnection) {
49
- return Promise.reject(new Error('Webrtc media connection is missing'));
50
- }
51
-
52
56
  // try to use one of the free ones
53
57
  const availableSlot = this.freeSlots[mediaType].pop();
54
58
 
55
59
  if (availableSlot) {
56
60
  this.allocatedSlots[mediaType].push(availableSlot);
57
61
 
58
- LoggerProxy.logger.log(`receive slot re-used: ${availableSlot.id}`);
62
+ LoggerProxy.logger.log(`${mediaType}: receive slot re-used: ${availableSlot.id}`);
59
63
 
60
64
  return availableSlot;
61
65
  }
62
66
 
63
67
  // we have to create a new one
64
- const wcmeReceiveSlot =
65
- await this.meeting.mediaProperties.webrtcMediaConnection.createReceiveSlot(mediaType);
66
-
67
- const receiveSlot = new ReceiveSlot(
68
- mediaType,
69
- wcmeReceiveSlot,
70
- // @ts-ignore
71
- (csi: CSI) => this.meeting.members.findMemberByCsi(csi)?.id
72
- );
68
+ const wcmeReceiveSlot = await this.createSlotCallback(mediaType);
69
+
70
+ const receiveSlot = new ReceiveSlot(mediaType, wcmeReceiveSlot, this.findMemberIdByCsiCallback);
73
71
 
74
72
  this.allocatedSlots[mediaType].push(receiveSlot);
75
- LoggerProxy.logger.log(`new receive slot allocated: ${receiveSlot.id}`);
73
+ LoggerProxy.logger.log(`${mediaType}: new receive slot allocated: ${receiveSlot.id}`);
76
74
 
77
75
  return receiveSlot;
78
76
  }
@@ -89,10 +87,10 @@ export class ReceiveSlotManager {
89
87
  if (idx >= 0) {
90
88
  this.allocatedSlots[slot.mediaType].splice(idx, 1);
91
89
  this.freeSlots[slot.mediaType].push(slot);
92
- LoggerProxy.logger.log(`receive slot released: ${slot.id}`);
90
+ LoggerProxy.logger.log(`${slot.mediaType}: receive slot released: ${slot.id}`);
93
91
  } else {
94
92
  LoggerProxy.logger.warn(
95
- 'ReceiveSlotManager#releaseSlot --> trying to release a slot that is not managed by this ReceiveSlotManager'
93
+ `ReceiveSlotManager#releaseSlot --> trying to release a ${slot.mediaType}} slot that is not managed by this ReceiveSlotManager`
96
94
  );
97
95
  }
98
96
  }
@@ -153,4 +151,16 @@ export class ReceiveSlotManager {
153
151
  });
154
152
  });
155
153
  }
154
+
155
+ /**
156
+ * Find a receive slot by a ssrc.
157
+ *
158
+ * @param ssrc - The ssrc of the receive slot to find.
159
+ * @returns - The receive slot with this ssrc, undefined if not found.
160
+ */
161
+ findReceiveSlotBySsrc(ssrc: number): ReceiveSlot | undefined {
162
+ return Object.values(this.allocatedSlots)
163
+ .flat()
164
+ .find((r) => ssrc && r.wcmeReceiveSlot?.id?.ssrc === ssrc);
165
+ }
156
166
  }
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable valid-jsdoc */
2
- import {MediaType, SourceState} from '@webex/internal-media-core';
2
+ import {MediaType, StreamState} from '@webex/internal-media-core';
3
3
  import LoggerProxy from '../common/logs/logger-proxy';
4
4
  import EventsScope from '../common/events/events-scope';
5
5
 
@@ -118,8 +118,10 @@ export class RemoteMedia extends EventsScope {
118
118
  fs = 240;
119
119
  } else if (height < 540) {
120
120
  fs = 920;
121
- } else {
121
+ } else if (height <= 720) {
122
122
  fs = 3600;
123
+ } else {
124
+ fs = 8192;
123
125
  }
124
126
 
125
127
  this.receiveSlot?.setMaxFs(fs);
@@ -231,7 +233,7 @@ export class RemoteMedia extends EventsScope {
231
233
  /**
232
234
  * Getter for source state
233
235
  */
234
- public get sourceState(): SourceState {
236
+ public get sourceState(): StreamState {
235
237
  return this.receiveSlot?.sourceState;
236
238
  }
237
239