@webex/plugin-meetings 2.60.0 → 2.60.1-next.1

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