@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
@@ -9,6 +9,8 @@ import {assert} from '@webex/test-helper-chai';
9
9
  class FakeWcmeSlot extends EventEmitter {
10
10
  public stream;
11
11
 
12
+ public id = 'fake id';
13
+
12
14
  constructor(stream) {
13
15
  super();
14
16
  this.stream = stream;
@@ -28,6 +30,12 @@ describe('ReceiveSlot', () => {
28
30
  receiveSlot = new ReceiveSlot(MediaType.VideoMain, fakeWcmeSlot, findMemberIdCallbackStub);
29
31
  });
30
32
 
33
+ describe('logString', () => {
34
+ it('has a log string', () => {
35
+ assert.equal(receiveSlot.logString, `ReceiveSlot - ${receiveSlot.id}: "fake id"`);
36
+ });
37
+ })
38
+
31
39
  describe('forwards events from underlying wcme receive slot', () => {
32
40
  it('forwards SourceUpdate', () => {
33
41
  let eventEmitted = false;
@@ -57,7 +65,7 @@ describe('ReceiveSlot', () => {
57
65
  });
58
66
 
59
67
  it('has public properties', () => {
60
- assert.strictEqual(receiveSlot.id, 'r1');
68
+ assert.isTrue(receiveSlot.id.startsWith('r'));
61
69
  assert.strictEqual(receiveSlot.mediaType, MediaType.VideoMain);
62
70
  });
63
71
 
@@ -83,25 +91,6 @@ describe('ReceiveSlot', () => {
83
91
  assert.strictEqual(receiveSlot.sourceState, 'live');
84
92
  });
85
93
 
86
- it('resets source related properties when resetSourceState() is called', () => {
87
- const csi = 123456;
88
- const fakeMemberId = '00000001-5555-6666-9012-345678901234';
89
-
90
- findMemberIdCallbackStub.returns(fakeMemberId);
91
-
92
- fakeWcmeSlot.emit(WcmeReceiveSlotEvents.SourceUpdate, 'live', csi);
93
-
94
- assert.strictEqual(receiveSlot.memberId, fakeMemberId);
95
- assert.strictEqual(receiveSlot.csi, csi);
96
- assert.strictEqual(receiveSlot.sourceState, 'live');
97
-
98
- receiveSlot.resetSourceState();
99
-
100
- assert.strictEqual(receiveSlot.memberId, undefined);
101
- assert.strictEqual(receiveSlot.csi, undefined);
102
- assert.strictEqual(receiveSlot.sourceState, 'no source');
103
- });
104
-
105
94
  describe('findMemberId()', () => {
106
95
  it('doesn\'t do anything if csi is not set', () => {
107
96
  // by default the receiveSlot does not have any csi or member id
@@ -152,4 +141,23 @@ describe('ReceiveSlot', () => {
152
141
  assert.notCalled(findMemberIdCallbackStub);
153
142
  });
154
143
  });
144
+
145
+ describe('setMaxFs()', () => {
146
+ it('emits the correct event', () => {
147
+ sinon.stub(receiveSlot, 'emit');
148
+ receiveSlot.setMaxFs(100);
149
+
150
+ assert.calledOnceWithExactly(
151
+ receiveSlot.emit,
152
+ {
153
+ file: 'meeting/receiveSlot',
154
+ function: 'findMemberId',
155
+ },
156
+ ReceiveSlotEvents.MaxFsUpdate,
157
+ {
158
+ maxFs: 100,
159
+ }
160
+ );
161
+ })
162
+ });
155
163
  });
@@ -6,25 +6,16 @@ import {ReceiveSlotManager} from '@webex/plugin-meetings/src/multistream/receive
6
6
  import * as ReceiveSlotModule from '@webex/plugin-meetings/src/multistream/receiveSlot';
7
7
 
8
8
  describe('ReceiveSlotManager', () => {
9
- let fakeMeeting;
10
9
  let fakeWcmeSlot;
11
10
  let fakeReceiveSlots;
12
11
  let mockReceiveSlotCtor;
13
12
  let receiveSlotManager;
13
+ let createSlotCallbackStub;
14
+ let findMemberIdCallbackStub;
14
15
 
15
16
  beforeEach(() => {
16
17
  fakeWcmeSlot = {
17
- id: 'fake wcme slot',
18
- };
19
- fakeMeeting = {
20
- mediaProperties: {
21
- webrtcMediaConnection: {
22
- createReceiveSlot: sinon.stub().resolves(fakeWcmeSlot),
23
- },
24
- },
25
- members: {
26
- findMemberByCsi: sinon.stub(),
27
- },
18
+ id: {ssrc: 1},
28
19
  };
29
20
  fakeReceiveSlots = [];
30
21
  mockReceiveSlotCtor = sinon.stub(ReceiveSlotModule, 'ReceiveSlot').callsFake((mediaType) => {
@@ -32,6 +23,7 @@ describe('ReceiveSlotManager', () => {
32
23
  id: `fake sdk receive slot ${fakeReceiveSlots.length + 1}`,
33
24
  mediaType,
34
25
  findMemberId: sinon.stub(),
26
+ wcmeReceiveSlot: fakeWcmeSlot,
35
27
  };
36
28
 
37
29
  fakeReceiveSlots.push(fakeReceiveSlot);
@@ -39,7 +31,10 @@ describe('ReceiveSlotManager', () => {
39
31
  return fakeReceiveSlot;
40
32
  });
41
33
 
42
- receiveSlotManager = new ReceiveSlotManager(fakeMeeting);
34
+ createSlotCallbackStub = sinon.stub().resolves(fakeWcmeSlot);
35
+ findMemberIdCallbackStub = sinon.stub();
36
+
37
+ receiveSlotManager = new ReceiveSlotManager(createSlotCallbackStub, findMemberIdCallbackStub);
43
38
  });
44
39
 
45
40
  afterEach(() => {
@@ -47,7 +42,7 @@ describe('ReceiveSlotManager', () => {
47
42
  });
48
43
 
49
44
  it('rejects if there is no media connection', async () => {
50
- fakeMeeting.mediaProperties.webrtcMediaConnection = null;
45
+ createSlotCallbackStub.rejects(new Error('Webrtc media connection is missing'));
51
46
 
52
47
  assert.isRejected(
53
48
  receiveSlotManager.allocateSlot(MediaType.VideoMain),
@@ -60,14 +55,14 @@ describe('ReceiveSlotManager', () => {
60
55
 
61
56
  const slot = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
62
57
 
63
- assert.calledOnce(fakeMeeting.mediaProperties.webrtcMediaConnection.createReceiveSlot);
58
+ assert.calledOnce(createSlotCallbackStub);
64
59
  assert.calledWith(
65
- fakeMeeting.mediaProperties.webrtcMediaConnection.createReceiveSlot,
60
+ createSlotCallbackStub,
66
61
  MediaType.VideoMain
67
62
  );
68
63
 
69
64
  assert.calledOnce(mockReceiveSlotCtor);
70
- assert.calledWith(mockReceiveSlotCtor, MediaType.VideoMain, fakeWcmeSlot, sinon.match.func);
65
+ assert.calledWith(mockReceiveSlotCtor, MediaType.VideoMain, fakeWcmeSlot, findMemberIdCallbackStub);
71
66
  assert.strictEqual(slot, fakeReceiveSlots[0]);
72
67
 
73
68
  assert.deepEqual(receiveSlotManager.getStats(), {
@@ -79,7 +74,7 @@ describe('ReceiveSlotManager', () => {
79
74
  it('reuses previously freed slot when allocateSlot() is called and a free slot is available', async () => {
80
75
  const slot1 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
81
76
 
82
- assert.calledOnce(fakeMeeting.mediaProperties.webrtcMediaConnection.createReceiveSlot);
77
+ assert.calledOnce(createSlotCallbackStub);
83
78
  assert.calledOnce(mockReceiveSlotCtor);
84
79
  assert.strictEqual(slot1, fakeReceiveSlots[0]);
85
80
 
@@ -91,13 +86,13 @@ describe('ReceiveSlotManager', () => {
91
86
  numFreeSlots: {'VIDEO-MAIN': 1},
92
87
  });
93
88
 
94
- fakeMeeting.mediaProperties.webrtcMediaConnection.createReceiveSlot.resetHistory();
89
+ createSlotCallbackStub.resetHistory();
95
90
  mockReceiveSlotCtor.resetHistory();
96
91
 
97
92
  // allocate another slot, this time the previous one should be returned instead of allocating any new ones
98
93
  const slot2 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
99
94
 
100
- assert.notCalled(fakeMeeting.mediaProperties.webrtcMediaConnection.createReceiveSlot);
95
+ assert.notCalled(createSlotCallbackStub);
101
96
  assert.notCalled(mockReceiveSlotCtor);
102
97
 
103
98
  // verify that in fact we got the same slot again
@@ -112,7 +107,7 @@ describe('ReceiveSlotManager', () => {
112
107
  it('does not reuse any slots after reset() is called', async () => {
113
108
  const slot1 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
114
109
 
115
- assert.calledOnce(fakeMeeting.mediaProperties.webrtcMediaConnection.createReceiveSlot);
110
+ assert.calledOnce(createSlotCallbackStub);
116
111
  assert.calledOnce(mockReceiveSlotCtor);
117
112
  assert.strictEqual(slot1, fakeReceiveSlots[0]);
118
113
 
@@ -121,7 +116,7 @@ describe('ReceiveSlotManager', () => {
121
116
  receiveSlotManager.reset();
122
117
 
123
118
  // reset the mocks and set the ReceiveSlot constructor to return a different slot
124
- fakeMeeting.mediaProperties.webrtcMediaConnection.createReceiveSlot.resetHistory();
119
+ createSlotCallbackStub.resetHistory();
125
120
  mockReceiveSlotCtor.resetHistory();
126
121
 
127
122
  assert.deepEqual(receiveSlotManager.getStats(), {numAllocatedSlots: {}, numFreeSlots: {}});
@@ -129,7 +124,7 @@ describe('ReceiveSlotManager', () => {
129
124
  // allocate another slot, because we called reset(), the old free slot should not be reused
130
125
  const slot2 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
131
126
 
132
- assert.calledOnce(fakeMeeting.mediaProperties.webrtcMediaConnection.createReceiveSlot);
127
+ assert.calledOnce(createSlotCallbackStub);
133
128
  assert.calledOnce(mockReceiveSlotCtor);
134
129
 
135
130
  // verify that in fact we got a brand new slot
@@ -144,25 +139,25 @@ describe('ReceiveSlotManager', () => {
144
139
  it('does not reuse slots if they have different media type', async () => {
145
140
  const slot1 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
146
141
 
147
- assert.calledOnce(fakeMeeting.mediaProperties.webrtcMediaConnection.createReceiveSlot);
142
+ assert.calledOnce(createSlotCallbackStub);
148
143
  assert.calledOnce(mockReceiveSlotCtor);
149
144
 
150
145
  receiveSlotManager.releaseSlot(slot1);
151
146
 
152
- fakeMeeting.mediaProperties.webrtcMediaConnection.createReceiveSlot.resetHistory();
147
+ createSlotCallbackStub.resetHistory();
153
148
  mockReceiveSlotCtor.resetHistory();
154
149
 
155
150
  // allocate another slot, this time for main audio, so it should be a completely new slot
156
151
  const slot2 = await receiveSlotManager.allocateSlot(MediaType.AudioMain);
157
152
 
158
- assert.calledOnce(fakeMeeting.mediaProperties.webrtcMediaConnection.createReceiveSlot);
153
+ assert.calledOnce(createSlotCallbackStub);
159
154
  assert.calledWith(
160
- fakeMeeting.mediaProperties.webrtcMediaConnection.createReceiveSlot,
155
+ createSlotCallbackStub,
161
156
  MediaType.AudioMain
162
157
  );
163
158
 
164
159
  assert.calledOnce(mockReceiveSlotCtor);
165
- assert.calledWith(mockReceiveSlotCtor, MediaType.AudioMain, fakeWcmeSlot, sinon.match.func);
160
+ assert.calledWith(mockReceiveSlotCtor, MediaType.AudioMain, fakeWcmeSlot, findMemberIdCallbackStub);
166
161
 
167
162
  // verify that in fact we got a brand new slot
168
163
  assert.strictEqual(slot2, fakeReceiveSlots[1]);
@@ -174,7 +169,6 @@ describe('ReceiveSlotManager', () => {
174
169
  });
175
170
 
176
171
  describe('updateMemberIds', () => {
177
-
178
172
  it('calls findMemberId() on all allocated receive slots', async () => {
179
173
  const audioSlots: ReceiveSlot[] = [];
180
174
  const videoSlots: ReceiveSlot[] = [];
@@ -193,9 +187,17 @@ describe('ReceiveSlotManager', () => {
193
187
 
194
188
  assert.strictEqual(fakeReceiveSlots.length, audioSlots.length + videoSlots.length);
195
189
 
196
- fakeReceiveSlots.forEach(slot => {
190
+ fakeReceiveSlots.forEach((slot) => {
197
191
  assert.calledOnce(slot.findMemberId);
198
192
  });
199
193
  });
200
194
  });
195
+
196
+ describe('findReceiveSlotBySsrc', () => {
197
+ it('finds a receive slot with a specific id', async () => {
198
+ await receiveSlotManager.allocateSlot(MediaType.VideoMain);
199
+ assert.exists(receiveSlotManager.findReceiveSlotBySsrc(1));
200
+ assert.strictEqual(receiveSlotManager.findReceiveSlotBySsrc(2), undefined);
201
+ });
202
+ });
201
203
  });
@@ -6,6 +6,7 @@ import {RemoteMedia, RemoteMediaEvents} from '@webex/plugin-meetings/src/multist
6
6
  import {ReceiveSlotEvents} from '@webex/plugin-meetings/src/multistream/receiveSlot';
7
7
  import sinon from 'sinon';
8
8
  import {assert} from '@webex/test-helper-chai';
9
+ import { forEach } from 'lodash';
9
10
 
10
11
  describe('RemoteMedia', () => {
11
12
  let remoteMedia;
@@ -21,6 +22,7 @@ describe('RemoteMedia', () => {
21
22
  fakeReceiveSlot.csi = 999;
22
23
  fakeReceiveSlot.sourceState = 'avatar';
23
24
  fakeReceiveSlot.stream = fakeStream;
25
+ fakeReceiveSlot.setMaxFs = sinon.stub();
24
26
 
25
27
  fakeMediaRequestManager = {
26
28
  addRequest: sinon.stub(),
@@ -222,4 +224,32 @@ describe('RemoteMedia', () => {
222
224
  });
223
225
  });
224
226
  });
227
+
228
+ describe('setSizeHint()', () => {
229
+
230
+ it('works if the receive slot is undefined', () => {
231
+ remoteMedia.receiveSlot = undefined;
232
+ remoteMedia.setSizeHint(100, 100);
233
+ });
234
+
235
+ forEach(
236
+ [
237
+ {height: 134, fs: 60},
238
+ {height: 135, fs: 240},
239
+ {height: 269, fs: 240},
240
+ {height: 270, fs: 920},
241
+ {height: 539, fs: 920},
242
+ {height: 540, fs: 3600},
243
+ {height: 720, fs: 3600},
244
+ {height: 721, fs: 8192},
245
+ ],
246
+ ({height, fs}) => {
247
+ it(`sets the max fs to ${fs} correctly when height is ${height}`, () => {
248
+ remoteMedia.setSizeHint(100, height);
249
+
250
+ assert.calledOnceWithExactly(fakeReceiveSlot.setMaxFs, fs);
251
+ });
252
+ }
253
+ );
254
+ });
225
255
  });
@@ -97,6 +97,272 @@ describe('RemoteMediaGroup', () => {
97
97
  });
98
98
  });
99
99
 
100
+ describe('setPreferLiveVideo', () => {
101
+ it('updates prefer live video', () => {
102
+
103
+ const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
104
+ resolution: 'medium',
105
+ preferLiveVideo: false,
106
+ });
107
+ fakeMediaRequestManager.addRequest.resetHistory();
108
+ group.setPreferLiveVideo(true, false);
109
+
110
+ assert.calledOnce(fakeMediaRequestManager.cancelRequest);
111
+
112
+ assert.calledOnce(fakeMediaRequestManager.addRequest);
113
+
114
+ assert.calledWith(
115
+ fakeMediaRequestManager.addRequest,
116
+ sinon.match({
117
+ policyInfo: sinon.match({
118
+ policy: 'active-speaker',
119
+ priority: 255,
120
+ preferLiveVideo: true
121
+ }),
122
+ receiveSlots: fakeReceiveSlots,
123
+ codecInfo: sinon.match({
124
+ codec: 'h264',
125
+ maxFs: 3600,
126
+ }),
127
+ }),
128
+ false,
129
+ );
130
+ });
131
+
132
+ it('does not call add request when prefer live video has not changed', () => {
133
+ const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
134
+ resolution: 'medium',
135
+ preferLiveVideo: true,
136
+ });
137
+ fakeMediaRequestManager.addRequest.resetHistory();
138
+ group.setPreferLiveVideo(true, false);
139
+
140
+ assert.notCalled(fakeMediaRequestManager.cancelRequest);
141
+
142
+ assert.notCalled(fakeMediaRequestManager.addRequest);
143
+ });
144
+
145
+ });
146
+
147
+ describe('setActiveSpeakerCsis', () => {
148
+ it('checks when there is a csi and remote media is not in pinned array', () => {
149
+ const PINNED_INDEX = 2;
150
+ const CSI = 11111;
151
+
152
+ const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
153
+ resolution: 'medium',
154
+ preferLiveVideo: true,
155
+ });
156
+
157
+ // initially nothing should be pinned
158
+ assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS); // by default should return 'all'
159
+ assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
160
+ assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS);
161
+ assert.strictEqual(group.getRemoteMedia('pinned').length, 0);
162
+
163
+ const remoteMedia = group.getRemoteMedia('all')[PINNED_INDEX];
164
+
165
+ resetHistory();
166
+
167
+ group.setActiveSpeakerCsis([{remoteMedia, csi: CSI}], false);
168
+
169
+ assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS); // by default should return 'all'
170
+ assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
171
+ assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS - 1);
172
+ assert.strictEqual(group.getRemoteMedia('pinned').length, 1);
173
+
174
+ assert.strictEqual(group.isPinned(remoteMedia), true);
175
+ // now check that correct media requests were sent...
176
+
177
+ const expectedReceiverSelectedSlots = [fakeReceiveSlots[PINNED_INDEX]];
178
+ const expectedActiveSpeakerReceiveSlots = fakeReceiveSlots.filter(
179
+ (_, idx) => idx !== PINNED_INDEX
180
+ );
181
+
182
+ // the previous active speaker media request for the group should have been cancelled
183
+ assert.calledOnce(fakeMediaRequestManager.cancelRequest);
184
+ assert.calledWith(fakeMediaRequestManager.cancelRequest, 'fake active speaker request 1');
185
+ // a new one should be sent for active speaker and for receiver selected
186
+ assert.calledTwice(fakeMediaRequestManager.addRequest);
187
+ assert.calledWith(
188
+ fakeMediaRequestManager.addRequest,
189
+ sinon.match({
190
+ policyInfo: sinon.match({
191
+ policy: 'active-speaker',
192
+ priority: 255,
193
+ }),
194
+ receiveSlots: expectedActiveSpeakerReceiveSlots,
195
+ codecInfo: sinon.match({
196
+ codec: 'h264',
197
+ maxFs: 3600,
198
+ }),
199
+ })
200
+ );
201
+ assert.calledWith(
202
+ fakeMediaRequestManager.addRequest,
203
+ sinon.match({
204
+ policyInfo: sinon.match({
205
+ policy: 'receiver-selected',
206
+ csi: CSI,
207
+ }),
208
+ receiveSlots: expectedReceiverSelectedSlots,
209
+ codecInfo: sinon.match({
210
+ codec: 'h264',
211
+ maxFs: 3600,
212
+ }),
213
+ })
214
+ );
215
+ assert.notCalled(fakeMediaRequestManager.commit);
216
+ });
217
+
218
+ it('checks when there is csi and remoteMedia is in pinned array', () => {
219
+ const PINNED_INDEX = 4;
220
+
221
+ const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
222
+ resolution: 'medium',
223
+ preferLiveVideo: true,
224
+ });
225
+
226
+ // take one instance of remote media from the group
227
+ const remoteMedia = group.getRemoteMedia('all')[PINNED_INDEX];
228
+
229
+ resetHistory();
230
+
231
+ // pin it so that it is in pinned array
232
+ group.setActiveSpeakerCsis([{remoteMedia, csi: 1234}], false);
233
+
234
+ assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS); // by default should return 'all'
235
+ assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
236
+ assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS - 1);
237
+ assert.strictEqual(group.getRemoteMedia('pinned').length, 1);
238
+
239
+ resetHistory();
240
+ // normally this would result in the underlying receive slot csi to be updated, because we're using fake
241
+ // receive slots, we have to do that manually:
242
+ fakeReceiveSlots[PINNED_INDEX].csi = 1234;
243
+ const expectedReceiverSelectedSlots = [fakeReceiveSlots[PINNED_INDEX]];
244
+
245
+ // pin again to same CSI
246
+ group.setActiveSpeakerCsis([{remoteMedia, csi: 1234}], false);
247
+
248
+ assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS); // by default should return 'all'
249
+ assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
250
+ assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS - 1);
251
+ assert.strictEqual(group.getRemoteMedia('pinned').length, 1);
252
+
253
+ assert.strictEqual(group.isPinned(remoteMedia), true);
254
+
255
+ assert.calledTwice(fakeMediaRequestManager.cancelRequest);
256
+ assert.calledWith(fakeMediaRequestManager.cancelRequest, 'fake receiver selected request 1');
257
+
258
+ assert.calledWith(
259
+ fakeMediaRequestManager.addRequest,
260
+ sinon.match({
261
+ policyInfo: sinon.match({
262
+ policy: 'receiver-selected',
263
+ csi: 1234,
264
+ }),
265
+ receiveSlots: expectedReceiverSelectedSlots,
266
+ codecInfo: sinon.match({
267
+ codec: 'h264',
268
+ maxFs: 3600,
269
+ }),
270
+ })
271
+ );
272
+ assert.notCalled(fakeMediaRequestManager.commit);
273
+ });
274
+
275
+ it('checks setActiveSpeakerCsis with array of remoteMedia to pin and unpin', () => {
276
+ const PINNED_INDEX = 2;
277
+ const PINNED_INDEX2 = 0;
278
+ const CSI = 11111;
279
+ const CSI2 = 12345;
280
+
281
+ const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
282
+ resolution: 'medium',
283
+ preferLiveVideo: true,
284
+ });
285
+
286
+ // initially nothing should be pinned
287
+ assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS); // by default should return 'all'
288
+ assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
289
+ assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS);
290
+ assert.strictEqual(group.getRemoteMedia('pinned').length, 0);
291
+
292
+ const remoteMedia = group.getRemoteMedia('all')[PINNED_INDEX];
293
+
294
+ const remoteMedia2 = group.getRemoteMedia('all')[PINNED_INDEX2];
295
+
296
+ const remoteMedisCsis = [{remoteMedia, csi: CSI}, {remoteMedia: remoteMedia2, csi: CSI2}];
297
+
298
+ group.setActiveSpeakerCsis(remoteMedisCsis, false);
299
+
300
+ assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS);
301
+ assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
302
+ assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS - 2);
303
+ assert.strictEqual(group.getRemoteMedia('pinned').length, 2);
304
+
305
+ assert.strictEqual(group.isPinned(remoteMedia), true);
306
+ assert.strictEqual(group.isPinned(remoteMedia2), true);
307
+
308
+ resetHistory();
309
+
310
+ group.setActiveSpeakerCsis([{remoteMedia}], false);
311
+
312
+ // one pane should still remain pinned
313
+ assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS);
314
+ assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
315
+ assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS - 1);
316
+ assert.strictEqual(group.getRemoteMedia('pinned').length, 1);
317
+ assert.strictEqual(group.isPinned(remoteMedia), false);
318
+ assert.strictEqual(group.isPinned(remoteMedia2), true);
319
+
320
+ assert.calledTwice(fakeMediaRequestManager.cancelRequest);
321
+ assert.calledWith(fakeMediaRequestManager.cancelRequest, 'fake receiver selected request 1');
322
+ assert.notCalled(fakeMediaRequestManager.commit);
323
+ });
324
+
325
+ it('check commit is only called once', () => {
326
+ const PINNED_INDEX = 2;
327
+ const PINNED_INDEX2 = 0;
328
+ const CSI = 11111;
329
+ const CSI2 = 12345;
330
+
331
+ const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
332
+ resolution: 'medium',
333
+ preferLiveVideo: true,
334
+ });
335
+
336
+ const remoteMedia = group.getRemoteMedia('all')[PINNED_INDEX];
337
+
338
+ resetHistory();
339
+
340
+ const remoteMedia2 = group.getRemoteMedia('all')[PINNED_INDEX2];
341
+
342
+ const remoteMedisCsis = [{remoteMedia, csi: CSI}, {remoteMedia: remoteMedia2, csi: CSI2}, {remoteMedia}];
343
+
344
+ group.setActiveSpeakerCsis(remoteMedisCsis, true);
345
+
346
+ assert.calledOnce(fakeMediaRequestManager.commit);
347
+ });
348
+
349
+ it('throws when remoteMedia id is not in unpinned and pinned array - csi is there', () => {
350
+ const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
351
+ resolution: 'medium',
352
+ preferLiveVideo: true,
353
+ });
354
+ assert.throws(() => group.setActiveSpeakerCsis([{remoteMedia: {id: 'r1'} as any, csi: 123}], false), 'failed to pin a remote media object r1, because it is not found in this remote media group');
355
+ });
356
+
357
+ it('throws when remoteMedia id is not in unpinned and pinned array - csi is not there', () => {
358
+ const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
359
+ resolution: 'medium',
360
+ preferLiveVideo: true,
361
+ });
362
+ assert.throws(() => group.setActiveSpeakerCsis([{remoteMedia: {id: 'r1'} as any}], false), 'failed to unpin a remote media object r1, because it is not found in this remote media group');
363
+ });
364
+ });
365
+
100
366
  describe('pinning', () => {
101
367
  it('works as expected', () => {
102
368
  const PINNED_INDEX = 2;