@webex/plugin-meetings 3.0.0-beta.2 → 3.0.0-beta.20

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 (365) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +116 -0
  4. package/dist/breakouts/breakout.js.map +1 -0
  5. package/dist/breakouts/collection.js +23 -0
  6. package/dist/breakouts/collection.js.map +1 -0
  7. package/dist/breakouts/index.js +226 -0
  8. package/dist/breakouts/index.js.map +1 -0
  9. package/dist/common/browser-detection.js +1 -20
  10. package/dist/common/browser-detection.js.map +1 -1
  11. package/dist/common/collection.js +5 -20
  12. package/dist/common/collection.js.map +1 -1
  13. package/dist/common/config.js +0 -7
  14. package/dist/common/config.js.map +1 -1
  15. package/dist/common/errors/captcha-error.js +10 -24
  16. package/dist/common/errors/captcha-error.js.map +1 -1
  17. package/dist/common/errors/intent-to-join.js +11 -24
  18. package/dist/common/errors/intent-to-join.js.map +1 -1
  19. package/dist/common/errors/join-meeting.js +12 -25
  20. package/dist/common/errors/join-meeting.js.map +1 -1
  21. package/dist/common/errors/media.js +10 -24
  22. package/dist/common/errors/media.js.map +1 -1
  23. package/dist/common/errors/parameter.js +5 -33
  24. package/dist/common/errors/parameter.js.map +1 -1
  25. package/dist/common/errors/password-error.js +10 -24
  26. package/dist/common/errors/password-error.js.map +1 -1
  27. package/dist/common/errors/permission.js +9 -23
  28. package/dist/common/errors/permission.js.map +1 -1
  29. package/dist/common/errors/reconnection-in-progress.js +0 -17
  30. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  31. package/dist/common/errors/reconnection.js +10 -24
  32. package/dist/common/errors/reconnection.js.map +1 -1
  33. package/dist/common/errors/stats.js +10 -24
  34. package/dist/common/errors/stats.js.map +1 -1
  35. package/dist/common/errors/webex-errors.js +6 -41
  36. package/dist/common/errors/webex-errors.js.map +1 -1
  37. package/dist/common/errors/webex-meetings-error.js +5 -25
  38. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  39. package/dist/common/events/events-scope.js +0 -22
  40. package/dist/common/events/events-scope.js.map +1 -1
  41. package/dist/common/events/events.js +0 -23
  42. package/dist/common/events/events.js.map +1 -1
  43. package/dist/common/events/trigger-proxy.js +0 -12
  44. package/dist/common/events/trigger-proxy.js.map +1 -1
  45. package/dist/common/events/util.js +0 -15
  46. package/dist/common/events/util.js.map +1 -1
  47. package/dist/common/logs/logger-config.js +0 -4
  48. package/dist/common/logs/logger-config.js.map +1 -1
  49. package/dist/common/logs/logger-proxy.js +1 -8
  50. package/dist/common/logs/logger-proxy.js.map +1 -1
  51. package/dist/common/logs/request.js +37 -60
  52. package/dist/common/logs/request.js.map +1 -1
  53. package/dist/common/queue.js +4 -14
  54. package/dist/common/queue.js.map +1 -1
  55. package/dist/config.js +6 -6
  56. package/dist/config.js.map +1 -1
  57. package/dist/constants.js +88 -46
  58. package/dist/constants.js.map +1 -1
  59. package/dist/index.js +1 -17
  60. package/dist/index.js.map +1 -1
  61. package/dist/locus-info/controlsUtils.js +12 -29
  62. package/dist/locus-info/controlsUtils.js.map +1 -1
  63. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  64. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  65. package/dist/locus-info/fullState.js +0 -15
  66. package/dist/locus-info/fullState.js.map +1 -1
  67. package/dist/locus-info/hostUtils.js +4 -12
  68. package/dist/locus-info/hostUtils.js.map +1 -1
  69. package/dist/locus-info/index.js +184 -190
  70. package/dist/locus-info/index.js.map +1 -1
  71. package/dist/locus-info/infoUtils.js +3 -37
  72. package/dist/locus-info/infoUtils.js.map +1 -1
  73. package/dist/locus-info/mediaSharesUtils.js +12 -38
  74. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  75. package/dist/locus-info/parser.js +92 -118
  76. package/dist/locus-info/parser.js.map +1 -1
  77. package/dist/locus-info/selfUtils.js +34 -91
  78. package/dist/locus-info/selfUtils.js.map +1 -1
  79. package/dist/media/index.js +67 -111
  80. package/dist/media/index.js.map +1 -1
  81. package/dist/media/properties.js +80 -114
  82. package/dist/media/properties.js.map +1 -1
  83. package/dist/media/util.js +2 -9
  84. package/dist/media/util.js.map +1 -1
  85. package/dist/mediaQualityMetrics/config.js +10 -12
  86. package/dist/mediaQualityMetrics/config.js.map +1 -1
  87. package/dist/meeting/effectsState.js +125 -190
  88. package/dist/meeting/effectsState.js.map +1 -1
  89. package/dist/meeting/in-meeting-actions.js +5 -14
  90. package/dist/meeting/in-meeting-actions.js.map +1 -1
  91. package/dist/meeting/index.js +1692 -1925
  92. package/dist/meeting/index.js.map +1 -1
  93. package/dist/meeting/muteState.js +36 -77
  94. package/dist/meeting/muteState.js.map +1 -1
  95. package/dist/meeting/request.js +224 -230
  96. package/dist/meeting/request.js.map +1 -1
  97. package/dist/meeting/request.type.js +7 -0
  98. package/dist/meeting/request.type.js.map +1 -0
  99. package/dist/meeting/state.js +21 -31
  100. package/dist/meeting/state.js.map +1 -1
  101. package/dist/meeting/util.js +43 -215
  102. package/dist/meeting/util.js.map +1 -1
  103. package/dist/meeting-info/collection.js +6 -25
  104. package/dist/meeting-info/collection.js.map +1 -1
  105. package/dist/meeting-info/index.js +14 -32
  106. package/dist/meeting-info/index.js.map +1 -1
  107. package/dist/meeting-info/meeting-info-v2.js +193 -268
  108. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  109. package/dist/meeting-info/request.js +3 -15
  110. package/dist/meeting-info/request.js.map +1 -1
  111. package/dist/meeting-info/util.js +98 -183
  112. package/dist/meeting-info/util.js.map +1 -1
  113. package/dist/meeting-info/utilv2.js +137 -228
  114. package/dist/meeting-info/utilv2.js.map +1 -1
  115. package/dist/meetings/collection.js +5 -20
  116. package/dist/meetings/collection.js.map +1 -1
  117. package/dist/meetings/index.js +490 -560
  118. package/dist/meetings/index.js.map +1 -1
  119. package/dist/meetings/request.js +24 -41
  120. package/dist/meetings/request.js.map +1 -1
  121. package/dist/meetings/util.js +99 -155
  122. package/dist/meetings/util.js.map +1 -1
  123. package/dist/member/index.js +78 -86
  124. package/dist/member/index.js.map +1 -1
  125. package/dist/member/util.js +31 -68
  126. package/dist/member/util.js.map +1 -1
  127. package/dist/members/collection.js +3 -12
  128. package/dist/members/collection.js.map +1 -1
  129. package/dist/members/index.js +93 -200
  130. package/dist/members/index.js.map +1 -1
  131. package/dist/members/request.js +16 -39
  132. package/dist/members/request.js.map +1 -1
  133. package/dist/members/util.js +9 -38
  134. package/dist/members/util.js.map +1 -1
  135. package/dist/metrics/config.js +0 -2
  136. package/dist/metrics/config.js.map +1 -1
  137. package/dist/metrics/constants.js +1 -2
  138. package/dist/metrics/constants.js.map +1 -1
  139. package/dist/metrics/index.js +55 -135
  140. package/dist/metrics/index.js.map +1 -1
  141. package/dist/multistream/mediaRequestManager.js +57 -32
  142. package/dist/multistream/mediaRequestManager.js.map +1 -1
  143. package/dist/multistream/multistreamMedia.js +15 -21
  144. package/dist/multistream/multistreamMedia.js.map +1 -1
  145. package/dist/multistream/receiveSlot.js +10 -50
  146. package/dist/multistream/receiveSlot.js.map +1 -1
  147. package/dist/multistream/receiveSlotManager.js +45 -82
  148. package/dist/multistream/receiveSlotManager.js.map +1 -1
  149. package/dist/multistream/remoteMedia.js +18 -58
  150. package/dist/multistream/remoteMedia.js.map +1 -1
  151. package/dist/multistream/remoteMediaGroup.js +6 -40
  152. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  153. package/dist/multistream/remoteMediaManager.js +362 -416
  154. package/dist/multistream/remoteMediaManager.js.map +1 -1
  155. package/dist/networkQualityMonitor/index.js +36 -57
  156. package/dist/networkQualityMonitor/index.js.map +1 -1
  157. package/dist/personal-meeting-room/index.js +21 -45
  158. package/dist/personal-meeting-room/index.js.map +1 -1
  159. package/dist/personal-meeting-room/request.js +1 -31
  160. package/dist/personal-meeting-room/request.js.map +1 -1
  161. package/dist/personal-meeting-room/util.js +0 -13
  162. package/dist/personal-meeting-room/util.js.map +1 -1
  163. package/dist/reachability/index.js +138 -182
  164. package/dist/reachability/index.js.map +1 -1
  165. package/dist/reachability/request.js +3 -18
  166. package/dist/reachability/request.js.map +1 -1
  167. package/dist/reactions/constants.js +13 -0
  168. package/dist/reactions/constants.js.map +1 -0
  169. package/dist/reactions/reactions.js +109 -0
  170. package/dist/reactions/reactions.js.map +1 -0
  171. package/dist/reactions/reactions.type.js +36 -0
  172. package/dist/reactions/reactions.type.js.map +1 -0
  173. package/dist/reconnection-manager/index.js +322 -455
  174. package/dist/reconnection-manager/index.js.map +1 -1
  175. package/dist/recording-controller/enums.js +17 -0
  176. package/dist/recording-controller/enums.js.map +1 -0
  177. package/dist/recording-controller/index.js +343 -0
  178. package/dist/recording-controller/index.js.map +1 -0
  179. package/dist/recording-controller/util.js +63 -0
  180. package/dist/recording-controller/util.js.map +1 -0
  181. package/dist/roap/index.js +39 -64
  182. package/dist/roap/index.js.map +1 -1
  183. package/dist/roap/request.js +94 -113
  184. package/dist/roap/request.js.map +1 -1
  185. package/dist/roap/turnDiscovery.js +85 -94
  186. package/dist/roap/turnDiscovery.js.map +1 -1
  187. package/dist/statsAnalyzer/global.js +0 -2
  188. package/dist/statsAnalyzer/global.js.map +1 -1
  189. package/dist/statsAnalyzer/index.js +85 -175
  190. package/dist/statsAnalyzer/index.js.map +1 -1
  191. package/dist/statsAnalyzer/mqaUtil.js +72 -53
  192. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  193. package/dist/transcription/index.js +22 -47
  194. package/dist/transcription/index.js.map +1 -1
  195. package/internal-README.md +7 -6
  196. package/package.json +25 -20
  197. package/src/breakouts/README.md +190 -0
  198. package/src/breakouts/breakout.ts +110 -0
  199. package/src/breakouts/collection.ts +19 -0
  200. package/src/breakouts/index.ts +225 -0
  201. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  202. package/src/common/collection.ts +9 -7
  203. package/src/common/{config.js → config.ts} +1 -1
  204. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  205. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  206. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  207. package/src/common/errors/{media.js → media.ts} +11 -7
  208. package/src/common/errors/parameter.ts +11 -7
  209. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  210. package/src/common/errors/{permission.js → permission.ts} +10 -6
  211. package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
  212. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  213. package/src/common/errors/{stats.js → stats.ts} +11 -7
  214. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  215. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  216. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  217. package/src/common/events/{events.js → events.ts} +5 -1
  218. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  219. package/src/common/events/{util.js → util.ts} +2 -3
  220. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  221. package/src/common/logs/logger-proxy.ts +44 -0
  222. package/src/common/logs/{request.js → request.ts} +22 -9
  223. package/src/common/queue.ts +1 -2
  224. package/src/{config.js → config.ts} +17 -12
  225. package/src/constants.ts +40 -1
  226. package/src/index.js +1 -1
  227. package/src/locus-info/controlsUtils.ts +114 -0
  228. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  229. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  230. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  231. package/src/locus-info/{index.js → index.ts} +148 -64
  232. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  233. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  234. package/src/locus-info/{parser.js → parser.ts} +67 -79
  235. package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
  236. package/src/media/{index.js → index.ts} +181 -131
  237. package/src/media/{properties.js → properties.ts} +47 -28
  238. package/src/media/{util.js → util.ts} +2 -2
  239. package/src/mediaQualityMetrics/{config.js → config.ts} +46 -46
  240. package/src/meeting/{effectsState.js → effectsState.ts} +47 -41
  241. package/src/meeting/in-meeting-actions.ts +15 -3
  242. package/src/meeting/{index.js → index.ts} +2263 -1427
  243. package/src/meeting/{muteState.js → muteState.ts} +78 -42
  244. package/src/meeting/{request.js → request.ts} +292 -142
  245. package/src/meeting/request.type.ts +13 -0
  246. package/src/meeting/{state.js → state.ts} +50 -35
  247. package/src/meeting/{util.js → util.ts} +112 -115
  248. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  249. package/src/meeting-info/{index.js → index.ts} +42 -36
  250. package/src/meeting-info/meeting-info-v2.ts +273 -0
  251. package/src/meeting-info/{request.js → request.ts} +14 -4
  252. package/src/meeting-info/{util.js → util.ts} +60 -51
  253. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  254. package/src/meetings/{collection.js → collection.ts} +6 -3
  255. package/src/meetings/index.ts +1159 -0
  256. package/src/meetings/{request.js → request.ts} +32 -25
  257. package/src/meetings/{util.js → util.ts} +34 -32
  258. package/src/member/{index.js → index.ts} +102 -56
  259. package/src/member/{util.js → util.ts} +52 -25
  260. package/src/members/{collection.js → collection.ts} +2 -2
  261. package/src/members/{index.js → index.ts} +219 -142
  262. package/src/members/{request.js → request.ts} +60 -16
  263. package/src/members/{util.js → util.ts} +50 -48
  264. package/src/metrics/{config.js → config.ts} +254 -83
  265. package/src/metrics/{constants.js → constants.ts} +0 -2
  266. package/src/metrics/{index.js → index.ts} +106 -74
  267. package/src/multistream/mediaRequestManager.ts +81 -15
  268. package/src/multistream/multistreamMedia.ts +5 -0
  269. package/src/multistream/receiveSlot.ts +18 -12
  270. package/src/multistream/receiveSlotManager.ts +23 -21
  271. package/src/multistream/remoteMedia.ts +15 -5
  272. package/src/multistream/remoteMediaGroup.ts +4 -3
  273. package/src/multistream/remoteMediaManager.ts +153 -37
  274. package/src/networkQualityMonitor/{index.js → index.ts} +37 -25
  275. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  276. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  277. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  278. package/src/reachability/{index.js → index.ts} +99 -83
  279. package/src/reachability/request.ts +39 -33
  280. package/src/reactions/constants.ts +4 -0
  281. package/src/reactions/reactions.ts +104 -0
  282. package/src/reactions/reactions.type.ts +62 -0
  283. package/src/reconnection-manager/{index.js → index.ts} +195 -102
  284. package/src/recording-controller/enums.ts +8 -0
  285. package/src/recording-controller/index.ts +315 -0
  286. package/src/recording-controller/util.ts +58 -0
  287. package/src/roap/{index.js → index.ts} +73 -56
  288. package/src/roap/request.ts +157 -0
  289. package/src/roap/turnDiscovery.ts +77 -37
  290. package/src/statsAnalyzer/{global.js → global.ts} +30 -33
  291. package/src/statsAnalyzer/{index.js → index.ts} +468 -192
  292. package/src/statsAnalyzer/mqaUtil.ts +290 -0
  293. package/src/transcription/{index.js → index.ts} +46 -39
  294. package/test/integration/spec/journey.js +664 -463
  295. package/test/integration/spec/space-meeting.js +320 -206
  296. package/test/integration/spec/transcription.js +7 -8
  297. package/test/unit/spec/breakouts/breakout.ts +119 -0
  298. package/test/unit/spec/breakouts/collection.ts +15 -0
  299. package/test/unit/spec/breakouts/index.ts +293 -0
  300. package/test/unit/spec/common/browser-detection.js +9 -28
  301. package/test/unit/spec/fixture/locus.js +92 -90
  302. package/test/unit/spec/locus-info/controlsUtils.js +25 -5
  303. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  304. package/test/unit/spec/locus-info/index.js +104 -2
  305. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  306. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  307. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  308. package/test/unit/spec/locus-info/parser.js +3 -9
  309. package/test/unit/spec/locus-info/selfConstant.js +97 -103
  310. package/test/unit/spec/locus-info/selfUtils.js +105 -12
  311. package/test/unit/spec/media/index.ts +31 -47
  312. package/test/unit/spec/media/properties.ts +9 -9
  313. package/test/unit/spec/meeting/effectsState.js +39 -45
  314. package/test/unit/spec/meeting/in-meeting-actions.ts +5 -2
  315. package/test/unit/spec/meeting/index.js +2017 -742
  316. package/test/unit/spec/meeting/muteState.js +42 -33
  317. package/test/unit/spec/meeting/request.js +115 -44
  318. package/test/unit/spec/meeting/utils.js +104 -171
  319. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  320. package/test/unit/spec/meeting-info/request.js +7 -9
  321. package/test/unit/spec/meeting-info/util.js +11 -12
  322. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  323. package/test/unit/spec/meetings/collection.js +1 -1
  324. package/test/unit/spec/meetings/index.js +439 -257
  325. package/test/unit/spec/meetings/utils.js +14 -12
  326. package/test/unit/spec/member/index.js +0 -1
  327. package/test/unit/spec/member/util.js +31 -7
  328. package/test/unit/spec/members/index.js +104 -54
  329. package/test/unit/spec/members/request.js +29 -20
  330. package/test/unit/spec/members/utils.js +8 -5
  331. package/test/unit/spec/metrics/index.js +16 -21
  332. package/test/unit/spec/multistream/mediaRequestManager.ts +316 -50
  333. package/test/unit/spec/multistream/receiveSlot.ts +6 -6
  334. package/test/unit/spec/multistream/receiveSlotManager.ts +13 -13
  335. package/test/unit/spec/multistream/remoteMedia.ts +10 -2
  336. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  337. package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
  338. package/test/unit/spec/networkQualityMonitor/index.js +21 -15
  339. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  340. package/test/unit/spec/reachability/index.ts +58 -26
  341. package/test/unit/spec/reconnection-manager/index.js +102 -9
  342. package/test/unit/spec/recording-controller/index.js +231 -0
  343. package/test/unit/spec/recording-controller/util.js +102 -0
  344. package/test/unit/spec/roap/index.ts +2 -1
  345. package/test/unit/spec/roap/request.ts +114 -0
  346. package/test/unit/spec/roap/turnDiscovery.ts +64 -45
  347. package/test/unit/spec/stats-analyzer/index.js +27 -22
  348. package/test/utils/cmr.js +44 -42
  349. package/test/utils/testUtils.js +83 -74
  350. package/test/utils/webex-config.js +18 -18
  351. package/test/utils/webex-test-users.js +54 -50
  352. package/tsconfig.json +6 -0
  353. package/dist/media/internal-media-core-wrapper.js +0 -22
  354. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  355. package/dist/peer-connection-manager/util.js +0 -124
  356. package/dist/peer-connection-manager/util.js.map +0 -1
  357. package/src/common/logs/logger-proxy.js +0 -33
  358. package/src/locus-info/controlsUtils.js +0 -102
  359. package/src/media/internal-media-core-wrapper.ts +0 -9
  360. package/src/meeting-info/meeting-info-v2.js +0 -255
  361. package/src/meetings/index.js +0 -1015
  362. package/src/peer-connection-manager/util.ts +0 -117
  363. package/src/roap/request.js +0 -127
  364. package/src/statsAnalyzer/mqaUtil.js +0 -173
  365. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
@@ -10,7 +10,6 @@ import {assert} from '@webex/test-helper-chai';
10
10
 
11
11
  import metrics from '@webex/plugin-meetings/src/metrics';
12
12
 
13
-
14
13
  /**
15
14
  * Meeting can only run in a browser, so we can only send metrics for
16
15
  * browser usage.
@@ -23,7 +22,7 @@ browserOnly(describe)('Meeting metrics', () => {
23
22
  clientRegion: 'US-WEST',
24
23
  countryCode: 'US',
25
24
  regionCode: 'US-WEST',
26
- timezone: 'America/Los_Angeles'
25
+ timezone: 'America/Los_Angeles',
27
26
  };
28
27
 
29
28
  beforeEach(() => {
@@ -31,16 +30,16 @@ browserOnly(describe)('Meeting metrics', () => {
31
30
  mockSubmitMetric = sandbox.stub();
32
31
  webex = new MockWebex({
33
32
  children: {
34
- metrics: Metrics
35
- }
33
+ metrics: Metrics,
34
+ },
36
35
  });
37
36
 
38
37
  webex.version = '1.2.3';
39
38
  webex.credentials.getOrgId = sinon.fake.returns('7890');
40
39
  webex.credentials.config = {
41
40
  _values: {
42
- clientId: 'mock-client-id'
43
- }
41
+ clientId: 'mock-client-id',
42
+ },
44
43
  };
45
44
  webex.config.metrics.type = ['behavioral'];
46
45
  webex.internal.metrics.submitClientMetrics = mockSubmitMetric;
@@ -55,7 +54,7 @@ browserOnly(describe)('Meeting metrics', () => {
55
54
  it('should create payload with masked IPv4', () => {
56
55
  geoHintInfo.clientAddress = '128.0.0.1';
57
56
  webex.meetings = {
58
- geoHintInfo
57
+ geoHintInfo,
59
58
  };
60
59
  metrics.initialSetup({}, webex);
61
60
  const payload = metrics.initPayload('myMetric', {}, {clientType: 'TEAMS_CLIENT'});
@@ -71,7 +70,7 @@ browserOnly(describe)('Meeting metrics', () => {
71
70
  it('should create payload with masked IPv6', () => {
72
71
  geoHintInfo.clientAddress = '2001:0db8:0000:08d3:0000:0000:0070:0000';
73
72
  webex.meetings = {
74
- geoHintInfo
73
+ geoHintInfo,
75
74
  };
76
75
  metrics.initialSetup({}, webex);
77
76
  const payload = metrics.initPayload('myIPv6Metric', {}, {clientType: 'TEAMS_CLIENT'});
@@ -98,19 +97,15 @@ browserOnly(describe)('Meeting metrics', () => {
98
97
 
99
98
  metrics.sendBehavioralMetric('myMetric', fields, metricTags);
100
99
 
101
- assert.calledWithMatch(
102
- mockSubmitMetric,
103
- 'myMetric',
104
- {
105
- type: ['behavioral'],
106
- fields: {
107
- value: 567
108
- },
109
- tags: {
110
- test: true
111
- }
112
- }
113
- );
100
+ assert.calledWithMatch(mockSubmitMetric, 'myMetric', {
101
+ type: ['behavioral'],
102
+ fields: {
103
+ value: 567,
104
+ },
105
+ tags: {
106
+ test: true,
107
+ },
108
+ });
114
109
  });
115
110
  });
116
111
  });
@@ -2,19 +2,28 @@ 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';
5
6
 
6
7
  type ExpectedActiveSpeaker = {
7
8
  policy: 'active-speaker';
8
9
  priority: number;
9
10
  receiveSlots: Array<ReceiveSlot>;
11
+ maxFs: number;
10
12
  };
11
13
  type ExpectedReceiverSelected = {
12
14
  policy: 'receiver-selected';
13
15
  csi: number;
14
16
  receiveSlot: ReceiveSlot;
17
+ maxFs: number;
15
18
  };
16
19
  type ExpectedRequest = ExpectedActiveSpeaker | ExpectedReceiverSelected;
17
20
 
21
+ const maxPayloadBitsPerSecond = 10 * 1000 * 1000; // for now we always send this fixed constant
22
+
23
+ const degradationPreferences = {
24
+ maxMacroblocksLimit: Infinity, // no limit
25
+ };
26
+
18
27
  describe('MediaRequestManager', () => {
19
28
  const CROSS_PRIORITY_DUPLICATION = true;
20
29
  const CROSS_POLICY_DUPLICATION = true;
@@ -31,7 +40,10 @@ describe('MediaRequestManager', () => {
31
40
 
32
41
  beforeEach(() => {
33
42
  sendMediaRequestsCallback = sinon.stub();
34
- mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback);
43
+ mediaRequestManager = new MediaRequestManager(
44
+ degradationPreferences,
45
+ sendMediaRequestsCallback
46
+ );
35
47
 
36
48
  // create some fake receive slots used by the tests
37
49
  fakeWcmeSlots = Array(NUM_SLOTS)
@@ -53,7 +65,7 @@ describe('MediaRequestManager', () => {
53
65
  });
54
66
 
55
67
  // helper function for adding an active speaker request
56
- const addActiveSpeakerRequest = (priority, receiveSlots, commit = false) =>
68
+ const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false) =>
57
69
  mediaRequestManager.addRequest(
58
70
  {
59
71
  policyInfo: {
@@ -66,14 +78,14 @@ describe('MediaRequestManager', () => {
66
78
  receiveSlots,
67
79
  codecInfo: {
68
80
  codec: 'h264',
69
- maxFs: ACTIVE_SPEAKER_MAX_FS,
81
+ maxFs: maxFs,
70
82
  },
71
83
  },
72
84
  commit
73
85
  );
74
86
 
75
87
  // helper function for adding a receiver selected request
76
- const addReceiverSelectedRequest = (csi, receiveSlot, commit = false) =>
88
+ const addReceiverSelectedRequest = (csi, receiveSlot, maxFs, commit = false) =>
77
89
  mediaRequestManager.addRequest(
78
90
  {
79
91
  policyInfo: {
@@ -83,7 +95,7 @@ describe('MediaRequestManager', () => {
83
95
  receiveSlots: [receiveSlot],
84
96
  codecInfo: {
85
97
  codec: 'h264',
86
- maxFs: RECEIVER_SELECTED_MAX_FS,
98
+ maxFs: maxFs,
87
99
  },
88
100
  },
89
101
  commit
@@ -109,11 +121,12 @@ describe('MediaRequestManager', () => {
109
121
  preferLiveVideo: PREFER_LIVE_VIDEO,
110
122
  }),
111
123
  receiveSlots: expectedRequest.receiveSlots,
124
+ maxPayloadBitsPerSecond,
112
125
  codecInfos: [
113
126
  sinon.match({
114
127
  payloadType: 0x80,
115
128
  h264: sinon.match({
116
- maxFs: ACTIVE_SPEAKER_MAX_FS,
129
+ maxFs: expectedRequest.maxFs,
117
130
  }),
118
131
  }),
119
132
  ],
@@ -126,11 +139,12 @@ describe('MediaRequestManager', () => {
126
139
  csi: expectedRequest.csi,
127
140
  }),
128
141
  receiveSlots: [expectedRequest.receiveSlot],
142
+ maxPayloadBitsPerSecond,
129
143
  codecInfos: [
130
144
  sinon.match({
131
145
  payloadType: 0x80,
132
146
  h264: sinon.match({
133
- maxFs: RECEIVER_SELECTED_MAX_FS,
147
+ maxFs: expectedRequest.maxFs,
134
148
  }),
135
149
  }),
136
150
  ],
@@ -270,44 +284,79 @@ describe('MediaRequestManager', () => {
270
284
 
271
285
  it('keeps adding requests with every call to addRequest()', () => {
272
286
  // start with 1 request
273
- addReceiverSelectedRequest(100, fakeReceiveSlots[0], true);
287
+ addReceiverSelectedRequest(100, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, true);
274
288
 
275
289
  checkMediaRequestsSent([
276
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[0]},
290
+ {
291
+ policy: 'receiver-selected',
292
+ csi: 100,
293
+ receiveSlot: fakeWcmeSlots[0],
294
+ maxFs: RECEIVER_SELECTED_MAX_FS,
295
+ },
277
296
  ]);
278
297
 
279
298
  // now add another one
280
- addReceiverSelectedRequest(101, fakeReceiveSlots[1], true);
299
+ addReceiverSelectedRequest(101, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, true);
281
300
 
282
301
  checkMediaRequestsSent([
283
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[0]},
284
- {policy: 'receiver-selected', csi: 101, receiveSlot: fakeWcmeSlots[1]},
302
+ {
303
+ policy: 'receiver-selected',
304
+ csi: 100,
305
+ receiveSlot: fakeWcmeSlots[0],
306
+ maxFs: RECEIVER_SELECTED_MAX_FS,
307
+ },
308
+ {
309
+ policy: 'receiver-selected',
310
+ csi: 101,
311
+ receiveSlot: fakeWcmeSlots[1],
312
+ maxFs: RECEIVER_SELECTED_MAX_FS,
313
+ },
285
314
  ]);
286
315
 
287
316
  // and one more
288
317
  addActiveSpeakerRequest(
289
318
  1,
290
319
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
320
+ ACTIVE_SPEAKER_MAX_FS,
291
321
  true
292
322
  );
293
323
 
294
324
  checkMediaRequestsSent([
295
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[0]},
296
- {policy: 'receiver-selected', csi: 101, receiveSlot: fakeWcmeSlots[1]},
325
+ {
326
+ policy: 'receiver-selected',
327
+ csi: 100,
328
+ receiveSlot: fakeWcmeSlots[0],
329
+ maxFs: RECEIVER_SELECTED_MAX_FS,
330
+ },
331
+ {
332
+ policy: 'receiver-selected',
333
+ csi: 101,
334
+ receiveSlot: fakeWcmeSlots[1],
335
+ maxFs: RECEIVER_SELECTED_MAX_FS,
336
+ },
297
337
  {
298
338
  policy: 'active-speaker',
299
339
  priority: 1,
300
340
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
341
+ maxFs: ACTIVE_SPEAKER_MAX_FS,
301
342
  },
302
343
  ]);
303
344
  });
304
345
 
305
346
  it('cancels the requests correctly when cancelRequest() is called with commit=true', () => {
306
347
  const requestIds = [
307
- addActiveSpeakerRequest(255, [fakeReceiveSlots[0], fakeReceiveSlots[1]]),
308
- addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]]),
309
- addReceiverSelectedRequest(100, fakeReceiveSlots[4]),
310
- addReceiverSelectedRequest(200, fakeReceiveSlots[5]),
348
+ addActiveSpeakerRequest(
349
+ 255,
350
+ [fakeReceiveSlots[0], fakeReceiveSlots[1]],
351
+ ACTIVE_SPEAKER_MAX_FS
352
+ ),
353
+ addActiveSpeakerRequest(
354
+ 255,
355
+ [fakeReceiveSlots[2], fakeReceiveSlots[3]],
356
+ ACTIVE_SPEAKER_MAX_FS
357
+ ),
358
+ addReceiverSelectedRequest(100, fakeReceiveSlots[4], RECEIVER_SELECTED_MAX_FS),
359
+ addReceiverSelectedRequest(200, fakeReceiveSlots[5], RECEIVER_SELECTED_MAX_FS),
311
360
  ];
312
361
 
313
362
  // cancel one of the active speaker requests
@@ -315,9 +364,24 @@ describe('MediaRequestManager', () => {
315
364
 
316
365
  // expect only the 3 remaining requests to be sent out
317
366
  checkMediaRequestsSent([
318
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]]},
319
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[4]},
320
- {policy: 'receiver-selected', csi: 200, receiveSlot: fakeWcmeSlots[5]},
367
+ {
368
+ policy: 'active-speaker',
369
+ priority: 255,
370
+ receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
371
+ maxFs: ACTIVE_SPEAKER_MAX_FS,
372
+ },
373
+ {
374
+ policy: 'receiver-selected',
375
+ csi: 100,
376
+ receiveSlot: fakeWcmeSlots[4],
377
+ maxFs: RECEIVER_SELECTED_MAX_FS,
378
+ },
379
+ {
380
+ policy: 'receiver-selected',
381
+ csi: 200,
382
+ receiveSlot: fakeWcmeSlots[5],
383
+ maxFs: RECEIVER_SELECTED_MAX_FS,
384
+ },
321
385
  ]);
322
386
 
323
387
  // cancel one of the receiver selected requests
@@ -325,8 +389,18 @@ describe('MediaRequestManager', () => {
325
389
 
326
390
  // expect only the 2 remaining requests to be sent out
327
391
  checkMediaRequestsSent([
328
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]]},
329
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[4]},
392
+ {
393
+ policy: 'active-speaker',
394
+ priority: 255,
395
+ receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
396
+ maxFs: ACTIVE_SPEAKER_MAX_FS,
397
+ },
398
+ {
399
+ policy: 'receiver-selected',
400
+ csi: 100,
401
+ receiveSlot: fakeWcmeSlots[4],
402
+ maxFs: RECEIVER_SELECTED_MAX_FS,
403
+ },
330
404
  ]);
331
405
  });
332
406
 
@@ -334,9 +408,10 @@ describe('MediaRequestManager', () => {
334
408
  addActiveSpeakerRequest(
335
409
  10,
336
410
  [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
411
+ ACTIVE_SPEAKER_MAX_FS,
337
412
  false
338
413
  );
339
- addReceiverSelectedRequest(123, fakeReceiveSlots[3], false);
414
+ addReceiverSelectedRequest(123, fakeReceiveSlots[3], RECEIVER_SELECTED_MAX_FS, false);
340
415
 
341
416
  // nothing should be sent out as we didn't commit the requests
342
417
  assert.notCalled(sendMediaRequestsCallback);
@@ -350,8 +425,14 @@ describe('MediaRequestManager', () => {
350
425
  policy: 'active-speaker',
351
426
  priority: 10,
352
427
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
428
+ maxFs: ACTIVE_SPEAKER_MAX_FS,
429
+ },
430
+ {
431
+ policy: 'receiver-selected',
432
+ csi: 123,
433
+ receiveSlot: fakeWcmeSlots[3],
434
+ maxFs: RECEIVER_SELECTED_MAX_FS,
353
435
  },
354
- {policy: 'receiver-selected', csi: 123, receiveSlot: fakeWcmeSlots[3]},
355
436
  ]);
356
437
  });
357
438
 
@@ -361,11 +442,12 @@ describe('MediaRequestManager', () => {
361
442
  addActiveSpeakerRequest(
362
443
  250,
363
444
  [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
445
+ ACTIVE_SPEAKER_MAX_FS,
364
446
  false
365
447
  ),
366
- addReceiverSelectedRequest(98765, fakeReceiveSlots[3], false),
367
- addReceiverSelectedRequest(99999, fakeReceiveSlots[4], false),
368
- addReceiverSelectedRequest(88888, fakeReceiveSlots[5], true),
448
+ addReceiverSelectedRequest(98765, fakeReceiveSlots[3], RECEIVER_SELECTED_MAX_FS, false),
449
+ addReceiverSelectedRequest(99999, fakeReceiveSlots[4], RECEIVER_SELECTED_MAX_FS, false),
450
+ addReceiverSelectedRequest(88888, fakeReceiveSlots[5], RECEIVER_SELECTED_MAX_FS, true),
369
451
  ];
370
452
 
371
453
  checkMediaRequestsSent([
@@ -373,10 +455,26 @@ describe('MediaRequestManager', () => {
373
455
  policy: 'active-speaker',
374
456
  priority: 250,
375
457
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
458
+ maxFs: ACTIVE_SPEAKER_MAX_FS,
459
+ },
460
+ {
461
+ policy: 'receiver-selected',
462
+ csi: 98765,
463
+ receiveSlot: fakeWcmeSlots[3],
464
+ maxFs: RECEIVER_SELECTED_MAX_FS,
465
+ },
466
+ {
467
+ policy: 'receiver-selected',
468
+ csi: 99999,
469
+ receiveSlot: fakeWcmeSlots[4],
470
+ maxFs: RECEIVER_SELECTED_MAX_FS,
471
+ },
472
+ {
473
+ policy: 'receiver-selected',
474
+ csi: 88888,
475
+ receiveSlot: fakeWcmeSlots[5],
476
+ maxFs: RECEIVER_SELECTED_MAX_FS,
376
477
  },
377
- {policy: 'receiver-selected', csi: 98765, receiveSlot: fakeWcmeSlots[3]},
378
- {policy: 'receiver-selected', csi: 99999, receiveSlot: fakeWcmeSlots[4]},
379
- {policy: 'receiver-selected', csi: 88888, receiveSlot: fakeWcmeSlots[5]},
380
478
  ]);
381
479
 
382
480
  // now cancel 3 of them, but with commit=false => nothing should happen
@@ -390,22 +488,29 @@ describe('MediaRequestManager', () => {
390
488
  mediaRequestManager.commit();
391
489
 
392
490
  checkMediaRequestsSent([
393
- {policy: 'receiver-selected', csi: 98765, receiveSlot: fakeWcmeSlots[3]},
491
+ {
492
+ policy: 'receiver-selected',
493
+ csi: 98765,
494
+ receiveSlot: fakeWcmeSlots[3],
495
+ maxFs: RECEIVER_SELECTED_MAX_FS,
496
+ },
394
497
  ]);
395
498
  });
396
499
 
397
500
  it('sends the wcme media requests when commit() is called', () => {
398
501
  // send some requests, all of them with commit=false
399
- addReceiverSelectedRequest(123000, fakeReceiveSlots[0], false);
400
- addReceiverSelectedRequest(456000, fakeReceiveSlots[1], false);
502
+ addReceiverSelectedRequest(123000, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, false);
503
+ addReceiverSelectedRequest(456000, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, false);
401
504
  addActiveSpeakerRequest(
402
505
  255,
403
506
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
507
+ ACTIVE_SPEAKER_MAX_FS,
404
508
  false
405
509
  );
406
510
  addActiveSpeakerRequest(
407
511
  254,
408
512
  [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
513
+ ACTIVE_SPEAKER_MAX_FS,
409
514
  false
410
515
  );
411
516
 
@@ -417,33 +522,47 @@ describe('MediaRequestManager', () => {
417
522
 
418
523
  // check that all requests have been sent out
419
524
  checkMediaRequestsSent([
420
- {policy: 'receiver-selected', csi: 123000, receiveSlot: fakeWcmeSlots[0]},
421
- {policy: 'receiver-selected', csi: 456000, receiveSlot: fakeWcmeSlots[1]},
525
+ {
526
+ policy: 'receiver-selected',
527
+ csi: 123000,
528
+ receiveSlot: fakeWcmeSlots[0],
529
+ maxFs: RECEIVER_SELECTED_MAX_FS,
530
+ },
531
+ {
532
+ policy: 'receiver-selected',
533
+ csi: 456000,
534
+ receiveSlot: fakeWcmeSlots[1],
535
+ maxFs: RECEIVER_SELECTED_MAX_FS,
536
+ },
422
537
  {
423
538
  policy: 'active-speaker',
424
539
  priority: 255,
425
540
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
541
+ maxFs: ACTIVE_SPEAKER_MAX_FS,
426
542
  },
427
543
  {
428
544
  policy: 'active-speaker',
429
545
  priority: 254,
430
546
  receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
547
+ maxFs: ACTIVE_SPEAKER_MAX_FS,
431
548
  },
432
549
  ]);
433
550
  });
434
551
 
435
552
  it('clears all the requests on reset()', () => {
436
553
  // send some requests and commit them one by one
437
- addReceiverSelectedRequest(1500, fakeReceiveSlots[0], true);
438
- addReceiverSelectedRequest(1501, fakeReceiveSlots[1], true);
554
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, true);
555
+ addReceiverSelectedRequest(1501, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, true);
439
556
  addActiveSpeakerRequest(
440
557
  255,
441
558
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
559
+ ACTIVE_SPEAKER_MAX_FS,
442
560
  true
443
561
  );
444
562
  addActiveSpeakerRequest(
445
563
  254,
446
564
  [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
565
+ ACTIVE_SPEAKER_MAX_FS,
447
566
  true
448
567
  );
449
568
 
@@ -453,17 +572,29 @@ describe('MediaRequestManager', () => {
453
572
  mediaRequestManager.commit();
454
573
 
455
574
  checkMediaRequestsSent([
456
- {policy: 'receiver-selected', csi: 1500, receiveSlot: fakeWcmeSlots[0]},
457
- {policy: 'receiver-selected', csi: 1501, receiveSlot: fakeWcmeSlots[1]},
575
+ {
576
+ policy: 'receiver-selected',
577
+ csi: 1500,
578
+ receiveSlot: fakeWcmeSlots[0],
579
+ maxFs: RECEIVER_SELECTED_MAX_FS,
580
+ },
581
+ {
582
+ policy: 'receiver-selected',
583
+ csi: 1501,
584
+ receiveSlot: fakeWcmeSlots[1],
585
+ maxFs: RECEIVER_SELECTED_MAX_FS,
586
+ },
458
587
  {
459
588
  policy: 'active-speaker',
460
589
  priority: 255,
461
590
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
591
+ maxFs: ACTIVE_SPEAKER_MAX_FS,
462
592
  },
463
593
  {
464
594
  policy: 'active-speaker',
465
595
  priority: 254,
466
596
  receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
597
+ maxFs: ACTIVE_SPEAKER_MAX_FS,
467
598
  },
468
599
  ]);
469
600
 
@@ -477,18 +608,46 @@ describe('MediaRequestManager', () => {
477
608
 
478
609
  it('calls resetSourceState() on slots that are stopped being used', () => {
479
610
  const requestIds = [
480
- addActiveSpeakerRequest(255, [fakeReceiveSlots[0], fakeReceiveSlots[1]]),
481
- addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]]),
482
- addReceiverSelectedRequest(100, fakeReceiveSlots[4]),
483
- addReceiverSelectedRequest(200, fakeReceiveSlots[5]),
611
+ addActiveSpeakerRequest(
612
+ 255,
613
+ [fakeReceiveSlots[0], fakeReceiveSlots[1]],
614
+ ACTIVE_SPEAKER_MAX_FS
615
+ ),
616
+ addActiveSpeakerRequest(
617
+ 255,
618
+ [fakeReceiveSlots[2], fakeReceiveSlots[3]],
619
+ ACTIVE_SPEAKER_MAX_FS
620
+ ),
621
+ addReceiverSelectedRequest(100, fakeReceiveSlots[4], RECEIVER_SELECTED_MAX_FS),
622
+ addReceiverSelectedRequest(200, fakeReceiveSlots[5], RECEIVER_SELECTED_MAX_FS),
484
623
  ];
485
624
 
486
625
  mediaRequestManager.commit();
487
626
  checkMediaRequestsSent([
488
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]]},
489
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3]]},
490
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[4]},
491
- {policy: 'receiver-selected', csi: 200, receiveSlot: fakeWcmeSlots[5]},
627
+ {
628
+ policy: 'active-speaker',
629
+ priority: 255,
630
+ receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
631
+ maxFs: ACTIVE_SPEAKER_MAX_FS,
632
+ },
633
+ {
634
+ policy: 'active-speaker',
635
+ priority: 255,
636
+ receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3]],
637
+ maxFs: ACTIVE_SPEAKER_MAX_FS,
638
+ },
639
+ {
640
+ policy: 'receiver-selected',
641
+ csi: 100,
642
+ receiveSlot: fakeWcmeSlots[4],
643
+ maxFs: RECEIVER_SELECTED_MAX_FS,
644
+ },
645
+ {
646
+ policy: 'receiver-selected',
647
+ csi: 200,
648
+ receiveSlot: fakeWcmeSlots[5],
649
+ maxFs: RECEIVER_SELECTED_MAX_FS,
650
+ },
492
651
  ]);
493
652
 
494
653
  // cancel 2 of the requests
@@ -499,8 +658,18 @@ describe('MediaRequestManager', () => {
499
658
 
500
659
  // expect only the 2 remaining requests to be sent out
501
660
  checkMediaRequestsSent([
502
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]]},
503
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[4]},
661
+ {
662
+ policy: 'active-speaker',
663
+ priority: 255,
664
+ receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
665
+ maxFs: ACTIVE_SPEAKER_MAX_FS,
666
+ },
667
+ {
668
+ policy: 'receiver-selected',
669
+ csi: 100,
670
+ receiveSlot: fakeWcmeSlots[4],
671
+ maxFs: RECEIVER_SELECTED_MAX_FS,
672
+ },
504
673
  ]);
505
674
 
506
675
  // and that the receive slots of the 2 cancelled ones had resetSourceState() called
@@ -508,4 +677,101 @@ describe('MediaRequestManager', () => {
508
677
  assert.calledOnce(fakeReceiveSlots[3].resetSourceState);
509
678
  assert.calledOnce(fakeReceiveSlots[5].resetSourceState);
510
679
  });
680
+
681
+ it('re-sends media requests after degradation preferences are set', () => {
682
+ // set max macroblocks limit
683
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
684
+ assert.calledOnce(sendMediaRequestsCallback);
685
+ });
686
+
687
+ it('can degrade max-fs once when request exceeds max macroblocks limit', () => {
688
+ // set max macroblocks limit
689
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
690
+ sendMediaRequestsCallback.resetHistory();
691
+
692
+ // request 3 "large" 1080p streams
693
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 3), getMaxFs('large'), false);
694
+
695
+ // request additional "large" 1080p stream to exceed max macroblocks limit
696
+ const additionalRequestId = addReceiverSelectedRequest(
697
+ 123,
698
+ fakeReceiveSlots[3],
699
+ getMaxFs('large'),
700
+ true
701
+ );
702
+
703
+ // check that resulting requests are 4 "medium" 720p streams
704
+ checkMediaRequestsSent([
705
+ {
706
+ policy: 'active-speaker',
707
+ priority: 255,
708
+ receiveSlots: fakeWcmeSlots.slice(0, 3),
709
+ maxFs: getMaxFs('medium'),
710
+ },
711
+ {
712
+ policy: 'receiver-selected',
713
+ csi: 123,
714
+ receiveSlot: fakeWcmeSlots[3],
715
+ maxFs: getMaxFs('medium'),
716
+ },
717
+ ]);
718
+
719
+ // cancel additional request
720
+ mediaRequestManager.cancelRequest(additionalRequestId);
721
+
722
+ // check that resulting requests are 3 "large" 1080p streams
723
+ checkMediaRequestsSent([
724
+ {
725
+ policy: 'active-speaker',
726
+ priority: 255,
727
+ receiveSlots: fakeWcmeSlots.slice(0, 3),
728
+ maxFs: getMaxFs('large'),
729
+ },
730
+ ]);
731
+ });
732
+
733
+ it('can degrade max-fs multiple times when request exceeds max macroblocks limit', () => {
734
+ // set max macroblocks limit
735
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
736
+ sendMediaRequestsCallback.resetHistory();
737
+
738
+ // request 10 "large" 1080p streams
739
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 10), getMaxFs('large'), true);
740
+
741
+ // check that resulting requests are 10 "small" 360p streams
742
+ checkMediaRequestsSent([
743
+ {
744
+ policy: 'active-speaker',
745
+ priority: 255,
746
+ receiveSlots: fakeWcmeSlots.slice(0, 10),
747
+ maxFs: getMaxFs('small'),
748
+ },
749
+ ]);
750
+ });
751
+
752
+ it('can degrade only the largest max-fs when request exceeds max macroblocks limit', () => {
753
+ // set max macroblocks limit
754
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
755
+ sendMediaRequestsCallback.resetHistory();
756
+
757
+ // request 5 "large" 1080p streams and 5 "small" 360p streams
758
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 5), getMaxFs('large'), false);
759
+ addActiveSpeakerRequest(254, fakeReceiveSlots.slice(5, 10), getMaxFs('small'), true);
760
+
761
+ // check that resulting requests are 5 "medium" 720p streams and 5 "small" 360p streams
762
+ checkMediaRequestsSent([
763
+ {
764
+ policy: 'active-speaker',
765
+ priority: 255,
766
+ receiveSlots: fakeWcmeSlots.slice(0, 5),
767
+ maxFs: getMaxFs('medium'),
768
+ },
769
+ {
770
+ policy: 'active-speaker',
771
+ priority: 254,
772
+ receiveSlots: fakeWcmeSlots.slice(5, 10),
773
+ maxFs: getMaxFs('small'),
774
+ },
775
+ ]);
776
+ });
511
777
  });