@webex/plugin-meetings 3.0.0-beta.12 → 3.0.0-beta.121

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 (519) hide show
  1. package/README.md +45 -1
  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 +48 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +357 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +193 -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 +43 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +995 -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 +5 -26
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +5 -26
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +6 -27
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +5 -26
  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 +5 -26
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +4 -25
  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 +5 -26
  47. package/dist/common/errors/reconnection.js.map +1 -1
  48. package/dist/common/errors/stats.js +5 -26
  49. package/dist/common/errors/stats.js.map +1 -1
  50. package/dist/common/errors/webex-errors.js +6 -41
  51. package/dist/common/errors/webex-errors.js.map +1 -1
  52. package/dist/common/errors/webex-meetings-error.js +1 -24
  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 +35 -61
  67. package/dist/common/logs/request.js.map +1 -1
  68. package/dist/common/queue.js +4 -14
  69. package/dist/common/queue.js.map +1 -1
  70. package/dist/config.js +6 -6
  71. package/dist/config.js.map +1 -1
  72. package/dist/constants.js +196 -53
  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 +294 -0
  83. package/dist/controls-options-manager/util.js.map +1 -0
  84. package/dist/index.js +72 -17
  85. package/dist/index.js.map +1 -1
  86. package/dist/locus-info/controlsUtils.js +95 -29
  87. package/dist/locus-info/controlsUtils.js.map +1 -1
  88. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  89. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  90. package/dist/locus-info/fullState.js +0 -15
  91. package/dist/locus-info/fullState.js.map +1 -1
  92. package/dist/locus-info/hostUtils.js +4 -12
  93. package/dist/locus-info/hostUtils.js.map +1 -1
  94. package/dist/locus-info/index.js +392 -212
  95. package/dist/locus-info/index.js.map +1 -1
  96. package/dist/locus-info/infoUtils.js +0 -38
  97. package/dist/locus-info/infoUtils.js.map +1 -1
  98. package/dist/locus-info/mediaSharesUtils.js +54 -38
  99. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  100. package/dist/locus-info/parser.js +88 -123
  101. package/dist/locus-info/parser.js.map +1 -1
  102. package/dist/locus-info/selfUtils.js +99 -91
  103. package/dist/locus-info/selfUtils.js.map +1 -1
  104. package/dist/media/index.js +55 -165
  105. package/dist/media/index.js.map +1 -1
  106. package/dist/media/properties.js +71 -117
  107. package/dist/media/properties.js.map +1 -1
  108. package/dist/media/util.js +2 -9
  109. package/dist/media/util.js.map +1 -1
  110. package/dist/mediaQualityMetrics/config.js +505 -495
  111. package/dist/mediaQualityMetrics/config.js.map +1 -1
  112. package/dist/meeting/in-meeting-actions.js +67 -14
  113. package/dist/meeting/in-meeting-actions.js.map +1 -1
  114. package/dist/meeting/index.js +2506 -2444
  115. package/dist/meeting/index.js.map +1 -1
  116. package/dist/meeting/locusMediaRequest.js +291 -0
  117. package/dist/meeting/locusMediaRequest.js.map +1 -0
  118. package/dist/meeting/muteState.js +292 -138
  119. package/dist/meeting/muteState.js.map +1 -1
  120. package/dist/meeting/request.js +315 -336
  121. package/dist/meeting/request.js.map +1 -1
  122. package/dist/meeting/request.type.js +7 -0
  123. package/dist/meeting/request.type.js.map +1 -0
  124. package/dist/meeting/state.js +21 -31
  125. package/dist/meeting/state.js.map +1 -1
  126. package/dist/meeting/util.js +462 -583
  127. package/dist/meeting/util.js.map +1 -1
  128. package/dist/meeting-info/collection.js +3 -25
  129. package/dist/meeting-info/collection.js.map +1 -1
  130. package/dist/meeting-info/index.js +10 -33
  131. package/dist/meeting-info/index.js.map +1 -1
  132. package/dist/meeting-info/meeting-info-v2.js +305 -286
  133. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  134. package/dist/meeting-info/request.js +1 -16
  135. package/dist/meeting-info/request.js.map +1 -1
  136. package/dist/meeting-info/util.js +98 -183
  137. package/dist/meeting-info/util.js.map +1 -1
  138. package/dist/meeting-info/utilv2.js +156 -232
  139. package/dist/meeting-info/utilv2.js.map +1 -1
  140. package/dist/meetings/collection.js +24 -20
  141. package/dist/meetings/collection.js.map +1 -1
  142. package/dist/meetings/index.js +675 -593
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +23 -42
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +177 -155
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +89 -88
  149. package/dist/member/index.js.map +1 -1
  150. package/dist/member/types.js +15 -0
  151. package/dist/member/types.js.map +1 -0
  152. package/dist/member/util.js +101 -69
  153. package/dist/member/util.js.map +1 -1
  154. package/dist/members/collection.js +12 -12
  155. package/dist/members/collection.js.map +1 -1
  156. package/dist/members/index.js +166 -205
  157. package/dist/members/index.js.map +1 -1
  158. package/dist/members/request.js +120 -85
  159. package/dist/members/request.js.map +1 -1
  160. package/dist/members/types.js +15 -0
  161. package/dist/members/types.js.map +1 -0
  162. package/dist/members/util.js +314 -260
  163. package/dist/members/util.js.map +1 -1
  164. package/dist/metrics/config.js +50 -16
  165. package/dist/metrics/config.js.map +1 -1
  166. package/dist/metrics/constants.js +3 -7
  167. package/dist/metrics/constants.js.map +1 -1
  168. package/dist/metrics/index.js +93 -162
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +167 -50
  171. package/dist/multistream/mediaRequestManager.js.map +1 -1
  172. package/dist/multistream/receiveSlot.js +58 -65
  173. package/dist/multistream/receiveSlot.js.map +1 -1
  174. package/dist/multistream/receiveSlotManager.js +74 -93
  175. package/dist/multistream/receiveSlotManager.js.map +1 -1
  176. package/dist/multistream/remoteMedia.js +55 -74
  177. package/dist/multistream/remoteMedia.js.map +1 -1
  178. package/dist/multistream/remoteMediaGroup.js +6 -40
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +466 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +32 -59
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +10 -45
  185. package/dist/personal-meeting-room/index.js.map +1 -1
  186. package/dist/personal-meeting-room/request.js +2 -33
  187. package/dist/personal-meeting-room/request.js.map +1 -1
  188. package/dist/personal-meeting-room/util.js +0 -13
  189. package/dist/personal-meeting-room/util.js.map +1 -1
  190. package/dist/reachability/index.js +190 -199
  191. package/dist/reachability/index.js.map +1 -1
  192. package/dist/reachability/request.js +14 -23
  193. package/dist/reachability/request.js.map +1 -1
  194. package/dist/reactions/constants.js +13 -0
  195. package/dist/reactions/constants.js.map +1 -0
  196. package/dist/reactions/reactions.js +2 -4
  197. package/dist/reactions/reactions.js.map +1 -1
  198. package/dist/reactions/reactions.type.js +19 -23
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +326 -465
  201. package/dist/reconnection-manager/index.js.map +1 -1
  202. package/dist/recording-controller/enums.js +17 -0
  203. package/dist/recording-controller/enums.js.map +1 -0
  204. package/dist/recording-controller/index.js +343 -0
  205. package/dist/recording-controller/index.js.map +1 -0
  206. package/dist/recording-controller/util.js +63 -0
  207. package/dist/recording-controller/util.js.map +1 -0
  208. package/dist/roap/index.js +31 -75
  209. package/dist/roap/index.js.map +1 -1
  210. package/dist/roap/request.js +129 -136
  211. package/dist/roap/request.js.map +1 -1
  212. package/dist/roap/turnDiscovery.js +143 -103
  213. package/dist/roap/turnDiscovery.js.map +1 -1
  214. package/dist/statsAnalyzer/global.js +1 -95
  215. package/dist/statsAnalyzer/global.js.map +1 -1
  216. package/dist/statsAnalyzer/index.js +369 -461
  217. package/dist/statsAnalyzer/index.js.map +1 -1
  218. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  219. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  220. package/dist/transcription/index.js +13 -45
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +35 -0
  223. package/dist/types/annotation/constants.d.ts +31 -0
  224. package/dist/types/annotation/index.d.ts +124 -0
  225. package/dist/types/breakouts/breakout.d.ts +8 -0
  226. package/dist/types/breakouts/collection.d.ts +5 -0
  227. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  228. package/dist/types/breakouts/events.d.ts +2 -0
  229. package/dist/types/breakouts/index.d.ts +5 -0
  230. package/dist/types/breakouts/request.d.ts +22 -0
  231. package/dist/types/breakouts/utils.d.ts +15 -0
  232. package/dist/types/common/browser-detection.d.ts +9 -0
  233. package/dist/types/common/collection.d.ts +48 -0
  234. package/dist/types/common/config.d.ts +2 -0
  235. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  236. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  237. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  238. package/dist/types/common/errors/media.d.ts +15 -0
  239. package/dist/types/common/errors/parameter.d.ts +15 -0
  240. package/dist/types/common/errors/password-error.d.ts +15 -0
  241. package/dist/types/common/errors/permission.d.ts +14 -0
  242. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  243. package/dist/types/common/errors/reconnection.d.ts +15 -0
  244. package/dist/types/common/errors/stats.d.ts +15 -0
  245. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  246. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  247. package/dist/types/common/events/events-scope.d.ts +17 -0
  248. package/dist/types/common/events/events.d.ts +12 -0
  249. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  250. package/dist/types/common/events/util.d.ts +2 -0
  251. package/dist/types/common/logs/logger-config.d.ts +2 -0
  252. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  253. package/dist/types/common/logs/request.d.ts +34 -0
  254. package/dist/types/common/queue.d.ts +32 -0
  255. package/dist/types/config.d.ts +78 -0
  256. package/dist/types/constants.d.ts +987 -0
  257. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  258. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  259. package/dist/types/controls-options-manager/index.d.ts +136 -0
  260. package/dist/types/controls-options-manager/types.d.ts +43 -0
  261. package/dist/types/controls-options-manager/util.d.ts +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  264. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  265. package/dist/types/locus-info/fullState.d.ts +2 -0
  266. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  267. package/dist/types/locus-info/index.d.ts +315 -0
  268. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  269. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  270. package/dist/types/locus-info/parser.d.ts +212 -0
  271. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  272. package/dist/types/media/index.d.ts +34 -0
  273. package/dist/types/media/properties.d.ts +108 -0
  274. package/dist/types/media/util.d.ts +2 -0
  275. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  276. package/dist/types/meeting/in-meeting-actions.d.ts +137 -0
  277. package/dist/types/meeting/index.d.ts +1755 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +186 -0
  280. package/dist/types/meeting/request.d.ts +269 -0
  281. package/dist/types/meeting/request.type.d.ts +11 -0
  282. package/dist/types/meeting/state.d.ts +9 -0
  283. package/dist/types/meeting/util.d.ts +76 -0
  284. package/dist/types/meeting-info/collection.d.ts +20 -0
  285. package/dist/types/meeting-info/index.d.ts +57 -0
  286. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  287. package/dist/types/meeting-info/request.d.ts +22 -0
  288. package/dist/types/meeting-info/util.d.ts +2 -0
  289. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  290. package/dist/types/meetings/collection.d.ts +31 -0
  291. package/dist/types/meetings/index.d.ts +345 -0
  292. package/dist/types/meetings/request.d.ts +27 -0
  293. package/dist/types/meetings/util.d.ts +18 -0
  294. package/dist/types/member/index.d.ts +157 -0
  295. package/dist/types/member/types.d.ts +21 -0
  296. package/dist/types/member/util.d.ts +2 -0
  297. package/dist/types/members/collection.d.ts +29 -0
  298. package/dist/types/members/index.d.ts +353 -0
  299. package/dist/types/members/request.d.ts +114 -0
  300. package/dist/types/members/types.d.ts +24 -0
  301. package/dist/types/members/util.d.ts +210 -0
  302. package/dist/types/metrics/config.d.ts +195 -0
  303. package/dist/types/metrics/constants.d.ts +54 -0
  304. package/dist/types/metrics/index.d.ts +169 -0
  305. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  306. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  307. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  308. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  309. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  310. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  311. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  312. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  313. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  314. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  315. package/dist/types/reachability/index.d.ts +152 -0
  316. package/dist/types/reachability/request.d.ts +37 -0
  317. package/dist/types/reactions/constants.d.ts +3 -0
  318. package/dist/types/reactions/reactions.d.ts +4 -0
  319. package/dist/types/reactions/reactions.type.d.ts +52 -0
  320. package/dist/types/reconnection-manager/index.d.ts +126 -0
  321. package/dist/types/recording-controller/enums.d.ts +7 -0
  322. package/dist/types/recording-controller/index.d.ts +193 -0
  323. package/dist/types/recording-controller/util.d.ts +13 -0
  324. package/dist/types/roap/index.d.ts +77 -0
  325. package/dist/types/roap/request.d.ts +36 -0
  326. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  327. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  328. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  329. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  330. package/dist/types/transcription/index.d.ts +64 -0
  331. package/internal-README.md +7 -6
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +42 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +339 -0
  336. package/src/breakouts/README.md +220 -0
  337. package/src/breakouts/breakout.ts +163 -0
  338. package/src/breakouts/collection.ts +19 -0
  339. package/src/breakouts/edit-lock-error.ts +25 -0
  340. package/src/breakouts/events.ts +37 -0
  341. package/src/breakouts/index.ts +861 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/browser-detection.ts +9 -6
  345. package/src/common/collection.ts +3 -1
  346. package/src/common/errors/captcha-error.ts +6 -6
  347. package/src/common/errors/intent-to-join.ts +6 -6
  348. package/src/common/errors/join-meeting.ts +12 -8
  349. package/src/common/errors/media.ts +6 -6
  350. package/src/common/errors/parameter.ts +9 -6
  351. package/src/common/errors/password-error.ts +6 -6
  352. package/src/common/errors/permission.ts +5 -5
  353. package/src/common/errors/reconnection.ts +6 -6
  354. package/src/common/errors/stats.ts +6 -6
  355. package/src/common/errors/webex-errors.ts +7 -5
  356. package/src/common/errors/webex-meetings-error.ts +1 -1
  357. package/src/common/events/events-scope.ts +5 -1
  358. package/src/common/events/events.ts +5 -1
  359. package/src/common/events/trigger-proxy.ts +8 -3
  360. package/src/common/events/util.ts +1 -2
  361. package/src/common/logs/logger-proxy.ts +21 -10
  362. package/src/common/logs/request.ts +11 -8
  363. package/src/config.ts +16 -12
  364. package/src/constants.ts +144 -6
  365. package/src/controls-options-manager/constants.ts +5 -0
  366. package/src/controls-options-manager/enums.ts +18 -0
  367. package/src/controls-options-manager/index.ts +278 -0
  368. package/src/controls-options-manager/types.ts +59 -0
  369. package/src/controls-options-manager/util.ts +281 -0
  370. package/src/index.ts +33 -0
  371. package/src/locus-info/controlsUtils.ts +148 -24
  372. package/src/locus-info/fullState.ts +15 -11
  373. package/src/locus-info/hostUtils.ts +4 -3
  374. package/src/locus-info/index.ts +335 -55
  375. package/src/locus-info/infoUtils.ts +12 -4
  376. package/src/locus-info/mediaSharesUtils.ts +52 -4
  377. package/src/locus-info/parser.ts +46 -68
  378. package/src/locus-info/selfUtils.ts +187 -56
  379. package/src/media/index.ts +139 -196
  380. package/src/media/properties.ts +43 -36
  381. package/src/media/util.ts +1 -1
  382. package/src/mediaQualityMetrics/config.ts +380 -378
  383. package/src/meeting/in-meeting-actions.ts +139 -3
  384. package/src/meeting/index.ts +2733 -1589
  385. package/src/meeting/locusMediaRequest.ts +309 -0
  386. package/src/meeting/muteState.ts +290 -72
  387. package/src/meeting/request.ts +247 -178
  388. package/src/meeting/request.type.ts +13 -0
  389. package/src/meeting/state.ts +45 -30
  390. package/src/meeting/util.ts +444 -395
  391. package/src/meeting-info/collection.ts +2 -1
  392. package/src/meeting-info/index.ts +32 -30
  393. package/src/meeting-info/meeting-info-v2.ts +235 -116
  394. package/src/meeting-info/request.ts +9 -3
  395. package/src/meeting-info/util.ts +54 -46
  396. package/src/meeting-info/utilv2.ts +71 -55
  397. package/src/meetings/collection.ts +21 -1
  398. package/src/meetings/index.ts +749 -437
  399. package/src/meetings/request.ts +29 -25
  400. package/src/meetings/util.ts +122 -33
  401. package/src/member/index.ts +95 -49
  402. package/src/member/types.ts +24 -0
  403. package/src/member/util.ts +106 -13
  404. package/src/members/collection.ts +8 -1
  405. package/src/members/index.ts +288 -130
  406. package/src/members/request.ts +144 -31
  407. package/src/members/types.ts +28 -0
  408. package/src/members/util.ts +316 -235
  409. package/src/metrics/config.ts +302 -90
  410. package/src/metrics/constants.ts +1 -6
  411. package/src/metrics/index.ts +124 -95
  412. package/src/multistream/mediaRequestManager.ts +203 -45
  413. package/src/multistream/receiveSlot.ts +69 -26
  414. package/src/multistream/receiveSlotManager.ts +62 -38
  415. package/src/multistream/remoteMedia.ts +30 -4
  416. package/src/multistream/remoteMediaGroup.ts +4 -3
  417. package/src/multistream/remoteMediaManager.ts +230 -66
  418. package/src/networkQualityMonitor/index.ts +24 -27
  419. package/src/personal-meeting-room/index.ts +12 -16
  420. package/src/personal-meeting-room/request.ts +10 -3
  421. package/src/personal-meeting-room/util.ts +3 -3
  422. package/src/reachability/index.ts +131 -79
  423. package/src/reachability/request.ts +43 -34
  424. package/src/reactions/constants.ts +4 -0
  425. package/src/reactions/reactions.ts +8 -8
  426. package/src/reactions/reactions.type.ts +31 -5
  427. package/src/reconnection-manager/index.ts +193 -111
  428. package/src/recording-controller/enums.ts +8 -0
  429. package/src/recording-controller/index.ts +315 -0
  430. package/src/recording-controller/util.ts +58 -0
  431. package/src/roap/index.ts +53 -53
  432. package/src/roap/request.ts +77 -64
  433. package/src/roap/turnDiscovery.ts +101 -48
  434. package/src/statsAnalyzer/global.ts +8 -104
  435. package/src/statsAnalyzer/index.ts +624 -376
  436. package/src/statsAnalyzer/mqaUtil.ts +203 -90
  437. package/src/transcription/index.ts +34 -32
  438. package/test/integration/spec/converged-space-meetings.js +177 -0
  439. package/test/integration/spec/journey.js +670 -466
  440. package/test/integration/spec/space-meeting.js +320 -204
  441. package/test/integration/spec/transcription.js +7 -8
  442. package/test/unit/spec/annotation/index.ts +436 -0
  443. package/test/unit/spec/breakouts/breakout.ts +203 -0
  444. package/test/unit/spec/breakouts/collection.ts +15 -0
  445. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  446. package/test/unit/spec/breakouts/events.ts +77 -0
  447. package/test/unit/spec/breakouts/index.ts +1611 -0
  448. package/test/unit/spec/breakouts/request.ts +104 -0
  449. package/test/unit/spec/breakouts/utils.js +72 -0
  450. package/test/unit/spec/common/browser-detection.js +9 -28
  451. package/test/unit/spec/controls-options-manager/index.js +287 -0
  452. package/test/unit/spec/controls-options-manager/util.js +504 -0
  453. package/test/unit/spec/fixture/locus.js +93 -90
  454. package/test/unit/spec/locus-info/controlsUtils.js +297 -32
  455. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  456. package/test/unit/spec/locus-info/index.js +598 -5
  457. package/test/unit/spec/locus-info/infoUtils.js +26 -33
  458. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  459. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  460. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  461. package/test/unit/spec/locus-info/parser.js +3 -9
  462. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  463. package/test/unit/spec/locus-info/selfUtils.js +236 -12
  464. package/test/unit/spec/media/index.ts +104 -8
  465. package/test/unit/spec/media/properties.ts +9 -9
  466. package/test/unit/spec/meeting/in-meeting-actions.ts +66 -3
  467. package/test/unit/spec/meeting/index.js +2908 -887
  468. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  469. package/test/unit/spec/meeting/muteState.js +421 -94
  470. package/test/unit/spec/meeting/request.js +421 -79
  471. package/test/unit/spec/meeting/utils.js +308 -189
  472. package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
  473. package/test/unit/spec/meeting-info/request.js +7 -9
  474. package/test/unit/spec/meeting-info/util.js +11 -12
  475. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  476. package/test/unit/spec/meetings/collection.js +15 -1
  477. package/test/unit/spec/meetings/index.js +1052 -329
  478. package/test/unit/spec/meetings/utils.js +163 -14
  479. package/test/unit/spec/member/index.js +24 -1
  480. package/test/unit/spec/member/util.js +383 -32
  481. package/test/unit/spec/members/index.js +424 -55
  482. package/test/unit/spec/members/request.js +228 -40
  483. package/test/unit/spec/members/utils.js +191 -4
  484. package/test/unit/spec/metrics/index.js +113 -20
  485. package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
  486. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  487. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  488. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  489. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  490. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  491. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  492. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  493. package/test/unit/spec/reachability/index.ts +176 -27
  494. package/test/unit/spec/reachability/request.js +66 -0
  495. package/test/unit/spec/reconnection-manager/index.js +62 -31
  496. package/test/unit/spec/recording-controller/index.js +231 -0
  497. package/test/unit/spec/recording-controller/util.js +102 -0
  498. package/test/unit/spec/roap/index.ts +19 -49
  499. package/test/unit/spec/roap/request.ts +187 -0
  500. package/test/unit/spec/roap/turnDiscovery.ts +92 -50
  501. package/test/unit/spec/stats-analyzer/index.js +116 -60
  502. package/test/utils/cmr.js +44 -42
  503. package/test/utils/constants.js +9 -0
  504. package/test/utils/integrationTestUtils.js +64 -0
  505. package/test/utils/testUtils.js +63 -99
  506. package/test/utils/webex-config.js +22 -18
  507. package/test/utils/webex-test-users.js +57 -50
  508. package/tsconfig.json +6 -0
  509. package/dist/media/internal-media-core-wrapper.js +0 -22
  510. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  511. package/dist/meeting/effectsState.js +0 -334
  512. package/dist/meeting/effectsState.js.map +0 -1
  513. package/dist/multistream/multistreamMedia.js +0 -116
  514. package/dist/multistream/multistreamMedia.js.map +0 -1
  515. package/src/index.js +0 -15
  516. package/src/media/internal-media-core-wrapper.ts +0 -9
  517. package/src/meeting/effectsState.ts +0 -211
  518. package/src/multistream/multistreamMedia.ts +0 -92
  519. package/test/unit/spec/meeting/effectsState.js +0 -291
@@ -2,27 +2,46 @@ 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';
5
8
 
6
9
  type ExpectedActiveSpeaker = {
7
10
  policy: 'active-speaker';
11
+ maxPayloadBitsPerSecond?: number;
8
12
  priority: number;
9
13
  receiveSlots: Array<ReceiveSlot>;
14
+ maxFs?: number;
15
+ maxMbps?: number;
10
16
  };
11
17
  type ExpectedReceiverSelected = {
12
18
  policy: 'receiver-selected';
19
+ maxPayloadBitsPerSecond?: number;
13
20
  csi: number;
14
21
  receiveSlot: ReceiveSlot;
22
+ maxFs?: number;
23
+ maxMbps?: number;
15
24
  };
16
25
  type ExpectedRequest = ExpectedActiveSpeaker | ExpectedReceiverSelected;
17
26
 
18
- const maxPayloadBitsPerSecond = 10 * 1000 * 1000; // for now we always send this fixed constant
27
+ const degradationPreferences = {
28
+ maxMacroblocksLimit: Infinity, // no limit
29
+ };
19
30
 
20
31
  describe('MediaRequestManager', () => {
21
32
  const CROSS_PRIORITY_DUPLICATION = true;
22
33
  const CROSS_POLICY_DUPLICATION = true;
23
34
  const PREFER_LIVE_VIDEO = true;
24
- const ACTIVE_SPEAKER_MAX_FS = 3600;
25
- 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;
26
45
 
27
46
  const NUM_SLOTS = 10;
28
47
 
@@ -33,7 +52,10 @@ describe('MediaRequestManager', () => {
33
52
 
34
53
  beforeEach(() => {
35
54
  sendMediaRequestsCallback = sinon.stub();
36
- mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback);
55
+ mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
56
+ degradationPreferences,
57
+ kind: 'video',
58
+ });
37
59
 
38
60
  // create some fake receive slots used by the tests
39
61
  fakeWcmeSlots = Array(NUM_SLOTS)
@@ -48,14 +70,16 @@ describe('MediaRequestManager', () => {
48
70
  (_, index) =>
49
71
  ({
50
72
  id: `fake receive slot ${index}`,
73
+ on: sinon.stub(),
74
+ off: sinon.stub(),
75
+ sourceState: 'live',
51
76
  wcmeReceiveSlot: fakeWcmeSlots[index],
52
- resetSourceState: sinon.stub(),
53
77
  } as unknown as ReceiveSlot)
54
78
  );
55
79
  });
56
80
 
57
81
  // helper function for adding an active speaker request
58
- const addActiveSpeakerRequest = (priority, receiveSlots, commit = false) =>
82
+ const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false) =>
59
83
  mediaRequestManager.addRequest(
60
84
  {
61
85
  policyInfo: {
@@ -68,14 +92,14 @@ describe('MediaRequestManager', () => {
68
92
  receiveSlots,
69
93
  codecInfo: {
70
94
  codec: 'h264',
71
- maxFs: ACTIVE_SPEAKER_MAX_FS,
95
+ maxFs: maxFs,
72
96
  },
73
97
  },
74
98
  commit
75
99
  );
76
100
 
77
101
  // helper function for adding a receiver selected request
78
- const addReceiverSelectedRequest = (csi, receiveSlot, commit = false) =>
102
+ const addReceiverSelectedRequest = (csi, receiveSlot, maxFs, commit = false) =>
79
103
  mediaRequestManager.addRequest(
80
104
  {
81
105
  policyInfo: {
@@ -85,7 +109,7 @@ describe('MediaRequestManager', () => {
85
109
  receiveSlots: [receiveSlot],
86
110
  codecInfo: {
87
111
  codec: 'h264',
88
- maxFs: RECEIVER_SELECTED_MAX_FS,
112
+ maxFs: maxFs,
89
113
  },
90
114
  },
91
115
  commit
@@ -96,7 +120,10 @@ describe('MediaRequestManager', () => {
96
120
  // It should be used only for verifying requests created with
97
121
  // addActiveSpeakerRequest() or addReceiverSelectedRequest(), because of some
98
122
  // hardcoded values used in them
99
- const checkMediaRequestsSent = (expectedRequests: ExpectedRequest[]) => {
123
+ const checkMediaRequestsSent = (
124
+ expectedRequests: ExpectedRequest[],
125
+ isCodecInfoDefined: boolean = true
126
+ ) => {
100
127
  assert.calledOnce(sendMediaRequestsCallback);
101
128
  assert.calledWith(
102
129
  sendMediaRequestsCallback,
@@ -111,15 +138,18 @@ describe('MediaRequestManager', () => {
111
138
  preferLiveVideo: PREFER_LIVE_VIDEO,
112
139
  }),
113
140
  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
- ],
141
+ maxPayloadBitsPerSecond: expectedRequest.maxPayloadBitsPerSecond,
142
+ codecInfos: isCodecInfoDefined
143
+ ? [
144
+ sinon.match({
145
+ payloadType: 0x80,
146
+ h264: sinon.match({
147
+ maxMbps: expectedRequest.maxMbps,
148
+ maxFs: expectedRequest.maxFs,
149
+ }),
150
+ }),
151
+ ]
152
+ : [],
123
153
  });
124
154
  }
125
155
  if (expectedRequest.policy === 'receiver-selected') {
@@ -129,15 +159,18 @@ describe('MediaRequestManager', () => {
129
159
  csi: expectedRequest.csi,
130
160
  }),
131
161
  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
- ],
162
+ maxPayloadBitsPerSecond: expectedRequest.maxPayloadBitsPerSecond,
163
+ codecInfos: isCodecInfoDefined
164
+ ? [
165
+ sinon.match({
166
+ payloadType: 0x80,
167
+ h264: sinon.match({
168
+ maxMbps: expectedRequest.maxMbps,
169
+ maxFs: expectedRequest.maxFs,
170
+ }),
171
+ }),
172
+ ]
173
+ : [],
141
174
  });
142
175
  }
143
176
 
@@ -171,8 +204,8 @@ describe('MediaRequestManager', () => {
171
204
  receiveSlots: [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
172
205
  codecInfo: {
173
206
  codec: 'h264',
174
- maxFs: 1620,
175
- maxFps: 1500,
207
+ maxFs: MAX_FS_360p,
208
+ maxFps: MAX_FPS,
176
209
  },
177
210
  },
178
211
  false
@@ -186,9 +219,9 @@ describe('MediaRequestManager', () => {
186
219
  receiveSlots: [fakeReceiveSlots[3]],
187
220
  codecInfo: {
188
221
  codec: 'h264',
189
- maxFs: 3600,
190
- maxFps: 2500,
191
- maxMbps: 90000,
222
+ maxFs: MAX_FS_720p,
223
+ maxFps: MAX_FPS,
224
+ maxMbps: MAX_MBPS_720p,
192
225
  },
193
226
  },
194
227
  false
@@ -204,9 +237,9 @@ describe('MediaRequestManager', () => {
204
237
  receiveSlots: [fakeReceiveSlots[4]],
205
238
  codecInfo: {
206
239
  codec: 'h264',
207
- maxFs: 8192,
208
- maxFps: 2500,
209
- maxMbps: 204800,
240
+ maxFs: MAX_FS_1080p,
241
+ maxFps: MAX_FPS,
242
+ maxMbps: MAX_MBPS_1080p,
210
243
  },
211
244
  },
212
245
  true
@@ -224,13 +257,14 @@ describe('MediaRequestManager', () => {
224
257
  preferLiveVideo: false,
225
258
  }),
226
259
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
260
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
227
261
  codecInfos: [
228
262
  sinon.match({
229
263
  payloadType: 0x80,
230
264
  h264: sinon.match({
231
- maxFs: 1620,
232
- maxFps: 1500,
233
- maxMbps: 245760,
265
+ maxFs: MAX_FS_360p,
266
+ maxFps: MAX_FPS,
267
+ maxMbps: MAX_MBPS_360p,
234
268
  }),
235
269
  }),
236
270
  ],
@@ -241,13 +275,14 @@ describe('MediaRequestManager', () => {
241
275
  csi: 123,
242
276
  }),
243
277
  receiveSlots: [fakeWcmeSlots[3]],
278
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
244
279
  codecInfos: [
245
280
  sinon.match({
246
281
  payloadType: 0x80,
247
282
  h264: sinon.match({
248
- maxFs: 3600,
249
- maxFps: 2500,
250
- maxMbps: 90000,
283
+ maxFs: MAX_FS_720p,
284
+ maxFps: MAX_FPS,
285
+ maxMbps: MAX_MBPS_720p,
251
286
  }),
252
287
  }),
253
288
  ],
@@ -258,13 +293,14 @@ describe('MediaRequestManager', () => {
258
293
  csi: 123,
259
294
  }),
260
295
  receiveSlots: [fakeWcmeSlots[4]],
296
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
261
297
  codecInfos: [
262
298
  sinon.match({
263
299
  payloadType: 0x80,
264
300
  h264: sinon.match({
265
- maxFs: 8192,
266
- maxFps: 2500,
267
- maxMbps: 204800,
301
+ maxFs: MAX_FS_1080p,
302
+ maxFps: MAX_FPS,
303
+ maxMbps: MAX_MBPS_1080p,
268
304
  }),
269
305
  }),
270
306
  ],
@@ -274,44 +310,83 @@ describe('MediaRequestManager', () => {
274
310
 
275
311
  it('keeps adding requests with every call to addRequest()', () => {
276
312
  // start with 1 request
277
- addReceiverSelectedRequest(100, fakeReceiveSlots[0], true);
313
+ addReceiverSelectedRequest(100, fakeReceiveSlots[0], MAX_FS_1080p, true);
278
314
 
279
315
  checkMediaRequestsSent([
280
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[0]},
316
+ {
317
+ policy: 'receiver-selected',
318
+ csi: 100,
319
+ receiveSlot: fakeWcmeSlots[0],
320
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
321
+ maxFs: MAX_FS_1080p,
322
+ maxMbps: MAX_MBPS_1080p,
323
+ },
281
324
  ]);
282
325
 
283
326
  // now add another one
284
- addReceiverSelectedRequest(101, fakeReceiveSlots[1], true);
327
+ addReceiverSelectedRequest(101, fakeReceiveSlots[1], MAX_FS_1080p, true);
285
328
 
286
329
  checkMediaRequestsSent([
287
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[0]},
288
- {policy: 'receiver-selected', csi: 101, receiveSlot: fakeWcmeSlots[1]},
330
+ {
331
+ policy: 'receiver-selected',
332
+ csi: 100,
333
+ receiveSlot: fakeWcmeSlots[0],
334
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
335
+ maxFs: MAX_FS_1080p,
336
+ maxMbps: MAX_MBPS_1080p,
337
+ },
338
+ {
339
+ policy: 'receiver-selected',
340
+ csi: 101,
341
+ receiveSlot: fakeWcmeSlots[1],
342
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
343
+ maxFs: MAX_FS_1080p,
344
+ maxMbps: MAX_MBPS_1080p,
345
+ },
289
346
  ]);
290
347
 
291
348
  // and one more
292
349
  addActiveSpeakerRequest(
293
350
  1,
294
351
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
352
+ MAX_FS_720p,
295
353
  true
296
354
  );
297
355
 
298
356
  checkMediaRequestsSent([
299
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[0]},
300
- {policy: 'receiver-selected', csi: 101, receiveSlot: fakeWcmeSlots[1]},
357
+ {
358
+ policy: 'receiver-selected',
359
+ csi: 100,
360
+ receiveSlot: fakeWcmeSlots[0],
361
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
362
+ maxFs: MAX_FS_1080p,
363
+ maxMbps: MAX_MBPS_1080p,
364
+ },
365
+ {
366
+ policy: 'receiver-selected',
367
+ csi: 101,
368
+ receiveSlot: fakeWcmeSlots[1],
369
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
370
+ maxFs: MAX_FS_1080p,
371
+ maxMbps: MAX_MBPS_1080p,
372
+ },
301
373
  {
302
374
  policy: 'active-speaker',
303
375
  priority: 1,
304
376
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
377
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
378
+ maxFs: MAX_FS_720p,
379
+ maxMbps: MAX_MBPS_720p,
305
380
  },
306
381
  ]);
307
382
  });
308
383
 
309
384
  it('cancels the requests correctly when cancelRequest() is called with commit=true', () => {
310
385
  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]),
386
+ addActiveSpeakerRequest(255, [fakeReceiveSlots[0], fakeReceiveSlots[1]], MAX_FS_720p),
387
+ addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]], MAX_FS_720p),
388
+ addReceiverSelectedRequest(100, fakeReceiveSlots[4], MAX_FS_1080p),
389
+ addReceiverSelectedRequest(200, fakeReceiveSlots[5], MAX_FS_1080p),
315
390
  ];
316
391
 
317
392
  // cancel one of the active speaker requests
@@ -319,9 +394,30 @@ describe('MediaRequestManager', () => {
319
394
 
320
395
  // expect only the 3 remaining requests to be sent out
321
396
  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]},
397
+ {
398
+ policy: 'active-speaker',
399
+ priority: 255,
400
+ receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
401
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
402
+ maxFs: MAX_FS_720p,
403
+ maxMbps: MAX_MBPS_720p,
404
+ },
405
+ {
406
+ policy: 'receiver-selected',
407
+ csi: 100,
408
+ receiveSlot: fakeWcmeSlots[4],
409
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
410
+ maxFs: MAX_FS_1080p,
411
+ maxMbps: MAX_MBPS_1080p,
412
+ },
413
+ {
414
+ policy: 'receiver-selected',
415
+ csi: 200,
416
+ receiveSlot: fakeWcmeSlots[5],
417
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
418
+ maxFs: MAX_FS_1080p,
419
+ maxMbps: MAX_MBPS_1080p,
420
+ },
325
421
  ]);
326
422
 
327
423
  // cancel one of the receiver selected requests
@@ -329,8 +425,22 @@ describe('MediaRequestManager', () => {
329
425
 
330
426
  // expect only the 2 remaining requests to be sent out
331
427
  checkMediaRequestsSent([
332
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]]},
333
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[4]},
428
+ {
429
+ policy: 'active-speaker',
430
+ priority: 255,
431
+ receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
432
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
433
+ maxFs: MAX_FS_720p,
434
+ maxMbps: MAX_MBPS_720p,
435
+ },
436
+ {
437
+ policy: 'receiver-selected',
438
+ csi: 100,
439
+ receiveSlot: fakeWcmeSlots[4],
440
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
441
+ maxFs: MAX_FS_1080p,
442
+ maxMbps: MAX_MBPS_1080p,
443
+ },
334
444
  ]);
335
445
  });
336
446
 
@@ -338,9 +448,10 @@ describe('MediaRequestManager', () => {
338
448
  addActiveSpeakerRequest(
339
449
  10,
340
450
  [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
451
+ MAX_FS_720p,
341
452
  false
342
453
  );
343
- addReceiverSelectedRequest(123, fakeReceiveSlots[3], false);
454
+ addReceiverSelectedRequest(123, fakeReceiveSlots[3], MAX_FS_1080p, false);
344
455
 
345
456
  // nothing should be sent out as we didn't commit the requests
346
457
  assert.notCalled(sendMediaRequestsCallback);
@@ -354,8 +465,18 @@ describe('MediaRequestManager', () => {
354
465
  policy: 'active-speaker',
355
466
  priority: 10,
356
467
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
468
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
469
+ maxFs: MAX_FS_720p,
470
+ maxMbps: MAX_MBPS_720p,
471
+ },
472
+ {
473
+ policy: 'receiver-selected',
474
+ csi: 123,
475
+ receiveSlot: fakeWcmeSlots[3],
476
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
477
+ maxFs: MAX_FS_1080p,
478
+ maxMbps: MAX_MBPS_1080p,
357
479
  },
358
- {policy: 'receiver-selected', csi: 123, receiveSlot: fakeWcmeSlots[3]},
359
480
  ]);
360
481
  });
361
482
 
@@ -365,11 +486,12 @@ describe('MediaRequestManager', () => {
365
486
  addActiveSpeakerRequest(
366
487
  250,
367
488
  [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
489
+ MAX_FS_720p,
368
490
  false
369
491
  ),
370
- addReceiverSelectedRequest(98765, fakeReceiveSlots[3], false),
371
- addReceiverSelectedRequest(99999, fakeReceiveSlots[4], false),
372
- addReceiverSelectedRequest(88888, fakeReceiveSlots[5], true),
492
+ addReceiverSelectedRequest(98765, fakeReceiveSlots[3], MAX_FS_1080p, false),
493
+ addReceiverSelectedRequest(99999, fakeReceiveSlots[4], MAX_FS_1080p, false),
494
+ addReceiverSelectedRequest(88888, fakeReceiveSlots[5], MAX_FS_1080p, true),
373
495
  ];
374
496
 
375
497
  checkMediaRequestsSent([
@@ -377,10 +499,34 @@ describe('MediaRequestManager', () => {
377
499
  policy: 'active-speaker',
378
500
  priority: 250,
379
501
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
502
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
503
+ maxFs: MAX_FS_720p,
504
+ maxMbps: MAX_MBPS_720p,
505
+ },
506
+ {
507
+ policy: 'receiver-selected',
508
+ csi: 98765,
509
+ receiveSlot: fakeWcmeSlots[3],
510
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
511
+ maxFs: MAX_FS_1080p,
512
+ maxMbps: MAX_MBPS_1080p,
513
+ },
514
+ {
515
+ policy: 'receiver-selected',
516
+ csi: 99999,
517
+ receiveSlot: fakeWcmeSlots[4],
518
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
519
+ maxFs: MAX_FS_1080p,
520
+ maxMbps: MAX_MBPS_1080p,
521
+ },
522
+ {
523
+ policy: 'receiver-selected',
524
+ csi: 88888,
525
+ receiveSlot: fakeWcmeSlots[5],
526
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
527
+ maxFs: MAX_FS_1080p,
528
+ maxMbps: MAX_MBPS_1080p,
380
529
  },
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
530
  ]);
385
531
 
386
532
  // now cancel 3 of them, but with commit=false => nothing should happen
@@ -394,22 +540,31 @@ describe('MediaRequestManager', () => {
394
540
  mediaRequestManager.commit();
395
541
 
396
542
  checkMediaRequestsSent([
397
- {policy: 'receiver-selected', csi: 98765, receiveSlot: fakeWcmeSlots[3]},
543
+ {
544
+ policy: 'receiver-selected',
545
+ csi: 98765,
546
+ receiveSlot: fakeWcmeSlots[3],
547
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
548
+ maxFs: MAX_FS_1080p,
549
+ maxMbps: MAX_MBPS_1080p,
550
+ },
398
551
  ]);
399
552
  });
400
553
 
401
554
  it('sends the wcme media requests when commit() is called', () => {
402
555
  // send some requests, all of them with commit=false
403
- addReceiverSelectedRequest(123000, fakeReceiveSlots[0], false);
404
- addReceiverSelectedRequest(456000, fakeReceiveSlots[1], false);
556
+ addReceiverSelectedRequest(123000, fakeReceiveSlots[0], MAX_FS_1080p, false);
557
+ addReceiverSelectedRequest(456000, fakeReceiveSlots[1], MAX_FS_1080p, false);
405
558
  addActiveSpeakerRequest(
406
559
  255,
407
560
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
561
+ MAX_FS_720p,
408
562
  false
409
563
  );
410
564
  addActiveSpeakerRequest(
411
565
  254,
412
566
  [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
567
+ MAX_FS_720p,
413
568
  false
414
569
  );
415
570
 
@@ -421,56 +576,103 @@ describe('MediaRequestManager', () => {
421
576
 
422
577
  // check that all requests have been sent out
423
578
  checkMediaRequestsSent([
424
- {policy: 'receiver-selected', csi: 123000, receiveSlot: fakeWcmeSlots[0]},
425
- {policy: 'receiver-selected', csi: 456000, receiveSlot: fakeWcmeSlots[1]},
579
+ {
580
+ policy: 'receiver-selected',
581
+ csi: 123000,
582
+ receiveSlot: fakeWcmeSlots[0],
583
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
584
+ maxFs: MAX_FS_1080p,
585
+ maxMbps: MAX_MBPS_1080p,
586
+ },
587
+ {
588
+ policy: 'receiver-selected',
589
+ csi: 456000,
590
+ receiveSlot: fakeWcmeSlots[1],
591
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
592
+ maxFs: MAX_FS_1080p,
593
+ maxMbps: MAX_MBPS_1080p,
594
+ },
426
595
  {
427
596
  policy: 'active-speaker',
428
597
  priority: 255,
429
598
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
599
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
600
+ maxFs: MAX_FS_720p,
601
+ maxMbps: MAX_MBPS_720p,
430
602
  },
431
603
  {
432
604
  policy: 'active-speaker',
433
605
  priority: 254,
434
606
  receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
607
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
608
+ maxFs: MAX_FS_720p,
609
+ maxMbps: MAX_MBPS_720p,
435
610
  },
436
611
  ]);
437
612
  });
438
613
 
439
- it('clears all the requests on reset()', () => {
614
+ it('avoids sending duplicate requests and clears all the requests on reset()', () => {
440
615
  // send some requests and commit them one by one
441
- addReceiverSelectedRequest(1500, fakeReceiveSlots[0], true);
442
- addReceiverSelectedRequest(1501, fakeReceiveSlots[1], true);
616
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
617
+ addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
443
618
  addActiveSpeakerRequest(
444
619
  255,
445
620
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
446
- true
621
+ MAX_FS_720p,
622
+ false
447
623
  );
448
624
  addActiveSpeakerRequest(
449
625
  254,
450
626
  [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
451
- true
627
+ MAX_FS_720p,
628
+ false
452
629
  );
453
630
 
454
- sendMediaRequestsCallback.resetHistory();
631
+ // nothing should be sent out as we didn't commit the requests
632
+ assert.notCalled(sendMediaRequestsCallback);
455
633
 
456
- // check that when calling commit() all requests are re-sent again
457
634
  mediaRequestManager.commit();
458
-
459
635
  checkMediaRequestsSent([
460
- {policy: 'receiver-selected', csi: 1500, receiveSlot: fakeWcmeSlots[0]},
461
- {policy: 'receiver-selected', csi: 1501, receiveSlot: fakeWcmeSlots[1]},
636
+ {
637
+ policy: 'receiver-selected',
638
+ csi: 1500,
639
+ receiveSlot: fakeWcmeSlots[0],
640
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
641
+ maxFs: MAX_FS_1080p,
642
+ maxMbps: MAX_MBPS_1080p,
643
+ },
644
+ {
645
+ policy: 'receiver-selected',
646
+ csi: 1501,
647
+ receiveSlot: fakeWcmeSlots[1],
648
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
649
+ maxFs: MAX_FS_1080p,
650
+ maxMbps: MAX_MBPS_1080p,
651
+ },
462
652
  {
463
653
  policy: 'active-speaker',
464
654
  priority: 255,
465
655
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
656
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
657
+ maxFs: MAX_FS_720p,
658
+ maxMbps: MAX_MBPS_720p,
466
659
  },
467
660
  {
468
661
  policy: 'active-speaker',
469
662
  priority: 254,
470
663
  receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
664
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
665
+ maxFs: MAX_FS_720p,
666
+ maxMbps: MAX_MBPS_720p,
471
667
  },
472
668
  ]);
473
669
 
670
+ // check that when calling commit()
671
+ // all requests are not re-sent again (avoid duplicate requests)
672
+ mediaRequestManager.commit();
673
+
674
+ assert.notCalled(sendMediaRequestsCallback);
675
+
474
676
  // now reset everything
475
677
  mediaRequestManager.reset();
476
678
 
@@ -479,37 +681,380 @@ describe('MediaRequestManager', () => {
479
681
  checkMediaRequestsSent([]);
480
682
  });
481
683
 
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
- ];
684
+ it('makes sure to call requests correctly after reset was called and another request was added', () => {
685
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
686
+
687
+ assert.notCalled(sendMediaRequestsCallback);
489
688
 
490
689
  mediaRequestManager.commit();
491
690
  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]},
691
+ {
692
+ policy: 'receiver-selected',
693
+ csi: 1500,
694
+ receiveSlot: fakeWcmeSlots[0],
695
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
696
+ maxFs: MAX_FS_1080p,
697
+ maxMbps: MAX_MBPS_1080p,
698
+ },
496
699
  ]);
497
700
 
498
- // cancel 2 of the requests
499
- mediaRequestManager.cancelRequest(requestIds[1], false);
500
- mediaRequestManager.cancelRequest(requestIds[3], false);
701
+ // now reset everything
702
+ mediaRequestManager.reset();
501
703
 
704
+ // calling commit now should not cause any requests to be sent out
502
705
  mediaRequestManager.commit();
706
+ checkMediaRequestsSent([]);
503
707
 
504
- // expect only the 2 remaining requests to be sent out
708
+ //add new request
709
+ addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
710
+
711
+ // commit
712
+ mediaRequestManager.commit();
713
+
714
+ // check the new request was sent
505
715
  checkMediaRequestsSent([
506
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]]},
507
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[4]},
716
+ {
717
+ policy: 'receiver-selected',
718
+ csi: 1501,
719
+ receiveSlot: fakeWcmeSlots[1],
720
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
721
+ maxFs: MAX_FS_1080p,
722
+ maxMbps: MAX_MBPS_1080p,
723
+ },
508
724
  ]);
725
+ });
509
726
 
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);
727
+ it('can send same media request after previous requests have been cleared', () => {
728
+ // add a request and commit
729
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
730
+ mediaRequestManager.commit();
731
+ checkMediaRequestsSent([
732
+ {
733
+ policy: 'receiver-selected',
734
+ csi: 1500,
735
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
736
+ receiveSlot: fakeWcmeSlots[0],
737
+ maxFs: MAX_FS_1080p,
738
+ maxMbps: MAX_MBPS_1080p,
739
+ },
740
+ ]);
741
+
742
+ // clear previous requests
743
+ mediaRequestManager.clearPreviousRequests();
744
+
745
+ // commit same request
746
+ mediaRequestManager.commit();
747
+
748
+ // check the request was sent
749
+ checkMediaRequestsSent([
750
+ {
751
+ policy: 'receiver-selected',
752
+ csi: 1500,
753
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
754
+ receiveSlot: fakeWcmeSlots[0],
755
+ maxFs: MAX_FS_1080p,
756
+ maxMbps: MAX_MBPS_1080p,
757
+ },
758
+ ]);
759
+ });
760
+
761
+ it('re-sends media requests after degradation preferences are set', () => {
762
+ // set max macroblocks limit
763
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
764
+ assert.calledOnce(sendMediaRequestsCallback);
765
+ });
766
+
767
+ it('should not degrade max-fs if receive slot sources are not live', () => {
768
+ // set receive slot source states to "no source"
769
+ fakeReceiveSlots.forEach((slot) => {
770
+ slot.sourceState = 'no source';
771
+ });
772
+
773
+ // set max macroblocks limit
774
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
775
+ sendMediaRequestsCallback.resetHistory();
776
+
777
+ // request 4 "large" 1080p streams, which should degrade to 720p if live
778
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 4), getMaxFs('large'), true);
779
+
780
+ // check that resulting requests are 4 "large" 1080p streams
781
+ checkMediaRequestsSent([
782
+ {
783
+ policy: 'active-speaker',
784
+ priority: 255,
785
+ receiveSlots: fakeWcmeSlots.slice(0, 4),
786
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
787
+ maxFs: getMaxFs('large'),
788
+ maxMbps: MAX_MBPS_1080p,
789
+ },
790
+ ]);
791
+ });
792
+
793
+ it('can degrade max-fs once when request exceeds max macroblocks limit', () => {
794
+ // set max macroblocks limit
795
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
796
+ sendMediaRequestsCallback.resetHistory();
797
+
798
+ // request 3 "large" 1080p streams
799
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 3), getMaxFs('large'), false);
800
+
801
+ // request additional "large" 1080p stream to exceed max macroblocks limit
802
+ const additionalRequestId = addReceiverSelectedRequest(
803
+ 123,
804
+ fakeReceiveSlots[3],
805
+ getMaxFs('large'),
806
+ true
807
+ );
808
+
809
+ // check that resulting requests are 4 "medium" 720p streams
810
+ checkMediaRequestsSent([
811
+ {
812
+ policy: 'active-speaker',
813
+ priority: 255,
814
+ receiveSlots: fakeWcmeSlots.slice(0, 3),
815
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
816
+ maxFs: getMaxFs('medium'),
817
+ maxMbps: MAX_MBPS_720p,
818
+ },
819
+ {
820
+ policy: 'receiver-selected',
821
+ csi: 123,
822
+ receiveSlot: fakeWcmeSlots[3],
823
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
824
+ maxFs: getMaxFs('medium'),
825
+ maxMbps: MAX_MBPS_720p,
826
+ },
827
+ ]);
828
+
829
+ // cancel additional request
830
+ mediaRequestManager.cancelRequest(additionalRequestId);
831
+
832
+ // check that resulting requests are 3 "large" 1080p streams
833
+ checkMediaRequestsSent([
834
+ {
835
+ policy: 'active-speaker',
836
+ priority: 255,
837
+ receiveSlots: fakeWcmeSlots.slice(0, 3),
838
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
839
+ maxFs: getMaxFs('large'),
840
+ maxMbps: MAX_MBPS_1080p,
841
+ },
842
+ ]);
843
+ });
844
+
845
+ it('can degrade max-fs multiple times when request exceeds max macroblocks limit', () => {
846
+ // set max macroblocks limit
847
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
848
+ sendMediaRequestsCallback.resetHistory();
849
+
850
+ // request 10 "large" 1080p streams
851
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 10), getMaxFs('large'), true);
852
+
853
+ // check that resulting requests are 10 "small" 360p streams
854
+ checkMediaRequestsSent([
855
+ {
856
+ policy: 'active-speaker',
857
+ priority: 255,
858
+ receiveSlots: fakeWcmeSlots.slice(0, 10),
859
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
860
+ maxFs: getMaxFs('small'),
861
+ maxMbps: MAX_MBPS_360p,
862
+ },
863
+ ]);
864
+ });
865
+
866
+ it('can degrade only the largest max-fs when request exceeds max macroblocks limit', () => {
867
+ // set max macroblocks limit
868
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
869
+ sendMediaRequestsCallback.resetHistory();
870
+
871
+ // request 5 "large" 1080p streams and 5 "small" 360p streams
872
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 5), getMaxFs('large'), false);
873
+ addActiveSpeakerRequest(254, fakeReceiveSlots.slice(5, 10), getMaxFs('small'), true);
874
+
875
+ // check that resulting requests are 5 "medium" 720p streams and 5 "small" 360p streams
876
+ checkMediaRequestsSent([
877
+ {
878
+ policy: 'active-speaker',
879
+ priority: 255,
880
+ receiveSlots: fakeWcmeSlots.slice(0, 5),
881
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
882
+ maxFs: getMaxFs('medium'),
883
+ maxMbps: MAX_MBPS_720p,
884
+ },
885
+ {
886
+ policy: 'active-speaker',
887
+ priority: 254,
888
+ receiveSlots: fakeWcmeSlots.slice(5, 10),
889
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
890
+ maxFs: getMaxFs('small'),
891
+ maxMbps: MAX_MBPS_360p,
892
+ },
893
+ ]);
894
+ });
895
+
896
+ it('respects the preferredMaxFs if set', () => {
897
+ sendMediaRequestsCallback.resetHistory();
898
+ const clock = FakeTimers.install({now: Date.now()});
899
+
900
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 10), getMaxFs('large'), true);
901
+
902
+ sendMediaRequestsCallback.resetHistory();
903
+
904
+ const maxFsHandlerCall = fakeReceiveSlots[0].on.getCall(1);
905
+
906
+ const maxFsHandler = maxFsHandlerCall.args[1];
907
+ const eventName = maxFsHandlerCall.args[0];
908
+
909
+ assert.equal(eventName, 'maxFsUpdate');
910
+
911
+ const preferredFrameSize = 100;
912
+
913
+ maxFsHandler({maxFs: preferredFrameSize});
914
+
915
+ clock.tick(999);
916
+
917
+ assert.notCalled(sendMediaRequestsCallback);
918
+
919
+ clock.tick(1);
920
+
921
+ checkMediaRequestsSent([
922
+ {
923
+ policy: 'active-speaker',
924
+ priority: 255,
925
+ receiveSlots: fakeWcmeSlots.slice(0, 10),
926
+ maxFs: preferredFrameSize,
927
+ maxPayloadBitsPerSecond: 99000,
928
+ maxMbps: 3000,
929
+ },
930
+ ]);
931
+ });
932
+
933
+ describe('maxPayloadBitsPerSecond', () => {
934
+ let getRecommendedMaxBitrateForFrameSizeSpy;
935
+
936
+ beforeEach(() => {
937
+ sendMediaRequestsCallback.resetHistory();
938
+ getRecommendedMaxBitrateForFrameSizeSpy = sinon.spy(
939
+ mediaCore,
940
+ 'getRecommendedMaxBitrateForFrameSize'
941
+ );
942
+ });
943
+
944
+ afterEach(() => {
945
+ getRecommendedMaxBitrateForFrameSizeSpy.restore();
946
+ });
947
+
948
+ it('returns the default maxPayloadBitsPerSecond if kind is "audio"', () => {
949
+ const mediaRequestManagerAudio = new MediaRequestManager(sendMediaRequestsCallback, {
950
+ degradationPreferences,
951
+ kind: 'audio',
952
+ });
953
+ mediaRequestManagerAudio.addRequest(
954
+ {
955
+ policyInfo: {
956
+ policy: 'receiver-selected',
957
+ csi: 123,
958
+ },
959
+ receiveSlots: [fakeReceiveSlots[0]],
960
+ codecInfo: undefined,
961
+ },
962
+ false
963
+ );
964
+
965
+ mediaRequestManagerAudio.commit();
966
+
967
+ checkMediaRequestsSent(
968
+ [
969
+ {
970
+ policy: 'receiver-selected',
971
+ csi: 123,
972
+ receiveSlot: fakeWcmeSlots[0],
973
+ // returns RecommendedOpusBitrates.FB_MONO_MUSIC as expected:
974
+ maxPayloadBitsPerSecond: 64000,
975
+ },
976
+ // set isCodecInfoDefined to false, since we don't pass in a codec info when audio:
977
+ ],
978
+ false
979
+ );
980
+
981
+ assert.notCalled(getRecommendedMaxBitrateForFrameSizeSpy);
982
+ });
983
+
984
+ it('returns the recommended maxPayloadBitsPerSecond if kind is "video"', () => {
985
+ mediaRequestManager.addRequest(
986
+ {
987
+ policyInfo: {
988
+ policy: 'receiver-selected',
989
+ csi: 123,
990
+ },
991
+ receiveSlots: [fakeReceiveSlots[0]],
992
+ codecInfo: {
993
+ codec: 'h264',
994
+ maxFs: MAX_FS_1080p,
995
+ maxFps: MAX_FPS,
996
+ maxMbps: MAX_MBPS_1080p,
997
+ },
998
+ },
999
+ false
1000
+ );
1001
+
1002
+ mediaRequestManager.commit();
1003
+
1004
+ checkMediaRequestsSent([
1005
+ {
1006
+ policy: 'receiver-selected',
1007
+ csi: 123,
1008
+ receiveSlot: fakeWcmeSlots[0],
1009
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
1010
+ maxFs: MAX_FS_1080p,
1011
+ maxMbps: MAX_MBPS_1080p,
1012
+ },
1013
+ ]);
1014
+
1015
+ // calls the utility function as expected with maxFs passed in (no need to do
1016
+ // further tests here, since the util function itself should be tested for different inputs)
1017
+ assert.calledWith(getRecommendedMaxBitrateForFrameSizeSpy, MAX_FS_1080p);
1018
+ });
1019
+ });
1020
+
1021
+ describe('maxMbps', () => {
1022
+ beforeEach(() => {
1023
+ sendMediaRequestsCallback.resetHistory();
1024
+ });
1025
+
1026
+ it('returns the correct maxMbps value', () => {
1027
+ mediaRequestManager.addRequest(
1028
+ {
1029
+ policyInfo: {
1030
+ policy: 'receiver-selected',
1031
+ csi: 123,
1032
+ },
1033
+ receiveSlots: [fakeReceiveSlots[0]],
1034
+ codecInfo: {
1035
+ codec: 'h264',
1036
+ maxFs: MAX_FS_1080p,
1037
+ maxFps: MAX_FPS,
1038
+ // random value to pass in, to show that the output (below) is calculated
1039
+ // from the maxFs and maxFps values only:
1040
+ maxMbps: 123,
1041
+ },
1042
+ },
1043
+ false
1044
+ );
1045
+
1046
+ mediaRequestManager.commit();
1047
+
1048
+ checkMediaRequestsSent([
1049
+ {
1050
+ policy: 'receiver-selected',
1051
+ csi: 123,
1052
+ receiveSlot: fakeWcmeSlots[0],
1053
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
1054
+ maxFs: MAX_FS_1080p,
1055
+ maxMbps: MAX_MBPS_1080p,
1056
+ },
1057
+ ]);
1058
+ });
514
1059
  });
515
1060
  });