@webex/plugin-meetings 3.0.0-beta.7 → 3.0.0-beta.71

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 (506) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +178 -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 +843 -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 +56 -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 +143 -52
  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 +16 -0
  68. package/dist/controls-options-manager/enums.js.map +1 -0
  69. package/dist/controls-options-manager/index.js +261 -0
  70. package/dist/controls-options-manager/index.js.map +1 -0
  71. package/dist/controls-options-manager/util.js +39 -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 +31 -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 +237 -198
  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 +80 -89
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.js +56 -146
  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 +31 -14
  102. package/dist/meeting/in-meeting-actions.js.map +1 -1
  103. package/dist/meeting/index.js +2225 -2244
  104. package/dist/meeting/index.js.map +1 -1
  105. package/dist/meeting/muteState.js +102 -100
  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 +63 -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 +26 -19
  128. package/dist/meetings/collection.js.map +1 -1
  129. package/dist/meetings/index.js +565 -552
  130. package/dist/meetings/index.js.map +1 -1
  131. package/dist/meetings/request.js +26 -41
  132. package/dist/meetings/request.js.map +1 -1
  133. package/dist/meetings/util.js +151 -155
  134. package/dist/meetings/util.js.map +1 -1
  135. package/dist/member/index.js +100 -85
  136. package/dist/member/index.js.map +1 -1
  137. package/dist/member/types.js +15 -0
  138. package/dist/member/types.js.map +1 -0
  139. package/dist/member/util.js +90 -68
  140. package/dist/member/util.js.map +1 -1
  141. package/dist/members/collection.js +13 -12
  142. package/dist/members/collection.js.map +1 -1
  143. package/dist/members/index.js +152 -204
  144. package/dist/members/index.js.map +1 -1
  145. package/dist/members/request.js +35 -39
  146. package/dist/members/request.js.map +1 -1
  147. package/dist/members/types.js +15 -0
  148. package/dist/members/types.js.map +1 -0
  149. package/dist/members/util.js +76 -46
  150. package/dist/members/util.js.map +1 -1
  151. package/dist/metrics/config.js +4 -14
  152. package/dist/metrics/config.js.map +1 -1
  153. package/dist/metrics/constants.js +1 -6
  154. package/dist/metrics/constants.js.map +1 -1
  155. package/dist/metrics/index.js +59 -156
  156. package/dist/metrics/index.js.map +1 -1
  157. package/dist/multistream/mediaRequestManager.js +116 -52
  158. package/dist/multistream/mediaRequestManager.js.map +1 -1
  159. package/dist/multistream/receiveSlot.js +58 -65
  160. package/dist/multistream/receiveSlot.js.map +1 -1
  161. package/dist/multistream/receiveSlotManager.js +58 -93
  162. package/dist/multistream/receiveSlotManager.js.map +1 -1
  163. package/dist/multistream/remoteMedia.js +55 -74
  164. package/dist/multistream/remoteMedia.js.map +1 -1
  165. package/dist/multistream/remoteMediaGroup.js +6 -40
  166. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  167. package/dist/multistream/remoteMediaManager.js +466 -442
  168. package/dist/multistream/remoteMediaManager.js.map +1 -1
  169. package/dist/networkQualityMonitor/index.js +40 -59
  170. package/dist/networkQualityMonitor/index.js.map +1 -1
  171. package/dist/personal-meeting-room/index.js +21 -45
  172. package/dist/personal-meeting-room/index.js.map +1 -1
  173. package/dist/personal-meeting-room/request.js +1 -31
  174. package/dist/personal-meeting-room/request.js.map +1 -1
  175. package/dist/personal-meeting-room/util.js +0 -13
  176. package/dist/personal-meeting-room/util.js.map +1 -1
  177. package/dist/reachability/index.js +192 -191
  178. package/dist/reachability/index.js.map +1 -1
  179. package/dist/reachability/request.js +15 -23
  180. package/dist/reachability/request.js.map +1 -1
  181. package/dist/reactions/constants.js +13 -0
  182. package/dist/reactions/constants.js.map +1 -0
  183. package/dist/reactions/reactions.js +109 -0
  184. package/dist/reactions/reactions.js.map +1 -0
  185. package/dist/reactions/reactions.type.js +36 -0
  186. package/dist/reactions/reactions.type.js.map +1 -0
  187. package/dist/reconnection-manager/index.js +342 -460
  188. package/dist/reconnection-manager/index.js.map +1 -1
  189. package/dist/recording-controller/enums.js +17 -0
  190. package/dist/recording-controller/enums.js.map +1 -0
  191. package/dist/recording-controller/index.js +343 -0
  192. package/dist/recording-controller/index.js.map +1 -0
  193. package/dist/recording-controller/util.js +63 -0
  194. package/dist/recording-controller/util.js.map +1 -0
  195. package/dist/roap/index.js +48 -70
  196. package/dist/roap/index.js.map +1 -1
  197. package/dist/roap/request.js +143 -131
  198. package/dist/roap/request.js.map +1 -1
  199. package/dist/roap/turnDiscovery.js +91 -98
  200. package/dist/roap/turnDiscovery.js.map +1 -1
  201. package/dist/statsAnalyzer/global.js +1 -95
  202. package/dist/statsAnalyzer/global.js.map +1 -1
  203. package/dist/statsAnalyzer/index.js +372 -455
  204. package/dist/statsAnalyzer/index.js.map +1 -1
  205. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  206. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  207. package/dist/transcription/index.js +22 -47
  208. package/dist/transcription/index.js.map +1 -1
  209. package/dist/types/breakouts/breakout.d.ts +8 -0
  210. package/dist/types/breakouts/collection.d.ts +5 -0
  211. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  212. package/dist/types/breakouts/index.d.ts +5 -0
  213. package/dist/types/breakouts/request.d.ts +22 -0
  214. package/dist/types/breakouts/utils.d.ts +8 -0
  215. package/dist/types/common/browser-detection.d.ts +9 -0
  216. package/dist/types/common/collection.d.ts +48 -0
  217. package/dist/types/common/config.d.ts +2 -0
  218. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  219. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  220. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  221. package/dist/types/common/errors/media.d.ts +15 -0
  222. package/dist/types/common/errors/parameter.d.ts +15 -0
  223. package/dist/types/common/errors/password-error.d.ts +15 -0
  224. package/dist/types/common/errors/permission.d.ts +14 -0
  225. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  226. package/dist/types/common/errors/reconnection.d.ts +15 -0
  227. package/dist/types/common/errors/stats.d.ts +15 -0
  228. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  229. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  230. package/dist/types/common/events/events-scope.d.ts +17 -0
  231. package/dist/types/common/events/events.d.ts +12 -0
  232. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  233. package/dist/types/common/events/util.d.ts +2 -0
  234. package/dist/types/common/logs/logger-config.d.ts +2 -0
  235. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  236. package/dist/types/common/logs/request.d.ts +34 -0
  237. package/dist/types/common/queue.d.ts +32 -0
  238. package/dist/types/config.d.ts +77 -0
  239. package/dist/types/constants.d.ts +944 -0
  240. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  241. package/dist/types/controls-options-manager/enums.d.ts +6 -0
  242. package/dist/types/controls-options-manager/index.d.ts +128 -0
  243. package/dist/types/controls-options-manager/util.d.ts +9 -0
  244. package/dist/types/index.d.ts +6 -0
  245. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  246. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  247. package/dist/types/locus-info/fullState.d.ts +2 -0
  248. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  249. package/dist/types/locus-info/index.d.ts +276 -0
  250. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  251. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  252. package/dist/types/locus-info/parser.d.ts +212 -0
  253. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  254. package/dist/types/media/index.d.ts +32 -0
  255. package/dist/types/media/properties.d.ts +108 -0
  256. package/dist/types/media/util.d.ts +2 -0
  257. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  258. package/dist/types/meeting/in-meeting-actions.d.ts +101 -0
  259. package/dist/types/meeting/index.d.ts +1720 -0
  260. package/dist/types/meeting/muteState.d.ts +132 -0
  261. package/dist/types/meeting/request.d.ts +271 -0
  262. package/dist/types/meeting/request.type.d.ts +11 -0
  263. package/dist/types/meeting/state.d.ts +9 -0
  264. package/dist/types/meeting/util.d.ts +2 -0
  265. package/dist/types/meeting-info/collection.d.ts +20 -0
  266. package/dist/types/meeting-info/index.d.ts +57 -0
  267. package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
  268. package/dist/types/meeting-info/request.d.ts +22 -0
  269. package/dist/types/meeting-info/util.d.ts +2 -0
  270. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  271. package/dist/types/meetings/collection.d.ts +31 -0
  272. package/dist/types/meetings/index.d.ts +315 -0
  273. package/dist/types/meetings/request.d.ts +27 -0
  274. package/dist/types/meetings/util.d.ts +18 -0
  275. package/dist/types/member/index.d.ts +156 -0
  276. package/dist/types/member/types.d.ts +21 -0
  277. package/dist/types/member/util.d.ts +2 -0
  278. package/dist/types/members/collection.d.ts +29 -0
  279. package/dist/types/members/index.d.ts +343 -0
  280. package/dist/types/members/request.d.ts +58 -0
  281. package/dist/types/members/types.d.ts +24 -0
  282. package/dist/types/members/util.d.ts +2 -0
  283. package/dist/types/metrics/config.d.ts +171 -0
  284. package/dist/types/metrics/constants.d.ts +53 -0
  285. package/dist/types/metrics/index.d.ts +152 -0
  286. package/dist/types/multistream/mediaRequestManager.d.ts +68 -0
  287. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  288. package/dist/types/multistream/receiveSlotManager.d.ts +49 -0
  289. package/dist/types/multistream/remoteMedia.d.ts +100 -0
  290. package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
  291. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  292. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  293. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  294. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  295. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  296. package/dist/types/reachability/index.d.ts +152 -0
  297. package/dist/types/reachability/request.d.ts +37 -0
  298. package/dist/types/reactions/constants.d.ts +3 -0
  299. package/dist/types/reactions/reactions.d.ts +4 -0
  300. package/dist/types/reactions/reactions.type.d.ts +52 -0
  301. package/dist/types/reconnection-manager/index.d.ts +126 -0
  302. package/dist/types/recording-controller/enums.d.ts +7 -0
  303. package/dist/types/recording-controller/index.d.ts +193 -0
  304. package/dist/types/recording-controller/util.d.ts +13 -0
  305. package/dist/types/roap/index.d.ts +77 -0
  306. package/dist/types/roap/request.d.ts +38 -0
  307. package/dist/types/roap/turnDiscovery.d.ts +74 -0
  308. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  309. package/dist/types/statsAnalyzer/index.d.ts +195 -0
  310. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  311. package/dist/types/transcription/index.d.ts +64 -0
  312. package/internal-README.md +7 -6
  313. package/package.json +27 -21
  314. package/src/breakouts/README.md +219 -0
  315. package/src/breakouts/breakout.ts +153 -0
  316. package/src/breakouts/collection.ts +19 -0
  317. package/src/breakouts/edit-lock-error.ts +25 -0
  318. package/src/breakouts/index.ts +745 -0
  319. package/src/breakouts/request.ts +55 -0
  320. package/src/breakouts/utils.ts +44 -0
  321. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  322. package/src/common/collection.ts +9 -7
  323. package/src/common/{config.js → config.ts} +1 -1
  324. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  325. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  326. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  327. package/src/common/errors/{media.js → media.ts} +11 -7
  328. package/src/common/errors/parameter.ts +11 -7
  329. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  330. package/src/common/errors/{permission.js → permission.ts} +10 -6
  331. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  332. package/src/common/errors/{stats.js → stats.ts} +11 -7
  333. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  334. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  335. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  336. package/src/common/events/{events.js → events.ts} +5 -1
  337. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  338. package/src/common/events/{util.js → util.ts} +2 -3
  339. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  340. package/src/common/logs/logger-proxy.ts +44 -0
  341. package/src/common/logs/{request.js → request.ts} +22 -9
  342. package/src/common/queue.ts +1 -2
  343. package/src/{config.js → config.ts} +17 -12
  344. package/src/constants.ts +92 -5
  345. package/src/controls-options-manager/constants.ts +5 -0
  346. package/src/controls-options-manager/enums.ts +7 -0
  347. package/src/controls-options-manager/index.ts +240 -0
  348. package/src/controls-options-manager/util.ts +30 -0
  349. package/src/index.js +4 -1
  350. package/src/locus-info/controlsUtils.ts +141 -0
  351. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  352. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  353. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  354. package/src/locus-info/{index.js → index.ts} +211 -71
  355. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  356. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  357. package/src/locus-info/{parser.js → parser.ts} +67 -79
  358. package/src/locus-info/{selfUtils.js → selfUtils.ts} +183 -67
  359. package/src/media/{index.js → index.ts} +179 -176
  360. package/src/media/{properties.js → properties.ts} +60 -37
  361. package/src/media/{util.js → util.ts} +2 -2
  362. package/src/mediaQualityMetrics/config.ts +384 -0
  363. package/src/meeting/in-meeting-actions.ts +67 -3
  364. package/src/meeting/{index.js → index.ts} +2605 -1605
  365. package/src/meeting/{muteState.js → muteState.ts} +138 -73
  366. package/src/meeting/{request.js → request.ts} +326 -142
  367. package/src/meeting/request.type.ts +13 -0
  368. package/src/meeting/{state.js → state.ts} +50 -35
  369. package/src/meeting/{util.js → util.ts} +131 -115
  370. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  371. package/src/meeting-info/{index.js → index.ts} +42 -36
  372. package/src/meeting-info/meeting-info-v2.ts +273 -0
  373. package/src/meeting-info/{request.js → request.ts} +14 -4
  374. package/src/meeting-info/{util.js → util.ts} +60 -51
  375. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  376. package/src/meetings/{collection.js → collection.ts} +26 -3
  377. package/src/meetings/index.ts +1275 -0
  378. package/src/meetings/{request.js → request.ts} +34 -25
  379. package/src/meetings/{util.js → util.ts} +99 -33
  380. package/src/member/{index.js → index.ts} +124 -56
  381. package/src/member/types.ts +24 -0
  382. package/src/member/{util.js → util.ts} +105 -25
  383. package/src/members/{collection.js → collection.ts} +10 -2
  384. package/src/members/{index.js → index.ts} +281 -144
  385. package/src/members/{request.js → request.ts} +80 -16
  386. package/src/members/types.ts +28 -0
  387. package/src/members/{util.js → util.ts} +108 -55
  388. package/src/metrics/{config.js → config.ts} +255 -92
  389. package/src/metrics/{constants.js → constants.ts} +0 -6
  390. package/src/metrics/{index.js → index.ts} +110 -94
  391. package/src/multistream/mediaRequestManager.ts +144 -40
  392. package/src/multistream/receiveSlot.ts +69 -26
  393. package/src/multistream/receiveSlotManager.ts +50 -38
  394. package/src/multistream/remoteMedia.ts +30 -4
  395. package/src/multistream/remoteMediaGroup.ts +4 -3
  396. package/src/multistream/remoteMediaManager.ts +230 -66
  397. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  398. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  399. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  400. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  401. package/src/reachability/{index.js → index.ts} +157 -94
  402. package/src/reachability/request.ts +46 -35
  403. package/src/reactions/constants.ts +4 -0
  404. package/src/reactions/reactions.ts +104 -0
  405. package/src/reactions/reactions.type.ts +62 -0
  406. package/src/reconnection-manager/{index.js → index.ts} +228 -120
  407. package/src/recording-controller/enums.ts +8 -0
  408. package/src/recording-controller/index.ts +315 -0
  409. package/src/recording-controller/util.ts +58 -0
  410. package/src/roap/{index.js → index.ts} +77 -60
  411. package/src/roap/request.ts +172 -0
  412. package/src/roap/turnDiscovery.ts +81 -41
  413. package/src/statsAnalyzer/global.ts +37 -0
  414. package/src/statsAnalyzer/index.ts +1242 -0
  415. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  416. package/src/transcription/{index.js → index.ts} +46 -39
  417. package/test/integration/spec/converged-space-meetings.js +176 -0
  418. package/test/integration/spec/journey.js +665 -464
  419. package/test/integration/spec/space-meeting.js +320 -206
  420. package/test/integration/spec/transcription.js +7 -8
  421. package/test/unit/spec/breakouts/breakout.ts +178 -0
  422. package/test/unit/spec/breakouts/collection.ts +15 -0
  423. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  424. package/test/unit/spec/breakouts/index.ts +1252 -0
  425. package/test/unit/spec/breakouts/request.ts +104 -0
  426. package/test/unit/spec/breakouts/utils.js +54 -0
  427. package/test/unit/spec/common/browser-detection.js +9 -28
  428. package/test/unit/spec/controls-options-manager/index.js +204 -0
  429. package/test/unit/spec/controls-options-manager/util.js +86 -0
  430. package/test/unit/spec/fixture/locus.js +92 -90
  431. package/test/unit/spec/locus-info/controlsUtils.js +133 -34
  432. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  433. package/test/unit/spec/locus-info/index.js +303 -2
  434. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  435. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  436. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  437. package/test/unit/spec/locus-info/parser.js +3 -9
  438. package/test/unit/spec/locus-info/selfConstant.js +101 -103
  439. package/test/unit/spec/locus-info/selfUtils.js +165 -12
  440. package/test/unit/spec/media/index.ts +72 -8
  441. package/test/unit/spec/media/properties.ts +9 -9
  442. package/test/unit/spec/meeting/in-meeting-actions.ts +29 -2
  443. package/test/unit/spec/meeting/index.js +2503 -802
  444. package/test/unit/spec/meeting/muteState.js +146 -61
  445. package/test/unit/spec/meeting/request.js +141 -43
  446. package/test/unit/spec/meeting/utils.js +135 -164
  447. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  448. package/test/unit/spec/meeting-info/request.js +7 -9
  449. package/test/unit/spec/meeting-info/util.js +11 -12
  450. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  451. package/test/unit/spec/meetings/collection.js +15 -1
  452. package/test/unit/spec/meetings/index.js +622 -263
  453. package/test/unit/spec/meetings/utils.js +65 -14
  454. package/test/unit/spec/member/index.js +24 -1
  455. package/test/unit/spec/member/util.js +359 -32
  456. package/test/unit/spec/members/index.js +294 -54
  457. package/test/unit/spec/members/request.js +50 -20
  458. package/test/unit/spec/members/utils.js +147 -4
  459. package/test/unit/spec/metrics/index.js +16 -21
  460. package/test/unit/spec/multistream/mediaRequestManager.ts +369 -68
  461. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  462. package/test/unit/spec/multistream/receiveSlotManager.ts +60 -38
  463. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  464. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  465. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  466. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  467. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  468. package/test/unit/spec/reachability/index.ts +176 -27
  469. package/test/unit/spec/reachability/request.js +66 -0
  470. package/test/unit/spec/reconnection-manager/index.js +58 -30
  471. package/test/unit/spec/recording-controller/index.js +231 -0
  472. package/test/unit/spec/recording-controller/util.js +102 -0
  473. package/test/unit/spec/roap/index.ts +12 -8
  474. package/test/unit/spec/roap/request.ts +217 -0
  475. package/test/unit/spec/roap/turnDiscovery.ts +72 -49
  476. package/test/unit/spec/stats-analyzer/index.js +108 -57
  477. package/test/utils/cmr.js +44 -42
  478. package/test/utils/constants.js +9 -0
  479. package/test/utils/testUtils.js +98 -77
  480. package/test/utils/webex-config.js +22 -18
  481. package/test/utils/webex-test-users.js +57 -50
  482. package/tsconfig.json +6 -0
  483. package/dist/media/internal-media-core-wrapper.js +0 -22
  484. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  485. package/dist/meeting/effectsState.js +0 -327
  486. package/dist/meeting/effectsState.js.map +0 -1
  487. package/dist/multistream/multistreamMedia.js +0 -116
  488. package/dist/multistream/multistreamMedia.js.map +0 -1
  489. package/dist/peer-connection-manager/util.js +0 -124
  490. package/dist/peer-connection-manager/util.js.map +0 -1
  491. package/src/common/logs/logger-proxy.js +0 -33
  492. package/src/locus-info/controlsUtils.js +0 -102
  493. package/src/media/internal-media-core-wrapper.ts +0 -9
  494. package/src/mediaQualityMetrics/config.js +0 -382
  495. package/src/meeting/effectsState.js +0 -205
  496. package/src/meeting-info/meeting-info-v2.js +0 -255
  497. package/src/meetings/index.js +0 -1015
  498. package/src/multistream/multistreamMedia.ts +0 -92
  499. package/src/peer-connection-manager/util.ts +0 -117
  500. package/src/roap/request.js +0 -127
  501. package/src/statsAnalyzer/global.js +0 -133
  502. package/src/statsAnalyzer/index.js +0 -1006
  503. package/src/statsAnalyzer/mqaUtil.js +0 -173
  504. package/test/unit/spec/meeting/effectsState.js +0 -291
  505. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  506. /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,56 +525,89 @@ 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
- it('clears all the requests on reset()', () => {
555
+ it('avoids sending duplicate requests and 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, false);
558
+ addReceiverSelectedRequest(1501, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, false);
443
559
  addActiveSpeakerRequest(
444
560
  255,
445
561
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
446
- true
562
+ ACTIVE_SPEAKER_MAX_FS,
563
+ false
447
564
  );
448
565
  addActiveSpeakerRequest(
449
566
  254,
450
567
  [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
451
- true
568
+ ACTIVE_SPEAKER_MAX_FS,
569
+ false
452
570
  );
453
571
 
454
- sendMediaRequestsCallback.resetHistory();
572
+ // nothing should be sent out as we didn't commit the requests
573
+ assert.notCalled(sendMediaRequestsCallback);
455
574
 
456
- // check that when calling commit() all requests are re-sent again
457
- mediaRequestManager.commit();
458
575
 
576
+ mediaRequestManager.commit();
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
 
604
+
605
+ // check that when calling commit()
606
+ // all requests are not re-sent again (avoid duplicate requests)
607
+ mediaRequestManager.commit();
608
+
609
+ assert.notCalled(sendMediaRequestsCallback);
610
+
474
611
  // now reset everything
475
612
  mediaRequestManager.reset();
476
613
 
@@ -479,37 +616,201 @@ describe('MediaRequestManager', () => {
479
616
  checkMediaRequestsSent([]);
480
617
  });
481
618
 
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
- ];
619
+ it('makes sure to call requests correctly after reset was called and another request was added', () => {
620
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, false);
621
+
622
+ assert.notCalled(sendMediaRequestsCallback);
623
+
489
624
 
490
625
  mediaRequestManager.commit();
491
626
  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]},
627
+ {
628
+ policy: 'receiver-selected',
629
+ csi: 1500,
630
+ receiveSlot: fakeWcmeSlots[0],
631
+ maxFs: RECEIVER_SELECTED_MAX_FS,
632
+ },
496
633
  ]);
497
634
 
498
- // cancel 2 of the requests
499
- mediaRequestManager.cancelRequest(requestIds[1], false);
500
- mediaRequestManager.cancelRequest(requestIds[3], false);
635
+ // now reset everything
636
+ mediaRequestManager.reset();
637
+
638
+ // calling commit now should not cause any requests to be sent out
639
+ mediaRequestManager.commit();
640
+ checkMediaRequestsSent([]);
501
641
 
642
+ //add new request
643
+ addReceiverSelectedRequest(1501, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, false);
644
+
645
+ // commit
502
646
  mediaRequestManager.commit();
503
647
 
504
- // expect only the 2 remaining requests to be sent out
648
+ // check the new request was sent
649
+ checkMediaRequestsSent([
650
+ {
651
+ policy: 'receiver-selected',
652
+ csi: 1501,
653
+ receiveSlot: fakeWcmeSlots[1],
654
+ maxFs: RECEIVER_SELECTED_MAX_FS,
655
+ },
656
+ ])
657
+ })
658
+
659
+ it('re-sends media requests after degradation preferences are set', () => {
660
+ // set max macroblocks limit
661
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
662
+ assert.calledOnce(sendMediaRequestsCallback);
663
+ });
664
+
665
+ it('should not degrade max-fs if receive slot sources are not live', () => {
666
+ // set receive slot source states to "no source"
667
+ fakeReceiveSlots.forEach((slot) => {
668
+ slot.sourceState = 'no source';
669
+ });
670
+
671
+ // set max macroblocks limit
672
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
673
+ sendMediaRequestsCallback.resetHistory();
674
+
675
+ // request 4 "large" 1080p streams, which should degrade to 720p if live
676
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 4), getMaxFs('large'), true);
677
+
678
+ // check that resulting requests are 4 "large" 1080p streams
679
+ checkMediaRequestsSent([
680
+ {
681
+ policy: 'active-speaker',
682
+ priority: 255,
683
+ receiveSlots: fakeWcmeSlots.slice(0, 4),
684
+ maxFs: getMaxFs('large'),
685
+ },
686
+ ]);
687
+ });
688
+
689
+ it('can degrade max-fs once when request exceeds max macroblocks limit', () => {
690
+ // set max macroblocks limit
691
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
692
+ sendMediaRequestsCallback.resetHistory();
693
+
694
+ // request 3 "large" 1080p streams
695
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 3), getMaxFs('large'), false);
696
+
697
+ // request additional "large" 1080p stream to exceed max macroblocks limit
698
+ const additionalRequestId = addReceiverSelectedRequest(
699
+ 123,
700
+ fakeReceiveSlots[3],
701
+ getMaxFs('large'),
702
+ true
703
+ );
704
+
705
+ // check that resulting requests are 4 "medium" 720p streams
706
+ checkMediaRequestsSent([
707
+ {
708
+ policy: 'active-speaker',
709
+ priority: 255,
710
+ receiveSlots: fakeWcmeSlots.slice(0, 3),
711
+ maxFs: getMaxFs('medium'),
712
+ },
713
+ {
714
+ policy: 'receiver-selected',
715
+ csi: 123,
716
+ receiveSlot: fakeWcmeSlots[3],
717
+ maxFs: getMaxFs('medium'),
718
+ },
719
+ ]);
720
+
721
+ // cancel additional request
722
+ mediaRequestManager.cancelRequest(additionalRequestId);
723
+
724
+ // check that resulting requests are 3 "large" 1080p streams
725
+ checkMediaRequestsSent([
726
+ {
727
+ policy: 'active-speaker',
728
+ priority: 255,
729
+ receiveSlots: fakeWcmeSlots.slice(0, 3),
730
+ maxFs: getMaxFs('large'),
731
+ },
732
+ ]);
733
+ });
734
+
735
+ it('can degrade max-fs multiple times when request exceeds max macroblocks limit', () => {
736
+ // set max macroblocks limit
737
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
738
+ sendMediaRequestsCallback.resetHistory();
739
+
740
+ // request 10 "large" 1080p streams
741
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 10), getMaxFs('large'), true);
742
+
743
+ // check that resulting requests are 10 "small" 360p streams
505
744
  checkMediaRequestsSent([
506
- {policy: 'active-speaker', priority: 255, receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]]},
507
- {policy: 'receiver-selected', csi: 100, receiveSlot: fakeWcmeSlots[4]},
745
+ {
746
+ policy: 'active-speaker',
747
+ priority: 255,
748
+ receiveSlots: fakeWcmeSlots.slice(0, 10),
749
+ maxFs: getMaxFs('small'),
750
+ },
751
+ ]);
752
+ });
753
+
754
+ it('can degrade only the largest max-fs when request exceeds max macroblocks limit', () => {
755
+ // set max macroblocks limit
756
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
757
+ sendMediaRequestsCallback.resetHistory();
758
+
759
+ // request 5 "large" 1080p streams and 5 "small" 360p streams
760
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 5), getMaxFs('large'), false);
761
+ addActiveSpeakerRequest(254, fakeReceiveSlots.slice(5, 10), getMaxFs('small'), true);
762
+
763
+ // check that resulting requests are 5 "medium" 720p streams and 5 "small" 360p streams
764
+ checkMediaRequestsSent([
765
+ {
766
+ policy: 'active-speaker',
767
+ priority: 255,
768
+ receiveSlots: fakeWcmeSlots.slice(0, 5),
769
+ maxFs: getMaxFs('medium'),
770
+ },
771
+ {
772
+ policy: 'active-speaker',
773
+ priority: 254,
774
+ receiveSlots: fakeWcmeSlots.slice(5, 10),
775
+ maxFs: getMaxFs('small'),
776
+ },
508
777
  ]);
778
+ });
779
+
780
+ it('respects the preferredMaxFs if set', () => {
781
+ sendMediaRequestsCallback.resetHistory();
782
+ const clock = FakeTimers.install({now: Date.now()});
783
+
784
+ addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 10), getMaxFs('large'), true);
785
+
786
+ sendMediaRequestsCallback.resetHistory();
787
+
788
+
789
+ const maxFsHandlerCall = fakeReceiveSlots[0].on.getCall(1);
790
+
791
+ const maxFsHandler = maxFsHandlerCall.args[1];
792
+ const eventName = maxFsHandlerCall.args[0];
793
+
794
+ assert.equal(eventName, 'maxFsUpdate');
795
+
796
+ const preferredFrameSize = 100;
797
+
798
+ maxFsHandler({maxFs: preferredFrameSize});
509
799
 
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);
800
+ clock.tick(999);
801
+
802
+ assert.notCalled(sendMediaRequestsCallback);
803
+
804
+ clock.tick(1);
805
+
806
+ checkMediaRequestsSent([
807
+ {
808
+ policy: 'active-speaker',
809
+ priority: 255,
810
+ receiveSlots: fakeWcmeSlots.slice(0, 10),
811
+ maxFs: preferredFrameSize,
812
+ },
813
+ ]);
514
814
  });
815
+
515
816
  });