@webex/plugin-meetings 3.0.0-beta.15 → 3.0.0-beta.151

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