@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
@@ -4,23 +4,28 @@ import sinon from 'sinon';
4
4
  import {assert} from '@webex/test-helper-chai';
5
5
  import {getMaxFs} from '@webex/plugin-meetings/src/multistream/remoteMedia';
6
6
  import FakeTimers from '@sinonjs/fake-timers';
7
+ import * as mediaCore from '@webex/internal-media-core';
8
+ import { expect } from 'chai';
7
9
 
8
10
  type ExpectedActiveSpeaker = {
9
11
  policy: 'active-speaker';
12
+ maxPayloadBitsPerSecond?: number;
10
13
  priority: number;
11
14
  receiveSlots: Array<ReceiveSlot>;
12
- maxFs: number;
15
+ maxFs?: number;
16
+ maxMbps?: number;
17
+ namedMediaGroups?:[{type: number, value: number}];
13
18
  };
14
19
  type ExpectedReceiverSelected = {
15
20
  policy: 'receiver-selected';
21
+ maxPayloadBitsPerSecond?: number;
16
22
  csi: number;
17
23
  receiveSlot: ReceiveSlot;
18
- maxFs: number;
24
+ maxFs?: number;
25
+ maxMbps?: number;
19
26
  };
20
27
  type ExpectedRequest = ExpectedActiveSpeaker | ExpectedReceiverSelected;
21
28
 
22
- const maxPayloadBitsPerSecond = 10 * 1000 * 1000; // for now we always send this fixed constant
23
-
24
29
  const degradationPreferences = {
25
30
  maxMacroblocksLimit: Infinity, // no limit
26
31
  };
@@ -28,11 +33,18 @@ const degradationPreferences = {
28
33
  describe('MediaRequestManager', () => {
29
34
  const CROSS_PRIORITY_DUPLICATION = true;
30
35
  const CROSS_POLICY_DUPLICATION = true;
31
- const PREFER_LIVE_VIDEO = true;
32
- const ACTIVE_SPEAKER_MAX_FS = 3600;
33
- const RECEIVER_SELECTED_MAX_FS = 8190;
34
-
35
- const NUM_SLOTS = 10;
36
+ const MAX_FPS = 3000;
37
+ const MAX_FS_360p = 920;
38
+ const MAX_FS_720p = 3600;
39
+ const MAX_FS_1080p = 8192;
40
+ const MAX_MBPS_360p = 27600;
41
+ const MAX_MBPS_720p = 108000;
42
+ const MAX_MBPS_1080p = 245760;
43
+ const MAX_PAYLOADBITSPS_360p = 640000;
44
+ const MAX_PAYLOADBITSPS_720p = 2500000;
45
+ const MAX_PAYLOADBITSPS_1080p = 4000000;
46
+
47
+ const NUM_SLOTS = 15;
36
48
 
37
49
  let mediaRequestManager: MediaRequestManager;
38
50
  let sendMediaRequestsCallback;
@@ -41,10 +53,11 @@ describe('MediaRequestManager', () => {
41
53
 
42
54
  beforeEach(() => {
43
55
  sendMediaRequestsCallback = sinon.stub();
44
- mediaRequestManager = new MediaRequestManager(
56
+ mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
45
57
  degradationPreferences,
46
- sendMediaRequestsCallback
47
- );
58
+ kind: 'video',
59
+ trimRequestsToNumOfSources: false,
60
+ });
48
61
 
49
62
  // create some fake receive slots used by the tests
50
63
  fakeWcmeSlots = Array(NUM_SLOTS)
@@ -68,7 +81,7 @@ describe('MediaRequestManager', () => {
68
81
  });
69
82
 
70
83
  // helper function for adding an active speaker request
71
- const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false) =>
84
+ const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false, preferLiveVideo = true, namedMediaGroups = undefined) =>
72
85
  mediaRequestManager.addRequest(
73
86
  {
74
87
  policyInfo: {
@@ -76,7 +89,8 @@ describe('MediaRequestManager', () => {
76
89
  priority,
77
90
  crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
78
91
  crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
79
- preferLiveVideo: PREFER_LIVE_VIDEO,
92
+ preferLiveVideo,
93
+ namedMediaGroups,
80
94
  },
81
95
  receiveSlots,
82
96
  codecInfo: {
@@ -109,7 +123,12 @@ describe('MediaRequestManager', () => {
109
123
  // It should be used only for verifying requests created with
110
124
  // addActiveSpeakerRequest() or addReceiverSelectedRequest(), because of some
111
125
  // hardcoded values used in them
112
- const checkMediaRequestsSent = (expectedRequests: ExpectedRequest[]) => {
126
+ const checkMediaRequestsSent = (
127
+ expectedRequests: ExpectedRequest[], {
128
+ isCodecInfoDefined = true,
129
+ preferLiveVideo = true,
130
+ } = {}
131
+ ) => {
113
132
  assert.calledOnce(sendMediaRequestsCallback);
114
133
  assert.calledWith(
115
134
  sendMediaRequestsCallback,
@@ -121,18 +140,21 @@ describe('MediaRequestManager', () => {
121
140
  priority: expectedRequest.priority,
122
141
  crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
123
142
  crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
124
- preferLiveVideo: PREFER_LIVE_VIDEO,
143
+ preferLiveVideo,
125
144
  }),
126
145
  receiveSlots: expectedRequest.receiveSlots,
127
- maxPayloadBitsPerSecond,
128
- codecInfos: [
129
- sinon.match({
130
- payloadType: 0x80,
131
- h264: sinon.match({
132
- maxFs: expectedRequest.maxFs,
133
- }),
134
- }),
135
- ],
146
+ maxPayloadBitsPerSecond: expectedRequest.maxPayloadBitsPerSecond,
147
+ codecInfos: isCodecInfoDefined
148
+ ? [
149
+ sinon.match({
150
+ payloadType: 0x80,
151
+ h264: sinon.match({
152
+ maxMbps: expectedRequest.maxMbps,
153
+ maxFs: expectedRequest.maxFs,
154
+ }),
155
+ }),
156
+ ]
157
+ : [],
136
158
  });
137
159
  }
138
160
  if (expectedRequest.policy === 'receiver-selected') {
@@ -142,15 +164,18 @@ describe('MediaRequestManager', () => {
142
164
  csi: expectedRequest.csi,
143
165
  }),
144
166
  receiveSlots: [expectedRequest.receiveSlot],
145
- maxPayloadBitsPerSecond,
146
- codecInfos: [
147
- sinon.match({
148
- payloadType: 0x80,
149
- h264: sinon.match({
150
- maxFs: expectedRequest.maxFs,
151
- }),
152
- }),
153
- ],
167
+ maxPayloadBitsPerSecond: expectedRequest.maxPayloadBitsPerSecond,
168
+ codecInfos: isCodecInfoDefined
169
+ ? [
170
+ sinon.match({
171
+ payloadType: 0x80,
172
+ h264: sinon.match({
173
+ maxMbps: expectedRequest.maxMbps,
174
+ maxFs: expectedRequest.maxFs,
175
+ }),
176
+ }),
177
+ ]
178
+ : [],
154
179
  });
155
180
  }
156
181
 
@@ -184,8 +209,8 @@ describe('MediaRequestManager', () => {
184
209
  receiveSlots: [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
185
210
  codecInfo: {
186
211
  codec: 'h264',
187
- maxFs: 1620,
188
- maxFps: 1500,
212
+ maxFs: MAX_FS_360p,
213
+ maxFps: MAX_FPS,
189
214
  },
190
215
  },
191
216
  false
@@ -199,9 +224,9 @@ describe('MediaRequestManager', () => {
199
224
  receiveSlots: [fakeReceiveSlots[3]],
200
225
  codecInfo: {
201
226
  codec: 'h264',
202
- maxFs: 3600,
203
- maxFps: 2500,
204
- maxMbps: 90000,
227
+ maxFs: MAX_FS_720p,
228
+ maxFps: MAX_FPS,
229
+ maxMbps: MAX_MBPS_720p,
205
230
  },
206
231
  },
207
232
  false
@@ -217,9 +242,9 @@ describe('MediaRequestManager', () => {
217
242
  receiveSlots: [fakeReceiveSlots[4]],
218
243
  codecInfo: {
219
244
  codec: 'h264',
220
- maxFs: 8192,
221
- maxFps: 2500,
222
- maxMbps: 204800,
245
+ maxFs: MAX_FS_1080p,
246
+ maxFps: MAX_FPS,
247
+ maxMbps: MAX_MBPS_1080p,
223
248
  },
224
249
  },
225
250
  true
@@ -237,13 +262,14 @@ describe('MediaRequestManager', () => {
237
262
  preferLiveVideo: false,
238
263
  }),
239
264
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
265
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
240
266
  codecInfos: [
241
267
  sinon.match({
242
268
  payloadType: 0x80,
243
269
  h264: sinon.match({
244
- maxFs: 1620,
245
- maxFps: 1500,
246
- maxMbps: 245760,
270
+ maxFs: MAX_FS_360p,
271
+ maxFps: MAX_FPS,
272
+ maxMbps: MAX_MBPS_360p,
247
273
  }),
248
274
  }),
249
275
  ],
@@ -254,13 +280,14 @@ describe('MediaRequestManager', () => {
254
280
  csi: 123,
255
281
  }),
256
282
  receiveSlots: [fakeWcmeSlots[3]],
283
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
257
284
  codecInfos: [
258
285
  sinon.match({
259
286
  payloadType: 0x80,
260
287
  h264: sinon.match({
261
- maxFs: 3600,
262
- maxFps: 2500,
263
- maxMbps: 90000,
288
+ maxFs: MAX_FS_720p,
289
+ maxFps: MAX_FPS,
290
+ maxMbps: MAX_MBPS_720p,
264
291
  }),
265
292
  }),
266
293
  ],
@@ -271,13 +298,14 @@ describe('MediaRequestManager', () => {
271
298
  csi: 123,
272
299
  }),
273
300
  receiveSlots: [fakeWcmeSlots[4]],
301
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
274
302
  codecInfos: [
275
303
  sinon.match({
276
304
  payloadType: 0x80,
277
305
  h264: sinon.match({
278
- maxFs: 8192,
279
- maxFps: 2500,
280
- maxMbps: 204800,
306
+ maxFs: MAX_FS_1080p,
307
+ maxFps: MAX_FPS,
308
+ maxMbps: MAX_MBPS_1080p,
281
309
  }),
282
310
  }),
283
311
  ],
@@ -287,32 +315,38 @@ describe('MediaRequestManager', () => {
287
315
 
288
316
  it('keeps adding requests with every call to addRequest()', () => {
289
317
  // start with 1 request
290
- addReceiverSelectedRequest(100, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, true);
318
+ addReceiverSelectedRequest(100, fakeReceiveSlots[0], MAX_FS_1080p, true);
291
319
 
292
320
  checkMediaRequestsSent([
293
321
  {
294
322
  policy: 'receiver-selected',
295
323
  csi: 100,
296
324
  receiveSlot: fakeWcmeSlots[0],
297
- maxFs: RECEIVER_SELECTED_MAX_FS,
325
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
326
+ maxFs: MAX_FS_1080p,
327
+ maxMbps: MAX_MBPS_1080p,
298
328
  },
299
329
  ]);
300
330
 
301
331
  // now add another one
302
- addReceiverSelectedRequest(101, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, true);
332
+ addReceiverSelectedRequest(101, fakeReceiveSlots[1], MAX_FS_1080p, true);
303
333
 
304
334
  checkMediaRequestsSent([
305
335
  {
306
336
  policy: 'receiver-selected',
307
337
  csi: 100,
308
338
  receiveSlot: fakeWcmeSlots[0],
309
- maxFs: RECEIVER_SELECTED_MAX_FS,
339
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
340
+ maxFs: MAX_FS_1080p,
341
+ maxMbps: MAX_MBPS_1080p,
310
342
  },
311
343
  {
312
344
  policy: 'receiver-selected',
313
345
  csi: 101,
314
346
  receiveSlot: fakeWcmeSlots[1],
315
- maxFs: RECEIVER_SELECTED_MAX_FS,
347
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
348
+ maxFs: MAX_FS_1080p,
349
+ maxMbps: MAX_MBPS_1080p,
316
350
  },
317
351
  ]);
318
352
 
@@ -320,7 +354,7 @@ describe('MediaRequestManager', () => {
320
354
  addActiveSpeakerRequest(
321
355
  1,
322
356
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
323
- ACTIVE_SPEAKER_MAX_FS,
357
+ MAX_FS_720p,
324
358
  true
325
359
  );
326
360
 
@@ -329,37 +363,55 @@ describe('MediaRequestManager', () => {
329
363
  policy: 'receiver-selected',
330
364
  csi: 100,
331
365
  receiveSlot: fakeWcmeSlots[0],
332
- maxFs: RECEIVER_SELECTED_MAX_FS,
366
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
367
+ maxFs: MAX_FS_1080p,
368
+ maxMbps: MAX_MBPS_1080p,
333
369
  },
334
370
  {
335
371
  policy: 'receiver-selected',
336
372
  csi: 101,
337
373
  receiveSlot: fakeWcmeSlots[1],
338
- maxFs: RECEIVER_SELECTED_MAX_FS,
374
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
375
+ maxFs: MAX_FS_1080p,
376
+ maxMbps: MAX_MBPS_1080p,
339
377
  },
340
378
  {
341
379
  policy: 'active-speaker',
342
380
  priority: 1,
343
381
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
344
- maxFs: ACTIVE_SPEAKER_MAX_FS,
382
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
383
+ maxFs: MAX_FS_720p,
384
+ maxMbps: MAX_MBPS_720p,
345
385
  },
346
386
  ]);
347
387
  });
348
388
 
389
+ it('removes the events maxFsUpdate and sourceUpdate when cancelRequest() is called', async () => {
390
+
391
+ const requestId = addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]], MAX_FS_720p);
392
+
393
+ mediaRequestManager.cancelRequest(requestId, true);
394
+
395
+ const sourceUpdateHandler = fakeReceiveSlots[2].off.getCall(0);
396
+
397
+ const maxFsHandlerCall = fakeReceiveSlots[2].off.getCall(1);
398
+
399
+ const maxFsEventName = maxFsHandlerCall.args[0];
400
+ const sourceUpdateEventName = sourceUpdateHandler.args[0];
401
+
402
+ expect(sourceUpdateHandler.args[1]).to.be.a('function');
403
+ expect(maxFsHandlerCall.args[1]).to.be.a('function');
404
+
405
+ assert.equal(maxFsEventName, 'maxFsUpdate')
406
+ assert.equal(sourceUpdateEventName, 'sourceUpdate')
407
+ });
408
+
349
409
  it('cancels the requests correctly when cancelRequest() is called with commit=true', () => {
350
410
  const requestIds = [
351
- addActiveSpeakerRequest(
352
- 255,
353
- [fakeReceiveSlots[0], fakeReceiveSlots[1]],
354
- ACTIVE_SPEAKER_MAX_FS
355
- ),
356
- addActiveSpeakerRequest(
357
- 255,
358
- [fakeReceiveSlots[2], fakeReceiveSlots[3]],
359
- ACTIVE_SPEAKER_MAX_FS
360
- ),
361
- addReceiverSelectedRequest(100, fakeReceiveSlots[4], RECEIVER_SELECTED_MAX_FS),
362
- addReceiverSelectedRequest(200, fakeReceiveSlots[5], RECEIVER_SELECTED_MAX_FS),
411
+ addActiveSpeakerRequest(255, [fakeReceiveSlots[0], fakeReceiveSlots[1]], MAX_FS_720p),
412
+ addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]], MAX_FS_720p),
413
+ addReceiverSelectedRequest(100, fakeReceiveSlots[4], MAX_FS_1080p),
414
+ addReceiverSelectedRequest(200, fakeReceiveSlots[5], MAX_FS_1080p),
363
415
  ];
364
416
 
365
417
  // cancel one of the active speaker requests
@@ -371,19 +423,25 @@ describe('MediaRequestManager', () => {
371
423
  policy: 'active-speaker',
372
424
  priority: 255,
373
425
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
374
- maxFs: ACTIVE_SPEAKER_MAX_FS,
426
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
427
+ maxFs: MAX_FS_720p,
428
+ maxMbps: MAX_MBPS_720p,
375
429
  },
376
430
  {
377
431
  policy: 'receiver-selected',
378
432
  csi: 100,
379
433
  receiveSlot: fakeWcmeSlots[4],
380
- maxFs: RECEIVER_SELECTED_MAX_FS,
434
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
435
+ maxFs: MAX_FS_1080p,
436
+ maxMbps: MAX_MBPS_1080p,
381
437
  },
382
438
  {
383
439
  policy: 'receiver-selected',
384
440
  csi: 200,
385
441
  receiveSlot: fakeWcmeSlots[5],
386
- maxFs: RECEIVER_SELECTED_MAX_FS,
442
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
443
+ maxFs: MAX_FS_1080p,
444
+ maxMbps: MAX_MBPS_1080p,
387
445
  },
388
446
  ]);
389
447
 
@@ -396,13 +454,17 @@ describe('MediaRequestManager', () => {
396
454
  policy: 'active-speaker',
397
455
  priority: 255,
398
456
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
399
- maxFs: ACTIVE_SPEAKER_MAX_FS,
457
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
458
+ maxFs: MAX_FS_720p,
459
+ maxMbps: MAX_MBPS_720p,
400
460
  },
401
461
  {
402
462
  policy: 'receiver-selected',
403
463
  csi: 100,
404
464
  receiveSlot: fakeWcmeSlots[4],
405
- maxFs: RECEIVER_SELECTED_MAX_FS,
465
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
466
+ maxFs: MAX_FS_1080p,
467
+ maxMbps: MAX_MBPS_1080p,
406
468
  },
407
469
  ]);
408
470
  });
@@ -411,10 +473,10 @@ describe('MediaRequestManager', () => {
411
473
  addActiveSpeakerRequest(
412
474
  10,
413
475
  [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
414
- ACTIVE_SPEAKER_MAX_FS,
476
+ MAX_FS_720p,
415
477
  false
416
478
  );
417
- addReceiverSelectedRequest(123, fakeReceiveSlots[3], RECEIVER_SELECTED_MAX_FS, false);
479
+ addReceiverSelectedRequest(123, fakeReceiveSlots[3], MAX_FS_1080p, false);
418
480
 
419
481
  // nothing should be sent out as we didn't commit the requests
420
482
  assert.notCalled(sendMediaRequestsCallback);
@@ -428,13 +490,17 @@ describe('MediaRequestManager', () => {
428
490
  policy: 'active-speaker',
429
491
  priority: 10,
430
492
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
431
- maxFs: ACTIVE_SPEAKER_MAX_FS,
493
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
494
+ maxFs: MAX_FS_720p,
495
+ maxMbps: MAX_MBPS_720p,
432
496
  },
433
497
  {
434
498
  policy: 'receiver-selected',
435
499
  csi: 123,
436
500
  receiveSlot: fakeWcmeSlots[3],
437
- maxFs: RECEIVER_SELECTED_MAX_FS,
501
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
502
+ maxFs: MAX_FS_1080p,
503
+ maxMbps: MAX_MBPS_1080p,
438
504
  },
439
505
  ]);
440
506
  });
@@ -445,12 +511,12 @@ describe('MediaRequestManager', () => {
445
511
  addActiveSpeakerRequest(
446
512
  250,
447
513
  [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
448
- ACTIVE_SPEAKER_MAX_FS,
514
+ MAX_FS_720p,
449
515
  false
450
516
  ),
451
- addReceiverSelectedRequest(98765, fakeReceiveSlots[3], RECEIVER_SELECTED_MAX_FS, false),
452
- addReceiverSelectedRequest(99999, fakeReceiveSlots[4], RECEIVER_SELECTED_MAX_FS, false),
453
- addReceiverSelectedRequest(88888, fakeReceiveSlots[5], RECEIVER_SELECTED_MAX_FS, true),
517
+ addReceiverSelectedRequest(98765, fakeReceiveSlots[3], MAX_FS_1080p, false),
518
+ addReceiverSelectedRequest(99999, fakeReceiveSlots[4], MAX_FS_1080p, false),
519
+ addReceiverSelectedRequest(88888, fakeReceiveSlots[5], MAX_FS_1080p, true),
454
520
  ];
455
521
 
456
522
  checkMediaRequestsSent([
@@ -458,25 +524,33 @@ describe('MediaRequestManager', () => {
458
524
  policy: 'active-speaker',
459
525
  priority: 250,
460
526
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
461
- maxFs: ACTIVE_SPEAKER_MAX_FS,
527
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
528
+ maxFs: MAX_FS_720p,
529
+ maxMbps: MAX_MBPS_720p,
462
530
  },
463
531
  {
464
532
  policy: 'receiver-selected',
465
533
  csi: 98765,
466
534
  receiveSlot: fakeWcmeSlots[3],
467
- maxFs: RECEIVER_SELECTED_MAX_FS,
535
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
536
+ maxFs: MAX_FS_1080p,
537
+ maxMbps: MAX_MBPS_1080p,
468
538
  },
469
539
  {
470
540
  policy: 'receiver-selected',
471
541
  csi: 99999,
472
542
  receiveSlot: fakeWcmeSlots[4],
473
- maxFs: RECEIVER_SELECTED_MAX_FS,
543
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
544
+ maxFs: MAX_FS_1080p,
545
+ maxMbps: MAX_MBPS_1080p,
474
546
  },
475
547
  {
476
548
  policy: 'receiver-selected',
477
549
  csi: 88888,
478
550
  receiveSlot: fakeWcmeSlots[5],
479
- maxFs: RECEIVER_SELECTED_MAX_FS,
551
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
552
+ maxFs: MAX_FS_1080p,
553
+ maxMbps: MAX_MBPS_1080p,
480
554
  },
481
555
  ]);
482
556
 
@@ -495,28 +569,37 @@ describe('MediaRequestManager', () => {
495
569
  policy: 'receiver-selected',
496
570
  csi: 98765,
497
571
  receiveSlot: fakeWcmeSlots[3],
498
- maxFs: RECEIVER_SELECTED_MAX_FS,
572
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
573
+ maxFs: MAX_FS_1080p,
574
+ maxMbps: MAX_MBPS_1080p,
499
575
  },
500
576
  ]);
501
577
  });
502
578
 
503
579
  it('sends the wcme media requests when commit() is called', () => {
504
580
  // send some requests, all of them with commit=false
505
- addReceiverSelectedRequest(123000, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, false);
506
- addReceiverSelectedRequest(456000, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, false);
581
+ addReceiverSelectedRequest(123000, fakeReceiveSlots[0], MAX_FS_1080p, false);
582
+ addReceiverSelectedRequest(456000, fakeReceiveSlots[1], MAX_FS_1080p, false);
507
583
  addActiveSpeakerRequest(
508
584
  255,
509
585
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
510
- ACTIVE_SPEAKER_MAX_FS,
586
+ MAX_FS_720p,
511
587
  false
512
588
  );
513
589
  addActiveSpeakerRequest(
514
590
  254,
515
591
  [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
516
- ACTIVE_SPEAKER_MAX_FS,
592
+ MAX_FS_720p,
517
593
  false
518
594
  );
519
-
595
+ addActiveSpeakerRequest(
596
+ 254,
597
+ [fakeReceiveSlots[8], fakeReceiveSlots[9], fakeReceiveSlots[10]],
598
+ MAX_FS_720p,
599
+ false,
600
+ true,
601
+ [{type: 1, value: 20}],
602
+ );
520
603
  // nothing should be sent out as we didn't commit the requests
521
604
  assert.notCalled(sendMediaRequestsCallback);
522
605
 
@@ -529,75 +612,130 @@ describe('MediaRequestManager', () => {
529
612
  policy: 'receiver-selected',
530
613
  csi: 123000,
531
614
  receiveSlot: fakeWcmeSlots[0],
532
- maxFs: RECEIVER_SELECTED_MAX_FS,
615
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
616
+ maxFs: MAX_FS_1080p,
617
+ maxMbps: MAX_MBPS_1080p,
533
618
  },
534
619
  {
535
620
  policy: 'receiver-selected',
536
621
  csi: 456000,
537
622
  receiveSlot: fakeWcmeSlots[1],
538
- maxFs: RECEIVER_SELECTED_MAX_FS,
623
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
624
+ maxFs: MAX_FS_1080p,
625
+ maxMbps: MAX_MBPS_1080p,
539
626
  },
540
627
  {
541
628
  policy: 'active-speaker',
542
629
  priority: 255,
543
630
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
544
- maxFs: ACTIVE_SPEAKER_MAX_FS,
631
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
632
+ maxFs: MAX_FS_720p,
633
+ maxMbps: MAX_MBPS_720p,
545
634
  },
546
635
  {
547
636
  policy: 'active-speaker',
548
637
  priority: 254,
549
638
  receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
550
- maxFs: ACTIVE_SPEAKER_MAX_FS,
639
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
640
+ maxFs: MAX_FS_720p,
641
+ maxMbps: MAX_MBPS_720p,
642
+ },
643
+ {
644
+ policy: 'active-speaker',
645
+ priority: 254,
646
+ receiveSlots: [fakeWcmeSlots[8], fakeWcmeSlots[9], fakeWcmeSlots[10]],
647
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
648
+ maxFs: MAX_FS_720p,
649
+ maxMbps: MAX_MBPS_720p,
650
+ namedMediaGroups: [{type: 1, value: 20}],
551
651
  },
552
652
  ]);
553
653
  });
554
654
 
555
- it('clears all the requests on reset()', () => {
655
+ it('avoids sending duplicate requests and clears all the requests on reset()', () => {
556
656
  // send some requests and commit them one by one
557
- addReceiverSelectedRequest(1500, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, true);
558
- addReceiverSelectedRequest(1501, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, true);
657
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
658
+ addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
559
659
  addActiveSpeakerRequest(
560
660
  255,
561
661
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
562
- ACTIVE_SPEAKER_MAX_FS,
563
- true
662
+ MAX_FS_720p,
663
+ false
564
664
  );
565
665
  addActiveSpeakerRequest(
566
666
  254,
567
667
  [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
568
- ACTIVE_SPEAKER_MAX_FS,
569
- true
668
+ MAX_FS_720p,
669
+ false
570
670
  );
571
671
 
572
- sendMediaRequestsCallback.resetHistory();
672
+ // nothing should be sent out as we didn't commit the requests
673
+ assert.notCalled(sendMediaRequestsCallback);
573
674
 
574
- // check that when calling commit() all requests are re-sent again
575
675
  mediaRequestManager.commit();
576
-
577
676
  checkMediaRequestsSent([
578
677
  {
579
678
  policy: 'receiver-selected',
580
679
  csi: 1500,
581
680
  receiveSlot: fakeWcmeSlots[0],
582
- maxFs: RECEIVER_SELECTED_MAX_FS,
681
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
682
+ maxFs: MAX_FS_1080p,
683
+ maxMbps: MAX_MBPS_1080p,
583
684
  },
584
685
  {
585
686
  policy: 'receiver-selected',
586
687
  csi: 1501,
587
688
  receiveSlot: fakeWcmeSlots[1],
588
- maxFs: RECEIVER_SELECTED_MAX_FS,
689
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
690
+ maxFs: MAX_FS_1080p,
691
+ maxMbps: MAX_MBPS_1080p,
589
692
  },
590
693
  {
591
694
  policy: 'active-speaker',
592
695
  priority: 255,
593
696
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
594
- maxFs: ACTIVE_SPEAKER_MAX_FS,
697
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
698
+ maxFs: MAX_FS_720p,
699
+ maxMbps: MAX_MBPS_720p,
595
700
  },
596
701
  {
597
702
  policy: 'active-speaker',
598
703
  priority: 254,
599
704
  receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
600
- maxFs: ACTIVE_SPEAKER_MAX_FS,
705
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
706
+ maxFs: MAX_FS_720p,
707
+ maxMbps: MAX_MBPS_720p,
708
+ },
709
+ ]);
710
+
711
+ // check that when calling commit()
712
+ // all requests are not re-sent again (avoid duplicate requests)
713
+ mediaRequestManager.commit();
714
+
715
+ assert.notCalled(sendMediaRequestsCallback);
716
+
717
+ // now reset everything
718
+ mediaRequestManager.reset();
719
+
720
+ // calling commit now should not cause any requests to be sent out
721
+ mediaRequestManager.commit();
722
+ checkMediaRequestsSent([]);
723
+ });
724
+
725
+ it('makes sure to call requests correctly after reset was called and another request was added', () => {
726
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
727
+
728
+ assert.notCalled(sendMediaRequestsCallback);
729
+
730
+ mediaRequestManager.commit();
731
+ checkMediaRequestsSent([
732
+ {
733
+ policy: 'receiver-selected',
734
+ csi: 1500,
735
+ receiveSlot: fakeWcmeSlots[0],
736
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
737
+ maxFs: MAX_FS_1080p,
738
+ maxMbps: MAX_MBPS_1080p,
601
739
  },
602
740
  ]);
603
741
 
@@ -607,6 +745,58 @@ describe('MediaRequestManager', () => {
607
745
  // calling commit now should not cause any requests to be sent out
608
746
  mediaRequestManager.commit();
609
747
  checkMediaRequestsSent([]);
748
+
749
+ //add new request
750
+ addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
751
+
752
+ // commit
753
+ mediaRequestManager.commit();
754
+
755
+ // check the new request was sent
756
+ checkMediaRequestsSent([
757
+ {
758
+ policy: 'receiver-selected',
759
+ csi: 1501,
760
+ receiveSlot: fakeWcmeSlots[1],
761
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
762
+ maxFs: MAX_FS_1080p,
763
+ maxMbps: MAX_MBPS_1080p,
764
+ },
765
+ ]);
766
+ });
767
+
768
+ it('can send same media request after previous requests have been cleared', () => {
769
+ // add a request and commit
770
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
771
+ mediaRequestManager.commit();
772
+ checkMediaRequestsSent([
773
+ {
774
+ policy: 'receiver-selected',
775
+ csi: 1500,
776
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
777
+ receiveSlot: fakeWcmeSlots[0],
778
+ maxFs: MAX_FS_1080p,
779
+ maxMbps: MAX_MBPS_1080p,
780
+ },
781
+ ]);
782
+
783
+ // clear previous requests
784
+ mediaRequestManager.clearPreviousRequests();
785
+
786
+ // commit same request
787
+ mediaRequestManager.commit();
788
+
789
+ // check the request was sent
790
+ checkMediaRequestsSent([
791
+ {
792
+ policy: 'receiver-selected',
793
+ csi: 1500,
794
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
795
+ receiveSlot: fakeWcmeSlots[0],
796
+ maxFs: MAX_FS_1080p,
797
+ maxMbps: MAX_MBPS_1080p,
798
+ },
799
+ ]);
610
800
  });
611
801
 
612
802
  it('re-sends media requests after degradation preferences are set', () => {
@@ -634,7 +824,9 @@ describe('MediaRequestManager', () => {
634
824
  policy: 'active-speaker',
635
825
  priority: 255,
636
826
  receiveSlots: fakeWcmeSlots.slice(0, 4),
827
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
637
828
  maxFs: getMaxFs('large'),
829
+ maxMbps: MAX_MBPS_1080p,
638
830
  },
639
831
  ]);
640
832
  });
@@ -661,13 +853,17 @@ describe('MediaRequestManager', () => {
661
853
  policy: 'active-speaker',
662
854
  priority: 255,
663
855
  receiveSlots: fakeWcmeSlots.slice(0, 3),
856
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
664
857
  maxFs: getMaxFs('medium'),
858
+ maxMbps: MAX_MBPS_720p,
665
859
  },
666
860
  {
667
861
  policy: 'receiver-selected',
668
862
  csi: 123,
669
863
  receiveSlot: fakeWcmeSlots[3],
864
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
670
865
  maxFs: getMaxFs('medium'),
866
+ maxMbps: MAX_MBPS_720p,
671
867
  },
672
868
  ]);
673
869
 
@@ -680,7 +876,9 @@ describe('MediaRequestManager', () => {
680
876
  policy: 'active-speaker',
681
877
  priority: 255,
682
878
  receiveSlots: fakeWcmeSlots.slice(0, 3),
879
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
683
880
  maxFs: getMaxFs('large'),
881
+ maxMbps: MAX_MBPS_1080p,
684
882
  },
685
883
  ]);
686
884
  });
@@ -699,7 +897,9 @@ describe('MediaRequestManager', () => {
699
897
  policy: 'active-speaker',
700
898
  priority: 255,
701
899
  receiveSlots: fakeWcmeSlots.slice(0, 10),
900
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
702
901
  maxFs: getMaxFs('small'),
902
+ maxMbps: MAX_MBPS_360p,
703
903
  },
704
904
  ]);
705
905
  });
@@ -719,13 +919,17 @@ describe('MediaRequestManager', () => {
719
919
  policy: 'active-speaker',
720
920
  priority: 255,
721
921
  receiveSlots: fakeWcmeSlots.slice(0, 5),
922
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
722
923
  maxFs: getMaxFs('medium'),
924
+ maxMbps: MAX_MBPS_720p,
723
925
  },
724
926
  {
725
927
  policy: 'active-speaker',
726
928
  priority: 254,
727
929
  receiveSlots: fakeWcmeSlots.slice(5, 10),
930
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
728
931
  maxFs: getMaxFs('small'),
932
+ maxMbps: MAX_MBPS_360p,
729
933
  },
730
934
  ]);
731
935
  });
@@ -738,7 +942,6 @@ describe('MediaRequestManager', () => {
738
942
 
739
943
  sendMediaRequestsCallback.resetHistory();
740
944
 
741
-
742
945
  const maxFsHandlerCall = fakeReceiveSlots[0].on.getCall(1);
743
946
 
744
947
  const maxFsHandler = maxFsHandlerCall.args[1];
@@ -762,8 +965,472 @@ describe('MediaRequestManager', () => {
762
965
  priority: 255,
763
966
  receiveSlots: fakeWcmeSlots.slice(0, 10),
764
967
  maxFs: preferredFrameSize,
968
+ maxPayloadBitsPerSecond: 99000,
969
+ maxMbps: 3000,
765
970
  },
766
971
  ]);
767
972
  });
768
973
 
974
+ describe('maxPayloadBitsPerSecond', () => {
975
+ let getRecommendedMaxBitrateForFrameSizeSpy;
976
+
977
+ beforeEach(() => {
978
+ sendMediaRequestsCallback.resetHistory();
979
+ getRecommendedMaxBitrateForFrameSizeSpy = sinon.spy(
980
+ mediaCore,
981
+ 'getRecommendedMaxBitrateForFrameSize'
982
+ );
983
+ });
984
+
985
+ afterEach(() => {
986
+ getRecommendedMaxBitrateForFrameSizeSpy.restore();
987
+ });
988
+
989
+ it('returns the default maxPayloadBitsPerSecond if kind is "audio"', () => {
990
+ const mediaRequestManagerAudio = new MediaRequestManager(sendMediaRequestsCallback, {
991
+ degradationPreferences,
992
+ kind: 'audio',
993
+ trimRequestsToNumOfSources: false,
994
+ });
995
+ mediaRequestManagerAudio.setNumCurrentSources(100, 100);
996
+ sendMediaRequestsCallback.resetHistory();
997
+
998
+ mediaRequestManagerAudio.addRequest(
999
+ {
1000
+ policyInfo: {
1001
+ policy: 'receiver-selected',
1002
+ csi: 123,
1003
+ },
1004
+ receiveSlots: [fakeReceiveSlots[0]],
1005
+ codecInfo: undefined,
1006
+ },
1007
+ false
1008
+ );
1009
+
1010
+ mediaRequestManagerAudio.commit();
1011
+
1012
+ checkMediaRequestsSent(
1013
+ [
1014
+ {
1015
+ policy: 'receiver-selected',
1016
+ csi: 123,
1017
+ receiveSlot: fakeWcmeSlots[0],
1018
+ // returns RecommendedOpusBitrates.FB_MONO_MUSIC as expected:
1019
+ maxPayloadBitsPerSecond: 64000,
1020
+ },
1021
+ // set isCodecInfoDefined to false, since we don't pass in a codec info when audio:
1022
+ ],
1023
+ {isCodecInfoDefined: false}
1024
+ );
1025
+
1026
+ assert.notCalled(getRecommendedMaxBitrateForFrameSizeSpy);
1027
+ });
1028
+
1029
+ it('returns the recommended maxPayloadBitsPerSecond if kind is "video"', () => {
1030
+ mediaRequestManager.addRequest(
1031
+ {
1032
+ policyInfo: {
1033
+ policy: 'receiver-selected',
1034
+ csi: 123,
1035
+ },
1036
+ receiveSlots: [fakeReceiveSlots[0]],
1037
+ codecInfo: {
1038
+ codec: 'h264',
1039
+ maxFs: MAX_FS_1080p,
1040
+ maxFps: MAX_FPS,
1041
+ maxMbps: MAX_MBPS_1080p,
1042
+ },
1043
+ },
1044
+ false
1045
+ );
1046
+
1047
+ mediaRequestManager.commit();
1048
+
1049
+ checkMediaRequestsSent([
1050
+ {
1051
+ policy: 'receiver-selected',
1052
+ csi: 123,
1053
+ receiveSlot: fakeWcmeSlots[0],
1054
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
1055
+ maxFs: MAX_FS_1080p,
1056
+ maxMbps: MAX_MBPS_1080p,
1057
+ },
1058
+ ]);
1059
+
1060
+ // calls the utility function as expected with maxFs passed in (no need to do
1061
+ // further tests here, since the util function itself should be tested for different inputs)
1062
+ assert.calledWith(getRecommendedMaxBitrateForFrameSizeSpy, MAX_FS_1080p);
1063
+ });
1064
+ });
1065
+
1066
+ describe('maxMbps', () => {
1067
+ beforeEach(() => {
1068
+ sendMediaRequestsCallback.resetHistory();
1069
+ });
1070
+
1071
+ it('returns the correct maxMbps value', () => {
1072
+ mediaRequestManager.addRequest(
1073
+ {
1074
+ policyInfo: {
1075
+ policy: 'receiver-selected',
1076
+ csi: 123,
1077
+ },
1078
+ receiveSlots: [fakeReceiveSlots[0]],
1079
+ codecInfo: {
1080
+ codec: 'h264',
1081
+ maxFs: MAX_FS_1080p,
1082
+ maxFps: MAX_FPS,
1083
+ // random value to pass in, to show that the output (below) is calculated
1084
+ // from the maxFs and maxFps values only:
1085
+ maxMbps: 123,
1086
+ },
1087
+ },
1088
+ false
1089
+ );
1090
+
1091
+ mediaRequestManager.commit();
1092
+
1093
+ checkMediaRequestsSent([
1094
+ {
1095
+ policy: 'receiver-selected',
1096
+ csi: 123,
1097
+ receiveSlot: fakeWcmeSlots[0],
1098
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
1099
+ maxFs: MAX_FS_1080p,
1100
+ maxMbps: MAX_MBPS_1080p,
1101
+ },
1102
+ ]);
1103
+ });
1104
+ });
1105
+
1106
+ describe('trimming of requested receive slots', () => {
1107
+ beforeEach(() => {
1108
+ mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
1109
+ degradationPreferences,
1110
+ kind: 'video',
1111
+ trimRequestsToNumOfSources: true,
1112
+ });
1113
+ });
1114
+
1115
+ const limitNumAvailableStreams = (preferLiveVideo, limit) => {
1116
+ if (preferLiveVideo) {
1117
+ mediaRequestManager.setNumCurrentSources(100, limit);
1118
+ } else {
1119
+ mediaRequestManager.setNumCurrentSources(limit, 1);
1120
+ }
1121
+ };
1122
+
1123
+ [true, false].forEach((preferLiveVideo) =>
1124
+ describe(`preferLiveVideo=${preferLiveVideo}`, () => {
1125
+ it(`trims the active speaker request with lowest priority first and maintains slot order`, () => {
1126
+ // add some receiver-selected and active-speaker requests, in a mixed up order
1127
+ addReceiverSelectedRequest(100, fakeReceiveSlots[0], MAX_FS_360p, false);
1128
+ addActiveSpeakerRequest( // AS request 1 - it will get 1 slot trimmed
1129
+ 254,
1130
+ [fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
1131
+ MAX_FS_360p,
1132
+ false,
1133
+ preferLiveVideo
1134
+ );
1135
+ addActiveSpeakerRequest( // AS request 2 - lowest priority, it will have all slots trimmed
1136
+ 253,
1137
+ [fakeReceiveSlots[7], fakeReceiveSlots[8], fakeReceiveSlots[9]],
1138
+ MAX_FS_360p,
1139
+ false,
1140
+ preferLiveVideo
1141
+ );
1142
+ addActiveSpeakerRequest( // AS request 3 - highest priority, nothing will be trimmed
1143
+ 255,
1144
+ [fakeReceiveSlots[4], fakeReceiveSlots[5], fakeReceiveSlots[6]],
1145
+ MAX_FS_360p,
1146
+ false,
1147
+ preferLiveVideo
1148
+ );
1149
+ addReceiverSelectedRequest(101, fakeReceiveSlots[10], MAX_FS_360p, false);
1150
+
1151
+ /* Set number of available streams to 7 so that there will be enough sources only for
1152
+ the 2 RS requests and 2 of the 3 AS requests. The lowest priority AS request will
1153
+ have all the slots trimmed, the second lowest priority AS request will have 1 slot trimmed */
1154
+ limitNumAvailableStreams(preferLiveVideo, 7);
1155
+
1156
+ // check what got trimmed
1157
+ checkMediaRequestsSent([
1158
+ {
1159
+ policy: 'receiver-selected',
1160
+ csi: 100,
1161
+ receiveSlot: fakeWcmeSlots[0],
1162
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1163
+ maxFs: MAX_FS_360p,
1164
+ maxMbps: MAX_MBPS_360p,
1165
+ },
1166
+ {
1167
+ policy: 'active-speaker',
1168
+ priority: 254,
1169
+ receiveSlots: [fakeWcmeSlots[1], fakeWcmeSlots[2]], // fakeWcmeSlots[3] got trimmed
1170
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1171
+ maxFs: MAX_FS_360p,
1172
+ maxMbps: MAX_MBPS_360p,
1173
+ },
1174
+ // AS request with priority 253 is missing, because all of its slots got trimmed
1175
+ {
1176
+ policy: 'active-speaker',
1177
+ priority: 255,
1178
+ receiveSlots: [fakeWcmeSlots[4], fakeWcmeSlots[5], fakeWcmeSlots[6]],
1179
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1180
+ maxFs: MAX_FS_360p,
1181
+ maxMbps: MAX_MBPS_360p,
1182
+ },
1183
+ {
1184
+ policy: 'receiver-selected',
1185
+ csi: 101,
1186
+ receiveSlot: fakeWcmeSlots[10],
1187
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1188
+ maxFs: MAX_FS_360p,
1189
+ maxMbps: MAX_MBPS_360p,
1190
+ },
1191
+ ], {preferLiveVideo});
1192
+
1193
+ // now increase the number of available streams so only the last AS request is trimmed by 1
1194
+ limitNumAvailableStreams(preferLiveVideo, 10);
1195
+
1196
+ checkMediaRequestsSent([
1197
+ {
1198
+ policy: 'receiver-selected',
1199
+ csi: 100,
1200
+ receiveSlot: fakeWcmeSlots[0],
1201
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1202
+ maxFs: MAX_FS_360p,
1203
+ maxMbps: MAX_MBPS_360p,
1204
+ },
1205
+ {
1206
+ policy: 'active-speaker',
1207
+ priority: 254,
1208
+ receiveSlots: [fakeWcmeSlots[1], fakeWcmeSlots[2], fakeWcmeSlots[3]], // all slots are used, nothing trimmed
1209
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1210
+ maxFs: MAX_FS_360p,
1211
+ maxMbps: MAX_MBPS_360p,
1212
+ },
1213
+ {
1214
+ policy: 'active-speaker',
1215
+ priority: 253,
1216
+ receiveSlots: [fakeWcmeSlots[7], fakeWcmeSlots[8]], // only 1 slot is trimmed
1217
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1218
+ maxFs: MAX_FS_360p,
1219
+ maxMbps: MAX_MBPS_360p,
1220
+ },
1221
+ {
1222
+ policy: 'active-speaker',
1223
+ priority: 255,
1224
+ receiveSlots: [fakeWcmeSlots[4], fakeWcmeSlots[5], fakeWcmeSlots[6]], // all slots are used, nothing trimmed
1225
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1226
+ maxFs: MAX_FS_360p,
1227
+ maxMbps: MAX_MBPS_360p,
1228
+ },
1229
+ {
1230
+ policy: 'receiver-selected',
1231
+ csi: 101,
1232
+ receiveSlot: fakeWcmeSlots[10],
1233
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1234
+ maxFs: MAX_FS_360p,
1235
+ maxMbps: MAX_MBPS_360p,
1236
+ },
1237
+ ], {preferLiveVideo});
1238
+ })
1239
+
1240
+ it('does not trim the receiver selected requests', async () => {
1241
+ // add some receiver-selected and active-speaker requests, in a mixed up order
1242
+ addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
1243
+ addActiveSpeakerRequest(
1244
+ 255,
1245
+ [fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
1246
+ MAX_FS_360p,
1247
+ false,
1248
+ preferLiveVideo
1249
+ );
1250
+ addReceiverSelectedRequest(201, fakeReceiveSlots[4], MAX_FS_720p, false);
1251
+ addActiveSpeakerRequest(
1252
+ 254,
1253
+ [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
1254
+ MAX_FS_720p,
1255
+ false,
1256
+ preferLiveVideo
1257
+ );
1258
+
1259
+ /* Set number of available streams to 1, which is lower than the number of RS requests,
1260
+ so all AS requests will be trimmed to 0 but RS requests should be unaltered */
1261
+ limitNumAvailableStreams(preferLiveVideo, 1);
1262
+
1263
+ // check what got trimmed - only RS requests should remain
1264
+ checkMediaRequestsSent([
1265
+ {
1266
+ policy: 'receiver-selected',
1267
+ csi: 200,
1268
+ receiveSlot: fakeWcmeSlots[0],
1269
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1270
+ maxFs: MAX_FS_360p,
1271
+ maxMbps: MAX_MBPS_360p,
1272
+ },
1273
+ {
1274
+ policy: 'receiver-selected',
1275
+ csi: 201,
1276
+ receiveSlot: fakeWcmeSlots[4],
1277
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
1278
+ maxFs: MAX_FS_720p,
1279
+ maxMbps: MAX_MBPS_720p,
1280
+ },
1281
+ ], {preferLiveVideo});
1282
+ });
1283
+
1284
+ it('does trimming first and applies degradationPreferences after that', async () => {
1285
+ // add some receiver-selected and active-speaker requests
1286
+ addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
1287
+ addActiveSpeakerRequest(
1288
+ 255,
1289
+ [fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
1290
+ MAX_FS_360p,
1291
+ false,
1292
+ preferLiveVideo
1293
+ );
1294
+ addReceiverSelectedRequest(201, fakeReceiveSlots[4], MAX_FS_720p, false);
1295
+ addActiveSpeakerRequest(
1296
+ 254,
1297
+ [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
1298
+ MAX_FS_720p,
1299
+ false,
1300
+ preferLiveVideo
1301
+ );
1302
+
1303
+ // Set maxMacroblocksLimit to a value that's big enough just for the 2 RS requests and 1 AS with 1 slot of 360p.
1304
+ // but not big enough for all of the RS and AS requests. If maxMacroblocksLimit
1305
+ // was applied first, the resolution of all requests (including RS ones) would be degraded
1306
+ // This test verifies that it's not happening and the resolutions are not affected.
1307
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: MAX_FS_360p + MAX_FS_720p + MAX_FS_360p});
1308
+ sendMediaRequestsCallback.resetHistory();
1309
+
1310
+ /* Limit the num of streams so that only 2 RS requests and 1 AS with 1 slot can be sent out */
1311
+ limitNumAvailableStreams(preferLiveVideo, 3);
1312
+
1313
+ // check what got trimmed - the remaining requests should have unchanged resolutions
1314
+ checkMediaRequestsSent([
1315
+ {
1316
+ policy: 'receiver-selected',
1317
+ csi: 200,
1318
+ receiveSlot: fakeWcmeSlots[0],
1319
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1320
+ maxFs: MAX_FS_360p,
1321
+ maxMbps: MAX_MBPS_360p,
1322
+ },
1323
+ {
1324
+ policy: 'active-speaker',
1325
+ priority: 255,
1326
+ receiveSlots: [fakeWcmeSlots[1]],
1327
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1328
+ maxFs: MAX_FS_360p,
1329
+ maxMbps: MAX_MBPS_360p,
1330
+ },
1331
+ {
1332
+ policy: 'receiver-selected',
1333
+ csi: 201,
1334
+ receiveSlot: fakeWcmeSlots[4],
1335
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
1336
+ maxFs: MAX_FS_720p,
1337
+ maxMbps: MAX_MBPS_720p,
1338
+ },
1339
+ ], {preferLiveVideo});
1340
+ });
1341
+
1342
+ it('trims all AS requests completely until setNumCurrentSources() is called with non-zero values', async () => {
1343
+ // add some receiver-selected and active-speaker requests
1344
+ addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
1345
+ addActiveSpeakerRequest(
1346
+ 255,
1347
+ [fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
1348
+ MAX_FS_360p,
1349
+ false,
1350
+ preferLiveVideo
1351
+ );
1352
+ addActiveSpeakerRequest(
1353
+ 254,
1354
+ [fakeReceiveSlots[5]],
1355
+ MAX_FS_360p,
1356
+ false,
1357
+ preferLiveVideo
1358
+ );
1359
+
1360
+ mediaRequestManager.commit();
1361
+
1362
+ // we're not calling setNumCurrentSources(), so it should use the initial values of 0 for sources count
1363
+ // and completely trim all AS requests to 0
1364
+ checkMediaRequestsSent([
1365
+ {
1366
+ policy: 'receiver-selected',
1367
+ csi: 200,
1368
+ receiveSlot: fakeWcmeSlots[0],
1369
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1370
+ maxFs: MAX_FS_360p,
1371
+ maxMbps: MAX_MBPS_360p,
1372
+ },
1373
+ ], {preferLiveVideo});
1374
+ });
1375
+
1376
+ it('resets num of sources to 0 when reset() is called', async () => {
1377
+ // set available streams to non-zero value
1378
+ limitNumAvailableStreams(preferLiveVideo, 4);
1379
+ sendMediaRequestsCallback.resetHistory();
1380
+
1381
+ // do the reset
1382
+ mediaRequestManager.reset();
1383
+
1384
+ // add some receiver-selected and active-speaker requests
1385
+ addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
1386
+ addActiveSpeakerRequest(
1387
+ 255,
1388
+ [fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
1389
+ MAX_FS_360p,
1390
+ false,
1391
+ preferLiveVideo
1392
+ );
1393
+
1394
+ mediaRequestManager.commit();
1395
+
1396
+ // verify that AS request was trimmed to 0, because we've reset mediaRequestManager so available streams count is 0 now
1397
+ checkMediaRequestsSent([
1398
+ {
1399
+ policy: 'receiver-selected',
1400
+ csi: 200,
1401
+ receiveSlot: fakeWcmeSlots[0],
1402
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1403
+ maxFs: MAX_FS_360p,
1404
+ maxMbps: MAX_MBPS_360p,
1405
+ },
1406
+ ], {preferLiveVideo});
1407
+ });
1408
+ })
1409
+ );
1410
+
1411
+
1412
+ it('throws if there are 2 active-speaker requests with different preferLiveVideo values', () => {
1413
+ addActiveSpeakerRequest(
1414
+ 255,
1415
+ [fakeReceiveSlots[0]],
1416
+ MAX_FS_360p,
1417
+ false,
1418
+ true
1419
+ );
1420
+ addReceiverSelectedRequest(201, fakeReceiveSlots[4], MAX_FS_720p, false);
1421
+ addActiveSpeakerRequest(
1422
+ 254,
1423
+ [fakeReceiveSlots[2]],
1424
+ MAX_FS_360p,
1425
+ false,
1426
+ false
1427
+ );
1428
+
1429
+ assert.throws(() => mediaRequestManager.commit(), 'a mix of active-speaker groups with different values for preferLiveVideo is not supported');
1430
+ })
1431
+ })
769
1432
  });
1433
+ function assertEqual(arg0: any, arg1: string) {
1434
+ throw new Error('Function not implemented.');
1435
+ }
1436
+