@webex/plugin-meetings 3.0.0-beta.2 → 3.0.0-beta.200

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 (576) hide show
  1. package/README.md +45 -7
  2. package/UPGRADING.md +9 -9
  3. package/browsers.js +19 -24
  4. package/dist/annotation/annotation.types.js +7 -0
  5. package/dist/annotation/annotation.types.js.map +1 -0
  6. package/dist/annotation/constants.js +49 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +342 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +216 -0
  11. package/dist/breakouts/breakout.js.map +1 -0
  12. package/dist/breakouts/collection.js +23 -0
  13. package/dist/breakouts/collection.js.map +1 -0
  14. package/dist/breakouts/edit-lock-error.js +52 -0
  15. package/dist/breakouts/edit-lock-error.js.map +1 -0
  16. package/dist/breakouts/events.js +45 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +1048 -0
  19. package/dist/breakouts/index.js.map +1 -0
  20. package/dist/breakouts/request.js +78 -0
  21. package/dist/breakouts/request.js.map +1 -0
  22. package/dist/breakouts/utils.js +67 -0
  23. package/dist/breakouts/utils.js.map +1 -0
  24. package/dist/common/browser-detection.js +1 -20
  25. package/dist/common/browser-detection.js.map +1 -1
  26. package/dist/common/collection.js +5 -20
  27. package/dist/common/collection.js.map +1 -1
  28. package/dist/common/config.js +0 -7
  29. package/dist/common/config.js.map +1 -1
  30. package/dist/common/errors/captcha-error.js +10 -24
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +11 -24
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +12 -25
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +10 -24
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/parameter.js +5 -33
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +10 -24
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +9 -23
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reconnection-in-progress.js +0 -17
  45. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  46. package/dist/common/errors/reconnection.js +10 -24
  47. package/dist/common/errors/reconnection.js.map +1 -1
  48. package/dist/common/errors/stats.js +10 -24
  49. package/dist/common/errors/stats.js.map +1 -1
  50. package/dist/common/errors/webex-errors.js +9 -43
  51. package/dist/common/errors/webex-errors.js.map +1 -1
  52. package/dist/common/errors/webex-meetings-error.js +5 -25
  53. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  54. package/dist/common/events/events-scope.js +0 -22
  55. package/dist/common/events/events-scope.js.map +1 -1
  56. package/dist/common/events/events.js +0 -23
  57. package/dist/common/events/events.js.map +1 -1
  58. package/dist/common/events/trigger-proxy.js +0 -12
  59. package/dist/common/events/trigger-proxy.js.map +1 -1
  60. package/dist/common/events/util.js +0 -15
  61. package/dist/common/events/util.js.map +1 -1
  62. package/dist/common/logs/logger-config.js +0 -4
  63. package/dist/common/logs/logger-config.js.map +1 -1
  64. package/dist/common/logs/logger-proxy.js +1 -8
  65. package/dist/common/logs/logger-proxy.js.map +1 -1
  66. package/dist/common/logs/request.js +37 -60
  67. package/dist/common/logs/request.js.map +1 -1
  68. package/dist/common/queue.js +28 -23
  69. package/dist/common/queue.js.map +1 -1
  70. package/dist/config.js +8 -13
  71. package/dist/config.js.map +1 -1
  72. package/dist/constants.js +250 -66
  73. package/dist/constants.js.map +1 -1
  74. package/dist/controls-options-manager/constants.js +14 -0
  75. package/dist/controls-options-manager/constants.js.map +1 -0
  76. package/dist/controls-options-manager/enums.js +27 -0
  77. package/dist/controls-options-manager/enums.js.map +1 -0
  78. package/dist/controls-options-manager/index.js +297 -0
  79. package/dist/controls-options-manager/index.js.map +1 -0
  80. package/dist/controls-options-manager/types.js +7 -0
  81. package/dist/controls-options-manager/types.js.map +1 -0
  82. package/dist/controls-options-manager/util.js +319 -0
  83. package/dist/controls-options-manager/util.js.map +1 -0
  84. package/dist/index.js +108 -17
  85. package/dist/index.js.map +1 -1
  86. package/dist/interpretation/collection.js +23 -0
  87. package/dist/interpretation/collection.js.map +1 -0
  88. package/dist/interpretation/index.js +366 -0
  89. package/dist/interpretation/index.js.map +1 -0
  90. package/dist/interpretation/siLanguage.js +25 -0
  91. package/dist/interpretation/siLanguage.js.map +1 -0
  92. package/dist/locus-info/controlsUtils.js +101 -29
  93. package/dist/locus-info/controlsUtils.js.map +1 -1
  94. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  95. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  96. package/dist/locus-info/fullState.js +0 -15
  97. package/dist/locus-info/fullState.js.map +1 -1
  98. package/dist/locus-info/hostUtils.js +4 -12
  99. package/dist/locus-info/hostUtils.js.map +1 -1
  100. package/dist/locus-info/index.js +532 -240
  101. package/dist/locus-info/index.js.map +1 -1
  102. package/dist/locus-info/infoUtils.js +3 -37
  103. package/dist/locus-info/infoUtils.js.map +1 -1
  104. package/dist/locus-info/mediaSharesUtils.js +54 -38
  105. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  106. package/dist/locus-info/parser.js +284 -154
  107. package/dist/locus-info/parser.js.map +1 -1
  108. package/dist/locus-info/selfUtils.js +110 -92
  109. package/dist/locus-info/selfUtils.js.map +1 -1
  110. package/dist/media/index.js +95 -226
  111. package/dist/media/index.js.map +1 -1
  112. package/dist/media/properties.js +99 -194
  113. package/dist/media/properties.js.map +1 -1
  114. package/dist/media/util.js +2 -9
  115. package/dist/media/util.js.map +1 -1
  116. package/dist/mediaQualityMetrics/config.js +505 -495
  117. package/dist/mediaQualityMetrics/config.js.map +1 -1
  118. package/dist/meeting/in-meeting-actions.js +83 -14
  119. package/dist/meeting/in-meeting-actions.js.map +1 -1
  120. package/dist/meeting/index.js +3478 -3563
  121. package/dist/meeting/index.js.map +1 -1
  122. package/dist/meeting/locusMediaRequest.js +291 -0
  123. package/dist/meeting/locusMediaRequest.js.map +1 -0
  124. package/dist/meeting/muteState.js +247 -183
  125. package/dist/meeting/muteState.js.map +1 -1
  126. package/dist/meeting/request.js +344 -344
  127. package/dist/meeting/request.js.map +1 -1
  128. package/dist/meeting/request.type.js +7 -0
  129. package/dist/meeting/request.type.js.map +1 -0
  130. package/dist/meeting/state.js +21 -31
  131. package/dist/meeting/state.js.map +1 -1
  132. package/dist/meeting/util.js +529 -588
  133. package/dist/meeting/util.js.map +1 -1
  134. package/dist/meeting-info/collection.js +6 -25
  135. package/dist/meeting-info/collection.js.map +1 -1
  136. package/dist/meeting-info/index.js +62 -39
  137. package/dist/meeting-info/index.js.map +1 -1
  138. package/dist/meeting-info/meeting-info-v2.js +328 -283
  139. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  140. package/dist/meeting-info/request.js +3 -15
  141. package/dist/meeting-info/request.js.map +1 -1
  142. package/dist/meeting-info/util.js +98 -183
  143. package/dist/meeting-info/util.js.map +1 -1
  144. package/dist/meeting-info/utilv2.js +156 -232
  145. package/dist/meeting-info/utilv2.js.map +1 -1
  146. package/dist/meetings/collection.js +26 -19
  147. package/dist/meetings/collection.js.map +1 -1
  148. package/dist/meetings/index.js +795 -574
  149. package/dist/meetings/index.js.map +1 -1
  150. package/dist/meetings/meetings.types.js +7 -0
  151. package/dist/meetings/meetings.types.js.map +1 -0
  152. package/dist/meetings/request.js +26 -41
  153. package/dist/meetings/request.js.map +1 -1
  154. package/dist/meetings/util.js +186 -155
  155. package/dist/meetings/util.js.map +1 -1
  156. package/dist/member/index.js +126 -85
  157. package/dist/member/index.js.map +1 -1
  158. package/dist/member/types.js +25 -0
  159. package/dist/member/types.js.map +1 -0
  160. package/dist/member/util.js +147 -88
  161. package/dist/member/util.js.map +1 -1
  162. package/dist/members/collection.js +13 -12
  163. package/dist/members/collection.js.map +1 -1
  164. package/dist/members/index.js +178 -204
  165. package/dist/members/index.js.map +1 -1
  166. package/dist/members/request.js +113 -68
  167. package/dist/members/request.js.map +1 -1
  168. package/dist/members/types.js +15 -0
  169. package/dist/members/types.js.map +1 -0
  170. package/dist/members/util.js +314 -260
  171. package/dist/members/util.js.map +1 -1
  172. package/dist/metrics/constants.js +4 -7
  173. package/dist/metrics/constants.js.map +1 -1
  174. package/dist/metrics/index.js +11 -558
  175. package/dist/metrics/index.js.map +1 -1
  176. package/dist/multistream/mediaRequestManager.js +264 -50
  177. package/dist/multistream/mediaRequestManager.js.map +1 -1
  178. package/dist/multistream/receiveSlot.js +58 -65
  179. package/dist/multistream/receiveSlot.js.map +1 -1
  180. package/dist/multistream/receiveSlotManager.js +76 -95
  181. package/dist/multistream/receiveSlotManager.js.map +1 -1
  182. package/dist/multistream/remoteMedia.js +62 -76
  183. package/dist/multistream/remoteMedia.js.map +1 -1
  184. package/dist/multistream/remoteMediaGroup.js +66 -43
  185. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  186. package/dist/multistream/remoteMediaManager.js +502 -442
  187. package/dist/multistream/remoteMediaManager.js.map +1 -1
  188. package/dist/networkQualityMonitor/index.js +40 -59
  189. package/dist/networkQualityMonitor/index.js.map +1 -1
  190. package/dist/personal-meeting-room/index.js +21 -45
  191. package/dist/personal-meeting-room/index.js.map +1 -1
  192. package/dist/personal-meeting-room/request.js +1 -31
  193. package/dist/personal-meeting-room/request.js.map +1 -1
  194. package/dist/personal-meeting-room/util.js +0 -13
  195. package/dist/personal-meeting-room/util.js.map +1 -1
  196. package/dist/reachability/index.js +192 -191
  197. package/dist/reachability/index.js.map +1 -1
  198. package/dist/reachability/request.js +15 -23
  199. package/dist/reachability/request.js.map +1 -1
  200. package/dist/reactions/constants.js +13 -0
  201. package/dist/reactions/constants.js.map +1 -0
  202. package/dist/reactions/reactions.js +109 -0
  203. package/dist/reactions/reactions.js.map +1 -0
  204. package/dist/reactions/reactions.type.js +36 -0
  205. package/dist/reactions/reactions.type.js.map +1 -0
  206. package/dist/reconnection-manager/index.js +384 -476
  207. package/dist/reconnection-manager/index.js.map +1 -1
  208. package/dist/recording-controller/enums.js +17 -0
  209. package/dist/recording-controller/enums.js.map +1 -0
  210. package/dist/recording-controller/index.js +363 -0
  211. package/dist/recording-controller/index.js.map +1 -0
  212. package/dist/recording-controller/util.js +64 -0
  213. package/dist/recording-controller/util.js.map +1 -0
  214. package/dist/roap/index.js +58 -91
  215. package/dist/roap/index.js.map +1 -1
  216. package/dist/roap/request.js +137 -135
  217. package/dist/roap/request.js.map +1 -1
  218. package/dist/roap/turnDiscovery.js +148 -100
  219. package/dist/roap/turnDiscovery.js.map +1 -1
  220. package/dist/rtcMetrics/constants.js +12 -0
  221. package/dist/rtcMetrics/constants.js.map +1 -0
  222. package/dist/rtcMetrics/index.js +115 -0
  223. package/dist/rtcMetrics/index.js.map +1 -0
  224. package/dist/statsAnalyzer/global.js +1 -95
  225. package/dist/statsAnalyzer/global.js.map +1 -1
  226. package/dist/statsAnalyzer/index.js +385 -460
  227. package/dist/statsAnalyzer/index.js.map +1 -1
  228. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  229. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  230. package/dist/transcription/index.js +22 -47
  231. package/dist/transcription/index.js.map +1 -1
  232. package/dist/types/annotation/annotation.types.d.ts +42 -0
  233. package/dist/types/annotation/constants.d.ts +31 -0
  234. package/dist/types/annotation/index.d.ts +117 -0
  235. package/dist/types/breakouts/breakout.d.ts +8 -0
  236. package/dist/types/breakouts/collection.d.ts +5 -0
  237. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  238. package/dist/types/breakouts/events.d.ts +8 -0
  239. package/dist/types/breakouts/index.d.ts +5 -0
  240. package/dist/types/breakouts/request.d.ts +22 -0
  241. package/dist/types/breakouts/utils.d.ts +15 -0
  242. package/dist/types/common/browser-detection.d.ts +9 -0
  243. package/dist/types/common/collection.d.ts +48 -0
  244. package/dist/types/common/config.d.ts +2 -0
  245. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  246. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  247. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  248. package/dist/types/common/errors/media.d.ts +15 -0
  249. package/dist/types/common/errors/parameter.d.ts +15 -0
  250. package/dist/types/common/errors/password-error.d.ts +15 -0
  251. package/dist/types/common/errors/permission.d.ts +14 -0
  252. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  253. package/dist/types/common/errors/reconnection.d.ts +15 -0
  254. package/dist/types/common/errors/stats.d.ts +15 -0
  255. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  256. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  257. package/dist/types/common/events/events-scope.d.ts +17 -0
  258. package/dist/types/common/events/events.d.ts +12 -0
  259. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  260. package/dist/types/common/events/util.d.ts +2 -0
  261. package/dist/types/common/logs/logger-config.d.ts +2 -0
  262. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  263. package/dist/types/common/logs/request.d.ts +34 -0
  264. package/dist/types/common/queue.d.ts +34 -0
  265. package/dist/types/config.d.ts +72 -0
  266. package/dist/types/constants.d.ts +1016 -0
  267. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  268. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  269. package/dist/types/controls-options-manager/index.d.ts +136 -0
  270. package/dist/types/controls-options-manager/types.d.ts +43 -0
  271. package/dist/types/controls-options-manager/util.d.ts +1 -0
  272. package/dist/types/index.d.ts +7 -0
  273. package/dist/types/interpretation/collection.d.ts +5 -0
  274. package/dist/types/interpretation/index.d.ts +5 -0
  275. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  276. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  277. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  278. package/dist/types/locus-info/fullState.d.ts +2 -0
  279. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  280. package/dist/types/locus-info/index.d.ts +322 -0
  281. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  282. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  283. package/dist/types/locus-info/parser.d.ts +271 -0
  284. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  285. package/dist/types/media/index.d.ts +34 -0
  286. package/dist/types/media/properties.d.ts +93 -0
  287. package/dist/types/media/util.d.ts +2 -0
  288. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  289. package/dist/types/meeting/in-meeting-actions.d.ts +153 -0
  290. package/dist/types/meeting/index.d.ts +1471 -0
  291. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  292. package/dist/types/meeting/muteState.d.ts +184 -0
  293. package/dist/types/meeting/request.d.ts +257 -0
  294. package/dist/types/meeting/request.type.d.ts +11 -0
  295. package/dist/types/meeting/state.d.ts +9 -0
  296. package/dist/types/meeting/util.d.ts +78 -0
  297. package/dist/types/meeting-info/collection.d.ts +20 -0
  298. package/dist/types/meeting-info/index.d.ts +62 -0
  299. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  300. package/dist/types/meeting-info/request.d.ts +22 -0
  301. package/dist/types/meeting-info/util.d.ts +2 -0
  302. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  303. package/dist/types/meetings/collection.d.ts +31 -0
  304. package/dist/types/meetings/index.d.ts +367 -0
  305. package/dist/types/meetings/meetings.types.d.ts +4 -0
  306. package/dist/types/meetings/request.d.ts +27 -0
  307. package/dist/types/meetings/util.d.ts +18 -0
  308. package/dist/types/member/index.d.ts +159 -0
  309. package/dist/types/member/types.d.ts +32 -0
  310. package/dist/types/member/util.d.ts +2 -0
  311. package/dist/types/members/collection.d.ts +29 -0
  312. package/dist/types/members/index.d.ts +353 -0
  313. package/dist/types/members/request.d.ts +114 -0
  314. package/dist/types/members/types.d.ts +24 -0
  315. package/dist/types/members/util.d.ts +210 -0
  316. package/dist/types/metrics/constants.d.ts +55 -0
  317. package/dist/types/metrics/index.d.ts +45 -0
  318. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  319. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  320. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  321. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  322. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  323. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  324. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  325. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  326. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  327. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  328. package/dist/types/reachability/index.d.ts +152 -0
  329. package/dist/types/reachability/request.d.ts +37 -0
  330. package/dist/types/reactions/constants.d.ts +3 -0
  331. package/dist/types/reactions/reactions.d.ts +4 -0
  332. package/dist/types/reactions/reactions.type.d.ts +52 -0
  333. package/dist/types/reconnection-manager/index.d.ts +126 -0
  334. package/dist/types/recording-controller/enums.d.ts +7 -0
  335. package/dist/types/recording-controller/index.d.ts +208 -0
  336. package/dist/types/recording-controller/util.d.ts +14 -0
  337. package/dist/types/roap/index.d.ts +77 -0
  338. package/dist/types/roap/request.d.ts +36 -0
  339. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  340. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  341. package/dist/types/rtcMetrics/index.d.ts +46 -0
  342. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  343. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  344. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  345. package/dist/types/transcription/index.d.ts +64 -0
  346. package/internal-README.md +7 -6
  347. package/package.json +29 -21
  348. package/src/annotation/annotation.types.ts +50 -0
  349. package/src/annotation/constants.ts +36 -0
  350. package/src/annotation/index.ts +328 -0
  351. package/src/breakouts/README.md +220 -0
  352. package/src/breakouts/breakout.ts +188 -0
  353. package/src/breakouts/collection.ts +19 -0
  354. package/src/breakouts/edit-lock-error.ts +25 -0
  355. package/src/breakouts/events.ts +56 -0
  356. package/src/breakouts/index.ts +925 -0
  357. package/src/breakouts/request.ts +55 -0
  358. package/src/breakouts/utils.ts +57 -0
  359. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  360. package/src/common/collection.ts +9 -7
  361. package/src/common/{config.js → config.ts} +1 -1
  362. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  363. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  364. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  365. package/src/common/errors/{media.js → media.ts} +11 -7
  366. package/src/common/errors/parameter.ts +11 -7
  367. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  368. package/src/common/errors/{permission.js → permission.ts} +10 -6
  369. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  370. package/src/common/errors/{stats.js → stats.ts} +11 -7
  371. package/src/common/errors/{webex-errors.js → webex-errors.ts} +14 -9
  372. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  373. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  374. package/src/common/events/{events.js → events.ts} +5 -1
  375. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  376. package/src/common/events/{util.js → util.ts} +2 -3
  377. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  378. package/src/common/logs/logger-proxy.ts +44 -0
  379. package/src/common/logs/{request.js → request.ts} +22 -9
  380. package/src/common/queue.ts +22 -9
  381. package/src/{config.js → config.ts} +17 -17
  382. package/src/constants.ts +197 -22
  383. package/src/controls-options-manager/constants.ts +5 -0
  384. package/src/controls-options-manager/enums.ts +18 -0
  385. package/src/controls-options-manager/index.ts +278 -0
  386. package/src/controls-options-manager/types.ts +59 -0
  387. package/src/controls-options-manager/util.ts +300 -0
  388. package/src/index.ts +39 -0
  389. package/src/interpretation/README.md +60 -0
  390. package/src/interpretation/collection.ts +19 -0
  391. package/src/interpretation/index.ts +332 -0
  392. package/src/interpretation/siLanguage.ts +18 -0
  393. package/src/locus-info/controlsUtils.ts +222 -0
  394. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  395. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  396. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  397. package/src/locus-info/{index.js → index.ts} +518 -111
  398. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  399. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +65 -17
  400. package/src/locus-info/{parser.js → parser.ts} +271 -98
  401. package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
  402. package/src/media/index.ts +456 -0
  403. package/src/media/{properties.js → properties.ts} +80 -102
  404. package/src/media/{util.js → util.ts} +2 -2
  405. package/src/mediaQualityMetrics/config.ts +384 -0
  406. package/src/meeting/in-meeting-actions.ts +171 -3
  407. package/src/meeting/index.ts +7070 -0
  408. package/src/meeting/locusMediaRequest.ts +309 -0
  409. package/src/meeting/muteState.ts +450 -0
  410. package/src/meeting/{request.js → request.ts} +354 -214
  411. package/src/meeting/request.type.ts +13 -0
  412. package/src/meeting/{state.js → state.ts} +50 -35
  413. package/src/meeting/util.ts +615 -0
  414. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  415. package/src/meeting-info/index.ts +183 -0
  416. package/src/meeting-info/meeting-info-v2.ts +407 -0
  417. package/src/meeting-info/{request.js → request.ts} +14 -4
  418. package/src/meeting-info/{util.js → util.ts} +60 -51
  419. package/src/meeting-info/{utilv2.js → utilv2.ts} +77 -60
  420. package/src/meetings/{collection.js → collection.ts} +26 -3
  421. package/src/meetings/index.ts +1467 -0
  422. package/src/meetings/meetings.types.ts +12 -0
  423. package/src/meetings/{request.js → request.ts} +34 -25
  424. package/src/meetings/{util.js → util.ts} +137 -36
  425. package/src/member/{index.js → index.ts} +151 -56
  426. package/src/member/types.ts +38 -0
  427. package/src/member/util.ts +383 -0
  428. package/src/members/{collection.js → collection.ts} +10 -2
  429. package/src/members/{index.js → index.ts} +323 -145
  430. package/src/members/request.ts +255 -0
  431. package/src/members/types.ts +28 -0
  432. package/src/members/util.ts +339 -0
  433. package/src/metrics/{constants.js → constants.ts} +2 -6
  434. package/src/metrics/index.ts +73 -0
  435. package/src/multistream/mediaRequestManager.ts +337 -61
  436. package/src/multistream/receiveSlot.ts +69 -26
  437. package/src/multistream/receiveSlotManager.ts +66 -42
  438. package/src/multistream/remoteMedia.ts +40 -5
  439. package/src/multistream/remoteMediaGroup.ts +63 -3
  440. package/src/multistream/remoteMediaManager.ts +263 -66
  441. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  442. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  443. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  444. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  445. package/src/reachability/{index.js → index.ts} +157 -94
  446. package/src/reachability/request.ts +46 -35
  447. package/src/reactions/constants.ts +4 -0
  448. package/src/reactions/reactions.ts +104 -0
  449. package/src/reactions/reactions.type.ts +62 -0
  450. package/src/reconnection-manager/{index.js → index.ts} +254 -136
  451. package/src/recording-controller/enums.ts +8 -0
  452. package/src/recording-controller/index.ts +333 -0
  453. package/src/recording-controller/util.ts +75 -0
  454. package/src/roap/{index.js → index.ts} +86 -78
  455. package/src/roap/request.ts +163 -0
  456. package/src/roap/turnDiscovery.ts +111 -49
  457. package/src/rtcMetrics/constants.ts +3 -0
  458. package/src/rtcMetrics/index.ts +96 -0
  459. package/src/statsAnalyzer/global.ts +37 -0
  460. package/src/statsAnalyzer/index.ts +1272 -0
  461. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  462. package/src/transcription/{index.js → index.ts} +46 -39
  463. package/test/integration/spec/converged-space-meetings.js +233 -0
  464. package/test/integration/spec/journey.js +804 -526
  465. package/test/integration/spec/space-meeting.js +391 -204
  466. package/test/integration/spec/transcription.js +7 -8
  467. package/test/unit/spec/annotation/index.ts +418 -0
  468. package/test/unit/spec/breakouts/breakout.ts +237 -0
  469. package/test/unit/spec/breakouts/collection.ts +15 -0
  470. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  471. package/test/unit/spec/breakouts/events.ts +89 -0
  472. package/test/unit/spec/breakouts/index.ts +1790 -0
  473. package/test/unit/spec/breakouts/request.ts +104 -0
  474. package/test/unit/spec/breakouts/utils.js +72 -0
  475. package/test/unit/spec/common/browser-detection.js +9 -28
  476. package/test/unit/spec/common/queue.js +31 -2
  477. package/test/unit/spec/controls-options-manager/index.js +287 -0
  478. package/test/unit/spec/controls-options-manager/util.js +582 -0
  479. package/test/unit/spec/fixture/locus.js +93 -90
  480. package/test/unit/spec/interpretation/collection.ts +15 -0
  481. package/test/unit/spec/interpretation/index.ts +589 -0
  482. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  483. package/test/unit/spec/locus-info/controlsUtils.js +325 -32
  484. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  485. package/test/unit/spec/locus-info/index.js +1176 -18
  486. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  487. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  488. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  489. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  490. package/test/unit/spec/locus-info/parser.js +65 -31
  491. package/test/unit/spec/locus-info/selfConstant.js +120 -103
  492. package/test/unit/spec/locus-info/selfUtils.js +296 -12
  493. package/test/unit/spec/media/index.ts +162 -68
  494. package/test/unit/spec/media/properties.ts +9 -9
  495. package/test/unit/spec/meeting/in-meeting-actions.ts +82 -3
  496. package/test/unit/spec/meeting/index.js +4569 -1773
  497. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  498. package/test/unit/spec/meeting/muteState.js +382 -211
  499. package/test/unit/spec/meeting/request.js +444 -78
  500. package/test/unit/spec/meeting/utils.js +517 -192
  501. package/test/unit/spec/meeting-info/index.js +181 -0
  502. package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
  503. package/test/unit/spec/meeting-info/request.js +7 -9
  504. package/test/unit/spec/meeting-info/util.js +11 -12
  505. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  506. package/test/unit/spec/meetings/collection.js +15 -1
  507. package/test/unit/spec/meetings/index.js +1254 -330
  508. package/test/unit/spec/meetings/utils.js +220 -14
  509. package/test/unit/spec/member/index.js +58 -5
  510. package/test/unit/spec/member/util.js +494 -26
  511. package/test/unit/spec/members/index.js +423 -55
  512. package/test/unit/spec/members/request.js +228 -40
  513. package/test/unit/spec/members/utils.js +191 -4
  514. package/test/unit/spec/metrics/index.js +12 -66
  515. package/test/unit/spec/multistream/mediaRequestManager.ts +1013 -106
  516. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  517. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  518. package/test/unit/spec/multistream/remoteMedia.ts +40 -2
  519. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  520. package/test/unit/spec/multistream/remoteMediaManager.ts +730 -65
  521. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  522. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  523. package/test/unit/spec/reachability/index.ts +176 -27
  524. package/test/unit/spec/reachability/request.js +66 -0
  525. package/test/unit/spec/reconnection-manager/index.js +155 -9
  526. package/test/unit/spec/recording-controller/index.js +307 -0
  527. package/test/unit/spec/recording-controller/util.js +229 -0
  528. package/test/unit/spec/roap/index.ts +28 -52
  529. package/test/unit/spec/roap/request.ts +225 -0
  530. package/test/unit/spec/roap/turnDiscovery.ts +92 -50
  531. package/test/unit/spec/rtcMetrics/index.ts +60 -0
  532. package/test/unit/spec/stats-analyzer/index.js +116 -60
  533. package/test/utils/cmr.js +44 -42
  534. package/test/utils/constants.js +9 -0
  535. package/test/utils/integrationTestUtils.js +46 -0
  536. package/test/utils/testUtils.js +63 -99
  537. package/test/utils/webex-config.js +22 -18
  538. package/test/utils/webex-test-users.js +57 -50
  539. package/tsconfig.json +6 -0
  540. package/dist/media/internal-media-core-wrapper.js +0 -22
  541. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  542. package/dist/meeting/effectsState.js +0 -327
  543. package/dist/meeting/effectsState.js.map +0 -1
  544. package/dist/metrics/config.js +0 -301
  545. package/dist/metrics/config.js.map +0 -1
  546. package/dist/multistream/multistreamMedia.js +0 -116
  547. package/dist/multistream/multistreamMedia.js.map +0 -1
  548. package/dist/peer-connection-manager/util.js +0 -124
  549. package/dist/peer-connection-manager/util.js.map +0 -1
  550. package/src/common/logs/logger-proxy.js +0 -33
  551. package/src/index.js +0 -15
  552. package/src/locus-info/controlsUtils.js +0 -102
  553. package/src/media/index.js +0 -459
  554. package/src/media/internal-media-core-wrapper.ts +0 -9
  555. package/src/mediaQualityMetrics/config.js +0 -382
  556. package/src/meeting/effectsState.js +0 -205
  557. package/src/meeting/index.js +0 -6284
  558. package/src/meeting/muteState.js +0 -318
  559. package/src/meeting/util.js +0 -506
  560. package/src/meeting-info/index.js +0 -131
  561. package/src/meeting-info/meeting-info-v2.js +0 -255
  562. package/src/meetings/index.js +0 -1015
  563. package/src/member/util.js +0 -254
  564. package/src/members/request.js +0 -131
  565. package/src/members/util.js +0 -258
  566. package/src/metrics/config.js +0 -324
  567. package/src/metrics/index.js +0 -530
  568. package/src/multistream/multistreamMedia.ts +0 -92
  569. package/src/peer-connection-manager/util.ts +0 -117
  570. package/src/roap/request.js +0 -127
  571. package/src/statsAnalyzer/global.js +0 -133
  572. package/src/statsAnalyzer/index.js +0 -1006
  573. package/src/statsAnalyzer/mqaUtil.js +0 -173
  574. package/test/unit/spec/meeting/effectsState.js +0 -291
  575. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  576. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -2,27 +2,48 @@ import {MediaRequestManager} from '@webex/plugin-meetings/src/multistream/mediaR
2
2
  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
+ 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';
5
9
 
6
10
  type ExpectedActiveSpeaker = {
7
11
  policy: 'active-speaker';
12
+ maxPayloadBitsPerSecond?: number;
8
13
  priority: number;
9
14
  receiveSlots: Array<ReceiveSlot>;
15
+ maxFs?: number;
16
+ maxMbps?: number;
10
17
  };
11
18
  type ExpectedReceiverSelected = {
12
19
  policy: 'receiver-selected';
20
+ maxPayloadBitsPerSecond?: number;
13
21
  csi: number;
14
22
  receiveSlot: ReceiveSlot;
23
+ maxFs?: number;
24
+ maxMbps?: number;
15
25
  };
16
26
  type ExpectedRequest = ExpectedActiveSpeaker | ExpectedReceiverSelected;
17
27
 
28
+ const degradationPreferences = {
29
+ maxMacroblocksLimit: Infinity, // no limit
30
+ };
31
+
18
32
  describe('MediaRequestManager', () => {
19
33
  const CROSS_PRIORITY_DUPLICATION = true;
20
34
  const CROSS_POLICY_DUPLICATION = true;
21
- const PREFER_LIVE_VIDEO = true;
22
- const ACTIVE_SPEAKER_MAX_FS = 3600;
23
- const RECEIVER_SELECTED_MAX_FS = 8190;
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;
24
45
 
25
- const NUM_SLOTS = 10;
46
+ const NUM_SLOTS = 15;
26
47
 
27
48
  let mediaRequestManager: MediaRequestManager;
28
49
  let sendMediaRequestsCallback;
@@ -31,7 +52,11 @@ describe('MediaRequestManager', () => {
31
52
 
32
53
  beforeEach(() => {
33
54
  sendMediaRequestsCallback = sinon.stub();
34
- mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback);
55
+ mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
56
+ degradationPreferences,
57
+ kind: 'video',
58
+ trimRequestsToNumOfSources: false,
59
+ });
35
60
 
36
61
  // create some fake receive slots used by the tests
37
62
  fakeWcmeSlots = Array(NUM_SLOTS)
@@ -46,14 +71,16 @@ describe('MediaRequestManager', () => {
46
71
  (_, index) =>
47
72
  ({
48
73
  id: `fake receive slot ${index}`,
74
+ on: sinon.stub(),
75
+ off: sinon.stub(),
76
+ sourceState: 'live',
49
77
  wcmeReceiveSlot: fakeWcmeSlots[index],
50
- resetSourceState: sinon.stub(),
51
78
  } as unknown as ReceiveSlot)
52
79
  );
53
80
  });
54
81
 
55
82
  // helper function for adding an active speaker request
56
- const addActiveSpeakerRequest = (priority, receiveSlots, commit = false) =>
83
+ const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false, preferLiveVideo = true) =>
57
84
  mediaRequestManager.addRequest(
58
85
  {
59
86
  policyInfo: {
@@ -61,19 +88,19 @@ describe('MediaRequestManager', () => {
61
88
  priority,
62
89
  crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
63
90
  crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
64
- preferLiveVideo: PREFER_LIVE_VIDEO,
91
+ preferLiveVideo,
65
92
  },
66
93
  receiveSlots,
67
94
  codecInfo: {
68
95
  codec: 'h264',
69
- maxFs: ACTIVE_SPEAKER_MAX_FS,
96
+ maxFs: maxFs,
70
97
  },
71
98
  },
72
99
  commit
73
100
  );
74
101
 
75
102
  // helper function for adding a receiver selected request
76
- const addReceiverSelectedRequest = (csi, receiveSlot, commit = false) =>
103
+ const addReceiverSelectedRequest = (csi, receiveSlot, maxFs, commit = false) =>
77
104
  mediaRequestManager.addRequest(
78
105
  {
79
106
  policyInfo: {
@@ -83,7 +110,7 @@ describe('MediaRequestManager', () => {
83
110
  receiveSlots: [receiveSlot],
84
111
  codecInfo: {
85
112
  codec: 'h264',
86
- maxFs: RECEIVER_SELECTED_MAX_FS,
113
+ maxFs: maxFs,
87
114
  },
88
115
  },
89
116
  commit
@@ -94,7 +121,12 @@ describe('MediaRequestManager', () => {
94
121
  // It should be used only for verifying requests created with
95
122
  // addActiveSpeakerRequest() or addReceiverSelectedRequest(), because of some
96
123
  // hardcoded values used in them
97
- const checkMediaRequestsSent = (expectedRequests: ExpectedRequest[]) => {
124
+ const checkMediaRequestsSent = (
125
+ expectedRequests: ExpectedRequest[], {
126
+ isCodecInfoDefined = true,
127
+ preferLiveVideo = true,
128
+ } = {}
129
+ ) => {
98
130
  assert.calledOnce(sendMediaRequestsCallback);
99
131
  assert.calledWith(
100
132
  sendMediaRequestsCallback,
@@ -106,17 +138,21 @@ describe('MediaRequestManager', () => {
106
138
  priority: expectedRequest.priority,
107
139
  crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
108
140
  crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
109
- preferLiveVideo: PREFER_LIVE_VIDEO,
141
+ preferLiveVideo,
110
142
  }),
111
143
  receiveSlots: expectedRequest.receiveSlots,
112
- codecInfos: [
113
- sinon.match({
114
- payloadType: 0x80,
115
- h264: sinon.match({
116
- maxFs: ACTIVE_SPEAKER_MAX_FS,
117
- }),
118
- }),
119
- ],
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
+ : [],
120
156
  });
121
157
  }
122
158
  if (expectedRequest.policy === 'receiver-selected') {
@@ -126,14 +162,18 @@ describe('MediaRequestManager', () => {
126
162
  csi: expectedRequest.csi,
127
163
  }),
128
164
  receiveSlots: [expectedRequest.receiveSlot],
129
- codecInfos: [
130
- sinon.match({
131
- payloadType: 0x80,
132
- h264: sinon.match({
133
- maxFs: RECEIVER_SELECTED_MAX_FS,
134
- }),
135
- }),
136
- ],
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
+ : [],
137
177
  });
138
178
  }
139
179
 
@@ -167,8 +207,8 @@ describe('MediaRequestManager', () => {
167
207
  receiveSlots: [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
168
208
  codecInfo: {
169
209
  codec: 'h264',
170
- maxFs: 1620,
171
- maxFps: 1500,
210
+ maxFs: MAX_FS_360p,
211
+ maxFps: MAX_FPS,
172
212
  },
173
213
  },
174
214
  false
@@ -182,9 +222,9 @@ describe('MediaRequestManager', () => {
182
222
  receiveSlots: [fakeReceiveSlots[3]],
183
223
  codecInfo: {
184
224
  codec: 'h264',
185
- maxFs: 3600,
186
- maxFps: 2500,
187
- maxMbps: 90000,
225
+ maxFs: MAX_FS_720p,
226
+ maxFps: MAX_FPS,
227
+ maxMbps: MAX_MBPS_720p,
188
228
  },
189
229
  },
190
230
  false
@@ -200,9 +240,9 @@ describe('MediaRequestManager', () => {
200
240
  receiveSlots: [fakeReceiveSlots[4]],
201
241
  codecInfo: {
202
242
  codec: 'h264',
203
- maxFs: 8192,
204
- maxFps: 2500,
205
- maxMbps: 204800,
243
+ maxFs: MAX_FS_1080p,
244
+ maxFps: MAX_FPS,
245
+ maxMbps: MAX_MBPS_1080p,
206
246
  },
207
247
  },
208
248
  true
@@ -220,13 +260,14 @@ describe('MediaRequestManager', () => {
220
260
  preferLiveVideo: false,
221
261
  }),
222
262
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
263
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
223
264
  codecInfos: [
224
265
  sinon.match({
225
266
  payloadType: 0x80,
226
267
  h264: sinon.match({
227
- maxFs: 1620,
228
- maxFps: 1500,
229
- maxMbps: 245760,
268
+ maxFs: MAX_FS_360p,
269
+ maxFps: MAX_FPS,
270
+ maxMbps: MAX_MBPS_360p,
230
271
  }),
231
272
  }),
232
273
  ],
@@ -237,13 +278,14 @@ describe('MediaRequestManager', () => {
237
278
  csi: 123,
238
279
  }),
239
280
  receiveSlots: [fakeWcmeSlots[3]],
281
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
240
282
  codecInfos: [
241
283
  sinon.match({
242
284
  payloadType: 0x80,
243
285
  h264: sinon.match({
244
- maxFs: 3600,
245
- maxFps: 2500,
246
- maxMbps: 90000,
286
+ maxFs: MAX_FS_720p,
287
+ maxFps: MAX_FPS,
288
+ maxMbps: MAX_MBPS_720p,
247
289
  }),
248
290
  }),
249
291
  ],
@@ -254,13 +296,14 @@ describe('MediaRequestManager', () => {
254
296
  csi: 123,
255
297
  }),
256
298
  receiveSlots: [fakeWcmeSlots[4]],
299
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
257
300
  codecInfos: [
258
301
  sinon.match({
259
302
  payloadType: 0x80,
260
303
  h264: sinon.match({
261
- maxFs: 8192,
262
- maxFps: 2500,
263
- maxMbps: 204800,
304
+ maxFs: MAX_FS_1080p,
305
+ maxFps: MAX_FPS,
306
+ maxMbps: MAX_MBPS_1080p,
264
307
  }),
265
308
  }),
266
309
  ],
@@ -270,44 +313,103 @@ describe('MediaRequestManager', () => {
270
313
 
271
314
  it('keeps adding requests with every call to addRequest()', () => {
272
315
  // start with 1 request
273
- addReceiverSelectedRequest(100, fakeReceiveSlots[0], true);
316
+ addReceiverSelectedRequest(100, fakeReceiveSlots[0], MAX_FS_1080p, true);
274
317
 
275
318
  checkMediaRequestsSent([
276
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[0]},
319
+ {
320
+ policy: 'receiver-selected',
321
+ csi: 100,
322
+ receiveSlot: fakeWcmeSlots[0],
323
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
324
+ maxFs: MAX_FS_1080p,
325
+ maxMbps: MAX_MBPS_1080p,
326
+ },
277
327
  ]);
278
328
 
279
329
  // now add another one
280
- addReceiverSelectedRequest(101, fakeReceiveSlots[1], true);
330
+ addReceiverSelectedRequest(101, fakeReceiveSlots[1], MAX_FS_1080p, true);
281
331
 
282
332
  checkMediaRequestsSent([
283
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[0]},
284
- {policy: 'receiver-selected', csi: 101, receiveSlot: fakeWcmeSlots[1]},
333
+ {
334
+ policy: 'receiver-selected',
335
+ csi: 100,
336
+ receiveSlot: fakeWcmeSlots[0],
337
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
338
+ maxFs: MAX_FS_1080p,
339
+ maxMbps: MAX_MBPS_1080p,
340
+ },
341
+ {
342
+ policy: 'receiver-selected',
343
+ csi: 101,
344
+ receiveSlot: fakeWcmeSlots[1],
345
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
346
+ maxFs: MAX_FS_1080p,
347
+ maxMbps: MAX_MBPS_1080p,
348
+ },
285
349
  ]);
286
350
 
287
351
  // and one more
288
352
  addActiveSpeakerRequest(
289
353
  1,
290
354
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
355
+ MAX_FS_720p,
291
356
  true
292
357
  );
293
358
 
294
359
  checkMediaRequestsSent([
295
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[0]},
296
- {policy: 'receiver-selected', csi: 101, receiveSlot: fakeWcmeSlots[1]},
360
+ {
361
+ policy: 'receiver-selected',
362
+ csi: 100,
363
+ receiveSlot: fakeWcmeSlots[0],
364
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
365
+ maxFs: MAX_FS_1080p,
366
+ maxMbps: MAX_MBPS_1080p,
367
+ },
368
+ {
369
+ policy: 'receiver-selected',
370
+ csi: 101,
371
+ receiveSlot: fakeWcmeSlots[1],
372
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
373
+ maxFs: MAX_FS_1080p,
374
+ maxMbps: MAX_MBPS_1080p,
375
+ },
297
376
  {
298
377
  policy: 'active-speaker',
299
378
  priority: 1,
300
379
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
380
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
381
+ maxFs: MAX_FS_720p,
382
+ maxMbps: MAX_MBPS_720p,
301
383
  },
302
384
  ]);
303
385
  });
304
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
+
305
407
  it('cancels the requests correctly when cancelRequest() is called with commit=true', () => {
306
408
  const requestIds = [
307
- addActiveSpeakerRequest(255, [fakeReceiveSlots[0], fakeReceiveSlots[1]]),
308
- addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]]),
309
- addReceiverSelectedRequest(100, fakeReceiveSlots[4]),
310
- addReceiverSelectedRequest(200, fakeReceiveSlots[5]),
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),
311
413
  ];
312
414
 
313
415
  // cancel one of the active speaker requests
@@ -315,9 +417,30 @@ describe('MediaRequestManager', () => {
315
417
 
316
418
  // expect only the 3 remaining requests to be sent out
317
419
  checkMediaRequestsSent([
318
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]]},
319
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[4]},
320
- {policy: 'receiver-selected', csi: 200, receiveSlot: fakeWcmeSlots[5]},
420
+ {
421
+ policy: 'active-speaker',
422
+ priority: 255,
423
+ receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
424
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
425
+ maxFs: MAX_FS_720p,
426
+ maxMbps: MAX_MBPS_720p,
427
+ },
428
+ {
429
+ policy: 'receiver-selected',
430
+ csi: 100,
431
+ receiveSlot: fakeWcmeSlots[4],
432
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
433
+ maxFs: MAX_FS_1080p,
434
+ maxMbps: MAX_MBPS_1080p,
435
+ },
436
+ {
437
+ policy: 'receiver-selected',
438
+ csi: 200,
439
+ receiveSlot: fakeWcmeSlots[5],
440
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
441
+ maxFs: MAX_FS_1080p,
442
+ maxMbps: MAX_MBPS_1080p,
443
+ },
321
444
  ]);
322
445
 
323
446
  // cancel one of the receiver selected requests
@@ -325,8 +448,22 @@ describe('MediaRequestManager', () => {
325
448
 
326
449
  // expect only the 2 remaining requests to be sent out
327
450
  checkMediaRequestsSent([
328
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]]},
329
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[4]},
451
+ {
452
+ policy: 'active-speaker',
453
+ priority: 255,
454
+ receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
455
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
456
+ maxFs: MAX_FS_720p,
457
+ maxMbps: MAX_MBPS_720p,
458
+ },
459
+ {
460
+ policy: 'receiver-selected',
461
+ csi: 100,
462
+ receiveSlot: fakeWcmeSlots[4],
463
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
464
+ maxFs: MAX_FS_1080p,
465
+ maxMbps: MAX_MBPS_1080p,
466
+ },
330
467
  ]);
331
468
  });
332
469
 
@@ -334,9 +471,10 @@ describe('MediaRequestManager', () => {
334
471
  addActiveSpeakerRequest(
335
472
  10,
336
473
  [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
474
+ MAX_FS_720p,
337
475
  false
338
476
  );
339
- addReceiverSelectedRequest(123, fakeReceiveSlots[3], false);
477
+ addReceiverSelectedRequest(123, fakeReceiveSlots[3], MAX_FS_1080p, false);
340
478
 
341
479
  // nothing should be sent out as we didn't commit the requests
342
480
  assert.notCalled(sendMediaRequestsCallback);
@@ -350,8 +488,18 @@ describe('MediaRequestManager', () => {
350
488
  policy: 'active-speaker',
351
489
  priority: 10,
352
490
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
491
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
492
+ maxFs: MAX_FS_720p,
493
+ maxMbps: MAX_MBPS_720p,
494
+ },
495
+ {
496
+ policy: 'receiver-selected',
497
+ csi: 123,
498
+ receiveSlot: fakeWcmeSlots[3],
499
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
500
+ maxFs: MAX_FS_1080p,
501
+ maxMbps: MAX_MBPS_1080p,
353
502
  },
354
- {policy: 'receiver-selected', csi: 123, receiveSlot: fakeWcmeSlots[3]},
355
503
  ]);
356
504
  });
357
505
 
@@ -361,11 +509,12 @@ describe('MediaRequestManager', () => {
361
509
  addActiveSpeakerRequest(
362
510
  250,
363
511
  [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
512
+ MAX_FS_720p,
364
513
  false
365
514
  ),
366
- addReceiverSelectedRequest(98765, fakeReceiveSlots[3], false),
367
- addReceiverSelectedRequest(99999, fakeReceiveSlots[4], false),
368
- addReceiverSelectedRequest(88888, fakeReceiveSlots[5], 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),
369
518
  ];
370
519
 
371
520
  checkMediaRequestsSent([
@@ -373,10 +522,34 @@ describe('MediaRequestManager', () => {
373
522
  policy: 'active-speaker',
374
523
  priority: 250,
375
524
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
525
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
526
+ maxFs: MAX_FS_720p,
527
+ maxMbps: MAX_MBPS_720p,
528
+ },
529
+ {
530
+ policy: 'receiver-selected',
531
+ csi: 98765,
532
+ receiveSlot: fakeWcmeSlots[3],
533
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
534
+ maxFs: MAX_FS_1080p,
535
+ maxMbps: MAX_MBPS_1080p,
536
+ },
537
+ {
538
+ policy: 'receiver-selected',
539
+ csi: 99999,
540
+ receiveSlot: fakeWcmeSlots[4],
541
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
542
+ maxFs: MAX_FS_1080p,
543
+ maxMbps: MAX_MBPS_1080p,
544
+ },
545
+ {
546
+ policy: 'receiver-selected',
547
+ csi: 88888,
548
+ receiveSlot: fakeWcmeSlots[5],
549
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
550
+ maxFs: MAX_FS_1080p,
551
+ maxMbps: MAX_MBPS_1080p,
376
552
  },
377
- {policy: 'receiver-selected', csi: 98765, receiveSlot: fakeWcmeSlots[3]},
378
- {policy: 'receiver-selected', csi: 99999, receiveSlot: fakeWcmeSlots[4]},
379
- {policy: 'receiver-selected', csi: 88888, receiveSlot: fakeWcmeSlots[5]},
380
553
  ]);
381
554
 
382
555
  // now cancel 3 of them, but with commit=false => nothing should happen
@@ -390,22 +563,31 @@ describe('MediaRequestManager', () => {
390
563
  mediaRequestManager.commit();
391
564
 
392
565
  checkMediaRequestsSent([
393
- {policy: 'receiver-selected', csi: 98765, receiveSlot: fakeWcmeSlots[3]},
566
+ {
567
+ policy: 'receiver-selected',
568
+ csi: 98765,
569
+ receiveSlot: fakeWcmeSlots[3],
570
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
571
+ maxFs: MAX_FS_1080p,
572
+ maxMbps: MAX_MBPS_1080p,
573
+ },
394
574
  ]);
395
575
  });
396
576
 
397
577
  it('sends the wcme media requests when commit() is called', () => {
398
578
  // send some requests, all of them with commit=false
399
- addReceiverSelectedRequest(123000, fakeReceiveSlots[0], false);
400
- addReceiverSelectedRequest(456000, fakeReceiveSlots[1], false);
579
+ addReceiverSelectedRequest(123000, fakeReceiveSlots[0], MAX_FS_1080p, false);
580
+ addReceiverSelectedRequest(456000, fakeReceiveSlots[1], MAX_FS_1080p, false);
401
581
  addActiveSpeakerRequest(
402
582
  255,
403
583
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
584
+ MAX_FS_720p,
404
585
  false
405
586
  );
406
587
  addActiveSpeakerRequest(
407
588
  254,
408
589
  [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
590
+ MAX_FS_720p,
409
591
  false
410
592
  );
411
593
 
@@ -417,56 +599,103 @@ describe('MediaRequestManager', () => {
417
599
 
418
600
  // check that all requests have been sent out
419
601
  checkMediaRequestsSent([
420
- {policy: 'receiver-selected', csi: 123000, receiveSlot: fakeWcmeSlots[0]},
421
- {policy: 'receiver-selected', csi: 456000, receiveSlot: fakeWcmeSlots[1]},
602
+ {
603
+ policy: 'receiver-selected',
604
+ csi: 123000,
605
+ receiveSlot: fakeWcmeSlots[0],
606
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
607
+ maxFs: MAX_FS_1080p,
608
+ maxMbps: MAX_MBPS_1080p,
609
+ },
610
+ {
611
+ policy: 'receiver-selected',
612
+ csi: 456000,
613
+ receiveSlot: fakeWcmeSlots[1],
614
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
615
+ maxFs: MAX_FS_1080p,
616
+ maxMbps: MAX_MBPS_1080p,
617
+ },
422
618
  {
423
619
  policy: 'active-speaker',
424
620
  priority: 255,
425
621
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
622
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
623
+ maxFs: MAX_FS_720p,
624
+ maxMbps: MAX_MBPS_720p,
426
625
  },
427
626
  {
428
627
  policy: 'active-speaker',
429
628
  priority: 254,
430
629
  receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
630
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
631
+ maxFs: MAX_FS_720p,
632
+ maxMbps: MAX_MBPS_720p,
431
633
  },
432
634
  ]);
433
635
  });
434
636
 
435
- it('clears all the requests on reset()', () => {
637
+ it('avoids sending duplicate requests and clears all the requests on reset()', () => {
436
638
  // send some requests and commit them one by one
437
- addReceiverSelectedRequest(1500, fakeReceiveSlots[0], true);
438
- addReceiverSelectedRequest(1501, fakeReceiveSlots[1], true);
639
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
640
+ addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
439
641
  addActiveSpeakerRequest(
440
642
  255,
441
643
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
442
- true
644
+ MAX_FS_720p,
645
+ false
443
646
  );
444
647
  addActiveSpeakerRequest(
445
648
  254,
446
649
  [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
447
- true
650
+ MAX_FS_720p,
651
+ false
448
652
  );
449
653
 
450
- sendMediaRequestsCallback.resetHistory();
654
+ // nothing should be sent out as we didn't commit the requests
655
+ assert.notCalled(sendMediaRequestsCallback);
451
656
 
452
- // check that when calling commit() all requests are re-sent again
453
657
  mediaRequestManager.commit();
454
-
455
658
  checkMediaRequestsSent([
456
- {policy: 'receiver-selected', csi: 1500, receiveSlot: fakeWcmeSlots[0]},
457
- {policy: 'receiver-selected', csi: 1501, receiveSlot: fakeWcmeSlots[1]},
659
+ {
660
+ policy: 'receiver-selected',
661
+ csi: 1500,
662
+ receiveSlot: fakeWcmeSlots[0],
663
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
664
+ maxFs: MAX_FS_1080p,
665
+ maxMbps: MAX_MBPS_1080p,
666
+ },
667
+ {
668
+ policy: 'receiver-selected',
669
+ csi: 1501,
670
+ receiveSlot: fakeWcmeSlots[1],
671
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
672
+ maxFs: MAX_FS_1080p,
673
+ maxMbps: MAX_MBPS_1080p,
674
+ },
458
675
  {
459
676
  policy: 'active-speaker',
460
677
  priority: 255,
461
678
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
679
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
680
+ maxFs: MAX_FS_720p,
681
+ maxMbps: MAX_MBPS_720p,
462
682
  },
463
683
  {
464
684
  policy: 'active-speaker',
465
685
  priority: 254,
466
686
  receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
687
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
688
+ maxFs: MAX_FS_720p,
689
+ maxMbps: MAX_MBPS_720p,
467
690
  },
468
691
  ]);
469
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
+
470
699
  // now reset everything
471
700
  mediaRequestManager.reset();
472
701
 
@@ -475,37 +704,715 @@ describe('MediaRequestManager', () => {
475
704
  checkMediaRequestsSent([]);
476
705
  });
477
706
 
478
- it('calls resetSourceState() on slots that are stopped being used', () => {
479
- const requestIds = [
480
- addActiveSpeakerRequest(255, [fakeReceiveSlots[0], fakeReceiveSlots[1]]),
481
- addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]]),
482
- addReceiverSelectedRequest(100, fakeReceiveSlots[4]),
483
- addReceiverSelectedRequest(200, fakeReceiveSlots[5]),
484
- ];
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);
485
711
 
486
712
  mediaRequestManager.commit();
487
713
  checkMediaRequestsSent([
488
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]]},
489
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3]]},
490
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[4]},
491
- {policy: 'receiver-selected', csi: 200, receiveSlot: fakeWcmeSlots[5]},
714
+ {
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,
721
+ },
492
722
  ]);
493
723
 
494
- // cancel 2 of the requests
495
- mediaRequestManager.cancelRequest(requestIds[1], false);
496
- mediaRequestManager.cancelRequest(requestIds[3], false);
724
+ // now reset everything
725
+ mediaRequestManager.reset();
497
726
 
727
+ // calling commit now should not cause any requests to be sent out
498
728
  mediaRequestManager.commit();
729
+ checkMediaRequestsSent([]);
499
730
 
500
- // expect only the 2 remaining requests to be sent out
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([
739
+ {
740
+ policy: 'receiver-selected',
741
+ csi: 1501,
742
+ receiveSlot: fakeWcmeSlots[1],
743
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
744
+ maxFs: MAX_FS_1080p,
745
+ maxMbps: MAX_MBPS_1080p,
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([
755
+ {
756
+ policy: 'receiver-selected',
757
+ csi: 1500,
758
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
759
+ receiveSlot: fakeWcmeSlots[0],
760
+ maxFs: MAX_FS_1080p,
761
+ maxMbps: MAX_MBPS_1080p,
762
+ },
763
+ ]);
764
+
765
+ // clear previous requests
766
+ mediaRequestManager.clearPreviousRequests();
767
+
768
+ // commit same request
769
+ mediaRequestManager.commit();
770
+
771
+ // check the request was sent
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
+
784
+ it('re-sends media requests after degradation preferences are set', () => {
785
+ // set max macroblocks limit
786
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
787
+ assert.calledOnce(sendMediaRequestsCallback);
788
+ });
789
+
790
+ it('should not degrade max-fs if receive slot sources are not live', () => {
791
+ // set receive slot source states to "no source"
792
+ fakeReceiveSlots.forEach((slot) => {
793
+ slot.sourceState = 'no source';
794
+ });
795
+
796
+ // set max macroblocks limit
797
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
798
+ sendMediaRequestsCallback.resetHistory();
799
+
800
+ // request 4 "large" 1080p streams, which should degrade to 720p if live
801
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 4), getMaxFs('large'), true);
802
+
803
+ // check that resulting requests are 4 "large" 1080p streams
804
+ checkMediaRequestsSent([
805
+ {
806
+ policy: 'active-speaker',
807
+ priority: 255,
808
+ receiveSlots: fakeWcmeSlots.slice(0, 4),
809
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
810
+ maxFs: getMaxFs('large'),
811
+ maxMbps: MAX_MBPS_1080p,
812
+ },
813
+ ]);
814
+ });
815
+
816
+ it('can degrade max-fs once when request exceeds max macroblocks limit', () => {
817
+ // set max macroblocks limit
818
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
819
+ sendMediaRequestsCallback.resetHistory();
820
+
821
+ // request 3 "large" 1080p streams
822
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 3), getMaxFs('large'), false);
823
+
824
+ // request additional "large" 1080p stream to exceed max macroblocks limit
825
+ const additionalRequestId = addReceiverSelectedRequest(
826
+ 123,
827
+ fakeReceiveSlots[3],
828
+ getMaxFs('large'),
829
+ true
830
+ );
831
+
832
+ // check that resulting requests are 4 "medium" 720p streams
833
+ checkMediaRequestsSent([
834
+ {
835
+ policy: 'active-speaker',
836
+ priority: 255,
837
+ receiveSlots: fakeWcmeSlots.slice(0, 3),
838
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
839
+ maxFs: getMaxFs('medium'),
840
+ maxMbps: MAX_MBPS_720p,
841
+ },
842
+ {
843
+ policy: 'receiver-selected',
844
+ csi: 123,
845
+ receiveSlot: fakeWcmeSlots[3],
846
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
847
+ maxFs: getMaxFs('medium'),
848
+ maxMbps: MAX_MBPS_720p,
849
+ },
850
+ ]);
851
+
852
+ // cancel additional request
853
+ mediaRequestManager.cancelRequest(additionalRequestId);
854
+
855
+ // check that resulting requests are 3 "large" 1080p streams
856
+ checkMediaRequestsSent([
857
+ {
858
+ policy: 'active-speaker',
859
+ priority: 255,
860
+ receiveSlots: fakeWcmeSlots.slice(0, 3),
861
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
862
+ maxFs: getMaxFs('large'),
863
+ maxMbps: MAX_MBPS_1080p,
864
+ },
865
+ ]);
866
+ });
867
+
868
+ it('can degrade max-fs multiple times when request exceeds max macroblocks limit', () => {
869
+ // set max macroblocks limit
870
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
871
+ sendMediaRequestsCallback.resetHistory();
872
+
873
+ // request 10 "large" 1080p streams
874
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 10), getMaxFs('large'), true);
875
+
876
+ // check that resulting requests are 10 "small" 360p streams
877
+ checkMediaRequestsSent([
878
+ {
879
+ policy: 'active-speaker',
880
+ priority: 255,
881
+ receiveSlots: fakeWcmeSlots.slice(0, 10),
882
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
883
+ maxFs: getMaxFs('small'),
884
+ maxMbps: MAX_MBPS_360p,
885
+ },
886
+ ]);
887
+ });
888
+
889
+ it('can degrade only the largest max-fs when request exceeds max macroblocks limit', () => {
890
+ // set max macroblocks limit
891
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
892
+ sendMediaRequestsCallback.resetHistory();
893
+
894
+ // request 5 "large" 1080p streams and 5 "small" 360p streams
895
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 5), getMaxFs('large'), false);
896
+ addActiveSpeakerRequest(254, fakeReceiveSlots.slice(5, 10), getMaxFs('small'), true);
897
+
898
+ // check that resulting requests are 5 "medium" 720p streams and 5 "small" 360p streams
501
899
  checkMediaRequestsSent([
502
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]]},
503
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[4]},
900
+ {
901
+ policy: 'active-speaker',
902
+ priority: 255,
903
+ receiveSlots: fakeWcmeSlots.slice(0, 5),
904
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
905
+ maxFs: getMaxFs('medium'),
906
+ maxMbps: MAX_MBPS_720p,
907
+ },
908
+ {
909
+ policy: 'active-speaker',
910
+ priority: 254,
911
+ receiveSlots: fakeWcmeSlots.slice(5, 10),
912
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
913
+ maxFs: getMaxFs('small'),
914
+ maxMbps: MAX_MBPS_360p,
915
+ },
504
916
  ]);
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];
505
931
 
506
- // and that the receive slots of the 2 cancelled ones had resetSourceState() called
507
- assert.calledOnce(fakeReceiveSlots[2].resetSourceState);
508
- assert.calledOnce(fakeReceiveSlots[3].resetSourceState);
509
- assert.calledOnce(fakeReceiveSlots[5].resetSourceState);
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
+ ]);
510
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
+ })
511
1414
  });
1415
+ function assertEqual(arg0: any, arg1: string) {
1416
+ throw new Error('Function not implemented.');
1417
+ }
1418
+