@webex/plugin-meetings 3.0.0-beta.34 → 3.0.0-beta.340

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