@webex/plugin-meetings 3.0.0-beta.31 → 3.0.0-beta.310

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 (378) 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 +94 -15
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +709 -35
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/utils.js +45 -1
  17. package/dist/breakouts/utils.js.map +1 -1
  18. package/dist/common/errors/no-meeting-info.js +51 -0
  19. package/dist/common/errors/no-meeting-info.js.map +1 -0
  20. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  21. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +48 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/logs/request.js +5 -1
  27. package/dist/common/logs/request.js.map +1 -1
  28. package/dist/common/queue.js +24 -9
  29. package/dist/common/queue.js.map +1 -1
  30. package/dist/config.js +5 -11
  31. package/dist/config.js.map +1 -1
  32. package/dist/constants.js +233 -29
  33. package/dist/constants.js.map +1 -1
  34. package/dist/controls-options-manager/enums.js +14 -2
  35. package/dist/controls-options-manager/enums.js.map +1 -1
  36. package/dist/controls-options-manager/index.js +109 -15
  37. package/dist/controls-options-manager/index.js.map +1 -1
  38. package/dist/controls-options-manager/types.js +7 -0
  39. package/dist/controls-options-manager/types.js.map +1 -0
  40. package/dist/controls-options-manager/util.js +309 -18
  41. package/dist/controls-options-manager/util.js.map +1 -1
  42. package/dist/index.js +112 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/interpretation/collection.js +23 -0
  45. package/dist/interpretation/collection.js.map +1 -0
  46. package/dist/interpretation/index.js +366 -0
  47. package/dist/interpretation/index.js.map +1 -0
  48. package/dist/interpretation/siLanguage.js +25 -0
  49. package/dist/interpretation/siLanguage.js.map +1 -0
  50. package/dist/locus-info/controlsUtils.js +91 -2
  51. package/dist/locus-info/controlsUtils.js.map +1 -1
  52. package/dist/locus-info/index.js +383 -62
  53. package/dist/locus-info/index.js.map +1 -1
  54. package/dist/locus-info/infoUtils.js +7 -1
  55. package/dist/locus-info/infoUtils.js.map +1 -1
  56. package/dist/locus-info/mediaSharesUtils.js +57 -1
  57. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  58. package/dist/locus-info/parser.js +249 -72
  59. package/dist/locus-info/parser.js.map +1 -1
  60. package/dist/locus-info/selfUtils.js +89 -14
  61. package/dist/locus-info/selfUtils.js.map +1 -1
  62. package/dist/media/index.js +61 -116
  63. package/dist/media/index.js.map +1 -1
  64. package/dist/media/properties.js +73 -124
  65. package/dist/media/properties.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +82 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +3777 -2929
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +292 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +230 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +260 -196
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +601 -417
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +73 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +192 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/util.js +1 -1
  83. package/dist/meeting-info/util.js.map +1 -1
  84. package/dist/meeting-info/utilv2.js +36 -36
  85. package/dist/meeting-info/utilv2.js.map +1 -1
  86. package/dist/meetings/collection.js +39 -0
  87. package/dist/meetings/collection.js.map +1 -1
  88. package/dist/meetings/index.js +415 -115
  89. package/dist/meetings/index.js.map +1 -1
  90. package/dist/meetings/meetings.types.js +7 -0
  91. package/dist/meetings/meetings.types.js.map +1 -0
  92. package/dist/meetings/request.js +2 -0
  93. package/dist/meetings/request.js.map +1 -1
  94. package/dist/meetings/util.js +72 -6
  95. package/dist/meetings/util.js.map +1 -1
  96. package/dist/member/index.js +58 -0
  97. package/dist/member/index.js.map +1 -1
  98. package/dist/member/types.js +25 -0
  99. package/dist/member/types.js.map +1 -0
  100. package/dist/member/util.js +132 -25
  101. package/dist/member/util.js.map +1 -1
  102. package/dist/members/collection.js +10 -0
  103. package/dist/members/collection.js.map +1 -1
  104. package/dist/members/index.js +102 -6
  105. package/dist/members/index.js.map +1 -1
  106. package/dist/members/request.js +106 -38
  107. package/dist/members/request.js.map +1 -1
  108. package/dist/members/types.js +15 -0
  109. package/dist/members/types.js.map +1 -0
  110. package/dist/members/util.js +326 -232
  111. package/dist/members/util.js.map +1 -1
  112. package/dist/metrics/constants.js +13 -5
  113. package/dist/metrics/constants.js.map +1 -1
  114. package/dist/metrics/index.js +1 -468
  115. package/dist/metrics/index.js.map +1 -1
  116. package/dist/multistream/mediaRequestManager.js +238 -49
  117. package/dist/multistream/mediaRequestManager.js.map +1 -1
  118. package/dist/multistream/receiveSlot.js +29 -16
  119. package/dist/multistream/receiveSlot.js.map +1 -1
  120. package/dist/multistream/receiveSlotManager.js +39 -36
  121. package/dist/multistream/receiveSlotManager.js.map +1 -1
  122. package/dist/multistream/remoteMedia.js +44 -18
  123. package/dist/multistream/remoteMedia.js.map +1 -1
  124. package/dist/multistream/remoteMediaGroup.js +60 -3
  125. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  126. package/dist/multistream/remoteMediaManager.js +209 -59
  127. package/dist/multistream/remoteMediaManager.js.map +1 -1
  128. package/dist/multistream/sendSlotManager.js +233 -0
  129. package/dist/multistream/sendSlotManager.js.map +1 -0
  130. package/dist/reachability/index.js +225 -59
  131. package/dist/reachability/index.js.map +1 -1
  132. package/dist/reachability/request.js +17 -8
  133. package/dist/reachability/request.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +201 -156
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -2
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +62 -32
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +112 -97
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +95 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +117 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/index.js +86 -78
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +11 -10
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  158. package/dist/types/breakouts/events.d.ts +8 -0
  159. package/dist/types/breakouts/utils.d.ts +14 -0
  160. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  161. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  162. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  163. package/dist/types/common/logs/request.d.ts +2 -0
  164. package/dist/types/common/queue.d.ts +9 -7
  165. package/dist/types/config.d.ts +1 -7
  166. package/dist/types/constants.d.ts +194 -24
  167. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  168. package/dist/types/controls-options-manager/index.d.ts +17 -1
  169. package/dist/types/controls-options-manager/types.d.ts +43 -0
  170. package/dist/types/controls-options-manager/util.d.ts +1 -7
  171. package/dist/types/index.d.ts +6 -4
  172. package/dist/types/interpretation/collection.d.ts +5 -0
  173. package/dist/types/interpretation/index.d.ts +5 -0
  174. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  175. package/dist/types/locus-info/index.d.ts +57 -4
  176. package/dist/types/locus-info/parser.d.ts +67 -6
  177. package/dist/types/media/index.d.ts +2 -0
  178. package/dist/types/media/properties.d.ts +34 -48
  179. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  180. package/dist/types/meeting/index.d.ts +463 -510
  181. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  182. package/dist/types/meeting/muteState.d.ts +99 -23
  183. package/dist/types/meeting/request.d.ts +72 -43
  184. package/dist/types/meeting/util.d.ts +101 -1
  185. package/dist/types/meeting-info/index.d.ts +13 -1
  186. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  187. package/dist/types/meetings/collection.d.ts +17 -0
  188. package/dist/types/meetings/index.d.ts +98 -20
  189. package/dist/types/meetings/meetings.types.d.ts +4 -0
  190. package/dist/types/member/index.d.ts +14 -0
  191. package/dist/types/member/types.d.ts +32 -0
  192. package/dist/types/members/collection.d.ts +5 -0
  193. package/dist/types/members/index.d.ts +35 -2
  194. package/dist/types/members/request.d.ts +73 -9
  195. package/dist/types/members/types.d.ts +25 -0
  196. package/dist/types/members/util.d.ts +214 -1
  197. package/dist/types/metrics/constants.d.ts +12 -4
  198. package/dist/types/metrics/index.d.ts +4 -119
  199. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  200. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  201. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  202. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  203. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  204. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  205. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  206. package/dist/types/reachability/index.d.ts +61 -7
  207. package/dist/types/reachability/request.d.ts +7 -3
  208. package/dist/types/reconnection-manager/index.d.ts +9 -0
  209. package/dist/types/recording-controller/index.d.ts +15 -1
  210. package/dist/types/recording-controller/util.d.ts +5 -4
  211. package/dist/types/roap/index.d.ts +2 -1
  212. package/dist/types/roap/request.d.ts +15 -11
  213. package/dist/types/roap/turnDiscovery.d.ts +21 -3
  214. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  215. package/dist/types/rtcMetrics/index.d.ts +47 -0
  216. package/dist/types/statsAnalyzer/index.d.ts +7 -1
  217. package/dist/types/webinar/collection.d.ts +16 -0
  218. package/dist/types/webinar/index.d.ts +5 -0
  219. package/dist/webinar/collection.js +44 -0
  220. package/dist/webinar/collection.js.map +1 -0
  221. package/dist/webinar/index.js +69 -0
  222. package/dist/webinar/index.js.map +1 -0
  223. package/package.json +23 -20
  224. package/src/annotation/annotation.types.ts +50 -0
  225. package/src/annotation/constants.ts +36 -0
  226. package/src/annotation/index.ts +328 -0
  227. package/src/breakouts/README.md +42 -12
  228. package/src/breakouts/breakout.ts +67 -9
  229. package/src/breakouts/edit-lock-error.ts +25 -0
  230. package/src/breakouts/events.ts +56 -0
  231. package/src/breakouts/index.ts +592 -20
  232. package/src/breakouts/utils.ts +42 -0
  233. package/src/common/errors/no-meeting-info.ts +24 -0
  234. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  235. package/src/common/errors/webex-errors.ts +44 -2
  236. package/src/common/logs/logger-proxy.ts +1 -1
  237. package/src/common/logs/request.ts +5 -1
  238. package/src/common/queue.ts +22 -8
  239. package/src/config.ts +4 -10
  240. package/src/constants.ts +221 -19
  241. package/src/controls-options-manager/enums.ts +12 -0
  242. package/src/controls-options-manager/index.ts +116 -21
  243. package/src/controls-options-manager/types.ts +59 -0
  244. package/src/controls-options-manager/util.ts +294 -14
  245. package/src/index.ts +40 -0
  246. package/src/interpretation/README.md +60 -0
  247. package/src/interpretation/collection.ts +19 -0
  248. package/src/interpretation/index.ts +332 -0
  249. package/src/interpretation/siLanguage.ts +18 -0
  250. package/src/locus-info/controlsUtils.ts +108 -0
  251. package/src/locus-info/index.ts +413 -59
  252. package/src/locus-info/infoUtils.ts +10 -2
  253. package/src/locus-info/mediaSharesUtils.ts +64 -0
  254. package/src/locus-info/parser.ts +258 -47
  255. package/src/locus-info/selfUtils.ts +81 -5
  256. package/src/media/index.ts +102 -122
  257. package/src/media/properties.ts +87 -110
  258. package/src/meeting/in-meeting-actions.ts +163 -3
  259. package/src/meeting/index.ts +3132 -2541
  260. package/src/meeting/locusMediaRequest.ts +313 -0
  261. package/src/meeting/muteState.ts +229 -131
  262. package/src/meeting/request.ts +177 -121
  263. package/src/meeting/util.ts +588 -394
  264. package/src/meeting-info/index.ts +81 -8
  265. package/src/meeting-info/meeting-info-v2.ts +170 -14
  266. package/src/meeting-info/util.ts +1 -1
  267. package/src/meeting-info/utilv2.ts +23 -23
  268. package/src/meetings/collection.ts +33 -0
  269. package/src/meetings/index.ts +445 -123
  270. package/src/meetings/meetings.types.ts +12 -0
  271. package/src/meetings/request.ts +2 -0
  272. package/src/meetings/util.ts +80 -11
  273. package/src/member/index.ts +58 -0
  274. package/src/member/types.ts +38 -0
  275. package/src/member/util.ts +141 -25
  276. package/src/members/collection.ts +8 -0
  277. package/src/members/index.ts +134 -8
  278. package/src/members/request.ts +97 -17
  279. package/src/members/types.ts +29 -0
  280. package/src/members/util.ts +333 -240
  281. package/src/metrics/constants.ts +12 -4
  282. package/src/metrics/index.ts +1 -490
  283. package/src/multistream/mediaRequestManager.ts +289 -79
  284. package/src/multistream/receiveSlot.ts +31 -17
  285. package/src/multistream/receiveSlotManager.ts +34 -24
  286. package/src/multistream/remoteMedia.ts +27 -2
  287. package/src/multistream/remoteMediaGroup.ts +59 -0
  288. package/src/multistream/remoteMediaManager.ts +148 -30
  289. package/src/multistream/sendSlotManager.ts +170 -0
  290. package/src/reachability/index.ts +228 -37
  291. package/src/reachability/request.ts +17 -8
  292. package/src/reconnection-manager/index.ts +83 -56
  293. package/src/recording-controller/index.ts +20 -3
  294. package/src/recording-controller/util.ts +26 -9
  295. package/src/roap/index.ts +63 -32
  296. package/src/roap/request.ts +100 -104
  297. package/src/roap/turnDiscovery.ts +48 -26
  298. package/src/rtcMetrics/constants.ts +3 -0
  299. package/src/rtcMetrics/index.ts +100 -0
  300. package/src/statsAnalyzer/index.ts +105 -91
  301. package/src/statsAnalyzer/mqaUtil.ts +13 -14
  302. package/src/webinar/collection.ts +31 -0
  303. package/src/webinar/index.ts +62 -0
  304. package/test/integration/spec/converged-space-meetings.js +60 -3
  305. package/test/integration/spec/journey.js +320 -261
  306. package/test/integration/spec/space-meeting.js +76 -3
  307. package/test/unit/spec/annotation/index.ts +418 -0
  308. package/test/unit/spec/breakouts/breakout.ts +118 -28
  309. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  310. package/test/unit/spec/breakouts/events.ts +89 -0
  311. package/test/unit/spec/breakouts/index.ts +1395 -69
  312. package/test/unit/spec/breakouts/utils.js +52 -1
  313. package/test/unit/spec/common/queue.js +31 -2
  314. package/test/unit/spec/controls-options-manager/index.js +163 -0
  315. package/test/unit/spec/controls-options-manager/util.js +576 -60
  316. package/test/unit/spec/fixture/locus.js +1 -0
  317. package/test/unit/spec/interpretation/collection.ts +15 -0
  318. package/test/unit/spec/interpretation/index.ts +589 -0
  319. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  320. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  321. package/test/unit/spec/locus-info/index.js +1304 -33
  322. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  323. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  324. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  325. package/test/unit/spec/locus-info/parser.js +116 -35
  326. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  327. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  328. package/test/unit/spec/media/index.ts +104 -37
  329. package/test/unit/spec/media/properties.ts +2 -2
  330. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  331. package/test/unit/spec/meeting/index.js +5216 -1956
  332. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  333. package/test/unit/spec/meeting/muteState.js +408 -208
  334. package/test/unit/spec/meeting/request.js +483 -49
  335. package/test/unit/spec/meeting/utils.js +679 -64
  336. package/test/unit/spec/meeting-info/index.js +300 -0
  337. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  338. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  339. package/test/unit/spec/meetings/collection.js +26 -0
  340. package/test/unit/spec/meetings/index.js +1011 -205
  341. package/test/unit/spec/meetings/utils.js +202 -2
  342. package/test/unit/spec/member/index.js +61 -6
  343. package/test/unit/spec/member/util.js +510 -34
  344. package/test/unit/spec/members/index.js +432 -1
  345. package/test/unit/spec/members/request.js +206 -27
  346. package/test/unit/spec/members/utils.js +210 -0
  347. package/test/unit/spec/metrics/index.js +1 -50
  348. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  349. package/test/unit/spec/multistream/receiveSlot.ts +28 -20
  350. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  351. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  352. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  353. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  354. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  355. package/test/unit/spec/reachability/index.ts +549 -9
  356. package/test/unit/spec/reachability/request.js +68 -0
  357. package/test/unit/spec/reconnection-manager/index.js +85 -9
  358. package/test/unit/spec/recording-controller/index.js +294 -218
  359. package/test/unit/spec/recording-controller/util.js +223 -96
  360. package/test/unit/spec/roap/index.ts +178 -64
  361. package/test/unit/spec/roap/request.ts +203 -85
  362. package/test/unit/spec/roap/turnDiscovery.ts +82 -36
  363. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  364. package/test/unit/spec/stats-analyzer/index.js +136 -2
  365. package/test/unit/spec/webinar/collection.ts +13 -0
  366. package/test/unit/spec/webinar/index.ts +60 -0
  367. package/test/utils/integrationTestUtils.js +46 -0
  368. package/test/utils/testUtils.js +0 -52
  369. package/dist/meeting/effectsState.js +0 -262
  370. package/dist/meeting/effectsState.js.map +0 -1
  371. package/dist/metrics/config.js +0 -299
  372. package/dist/metrics/config.js.map +0 -1
  373. package/dist/types/meeting/effectsState.d.ts +0 -42
  374. package/dist/types/metrics/config.d.ts +0 -178
  375. package/src/index.js +0 -16
  376. package/src/meeting/effectsState.ts +0 -211
  377. package/src/metrics/config.ts +0 -495
  378. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -15,6 +15,9 @@ import {cloneDeep} from 'lodash';
15
15
  import {MediaRequest} from '@webex/plugin-meetings/src/multistream/mediaRequestManager';
16
16
  import {CSI, ReceiveSlotId} from '@webex/plugin-meetings/src/multistream/receiveSlot';
17
17
  import testUtils from '../../../utils/testUtils';
18
+ import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
19
+ import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
20
+ import { expect } from 'chai';
18
21
 
19
22
  class FakeSlot extends EventEmitter {
20
23
  public mediaType: MediaType;
@@ -32,6 +35,10 @@ class FakeSlot extends EventEmitter {
32
35
  // Calling setMaxListeners() fixes the warning.
33
36
  this.setMaxListeners(50);
34
37
  }
38
+
39
+ public get logString() {
40
+ return this.id;
41
+ }
35
42
  }
36
43
 
37
44
  const DefaultTestConfiguration: Configuration = {
@@ -120,7 +127,23 @@ describe('RemoteMediaManager', () => {
120
127
  let fakeScreenShareAudioSlot;
121
128
  let fakeScreenShareVideoSlot;
122
129
 
130
+ const logger = {
131
+ log: sinon.fake(),
132
+ error: () => {},
133
+ warn: () => {},
134
+ trace: () => {},
135
+ debug: () => {},
136
+ };
137
+
138
+ afterEach(() => {
139
+ LoggerConfig.set({enable: false});
140
+ LoggerProxy.set();
141
+ });
142
+
123
143
  beforeEach(() => {
144
+ LoggerConfig.set({enable: true});
145
+ LoggerProxy.set(logger);
146
+
124
147
  fakeAudioSlot = new FakeSlot(MediaType.AudioMain, 'fake audio slot');
125
148
  fakeVideoSlot = new FakeSlot(MediaType.VideoMain, 'fake video slot');
126
149
  fakeScreenShareAudioSlot = new FakeSlot(
@@ -191,6 +214,7 @@ describe('RemoteMediaManager', () => {
191
214
  fakeMediaRequestManagers.video.commit.resetHistory();
192
215
  fakeMediaRequestManagers.screenShareVideo.commit.resetHistory();
193
216
  fakeMediaRequestManagers.screenShareAudio.commit.resetHistory();
217
+ logger.log.resetHistory();
194
218
  };
195
219
 
196
220
  describe('start', () => {
@@ -639,6 +663,41 @@ describe('RemoteMediaManager', () => {
639
663
  remoteMediaManager.stop();
640
664
  });
641
665
  });
666
+
667
+ describe('setPreferLiveVideo', () => {
668
+
669
+ it('sets preferLiveVideo', async () => {
670
+ const config = cloneDeep(DefaultTestConfiguration);
671
+ let stubs = [];
672
+
673
+ config.video.initialLayoutId = 'OnePlusFive';
674
+
675
+ remoteMediaManager = new RemoteMediaManager(
676
+ fakeReceiveSlotManager,
677
+ fakeMediaRequestManagers,
678
+ config
679
+ );
680
+
681
+ remoteMediaManager.on(Event.VideoLayoutChanged, (layoutInfo: VideoLayoutChangedEventData) => {
682
+ Object.values(layoutInfo.activeSpeakerVideoPanes).forEach((group) => stubs.push(sinon.stub(group, 'setPreferLiveVideo')));
683
+ });
684
+
685
+ await remoteMediaManager.start();
686
+ resetHistory();
687
+ assert(stubs.length > 0);
688
+ await remoteMediaManager.setPreferLiveVideo(true);
689
+
690
+
691
+ stubs.forEach((stub) => {
692
+ assert.calledWith(stub, true, false)
693
+ });
694
+
695
+ expect(config.video.preferLiveVideo).to.equal(true);
696
+
697
+ assert.calledOnce(fakeMediaRequestManagers.video.commit);
698
+ });
699
+ });
700
+
642
701
  describe('setLayout', () => {
643
702
  it('rejects if called with invalid layoutId', async () => {
644
703
  await assert.isRejected(remoteMediaManager.setLayout('invalid value'));
@@ -671,6 +730,58 @@ describe('RemoteMediaManager', () => {
671
730
  assert.alwaysCalledWith(fakeReceiveSlotManager.allocateSlot, MediaType.VideoMain);
672
731
  });
673
732
 
733
+ it('logs layout changes - receiver selected', async () => {
734
+ const config = cloneDeep(DefaultTestConfiguration);
735
+
736
+ remoteMediaManager = new RemoteMediaManager(
737
+ fakeReceiveSlotManager,
738
+ fakeMediaRequestManagers,
739
+ config
740
+ );
741
+
742
+ await remoteMediaManager.start();
743
+
744
+ resetHistory();
745
+
746
+ await remoteMediaManager.setLayout('Stage');
747
+
748
+ assert.calledWith(
749
+ logger.log,
750
+ 'RemoteMediaManager#setLayout --> new layout selected: Stage'
751
+ );
752
+ assert.calledWith(
753
+ logger.log,
754
+ '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'
755
+ );
756
+ });
757
+
758
+ it('logs layout changes - active speaker', async () => {
759
+ const config = cloneDeep(DefaultTestConfiguration);
760
+ config.video.initialLayoutId = 'OnePlusFive'
761
+
762
+ remoteMediaManager = new RemoteMediaManager(
763
+ fakeReceiveSlotManager,
764
+ fakeMediaRequestManagers,
765
+ config
766
+ );
767
+
768
+ await remoteMediaManager.start();
769
+
770
+ resetHistory();
771
+
772
+ await remoteMediaManager.setLayout('AllEqual');
773
+
774
+ assert.calledWith(
775
+ logger.log,
776
+ 'RemoteMediaManager#setLayout --> new layout selected: AllEqual'
777
+ );
778
+ assert.calledWith(
779
+ logger.log,
780
+ 'RemoteMediaManager#logMainVideoReceiveSlots --> MAIN VIDEO receive slots: unused=0, activeSpeaker=9, receiverSelected=0\ngroup: main\nfake video slot, fake video slot, fake video slot, fake video slot, fake video slot, fake video slot, fake video slot, fake video slot, fake video slot\nreceiverSelected:\n'
781
+ );
782
+ });
783
+
784
+
674
785
  it('releases slots when switching to layout that requires less active speaker slots', async () => {
675
786
  // start with "AllEqual" layout that needs just 9 video slots
676
787
  const config = cloneDeep(DefaultTestConfiguration);
@@ -699,6 +810,133 @@ describe('RemoteMediaManager', () => {
699
810
  });
700
811
  });
701
812
 
813
+ it('releases slots and reallocates slots when switching to layouts in correct order', async () => {
814
+
815
+ const config = cloneDeep(DefaultTestConfiguration);
816
+ let count = 0;
817
+
818
+ fakeReceiveSlotManager.allocateSlot = sinon.stub().callsFake((mediaType) => {
819
+ switch (mediaType) {
820
+ case MediaType.AudioMain:
821
+ return Promise.resolve(fakeAudioSlot);
822
+ case MediaType.VideoMain:
823
+ return Promise.resolve(new FakeSlot(MediaType.VideoMain, `fake video ${count++}`));
824
+ case MediaType.AudioSlides:
825
+ return Promise.resolve(fakeScreenShareAudioSlot);
826
+ case MediaType.VideoSlides:
827
+ return Promise.resolve(fakeScreenShareVideoSlot);
828
+ }
829
+ throw new Error(`invalid mediaType: ${mediaType}`);
830
+ })
831
+
832
+ remoteMediaManager = new RemoteMediaManager(
833
+ fakeReceiveSlotManager,
834
+ fakeMediaRequestManagers,
835
+ config
836
+ );
837
+
838
+ await remoteMediaManager.start();
839
+
840
+ resetHistory();
841
+
842
+ assert.deepEqual(remoteMediaManager.slots.video.activeSpeaker.map((slot: any) => slot.id), [
843
+ "fake video 0",
844
+ "fake video 1",
845
+ "fake video 2",
846
+ "fake video 3",
847
+ "fake video 4",
848
+ "fake video 5",
849
+ "fake video 6",
850
+ "fake video 7",
851
+ "fake video 8",
852
+ ]);
853
+
854
+ assert.deepEqual(remoteMediaManager.receiveSlotAllocations.activeSpeaker["main"].slots.map((slot: any) => slot.id), [
855
+ "fake video 0",
856
+ "fake video 1",
857
+ "fake video 2",
858
+ "fake video 3",
859
+ "fake video 4",
860
+ "fake video 5",
861
+ "fake video 6",
862
+ "fake video 7",
863
+ "fake video 8",
864
+ ])
865
+
866
+ // switch to "OnePlusFive" layout that requires 3 less video slots (6)
867
+ await remoteMediaManager.setLayout('OnePlusFive');
868
+
869
+ assert.deepEqual(remoteMediaManager.slots.video.unused, []);
870
+
871
+ assert.deepEqual(remoteMediaManager.slots.video.activeSpeaker.map((slot: any) => slot.id), [
872
+ "fake video 0",
873
+ "fake video 1",
874
+ "fake video 2",
875
+ "fake video 3",
876
+ "fake video 4",
877
+ "fake video 5"
878
+ ]);
879
+
880
+ // we're checking that the slots are in the same order as in the previous layout
881
+ // first one goes into main
882
+ assert.deepEqual(remoteMediaManager.receiveSlotAllocations.activeSpeaker["mainBigOne"].slots.map((slot: any) => slot.id), [
883
+ "fake video 0",
884
+ ])
885
+ // and rest go in the pips
886
+ assert.deepEqual(remoteMediaManager.receiveSlotAllocations.activeSpeaker["secondarySetOfSmallPanes"].slots.map((slot: any) => slot.id), [
887
+ "fake video 1",
888
+ "fake video 2",
889
+ "fake video 3",
890
+ "fake video 4",
891
+ "fake video 5"
892
+ ])
893
+
894
+ // verify that 3 main video slots were released
895
+ assert.callCount(fakeReceiveSlotManager.releaseSlot, 3);
896
+ fakeReceiveSlotManager.releaseSlot.getCalls().forEach((call) => {
897
+ const slot = call.args[0];
898
+
899
+ assert.strictEqual(slot.mediaType, MediaType.VideoMain);
900
+ });
901
+
902
+ await remoteMediaManager.setLayout('AllEqual');
903
+
904
+ assert.deepEqual(remoteMediaManager.slots.video.unused, []);
905
+
906
+ // checking that slots are in the same order as in previous layout + 3 new ones
907
+ assert.deepEqual(remoteMediaManager.slots.video.activeSpeaker.map((slot: any) => slot.id), [
908
+ "fake video 0",
909
+ "fake video 1",
910
+ "fake video 2",
911
+ "fake video 3",
912
+ "fake video 4",
913
+ "fake video 5",
914
+ "fake video 10",
915
+ "fake video 11",
916
+ "fake video 12",
917
+ ]);
918
+
919
+ assert.deepEqual(remoteMediaManager.receiveSlotAllocations.activeSpeaker["main"].slots.map((slot: any) => slot.id), [
920
+ "fake video 0",
921
+ "fake video 1",
922
+ "fake video 2",
923
+ "fake video 3",
924
+ "fake video 4",
925
+ "fake video 5",
926
+ "fake video 10",
927
+ "fake video 11",
928
+ "fake video 12"
929
+ ])
930
+
931
+ // verify that 3 main video slots were allocated
932
+ assert.callCount(fakeReceiveSlotManager.allocateSlot, 3);
933
+ fakeReceiveSlotManager.allocateSlot.getCalls().forEach((call) => {
934
+ const mediaType = call.args[0];
935
+
936
+ assert.strictEqual(mediaType, MediaType.VideoMain);
937
+ });
938
+ });
939
+
702
940
  it('stops all current video remoteMedia instances when switching to new layout', async () => {
703
941
  const audioStopStubs = [];
704
942
  const videoStopStubs = [];
@@ -1494,6 +1732,94 @@ describe('RemoteMediaManager', () => {
1494
1732
  });
1495
1733
  });
1496
1734
 
1735
+ describe('setActiveSpeakerCsis', () => {
1736
+ it('calls setActiveSpeakerCsis on the correct remote media group', async () => {
1737
+ let currentLayoutInfo: VideoLayoutChangedEventData | null = null;
1738
+ let setCsisStub;
1739
+
1740
+ remoteMediaManager.on(Event.VideoLayoutChanged, (layoutInfo: VideoLayoutChangedEventData) => {
1741
+ currentLayoutInfo = layoutInfo;
1742
+ setCsisStub = sinon.stub(layoutInfo.activeSpeakerVideoPanes.main, 'setActiveSpeakerCsis');
1743
+ });
1744
+
1745
+ await remoteMediaManager.start();
1746
+ resetHistory();
1747
+
1748
+ assert.isNotNull(currentLayoutInfo);
1749
+
1750
+ if (currentLayoutInfo) {
1751
+ const remoteVideo = currentLayoutInfo.activeSpeakerVideoPanes.main.getRemoteMedia()[0];
1752
+
1753
+ remoteMediaManager.setActiveSpeakerCsis([{remoteMedia: remoteVideo}]);
1754
+
1755
+ assert.calledOnce(setCsisStub);
1756
+ assert.calledWith(setCsisStub, [{remoteMedia: remoteVideo}], false);
1757
+ assert.calledOnce(fakeMediaRequestManagers.video.commit);
1758
+ }
1759
+ });
1760
+
1761
+ it('does not call setActiveSpeakerCsis on the incorrect media group', async () => {
1762
+ let currentLayoutInfo: VideoLayoutChangedEventData | null = null;
1763
+ let setCsisStub;
1764
+
1765
+ remoteMediaManager.on(Event.VideoLayoutChanged, (layoutInfo: VideoLayoutChangedEventData) => {
1766
+ currentLayoutInfo = layoutInfo;
1767
+ setCsisStub = sinon.stub(layoutInfo.activeSpeakerVideoPanes.main, 'setActiveSpeakerCsis');
1768
+ });
1769
+
1770
+ await remoteMediaManager.start();
1771
+ resetHistory();
1772
+
1773
+ assert.isNotNull(currentLayoutInfo);
1774
+
1775
+ if (currentLayoutInfo) {
1776
+ remoteMediaManager.setActiveSpeakerCsis([{remoteMedia: {}}]);
1777
+
1778
+ assert.notCalled(setCsisStub);
1779
+ assert.calledOnce(fakeMediaRequestManagers.video.commit);
1780
+ }
1781
+ });
1782
+
1783
+ it('checking when there is more than one group', async () => {
1784
+ let currentLayoutInfo: VideoLayoutChangedEventData | null = null;
1785
+ const config = cloneDeep(DefaultTestConfiguration);
1786
+ let stubs = [];
1787
+
1788
+ config.video.initialLayoutId = 'OnePlusFive';
1789
+
1790
+ remoteMediaManager = new RemoteMediaManager(
1791
+ fakeReceiveSlotManager,
1792
+ fakeMediaRequestManagers,
1793
+ config
1794
+ );
1795
+
1796
+ remoteMediaManager.on(Event.VideoLayoutChanged, (layoutInfo: VideoLayoutChangedEventData) => {
1797
+ currentLayoutInfo = layoutInfo;
1798
+ Object.values(layoutInfo.activeSpeakerVideoPanes).forEach((group) => stubs.push(sinon.stub(group, 'setActiveSpeakerCsis')));
1799
+ });
1800
+
1801
+ await remoteMediaManager.start();
1802
+ resetHistory();
1803
+
1804
+ assert.isNotNull(currentLayoutInfo);
1805
+
1806
+ if (currentLayoutInfo) {
1807
+
1808
+ const remoteMedia1 = currentLayoutInfo.activeSpeakerVideoPanes.mainBigOne.getRemoteMedia()[0];
1809
+ const remoteMedia2 = currentLayoutInfo.activeSpeakerVideoPanes.secondarySetOfSmallPanes.getRemoteMedia()[0];
1810
+
1811
+ const remoteMediaCsis = [{remoteMedia: remoteMedia1}, {remoteMedia: remoteMedia2}];
1812
+
1813
+ remoteMediaManager.setActiveSpeakerCsis([{remoteMedia: remoteMedia1}, {remoteMedia: remoteMedia2}]);
1814
+
1815
+ stubs.forEach((stub, index) => {
1816
+ assert.calledWith(stub, [remoteMediaCsis[index]], false)
1817
+ });
1818
+ assert.calledOnce(fakeMediaRequestManagers.video.commit);
1819
+ }
1820
+ });
1821
+ });
1822
+
1497
1823
  describe('pinActiveSpeakerVideoPane() and isPinned()', () => {
1498
1824
  it('throws if called on a pane not belonging to an active speaker group', async () => {
1499
1825
  let currentLayoutInfo: VideoLayoutChangedEventData | null = null;
@@ -0,0 +1,242 @@
1
+ import SendSlotManager from '@webex/plugin-meetings/src/multistream/sendSlotManager';
2
+ import { LocalStream, MediaType, MultistreamRoapMediaConnection } from "@webex/internal-media-core";
3
+ import {expect} from '@webex/test-helper-chai';
4
+ import sinon from 'sinon';
5
+
6
+ describe('SendSlotsManager', () => {
7
+ let sendSlotsManager: SendSlotManager;
8
+ const LoggerProxy = {
9
+ logger: {
10
+ info: sinon.stub(),
11
+ },
12
+ };
13
+
14
+ beforeEach(() => {
15
+ sendSlotsManager = new SendSlotManager(LoggerProxy);
16
+ });
17
+
18
+ describe('createSlot', () => {
19
+ let mediaConnection;
20
+ const mediaType = MediaType.AudioMain;
21
+
22
+ beforeEach(() => {
23
+ mediaConnection = {
24
+ createSendSlot: sinon.stub(),
25
+ } as MultistreamRoapMediaConnection;
26
+ });
27
+
28
+ it('should create a slot for the given mediaType', () => {
29
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
30
+
31
+ expect(mediaConnection.createSendSlot.calledWith(mediaType, true));
32
+ });
33
+
34
+ it('should create a slot for the given mediaType & active state', () => {
35
+ sendSlotsManager.createSlot(mediaConnection, mediaType, false);
36
+
37
+ expect(mediaConnection.createSendSlot.calledWith(mediaType, false));
38
+ });
39
+
40
+ it('should throw an error if a slot for the given mediaType already exists', () => {
41
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
42
+
43
+ expect(() => sendSlotsManager.createSlot(mediaConnection, mediaType)).to.throw(`Slot for ${mediaType} already exists`);
44
+ });
45
+ });
46
+
47
+ describe('getSlot', () => {
48
+ const mediaType = MediaType.AudioMain;
49
+ let mediaConnection;
50
+
51
+ beforeEach(() => {
52
+ mediaConnection = {
53
+ createSendSlot: sinon.stub().returns({}),
54
+ } as MultistreamRoapMediaConnection;
55
+ });
56
+
57
+ it('should return the slot for the given mediaType', () => {
58
+ const slot = sendSlotsManager.createSlot(mediaConnection,mediaType);
59
+
60
+ expect(sendSlotsManager.getSlot(mediaType)).to.equal(slot);
61
+ });
62
+
63
+ it('should throw an error if a slot for the given mediaType does not exist', () => {
64
+ expect(() => sendSlotsManager.getSlot(mediaType)).to.throw(`Slot for ${mediaType} does not exist`);
65
+ });
66
+ });
67
+
68
+ describe('publishStream', () => {
69
+ let mediaConnection;
70
+ const mediaType = MediaType.AudioMain;
71
+ const stream = {} as LocalStream;
72
+
73
+ beforeEach(() => {
74
+ mediaConnection = {
75
+ createSendSlot: sinon.stub(),
76
+ } as MultistreamRoapMediaConnection;
77
+ });
78
+
79
+ it('should publish the given stream to the sendSlot for the given mediaType', async () => {
80
+ const slot = {
81
+ publishStream: sinon.stub().resolves(),
82
+ };
83
+ mediaConnection.createSendSlot.returns(slot);
84
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
85
+
86
+ await sendSlotsManager.publishStream(mediaType, stream);
87
+
88
+ expect(slot.publishStream.calledWith(stream));
89
+ });
90
+
91
+ it('should throw an error if a slot for the given mediaType does not exist', (done) => {
92
+ sendSlotsManager.publishStream(mediaType, stream).catch((error) => {
93
+ expect(error.message).to.equal(`Slot for ${mediaType} does not exist`);
94
+ done();
95
+ });
96
+ });
97
+ });
98
+
99
+ describe('unpublishStream', () => {
100
+ let mediaConnection;
101
+ const mediaType = MediaType.AudioMain;
102
+
103
+ beforeEach(() => {
104
+ mediaConnection = {
105
+ createSendSlot: sinon.stub(),
106
+ } as MultistreamRoapMediaConnection;
107
+ });
108
+
109
+ it('should unpublish the stream from the sendSlot of the given mediaType', async () => {
110
+ const slot = {
111
+ unpublishStream: sinon.stub().resolves(),
112
+ };
113
+ mediaConnection.createSendSlot.returns(slot);
114
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
115
+
116
+ await sendSlotsManager.unpublishStream(mediaType);
117
+
118
+ expect(slot.unpublishStream.called);
119
+ });
120
+
121
+ it('should throw an error if a slot for the given mediaType does not exist',(done) => {
122
+ sendSlotsManager.unpublishStream(mediaType).catch((error) => {
123
+ expect(error.message).to.equal(`Slot for ${mediaType} does not exist`);
124
+ done();
125
+ });
126
+ });
127
+ });
128
+
129
+ describe('setActive', () => {
130
+ let mediaConnection;
131
+ const mediaType = MediaType.AudioMain;
132
+
133
+ beforeEach(() => {
134
+ mediaConnection = {
135
+ createSendSlot: sinon.stub(),
136
+ } as MultistreamRoapMediaConnection;
137
+ });
138
+
139
+ it('should set the active state of the sendSlot for the given mediaType', async () => {
140
+ const slot = {
141
+ setActive: sinon.stub().resolves(),
142
+ };
143
+ mediaConnection.createSendSlot.returns(slot);
144
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
145
+
146
+ await sendSlotsManager.setActive(mediaType,true);
147
+
148
+ expect(slot.setActive.called);
149
+ });
150
+
151
+ it('should throw an error if a slot for the given mediaType does not exist', () => {
152
+ expect(() => sendSlotsManager.setActive(mediaType)).to.throw(`Slot for ${mediaType} does not exist`)
153
+ });
154
+ });
155
+
156
+ describe('setCodecParameters', () => {
157
+ let mediaConnection;
158
+ const mediaType = MediaType.AudioMain;
159
+ const codecParameters = {};
160
+
161
+ beforeEach(() => {
162
+ mediaConnection = {
163
+ createSendSlot: sinon.stub(),
164
+ } as MultistreamRoapMediaConnection;
165
+ });
166
+
167
+ it('should set the codec parameters of the sendSlot for the given mediaType', async () => {
168
+ const slot = {
169
+ setCodecParameters: sinon.stub().resolves(),
170
+ };
171
+ mediaConnection.createSendSlot.returns(slot);
172
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
173
+
174
+ await sendSlotsManager.setCodecParameters(mediaType, codecParameters);
175
+
176
+ expect(slot.setCodecParameters.calledWith(codecParameters));
177
+ });
178
+
179
+ it('should throw an error if a slot for the given mediaType does not exist', (done) => {
180
+ sendSlotsManager.setCodecParameters(mediaType, codecParameters).catch((error) => {
181
+ expect(error.message).to.equal(`Slot for ${mediaType} does not exist`);
182
+ done();
183
+ });
184
+ });
185
+ });
186
+
187
+ describe('deleteCodecParameters', () => {
188
+ let mediaConnection;
189
+ const mediaType = MediaType.AudioMain;
190
+
191
+ beforeEach(() => {
192
+ mediaConnection = {
193
+ createSendSlot: sinon.stub(),
194
+ } as MultistreamRoapMediaConnection;
195
+ });
196
+
197
+ it('should delete the codec parameters of the sendSlot for the given mediaType', async () => {
198
+ const slot = {
199
+ deleteCodecParameters: sinon.stub().resolves(),
200
+ };
201
+ mediaConnection.createSendSlot.returns(slot);
202
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
203
+
204
+ await sendSlotsManager.deleteCodecParameters(mediaType,[]);
205
+
206
+ expect(slot.deleteCodecParameters.called);
207
+ });
208
+
209
+ it('should throw an error if a slot for the given mediaType does not exist', (done) => {
210
+ sendSlotsManager.deleteCodecParameters(mediaType,[]).catch((error) => {
211
+ expect(error.message).to.equal(`Slot for ${mediaType} does not exist`);
212
+ done();
213
+ });
214
+ });
215
+ });
216
+
217
+ describe('reset', () => {
218
+ let mediaConnection;
219
+
220
+ beforeEach(() => {
221
+ mediaConnection = {
222
+ createSendSlot: sinon.stub().returns({}),
223
+ } as MultistreamRoapMediaConnection;
224
+ });
225
+
226
+ it('should reset the send slot manager', () => {
227
+ const AudioSlot = sendSlotsManager.createSlot(mediaConnection, MediaType.AudioMain);
228
+ const VideoSlot = sendSlotsManager.createSlot(mediaConnection, MediaType.VideoMain);
229
+ const AudioSlidesSlot = sendSlotsManager.createSlot(mediaConnection, MediaType.AudioSlides);
230
+ const VideoSlidesSlot = sendSlotsManager.createSlot(mediaConnection, MediaType.VideoSlides);
231
+ expect(sendSlotsManager.getSlot(MediaType.AudioMain)).to.equal(AudioSlot);
232
+ expect(sendSlotsManager.getSlot(MediaType.VideoMain)).to.equal(VideoSlot);
233
+ expect(sendSlotsManager.getSlot(MediaType.AudioSlides)).to.equal(AudioSlidesSlot);
234
+ expect(sendSlotsManager.getSlot(MediaType.VideoSlides)).to.equal(VideoSlidesSlot);
235
+ sendSlotsManager.reset();
236
+ expect(() => sendSlotsManager.getSlot(MediaType.AudioMain)).to.throw();
237
+ expect(() => sendSlotsManager.getSlot(MediaType.VideoMain)).to.throw();
238
+ expect(() => sendSlotsManager.getSlot(MediaType.AudioSlides)).to.throw();
239
+ expect(() => sendSlotsManager.getSlot(MediaType.VideoSlides)).to.throw();
240
+ });
241
+ });
242
+ });