@webex/plugin-meetings 3.0.0-beta.4 → 3.0.0-beta.41

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