@webex/plugin-meetings 3.0.0-beta.4 → 3.0.0-beta.400

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