@webex/plugin-meetings 3.0.0-bnr.4 → 3.0.0-stream-classes.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +70 -32
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/events.js +45 -0
  11. package/dist/breakouts/events.js.map +1 -0
  12. package/dist/breakouts/index.js +422 -217
  13. package/dist/breakouts/index.js.map +1 -1
  14. package/dist/breakouts/utils.js +12 -1
  15. package/dist/breakouts/utils.js.map +1 -1
  16. package/dist/common/errors/webex-errors.js +3 -2
  17. package/dist/common/errors/webex-errors.js.map +1 -1
  18. package/dist/common/logs/logger-proxy.js +1 -1
  19. package/dist/common/logs/logger-proxy.js.map +1 -1
  20. package/dist/common/logs/request.d.ts +1 -1
  21. package/dist/common/queue.js +24 -9
  22. package/dist/common/queue.js.map +1 -1
  23. package/dist/config.js +1 -7
  24. package/dist/config.js.map +1 -1
  25. package/dist/constants.js +118 -24
  26. package/dist/constants.js.map +1 -1
  27. package/dist/controls-options-manager/enums.js +2 -0
  28. package/dist/controls-options-manager/enums.js.map +1 -1
  29. package/dist/controls-options-manager/index.js +19 -14
  30. package/dist/controls-options-manager/index.js.map +1 -1
  31. package/dist/controls-options-manager/types.js.map +1 -1
  32. package/dist/controls-options-manager/util.js +80 -11
  33. package/dist/controls-options-manager/util.js.map +1 -1
  34. package/dist/index.js +62 -20
  35. package/dist/index.js.map +1 -1
  36. package/dist/interpretation/collection.js +23 -0
  37. package/dist/interpretation/collection.js.map +1 -0
  38. package/dist/interpretation/index.js +366 -0
  39. package/dist/interpretation/index.js.map +1 -0
  40. package/dist/interpretation/siLanguage.js +25 -0
  41. package/dist/interpretation/siLanguage.js.map +1 -0
  42. package/dist/locus-info/controlsUtils.js +71 -1
  43. package/dist/locus-info/controlsUtils.js.map +1 -1
  44. package/dist/locus-info/index.js +305 -57
  45. package/dist/locus-info/index.js.map +1 -1
  46. package/dist/locus-info/infoUtils.js +7 -1
  47. package/dist/locus-info/infoUtils.js.map +1 -1
  48. package/dist/locus-info/mediaSharesUtils.js +43 -1
  49. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  50. package/dist/locus-info/parser.js +219 -63
  51. package/dist/locus-info/parser.js.map +1 -1
  52. package/dist/locus-info/selfUtils.js +44 -22
  53. package/dist/locus-info/selfUtils.js.map +1 -1
  54. package/dist/media/index.js +57 -104
  55. package/dist/media/index.js.map +1 -1
  56. package/dist/media/properties.js +60 -121
  57. package/dist/media/properties.js.map +1 -1
  58. package/dist/meeting/in-meeting-actions.js +61 -3
  59. package/dist/meeting/in-meeting-actions.js.map +1 -1
  60. package/dist/meeting/index.js +2530 -2534
  61. package/dist/meeting/index.js.map +1 -1
  62. package/dist/meeting/locusMediaRequest.js +292 -0
  63. package/dist/meeting/locusMediaRequest.js.map +1 -0
  64. package/dist/meeting/muteState.js +125 -205
  65. package/dist/meeting/muteState.js.map +1 -1
  66. package/dist/meeting/request.js +150 -150
  67. package/dist/meeting/request.js.map +1 -1
  68. package/dist/meeting/util.js +568 -438
  69. package/dist/meeting/util.js.map +1 -1
  70. package/dist/meeting-info/index.js +48 -7
  71. package/dist/meeting-info/index.js.map +1 -1
  72. package/dist/meeting-info/meeting-info-v2.js +94 -38
  73. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  74. package/dist/meeting-info/utilv2.js +4 -2
  75. package/dist/meeting-info/utilv2.js.map +1 -1
  76. package/dist/meetings/index.d.ts +0 -2
  77. package/dist/meetings/index.js +260 -85
  78. package/dist/meetings/index.js.map +1 -1
  79. package/dist/meetings/meetings.types.js +7 -0
  80. package/dist/meetings/meetings.types.js.map +1 -0
  81. package/dist/meetings/util.js +42 -7
  82. package/dist/meetings/util.js.map +1 -1
  83. package/dist/member/index.d.ts +2 -0
  84. package/dist/member/index.js +26 -0
  85. package/dist/member/index.js.map +1 -1
  86. package/dist/member/member.types.d.ts +11 -0
  87. package/dist/member/member.types.js +18 -0
  88. package/dist/member/member.types.js.map +1 -0
  89. package/dist/member/types.js +11 -1
  90. package/dist/member/types.js.map +1 -1
  91. package/dist/member/util.js +60 -23
  92. package/dist/member/util.js.map +1 -1
  93. package/dist/members/index.js +4 -1
  94. package/dist/members/index.js.map +1 -1
  95. package/dist/members/request.js +75 -45
  96. package/dist/members/request.js.map +1 -1
  97. package/dist/members/util.js +308 -317
  98. package/dist/members/util.js.map +1 -1
  99. package/dist/metrics/config.js +1 -3
  100. package/dist/metrics/config.js.map +1 -1
  101. package/dist/metrics/constants.js +1 -0
  102. package/dist/metrics/constants.js.map +1 -1
  103. package/dist/metrics/index.d.ts +1 -1
  104. package/dist/metrics/index.js +1 -451
  105. package/dist/metrics/index.js.map +1 -1
  106. package/dist/multistream/mediaRequestManager.js +136 -40
  107. package/dist/multistream/mediaRequestManager.js.map +1 -1
  108. package/dist/multistream/receiveSlot.js.map +1 -1
  109. package/dist/multistream/receiveSlotManager.js +4 -4
  110. package/dist/multistream/receiveSlotManager.js.map +1 -1
  111. package/dist/multistream/remoteMedia.js.map +1 -1
  112. package/dist/multistream/remoteMediaGroup.js +60 -3
  113. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  114. package/dist/multistream/remoteMediaManager.js +36 -0
  115. package/dist/multistream/remoteMediaManager.js.map +1 -1
  116. package/dist/multistream/sendSlotManager.js +233 -0
  117. package/dist/multistream/sendSlotManager.js.map +1 -0
  118. package/dist/reachability/index.js +18 -3
  119. package/dist/reachability/index.js.map +1 -1
  120. package/dist/reachability/request.js +5 -3
  121. package/dist/reachability/request.js.map +1 -1
  122. package/dist/reconnection-manager/index.js +181 -153
  123. package/dist/reconnection-manager/index.js.map +1 -1
  124. package/dist/recording-controller/index.js +21 -2
  125. package/dist/recording-controller/index.js.map +1 -1
  126. package/dist/recording-controller/util.js +9 -8
  127. package/dist/recording-controller/util.js.map +1 -1
  128. package/dist/roap/index.js +25 -32
  129. package/dist/roap/index.js.map +1 -1
  130. package/dist/roap/request.js +42 -51
  131. package/dist/roap/request.js.map +1 -1
  132. package/dist/roap/turnDiscovery.js +97 -38
  133. package/dist/roap/turnDiscovery.js.map +1 -1
  134. package/dist/rtcMetrics/constants.js +12 -0
  135. package/dist/rtcMetrics/constants.js.map +1 -0
  136. package/dist/rtcMetrics/index.js +117 -0
  137. package/dist/rtcMetrics/index.js.map +1 -0
  138. package/dist/statsAnalyzer/index.js +0 -1
  139. package/dist/statsAnalyzer/index.js.map +1 -1
  140. package/dist/types/annotation/annotation.types.d.ts +43 -0
  141. package/dist/types/annotation/constants.d.ts +31 -0
  142. package/dist/types/annotation/index.d.ts +124 -0
  143. package/dist/types/breakouts/events.d.ts +2 -0
  144. package/dist/types/breakouts/utils.d.ts +7 -0
  145. package/dist/types/common/errors/webex-errors.d.ts +1 -1
  146. package/dist/types/config.d.ts +0 -6
  147. package/dist/types/constants.d.ts +51 -21
  148. package/dist/types/controls-options-manager/enums.d.ts +2 -0
  149. package/dist/types/controls-options-manager/index.d.ts +1 -1
  150. package/dist/types/controls-options-manager/types.d.ts +7 -1
  151. package/dist/types/index.d.ts +1 -1
  152. package/dist/types/interpretation/collection.d.ts +5 -0
  153. package/dist/types/interpretation/index.d.ts +5 -0
  154. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  155. package/dist/types/locus-info/index.d.ts +39 -1
  156. package/dist/types/media/index.d.ts +2 -0
  157. package/dist/types/media/properties.d.ts +16 -38
  158. package/dist/types/meeting/in-meeting-actions.d.ts +46 -2
  159. package/dist/types/meeting/index.d.ts +179 -379
  160. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  161. package/dist/types/meeting/muteState.d.ts +39 -40
  162. package/dist/types/meeting/request.d.ts +25 -26
  163. package/dist/types/meeting/util.d.ts +74 -1
  164. package/dist/types/meeting-info/meeting-info-v2.d.ts +14 -3
  165. package/dist/types/meetings/index.d.ts +49 -1
  166. package/dist/types/meetings/meetings.types.d.ts +4 -0
  167. package/dist/types/member/index.d.ts +2 -0
  168. package/dist/types/members/request.d.ts +56 -11
  169. package/dist/types/members/util.d.ts +209 -1
  170. package/dist/types/metrics/config.d.ts +26 -2
  171. package/dist/types/metrics/constants.d.ts +1 -0
  172. package/dist/types/metrics/index.d.ts +17 -0
  173. package/dist/types/multistream/mediaRequestManager.d.ts +27 -10
  174. package/dist/types/multistream/receiveSlot.d.ts +3 -3
  175. package/dist/types/multistream/remoteMedia.d.ts +2 -2
  176. package/dist/types/multistream/remoteMediaManager.d.ts +14 -0
  177. package/dist/types/roap/request.d.ts +6 -8
  178. package/dist/types/roap/turnDiscovery.d.ts +18 -1
  179. package/package.json +3 -2
  180. package/src/annotation/annotation.types.ts +50 -0
  181. package/src/annotation/constants.ts +36 -0
  182. package/src/annotation/index.ts +328 -0
  183. package/src/breakouts/README.md +3 -2
  184. package/src/breakouts/breakout.ts +62 -27
  185. package/src/breakouts/events.ts +56 -0
  186. package/src/breakouts/index.ts +244 -64
  187. package/src/breakouts/utils.ts +13 -0
  188. package/src/common/errors/webex-errors.ts +6 -2
  189. package/src/common/logs/logger-proxy.ts +1 -1
  190. package/src/common/queue.ts +22 -8
  191. package/src/config.ts +0 -6
  192. package/src/constants.ts +111 -19
  193. package/src/controls-options-manager/enums.ts +2 -0
  194. package/src/controls-options-manager/index.ts +13 -10
  195. package/src/controls-options-manager/types.ts +10 -0
  196. package/src/controls-options-manager/util.ts +82 -11
  197. package/src/index.ts +18 -11
  198. package/src/interpretation/README.md +60 -0
  199. package/src/interpretation/collection.ts +19 -0
  200. package/src/interpretation/index.ts +332 -0
  201. package/src/interpretation/siLanguage.ts +18 -0
  202. package/src/locus-info/controlsUtils.ts +81 -0
  203. package/src/locus-info/index.ts +318 -57
  204. package/src/locus-info/infoUtils.ts +10 -2
  205. package/src/locus-info/mediaSharesUtils.ts +48 -0
  206. package/src/locus-info/parser.ts +224 -39
  207. package/src/locus-info/selfUtils.ts +32 -20
  208. package/src/media/index.ts +94 -108
  209. package/src/media/properties.ts +69 -109
  210. package/src/meeting/in-meeting-actions.ts +120 -4
  211. package/src/meeting/index.ts +1967 -2120
  212. package/src/meeting/locusMediaRequest.ts +314 -0
  213. package/src/meeting/muteState.ts +119 -194
  214. package/src/meeting/request.ts +122 -115
  215. package/src/meeting/util.ts +549 -413
  216. package/src/meeting-info/index.ts +54 -8
  217. package/src/meeting-info/meeting-info-v2.ts +89 -24
  218. package/src/meeting-info/utilv2.ts +6 -2
  219. package/src/meetings/index.ts +247 -87
  220. package/src/meetings/meetings.types.ts +12 -0
  221. package/src/meetings/util.ts +47 -12
  222. package/src/member/index.ts +28 -1
  223. package/src/member/types.ts +14 -0
  224. package/src/member/util.ts +75 -26
  225. package/src/members/index.ts +7 -1
  226. package/src/members/request.ts +61 -21
  227. package/src/members/util.ts +316 -326
  228. package/src/metrics/constants.ts +1 -0
  229. package/src/metrics/index.ts +1 -474
  230. package/src/multistream/mediaRequestManager.ts +183 -67
  231. package/src/multistream/receiveSlot.ts +4 -4
  232. package/src/multistream/receiveSlotManager.ts +4 -4
  233. package/src/multistream/remoteMedia.ts +2 -2
  234. package/src/multistream/remoteMediaGroup.ts +59 -0
  235. package/src/multistream/remoteMediaManager.ts +33 -0
  236. package/src/multistream/sendSlotManager.ts +170 -0
  237. package/src/reachability/index.ts +15 -4
  238. package/src/reachability/request.ts +7 -3
  239. package/src/reconnection-manager/index.ts +36 -29
  240. package/src/recording-controller/index.ts +20 -3
  241. package/src/recording-controller/util.ts +26 -9
  242. package/src/roap/index.ts +25 -30
  243. package/src/roap/request.ts +44 -51
  244. package/src/roap/turnDiscovery.ts +51 -25
  245. package/src/rtcMetrics/constants.ts +3 -0
  246. package/src/rtcMetrics/index.ts +100 -0
  247. package/src/statsAnalyzer/index.ts +0 -1
  248. package/test/integration/spec/converged-space-meetings.js +60 -3
  249. package/test/integration/spec/journey.js +336 -259
  250. package/test/integration/spec/space-meeting.js +76 -3
  251. package/test/unit/spec/annotation/index.ts +418 -0
  252. package/test/unit/spec/breakouts/breakout.ts +85 -26
  253. package/test/unit/spec/breakouts/events.ts +89 -0
  254. package/test/unit/spec/breakouts/index.ts +636 -98
  255. package/test/unit/spec/breakouts/utils.js +19 -1
  256. package/test/unit/spec/common/queue.js +31 -2
  257. package/test/unit/spec/controls-options-manager/index.js +8 -1
  258. package/test/unit/spec/controls-options-manager/util.js +576 -397
  259. package/test/unit/spec/fixture/locus.js +1 -0
  260. package/test/unit/spec/interpretation/collection.ts +15 -0
  261. package/test/unit/spec/interpretation/index.ts +589 -0
  262. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  263. package/test/unit/spec/locus-info/controlsUtils.js +195 -1
  264. package/test/unit/spec/locus-info/index.js +950 -45
  265. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  266. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  267. package/test/unit/spec/locus-info/parser.js +62 -22
  268. package/test/unit/spec/locus-info/selfConstant.js +19 -0
  269. package/test/unit/spec/locus-info/selfUtils.js +131 -26
  270. package/test/unit/spec/media/index.ts +82 -79
  271. package/test/unit/spec/meeting/in-meeting-actions.ts +60 -2
  272. package/test/unit/spec/meeting/index.js +3208 -1734
  273. package/test/unit/spec/meeting/locusMediaRequest.ts +443 -0
  274. package/test/unit/spec/meeting/muteState.js +328 -417
  275. package/test/unit/spec/meeting/request.js +393 -48
  276. package/test/unit/spec/meeting/utils.js +552 -76
  277. package/test/unit/spec/meeting-info/index.js +181 -0
  278. package/test/unit/spec/meeting-info/meetinginfov2.js +258 -20
  279. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  280. package/test/unit/spec/meetings/index.js +631 -145
  281. package/test/unit/spec/meetings/utils.js +164 -9
  282. package/test/unit/spec/member/index.js +44 -14
  283. package/test/unit/spec/member/util.js +296 -155
  284. package/test/unit/spec/members/index.js +23 -3
  285. package/test/unit/spec/members/request.js +167 -35
  286. package/test/unit/spec/metrics/index.js +1 -50
  287. package/test/unit/spec/multistream/mediaRequestManager.ts +366 -8
  288. package/test/unit/spec/multistream/receiveSlot.ts +1 -1
  289. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  290. package/test/unit/spec/multistream/remoteMediaManager.ts +123 -0
  291. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  292. package/test/unit/spec/reachability/index.ts +66 -5
  293. package/test/unit/spec/reachability/request.js +3 -1
  294. package/test/unit/spec/reconnection-manager/index.js +55 -5
  295. package/test/unit/spec/recording-controller/index.js +294 -218
  296. package/test/unit/spec/recording-controller/util.js +223 -96
  297. package/test/unit/spec/roap/index.ts +21 -48
  298. package/test/unit/spec/roap/request.ts +74 -60
  299. package/test/unit/spec/roap/turnDiscovery.ts +30 -6
  300. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  301. package/test/utils/integrationTestUtils.js +46 -0
  302. package/test/utils/testUtils.js +0 -60
  303. package/src/metrics/config.ts +0 -487
@@ -5,6 +5,7 @@ import {assert} from '@webex/test-helper-chai';
5
5
  import {getMaxFs} from '@webex/plugin-meetings/src/multistream/remoteMedia';
6
6
  import FakeTimers from '@sinonjs/fake-timers';
7
7
  import * as mediaCore from '@webex/internal-media-core';
8
+ import { expect } from 'chai';
8
9
 
9
10
  type ExpectedActiveSpeaker = {
10
11
  policy: 'active-speaker';
@@ -31,7 +32,6 @@ const degradationPreferences = {
31
32
  describe('MediaRequestManager', () => {
32
33
  const CROSS_PRIORITY_DUPLICATION = true;
33
34
  const CROSS_POLICY_DUPLICATION = true;
34
- const PREFER_LIVE_VIDEO = true;
35
35
  const MAX_FPS = 3000;
36
36
  const MAX_FS_360p = 920;
37
37
  const MAX_FS_720p = 3600;
@@ -43,7 +43,7 @@ describe('MediaRequestManager', () => {
43
43
  const MAX_PAYLOADBITSPS_720p = 2500000;
44
44
  const MAX_PAYLOADBITSPS_1080p = 4000000;
45
45
 
46
- const NUM_SLOTS = 10;
46
+ const NUM_SLOTS = 15;
47
47
 
48
48
  let mediaRequestManager: MediaRequestManager;
49
49
  let sendMediaRequestsCallback;
@@ -55,6 +55,7 @@ describe('MediaRequestManager', () => {
55
55
  mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
56
56
  degradationPreferences,
57
57
  kind: 'video',
58
+ trimRequestsToNumOfSources: false,
58
59
  });
59
60
 
60
61
  // create some fake receive slots used by the tests
@@ -79,7 +80,7 @@ describe('MediaRequestManager', () => {
79
80
  });
80
81
 
81
82
  // helper function for adding an active speaker request
82
- const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false) =>
83
+ const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false, preferLiveVideo = true) =>
83
84
  mediaRequestManager.addRequest(
84
85
  {
85
86
  policyInfo: {
@@ -87,7 +88,7 @@ describe('MediaRequestManager', () => {
87
88
  priority,
88
89
  crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
89
90
  crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
90
- preferLiveVideo: PREFER_LIVE_VIDEO,
91
+ preferLiveVideo,
91
92
  },
92
93
  receiveSlots,
93
94
  codecInfo: {
@@ -121,8 +122,10 @@ describe('MediaRequestManager', () => {
121
122
  // addActiveSpeakerRequest() or addReceiverSelectedRequest(), because of some
122
123
  // hardcoded values used in them
123
124
  const checkMediaRequestsSent = (
124
- expectedRequests: ExpectedRequest[],
125
- isCodecInfoDefined: boolean = true
125
+ expectedRequests: ExpectedRequest[], {
126
+ isCodecInfoDefined = true,
127
+ preferLiveVideo = true,
128
+ } = {}
126
129
  ) => {
127
130
  assert.calledOnce(sendMediaRequestsCallback);
128
131
  assert.calledWith(
@@ -135,7 +138,7 @@ describe('MediaRequestManager', () => {
135
138
  priority: expectedRequest.priority,
136
139
  crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
137
140
  crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
138
- preferLiveVideo: PREFER_LIVE_VIDEO,
141
+ preferLiveVideo,
139
142
  }),
140
143
  receiveSlots: expectedRequest.receiveSlots,
141
144
  maxPayloadBitsPerSecond: expectedRequest.maxPayloadBitsPerSecond,
@@ -381,6 +384,26 @@ describe('MediaRequestManager', () => {
381
384
  ]);
382
385
  });
383
386
 
387
+ it('removes the events maxFsUpdate and sourceUpdate when cancelRequest() is called', async () => {
388
+
389
+ const requestId = addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]], MAX_FS_720p);
390
+
391
+ mediaRequestManager.cancelRequest(requestId, true);
392
+
393
+ const sourceUpdateHandler = fakeReceiveSlots[2].off.getCall(0);
394
+
395
+ const maxFsHandlerCall = fakeReceiveSlots[2].off.getCall(1);
396
+
397
+ const maxFsEventName = maxFsHandlerCall.args[0];
398
+ const sourceUpdateEventName = sourceUpdateHandler.args[0];
399
+
400
+ expect(sourceUpdateHandler.args[1]).to.be.a('function');
401
+ expect(maxFsHandlerCall.args[1]).to.be.a('function');
402
+
403
+ assert.equal(maxFsEventName, 'maxFsUpdate')
404
+ assert.equal(sourceUpdateEventName, 'sourceUpdate')
405
+ });
406
+
384
407
  it('cancels the requests correctly when cancelRequest() is called with commit=true', () => {
385
408
  const requestIds = [
386
409
  addActiveSpeakerRequest(255, [fakeReceiveSlots[0], fakeReceiveSlots[1]], MAX_FS_720p),
@@ -949,7 +972,11 @@ describe('MediaRequestManager', () => {
949
972
  const mediaRequestManagerAudio = new MediaRequestManager(sendMediaRequestsCallback, {
950
973
  degradationPreferences,
951
974
  kind: 'audio',
975
+ trimRequestsToNumOfSources: false,
952
976
  });
977
+ mediaRequestManagerAudio.setNumCurrentSources(100, 100);
978
+ sendMediaRequestsCallback.resetHistory();
979
+
953
980
  mediaRequestManagerAudio.addRequest(
954
981
  {
955
982
  policyInfo: {
@@ -975,7 +1002,7 @@ describe('MediaRequestManager', () => {
975
1002
  },
976
1003
  // set isCodecInfoDefined to false, since we don't pass in a codec info when audio:
977
1004
  ],
978
- false
1005
+ {isCodecInfoDefined: false}
979
1006
  );
980
1007
 
981
1008
  assert.notCalled(getRecommendedMaxBitrateForFrameSizeSpy);
@@ -1057,4 +1084,335 @@ describe('MediaRequestManager', () => {
1057
1084
  ]);
1058
1085
  });
1059
1086
  });
1087
+
1088
+ describe('trimming of requested receive slots', () => {
1089
+ beforeEach(() => {
1090
+ mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
1091
+ degradationPreferences,
1092
+ kind: 'video',
1093
+ trimRequestsToNumOfSources: true,
1094
+ });
1095
+ });
1096
+
1097
+ const limitNumAvailableStreams = (preferLiveVideo, limit) => {
1098
+ if (preferLiveVideo) {
1099
+ mediaRequestManager.setNumCurrentSources(100, limit);
1100
+ } else {
1101
+ mediaRequestManager.setNumCurrentSources(limit, 1);
1102
+ }
1103
+ };
1104
+
1105
+ [true, false].forEach((preferLiveVideo) =>
1106
+ describe(`preferLiveVideo=${preferLiveVideo}`, () => {
1107
+ it(`trims the active speaker request with lowest priority first and maintains slot order`, () => {
1108
+ // add some receiver-selected and active-speaker requests, in a mixed up order
1109
+ addReceiverSelectedRequest(100, fakeReceiveSlots[0], MAX_FS_360p, false);
1110
+ addActiveSpeakerRequest( // AS request 1 - it will get 1 slot trimmed
1111
+ 254,
1112
+ [fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
1113
+ MAX_FS_360p,
1114
+ false,
1115
+ preferLiveVideo
1116
+ );
1117
+ addActiveSpeakerRequest( // AS request 2 - lowest priority, it will have all slots trimmed
1118
+ 253,
1119
+ [fakeReceiveSlots[7], fakeReceiveSlots[8], fakeReceiveSlots[9]],
1120
+ MAX_FS_360p,
1121
+ false,
1122
+ preferLiveVideo
1123
+ );
1124
+ addActiveSpeakerRequest( // AS request 3 - highest priority, nothing will be trimmed
1125
+ 255,
1126
+ [fakeReceiveSlots[4], fakeReceiveSlots[5], fakeReceiveSlots[6]],
1127
+ MAX_FS_360p,
1128
+ false,
1129
+ preferLiveVideo
1130
+ );
1131
+ addReceiverSelectedRequest(101, fakeReceiveSlots[10], MAX_FS_360p, false);
1132
+
1133
+ /* Set number of available streams to 7 so that there will be enough sources only for
1134
+ the 2 RS requests and 2 of the 3 AS requests. The lowest priority AS request will
1135
+ have all the slots trimmed, the second lowest priority AS request will have 1 slot trimmed */
1136
+ limitNumAvailableStreams(preferLiveVideo, 7);
1137
+
1138
+ // check what got trimmed
1139
+ checkMediaRequestsSent([
1140
+ {
1141
+ policy: 'receiver-selected',
1142
+ csi: 100,
1143
+ receiveSlot: fakeWcmeSlots[0],
1144
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1145
+ maxFs: MAX_FS_360p,
1146
+ maxMbps: MAX_MBPS_360p,
1147
+ },
1148
+ {
1149
+ policy: 'active-speaker',
1150
+ priority: 254,
1151
+ receiveSlots: [fakeWcmeSlots[1], fakeWcmeSlots[2]], // fakeWcmeSlots[3] got trimmed
1152
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1153
+ maxFs: MAX_FS_360p,
1154
+ maxMbps: MAX_MBPS_360p,
1155
+ },
1156
+ // AS request with priority 253 is missing, because all of its slots got trimmed
1157
+ {
1158
+ policy: 'active-speaker',
1159
+ priority: 255,
1160
+ receiveSlots: [fakeWcmeSlots[4], fakeWcmeSlots[5], fakeWcmeSlots[6]],
1161
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1162
+ maxFs: MAX_FS_360p,
1163
+ maxMbps: MAX_MBPS_360p,
1164
+ },
1165
+ {
1166
+ policy: 'receiver-selected',
1167
+ csi: 101,
1168
+ receiveSlot: fakeWcmeSlots[10],
1169
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1170
+ maxFs: MAX_FS_360p,
1171
+ maxMbps: MAX_MBPS_360p,
1172
+ },
1173
+ ], {preferLiveVideo});
1174
+
1175
+ // now increase the number of available streams so only the last AS request is trimmed by 1
1176
+ limitNumAvailableStreams(preferLiveVideo, 10);
1177
+
1178
+ checkMediaRequestsSent([
1179
+ {
1180
+ policy: 'receiver-selected',
1181
+ csi: 100,
1182
+ receiveSlot: fakeWcmeSlots[0],
1183
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1184
+ maxFs: MAX_FS_360p,
1185
+ maxMbps: MAX_MBPS_360p,
1186
+ },
1187
+ {
1188
+ policy: 'active-speaker',
1189
+ priority: 254,
1190
+ receiveSlots: [fakeWcmeSlots[1], fakeWcmeSlots[2], fakeWcmeSlots[3]], // all slots are used, nothing trimmed
1191
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1192
+ maxFs: MAX_FS_360p,
1193
+ maxMbps: MAX_MBPS_360p,
1194
+ },
1195
+ {
1196
+ policy: 'active-speaker',
1197
+ priority: 253,
1198
+ receiveSlots: [fakeWcmeSlots[7], fakeWcmeSlots[8]], // only 1 slot is trimmed
1199
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1200
+ maxFs: MAX_FS_360p,
1201
+ maxMbps: MAX_MBPS_360p,
1202
+ },
1203
+ {
1204
+ policy: 'active-speaker',
1205
+ priority: 255,
1206
+ receiveSlots: [fakeWcmeSlots[4], fakeWcmeSlots[5], fakeWcmeSlots[6]], // all slots are used, nothing trimmed
1207
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1208
+ maxFs: MAX_FS_360p,
1209
+ maxMbps: MAX_MBPS_360p,
1210
+ },
1211
+ {
1212
+ policy: 'receiver-selected',
1213
+ csi: 101,
1214
+ receiveSlot: fakeWcmeSlots[10],
1215
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1216
+ maxFs: MAX_FS_360p,
1217
+ maxMbps: MAX_MBPS_360p,
1218
+ },
1219
+ ], {preferLiveVideo});
1220
+ })
1221
+
1222
+ it('does not trim the receiver selected requests', async () => {
1223
+ // add some receiver-selected and active-speaker requests, in a mixed up order
1224
+ addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
1225
+ addActiveSpeakerRequest(
1226
+ 255,
1227
+ [fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
1228
+ MAX_FS_360p,
1229
+ false,
1230
+ preferLiveVideo
1231
+ );
1232
+ addReceiverSelectedRequest(201, fakeReceiveSlots[4], MAX_FS_720p, false);
1233
+ addActiveSpeakerRequest(
1234
+ 254,
1235
+ [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
1236
+ MAX_FS_720p,
1237
+ false,
1238
+ preferLiveVideo
1239
+ );
1240
+
1241
+ /* Set number of available streams to 1, which is lower than the number of RS requests,
1242
+ so all AS requests will be trimmed to 0 but RS requests should be unaltered */
1243
+ limitNumAvailableStreams(preferLiveVideo, 1);
1244
+
1245
+ // check what got trimmed - only RS requests should remain
1246
+ checkMediaRequestsSent([
1247
+ {
1248
+ policy: 'receiver-selected',
1249
+ csi: 200,
1250
+ receiveSlot: fakeWcmeSlots[0],
1251
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1252
+ maxFs: MAX_FS_360p,
1253
+ maxMbps: MAX_MBPS_360p,
1254
+ },
1255
+ {
1256
+ policy: 'receiver-selected',
1257
+ csi: 201,
1258
+ receiveSlot: fakeWcmeSlots[4],
1259
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
1260
+ maxFs: MAX_FS_720p,
1261
+ maxMbps: MAX_MBPS_720p,
1262
+ },
1263
+ ], {preferLiveVideo});
1264
+ });
1265
+
1266
+ it('does trimming first and applies degradationPreferences after that', async () => {
1267
+ // add some receiver-selected and active-speaker requests
1268
+ addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
1269
+ addActiveSpeakerRequest(
1270
+ 255,
1271
+ [fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
1272
+ MAX_FS_360p,
1273
+ false,
1274
+ preferLiveVideo
1275
+ );
1276
+ addReceiverSelectedRequest(201, fakeReceiveSlots[4], MAX_FS_720p, false);
1277
+ addActiveSpeakerRequest(
1278
+ 254,
1279
+ [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
1280
+ MAX_FS_720p,
1281
+ false,
1282
+ preferLiveVideo
1283
+ );
1284
+
1285
+ // Set maxMacroblocksLimit to a value that's big enough just for the 2 RS requests and 1 AS with 1 slot of 360p.
1286
+ // but not big enough for all of the RS and AS requests. If maxMacroblocksLimit
1287
+ // was applied first, the resolution of all requests (including RS ones) would be degraded
1288
+ // This test verifies that it's not happening and the resolutions are not affected.
1289
+ mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: MAX_FS_360p + MAX_FS_720p + MAX_FS_360p});
1290
+ sendMediaRequestsCallback.resetHistory();
1291
+
1292
+ /* Limit the num of streams so that only 2 RS requests and 1 AS with 1 slot can be sent out */
1293
+ limitNumAvailableStreams(preferLiveVideo, 3);
1294
+
1295
+ // check what got trimmed - the remaining requests should have unchanged resolutions
1296
+ checkMediaRequestsSent([
1297
+ {
1298
+ policy: 'receiver-selected',
1299
+ csi: 200,
1300
+ receiveSlot: fakeWcmeSlots[0],
1301
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1302
+ maxFs: MAX_FS_360p,
1303
+ maxMbps: MAX_MBPS_360p,
1304
+ },
1305
+ {
1306
+ policy: 'active-speaker',
1307
+ priority: 255,
1308
+ receiveSlots: [fakeWcmeSlots[1]],
1309
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1310
+ maxFs: MAX_FS_360p,
1311
+ maxMbps: MAX_MBPS_360p,
1312
+ },
1313
+ {
1314
+ policy: 'receiver-selected',
1315
+ csi: 201,
1316
+ receiveSlot: fakeWcmeSlots[4],
1317
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
1318
+ maxFs: MAX_FS_720p,
1319
+ maxMbps: MAX_MBPS_720p,
1320
+ },
1321
+ ], {preferLiveVideo});
1322
+ });
1323
+
1324
+ it('trims all AS requests completely until setNumCurrentSources() is called with non-zero values', async () => {
1325
+ // add some receiver-selected and active-speaker requests
1326
+ addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
1327
+ addActiveSpeakerRequest(
1328
+ 255,
1329
+ [fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
1330
+ MAX_FS_360p,
1331
+ false,
1332
+ preferLiveVideo
1333
+ );
1334
+ addActiveSpeakerRequest(
1335
+ 254,
1336
+ [fakeReceiveSlots[5]],
1337
+ MAX_FS_360p,
1338
+ false,
1339
+ preferLiveVideo
1340
+ );
1341
+
1342
+ mediaRequestManager.commit();
1343
+
1344
+ // we're not calling setNumCurrentSources(), so it should use the initial values of 0 for sources count
1345
+ // and completely trim all AS requests to 0
1346
+ checkMediaRequestsSent([
1347
+ {
1348
+ policy: 'receiver-selected',
1349
+ csi: 200,
1350
+ receiveSlot: fakeWcmeSlots[0],
1351
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1352
+ maxFs: MAX_FS_360p,
1353
+ maxMbps: MAX_MBPS_360p,
1354
+ },
1355
+ ], {preferLiveVideo});
1356
+ });
1357
+
1358
+ it('resets num of sources to 0 when reset() is called', async () => {
1359
+ // set available streams to non-zero value
1360
+ limitNumAvailableStreams(preferLiveVideo, 4);
1361
+ sendMediaRequestsCallback.resetHistory();
1362
+
1363
+ // do the reset
1364
+ mediaRequestManager.reset();
1365
+
1366
+ // add some receiver-selected and active-speaker requests
1367
+ addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
1368
+ addActiveSpeakerRequest(
1369
+ 255,
1370
+ [fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
1371
+ MAX_FS_360p,
1372
+ false,
1373
+ preferLiveVideo
1374
+ );
1375
+
1376
+ mediaRequestManager.commit();
1377
+
1378
+ // verify that AS request was trimmed to 0, because we've reset mediaRequestManager so available streams count is 0 now
1379
+ checkMediaRequestsSent([
1380
+ {
1381
+ policy: 'receiver-selected',
1382
+ csi: 200,
1383
+ receiveSlot: fakeWcmeSlots[0],
1384
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
1385
+ maxFs: MAX_FS_360p,
1386
+ maxMbps: MAX_MBPS_360p,
1387
+ },
1388
+ ], {preferLiveVideo});
1389
+ });
1390
+ })
1391
+ );
1392
+
1393
+
1394
+ it('throws if there are 2 active-speaker requests with different preferLiveVideo values', () => {
1395
+ addActiveSpeakerRequest(
1396
+ 255,
1397
+ [fakeReceiveSlots[0]],
1398
+ MAX_FS_360p,
1399
+ false,
1400
+ true
1401
+ );
1402
+ addReceiverSelectedRequest(201, fakeReceiveSlots[4], MAX_FS_720p, false);
1403
+ addActiveSpeakerRequest(
1404
+ 254,
1405
+ [fakeReceiveSlots[2]],
1406
+ MAX_FS_360p,
1407
+ false,
1408
+ false
1409
+ );
1410
+
1411
+ assert.throws(() => mediaRequestManager.commit(), 'a mix of active-speaker groups with different values for preferLiveVideo is not supported');
1412
+ })
1413
+ })
1060
1414
  });
1415
+ function assertEqual(arg0: any, arg1: string) {
1416
+ throw new Error('Function not implemented.');
1417
+ }
1418
+
@@ -65,7 +65,7 @@ describe('ReceiveSlot', () => {
65
65
  });
66
66
 
67
67
  it('has public properties', () => {
68
- assert.strictEqual(receiveSlot.id, 'r1');
68
+ assert.isTrue(receiveSlot.id.startsWith('r'));
69
69
  assert.strictEqual(receiveSlot.mediaType, MediaType.VideoMain);
70
70
  });
71
71