@webex/plugin-meetings 3.8.0 → 3.8.1-next.10

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 (361) hide show
  1. package/README.md +26 -13
  2. package/dist/breakouts/breakout.js +1 -1
  3. package/dist/breakouts/index.js +70 -6
  4. package/dist/breakouts/index.js.map +1 -1
  5. package/dist/common/errors/webex-errors.js +12 -2
  6. package/dist/common/errors/webex-errors.js.map +1 -1
  7. package/dist/config.js +5 -1
  8. package/dist/config.js.map +1 -1
  9. package/dist/constants.js +28 -123
  10. package/dist/constants.js.map +1 -1
  11. package/dist/controls-options-manager/enums.js +3 -0
  12. package/dist/controls-options-manager/enums.js.map +1 -1
  13. package/dist/controls-options-manager/types.js.map +1 -1
  14. package/dist/controls-options-manager/util.js +78 -0
  15. package/dist/controls-options-manager/util.js.map +1 -1
  16. package/dist/interpretation/index.js +4 -4
  17. package/dist/interpretation/index.js.map +1 -1
  18. package/dist/interpretation/siLanguage.js +1 -1
  19. package/dist/locus-info/controlsUtils.js +37 -11
  20. package/dist/locus-info/controlsUtils.js.map +1 -1
  21. package/dist/locus-info/index.js +92 -12
  22. package/dist/locus-info/index.js.map +1 -1
  23. package/dist/locus-info/selfUtils.js +432 -418
  24. package/dist/locus-info/selfUtils.js.map +1 -1
  25. package/dist/media/index.js +17 -17
  26. package/dist/media/index.js.map +1 -1
  27. package/dist/media/properties.js +94 -6
  28. package/dist/media/properties.js.map +1 -1
  29. package/dist/meeting/brbState.js +9 -2
  30. package/dist/meeting/brbState.js.map +1 -1
  31. package/dist/meeting/in-meeting-actions.js +21 -1
  32. package/dist/meeting/in-meeting-actions.js.map +1 -1
  33. package/dist/meeting/index.js +678 -344
  34. package/dist/meeting/index.js.map +1 -1
  35. package/dist/meeting/locusMediaRequest.js +21 -22
  36. package/dist/meeting/locusMediaRequest.js.map +1 -1
  37. package/dist/meeting/muteState.js +4 -4
  38. package/dist/meeting/muteState.js.map +1 -1
  39. package/dist/meeting/request.js +30 -0
  40. package/dist/meeting/request.js.map +1 -1
  41. package/dist/meeting/request.type.js.map +1 -1
  42. package/dist/meeting/util.js +13 -2
  43. package/dist/meeting/util.js.map +1 -1
  44. package/dist/meeting-info/meeting-info-v2.js +373 -68
  45. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  46. package/dist/meeting-info/utilv2.js +5 -1
  47. package/dist/meeting-info/utilv2.js.map +1 -1
  48. package/dist/meetings/index.js +136 -1
  49. package/dist/meetings/index.js.map +1 -1
  50. package/dist/meetings/util.js +14 -0
  51. package/dist/meetings/util.js.map +1 -1
  52. package/dist/member/index.js +55 -9
  53. package/dist/member/index.js.map +1 -1
  54. package/dist/member/types.js +3 -0
  55. package/dist/member/types.js.map +1 -1
  56. package/dist/member/util.js +335 -353
  57. package/dist/member/util.js.map +1 -1
  58. package/dist/members/collection.js.map +1 -1
  59. package/dist/members/index.js +137 -29
  60. package/dist/members/index.js.map +1 -1
  61. package/dist/members/request.js +38 -0
  62. package/dist/members/request.js.map +1 -1
  63. package/dist/members/util.js +36 -1
  64. package/dist/members/util.js.map +1 -1
  65. package/dist/metrics/constants.js +10 -0
  66. package/dist/metrics/constants.js.map +1 -1
  67. package/dist/multistream/remoteMediaManager.js +40 -8
  68. package/dist/multistream/remoteMediaManager.js.map +1 -1
  69. package/dist/reachability/clusterReachability.js +63 -27
  70. package/dist/reachability/clusterReachability.js.map +1 -1
  71. package/dist/reachability/index.js +107 -47
  72. package/dist/reachability/index.js.map +1 -1
  73. package/dist/reachability/reachability.types.js +14 -0
  74. package/dist/reachability/reachability.types.js.map +1 -1
  75. package/dist/reachability/request.js +19 -3
  76. package/dist/reachability/request.js.map +1 -1
  77. package/dist/reconnection-manager/index.js +2 -2
  78. package/dist/reconnection-manager/index.js.map +1 -1
  79. package/dist/recording-controller/util.js +5 -5
  80. package/dist/recording-controller/util.js.map +1 -1
  81. package/dist/roap/index.js.map +1 -1
  82. package/dist/roap/turnDiscovery.js +45 -27
  83. package/dist/roap/turnDiscovery.js.map +1 -1
  84. package/dist/roap/types.js +17 -0
  85. package/dist/roap/types.js.map +1 -0
  86. package/dist/types/common/errors/webex-errors.d.ts +7 -1
  87. package/dist/types/config.d.ts +3 -0
  88. package/dist/types/constants.d.ts +20 -85
  89. package/dist/types/controls-options-manager/enums.d.ts +4 -1
  90. package/dist/types/controls-options-manager/types.d.ts +10 -1
  91. package/dist/types/locus-info/index.d.ts +3 -3
  92. package/dist/types/locus-info/selfUtils.d.ts +216 -1
  93. package/dist/types/media/properties.d.ts +15 -0
  94. package/dist/types/meeting/in-meeting-actions.d.ts +20 -0
  95. package/dist/types/meeting/index.d.ts +65 -1
  96. package/dist/types/meeting/muteState.d.ts +0 -1
  97. package/dist/types/meeting/request.d.ts +12 -1
  98. package/dist/types/meeting/request.type.d.ts +6 -0
  99. package/dist/types/meeting/util.d.ts +3 -1
  100. package/dist/types/meeting-info/meeting-info-v2.d.ts +82 -1
  101. package/dist/types/meetings/index.d.ts +57 -0
  102. package/dist/types/member/index.d.ts +21 -6
  103. package/dist/types/member/types.d.ts +73 -14
  104. package/dist/types/member/util.d.ts +156 -1
  105. package/dist/types/members/collection.d.ts +6 -5
  106. package/dist/types/members/index.d.ts +32 -43
  107. package/dist/types/members/request.d.ts +26 -0
  108. package/dist/types/members/util.d.ts +27 -0
  109. package/dist/types/metrics/constants.d.ts +10 -0
  110. package/dist/types/multistream/remoteMediaManager.d.ts +10 -1
  111. package/dist/types/reachability/clusterReachability.d.ts +15 -7
  112. package/dist/types/reachability/index.d.ts +10 -1
  113. package/dist/types/reachability/reachability.types.d.ts +5 -0
  114. package/dist/types/roap/index.d.ts +3 -2
  115. package/dist/types/roap/turnDiscovery.d.ts +5 -17
  116. package/dist/types/roap/types.d.ts +16 -0
  117. package/dist/webinar/index.js +2 -2
  118. package/dist/webinar/index.js.map +1 -1
  119. package/package.json +24 -23
  120. package/src/breakouts/index.ts +69 -0
  121. package/src/common/errors/webex-errors.ts +8 -1
  122. package/src/config.ts +3 -0
  123. package/src/constants.ts +30 -90
  124. package/src/controls-options-manager/enums.ts +3 -0
  125. package/src/controls-options-manager/types.ts +16 -1
  126. package/src/controls-options-manager/util.ts +93 -0
  127. package/src/interpretation/index.ts +3 -3
  128. package/src/locus-info/controlsUtils.ts +59 -14
  129. package/src/locus-info/index.ts +97 -13
  130. package/src/locus-info/selfUtils.ts +496 -442
  131. package/src/media/index.ts +23 -21
  132. package/src/media/properties.ts +96 -0
  133. package/src/meeting/brbState.ts +11 -2
  134. package/src/meeting/in-meeting-actions.ts +40 -0
  135. package/src/meeting/index.ts +470 -105
  136. package/src/meeting/locusMediaRequest.ts +27 -22
  137. package/src/meeting/muteState.ts +4 -4
  138. package/src/meeting/request.ts +36 -1
  139. package/src/meeting/request.type.ts +7 -0
  140. package/src/meeting/util.ts +11 -2
  141. package/src/meeting-info/meeting-info-v2.ts +254 -8
  142. package/src/meeting-info/utilv2.ts +5 -0
  143. package/src/meetings/index.ts +148 -1
  144. package/src/meetings/util.ts +18 -0
  145. package/src/member/index.ts +68 -22
  146. package/src/member/types.ts +82 -16
  147. package/src/member/util.ts +357 -350
  148. package/src/members/collection.ts +4 -3
  149. package/src/members/index.ts +137 -18
  150. package/src/members/request.ts +44 -0
  151. package/src/members/util.ts +43 -1
  152. package/src/metrics/constants.ts +10 -0
  153. package/src/multistream/remoteMediaManager.ts +32 -10
  154. package/src/reachability/clusterReachability.ts +73 -26
  155. package/src/reachability/index.ts +62 -1
  156. package/src/reachability/reachability.types.ts +6 -0
  157. package/src/reachability/request.ts +7 -0
  158. package/src/reconnection-manager/index.ts +2 -2
  159. package/src/recording-controller/util.ts +17 -13
  160. package/src/roap/index.ts +3 -7
  161. package/src/roap/turnDiscovery.ts +34 -39
  162. package/src/roap/types.ts +23 -0
  163. package/src/webinar/index.ts +1 -1
  164. package/test/unit/spec/breakouts/index.ts +167 -95
  165. package/test/unit/spec/controls-options-manager/util.js +178 -0
  166. package/test/unit/spec/interpretation/index.ts +39 -1
  167. package/test/unit/spec/locus-info/controlsUtils.js +155 -9
  168. package/test/unit/spec/locus-info/index.js +209 -73
  169. package/test/unit/spec/locus-info/selfUtils.js +98 -24
  170. package/test/unit/spec/media/index.ts +150 -18
  171. package/test/unit/spec/media/properties.ts +130 -0
  172. package/test/unit/spec/meeting/brbState.ts +40 -2
  173. package/test/unit/spec/meeting/in-meeting-actions.ts +23 -4
  174. package/test/unit/spec/meeting/index.js +804 -139
  175. package/test/unit/spec/meeting/locusMediaRequest.ts +95 -87
  176. package/test/unit/spec/meeting/muteState.js +73 -2
  177. package/test/unit/spec/meeting/request.js +32 -1
  178. package/test/unit/spec/meeting/utils.js +119 -18
  179. package/test/unit/spec/meeting-info/meetinginfov2.js +484 -114
  180. package/test/unit/spec/meeting-info/utilv2.js +19 -0
  181. package/test/unit/spec/meetings/index.js +146 -2
  182. package/test/unit/spec/member/index.js +7 -0
  183. package/test/unit/spec/member/util.js +24 -0
  184. package/test/unit/spec/members/index.js +304 -78
  185. package/test/unit/spec/members/request.js +68 -22
  186. package/test/unit/spec/members/utils.js +75 -0
  187. package/test/unit/spec/multistream/remoteMediaManager.ts +397 -118
  188. package/test/unit/spec/reachability/clusterReachability.ts +88 -56
  189. package/test/unit/spec/reachability/index.ts +97 -0
  190. package/test/unit/spec/reachability/request.js +47 -2
  191. package/test/unit/spec/reconnection-manager/index.js +4 -4
  192. package/test/unit/spec/roap/turnDiscovery.ts +110 -28
  193. package/test/unit/spec/webinar/index.ts +5 -0
  194. package/dist/annotation/annotation.types.d.ts +0 -42
  195. package/dist/annotation/constants.d.ts +0 -31
  196. package/dist/annotation/index.d.ts +0 -117
  197. package/dist/breakouts/breakout.d.ts +0 -8
  198. package/dist/breakouts/collection.d.ts +0 -5
  199. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  200. package/dist/breakouts/events.d.ts +0 -8
  201. package/dist/breakouts/index.d.ts +0 -5
  202. package/dist/breakouts/request.d.ts +0 -22
  203. package/dist/breakouts/utils.d.ts +0 -15
  204. package/dist/common/browser-detection.d.ts +0 -9
  205. package/dist/common/collection.d.ts +0 -48
  206. package/dist/common/config.d.ts +0 -2
  207. package/dist/common/errors/captcha-error.d.ts +0 -15
  208. package/dist/common/errors/intent-to-join.d.ts +0 -16
  209. package/dist/common/errors/join-meeting.d.ts +0 -17
  210. package/dist/common/errors/media.d.ts +0 -15
  211. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  212. package/dist/common/errors/parameter.d.ts +0 -15
  213. package/dist/common/errors/password-error.d.ts +0 -15
  214. package/dist/common/errors/permission.d.ts +0 -14
  215. package/dist/common/errors/reclaim-host-role-error.js +0 -149
  216. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  217. package/dist/common/errors/reclaim-host-role-errors.d.ts +0 -60
  218. package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
  219. package/dist/common/errors/reconnection-in-progress.js +0 -33
  220. package/dist/common/errors/reconnection-in-progress.js.map +0 -1
  221. package/dist/common/errors/reconnection.d.ts +0 -15
  222. package/dist/common/errors/stats.d.ts +0 -15
  223. package/dist/common/errors/webex-errors.d.ts +0 -93
  224. package/dist/common/errors/webex-meetings-error.d.ts +0 -20
  225. package/dist/common/events/events-scope.d.ts +0 -17
  226. package/dist/common/events/events.d.ts +0 -12
  227. package/dist/common/events/trigger-proxy.d.ts +0 -2
  228. package/dist/common/events/util.d.ts +0 -2
  229. package/dist/common/logs/logger-config.d.ts +0 -2
  230. package/dist/common/logs/logger-proxy.d.ts +0 -2
  231. package/dist/common/logs/request.d.ts +0 -36
  232. package/dist/common/queue.d.ts +0 -34
  233. package/dist/config.d.ts +0 -72
  234. package/dist/constants.d.ts +0 -1088
  235. package/dist/controls-options-manager/constants.d.ts +0 -4
  236. package/dist/controls-options-manager/enums.d.ts +0 -15
  237. package/dist/controls-options-manager/index.d.ts +0 -136
  238. package/dist/controls-options-manager/types.d.ts +0 -43
  239. package/dist/controls-options-manager/util.d.ts +0 -1
  240. package/dist/index.d.ts +0 -7
  241. package/dist/interceptors/index.d.ts +0 -2
  242. package/dist/interceptors/locusRetry.d.ts +0 -27
  243. package/dist/interpretation/collection.d.ts +0 -5
  244. package/dist/interpretation/index.d.ts +0 -5
  245. package/dist/interpretation/siLanguage.d.ts +0 -5
  246. package/dist/locus-info/controlsUtils.d.ts +0 -2
  247. package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
  248. package/dist/locus-info/fullState.d.ts +0 -2
  249. package/dist/locus-info/hostUtils.d.ts +0 -2
  250. package/dist/locus-info/index.d.ts +0 -322
  251. package/dist/locus-info/infoUtils.d.ts +0 -2
  252. package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
  253. package/dist/locus-info/parser.d.ts +0 -272
  254. package/dist/locus-info/selfUtils.d.ts +0 -2
  255. package/dist/media/index.d.ts +0 -34
  256. package/dist/media/properties.d.ts +0 -93
  257. package/dist/media/util.d.ts +0 -2
  258. package/dist/mediaQualityMetrics/config.d.ts +0 -241
  259. package/dist/mediaQualityMetrics/config.js +0 -502
  260. package/dist/mediaQualityMetrics/config.js.map +0 -1
  261. package/dist/meeting/effectsState.js +0 -260
  262. package/dist/meeting/effectsState.js.map +0 -1
  263. package/dist/meeting/in-meeting-actions.d.ts +0 -167
  264. package/dist/meeting/index.d.ts +0 -1825
  265. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  266. package/dist/meeting/muteState.d.ts +0 -178
  267. package/dist/meeting/request.d.ts +0 -295
  268. package/dist/meeting/request.type.d.ts +0 -11
  269. package/dist/meeting/state.d.ts +0 -9
  270. package/dist/meeting/util.d.ts +0 -119
  271. package/dist/meeting/voicea-meeting.d.ts +0 -16
  272. package/dist/meeting-info/collection.d.ts +0 -20
  273. package/dist/meeting-info/index.d.ts +0 -69
  274. package/dist/meeting-info/meeting-info-v2.d.ts +0 -123
  275. package/dist/meeting-info/request.d.ts +0 -22
  276. package/dist/meeting-info/util.d.ts +0 -2
  277. package/dist/meeting-info/utilv2.d.ts +0 -2
  278. package/dist/meetings/collection.d.ts +0 -40
  279. package/dist/meetings/index.d.ts +0 -390
  280. package/dist/meetings/meetings.types.d.ts +0 -4
  281. package/dist/meetings/request.d.ts +0 -27
  282. package/dist/meetings/util.d.ts +0 -18
  283. package/dist/member/index.d.ts +0 -160
  284. package/dist/member/member.types.js +0 -17
  285. package/dist/member/member.types.js.map +0 -1
  286. package/dist/member/types.d.ts +0 -32
  287. package/dist/member/util.d.ts +0 -2
  288. package/dist/members/collection.d.ts +0 -29
  289. package/dist/members/index.d.ts +0 -353
  290. package/dist/members/request.d.ts +0 -114
  291. package/dist/members/types.d.ts +0 -25
  292. package/dist/members/util.d.ts +0 -215
  293. package/dist/metrics/config.js +0 -276
  294. package/dist/metrics/config.js.map +0 -1
  295. package/dist/metrics/constants.d.ts +0 -70
  296. package/dist/metrics/index.d.ts +0 -45
  297. package/dist/multistream/mediaRequestManager.d.ts +0 -119
  298. package/dist/multistream/receiveSlot.d.ts +0 -68
  299. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  300. package/dist/multistream/remoteMedia.d.ts +0 -72
  301. package/dist/multistream/remoteMediaGroup.d.ts +0 -49
  302. package/dist/multistream/remoteMediaManager.d.ts +0 -300
  303. package/dist/multistream/sendSlotManager.d.ts +0 -69
  304. package/dist/networkQualityMonitor/index.d.ts +0 -70
  305. package/dist/networkQualityMonitor/index.js +0 -221
  306. package/dist/networkQualityMonitor/index.js.map +0 -1
  307. package/dist/peer-connection-manager/index.js +0 -671
  308. package/dist/peer-connection-manager/index.js.map +0 -1
  309. package/dist/peer-connection-manager/util.js +0 -109
  310. package/dist/peer-connection-manager/util.js.map +0 -1
  311. package/dist/personal-meeting-room/index.d.ts +0 -47
  312. package/dist/personal-meeting-room/request.d.ts +0 -14
  313. package/dist/personal-meeting-room/util.d.ts +0 -2
  314. package/dist/reachability/clusterReachability.d.ts +0 -109
  315. package/dist/reachability/index.d.ts +0 -105
  316. package/dist/reachability/request.d.ts +0 -39
  317. package/dist/reachability/util.d.ts +0 -8
  318. package/dist/reactions/constants.d.ts +0 -3
  319. package/dist/reactions/reactions.d.ts +0 -4
  320. package/dist/reactions/reactions.type.d.ts +0 -52
  321. package/dist/reconnection-manager/index.d.ts +0 -136
  322. package/dist/recording-controller/enums.d.ts +0 -7
  323. package/dist/recording-controller/index.d.ts +0 -207
  324. package/dist/recording-controller/util.d.ts +0 -14
  325. package/dist/roap/collection.js +0 -62
  326. package/dist/roap/collection.js.map +0 -1
  327. package/dist/roap/handler.js +0 -275
  328. package/dist/roap/handler.js.map +0 -1
  329. package/dist/roap/index.d.ts +0 -86
  330. package/dist/roap/request.d.ts +0 -39
  331. package/dist/roap/state.js +0 -126
  332. package/dist/roap/state.js.map +0 -1
  333. package/dist/roap/turnDiscovery.d.ts +0 -155
  334. package/dist/roap/util.js +0 -75
  335. package/dist/roap/util.js.map +0 -1
  336. package/dist/rtcMetrics/constants.d.ts +0 -4
  337. package/dist/rtcMetrics/constants.js +0 -11
  338. package/dist/rtcMetrics/constants.js.map +0 -1
  339. package/dist/rtcMetrics/index.d.ts +0 -61
  340. package/dist/rtcMetrics/index.js +0 -197
  341. package/dist/rtcMetrics/index.js.map +0 -1
  342. package/dist/statsAnalyzer/global.d.ts +0 -36
  343. package/dist/statsAnalyzer/global.js +0 -126
  344. package/dist/statsAnalyzer/global.js.map +0 -1
  345. package/dist/statsAnalyzer/index.d.ts +0 -217
  346. package/dist/statsAnalyzer/index.js +0 -1013
  347. package/dist/statsAnalyzer/index.js.map +0 -1
  348. package/dist/statsAnalyzer/mqaUtil.d.ts +0 -48
  349. package/dist/statsAnalyzer/mqaUtil.js +0 -179
  350. package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
  351. package/dist/transcription/index.d.ts +0 -64
  352. package/dist/types/common/errors/reconnection-in-progress.d.ts +0 -9
  353. package/dist/types/mediaQualityMetrics/config.d.ts +0 -241
  354. package/dist/types/networkQualityMonitor/index.d.ts +0 -70
  355. package/dist/types/rtcMetrics/constants.d.ts +0 -4
  356. package/dist/types/rtcMetrics/index.d.ts +0 -71
  357. package/dist/types/statsAnalyzer/global.d.ts +0 -36
  358. package/dist/types/statsAnalyzer/index.d.ts +0 -217
  359. package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
  360. package/dist/webinar/collection.d.ts +0 -16
  361. package/dist/webinar/index.d.ts +0 -5
@@ -18,7 +18,8 @@ import {CSI, ReceiveSlotId} from '@webex/plugin-meetings/src/multistream/receive
18
18
  import testUtils from '../../../utils/testUtils';
19
19
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
20
20
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
21
- import { expect } from 'chai';
21
+ import {expect} from 'chai';
22
+ import {RemoteMedia} from '@webex/plugin-meetings/src/multistream/remoteMedia';
22
23
 
23
24
  class FakeSlot extends EventEmitter {
24
25
  public mediaType: MediaType;
@@ -147,14 +148,8 @@ describe('RemoteMediaManager', () => {
147
148
 
148
149
  fakeAudioSlot = new FakeSlot(MediaType.AudioMain, 'fake audio slot');
149
150
  fakeVideoSlot = new FakeSlot(MediaType.VideoMain, 'fake video slot');
150
- fakeScreenShareAudioSlot = new FakeSlot(
151
- MediaType.AudioSlides,
152
- 'fake screen share audio slot'
153
- );
154
- fakeScreenShareVideoSlot = new FakeSlot(
155
- MediaType.VideoSlides,
156
- 'fake screen share video slot'
157
- );
151
+ fakeScreenShareAudioSlot = new FakeSlot(MediaType.AudioSlides, 'fake screen share audio slot');
152
+ fakeScreenShareVideoSlot = new FakeSlot(MediaType.VideoSlides, 'fake screen share video slot');
158
153
 
159
154
  fakeReceiveSlotManager = {
160
155
  allocateSlot: sinon.stub().callsFake((mediaType) => {
@@ -356,7 +351,7 @@ describe('RemoteMediaManager', () => {
356
351
  receiveSlots: Array(1).fill(fakeAudioSlot),
357
352
  codecInfo: undefined,
358
353
  }),
359
- false,
354
+ false
360
355
  );
361
356
  }
362
357
  });
@@ -395,10 +390,8 @@ describe('RemoteMediaManager', () => {
395
390
  // requires 3 main audio slots and one interpretation audio slot
396
391
  assert.callCount(fakeReceiveSlotManager.allocateSlot, 4);
397
392
 
398
-
399
393
  resetHistory();
400
394
 
401
-
402
395
  remoteMediaManager.setReceiveNamedMediaGroup(MediaType.AudioMain, 28);
403
396
 
404
397
  // check that setNamedMediaGroup has been called
@@ -406,9 +399,8 @@ describe('RemoteMediaManager', () => {
406
399
  assert.calledWith(
407
400
  createdInterpretationAudioGroup.setNamedMediaGroup,
408
401
  {type: 1, value: 28},
409
- true,
402
+ true
410
403
  );
411
-
412
404
  });
413
405
 
414
406
  it('ignore duplicated group when call setReceiveNamedMediaGroup', async () => {
@@ -445,7 +437,6 @@ describe('RemoteMediaManager', () => {
445
437
  // we're using the default config that requires 3 main audio slots
446
438
  assert.callCount(fakeReceiveSlotManager.allocateSlot, 4);
447
439
 
448
-
449
440
  resetHistory();
450
441
 
451
442
  remoteMediaManager.setReceiveNamedMediaGroup(MediaType.AudioMain, 24);
@@ -456,10 +447,8 @@ describe('RemoteMediaManager', () => {
456
447
  await testUtils.flushPromises();
457
448
  assert.callCount(fakeReceiveSlotManager.allocateSlot, 0);
458
449
  assert.notCalled(fakeReceiveSlotManager.allocateSlot);
459
-
460
450
  });
461
451
 
462
-
463
452
  it('should throw error if set receive named media group which type is not audio', async () => {
464
453
  let createdAudioGroup: RemoteMediaGroup | null = null;
465
454
  let audioStopStub;
@@ -493,7 +482,9 @@ describe('RemoteMediaManager', () => {
493
482
  throw new Error('Expected an error but none was thrown');
494
483
  } catch (error) {
495
484
  // Check if the error message matches the expected one
496
- expect(error.message).to.equal('cannot set receive named media group which media type is not audio-main');
485
+ expect(error.message).to.equal(
486
+ 'cannot set receive named media group which media type is not audio-main'
487
+ );
497
488
  }
498
489
  });
499
490
  });
@@ -627,11 +618,11 @@ describe('RemoteMediaManager', () => {
627
618
  initialLayoutId: 'first',
628
619
  layouts: {
629
620
  first: {
630
- screenShareVideo: { size: 'small'}
621
+ screenShareVideo: {size: 'small'},
631
622
  },
632
623
  second: {
633
- screenShareVideo: { size: 'medium'}
634
- }
624
+ screenShareVideo: {size: 'medium'},
625
+ },
635
626
  },
636
627
  },
637
628
  };
@@ -669,8 +660,6 @@ describe('RemoteMediaManager', () => {
669
660
  // we don't expect any audio and for video there should be no VideoSlides, so all the calls should be just for VideoMain
670
661
  assert.alwaysCalledWith(fakeReceiveSlotManager.allocateSlot, MediaType.VideoMain);
671
662
  });
672
-
673
-
674
663
  });
675
664
 
676
665
  describe('constructor', () => {
@@ -778,7 +767,6 @@ describe('RemoteMediaManager', () => {
778
767
  );
779
768
  }, 'invalid config: duplicate member video pane id: paneB');
780
769
  });
781
-
782
770
  });
783
771
 
784
772
  describe('stop', () => {
@@ -864,7 +852,6 @@ describe('RemoteMediaManager', () => {
864
852
  });
865
853
 
866
854
  describe('setPreferLiveVideo', () => {
867
-
868
855
  it('sets preferLiveVideo', async () => {
869
856
  const config = cloneDeep(DefaultTestConfiguration);
870
857
  let stubs = [];
@@ -878,7 +865,9 @@ describe('RemoteMediaManager', () => {
878
865
  );
879
866
 
880
867
  remoteMediaManager.on(Event.VideoLayoutChanged, (layoutInfo: VideoLayoutChangedEventData) => {
881
- Object.values(layoutInfo.activeSpeakerVideoPanes).forEach((group) => stubs.push(sinon.stub(group, 'setPreferLiveVideo')));
868
+ Object.values(layoutInfo.activeSpeakerVideoPanes).forEach((group) =>
869
+ stubs.push(sinon.stub(group, 'setPreferLiveVideo'))
870
+ );
882
871
  });
883
872
 
884
873
  await remoteMediaManager.start();
@@ -886,9 +875,8 @@ describe('RemoteMediaManager', () => {
886
875
  assert(stubs.length > 0);
887
876
  await remoteMediaManager.setPreferLiveVideo(true);
888
877
 
889
-
890
878
  stubs.forEach((stub) => {
891
- assert.calledWith(stub, true, false)
879
+ assert.calledWith(stub, true, false);
892
880
  });
893
881
 
894
882
  expect(config.video.preferLiveVideo).to.equal(true);
@@ -944,10 +932,7 @@ describe('RemoteMediaManager', () => {
944
932
 
945
933
  await remoteMediaManager.setLayout('Stage');
946
934
 
947
- assert.calledWith(
948
- logger.log,
949
- 'RemoteMediaManager#setLayout --> new layout selected: Stage'
950
- );
935
+ assert.calledWith(logger.log, 'RemoteMediaManager#setLayout --> new layout selected: Stage');
951
936
  assert.calledWith(
952
937
  logger.log,
953
938
  'RemoteMediaManager#logMainVideoReceiveSlots --> MAIN VIDEO receive slots: unused=0, activeSpeaker=6, receiverSelected=4\ngroup: thumbnails\nfake video slot, fake video slot, fake video slot, fake video slot, fake video slot, fake video slot\nreceiverSelected:\n stage-1: fake video slot\n stage-2: fake video slot\n stage-3: fake video slot\n stage-4: fake video slot\n'
@@ -956,7 +941,7 @@ describe('RemoteMediaManager', () => {
956
941
 
957
942
  it('logs layout changes - active speaker', async () => {
958
943
  const config = cloneDeep(DefaultTestConfiguration);
959
- config.video.initialLayoutId = 'OnePlusFive'
944
+ config.video.initialLayoutId = 'OnePlusFive';
960
945
 
961
946
  remoteMediaManager = new RemoteMediaManager(
962
947
  fakeReceiveSlotManager,
@@ -980,7 +965,6 @@ describe('RemoteMediaManager', () => {
980
965
  );
981
966
  });
982
967
 
983
-
984
968
  it('releases slots when switching to layout that requires less active speaker slots', async () => {
985
969
  // start with "AllEqual" layout that needs just 9 video slots
986
970
  const config = cloneDeep(DefaultTestConfiguration);
@@ -1010,7 +994,6 @@ describe('RemoteMediaManager', () => {
1010
994
  });
1011
995
 
1012
996
  it('releases slots and reallocates slots when switching to layouts in correct order', async () => {
1013
-
1014
997
  const config = cloneDeep(DefaultTestConfiguration);
1015
998
  let count = 0;
1016
999
 
@@ -1026,7 +1009,7 @@ describe('RemoteMediaManager', () => {
1026
1009
  return Promise.resolve(fakeScreenShareVideoSlot);
1027
1010
  }
1028
1011
  throw new Error(`invalid mediaType: ${mediaType}`);
1029
- })
1012
+ });
1030
1013
 
1031
1014
  remoteMediaManager = new RemoteMediaManager(
1032
1015
  fakeReceiveSlotManager,
@@ -1038,57 +1021,70 @@ describe('RemoteMediaManager', () => {
1038
1021
 
1039
1022
  resetHistory();
1040
1023
 
1041
- assert.deepEqual(remoteMediaManager.slots.video.activeSpeaker.map((slot: any) => slot.id), [
1042
- "fake video 0",
1043
- "fake video 1",
1044
- "fake video 2",
1045
- "fake video 3",
1046
- "fake video 4",
1047
- "fake video 5",
1048
- "fake video 6",
1049
- "fake video 7",
1050
- "fake video 8",
1051
- ]);
1024
+ assert.deepEqual(
1025
+ remoteMediaManager.slots.video.activeSpeaker.map((slot: any) => slot.id),
1026
+ [
1027
+ 'fake video 0',
1028
+ 'fake video 1',
1029
+ 'fake video 2',
1030
+ 'fake video 3',
1031
+ 'fake video 4',
1032
+ 'fake video 5',
1033
+ 'fake video 6',
1034
+ 'fake video 7',
1035
+ 'fake video 8',
1036
+ ]
1037
+ );
1052
1038
 
1053
- assert.deepEqual(remoteMediaManager.receiveSlotAllocations.activeSpeaker["main"].slots.map((slot: any) => slot.id), [
1054
- "fake video 0",
1055
- "fake video 1",
1056
- "fake video 2",
1057
- "fake video 3",
1058
- "fake video 4",
1059
- "fake video 5",
1060
- "fake video 6",
1061
- "fake video 7",
1062
- "fake video 8",
1063
- ])
1039
+ assert.deepEqual(
1040
+ remoteMediaManager.receiveSlotAllocations.activeSpeaker['main'].slots.map(
1041
+ (slot: any) => slot.id
1042
+ ),
1043
+ [
1044
+ 'fake video 0',
1045
+ 'fake video 1',
1046
+ 'fake video 2',
1047
+ 'fake video 3',
1048
+ 'fake video 4',
1049
+ 'fake video 5',
1050
+ 'fake video 6',
1051
+ 'fake video 7',
1052
+ 'fake video 8',
1053
+ ]
1054
+ );
1064
1055
 
1065
1056
  // switch to "OnePlusFive" layout that requires 3 less video slots (6)
1066
1057
  await remoteMediaManager.setLayout('OnePlusFive');
1067
1058
 
1068
1059
  assert.deepEqual(remoteMediaManager.slots.video.unused, []);
1069
1060
 
1070
- assert.deepEqual(remoteMediaManager.slots.video.activeSpeaker.map((slot: any) => slot.id), [
1071
- "fake video 0",
1072
- "fake video 1",
1073
- "fake video 2",
1074
- "fake video 3",
1075
- "fake video 4",
1076
- "fake video 5"
1077
- ]);
1061
+ assert.deepEqual(
1062
+ remoteMediaManager.slots.video.activeSpeaker.map((slot: any) => slot.id),
1063
+ [
1064
+ 'fake video 0',
1065
+ 'fake video 1',
1066
+ 'fake video 2',
1067
+ 'fake video 3',
1068
+ 'fake video 4',
1069
+ 'fake video 5',
1070
+ ]
1071
+ );
1078
1072
 
1079
1073
  // we're checking that the slots are in the same order as in the previous layout
1080
1074
  // first one goes into main
1081
- assert.deepEqual(remoteMediaManager.receiveSlotAllocations.activeSpeaker["mainBigOne"].slots.map((slot: any) => slot.id), [
1082
- "fake video 0",
1083
- ])
1075
+ assert.deepEqual(
1076
+ remoteMediaManager.receiveSlotAllocations.activeSpeaker['mainBigOne'].slots.map(
1077
+ (slot: any) => slot.id
1078
+ ),
1079
+ ['fake video 0']
1080
+ );
1084
1081
  // and rest go in the pips
1085
- assert.deepEqual(remoteMediaManager.receiveSlotAllocations.activeSpeaker["secondarySetOfSmallPanes"].slots.map((slot: any) => slot.id), [
1086
- "fake video 1",
1087
- "fake video 2",
1088
- "fake video 3",
1089
- "fake video 4",
1090
- "fake video 5"
1091
- ])
1082
+ assert.deepEqual(
1083
+ remoteMediaManager.receiveSlotAllocations.activeSpeaker[
1084
+ 'secondarySetOfSmallPanes'
1085
+ ].slots.map((slot: any) => slot.id),
1086
+ ['fake video 1', 'fake video 2', 'fake video 3', 'fake video 4', 'fake video 5']
1087
+ );
1092
1088
 
1093
1089
  // verify that 3 main video slots were released
1094
1090
  assert.callCount(fakeReceiveSlotManager.releaseSlot, 3);
@@ -1103,37 +1099,45 @@ describe('RemoteMediaManager', () => {
1103
1099
  assert.deepEqual(remoteMediaManager.slots.video.unused, []);
1104
1100
 
1105
1101
  // checking that slots are in the same order as in previous layout + 3 new ones
1106
- assert.deepEqual(remoteMediaManager.slots.video.activeSpeaker.map((slot: any) => slot.id), [
1107
- "fake video 0",
1108
- "fake video 1",
1109
- "fake video 2",
1110
- "fake video 3",
1111
- "fake video 4",
1112
- "fake video 5",
1113
- "fake video 10",
1114
- "fake video 11",
1115
- "fake video 12",
1116
- ]);
1102
+ assert.deepEqual(
1103
+ remoteMediaManager.slots.video.activeSpeaker.map((slot: any) => slot.id),
1104
+ [
1105
+ 'fake video 0',
1106
+ 'fake video 1',
1107
+ 'fake video 2',
1108
+ 'fake video 3',
1109
+ 'fake video 4',
1110
+ 'fake video 5',
1111
+ 'fake video 10',
1112
+ 'fake video 11',
1113
+ 'fake video 12',
1114
+ ]
1115
+ );
1117
1116
 
1118
- assert.deepEqual(remoteMediaManager.receiveSlotAllocations.activeSpeaker["main"].slots.map((slot: any) => slot.id), [
1119
- "fake video 0",
1120
- "fake video 1",
1121
- "fake video 2",
1122
- "fake video 3",
1123
- "fake video 4",
1124
- "fake video 5",
1125
- "fake video 10",
1126
- "fake video 11",
1127
- "fake video 12"
1128
- ])
1129
-
1130
- // verify that 3 main video slots were allocated
1131
- assert.callCount(fakeReceiveSlotManager.allocateSlot, 3);
1132
- fakeReceiveSlotManager.allocateSlot.getCalls().forEach((call) => {
1133
- const mediaType = call.args[0];
1134
-
1135
- assert.strictEqual(mediaType, MediaType.VideoMain);
1136
- });
1117
+ assert.deepEqual(
1118
+ remoteMediaManager.receiveSlotAllocations.activeSpeaker['main'].slots.map(
1119
+ (slot: any) => slot.id
1120
+ ),
1121
+ [
1122
+ 'fake video 0',
1123
+ 'fake video 1',
1124
+ 'fake video 2',
1125
+ 'fake video 3',
1126
+ 'fake video 4',
1127
+ 'fake video 5',
1128
+ 'fake video 10',
1129
+ 'fake video 11',
1130
+ 'fake video 12',
1131
+ ]
1132
+ );
1133
+
1134
+ // verify that 3 main video slots were allocated
1135
+ assert.callCount(fakeReceiveSlotManager.allocateSlot, 3);
1136
+ fakeReceiveSlotManager.allocateSlot.getCalls().forEach((call) => {
1137
+ const mediaType = call.args[0];
1138
+
1139
+ assert.strictEqual(mediaType, MediaType.VideoMain);
1140
+ });
1137
1141
  });
1138
1142
 
1139
1143
  it('stops all current video remoteMedia instances when switching to new layout', async () => {
@@ -1275,9 +1279,7 @@ describe('RemoteMediaManager', () => {
1275
1279
  );
1276
1280
  receivedLayoutInfo.activeSpeakerVideoPanes.big
1277
1281
  .getRemoteMedia()
1278
- .forEach((remoteMedia) =>
1279
- assert.strictEqual(remoteMedia.mediaType, MediaType.VideoMain)
1280
- );
1282
+ .forEach((remoteMedia) => assert.strictEqual(remoteMedia.mediaType, MediaType.VideoMain));
1281
1283
 
1282
1284
  // "small" group
1283
1285
  assert.strictEqual(
@@ -1286,9 +1288,7 @@ describe('RemoteMediaManager', () => {
1286
1288
  );
1287
1289
  receivedLayoutInfo.activeSpeakerVideoPanes.small
1288
1290
  .getRemoteMedia()
1289
- .forEach((remoteMedia) =>
1290
- assert.strictEqual(remoteMedia.mediaType, MediaType.VideoMain)
1291
- );
1291
+ .forEach((remoteMedia) => assert.strictEqual(remoteMedia.mediaType, MediaType.VideoMain));
1292
1292
  }
1293
1293
  });
1294
1294
 
@@ -1713,6 +1713,279 @@ describe('RemoteMediaManager', () => {
1713
1713
  });
1714
1714
  });
1715
1715
 
1716
+ describe('setRemoteVideoCsis', () => {
1717
+ const setup = async () => {
1718
+ let receiveSlotId = 0;
1719
+ let layoutInfo: VideoLayoutChangedEventData;
1720
+
1721
+ fakeReceiveSlotManager.allocateSlot.callsFake(
1722
+ async (mediaType: MediaType) => new FakeSlot(mediaType, `receive-slot-${receiveSlotId++}`)
1723
+ );
1724
+
1725
+ remoteMediaManager.on(Event.VideoLayoutChanged, (info: VideoLayoutChangedEventData) => {
1726
+ layoutInfo = info;
1727
+ });
1728
+
1729
+ await remoteMediaManager.start();
1730
+ await remoteMediaManager.setLayout('Stage');
1731
+
1732
+ assert.isNotNull(layoutInfo);
1733
+ resetHistory();
1734
+
1735
+ return {layoutInfo};
1736
+ };
1737
+
1738
+ const addRequestCall = (remoteMedia: RemoteMedia, csi: CSI) => [
1739
+ sinon.match({
1740
+ policyInfo: sinon.match({policy: 'receiver-selected', csi}),
1741
+ receiveSlots: [remoteMedia.getUnderlyingReceiveSlot()],
1742
+ }),
1743
+ false,
1744
+ ];
1745
+
1746
+ const cancelRequestCall = (requestId: string) => [requestId, false];
1747
+
1748
+ const commitCall = () => [];
1749
+
1750
+ const checkCalls = (
1751
+ checks: {addRequest?: any[][]; cancelRequest?: any[][]; commit?: any[][]} = {}
1752
+ ) => {
1753
+ // Check calls are made as expected
1754
+ ['addRequest', 'cancelRequest', 'commit'].forEach((name) => {
1755
+ const spy = fakeMediaRequestManagers.video[name];
1756
+ const calls = checks[name] || [];
1757
+
1758
+ assert.callCount(spy, calls.length);
1759
+ calls.forEach((call, index) => {
1760
+ assert.calledWithExactly(spy.getCall(index), ...call);
1761
+ });
1762
+ });
1763
+
1764
+ // Check that commit is always done after all add and cancel requests
1765
+ if (checks.commit?.length) {
1766
+ if (checks.addRequest?.length) {
1767
+ assert.callOrder(
1768
+ fakeMediaRequestManagers.video.addRequest,
1769
+ fakeMediaRequestManagers.video.commit
1770
+ );
1771
+ }
1772
+ if (checks.cancelRequest?.length) {
1773
+ assert.callOrder(
1774
+ fakeMediaRequestManagers.video.cancelRequest,
1775
+ fakeMediaRequestManagers.video.commit
1776
+ );
1777
+ }
1778
+ }
1779
+
1780
+ resetHistory();
1781
+ };
1782
+
1783
+ it('does nothing when the input array is empty', async () => {
1784
+ await setup();
1785
+
1786
+ remoteMediaManager.setRemoteVideoCsis([]);
1787
+
1788
+ checkCalls();
1789
+ });
1790
+
1791
+ it('errors when one remote media is not found for a single remote media', async () => {
1792
+ const id = 'UNKNOWN';
1793
+
1794
+ await setup();
1795
+
1796
+ assert.throws(
1797
+ () => remoteMediaManager.setRemoteVideoCsis([{remoteMedia: {id}, csi: 1234}]),
1798
+ Error,
1799
+ `remoteMedia ${id} not found`
1800
+ );
1801
+
1802
+ checkCalls();
1803
+ });
1804
+
1805
+ it('errors when one remote media is not found for multiple remote medias', async () => {
1806
+ const {layoutInfo} = await setup();
1807
+ const id = 'UNKNOWN';
1808
+
1809
+ assert.throws(
1810
+ () =>
1811
+ remoteMediaManager.setRemoteVideoCsis([
1812
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-1'], csi: 1234},
1813
+ {remoteMedia: {id}, csi: 2345},
1814
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-2'], csi: 3456},
1815
+ ]),
1816
+ Error,
1817
+ `remoteMedia ${id} not found`
1818
+ );
1819
+
1820
+ checkCalls();
1821
+ });
1822
+
1823
+ it('sets, updates, then unsets a single csi', async () => {
1824
+ const {layoutInfo} = await setup();
1825
+ const requestIds = ['request-0', 'request-1'];
1826
+ const csis = [1234, 2345];
1827
+
1828
+ // Set remote video CSIs
1829
+ fakeMediaRequestManagers.video.addRequest.onCall(0).returns(requestIds[0]);
1830
+
1831
+ remoteMediaManager.setRemoteVideoCsis([
1832
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-1'], csi: csis[0]},
1833
+ ]);
1834
+
1835
+ checkCalls({
1836
+ addRequest: [addRequestCall(layoutInfo.memberVideoPanes['stage-1'], csis[0])],
1837
+ commit: [commitCall()],
1838
+ });
1839
+
1840
+ // Update remote video CSIs
1841
+ fakeMediaRequestManagers.video.addRequest.onCall(0).returns(requestIds[1]);
1842
+
1843
+ remoteMediaManager.setRemoteVideoCsis([
1844
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-1'], csi: csis[1]},
1845
+ ]);
1846
+
1847
+ checkCalls({
1848
+ addRequest: [addRequestCall(layoutInfo.memberVideoPanes['stage-1'], csis[1])],
1849
+ cancelRequest: [cancelRequestCall(requestIds[0])],
1850
+ commit: [commitCall()],
1851
+ });
1852
+
1853
+ // Unset remote video CSIs
1854
+ remoteMediaManager.setRemoteVideoCsis([
1855
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-1'], csi: undefined},
1856
+ ]);
1857
+
1858
+ checkCalls({
1859
+ cancelRequest: [cancelRequestCall(requestIds[1])],
1860
+ commit: [commitCall()],
1861
+ });
1862
+ });
1863
+
1864
+ it('sets, updates, then unsets multiple csis', async () => {
1865
+ const {layoutInfo} = await setup();
1866
+ const requestIds = [
1867
+ 'request-0',
1868
+ 'request-1',
1869
+ 'request-2',
1870
+ 'request-3',
1871
+ 'request-4',
1872
+ 'request-5',
1873
+ ];
1874
+ const csis = [1234, 2345, 3456, 4567, 5678, 67890];
1875
+
1876
+ // Set remote video CSIs
1877
+ fakeMediaRequestManagers.video.addRequest.onCall(0).returns(requestIds[0]);
1878
+ fakeMediaRequestManagers.video.addRequest.onCall(1).returns(requestIds[1]);
1879
+ fakeMediaRequestManagers.video.addRequest.onCall(2).returns(requestIds[2]);
1880
+
1881
+ remoteMediaManager.setRemoteVideoCsis([
1882
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-2'], csi: csis[0]},
1883
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-3'], csi: csis[1]},
1884
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-4'], csi: csis[2]},
1885
+ ]);
1886
+
1887
+ checkCalls({
1888
+ addRequest: [
1889
+ addRequestCall(layoutInfo.memberVideoPanes['stage-2'], csis[0]),
1890
+ addRequestCall(layoutInfo.memberVideoPanes['stage-3'], csis[1]),
1891
+ addRequestCall(layoutInfo.memberVideoPanes['stage-4'], csis[2]),
1892
+ ],
1893
+ commit: [commitCall()],
1894
+ });
1895
+
1896
+ // Update remote video CSIs
1897
+ fakeMediaRequestManagers.video.addRequest.onCall(0).returns(requestIds[3]);
1898
+ fakeMediaRequestManagers.video.addRequest.onCall(1).returns(requestIds[4]);
1899
+ fakeMediaRequestManagers.video.addRequest.onCall(2).returns(requestIds[5]);
1900
+
1901
+ remoteMediaManager.setRemoteVideoCsis([
1902
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-2'], csi: csis[3]},
1903
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-3'], csi: csis[4]},
1904
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-4'], csi: csis[5]},
1905
+ ]);
1906
+
1907
+ checkCalls({
1908
+ addRequest: [
1909
+ addRequestCall(layoutInfo.memberVideoPanes['stage-2'], csis[3]),
1910
+ addRequestCall(layoutInfo.memberVideoPanes['stage-3'], csis[4]),
1911
+ addRequestCall(layoutInfo.memberVideoPanes['stage-4'], csis[5]),
1912
+ ],
1913
+ cancelRequest: [
1914
+ cancelRequestCall(requestIds[0]),
1915
+ cancelRequestCall(requestIds[1]),
1916
+ cancelRequestCall(requestIds[2]),
1917
+ ],
1918
+ commit: [commitCall()],
1919
+ });
1920
+
1921
+ // Unset remote video CSIs
1922
+ remoteMediaManager.setRemoteVideoCsis([
1923
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-2'], csi: undefined},
1924
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-3'], csi: undefined},
1925
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-4'], csi: undefined},
1926
+ ]);
1927
+
1928
+ checkCalls({
1929
+ cancelRequest: [
1930
+ cancelRequestCall(requestIds[3]),
1931
+ cancelRequestCall(requestIds[4]),
1932
+ cancelRequestCall(requestIds[5]),
1933
+ ],
1934
+ commit: [commitCall()],
1935
+ });
1936
+ });
1937
+
1938
+ it('sets, updates and unsets multiple csis simultaneously', async () => {
1939
+ const {layoutInfo} = await setup();
1940
+ const requestIds = ['request-0', 'request-1', 'request-2', 'request-3', 'request-4'];
1941
+ const csis = [1234, 2345, 3456, 4567, 5678];
1942
+
1943
+ // Initially set some video CSIs
1944
+ fakeMediaRequestManagers.video.addRequest.onCall(0).returns(requestIds[0]);
1945
+ fakeMediaRequestManagers.video.addRequest.onCall(1).returns(requestIds[1]);
1946
+ fakeMediaRequestManagers.video.addRequest.onCall(2).returns(requestIds[2]);
1947
+
1948
+ remoteMediaManager.setRemoteVideoCsis([
1949
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-1'], csi: csis[0]},
1950
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-2'], csi: csis[1]},
1951
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-3'], csi: csis[2]},
1952
+ ]);
1953
+
1954
+ checkCalls({
1955
+ addRequest: [
1956
+ addRequestCall(layoutInfo.memberVideoPanes['stage-1'], csis[0]),
1957
+ addRequestCall(layoutInfo.memberVideoPanes['stage-2'], csis[1]),
1958
+ addRequestCall(layoutInfo.memberVideoPanes['stage-3'], csis[2]),
1959
+ ],
1960
+ commit: [commitCall()],
1961
+ });
1962
+
1963
+ // Set, update, and unset video CSIs
1964
+ fakeMediaRequestManagers.video.addRequest.onCall(0).returns(requestIds[3]);
1965
+ fakeMediaRequestManagers.video.addRequest.onCall(1).returns(requestIds[4]);
1966
+
1967
+ remoteMediaManager.setRemoteVideoCsis([
1968
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-1'], csi: undefined},
1969
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-2'], csi: null},
1970
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-3'], csi: csis[3]},
1971
+ {remoteMedia: layoutInfo.memberVideoPanes['stage-4'], csi: csis[4]},
1972
+ ]);
1973
+
1974
+ checkCalls({
1975
+ addRequest: [
1976
+ addRequestCall(layoutInfo.memberVideoPanes['stage-3'], csis[3]),
1977
+ addRequestCall(layoutInfo.memberVideoPanes['stage-4'], csis[4]),
1978
+ ],
1979
+ cancelRequest: [
1980
+ cancelRequestCall(requestIds[0]),
1981
+ cancelRequestCall(requestIds[1]),
1982
+ cancelRequestCall(requestIds[2]),
1983
+ ],
1984
+ commit: [commitCall()],
1985
+ });
1986
+ });
1987
+ });
1988
+
1716
1989
  describe('setRemoteVideoCsi', () => {
1717
1990
  it('sends correct media requests', async () => {
1718
1991
  let currentLayoutInfo: VideoLayoutChangedEventData | null = null;
@@ -1994,7 +2267,9 @@ describe('RemoteMediaManager', () => {
1994
2267
 
1995
2268
  remoteMediaManager.on(Event.VideoLayoutChanged, (layoutInfo: VideoLayoutChangedEventData) => {
1996
2269
  currentLayoutInfo = layoutInfo;
1997
- Object.values(layoutInfo.activeSpeakerVideoPanes).forEach((group) => stubs.push(sinon.stub(group, 'setActiveSpeakerCsis')));
2270
+ Object.values(layoutInfo.activeSpeakerVideoPanes).forEach((group) =>
2271
+ stubs.push(sinon.stub(group, 'setActiveSpeakerCsis'))
2272
+ );
1998
2273
  });
1999
2274
 
2000
2275
  await remoteMediaManager.start();
@@ -2003,16 +2278,20 @@ describe('RemoteMediaManager', () => {
2003
2278
  assert.isNotNull(currentLayoutInfo);
2004
2279
 
2005
2280
  if (currentLayoutInfo) {
2006
-
2007
- const remoteMedia1 = currentLayoutInfo.activeSpeakerVideoPanes.mainBigOne.getRemoteMedia()[0];
2008
- const remoteMedia2 = currentLayoutInfo.activeSpeakerVideoPanes.secondarySetOfSmallPanes.getRemoteMedia()[0];
2281
+ const remoteMedia1 =
2282
+ currentLayoutInfo.activeSpeakerVideoPanes.mainBigOne.getRemoteMedia()[0];
2283
+ const remoteMedia2 =
2284
+ currentLayoutInfo.activeSpeakerVideoPanes.secondarySetOfSmallPanes.getRemoteMedia()[0];
2009
2285
 
2010
2286
  const remoteMediaCsis = [{remoteMedia: remoteMedia1}, {remoteMedia: remoteMedia2}];
2011
2287
 
2012
- remoteMediaManager.setActiveSpeakerCsis([{remoteMedia: remoteMedia1}, {remoteMedia: remoteMedia2}]);
2288
+ remoteMediaManager.setActiveSpeakerCsis([
2289
+ {remoteMedia: remoteMedia1},
2290
+ {remoteMedia: remoteMedia2},
2291
+ ]);
2013
2292
 
2014
2293
  stubs.forEach((stub, index) => {
2015
- assert.calledWith(stub, [remoteMediaCsis[index]], false)
2294
+ assert.calledWith(stub, [remoteMediaCsis[index]], false);
2016
2295
  });
2017
2296
  assert.calledOnce(fakeMediaRequestManagers.video.commit);
2018
2297
  }