@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.104

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 (548) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.js +48 -0
  6. package/dist/annotation/constants.js.map +1 -0
  7. package/dist/annotation/index.js +357 -0
  8. package/dist/annotation/index.js.map +1 -0
  9. package/dist/breakouts/breakout.js +176 -0
  10. package/dist/breakouts/breakout.js.map +1 -0
  11. package/dist/breakouts/collection.js +23 -0
  12. package/dist/breakouts/collection.js.map +1 -0
  13. package/dist/breakouts/edit-lock-error.js +52 -0
  14. package/dist/breakouts/edit-lock-error.js.map +1 -0
  15. package/dist/breakouts/events.js +43 -0
  16. package/dist/breakouts/events.js.map +1 -0
  17. package/dist/breakouts/index.js +919 -0
  18. package/dist/breakouts/index.js.map +1 -0
  19. package/dist/breakouts/request.js +78 -0
  20. package/dist/breakouts/request.js.map +1 -0
  21. package/dist/breakouts/utils.js +67 -0
  22. package/dist/breakouts/utils.js.map +1 -0
  23. package/dist/common/browser-detection.js +1 -20
  24. package/dist/common/browser-detection.js.map +1 -1
  25. package/dist/common/collection.js +5 -20
  26. package/dist/common/collection.js.map +1 -1
  27. package/dist/common/config.js +0 -7
  28. package/dist/common/config.js.map +1 -1
  29. package/dist/common/errors/captcha-error.js +10 -24
  30. package/dist/common/errors/captcha-error.js.map +1 -1
  31. package/dist/common/errors/intent-to-join.js +11 -24
  32. package/dist/common/errors/intent-to-join.js.map +1 -1
  33. package/dist/common/errors/join-meeting.js +12 -25
  34. package/dist/common/errors/join-meeting.js.map +1 -1
  35. package/dist/common/errors/media.js +10 -24
  36. package/dist/common/errors/media.js.map +1 -1
  37. package/dist/common/errors/parameter.js +5 -33
  38. package/dist/common/errors/parameter.js.map +1 -1
  39. package/dist/common/errors/password-error.js +10 -24
  40. package/dist/common/errors/password-error.js.map +1 -1
  41. package/dist/common/errors/permission.js +9 -23
  42. package/dist/common/errors/permission.js.map +1 -1
  43. package/dist/common/errors/reconnection-in-progress.js +0 -17
  44. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  45. package/dist/common/errors/reconnection.js +10 -24
  46. package/dist/common/errors/reconnection.js.map +1 -1
  47. package/dist/common/errors/stats.js +10 -24
  48. package/dist/common/errors/stats.js.map +1 -1
  49. package/dist/common/errors/webex-errors.js +10 -69
  50. package/dist/common/errors/webex-errors.js.map +1 -1
  51. package/dist/common/errors/webex-meetings-error.js +5 -25
  52. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  53. package/dist/common/events/events-scope.js +0 -22
  54. package/dist/common/events/events-scope.js.map +1 -1
  55. package/dist/common/events/events.js +0 -23
  56. package/dist/common/events/events.js.map +1 -1
  57. package/dist/common/events/trigger-proxy.js +0 -12
  58. package/dist/common/events/trigger-proxy.js.map +1 -1
  59. package/dist/common/events/util.js +0 -15
  60. package/dist/common/events/util.js.map +1 -1
  61. package/dist/common/logs/logger-config.js +0 -4
  62. package/dist/common/logs/logger-config.js.map +1 -1
  63. package/dist/common/logs/logger-proxy.js +1 -8
  64. package/dist/common/logs/logger-proxy.js.map +1 -1
  65. package/dist/common/logs/request.js +37 -60
  66. package/dist/common/logs/request.js.map +1 -1
  67. package/dist/common/queue.js +4 -14
  68. package/dist/common/queue.js.map +1 -1
  69. package/dist/config.js +7 -6
  70. package/dist/config.js.map +1 -1
  71. package/dist/constants.js +184 -122
  72. package/dist/constants.js.map +1 -1
  73. package/dist/controls-options-manager/constants.js +14 -0
  74. package/dist/controls-options-manager/constants.js.map +1 -0
  75. package/dist/controls-options-manager/enums.js +25 -0
  76. package/dist/controls-options-manager/enums.js.map +1 -0
  77. package/dist/controls-options-manager/index.js +297 -0
  78. package/dist/controls-options-manager/index.js.map +1 -0
  79. package/dist/controls-options-manager/types.js +7 -0
  80. package/dist/controls-options-manager/types.js.map +1 -0
  81. package/dist/controls-options-manager/util.js +250 -0
  82. package/dist/controls-options-manager/util.js.map +1 -0
  83. package/dist/index.js +72 -17
  84. package/dist/index.js.map +1 -1
  85. package/dist/locus-info/controlsUtils.js +56 -29
  86. package/dist/locus-info/controlsUtils.js.map +1 -1
  87. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  88. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  89. package/dist/locus-info/fullState.js +0 -15
  90. package/dist/locus-info/fullState.js.map +1 -1
  91. package/dist/locus-info/hostUtils.js +4 -12
  92. package/dist/locus-info/hostUtils.js.map +1 -1
  93. package/dist/locus-info/index.js +362 -208
  94. package/dist/locus-info/index.js.map +1 -1
  95. package/dist/locus-info/infoUtils.js +3 -37
  96. package/dist/locus-info/infoUtils.js.map +1 -1
  97. package/dist/locus-info/mediaSharesUtils.js +12 -38
  98. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  99. package/dist/locus-info/parser.js +92 -118
  100. package/dist/locus-info/parser.js.map +1 -1
  101. package/dist/locus-info/selfUtils.js +99 -91
  102. package/dist/locus-info/selfUtils.js.map +1 -1
  103. package/dist/media/index.js +113 -337
  104. package/dist/media/index.js.map +1 -1
  105. package/dist/media/properties.js +96 -135
  106. package/dist/media/properties.js.map +1 -1
  107. package/dist/media/util.js +1 -35
  108. package/dist/media/util.js.map +1 -1
  109. package/dist/mediaQualityMetrics/config.js +505 -495
  110. package/dist/mediaQualityMetrics/config.js.map +1 -1
  111. package/dist/meeting/in-meeting-actions.js +59 -14
  112. package/dist/meeting/in-meeting-actions.js.map +1 -1
  113. package/dist/meeting/index.js +2909 -2398
  114. package/dist/meeting/index.js.map +1 -1
  115. package/dist/meeting/muteState.js +257 -112
  116. package/dist/meeting/muteState.js.map +1 -1
  117. package/dist/meeting/request.js +330 -264
  118. package/dist/meeting/request.js.map +1 -1
  119. package/dist/meeting/request.type.js +7 -0
  120. package/dist/meeting/request.type.js.map +1 -0
  121. package/dist/meeting/state.js +21 -31
  122. package/dist/meeting/state.js.map +1 -1
  123. package/dist/meeting/util.js +63 -261
  124. package/dist/meeting/util.js.map +1 -1
  125. package/dist/meeting-info/collection.js +6 -25
  126. package/dist/meeting-info/collection.js.map +1 -1
  127. package/dist/meeting-info/index.js +14 -32
  128. package/dist/meeting-info/index.js.map +1 -1
  129. package/dist/meeting-info/meeting-info-v2.js +273 -280
  130. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  131. package/dist/meeting-info/request.js +3 -15
  132. package/dist/meeting-info/request.js.map +1 -1
  133. package/dist/meeting-info/util.js +98 -183
  134. package/dist/meeting-info/util.js.map +1 -1
  135. package/dist/meeting-info/utilv2.js +155 -232
  136. package/dist/meeting-info/utilv2.js.map +1 -1
  137. package/dist/meetings/collection.js +26 -19
  138. package/dist/meetings/collection.js.map +1 -1
  139. package/dist/meetings/index.js +741 -548
  140. package/dist/meetings/index.js.map +1 -1
  141. package/dist/meetings/request.js +26 -41
  142. package/dist/meetings/request.js.map +1 -1
  143. package/dist/meetings/util.js +194 -149
  144. package/dist/meetings/util.js.map +1 -1
  145. package/dist/member/index.js +100 -85
  146. package/dist/member/index.js.map +1 -1
  147. package/dist/member/types.js +15 -0
  148. package/dist/member/types.js.map +1 -0
  149. package/dist/member/util.js +90 -68
  150. package/dist/member/util.js.map +1 -1
  151. package/dist/members/collection.js +13 -12
  152. package/dist/members/collection.js.map +1 -1
  153. package/dist/members/index.js +227 -188
  154. package/dist/members/index.js.map +1 -1
  155. package/dist/members/request.js +54 -39
  156. package/dist/members/request.js.map +1 -1
  157. package/dist/members/types.js +15 -0
  158. package/dist/members/types.js.map +1 -0
  159. package/dist/members/util.js +107 -44
  160. package/dist/members/util.js.map +1 -1
  161. package/dist/metrics/config.js +5 -14
  162. package/dist/metrics/config.js.map +1 -1
  163. package/dist/metrics/constants.js +3 -7
  164. package/dist/metrics/constants.js.map +1 -1
  165. package/dist/metrics/index.js +67 -159
  166. package/dist/metrics/index.js.map +1 -1
  167. package/dist/multistream/mediaRequestManager.js +250 -0
  168. package/dist/multistream/mediaRequestManager.js.map +1 -0
  169. package/dist/multistream/receiveSlot.js +202 -0
  170. package/dist/multistream/receiveSlot.js.map +1 -0
  171. package/dist/multistream/receiveSlotManager.js +176 -0
  172. package/dist/multistream/receiveSlotManager.js.map +1 -0
  173. package/dist/multistream/remoteMedia.js +270 -0
  174. package/dist/multistream/remoteMedia.js.map +1 -0
  175. package/dist/multistream/remoteMediaGroup.js +209 -0
  176. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  177. package/dist/multistream/remoteMediaManager.js +1137 -0
  178. package/dist/multistream/remoteMediaManager.js.map +1 -0
  179. package/dist/networkQualityMonitor/index.js +40 -59
  180. package/dist/networkQualityMonitor/index.js.map +1 -1
  181. package/dist/personal-meeting-room/index.js +21 -45
  182. package/dist/personal-meeting-room/index.js.map +1 -1
  183. package/dist/personal-meeting-room/request.js +1 -31
  184. package/dist/personal-meeting-room/request.js.map +1 -1
  185. package/dist/personal-meeting-room/util.js +0 -13
  186. package/dist/personal-meeting-room/util.js.map +1 -1
  187. package/dist/reachability/index.js +192 -191
  188. package/dist/reachability/index.js.map +1 -1
  189. package/dist/reachability/request.js +15 -23
  190. package/dist/reachability/request.js.map +1 -1
  191. package/dist/reactions/constants.js +13 -0
  192. package/dist/reactions/constants.js.map +1 -0
  193. package/dist/reactions/reactions.js +109 -0
  194. package/dist/reactions/reactions.js.map +1 -0
  195. package/dist/reactions/reactions.type.js +36 -0
  196. package/dist/reactions/reactions.type.js.map +1 -0
  197. package/dist/reconnection-manager/index.js +386 -527
  198. package/dist/reconnection-manager/index.js.map +1 -1
  199. package/dist/recording-controller/enums.js +17 -0
  200. package/dist/recording-controller/enums.js.map +1 -0
  201. package/dist/recording-controller/index.js +343 -0
  202. package/dist/recording-controller/index.js.map +1 -0
  203. package/dist/recording-controller/util.js +63 -0
  204. package/dist/recording-controller/util.js.map +1 -0
  205. package/dist/roap/index.js +84 -286
  206. package/dist/roap/index.js.map +1 -1
  207. package/dist/roap/request.js +138 -238
  208. package/dist/roap/request.js.map +1 -1
  209. package/dist/roap/turnDiscovery.js +164 -102
  210. package/dist/roap/turnDiscovery.js.map +1 -1
  211. package/dist/statsAnalyzer/global.js +1 -93
  212. package/dist/statsAnalyzer/global.js.map +1 -1
  213. package/dist/statsAnalyzer/index.js +399 -470
  214. package/dist/statsAnalyzer/index.js.map +1 -1
  215. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  216. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  217. package/dist/transcription/index.js +22 -47
  218. package/dist/transcription/index.js.map +1 -1
  219. package/dist/types/annotation/annotation.types.d.ts +34 -0
  220. package/dist/types/annotation/constants.d.ts +31 -0
  221. package/dist/types/annotation/index.d.ts +124 -0
  222. package/dist/types/breakouts/breakout.d.ts +8 -0
  223. package/dist/types/breakouts/collection.d.ts +5 -0
  224. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  225. package/dist/types/breakouts/events.d.ts +2 -0
  226. package/dist/types/breakouts/index.d.ts +5 -0
  227. package/dist/types/breakouts/request.d.ts +22 -0
  228. package/dist/types/breakouts/utils.d.ts +15 -0
  229. package/dist/types/common/browser-detection.d.ts +9 -0
  230. package/dist/types/common/collection.d.ts +48 -0
  231. package/dist/types/common/config.d.ts +2 -0
  232. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  233. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  234. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  235. package/dist/types/common/errors/media.d.ts +15 -0
  236. package/dist/types/common/errors/parameter.d.ts +15 -0
  237. package/dist/types/common/errors/password-error.d.ts +15 -0
  238. package/dist/types/common/errors/permission.d.ts +14 -0
  239. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  240. package/dist/types/common/errors/reconnection.d.ts +15 -0
  241. package/dist/types/common/errors/stats.d.ts +15 -0
  242. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  243. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  244. package/dist/types/common/events/events-scope.d.ts +17 -0
  245. package/dist/types/common/events/events.d.ts +12 -0
  246. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  247. package/dist/types/common/events/util.d.ts +2 -0
  248. package/dist/types/common/logs/logger-config.d.ts +2 -0
  249. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  250. package/dist/types/common/logs/request.d.ts +34 -0
  251. package/dist/types/common/queue.d.ts +32 -0
  252. package/dist/types/config.d.ts +78 -0
  253. package/dist/types/constants.d.ts +968 -0
  254. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  255. package/dist/types/controls-options-manager/enums.d.ts +13 -0
  256. package/dist/types/controls-options-manager/index.d.ts +136 -0
  257. package/dist/types/controls-options-manager/types.d.ts +37 -0
  258. package/dist/types/controls-options-manager/util.d.ts +1 -0
  259. package/dist/types/index.d.ts +7 -0
  260. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  261. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  262. package/dist/types/locus-info/fullState.d.ts +2 -0
  263. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  264. package/dist/types/locus-info/index.d.ts +315 -0
  265. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  266. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  267. package/dist/types/locus-info/parser.d.ts +212 -0
  268. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  269. package/dist/types/media/index.d.ts +34 -0
  270. package/dist/types/media/properties.d.ts +108 -0
  271. package/dist/types/media/util.d.ts +2 -0
  272. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  273. package/dist/types/meeting/in-meeting-actions.d.ts +129 -0
  274. package/dist/types/meeting/index.d.ts +1748 -0
  275. package/dist/types/meeting/muteState.d.ts +185 -0
  276. package/dist/types/meeting/request.d.ts +275 -0
  277. package/dist/types/meeting/request.type.d.ts +11 -0
  278. package/dist/types/meeting/state.d.ts +9 -0
  279. package/dist/types/meeting/util.d.ts +2 -0
  280. package/dist/types/meeting-info/collection.d.ts +20 -0
  281. package/dist/types/meeting-info/index.d.ts +57 -0
  282. package/dist/types/meeting-info/meeting-info-v2.d.ts +112 -0
  283. package/dist/types/meeting-info/request.d.ts +22 -0
  284. package/dist/types/meeting-info/util.d.ts +2 -0
  285. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  286. package/dist/types/meetings/collection.d.ts +31 -0
  287. package/dist/types/meetings/index.d.ts +345 -0
  288. package/dist/types/meetings/request.d.ts +27 -0
  289. package/dist/types/meetings/util.d.ts +18 -0
  290. package/dist/types/member/index.d.ts +156 -0
  291. package/dist/types/member/types.d.ts +21 -0
  292. package/dist/types/member/util.d.ts +2 -0
  293. package/dist/types/members/collection.d.ts +29 -0
  294. package/dist/types/members/index.d.ts +353 -0
  295. package/dist/types/members/request.d.ts +69 -0
  296. package/dist/types/members/types.d.ts +24 -0
  297. package/dist/types/members/util.d.ts +2 -0
  298. package/dist/types/metrics/config.d.ts +172 -0
  299. package/dist/types/metrics/constants.d.ts +54 -0
  300. package/dist/types/metrics/index.d.ts +152 -0
  301. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  302. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  303. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  304. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  305. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  306. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  307. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  308. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  309. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  310. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  311. package/dist/types/reachability/index.d.ts +152 -0
  312. package/dist/types/reachability/request.d.ts +37 -0
  313. package/dist/types/reactions/constants.d.ts +3 -0
  314. package/dist/types/reactions/reactions.d.ts +4 -0
  315. package/dist/types/reactions/reactions.type.d.ts +52 -0
  316. package/dist/types/reconnection-manager/index.d.ts +126 -0
  317. package/dist/types/recording-controller/enums.d.ts +7 -0
  318. package/dist/types/recording-controller/index.d.ts +193 -0
  319. package/dist/types/recording-controller/util.d.ts +13 -0
  320. package/dist/types/roap/index.d.ts +77 -0
  321. package/dist/types/roap/request.d.ts +38 -0
  322. package/dist/types/roap/turnDiscovery.d.ts +88 -0
  323. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  324. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  325. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  326. package/dist/types/transcription/index.d.ts +64 -0
  327. package/internal-README.md +7 -6
  328. package/package.json +29 -21
  329. package/src/annotation/annotation.types.ts +41 -0
  330. package/src/annotation/constants.ts +36 -0
  331. package/src/annotation/index.ts +339 -0
  332. package/src/breakouts/README.md +219 -0
  333. package/src/breakouts/breakout.ts +141 -0
  334. package/src/breakouts/collection.ts +19 -0
  335. package/src/breakouts/edit-lock-error.ts +25 -0
  336. package/src/breakouts/events.ts +37 -0
  337. package/src/breakouts/index.ts +823 -0
  338. package/src/breakouts/request.ts +55 -0
  339. package/src/breakouts/utils.ts +57 -0
  340. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  341. package/src/common/collection.ts +9 -7
  342. package/src/common/{config.js → config.ts} +1 -1
  343. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  344. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  345. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  346. package/src/common/errors/{media.js → media.ts} +11 -7
  347. package/src/common/errors/parameter.ts +11 -7
  348. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  349. package/src/common/errors/{permission.js → permission.ts} +10 -6
  350. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  351. package/src/common/errors/{stats.js → stats.ts} +11 -7
  352. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -25
  353. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  354. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  355. package/src/common/events/{events.js → events.ts} +5 -1
  356. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  357. package/src/common/events/{util.js → util.ts} +2 -3
  358. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  359. package/src/common/logs/logger-proxy.ts +44 -0
  360. package/src/common/logs/{request.js → request.ts} +22 -9
  361. package/src/common/queue.ts +1 -2
  362. package/src/{config.js → config.ts} +18 -12
  363. package/src/constants.ts +256 -183
  364. package/src/controls-options-manager/constants.ts +5 -0
  365. package/src/controls-options-manager/enums.ts +16 -0
  366. package/src/controls-options-manager/index.ts +278 -0
  367. package/src/controls-options-manager/types.ts +49 -0
  368. package/src/controls-options-manager/util.ts +229 -0
  369. package/src/index.ts +33 -0
  370. package/src/locus-info/controlsUtils.ts +169 -0
  371. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  372. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  373. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  374. package/src/locus-info/{index.js → index.ts} +331 -80
  375. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  376. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  377. package/src/locus-info/{parser.js → parser.ts} +67 -79
  378. package/src/locus-info/{selfUtils.js → selfUtils.ts} +196 -67
  379. package/src/media/index.ts +488 -0
  380. package/src/media/{properties.js → properties.ts} +67 -54
  381. package/src/media/util.ts +16 -0
  382. package/src/mediaQualityMetrics/config.ts +384 -0
  383. package/src/meeting/in-meeting-actions.ts +123 -3
  384. package/src/meeting/{index.js → index.ts} +3334 -1775
  385. package/src/meeting/muteState.ts +526 -0
  386. package/src/meeting/{request.js → request.ts} +350 -142
  387. package/src/meeting/request.type.ts +13 -0
  388. package/src/meeting/{state.js → state.ts} +50 -35
  389. package/src/meeting/{util.js → util.ts} +126 -159
  390. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  391. package/src/meeting-info/{index.js → index.ts} +42 -36
  392. package/src/meeting-info/meeting-info-v2.ts +345 -0
  393. package/src/meeting-info/{request.js → request.ts} +14 -4
  394. package/src/meeting-info/{util.js → util.ts} +60 -51
  395. package/src/meeting-info/{utilv2.js → utilv2.ts} +76 -60
  396. package/src/meetings/{collection.js → collection.ts} +26 -3
  397. package/src/meetings/index.ts +1394 -0
  398. package/src/meetings/{request.js → request.ts} +34 -25
  399. package/src/meetings/util.ts +288 -0
  400. package/src/member/{index.js → index.ts} +124 -56
  401. package/src/member/types.ts +24 -0
  402. package/src/member/{util.js → util.ts} +105 -25
  403. package/src/members/{collection.js → collection.ts} +10 -2
  404. package/src/members/{index.js → index.ts} +359 -139
  405. package/src/members/request.ts +215 -0
  406. package/src/members/types.ts +28 -0
  407. package/src/members/{util.js → util.ts} +145 -54
  408. package/src/metrics/{config.js → config.ts} +256 -92
  409. package/src/metrics/{constants.js → constants.ts} +1 -6
  410. package/src/metrics/{index.js → index.ts} +116 -97
  411. package/src/multistream/mediaRequestManager.ts +324 -0
  412. package/src/multistream/receiveSlot.ts +184 -0
  413. package/src/multistream/receiveSlotManager.ts +166 -0
  414. package/src/multistream/remoteMedia.ts +254 -0
  415. package/src/multistream/remoteMediaGroup.ts +225 -0
  416. package/src/multistream/remoteMediaManager.ts +1075 -0
  417. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  418. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  419. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  420. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  421. package/src/reachability/{index.js → index.ts} +157 -94
  422. package/src/reachability/request.ts +46 -35
  423. package/src/reactions/constants.ts +4 -0
  424. package/src/reactions/reactions.ts +104 -0
  425. package/src/reactions/reactions.type.ts +62 -0
  426. package/src/reconnection-manager/{index.js → index.ts} +261 -163
  427. package/src/recording-controller/enums.ts +8 -0
  428. package/src/recording-controller/index.ts +315 -0
  429. package/src/recording-controller/util.ts +58 -0
  430. package/src/roap/index.ts +241 -0
  431. package/src/roap/request.ts +172 -0
  432. package/src/roap/turnDiscovery.ts +127 -53
  433. package/src/statsAnalyzer/global.ts +37 -0
  434. package/src/statsAnalyzer/index.ts +1273 -0
  435. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  436. package/src/transcription/{index.js → index.ts} +46 -39
  437. package/test/integration/spec/converged-space-meetings.js +177 -0
  438. package/test/integration/spec/journey.js +666 -464
  439. package/test/integration/spec/space-meeting.js +321 -206
  440. package/test/integration/spec/transcription.js +7 -8
  441. package/test/unit/spec/annotation/index.ts +435 -0
  442. package/test/unit/spec/breakouts/breakout.ts +184 -0
  443. package/test/unit/spec/breakouts/collection.ts +15 -0
  444. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  445. package/test/unit/spec/breakouts/events.ts +77 -0
  446. package/test/unit/spec/breakouts/index.ts +1504 -0
  447. package/test/unit/spec/breakouts/request.ts +104 -0
  448. package/test/unit/spec/breakouts/utils.js +72 -0
  449. package/test/unit/spec/common/browser-detection.js +9 -28
  450. package/test/unit/spec/controls-options-manager/index.js +287 -0
  451. package/test/unit/spec/controls-options-manager/util.js +403 -0
  452. package/test/unit/spec/fixture/locus.js +92 -90
  453. package/test/unit/spec/locus-info/controlsUtils.js +177 -32
  454. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  455. package/test/unit/spec/locus-info/index.js +493 -3
  456. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  457. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  458. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  459. package/test/unit/spec/locus-info/parser.js +3 -9
  460. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  461. package/test/unit/spec/locus-info/selfUtils.js +236 -12
  462. package/test/unit/spec/media/index.ts +303 -0
  463. package/test/unit/spec/media/properties.ts +73 -82
  464. package/test/unit/spec/meeting/in-meeting-actions.ts +58 -3
  465. package/test/unit/spec/meeting/index.js +3127 -975
  466. package/test/unit/spec/meeting/muteState.js +375 -70
  467. package/test/unit/spec/meeting/request.js +217 -43
  468. package/test/unit/spec/meeting/utils.js +205 -163
  469. package/test/unit/spec/meeting-info/meetinginfov2.js +268 -74
  470. package/test/unit/spec/meeting-info/request.js +7 -9
  471. package/test/unit/spec/meeting-info/util.js +11 -12
  472. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  473. package/test/unit/spec/meetings/collection.js +15 -1
  474. package/test/unit/spec/meetings/index.js +1052 -333
  475. package/test/unit/spec/meetings/utils.js +163 -14
  476. package/test/unit/spec/member/index.js +24 -1
  477. package/test/unit/spec/member/util.js +359 -32
  478. package/test/unit/spec/members/index.js +547 -37
  479. package/test/unit/spec/members/request.js +76 -20
  480. package/test/unit/spec/members/utils.js +191 -4
  481. package/test/unit/spec/metrics/index.js +46 -20
  482. package/test/unit/spec/multistream/mediaRequestManager.ts +1060 -0
  483. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  484. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  485. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  486. package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
  487. package/test/unit/spec/multistream/remoteMediaManager.ts +1793 -0
  488. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  489. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  490. package/test/unit/spec/reachability/index.ts +176 -27
  491. package/test/unit/spec/reachability/request.js +66 -0
  492. package/test/unit/spec/reconnection-manager/index.js +106 -9
  493. package/test/unit/spec/recording-controller/index.js +231 -0
  494. package/test/unit/spec/recording-controller/util.js +102 -0
  495. package/test/unit/spec/roap/index.ts +78 -45
  496. package/test/unit/spec/roap/request.ts +217 -0
  497. package/test/unit/spec/roap/turnDiscovery.ts +93 -49
  498. package/test/unit/spec/stats-analyzer/index.js +118 -65
  499. package/test/utils/cmr.js +44 -42
  500. package/test/utils/constants.js +9 -0
  501. package/test/utils/integrationTestUtils.js +64 -0
  502. package/test/utils/testUtils.js +63 -99
  503. package/test/utils/webex-config.js +22 -18
  504. package/test/utils/webex-test-users.js +57 -50
  505. package/tsconfig.json +6 -0
  506. package/dist/meeting/effectsState.js +0 -327
  507. package/dist/meeting/effectsState.js.map +0 -1
  508. package/dist/peer-connection-manager/index.js +0 -794
  509. package/dist/peer-connection-manager/index.js.map +0 -1
  510. package/dist/peer-connection-manager/util.js +0 -124
  511. package/dist/peer-connection-manager/util.js.map +0 -1
  512. package/dist/roap/collection.js +0 -73
  513. package/dist/roap/collection.js.map +0 -1
  514. package/dist/roap/handler.js +0 -337
  515. package/dist/roap/handler.js.map +0 -1
  516. package/dist/roap/state.js +0 -164
  517. package/dist/roap/state.js.map +0 -1
  518. package/dist/roap/util.js +0 -102
  519. package/dist/roap/util.js.map +0 -1
  520. package/src/common/logs/logger-proxy.js +0 -33
  521. package/src/index.js +0 -15
  522. package/src/locus-info/controlsUtils.js +0 -102
  523. package/src/media/index.js +0 -593
  524. package/src/media/util.js +0 -38
  525. package/src/mediaQualityMetrics/config.js +0 -382
  526. package/src/meeting/effectsState.js +0 -205
  527. package/src/meeting/muteState.js +0 -318
  528. package/src/meeting-info/meeting-info-v2.js +0 -255
  529. package/src/meetings/index.js +0 -986
  530. package/src/meetings/util.js +0 -176
  531. package/src/members/request.js +0 -131
  532. package/src/peer-connection-manager/index.js +0 -723
  533. package/src/peer-connection-manager/util.ts +0 -117
  534. package/src/roap/collection.js +0 -63
  535. package/src/roap/handler.js +0 -252
  536. package/src/roap/index.js +0 -380
  537. package/src/roap/request.js +0 -198
  538. package/src/roap/state.js +0 -149
  539. package/src/roap/util.js +0 -93
  540. package/src/statsAnalyzer/global.js +0 -131
  541. package/src/statsAnalyzer/index.js +0 -1020
  542. package/src/statsAnalyzer/mqaUtil.js +0 -173
  543. package/test/unit/spec/meeting/effectsState.js +0 -293
  544. package/test/unit/spec/peerconnection-manager/index.js +0 -188
  545. package/test/unit/spec/peerconnection-manager/utils.js +0 -48
  546. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  547. package/test/unit/spec/roap/util.js +0 -30
  548. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -0,0 +1,1060 @@
1
+ import {MediaRequestManager} from '@webex/plugin-meetings/src/multistream/mediaRequestManager';
2
+ import {ReceiveSlot} from '@webex/plugin-meetings/src/multistream/receiveSlot';
3
+ import sinon from 'sinon';
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
+
9
+ type ExpectedActiveSpeaker = {
10
+ policy: 'active-speaker';
11
+ maxPayloadBitsPerSecond?: number;
12
+ priority: number;
13
+ receiveSlots: Array<ReceiveSlot>;
14
+ maxFs?: number;
15
+ maxMbps?: number;
16
+ };
17
+ type ExpectedReceiverSelected = {
18
+ policy: 'receiver-selected';
19
+ maxPayloadBitsPerSecond?: number;
20
+ csi: number;
21
+ receiveSlot: ReceiveSlot;
22
+ maxFs?: number;
23
+ maxMbps?: number;
24
+ };
25
+ type ExpectedRequest = ExpectedActiveSpeaker | ExpectedReceiverSelected;
26
+
27
+ const degradationPreferences = {
28
+ maxMacroblocksLimit: Infinity, // no limit
29
+ };
30
+
31
+ describe('MediaRequestManager', () => {
32
+ const CROSS_PRIORITY_DUPLICATION = true;
33
+ const CROSS_POLICY_DUPLICATION = true;
34
+ const PREFER_LIVE_VIDEO = true;
35
+ const MAX_FPS = 3000;
36
+ const MAX_FS_360p = 920;
37
+ const MAX_FS_720p = 3600;
38
+ const MAX_FS_1080p = 8192;
39
+ const MAX_MBPS_360p = 27600;
40
+ const MAX_MBPS_720p = 108000;
41
+ const MAX_MBPS_1080p = 245760;
42
+ const MAX_PAYLOADBITSPS_360p = 640000;
43
+ const MAX_PAYLOADBITSPS_720p = 2500000;
44
+ const MAX_PAYLOADBITSPS_1080p = 4000000;
45
+
46
+ const NUM_SLOTS = 10;
47
+
48
+ let mediaRequestManager: MediaRequestManager;
49
+ let sendMediaRequestsCallback;
50
+ let fakeWcmeSlots;
51
+ let fakeReceiveSlots;
52
+
53
+ beforeEach(() => {
54
+ sendMediaRequestsCallback = sinon.stub();
55
+ mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
56
+ degradationPreferences,
57
+ kind: 'video',
58
+ });
59
+
60
+ // create some fake receive slots used by the tests
61
+ fakeWcmeSlots = Array(NUM_SLOTS)
62
+ .fill(null)
63
+ .map((_, index) => ({
64
+ id: `fake WCME slot ${index}`,
65
+ }));
66
+
67
+ fakeReceiveSlots = Array(NUM_SLOTS)
68
+ .fill(null)
69
+ .map(
70
+ (_, index) =>
71
+ ({
72
+ id: `fake receive slot ${index}`,
73
+ on: sinon.stub(),
74
+ off: sinon.stub(),
75
+ sourceState: 'live',
76
+ wcmeReceiveSlot: fakeWcmeSlots[index],
77
+ } as unknown as ReceiveSlot)
78
+ );
79
+ });
80
+
81
+ // helper function for adding an active speaker request
82
+ const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false) =>
83
+ mediaRequestManager.addRequest(
84
+ {
85
+ policyInfo: {
86
+ policy: 'active-speaker',
87
+ priority,
88
+ crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
89
+ crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
90
+ preferLiveVideo: PREFER_LIVE_VIDEO,
91
+ },
92
+ receiveSlots,
93
+ codecInfo: {
94
+ codec: 'h264',
95
+ maxFs: maxFs,
96
+ },
97
+ },
98
+ commit
99
+ );
100
+
101
+ // helper function for adding a receiver selected request
102
+ const addReceiverSelectedRequest = (csi, receiveSlot, maxFs, commit = false) =>
103
+ mediaRequestManager.addRequest(
104
+ {
105
+ policyInfo: {
106
+ policy: 'receiver-selected',
107
+ csi,
108
+ },
109
+ receiveSlots: [receiveSlot],
110
+ codecInfo: {
111
+ codec: 'h264',
112
+ maxFs: maxFs,
113
+ },
114
+ },
115
+ commit
116
+ );
117
+
118
+ // helper function for verifying that the right active speaker and receiver selected
119
+ // requests have been sent out
120
+ // It should be used only for verifying requests created with
121
+ // addActiveSpeakerRequest() or addReceiverSelectedRequest(), because of some
122
+ // hardcoded values used in them
123
+ const checkMediaRequestsSent = (
124
+ expectedRequests: ExpectedRequest[],
125
+ isCodecInfoDefined: boolean = true
126
+ ) => {
127
+ assert.calledOnce(sendMediaRequestsCallback);
128
+ assert.calledWith(
129
+ sendMediaRequestsCallback,
130
+ expectedRequests.map((expectedRequest) => {
131
+ if (expectedRequest.policy === 'active-speaker') {
132
+ return sinon.match({
133
+ policy: 'active-speaker',
134
+ policySpecificInfo: sinon.match({
135
+ priority: expectedRequest.priority,
136
+ crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
137
+ crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
138
+ preferLiveVideo: PREFER_LIVE_VIDEO,
139
+ }),
140
+ receiveSlots: expectedRequest.receiveSlots,
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
+ : [],
153
+ });
154
+ }
155
+ if (expectedRequest.policy === 'receiver-selected') {
156
+ return sinon.match({
157
+ policy: 'receiver-selected',
158
+ policySpecificInfo: sinon.match({
159
+ csi: expectedRequest.csi,
160
+ }),
161
+ receiveSlots: [expectedRequest.receiveSlot],
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
+ : [],
174
+ });
175
+ }
176
+
177
+ return undefined;
178
+ })
179
+ );
180
+ sendMediaRequestsCallback.resetHistory();
181
+ };
182
+
183
+ it('starts with no requests', () => {
184
+ mediaRequestManager.commit();
185
+
186
+ assert.calledOnce(sendMediaRequestsCallback);
187
+ assert.calledWith(sendMediaRequestsCallback, []);
188
+ });
189
+
190
+ it('sends correct wcme media requests when addRequest() is called with commit=true', () => {
191
+ // this is the only test that doesn't use the helper addActiveSpeakerRequest(), addReceiverSelectedRequest() methods
192
+ // because it tests other values for some of the parameters that are otherwise always fixed by those helpers
193
+
194
+ // first call addRequest a couple of times with commit=false
195
+ mediaRequestManager.addRequest(
196
+ {
197
+ policyInfo: {
198
+ policy: 'active-speaker',
199
+ priority: 255,
200
+ crossPriorityDuplication: true,
201
+ crossPolicyDuplication: false,
202
+ preferLiveVideo: false,
203
+ },
204
+ receiveSlots: [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
205
+ codecInfo: {
206
+ codec: 'h264',
207
+ maxFs: MAX_FS_360p,
208
+ maxFps: MAX_FPS,
209
+ },
210
+ },
211
+ false
212
+ );
213
+ mediaRequestManager.addRequest(
214
+ {
215
+ policyInfo: {
216
+ policy: 'receiver-selected',
217
+ csi: 123,
218
+ },
219
+ receiveSlots: [fakeReceiveSlots[3]],
220
+ codecInfo: {
221
+ codec: 'h264',
222
+ maxFs: MAX_FS_720p,
223
+ maxFps: MAX_FPS,
224
+ maxMbps: MAX_MBPS_720p,
225
+ },
226
+ },
227
+ false
228
+ );
229
+
230
+ // finally call it with commit=true
231
+ mediaRequestManager.addRequest(
232
+ {
233
+ policyInfo: {
234
+ policy: 'receiver-selected',
235
+ csi: 123,
236
+ },
237
+ receiveSlots: [fakeReceiveSlots[4]],
238
+ codecInfo: {
239
+ codec: 'h264',
240
+ maxFs: MAX_FS_1080p,
241
+ maxFps: MAX_FPS,
242
+ maxMbps: MAX_MBPS_1080p,
243
+ },
244
+ },
245
+ true
246
+ );
247
+
248
+ // all 3 requests should be sent out together
249
+ assert.calledOnce(sendMediaRequestsCallback);
250
+ assert.calledWith(sendMediaRequestsCallback, [
251
+ sinon.match({
252
+ policy: 'active-speaker',
253
+ policySpecificInfo: sinon.match({
254
+ priority: 255,
255
+ crossPriorityDuplication: true,
256
+ crossPolicyDuplication: false,
257
+ preferLiveVideo: false,
258
+ }),
259
+ receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
260
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
261
+ codecInfos: [
262
+ sinon.match({
263
+ payloadType: 0x80,
264
+ h264: sinon.match({
265
+ maxFs: MAX_FS_360p,
266
+ maxFps: MAX_FPS,
267
+ maxMbps: MAX_MBPS_360p,
268
+ }),
269
+ }),
270
+ ],
271
+ }),
272
+ sinon.match({
273
+ policy: 'receiver-selected',
274
+ policySpecificInfo: sinon.match({
275
+ csi: 123,
276
+ }),
277
+ receiveSlots: [fakeWcmeSlots[3]],
278
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
279
+ codecInfos: [
280
+ sinon.match({
281
+ payloadType: 0x80,
282
+ h264: sinon.match({
283
+ maxFs: MAX_FS_720p,
284
+ maxFps: MAX_FPS,
285
+ maxMbps: MAX_MBPS_720p,
286
+ }),
287
+ }),
288
+ ],
289
+ }),
290
+ sinon.match({
291
+ policy: 'receiver-selected',
292
+ policySpecificInfo: sinon.match({
293
+ csi: 123,
294
+ }),
295
+ receiveSlots: [fakeWcmeSlots[4]],
296
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
297
+ codecInfos: [
298
+ sinon.match({
299
+ payloadType: 0x80,
300
+ h264: sinon.match({
301
+ maxFs: MAX_FS_1080p,
302
+ maxFps: MAX_FPS,
303
+ maxMbps: MAX_MBPS_1080p,
304
+ }),
305
+ }),
306
+ ],
307
+ }),
308
+ ]);
309
+ });
310
+
311
+ it('keeps adding requests with every call to addRequest()', () => {
312
+ // start with 1 request
313
+ addReceiverSelectedRequest(100, fakeReceiveSlots[0], MAX_FS_1080p, true);
314
+
315
+ checkMediaRequestsSent([
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
+ },
324
+ ]);
325
+
326
+ // now add another one
327
+ addReceiverSelectedRequest(101, fakeReceiveSlots[1], MAX_FS_1080p, true);
328
+
329
+ checkMediaRequestsSent([
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
+ },
346
+ ]);
347
+
348
+ // and one more
349
+ addActiveSpeakerRequest(
350
+ 1,
351
+ [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
352
+ MAX_FS_720p,
353
+ true
354
+ );
355
+
356
+ checkMediaRequestsSent([
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
+ },
373
+ {
374
+ policy: 'active-speaker',
375
+ priority: 1,
376
+ receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
377
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
378
+ maxFs: MAX_FS_720p,
379
+ maxMbps: MAX_MBPS_720p,
380
+ },
381
+ ]);
382
+ });
383
+
384
+ it('cancels the requests correctly when cancelRequest() is called with commit=true', () => {
385
+ const requestIds = [
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),
390
+ ];
391
+
392
+ // cancel one of the active speaker requests
393
+ mediaRequestManager.cancelRequest(requestIds[1], true);
394
+
395
+ // expect only the 3 remaining requests to be sent out
396
+ checkMediaRequestsSent([
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
+ },
421
+ ]);
422
+
423
+ // cancel one of the receiver selected requests
424
+ mediaRequestManager.cancelRequest(requestIds[3], true);
425
+
426
+ // expect only the 2 remaining requests to be sent out
427
+ checkMediaRequestsSent([
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
+ },
444
+ ]);
445
+ });
446
+
447
+ it('does not send out anything if addRequest() is called with commit=false', () => {
448
+ addActiveSpeakerRequest(
449
+ 10,
450
+ [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
451
+ MAX_FS_720p,
452
+ false
453
+ );
454
+ addReceiverSelectedRequest(123, fakeReceiveSlots[3], MAX_FS_1080p, false);
455
+
456
+ // nothing should be sent out as we didn't commit the requests
457
+ assert.notCalled(sendMediaRequestsCallback);
458
+
459
+ // now do the commit
460
+ mediaRequestManager.commit();
461
+
462
+ // check that the 2 requests have been sent out
463
+ checkMediaRequestsSent([
464
+ {
465
+ policy: 'active-speaker',
466
+ priority: 10,
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,
479
+ },
480
+ ]);
481
+ });
482
+
483
+ it('does not send out anything if cancelRequest() is called with commit=false', () => {
484
+ // send 4 requests
485
+ const requestIds = [
486
+ addActiveSpeakerRequest(
487
+ 250,
488
+ [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
489
+ MAX_FS_720p,
490
+ false
491
+ ),
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),
495
+ ];
496
+
497
+ checkMediaRequestsSent([
498
+ {
499
+ policy: 'active-speaker',
500
+ priority: 250,
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,
529
+ },
530
+ ]);
531
+
532
+ // now cancel 3 of them, but with commit=false => nothing should happen
533
+ mediaRequestManager.cancelRequest(requestIds[0], false);
534
+ mediaRequestManager.cancelRequest(requestIds[2], false);
535
+ mediaRequestManager.cancelRequest(requestIds[3], false);
536
+
537
+ assert.notCalled(sendMediaRequestsCallback);
538
+
539
+ // now do the commit
540
+ mediaRequestManager.commit();
541
+
542
+ checkMediaRequestsSent([
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
+ },
551
+ ]);
552
+ });
553
+
554
+ it('sends the wcme media requests when commit() is called', () => {
555
+ // send some requests, all of them with commit=false
556
+ addReceiverSelectedRequest(123000, fakeReceiveSlots[0], MAX_FS_1080p, false);
557
+ addReceiverSelectedRequest(456000, fakeReceiveSlots[1], MAX_FS_1080p, false);
558
+ addActiveSpeakerRequest(
559
+ 255,
560
+ [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
561
+ MAX_FS_720p,
562
+ false
563
+ );
564
+ addActiveSpeakerRequest(
565
+ 254,
566
+ [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
567
+ MAX_FS_720p,
568
+ false
569
+ );
570
+
571
+ // nothing should be sent out as we didn't commit the requests
572
+ assert.notCalled(sendMediaRequestsCallback);
573
+
574
+ // now do the commit
575
+ mediaRequestManager.commit();
576
+
577
+ // check that all requests have been sent out
578
+ checkMediaRequestsSent([
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
+ },
595
+ {
596
+ policy: 'active-speaker',
597
+ priority: 255,
598
+ receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
599
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
600
+ maxFs: MAX_FS_720p,
601
+ maxMbps: MAX_MBPS_720p,
602
+ },
603
+ {
604
+ policy: 'active-speaker',
605
+ priority: 254,
606
+ receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
607
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
608
+ maxFs: MAX_FS_720p,
609
+ maxMbps: MAX_MBPS_720p,
610
+ },
611
+ ]);
612
+ });
613
+
614
+ it('avoids sending duplicate requests and clears all the requests on reset()', () => {
615
+ // send some requests and commit them one by one
616
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
617
+ addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
618
+ addActiveSpeakerRequest(
619
+ 255,
620
+ [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
621
+ MAX_FS_720p,
622
+ false
623
+ );
624
+ addActiveSpeakerRequest(
625
+ 254,
626
+ [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
627
+ MAX_FS_720p,
628
+ false
629
+ );
630
+
631
+ // nothing should be sent out as we didn't commit the requests
632
+ assert.notCalled(sendMediaRequestsCallback);
633
+
634
+ mediaRequestManager.commit();
635
+ checkMediaRequestsSent([
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
+ },
652
+ {
653
+ policy: 'active-speaker',
654
+ priority: 255,
655
+ receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
656
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
657
+ maxFs: MAX_FS_720p,
658
+ maxMbps: MAX_MBPS_720p,
659
+ },
660
+ {
661
+ policy: 'active-speaker',
662
+ priority: 254,
663
+ receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
664
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
665
+ maxFs: MAX_FS_720p,
666
+ maxMbps: MAX_MBPS_720p,
667
+ },
668
+ ]);
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
+
676
+ // now reset everything
677
+ mediaRequestManager.reset();
678
+
679
+ // calling commit now should not cause any requests to be sent out
680
+ mediaRequestManager.commit();
681
+ checkMediaRequestsSent([]);
682
+ });
683
+
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);
688
+
689
+ mediaRequestManager.commit();
690
+ checkMediaRequestsSent([
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
+ },
699
+ ]);
700
+
701
+ // now reset everything
702
+ mediaRequestManager.reset();
703
+
704
+ // calling commit now should not cause any requests to be sent out
705
+ mediaRequestManager.commit();
706
+ checkMediaRequestsSent([]);
707
+
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
715
+ checkMediaRequestsSent([
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
+ },
724
+ ]);
725
+ });
726
+
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
+ });
1059
+ });
1060
+ });