@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.104

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 (548) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.js +48 -0
  6. package/dist/annotation/constants.js.map +1 -0
  7. package/dist/annotation/index.js +357 -0
  8. package/dist/annotation/index.js.map +1 -0
  9. package/dist/breakouts/breakout.js +176 -0
  10. package/dist/breakouts/breakout.js.map +1 -0
  11. package/dist/breakouts/collection.js +23 -0
  12. package/dist/breakouts/collection.js.map +1 -0
  13. package/dist/breakouts/edit-lock-error.js +52 -0
  14. package/dist/breakouts/edit-lock-error.js.map +1 -0
  15. package/dist/breakouts/events.js +43 -0
  16. package/dist/breakouts/events.js.map +1 -0
  17. package/dist/breakouts/index.js +919 -0
  18. package/dist/breakouts/index.js.map +1 -0
  19. package/dist/breakouts/request.js +78 -0
  20. package/dist/breakouts/request.js.map +1 -0
  21. package/dist/breakouts/utils.js +67 -0
  22. package/dist/breakouts/utils.js.map +1 -0
  23. package/dist/common/browser-detection.js +1 -20
  24. package/dist/common/browser-detection.js.map +1 -1
  25. package/dist/common/collection.js +5 -20
  26. package/dist/common/collection.js.map +1 -1
  27. package/dist/common/config.js +0 -7
  28. package/dist/common/config.js.map +1 -1
  29. package/dist/common/errors/captcha-error.js +10 -24
  30. package/dist/common/errors/captcha-error.js.map +1 -1
  31. package/dist/common/errors/intent-to-join.js +11 -24
  32. package/dist/common/errors/intent-to-join.js.map +1 -1
  33. package/dist/common/errors/join-meeting.js +12 -25
  34. package/dist/common/errors/join-meeting.js.map +1 -1
  35. package/dist/common/errors/media.js +10 -24
  36. package/dist/common/errors/media.js.map +1 -1
  37. package/dist/common/errors/parameter.js +5 -33
  38. package/dist/common/errors/parameter.js.map +1 -1
  39. package/dist/common/errors/password-error.js +10 -24
  40. package/dist/common/errors/password-error.js.map +1 -1
  41. package/dist/common/errors/permission.js +9 -23
  42. package/dist/common/errors/permission.js.map +1 -1
  43. package/dist/common/errors/reconnection-in-progress.js +0 -17
  44. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  45. package/dist/common/errors/reconnection.js +10 -24
  46. package/dist/common/errors/reconnection.js.map +1 -1
  47. package/dist/common/errors/stats.js +10 -24
  48. package/dist/common/errors/stats.js.map +1 -1
  49. package/dist/common/errors/webex-errors.js +10 -69
  50. package/dist/common/errors/webex-errors.js.map +1 -1
  51. package/dist/common/errors/webex-meetings-error.js +5 -25
  52. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  53. package/dist/common/events/events-scope.js +0 -22
  54. package/dist/common/events/events-scope.js.map +1 -1
  55. package/dist/common/events/events.js +0 -23
  56. package/dist/common/events/events.js.map +1 -1
  57. package/dist/common/events/trigger-proxy.js +0 -12
  58. package/dist/common/events/trigger-proxy.js.map +1 -1
  59. package/dist/common/events/util.js +0 -15
  60. package/dist/common/events/util.js.map +1 -1
  61. package/dist/common/logs/logger-config.js +0 -4
  62. package/dist/common/logs/logger-config.js.map +1 -1
  63. package/dist/common/logs/logger-proxy.js +1 -8
  64. package/dist/common/logs/logger-proxy.js.map +1 -1
  65. package/dist/common/logs/request.js +37 -60
  66. package/dist/common/logs/request.js.map +1 -1
  67. package/dist/common/queue.js +4 -14
  68. package/dist/common/queue.js.map +1 -1
  69. package/dist/config.js +7 -6
  70. package/dist/config.js.map +1 -1
  71. package/dist/constants.js +184 -122
  72. package/dist/constants.js.map +1 -1
  73. package/dist/controls-options-manager/constants.js +14 -0
  74. package/dist/controls-options-manager/constants.js.map +1 -0
  75. package/dist/controls-options-manager/enums.js +25 -0
  76. package/dist/controls-options-manager/enums.js.map +1 -0
  77. package/dist/controls-options-manager/index.js +297 -0
  78. package/dist/controls-options-manager/index.js.map +1 -0
  79. package/dist/controls-options-manager/types.js +7 -0
  80. package/dist/controls-options-manager/types.js.map +1 -0
  81. package/dist/controls-options-manager/util.js +250 -0
  82. package/dist/controls-options-manager/util.js.map +1 -0
  83. package/dist/index.js +72 -17
  84. package/dist/index.js.map +1 -1
  85. package/dist/locus-info/controlsUtils.js +56 -29
  86. package/dist/locus-info/controlsUtils.js.map +1 -1
  87. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  88. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  89. package/dist/locus-info/fullState.js +0 -15
  90. package/dist/locus-info/fullState.js.map +1 -1
  91. package/dist/locus-info/hostUtils.js +4 -12
  92. package/dist/locus-info/hostUtils.js.map +1 -1
  93. package/dist/locus-info/index.js +362 -208
  94. package/dist/locus-info/index.js.map +1 -1
  95. package/dist/locus-info/infoUtils.js +3 -37
  96. package/dist/locus-info/infoUtils.js.map +1 -1
  97. package/dist/locus-info/mediaSharesUtils.js +12 -38
  98. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  99. package/dist/locus-info/parser.js +92 -118
  100. package/dist/locus-info/parser.js.map +1 -1
  101. package/dist/locus-info/selfUtils.js +99 -91
  102. package/dist/locus-info/selfUtils.js.map +1 -1
  103. package/dist/media/index.js +113 -337
  104. package/dist/media/index.js.map +1 -1
  105. package/dist/media/properties.js +96 -135
  106. package/dist/media/properties.js.map +1 -1
  107. package/dist/media/util.js +1 -35
  108. package/dist/media/util.js.map +1 -1
  109. package/dist/mediaQualityMetrics/config.js +505 -495
  110. package/dist/mediaQualityMetrics/config.js.map +1 -1
  111. package/dist/meeting/in-meeting-actions.js +59 -14
  112. package/dist/meeting/in-meeting-actions.js.map +1 -1
  113. package/dist/meeting/index.js +2909 -2398
  114. package/dist/meeting/index.js.map +1 -1
  115. package/dist/meeting/muteState.js +257 -112
  116. package/dist/meeting/muteState.js.map +1 -1
  117. package/dist/meeting/request.js +330 -264
  118. package/dist/meeting/request.js.map +1 -1
  119. package/dist/meeting/request.type.js +7 -0
  120. package/dist/meeting/request.type.js.map +1 -0
  121. package/dist/meeting/state.js +21 -31
  122. package/dist/meeting/state.js.map +1 -1
  123. package/dist/meeting/util.js +63 -261
  124. package/dist/meeting/util.js.map +1 -1
  125. package/dist/meeting-info/collection.js +6 -25
  126. package/dist/meeting-info/collection.js.map +1 -1
  127. package/dist/meeting-info/index.js +14 -32
  128. package/dist/meeting-info/index.js.map +1 -1
  129. package/dist/meeting-info/meeting-info-v2.js +273 -280
  130. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  131. package/dist/meeting-info/request.js +3 -15
  132. package/dist/meeting-info/request.js.map +1 -1
  133. package/dist/meeting-info/util.js +98 -183
  134. package/dist/meeting-info/util.js.map +1 -1
  135. package/dist/meeting-info/utilv2.js +155 -232
  136. package/dist/meeting-info/utilv2.js.map +1 -1
  137. package/dist/meetings/collection.js +26 -19
  138. package/dist/meetings/collection.js.map +1 -1
  139. package/dist/meetings/index.js +741 -548
  140. package/dist/meetings/index.js.map +1 -1
  141. package/dist/meetings/request.js +26 -41
  142. package/dist/meetings/request.js.map +1 -1
  143. package/dist/meetings/util.js +194 -149
  144. package/dist/meetings/util.js.map +1 -1
  145. package/dist/member/index.js +100 -85
  146. package/dist/member/index.js.map +1 -1
  147. package/dist/member/types.js +15 -0
  148. package/dist/member/types.js.map +1 -0
  149. package/dist/member/util.js +90 -68
  150. package/dist/member/util.js.map +1 -1
  151. package/dist/members/collection.js +13 -12
  152. package/dist/members/collection.js.map +1 -1
  153. package/dist/members/index.js +227 -188
  154. package/dist/members/index.js.map +1 -1
  155. package/dist/members/request.js +54 -39
  156. package/dist/members/request.js.map +1 -1
  157. package/dist/members/types.js +15 -0
  158. package/dist/members/types.js.map +1 -0
  159. package/dist/members/util.js +107 -44
  160. package/dist/members/util.js.map +1 -1
  161. package/dist/metrics/config.js +5 -14
  162. package/dist/metrics/config.js.map +1 -1
  163. package/dist/metrics/constants.js +3 -7
  164. package/dist/metrics/constants.js.map +1 -1
  165. package/dist/metrics/index.js +67 -159
  166. package/dist/metrics/index.js.map +1 -1
  167. package/dist/multistream/mediaRequestManager.js +250 -0
  168. package/dist/multistream/mediaRequestManager.js.map +1 -0
  169. package/dist/multistream/receiveSlot.js +202 -0
  170. package/dist/multistream/receiveSlot.js.map +1 -0
  171. package/dist/multistream/receiveSlotManager.js +176 -0
  172. package/dist/multistream/receiveSlotManager.js.map +1 -0
  173. package/dist/multistream/remoteMedia.js +270 -0
  174. package/dist/multistream/remoteMedia.js.map +1 -0
  175. package/dist/multistream/remoteMediaGroup.js +209 -0
  176. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  177. package/dist/multistream/remoteMediaManager.js +1137 -0
  178. package/dist/multistream/remoteMediaManager.js.map +1 -0
  179. package/dist/networkQualityMonitor/index.js +40 -59
  180. package/dist/networkQualityMonitor/index.js.map +1 -1
  181. package/dist/personal-meeting-room/index.js +21 -45
  182. package/dist/personal-meeting-room/index.js.map +1 -1
  183. package/dist/personal-meeting-room/request.js +1 -31
  184. package/dist/personal-meeting-room/request.js.map +1 -1
  185. package/dist/personal-meeting-room/util.js +0 -13
  186. package/dist/personal-meeting-room/util.js.map +1 -1
  187. package/dist/reachability/index.js +192 -191
  188. package/dist/reachability/index.js.map +1 -1
  189. package/dist/reachability/request.js +15 -23
  190. package/dist/reachability/request.js.map +1 -1
  191. package/dist/reactions/constants.js +13 -0
  192. package/dist/reactions/constants.js.map +1 -0
  193. package/dist/reactions/reactions.js +109 -0
  194. package/dist/reactions/reactions.js.map +1 -0
  195. package/dist/reactions/reactions.type.js +36 -0
  196. package/dist/reactions/reactions.type.js.map +1 -0
  197. package/dist/reconnection-manager/index.js +386 -527
  198. package/dist/reconnection-manager/index.js.map +1 -1
  199. package/dist/recording-controller/enums.js +17 -0
  200. package/dist/recording-controller/enums.js.map +1 -0
  201. package/dist/recording-controller/index.js +343 -0
  202. package/dist/recording-controller/index.js.map +1 -0
  203. package/dist/recording-controller/util.js +63 -0
  204. package/dist/recording-controller/util.js.map +1 -0
  205. package/dist/roap/index.js +84 -286
  206. package/dist/roap/index.js.map +1 -1
  207. package/dist/roap/request.js +138 -238
  208. package/dist/roap/request.js.map +1 -1
  209. package/dist/roap/turnDiscovery.js +164 -102
  210. package/dist/roap/turnDiscovery.js.map +1 -1
  211. package/dist/statsAnalyzer/global.js +1 -93
  212. package/dist/statsAnalyzer/global.js.map +1 -1
  213. package/dist/statsAnalyzer/index.js +399 -470
  214. package/dist/statsAnalyzer/index.js.map +1 -1
  215. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  216. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  217. package/dist/transcription/index.js +22 -47
  218. package/dist/transcription/index.js.map +1 -1
  219. package/dist/types/annotation/annotation.types.d.ts +34 -0
  220. package/dist/types/annotation/constants.d.ts +31 -0
  221. package/dist/types/annotation/index.d.ts +124 -0
  222. package/dist/types/breakouts/breakout.d.ts +8 -0
  223. package/dist/types/breakouts/collection.d.ts +5 -0
  224. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  225. package/dist/types/breakouts/events.d.ts +2 -0
  226. package/dist/types/breakouts/index.d.ts +5 -0
  227. package/dist/types/breakouts/request.d.ts +22 -0
  228. package/dist/types/breakouts/utils.d.ts +15 -0
  229. package/dist/types/common/browser-detection.d.ts +9 -0
  230. package/dist/types/common/collection.d.ts +48 -0
  231. package/dist/types/common/config.d.ts +2 -0
  232. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  233. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  234. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  235. package/dist/types/common/errors/media.d.ts +15 -0
  236. package/dist/types/common/errors/parameter.d.ts +15 -0
  237. package/dist/types/common/errors/password-error.d.ts +15 -0
  238. package/dist/types/common/errors/permission.d.ts +14 -0
  239. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  240. package/dist/types/common/errors/reconnection.d.ts +15 -0
  241. package/dist/types/common/errors/stats.d.ts +15 -0
  242. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  243. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  244. package/dist/types/common/events/events-scope.d.ts +17 -0
  245. package/dist/types/common/events/events.d.ts +12 -0
  246. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  247. package/dist/types/common/events/util.d.ts +2 -0
  248. package/dist/types/common/logs/logger-config.d.ts +2 -0
  249. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  250. package/dist/types/common/logs/request.d.ts +34 -0
  251. package/dist/types/common/queue.d.ts +32 -0
  252. package/dist/types/config.d.ts +78 -0
  253. package/dist/types/constants.d.ts +968 -0
  254. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  255. package/dist/types/controls-options-manager/enums.d.ts +13 -0
  256. package/dist/types/controls-options-manager/index.d.ts +136 -0
  257. package/dist/types/controls-options-manager/types.d.ts +37 -0
  258. package/dist/types/controls-options-manager/util.d.ts +1 -0
  259. package/dist/types/index.d.ts +7 -0
  260. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  261. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  262. package/dist/types/locus-info/fullState.d.ts +2 -0
  263. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  264. package/dist/types/locus-info/index.d.ts +315 -0
  265. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  266. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  267. package/dist/types/locus-info/parser.d.ts +212 -0
  268. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  269. package/dist/types/media/index.d.ts +34 -0
  270. package/dist/types/media/properties.d.ts +108 -0
  271. package/dist/types/media/util.d.ts +2 -0
  272. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  273. package/dist/types/meeting/in-meeting-actions.d.ts +129 -0
  274. package/dist/types/meeting/index.d.ts +1748 -0
  275. package/dist/types/meeting/muteState.d.ts +185 -0
  276. package/dist/types/meeting/request.d.ts +275 -0
  277. package/dist/types/meeting/request.type.d.ts +11 -0
  278. package/dist/types/meeting/state.d.ts +9 -0
  279. package/dist/types/meeting/util.d.ts +2 -0
  280. package/dist/types/meeting-info/collection.d.ts +20 -0
  281. package/dist/types/meeting-info/index.d.ts +57 -0
  282. package/dist/types/meeting-info/meeting-info-v2.d.ts +112 -0
  283. package/dist/types/meeting-info/request.d.ts +22 -0
  284. package/dist/types/meeting-info/util.d.ts +2 -0
  285. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  286. package/dist/types/meetings/collection.d.ts +31 -0
  287. package/dist/types/meetings/index.d.ts +345 -0
  288. package/dist/types/meetings/request.d.ts +27 -0
  289. package/dist/types/meetings/util.d.ts +18 -0
  290. package/dist/types/member/index.d.ts +156 -0
  291. package/dist/types/member/types.d.ts +21 -0
  292. package/dist/types/member/util.d.ts +2 -0
  293. package/dist/types/members/collection.d.ts +29 -0
  294. package/dist/types/members/index.d.ts +353 -0
  295. package/dist/types/members/request.d.ts +69 -0
  296. package/dist/types/members/types.d.ts +24 -0
  297. package/dist/types/members/util.d.ts +2 -0
  298. package/dist/types/metrics/config.d.ts +172 -0
  299. package/dist/types/metrics/constants.d.ts +54 -0
  300. package/dist/types/metrics/index.d.ts +152 -0
  301. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  302. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  303. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  304. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  305. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  306. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  307. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  308. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  309. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  310. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  311. package/dist/types/reachability/index.d.ts +152 -0
  312. package/dist/types/reachability/request.d.ts +37 -0
  313. package/dist/types/reactions/constants.d.ts +3 -0
  314. package/dist/types/reactions/reactions.d.ts +4 -0
  315. package/dist/types/reactions/reactions.type.d.ts +52 -0
  316. package/dist/types/reconnection-manager/index.d.ts +126 -0
  317. package/dist/types/recording-controller/enums.d.ts +7 -0
  318. package/dist/types/recording-controller/index.d.ts +193 -0
  319. package/dist/types/recording-controller/util.d.ts +13 -0
  320. package/dist/types/roap/index.d.ts +77 -0
  321. package/dist/types/roap/request.d.ts +38 -0
  322. package/dist/types/roap/turnDiscovery.d.ts +88 -0
  323. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  324. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  325. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  326. package/dist/types/transcription/index.d.ts +64 -0
  327. package/internal-README.md +7 -6
  328. package/package.json +29 -21
  329. package/src/annotation/annotation.types.ts +41 -0
  330. package/src/annotation/constants.ts +36 -0
  331. package/src/annotation/index.ts +339 -0
  332. package/src/breakouts/README.md +219 -0
  333. package/src/breakouts/breakout.ts +141 -0
  334. package/src/breakouts/collection.ts +19 -0
  335. package/src/breakouts/edit-lock-error.ts +25 -0
  336. package/src/breakouts/events.ts +37 -0
  337. package/src/breakouts/index.ts +823 -0
  338. package/src/breakouts/request.ts +55 -0
  339. package/src/breakouts/utils.ts +57 -0
  340. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  341. package/src/common/collection.ts +9 -7
  342. package/src/common/{config.js → config.ts} +1 -1
  343. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  344. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  345. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  346. package/src/common/errors/{media.js → media.ts} +11 -7
  347. package/src/common/errors/parameter.ts +11 -7
  348. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  349. package/src/common/errors/{permission.js → permission.ts} +10 -6
  350. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  351. package/src/common/errors/{stats.js → stats.ts} +11 -7
  352. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -25
  353. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  354. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  355. package/src/common/events/{events.js → events.ts} +5 -1
  356. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  357. package/src/common/events/{util.js → util.ts} +2 -3
  358. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  359. package/src/common/logs/logger-proxy.ts +44 -0
  360. package/src/common/logs/{request.js → request.ts} +22 -9
  361. package/src/common/queue.ts +1 -2
  362. package/src/{config.js → config.ts} +18 -12
  363. package/src/constants.ts +256 -183
  364. package/src/controls-options-manager/constants.ts +5 -0
  365. package/src/controls-options-manager/enums.ts +16 -0
  366. package/src/controls-options-manager/index.ts +278 -0
  367. package/src/controls-options-manager/types.ts +49 -0
  368. package/src/controls-options-manager/util.ts +229 -0
  369. package/src/index.ts +33 -0
  370. package/src/locus-info/controlsUtils.ts +169 -0
  371. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  372. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  373. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  374. package/src/locus-info/{index.js → index.ts} +331 -80
  375. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  376. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  377. package/src/locus-info/{parser.js → parser.ts} +67 -79
  378. package/src/locus-info/{selfUtils.js → selfUtils.ts} +196 -67
  379. package/src/media/index.ts +488 -0
  380. package/src/media/{properties.js → properties.ts} +67 -54
  381. package/src/media/util.ts +16 -0
  382. package/src/mediaQualityMetrics/config.ts +384 -0
  383. package/src/meeting/in-meeting-actions.ts +123 -3
  384. package/src/meeting/{index.js → index.ts} +3334 -1775
  385. package/src/meeting/muteState.ts +526 -0
  386. package/src/meeting/{request.js → request.ts} +350 -142
  387. package/src/meeting/request.type.ts +13 -0
  388. package/src/meeting/{state.js → state.ts} +50 -35
  389. package/src/meeting/{util.js → util.ts} +126 -159
  390. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  391. package/src/meeting-info/{index.js → index.ts} +42 -36
  392. package/src/meeting-info/meeting-info-v2.ts +345 -0
  393. package/src/meeting-info/{request.js → request.ts} +14 -4
  394. package/src/meeting-info/{util.js → util.ts} +60 -51
  395. package/src/meeting-info/{utilv2.js → utilv2.ts} +76 -60
  396. package/src/meetings/{collection.js → collection.ts} +26 -3
  397. package/src/meetings/index.ts +1394 -0
  398. package/src/meetings/{request.js → request.ts} +34 -25
  399. package/src/meetings/util.ts +288 -0
  400. package/src/member/{index.js → index.ts} +124 -56
  401. package/src/member/types.ts +24 -0
  402. package/src/member/{util.js → util.ts} +105 -25
  403. package/src/members/{collection.js → collection.ts} +10 -2
  404. package/src/members/{index.js → index.ts} +359 -139
  405. package/src/members/request.ts +215 -0
  406. package/src/members/types.ts +28 -0
  407. package/src/members/{util.js → util.ts} +145 -54
  408. package/src/metrics/{config.js → config.ts} +256 -92
  409. package/src/metrics/{constants.js → constants.ts} +1 -6
  410. package/src/metrics/{index.js → index.ts} +116 -97
  411. package/src/multistream/mediaRequestManager.ts +324 -0
  412. package/src/multistream/receiveSlot.ts +184 -0
  413. package/src/multistream/receiveSlotManager.ts +166 -0
  414. package/src/multistream/remoteMedia.ts +254 -0
  415. package/src/multistream/remoteMediaGroup.ts +225 -0
  416. package/src/multistream/remoteMediaManager.ts +1075 -0
  417. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  418. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  419. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  420. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  421. package/src/reachability/{index.js → index.ts} +157 -94
  422. package/src/reachability/request.ts +46 -35
  423. package/src/reactions/constants.ts +4 -0
  424. package/src/reactions/reactions.ts +104 -0
  425. package/src/reactions/reactions.type.ts +62 -0
  426. package/src/reconnection-manager/{index.js → index.ts} +261 -163
  427. package/src/recording-controller/enums.ts +8 -0
  428. package/src/recording-controller/index.ts +315 -0
  429. package/src/recording-controller/util.ts +58 -0
  430. package/src/roap/index.ts +241 -0
  431. package/src/roap/request.ts +172 -0
  432. package/src/roap/turnDiscovery.ts +127 -53
  433. package/src/statsAnalyzer/global.ts +37 -0
  434. package/src/statsAnalyzer/index.ts +1273 -0
  435. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  436. package/src/transcription/{index.js → index.ts} +46 -39
  437. package/test/integration/spec/converged-space-meetings.js +177 -0
  438. package/test/integration/spec/journey.js +666 -464
  439. package/test/integration/spec/space-meeting.js +321 -206
  440. package/test/integration/spec/transcription.js +7 -8
  441. package/test/unit/spec/annotation/index.ts +435 -0
  442. package/test/unit/spec/breakouts/breakout.ts +184 -0
  443. package/test/unit/spec/breakouts/collection.ts +15 -0
  444. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  445. package/test/unit/spec/breakouts/events.ts +77 -0
  446. package/test/unit/spec/breakouts/index.ts +1504 -0
  447. package/test/unit/spec/breakouts/request.ts +104 -0
  448. package/test/unit/spec/breakouts/utils.js +72 -0
  449. package/test/unit/spec/common/browser-detection.js +9 -28
  450. package/test/unit/spec/controls-options-manager/index.js +287 -0
  451. package/test/unit/spec/controls-options-manager/util.js +403 -0
  452. package/test/unit/spec/fixture/locus.js +92 -90
  453. package/test/unit/spec/locus-info/controlsUtils.js +177 -32
  454. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  455. package/test/unit/spec/locus-info/index.js +493 -3
  456. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  457. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  458. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  459. package/test/unit/spec/locus-info/parser.js +3 -9
  460. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  461. package/test/unit/spec/locus-info/selfUtils.js +236 -12
  462. package/test/unit/spec/media/index.ts +303 -0
  463. package/test/unit/spec/media/properties.ts +73 -82
  464. package/test/unit/spec/meeting/in-meeting-actions.ts +58 -3
  465. package/test/unit/spec/meeting/index.js +3127 -975
  466. package/test/unit/spec/meeting/muteState.js +375 -70
  467. package/test/unit/spec/meeting/request.js +217 -43
  468. package/test/unit/spec/meeting/utils.js +205 -163
  469. package/test/unit/spec/meeting-info/meetinginfov2.js +268 -74
  470. package/test/unit/spec/meeting-info/request.js +7 -9
  471. package/test/unit/spec/meeting-info/util.js +11 -12
  472. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  473. package/test/unit/spec/meetings/collection.js +15 -1
  474. package/test/unit/spec/meetings/index.js +1052 -333
  475. package/test/unit/spec/meetings/utils.js +163 -14
  476. package/test/unit/spec/member/index.js +24 -1
  477. package/test/unit/spec/member/util.js +359 -32
  478. package/test/unit/spec/members/index.js +547 -37
  479. package/test/unit/spec/members/request.js +76 -20
  480. package/test/unit/spec/members/utils.js +191 -4
  481. package/test/unit/spec/metrics/index.js +46 -20
  482. package/test/unit/spec/multistream/mediaRequestManager.ts +1060 -0
  483. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  484. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  485. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  486. package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
  487. package/test/unit/spec/multistream/remoteMediaManager.ts +1793 -0
  488. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  489. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  490. package/test/unit/spec/reachability/index.ts +176 -27
  491. package/test/unit/spec/reachability/request.js +66 -0
  492. package/test/unit/spec/reconnection-manager/index.js +106 -9
  493. package/test/unit/spec/recording-controller/index.js +231 -0
  494. package/test/unit/spec/recording-controller/util.js +102 -0
  495. package/test/unit/spec/roap/index.ts +78 -45
  496. package/test/unit/spec/roap/request.ts +217 -0
  497. package/test/unit/spec/roap/turnDiscovery.ts +93 -49
  498. package/test/unit/spec/stats-analyzer/index.js +118 -65
  499. package/test/utils/cmr.js +44 -42
  500. package/test/utils/constants.js +9 -0
  501. package/test/utils/integrationTestUtils.js +64 -0
  502. package/test/utils/testUtils.js +63 -99
  503. package/test/utils/webex-config.js +22 -18
  504. package/test/utils/webex-test-users.js +57 -50
  505. package/tsconfig.json +6 -0
  506. package/dist/meeting/effectsState.js +0 -327
  507. package/dist/meeting/effectsState.js.map +0 -1
  508. package/dist/peer-connection-manager/index.js +0 -794
  509. package/dist/peer-connection-manager/index.js.map +0 -1
  510. package/dist/peer-connection-manager/util.js +0 -124
  511. package/dist/peer-connection-manager/util.js.map +0 -1
  512. package/dist/roap/collection.js +0 -73
  513. package/dist/roap/collection.js.map +0 -1
  514. package/dist/roap/handler.js +0 -337
  515. package/dist/roap/handler.js.map +0 -1
  516. package/dist/roap/state.js +0 -164
  517. package/dist/roap/state.js.map +0 -1
  518. package/dist/roap/util.js +0 -102
  519. package/dist/roap/util.js.map +0 -1
  520. package/src/common/logs/logger-proxy.js +0 -33
  521. package/src/index.js +0 -15
  522. package/src/locus-info/controlsUtils.js +0 -102
  523. package/src/media/index.js +0 -593
  524. package/src/media/util.js +0 -38
  525. package/src/mediaQualityMetrics/config.js +0 -382
  526. package/src/meeting/effectsState.js +0 -205
  527. package/src/meeting/muteState.js +0 -318
  528. package/src/meeting-info/meeting-info-v2.js +0 -255
  529. package/src/meetings/index.js +0 -986
  530. package/src/meetings/util.js +0 -176
  531. package/src/members/request.js +0 -131
  532. package/src/peer-connection-manager/index.js +0 -723
  533. package/src/peer-connection-manager/util.ts +0 -117
  534. package/src/roap/collection.js +0 -63
  535. package/src/roap/handler.js +0 -252
  536. package/src/roap/index.js +0 -380
  537. package/src/roap/request.js +0 -198
  538. package/src/roap/state.js +0 -149
  539. package/src/roap/util.js +0 -93
  540. package/src/statsAnalyzer/global.js +0 -131
  541. package/src/statsAnalyzer/index.js +0 -1020
  542. package/src/statsAnalyzer/mqaUtil.js +0 -173
  543. package/test/unit/spec/meeting/effectsState.js +0 -293
  544. package/test/unit/spec/peerconnection-manager/index.js +0 -188
  545. package/test/unit/spec/peerconnection-manager/utils.js +0 -48
  546. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  547. package/test/unit/spec/roap/util.js +0 -30
  548. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -0,0 +1,1137 @@
1
+ "use strict";
2
+
3
+ var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
5
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
+ _Object$defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.RemoteMediaManager = exports.Event = exports.DefaultConfiguration = void 0;
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
11
+ var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
12
+ var _values = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/values"));
13
+ var _entries = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/entries"));
14
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
15
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
16
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
17
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
18
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
19
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
20
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
21
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
22
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
23
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
24
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
25
+ var _remove2 = _interopRequireDefault(require("lodash/remove"));
26
+ var _forEach2 = _interopRequireDefault(require("lodash/forEach"));
27
+ var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
28
+ var _internalMediaCore = require("@webex/internal-media-core");
29
+ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
30
+ var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
31
+ var _remoteMedia = require("./remoteMedia");
32
+ var _remoteMediaGroup = require("./remoteMediaGroup");
33
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
34
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
35
+ /* Predefined layouts: */
36
+
37
+ // An "all equal" grid, with size up to 3 x 3 = 9:
38
+ var AllEqualLayout = {
39
+ activeSpeakerVideoPaneGroups: [{
40
+ id: 'main',
41
+ numPanes: 9,
42
+ size: 'best',
43
+ priority: 255
44
+ }]
45
+ };
46
+
47
+ // A layout with just a single remote active speaker video pane:
48
+ var SingleLayout = {
49
+ activeSpeakerVideoPaneGroups: [{
50
+ id: 'main',
51
+ numPanes: 1,
52
+ size: 'best',
53
+ priority: 255
54
+ }]
55
+ };
56
+
57
+ // A layout with 1 big pane for the highest priority active speaker and 5 small panes for other active speakers:
58
+ var OnePlusFiveLayout = {
59
+ activeSpeakerVideoPaneGroups: [{
60
+ id: 'mainBigOne',
61
+ numPanes: 1,
62
+ size: 'large',
63
+ priority: 255
64
+ }, {
65
+ id: 'secondarySetOfSmallPanes',
66
+ numPanes: 5,
67
+ size: 'very small',
68
+ priority: 254
69
+ }]
70
+ };
71
+
72
+ // A layout with 2 big panes for 2 main active speakers and a strip of 6 small panes for other active speakers:
73
+ var TwoMainPlusSixSmallLayout = {
74
+ activeSpeakerVideoPaneGroups: [{
75
+ id: 'mainGroupWith2BigPanes',
76
+ numPanes: 2,
77
+ size: 'large',
78
+ priority: 255
79
+ }, {
80
+ id: 'secondaryGroupOfSmallPanes',
81
+ numPanes: 6,
82
+ size: 'small',
83
+ priority: 254
84
+ }]
85
+ };
86
+
87
+ // A strip of 8 small video panes (thumbnails) displayed at the top of a remote screenshare:
88
+ var RemoteScreenShareWithSmallThumbnailsLayout = {
89
+ screenShareVideo: {
90
+ size: 'best'
91
+ },
92
+ activeSpeakerVideoPaneGroups: [{
93
+ id: 'thumbnails',
94
+ numPanes: 8,
95
+ size: 'thumbnail',
96
+ priority: 255
97
+ }]
98
+ };
99
+
100
+ // A staged layout with 4 pre-selected meeting participants in the main 2x2 grid and 6 small panes for other active speakers at the top:
101
+ var Stage2x2With6ThumbnailsLayout = {
102
+ activeSpeakerVideoPaneGroups: [{
103
+ id: 'thumbnails',
104
+ numPanes: 6,
105
+ size: 'thumbnail',
106
+ priority: 255
107
+ }],
108
+ memberVideoPanes: [{
109
+ id: 'stage-1',
110
+ size: 'medium',
111
+ csi: undefined
112
+ }, {
113
+ id: 'stage-2',
114
+ size: 'medium',
115
+ csi: undefined
116
+ }, {
117
+ id: 'stage-3',
118
+ size: 'medium',
119
+ csi: undefined
120
+ }, {
121
+ id: 'stage-4',
122
+ size: 'medium',
123
+ csi: undefined
124
+ }]
125
+ };
126
+
127
+ /**
128
+ * Default configuration:
129
+ * - uses 3 audio streams
130
+ * - prefers active speakers with live video (e.g. are not audio only or video muted) over active speakers without live video
131
+ * - has a few layouts defined, including 1 that contains remote screen share (ScreenShareView)
132
+ */
133
+ var DefaultConfiguration = {
134
+ audio: {
135
+ numOfActiveSpeakerStreams: 3,
136
+ numOfScreenShareStreams: 1
137
+ },
138
+ video: {
139
+ preferLiveVideo: true,
140
+ initialLayoutId: 'AllEqual',
141
+ layouts: {
142
+ AllEqual: AllEqualLayout,
143
+ OnePlusFive: OnePlusFiveLayout,
144
+ Single: SingleLayout,
145
+ Stage: Stage2x2With6ThumbnailsLayout,
146
+ ScreenShareView: RemoteScreenShareWithSmallThumbnailsLayout
147
+ }
148
+ }
149
+ };
150
+ exports.DefaultConfiguration = DefaultConfiguration;
151
+ var Event;
152
+ exports.Event = Event;
153
+ (function (Event) {
154
+ Event["AudioCreated"] = "AudioCreated";
155
+ Event["ScreenShareAudioCreated"] = "ScreenShareAudioCreated";
156
+ Event["VideoLayoutChanged"] = "VideoLayoutChanged";
157
+ })(Event || (exports.Event = Event = {}));
158
+ /**
159
+ * A helper class that manages all remote audio/video streams in order to achieve a predefined set of layouts.
160
+ * It also creates a fixed number of audio streams and these don't change during the meeting.
161
+ *
162
+ * Things that RemoteMediaManager does:
163
+ * - owns the receive slots (creates them when needed, and re-uses them when switching layouts)
164
+ * - constructs appropriate RemoteMedia and RemoteMediaGroup objects and sends appropriate mediaRequests
165
+ */
166
+ var RemoteMediaManager = /*#__PURE__*/function (_EventsScope) {
167
+ (0, _inherits2.default)(RemoteMediaManager, _EventsScope);
168
+ var _super = _createSuper(RemoteMediaManager);
169
+ /**
170
+ * Constructor
171
+ *
172
+ * @param {ReceiveSlotManager} receiveSlotManager
173
+ * @param {{audio: MediaRequestManager, video: mediaRequestManagers}} mediaRequestManagers
174
+ * @param {Configuration} config Configuration describing what video layouts to use during the meeting
175
+ */
176
+ function RemoteMediaManager(receiveSlotManager, mediaRequestManagers) {
177
+ var _this;
178
+ var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DefaultConfiguration;
179
+ (0, _classCallCheck2.default)(this, RemoteMediaManager);
180
+ _this = _super.call(this);
181
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "config", void 0);
182
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "started", void 0);
183
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "receiveSlotManager", void 0);
184
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mediaRequestManagers", void 0);
185
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "currentLayout", void 0);
186
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "slots", void 0);
187
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "media", void 0);
188
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "receiveSlotAllocations", void 0);
189
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "currentLayoutId", void 0);
190
+ _this.started = false;
191
+ _this.config = config;
192
+ _this.receiveSlotManager = receiveSlotManager;
193
+ _this.mediaRequestManagers = mediaRequestManagers;
194
+ _this.media = {
195
+ audio: undefined,
196
+ video: {
197
+ activeSpeakerGroups: {},
198
+ memberPanes: {}
199
+ },
200
+ screenShare: {
201
+ audio: undefined,
202
+ video: undefined
203
+ }
204
+ };
205
+ _this.checkConfigValidity();
206
+ _this.slots = {
207
+ audio: [],
208
+ screenShare: {
209
+ audio: [],
210
+ video: undefined
211
+ },
212
+ video: {
213
+ unused: [],
214
+ activeSpeaker: [],
215
+ receiverSelected: []
216
+ }
217
+ };
218
+ _this.receiveSlotAllocations = {
219
+ activeSpeaker: {},
220
+ receiverSelected: {}
221
+ };
222
+ _loggerProxy.default.logger.log("RemoteMediaManager#constructor --> RemoteMediaManager created with config: ".concat((0, _stringify.default)(_this.config)));
223
+ return _this;
224
+ }
225
+
226
+ /**
227
+ * Checks if configuration is valid, throws an error if it's not
228
+ */
229
+ (0, _createClass2.default)(RemoteMediaManager, [{
230
+ key: "checkConfigValidity",
231
+ value: function checkConfigValidity() {
232
+ if (!(this.config.video.initialLayoutId in this.config.video.layouts)) {
233
+ throw new Error("invalid config: initialLayoutId \"".concat(this.config.video.initialLayoutId, "\" doesn't match any of the layouts"));
234
+ }
235
+
236
+ // check if each layout is valid
237
+ (0, _values.default)(this.config.video.layouts).forEach(function (layout) {
238
+ var _layout$activeSpeaker, _layout$memberVideoPa;
239
+ var groupIds = {};
240
+ var paneIds = {};
241
+ var groupPriorites = {};
242
+ (_layout$activeSpeaker = layout.activeSpeakerVideoPaneGroups) === null || _layout$activeSpeaker === void 0 ? void 0 : _layout$activeSpeaker.forEach(function (group) {
243
+ if (groupIds[group.id]) {
244
+ throw new Error("invalid config: duplicate active speaker video pane group id: ".concat(group.id));
245
+ }
246
+ groupIds[group.id] = true;
247
+ if (groupPriorites[group.priority]) {
248
+ throw new Error("invalid config: multiple active speaker video pane groups have same priority: ".concat(group.priority));
249
+ }
250
+ groupPriorites[group.priority] = true;
251
+ });
252
+ (_layout$memberVideoPa = layout.memberVideoPanes) === null || _layout$memberVideoPa === void 0 ? void 0 : _layout$memberVideoPa.forEach(function (pane) {
253
+ if (paneIds[pane.id]) {
254
+ throw new Error("invalid config: duplicate member video pane id: ".concat(pane.id));
255
+ }
256
+ paneIds[pane.id] = true;
257
+ });
258
+ });
259
+ }
260
+
261
+ /**
262
+ * Starts the RemoteMediaManager.
263
+ *
264
+ * @returns {Promise}
265
+ */
266
+ }, {
267
+ key: "start",
268
+ value: function () {
269
+ var _start = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
270
+ return _regenerator.default.wrap(function _callee$(_context) {
271
+ while (1) switch (_context.prev = _context.next) {
272
+ case 0:
273
+ if (!this.started) {
274
+ _context.next = 2;
275
+ break;
276
+ }
277
+ throw new Error('start() failure: already started');
278
+ case 2:
279
+ this.started = true;
280
+ _context.next = 5;
281
+ return this.createAudioMedia();
282
+ case 5:
283
+ _context.next = 7;
284
+ return this.createScreenShareReceiveSlots();
285
+ case 7:
286
+ this.createScreenShareAudioMedia();
287
+ _context.next = 10;
288
+ return this.preallocateVideoReceiveSlots();
289
+ case 10:
290
+ _context.next = 12;
291
+ return this.setLayout(this.config.video.initialLayoutId);
292
+ case 12:
293
+ case "end":
294
+ return _context.stop();
295
+ }
296
+ }, _callee, this);
297
+ }));
298
+ function start() {
299
+ return _start.apply(this, arguments);
300
+ }
301
+ return start;
302
+ }()
303
+ /**
304
+ * Releases all the used resources (like allocated receive slots). This function needs
305
+ * to be called when we leave the meeting, etc.
306
+ */
307
+ }, {
308
+ key: "stop",
309
+ value: function stop() {
310
+ var _this2 = this,
311
+ _this$slots$video$unu,
312
+ _this$slots$video$unu2;
313
+ // invalidate all remoteMedia objects
314
+ this.invalidateCurrentRemoteMedia({
315
+ audio: true,
316
+ video: true,
317
+ screenShareAudio: true,
318
+ screenShareVideo: true,
319
+ commit: true
320
+ });
321
+
322
+ // release all audio receive slots
323
+ this.slots.audio.forEach(function (slot) {
324
+ return _this2.receiveSlotManager.releaseSlot(slot);
325
+ });
326
+ this.slots.audio.length = 0;
327
+
328
+ // release screen share slots
329
+ this.slots.screenShare.audio.forEach(function (slot) {
330
+ return _this2.receiveSlotManager.releaseSlot(slot);
331
+ });
332
+ this.slots.screenShare.audio.length = 0;
333
+ if (this.slots.screenShare.video) {
334
+ this.receiveSlotManager.releaseSlot(this.slots.screenShare.video);
335
+ this.slots.screenShare.video = undefined;
336
+ }
337
+
338
+ // release video slots
339
+ this.receiveSlotAllocations = {
340
+ activeSpeaker: {},
341
+ receiverSelected: {}
342
+ };
343
+ (_this$slots$video$unu = this.slots.video.unused).push.apply(_this$slots$video$unu, (0, _toConsumableArray2.default)(this.slots.video.activeSpeaker));
344
+ this.slots.video.activeSpeaker.length = 0;
345
+ (_this$slots$video$unu2 = this.slots.video.unused).push.apply(_this$slots$video$unu2, (0, _toConsumableArray2.default)(this.slots.video.receiverSelected));
346
+ this.slots.video.receiverSelected.length = 0;
347
+ this.releaseUnusedVideoSlots();
348
+ this.currentLayout = undefined;
349
+ this.currentLayoutId = undefined;
350
+ this.started = false;
351
+ }
352
+
353
+ /**
354
+ * Returns the total number of main video panes required for a given layout
355
+ *
356
+ * @param {VideoLayout} layout
357
+ * @returns {number}
358
+ */
359
+ }, {
360
+ key: "getRequiredNumVideoSlotsForLayout",
361
+ value: function getRequiredNumVideoSlotsForLayout(layout) {
362
+ var _layout$activeSpeaker2, _layout$memberVideoPa2;
363
+ if (!layout) {
364
+ return 0;
365
+ }
366
+ var activeSpeakerCount = ((_layout$activeSpeaker2 = layout.activeSpeakerVideoPaneGroups) === null || _layout$activeSpeaker2 === void 0 ? void 0 : _layout$activeSpeaker2.reduce(function (sum, paneGroup) {
367
+ return sum + paneGroup.numPanes;
368
+ }, 0)) || 0;
369
+ var receiverSelectedCount = ((_layout$memberVideoPa2 = layout.memberVideoPanes) === null || _layout$memberVideoPa2 === void 0 ? void 0 : _layout$memberVideoPa2.length) || 0;
370
+ return activeSpeakerCount + receiverSelectedCount;
371
+ }
372
+
373
+ /**
374
+ * Allocates the maximum number of panes that any of the configured layouts will require.
375
+ * We do this at the beginning, because it's more efficient (much faster) then allocating receive slots
376
+ * later, after the SDP exchange was done.
377
+ */
378
+ }, {
379
+ key: "preallocateVideoReceiveSlots",
380
+ value: function () {
381
+ var _preallocateVideoReceiveSlots = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
382
+ var _this3 = this;
383
+ var maxNumVideoPanesRequired;
384
+ return _regenerator.default.wrap(function _callee2$(_context2) {
385
+ while (1) switch (_context2.prev = _context2.next) {
386
+ case 0:
387
+ maxNumVideoPanesRequired = (0, _values.default)(this.config.video.layouts).reduce(function (maxValue, layout) {
388
+ return Math.max(maxValue, _this3.getRequiredNumVideoSlotsForLayout(layout));
389
+ }, 0);
390
+ case 1:
391
+ if (!(this.slots.video.unused.length < maxNumVideoPanesRequired)) {
392
+ _context2.next = 9;
393
+ break;
394
+ }
395
+ _context2.t0 = this.slots.video.unused;
396
+ _context2.next = 5;
397
+ return this.receiveSlotManager.allocateSlot(_internalMediaCore.MediaType.VideoMain);
398
+ case 5:
399
+ _context2.t1 = _context2.sent;
400
+ _context2.t0.push.call(_context2.t0, _context2.t1);
401
+ _context2.next = 1;
402
+ break;
403
+ case 9:
404
+ case "end":
405
+ return _context2.stop();
406
+ }
407
+ }, _callee2, this);
408
+ }));
409
+ function preallocateVideoReceiveSlots() {
410
+ return _preallocateVideoReceiveSlots.apply(this, arguments);
411
+ }
412
+ return preallocateVideoReceiveSlots;
413
+ }()
414
+ /**
415
+ * Changes the layout (triggers Event.VideoLayoutChanged)
416
+ *
417
+ * @param {LayoutId} layoutId new layout id
418
+ * @returns {Promise}
419
+ */
420
+ }, {
421
+ key: "setLayout",
422
+ value: function () {
423
+ var _setLayout = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(layoutId) {
424
+ return _regenerator.default.wrap(function _callee3$(_context3) {
425
+ while (1) switch (_context3.prev = _context3.next) {
426
+ case 0:
427
+ if (layoutId in this.config.video.layouts) {
428
+ _context3.next = 2;
429
+ break;
430
+ }
431
+ throw new Error("invalid layoutId: \"".concat(layoutId, "\" doesn't match any of the configured layouts"));
432
+ case 2:
433
+ if (this.started) {
434
+ _context3.next = 4;
435
+ break;
436
+ }
437
+ throw new Error('setLayout() called before start()');
438
+ case 4:
439
+ this.currentLayoutId = layoutId;
440
+ this.currentLayout = (0, _cloneDeep2.default)(this.config.video.layouts[this.currentLayoutId]);
441
+ _context3.next = 8;
442
+ return this.updateVideoReceiveSlots();
443
+ case 8:
444
+ this.updateVideoRemoteMediaObjects();
445
+ this.updateScreenShareVideoRemoteMediaObject();
446
+ this.emitVideoLayoutChangedEvent();
447
+ case 11:
448
+ case "end":
449
+ return _context3.stop();
450
+ }
451
+ }, _callee3, this);
452
+ }));
453
+ function setLayout(_x) {
454
+ return _setLayout.apply(this, arguments);
455
+ }
456
+ return setLayout;
457
+ }()
458
+ /**
459
+ * Returns the currently selected layout id
460
+ *
461
+ * @returns {LayoutId}
462
+ */
463
+ }, {
464
+ key: "getLayoutId",
465
+ value: function getLayoutId() {
466
+ return this.currentLayoutId;
467
+ }
468
+
469
+ /**
470
+ * Creates the audio slots
471
+ */
472
+ }, {
473
+ key: "createAudioMedia",
474
+ value: function () {
475
+ var _createAudioMedia = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() {
476
+ var i, slot;
477
+ return _regenerator.default.wrap(function _callee4$(_context4) {
478
+ while (1) switch (_context4.prev = _context4.next) {
479
+ case 0:
480
+ i = 0;
481
+ case 1:
482
+ if (!(i < this.config.audio.numOfActiveSpeakerStreams)) {
483
+ _context4.next = 9;
484
+ break;
485
+ }
486
+ _context4.next = 4;
487
+ return this.receiveSlotManager.allocateSlot(_internalMediaCore.MediaType.AudioMain);
488
+ case 4:
489
+ slot = _context4.sent;
490
+ this.slots.audio.push(slot);
491
+ case 6:
492
+ i += 1;
493
+ _context4.next = 1;
494
+ break;
495
+ case 9:
496
+ // create a remote media group
497
+ this.media.audio = new _remoteMediaGroup.RemoteMediaGroup(this.mediaRequestManagers.audio, this.slots.audio, 255, true);
498
+ this.emit({
499
+ file: 'multistream/remoteMediaManager',
500
+ function: 'createAudioMedia'
501
+ }, Event.AudioCreated, this.media.audio);
502
+ case 11:
503
+ case "end":
504
+ return _context4.stop();
505
+ }
506
+ }, _callee4, this);
507
+ }));
508
+ function createAudioMedia() {
509
+ return _createAudioMedia.apply(this, arguments);
510
+ }
511
+ return createAudioMedia;
512
+ }()
513
+ /**
514
+ * Creates receive slots required for receiving screen share audio and video
515
+ */
516
+ }, {
517
+ key: "createScreenShareReceiveSlots",
518
+ value: function () {
519
+ var _createScreenShareReceiveSlots = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
520
+ var i, slot, isAnyLayoutContainingScreenShareVideo;
521
+ return _regenerator.default.wrap(function _callee5$(_context5) {
522
+ while (1) switch (_context5.prev = _context5.next) {
523
+ case 0:
524
+ i = 0;
525
+ case 1:
526
+ if (!(i < this.config.audio.numOfScreenShareStreams)) {
527
+ _context5.next = 9;
528
+ break;
529
+ }
530
+ _context5.next = 4;
531
+ return this.receiveSlotManager.allocateSlot(_internalMediaCore.MediaType.AudioSlides);
532
+ case 4:
533
+ slot = _context5.sent;
534
+ this.slots.screenShare.audio.push(slot);
535
+ case 6:
536
+ i += 1;
537
+ _context5.next = 1;
538
+ break;
539
+ case 9:
540
+ // video
541
+ isAnyLayoutContainingScreenShareVideo = (0, _values.default)(this.config.video.layouts).some(function (layout) {
542
+ return !!layout.screenShareVideo;
543
+ });
544
+ if (!isAnyLayoutContainingScreenShareVideo) {
545
+ _context5.next = 14;
546
+ break;
547
+ }
548
+ _context5.next = 13;
549
+ return this.receiveSlotManager.allocateSlot(_internalMediaCore.MediaType.VideoSlides);
550
+ case 13:
551
+ this.slots.screenShare.video = _context5.sent;
552
+ case 14:
553
+ case "end":
554
+ return _context5.stop();
555
+ }
556
+ }, _callee5, this);
557
+ }));
558
+ function createScreenShareReceiveSlots() {
559
+ return _createScreenShareReceiveSlots.apply(this, arguments);
560
+ }
561
+ return createScreenShareReceiveSlots;
562
+ }()
563
+ /**
564
+ * Creates RemoteMedia objects for screen share
565
+ */
566
+ }, {
567
+ key: "createScreenShareAudioMedia",
568
+ value: function createScreenShareAudioMedia() {
569
+ if (this.slots.screenShare.audio.length > 0) {
570
+ this.media.screenShare.audio = new _remoteMediaGroup.RemoteMediaGroup(this.mediaRequestManagers.screenShareAudio, this.slots.screenShare.audio, 255, true);
571
+ this.emit({
572
+ file: 'multistream/remoteMediaManager',
573
+ function: 'createScreenShareAudioMedia'
574
+ }, Event.ScreenShareAudioCreated, this.media.screenShare.audio);
575
+ }
576
+ }
577
+
578
+ /**
579
+ * Goes over all receiver-selected slots and keeps only the ones that are required by a given layout,
580
+ * the rest are all moved to the "unused" list
581
+ */
582
+ }, {
583
+ key: "trimReceiverSelectedSlots",
584
+ value: function trimReceiverSelectedSlots() {
585
+ var _this$currentLayout, _this$currentLayout$m, _this$slots$video$unu3;
586
+ var requiredCsis = {};
587
+
588
+ // fill requiredCsis with all the CSIs that the given layout requires
589
+ (_this$currentLayout = this.currentLayout) === null || _this$currentLayout === void 0 ? void 0 : (_this$currentLayout$m = _this$currentLayout.memberVideoPanes) === null || _this$currentLayout$m === void 0 ? void 0 : _this$currentLayout$m.forEach(function (memberVideoPane) {
590
+ if (memberVideoPane.csi !== undefined) {
591
+ requiredCsis[memberVideoPane.csi] = true;
592
+ }
593
+ });
594
+ var isCsiNeededByCurrentLayout = function isCsiNeededByCurrentLayout(csi) {
595
+ if (csi === undefined) {
596
+ return false;
597
+ }
598
+ return !!requiredCsis[csi];
599
+ };
600
+
601
+ // keep receiverSelected slots that match our new requiredCsis, move the rest of receiverSelected slots to unused
602
+ var notNeededReceiverSelectedSlots = (0, _remove2.default)(this.slots.video.receiverSelected, function (slot) {
603
+ return isCsiNeededByCurrentLayout(slot.csi) === false;
604
+ });
605
+ (_this$slots$video$unu3 = this.slots.video.unused).push.apply(_this$slots$video$unu3, (0, _toConsumableArray2.default)(notNeededReceiverSelectedSlots));
606
+ }
607
+
608
+ /**
609
+ * Releases all the "unused" video slots.
610
+ */
611
+ }, {
612
+ key: "releaseUnusedVideoSlots",
613
+ value: function releaseUnusedVideoSlots() {
614
+ var _this4 = this;
615
+ this.slots.video.unused.forEach(function (slot) {
616
+ return _this4.receiveSlotManager.releaseSlot(slot);
617
+ });
618
+ this.slots.video.unused.length = 0;
619
+ }
620
+
621
+ /**
622
+ * Allocates receive slots to all active speaker video panes
623
+ * in the current selected layout.
624
+ *
625
+ * Allocation tries to keep the same order of the slots between the previous
626
+ * layout and the new one. Sorting helps making sure that highest priority slots
627
+ * go in the same order in the new layout.
628
+ */
629
+ }, {
630
+ key: "allocateSlotsToActiveSpeakerPaneGroups",
631
+ value: function allocateSlotsToActiveSpeakerPaneGroups() {
632
+ var _this$currentLayout2,
633
+ _this$currentLayout2$,
634
+ _this$currentLayout2$2,
635
+ _this5 = this;
636
+ (_this$currentLayout2 = this.currentLayout) === null || _this$currentLayout2 === void 0 ? void 0 : (_this$currentLayout2$ = _this$currentLayout2.activeSpeakerVideoPaneGroups
637
+ // sorting in descending order based on group priority
638
+ ) === null || _this$currentLayout2$ === void 0 ? void 0 : (_this$currentLayout2$2 = _this$currentLayout2$.sort(function (a, b) {
639
+ return a.priority < b.priority ? 1 : -1;
640
+ })) === null || _this$currentLayout2$2 === void 0 ? void 0 : _this$currentLayout2$2.forEach(function (group) {
641
+ _this5.receiveSlotAllocations.activeSpeaker[group.id] = {
642
+ slots: []
643
+ };
644
+ for (var paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {
645
+ // allocate a slot from the "unused" list, by grabbing in same order (shift) as previous layout
646
+ var freeSlot = _this5.slots.video.unused.shift();
647
+ if (freeSlot) {
648
+ _this5.slots.video.activeSpeaker.push(freeSlot);
649
+ _this5.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);
650
+ }
651
+ }
652
+ });
653
+ }
654
+
655
+ /**
656
+ * Allocates receive slots to all receiver selected video panes
657
+ * in the current selected layout
658
+ */
659
+ }, {
660
+ key: "allocateSlotsToReceiverSelectedVideoPaneGroups",
661
+ value: function allocateSlotsToReceiverSelectedVideoPaneGroups() {
662
+ var _this$currentLayout3,
663
+ _this$currentLayout3$,
664
+ _this6 = this;
665
+ (_this$currentLayout3 = this.currentLayout) === null || _this$currentLayout3 === void 0 ? void 0 : (_this$currentLayout3$ = _this$currentLayout3.memberVideoPanes) === null || _this$currentLayout3$ === void 0 ? void 0 : _this$currentLayout3$.forEach(function (memberPane) {
666
+ // check if there is existing slot for this csi
667
+ var existingSlot = _this6.slots.video.receiverSelected.find(function (slot) {
668
+ return slot.csi === memberPane.csi;
669
+ });
670
+ var isExistingSlotAlreadyAllocated = (0, _values.default)(_this6.receiveSlotAllocations.receiverSelected).includes(existingSlot);
671
+ if (memberPane.csi !== undefined && existingSlot && !isExistingSlotAlreadyAllocated) {
672
+ // found it, so use it
673
+ _this6.receiveSlotAllocations.receiverSelected[memberPane.id] = existingSlot;
674
+ } else {
675
+ // allocate a slot from the "unused" list
676
+ var freeSlot = _this6.slots.video.unused.pop();
677
+ if (freeSlot) {
678
+ _this6.slots.video.receiverSelected.push(freeSlot);
679
+ _this6.receiveSlotAllocations.receiverSelected[memberPane.id] = freeSlot;
680
+ }
681
+ }
682
+ });
683
+ }
684
+
685
+ /**
686
+ * Ensures that we have enough slots for the current layout.
687
+ */
688
+ }, {
689
+ key: "refillRequiredSlotsIfNeeded",
690
+ value: function () {
691
+ var _refillRequiredSlotsIfNeeded = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6() {
692
+ var requiredNumSlots, totalNumSlots, numSlotsToCreate;
693
+ return _regenerator.default.wrap(function _callee6$(_context6) {
694
+ while (1) switch (_context6.prev = _context6.next) {
695
+ case 0:
696
+ requiredNumSlots = this.getRequiredNumVideoSlotsForLayout(this.currentLayout);
697
+ totalNumSlots = this.slots.video.unused.length + this.slots.video.activeSpeaker.length + this.slots.video.receiverSelected.length;
698
+ if (!(totalNumSlots < requiredNumSlots)) {
699
+ _context6.next = 13;
700
+ break;
701
+ }
702
+ numSlotsToCreate = requiredNumSlots - totalNumSlots;
703
+ case 4:
704
+ if (!(numSlotsToCreate > 0)) {
705
+ _context6.next = 13;
706
+ break;
707
+ }
708
+ _context6.t0 = this.slots.video.unused;
709
+ _context6.next = 8;
710
+ return this.receiveSlotManager.allocateSlot(_internalMediaCore.MediaType.VideoMain);
711
+ case 8:
712
+ _context6.t1 = _context6.sent;
713
+ _context6.t0.push.call(_context6.t0, _context6.t1);
714
+ numSlotsToCreate -= 1;
715
+ _context6.next = 4;
716
+ break;
717
+ case 13:
718
+ case "end":
719
+ return _context6.stop();
720
+ }
721
+ }, _callee6, this);
722
+ }));
723
+ function refillRequiredSlotsIfNeeded() {
724
+ return _refillRequiredSlotsIfNeeded.apply(this, arguments);
725
+ }
726
+ return refillRequiredSlotsIfNeeded;
727
+ }()
728
+ /**
729
+ * Move all active speaker slots to "unused"
730
+ */
731
+ }, {
732
+ key: "trimActiveSpeakerSlots",
733
+ value: function trimActiveSpeakerSlots() {
734
+ var _this$slots$video$unu4;
735
+ (_this$slots$video$unu4 = this.slots.video.unused).push.apply(_this$slots$video$unu4, (0, _toConsumableArray2.default)(this.slots.video.activeSpeaker));
736
+ this.slots.video.activeSpeaker.length = 0;
737
+ }
738
+
739
+ /**
740
+ * Logs the state of the receive slots
741
+ */
742
+ }, {
743
+ key: "logReceieveSlots",
744
+ value: function logReceieveSlots() {
745
+ var logMessage = '';
746
+ (0, _forEach2.default)(this.receiveSlotAllocations.activeSpeaker, function (group, groupName) {
747
+ logMessage += "group: ".concat(groupName, "\n").concat(group.slots.map(function (slot) {
748
+ return slot.logString;
749
+ }).join(' '));
750
+ });
751
+ logMessage += '\nreceiverSelected:\n';
752
+ (0, _forEach2.default)(this.receiveSlotAllocations.receiverSelected, function (slot, key) {
753
+ logMessage += " ".concat(key, ": ").concat(slot.logString, "\n");
754
+ });
755
+ _loggerProxy.default.logger.log("RemoteMediaManager#updateVideoReceiveSlots --> receive slots updated: unused=".concat(this.slots.video.unused.length, ", activeSpeaker=").concat(this.slots.video.activeSpeaker.length, ", receiverSelected=").concat(this.slots.video.receiverSelected.length, "\n").concat(logMessage));
756
+ }
757
+
758
+ /**
759
+ * Makes sure we have the right number of receive slots created for the current layout
760
+ * and allocates them to the right video panes / pane groups
761
+ *
762
+ * @returns {Promise}
763
+ */
764
+ }, {
765
+ key: "updateVideoReceiveSlots",
766
+ value: function () {
767
+ var _updateVideoReceiveSlots = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7() {
768
+ return _regenerator.default.wrap(function _callee7$(_context7) {
769
+ while (1) switch (_context7.prev = _context7.next) {
770
+ case 0:
771
+ // move all active speaker slots to "unused"
772
+ this.trimActiveSpeakerSlots();
773
+
774
+ // move all no longer needed receiver-selected slots to "unused"
775
+ this.trimReceiverSelectedSlots();
776
+
777
+ // ensure we have enough total slots for current layout
778
+ _context7.next = 4;
779
+ return this.refillRequiredSlotsIfNeeded();
780
+ case 4:
781
+ // allocate the slots to the right panes / pane groups
782
+ // reset allocations
783
+ this.receiveSlotAllocations = {
784
+ activeSpeaker: {},
785
+ receiverSelected: {}
786
+ };
787
+ // allocate active speaker
788
+ this.allocateSlotsToActiveSpeakerPaneGroups();
789
+ // allocate receiver selected
790
+ this.allocateSlotsToReceiverSelectedVideoPaneGroups();
791
+ this.logReceieveSlots();
792
+
793
+ // If this is the initial layout, there may be some "unused" slots left because of the preallocation
794
+ // done in this.preallocateVideoReceiveSlots(), so release them now
795
+ this.releaseUnusedVideoSlots();
796
+ case 9:
797
+ case "end":
798
+ return _context7.stop();
799
+ }
800
+ }, _callee7, this);
801
+ }));
802
+ function updateVideoReceiveSlots() {
803
+ return _updateVideoReceiveSlots.apply(this, arguments);
804
+ }
805
+ return updateVideoReceiveSlots;
806
+ }()
807
+ /**
808
+ * Creates new RemoteMedia and RemoteMediaGroup objects for the current layout
809
+ * and sends the media requests for all of them.
810
+ */
811
+ }, {
812
+ key: "updateVideoRemoteMediaObjects",
813
+ value: function updateVideoRemoteMediaObjects() {
814
+ var _this7 = this;
815
+ // invalidate all the previous remote media objects and cancel their media requests
816
+ this.invalidateCurrentRemoteMedia({
817
+ audio: false,
818
+ video: true,
819
+ screenShareAudio: false,
820
+ screenShareVideo: false,
821
+ commit: false
822
+ });
823
+
824
+ // create new remoteMediaGroup objects
825
+ this.media.video.activeSpeakerGroups = {};
826
+ this.media.video.memberPanes = {};
827
+ var _loop = function _loop() {
828
+ var _this7$currentLayout, _this7$currentLayout$;
829
+ var _Object$entries$_i = (0, _slicedToArray2.default)(_Object$entries[_i], 2),
830
+ groupId = _Object$entries$_i[0],
831
+ group = _Object$entries$_i[1];
832
+ var paneGroupInCurrentLayout = (_this7$currentLayout = _this7.currentLayout) === null || _this7$currentLayout === void 0 ? void 0 : (_this7$currentLayout$ = _this7$currentLayout.activeSpeakerVideoPaneGroups) === null || _this7$currentLayout$ === void 0 ? void 0 : _this7$currentLayout$.find(function (groupInLayout) {
833
+ return groupInLayout.id === groupId;
834
+ });
835
+ if (paneGroupInCurrentLayout) {
836
+ var mediaGroup = new _remoteMediaGroup.RemoteMediaGroup(_this7.mediaRequestManagers.video, group.slots, paneGroupInCurrentLayout.priority, false, {
837
+ preferLiveVideo: _this7.config.video.preferLiveVideo,
838
+ resolution: paneGroupInCurrentLayout.size
839
+ });
840
+ _this7.media.video.activeSpeakerGroups[groupId] = mediaGroup;
841
+ } else {
842
+ // this should never happen, because this.receiveSlotAllocations are created based on current layout configuration
843
+ _loggerProxy.default.logger.warn("a group id ".concat(groupId, " from this.receiveSlotAllocations.activeSpeaker cannot be found in the current layout configuration"));
844
+ }
845
+ };
846
+ for (var _i = 0, _Object$entries = (0, _entries.default)(this.receiveSlotAllocations.activeSpeaker); _i < _Object$entries.length; _i++) {
847
+ _loop();
848
+ }
849
+
850
+ // create new remoteMedia objects
851
+ var _loop2 = function _loop2() {
852
+ var _this7$currentLayout2, _this7$currentLayout3;
853
+ var _Object$entries3$_i = (0, _slicedToArray2.default)(_Object$entries3[_i2], 2),
854
+ paneId = _Object$entries3$_i[0],
855
+ slot = _Object$entries3$_i[1];
856
+ var paneInCurrentLayout = (_this7$currentLayout2 = _this7.currentLayout) === null || _this7$currentLayout2 === void 0 ? void 0 : (_this7$currentLayout3 = _this7$currentLayout2.memberVideoPanes) === null || _this7$currentLayout3 === void 0 ? void 0 : _this7$currentLayout3.find(function (paneInLayout) {
857
+ return paneInLayout.id === paneId;
858
+ });
859
+ if (paneInCurrentLayout) {
860
+ var remoteMedia = new _remoteMedia.RemoteMedia(slot, _this7.mediaRequestManagers.video, {
861
+ resolution: paneInCurrentLayout.size
862
+ });
863
+ if (paneInCurrentLayout.csi) {
864
+ remoteMedia.sendMediaRequest(paneInCurrentLayout.csi, false);
865
+ }
866
+ _this7.media.video.memberPanes[paneId] = remoteMedia;
867
+ } else {
868
+ // this should never happen, because this.receiveSlotAllocations are created based on current layout configuration
869
+ _loggerProxy.default.logger.warn("a pane id ".concat(paneId, " from this.receiveSlotAllocations.receiverSelected cannot be found in the current layout configuration"));
870
+ }
871
+ };
872
+ for (var _i2 = 0, _Object$entries3 = (0, _entries.default)(this.receiveSlotAllocations.receiverSelected); _i2 < _Object$entries3.length; _i2++) {
873
+ _loop2();
874
+ }
875
+ this.mediaRequestManagers.video.commit();
876
+ }
877
+
878
+ /**
879
+ * Checks if current layout requires a screen share.
880
+ * If it does, it creates new RemoteMediaGroup object for screen share
881
+ * and sends the media requests for it.
882
+ * If it doesn't, it makes sure we clean up any RemoteMediaGroup objects
883
+ * created earlier for screen share (for previous layout).
884
+ */
885
+ }, {
886
+ key: "updateScreenShareVideoRemoteMediaObject",
887
+ value: function updateScreenShareVideoRemoteMediaObject() {
888
+ var _this$currentLayout4;
889
+ this.invalidateCurrentRemoteMedia({
890
+ audio: false,
891
+ video: false,
892
+ screenShareAudio: false,
893
+ screenShareVideo: true,
894
+ commit: false
895
+ });
896
+ this.media.screenShare.video = undefined;
897
+ if ((_this$currentLayout4 = this.currentLayout) !== null && _this$currentLayout4 !== void 0 && _this$currentLayout4.screenShareVideo) {
898
+ // we create a group of 1, because for screen share we need to use the "active speaker" policy
899
+ this.media.screenShare.video = new _remoteMediaGroup.RemoteMediaGroup(this.mediaRequestManagers.screenShareVideo, [this.slots.screenShare.video], 255, false, {
900
+ resolution: this.currentLayout.screenShareVideo.size
901
+ });
902
+ }
903
+ this.mediaRequestManagers.screenShareVideo.commit();
904
+ }
905
+
906
+ /**
907
+ * Invalidates all remote media objects belonging to currently selected layout
908
+ */
909
+ }, {
910
+ key: "invalidateCurrentRemoteMedia",
911
+ value: function invalidateCurrentRemoteMedia(options) {
912
+ var audio = options.audio,
913
+ video = options.video,
914
+ screenShareAudio = options.screenShareAudio,
915
+ screenShareVideo = options.screenShareVideo,
916
+ commit = options.commit;
917
+ if (audio && this.media.audio) {
918
+ this.media.audio.stop(commit);
919
+ }
920
+ if (video) {
921
+ (0, _values.default)(this.media.video.activeSpeakerGroups).forEach(function (remoteMediaGroup) {
922
+ remoteMediaGroup.stop(false);
923
+ });
924
+ (0, _values.default)(this.media.video.memberPanes).forEach(function (remoteMedia) {
925
+ remoteMedia.stop(false);
926
+ });
927
+ if (commit) {
928
+ this.mediaRequestManagers.video.commit();
929
+ }
930
+ }
931
+ if (screenShareAudio && this.media.screenShare.audio) {
932
+ this.media.screenShare.audio.stop(commit);
933
+ }
934
+ if (screenShareVideo && this.media.screenShare.video) {
935
+ this.media.screenShare.video.stop(commit);
936
+ }
937
+ }
938
+
939
+ /** emits Event.VideoLayoutChanged */
940
+ }, {
941
+ key: "emitVideoLayoutChangedEvent",
942
+ value: function emitVideoLayoutChangedEvent() {
943
+ var _this$media$screenSha;
944
+ // todo: at this point the receive slots might still be showing a participant from previous layout, we should
945
+ // wait for our media requests to be fulfilled, but there is no API for that right now (we could wait for source updates
946
+ // but in some cases they might never come, or would need to always make sure to use a new set of receiver slots)
947
+ // for now it's fine to have it like this, we will re-evaluate if it needs improving after more testing
948
+
949
+ this.emit({
950
+ file: 'multistream/remoteMediaManager',
951
+ function: 'emitVideoLayoutChangedEvent'
952
+ }, Event.VideoLayoutChanged, {
953
+ layoutId: this.currentLayoutId,
954
+ activeSpeakerVideoPanes: this.media.video.activeSpeakerGroups,
955
+ memberVideoPanes: this.media.video.memberPanes,
956
+ screenShareVideo: (_this$media$screenSha = this.media.screenShare.video) === null || _this$media$screenSha === void 0 ? void 0 : _this$media$screenSha.getRemoteMedia()[0]
957
+ });
958
+ }
959
+
960
+ /**
961
+ * Sets a new CSI on a given remote media object
962
+ *
963
+ * @param {RemoteMedia} remoteMedia remote Media object to modify
964
+ * @param {CSI} csi new CSI value, can be null if we want to stop receiving media
965
+ */
966
+ }, {
967
+ key: "setRemoteVideoCsi",
968
+ value: function setRemoteVideoCsi(remoteMedia, csi) {
969
+ if (!(0, _values.default)(this.media.video.memberPanes).includes(remoteMedia)) {
970
+ throw new Error('remoteMedia not found');
971
+ }
972
+ if (csi) {
973
+ remoteMedia.sendMediaRequest(csi, true);
974
+ } else {
975
+ remoteMedia.cancelMediaRequest(true);
976
+ }
977
+ }
978
+
979
+ /**
980
+ * Adds a new member video pane to the currently selected layout.
981
+ *
982
+ * Changes to the layout are lost after a layout change.
983
+ *
984
+ * @param {MemberVideoPane} newPane
985
+ * @returns {Promise<RemoteMedia>}
986
+ */
987
+ }, {
988
+ key: "addMemberVideoPane",
989
+ value: function () {
990
+ var _addMemberVideoPane = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(newPane) {
991
+ var _this$currentLayout5;
992
+ var receiveSlot, remoteMedia;
993
+ return _regenerator.default.wrap(function _callee8$(_context8) {
994
+ while (1) switch (_context8.prev = _context8.next) {
995
+ case 0:
996
+ if (this.currentLayout) {
997
+ _context8.next = 2;
998
+ break;
999
+ }
1000
+ throw new Error('There is no current layout selected, call start() first');
1001
+ case 2:
1002
+ if (!((_this$currentLayout5 = this.currentLayout) !== null && _this$currentLayout5 !== void 0 && _this$currentLayout5.memberVideoPanes)) {
1003
+ this.currentLayout.memberVideoPanes = [];
1004
+ }
1005
+ if (!(newPane.id in this.currentLayout.memberVideoPanes)) {
1006
+ _context8.next = 5;
1007
+ break;
1008
+ }
1009
+ throw new Error("duplicate pane id ".concat(newPane.id, " - this pane already exists in current layout's memberVideoPanes"));
1010
+ case 5:
1011
+ this.currentLayout.memberVideoPanes.push(newPane);
1012
+ _context8.next = 8;
1013
+ return this.receiveSlotManager.allocateSlot(_internalMediaCore.MediaType.VideoMain);
1014
+ case 8:
1015
+ receiveSlot = _context8.sent;
1016
+ this.slots.video.receiverSelected.push(receiveSlot);
1017
+ remoteMedia = new _remoteMedia.RemoteMedia(receiveSlot, this.mediaRequestManagers.video, {
1018
+ resolution: newPane.size
1019
+ });
1020
+ if (newPane.csi) {
1021
+ remoteMedia.sendMediaRequest(newPane.csi, true);
1022
+ }
1023
+ this.media.video.memberPanes[newPane.id] = remoteMedia;
1024
+ return _context8.abrupt("return", remoteMedia);
1025
+ case 14:
1026
+ case "end":
1027
+ return _context8.stop();
1028
+ }
1029
+ }, _callee8, this);
1030
+ }));
1031
+ function addMemberVideoPane(_x2) {
1032
+ return _addMemberVideoPane.apply(this, arguments);
1033
+ }
1034
+ return addMemberVideoPane;
1035
+ }()
1036
+ /**
1037
+ * Removes a member video pane from the currently selected layout.
1038
+ *
1039
+ * Changes to the layout are lost after a layout change.
1040
+ *
1041
+ * @param {PaneId} paneId pane id of the pane to remove
1042
+ * @returns {Promise<void>}
1043
+ */
1044
+ }, {
1045
+ key: "removeMemberVideoPane",
1046
+ value: function removeMemberVideoPane(paneId) {
1047
+ var _this$currentLayout$m2, _this$currentLayout$m3;
1048
+ if (!this.currentLayout) {
1049
+ return _promise.default.reject(new Error('There is no current layout selected, call start() first'));
1050
+ }
1051
+ if (!((_this$currentLayout$m2 = this.currentLayout.memberVideoPanes) !== null && _this$currentLayout$m2 !== void 0 && _this$currentLayout$m2.find(function (pane) {
1052
+ return pane.id === paneId;
1053
+ }))) {
1054
+ // pane id doesn't exist, so nothing to do
1055
+ _loggerProxy.default.logger.log("RemoteMediaManager#removeMemberVideoPane --> removeMemberVideoPane() called for a non-existent paneId: ".concat(paneId, " (pane not found in currentLayout.memberVideoPanes)"));
1056
+ return _promise.default.resolve();
1057
+ }
1058
+ if (!this.media.video.memberPanes[paneId]) {
1059
+ // pane id doesn't exist, so nothing to do
1060
+ _loggerProxy.default.logger.log("RemoteMediaManager#removeMemberVideoPane --> removeMemberVideoPane() called for a non-existent paneId: ".concat(paneId, " (pane not found in this.media.video.memberPanes)"));
1061
+ return _promise.default.resolve();
1062
+ }
1063
+ var remoteMedia = this.media.video.memberPanes[paneId];
1064
+ var receiveSlot = remoteMedia.getUnderlyingReceiveSlot();
1065
+ if (receiveSlot) {
1066
+ this.receiveSlotManager.releaseSlot(receiveSlot);
1067
+ var index = this.slots.video.receiverSelected.indexOf(receiveSlot);
1068
+ if (index >= 0) {
1069
+ this.slots.video.receiverSelected.splice(index, 1);
1070
+ }
1071
+ }
1072
+ remoteMedia.stop();
1073
+ delete this.media.video.memberPanes[paneId];
1074
+ (_this$currentLayout$m3 = this.currentLayout.memberVideoPanes) === null || _this$currentLayout$m3 === void 0 ? true : delete _this$currentLayout$m3[paneId];
1075
+ return _promise.default.resolve();
1076
+ }
1077
+
1078
+ /**
1079
+ * Pins an active speaker remote media object to the given CSI value. From that moment
1080
+ * onwards the remote media will only play audio/video from that specific CSI until
1081
+ * unpinActiveSpeakerVideoPane() is called or current layout is changed.
1082
+ *
1083
+ * @param {RemoteMedia} remoteMedia remote media object reference
1084
+ * @param {CSI} csi CSI value to pin to, if undefined, then current CSI value is used
1085
+ */
1086
+ }, {
1087
+ key: "pinActiveSpeakerVideoPane",
1088
+ value: function pinActiveSpeakerVideoPane(remoteMedia, csi) {
1089
+ var remoteMediaGroup = (0, _values.default)(this.media.video.activeSpeakerGroups).find(function (group) {
1090
+ return group.includes(remoteMedia, 'unpinned');
1091
+ });
1092
+ if (!remoteMediaGroup) {
1093
+ throw new Error('remoteMedia not found among the unpinned remote media from any active speaker group');
1094
+ }
1095
+ remoteMediaGroup.pin(remoteMedia, csi);
1096
+ }
1097
+
1098
+ /**
1099
+ * Unpins a remote media object from the fixed CSI value it was pinned to.
1100
+ *
1101
+ * @param {RemoteMedia} remoteMedia remote media object reference
1102
+ */
1103
+ }, {
1104
+ key: "unpinActiveSpeakerVideoPane",
1105
+ value: function unpinActiveSpeakerVideoPane(remoteMedia) {
1106
+ var remoteMediaGroup = (0, _values.default)(this.media.video.activeSpeakerGroups).find(function (group) {
1107
+ return group.includes(remoteMedia, 'pinned');
1108
+ });
1109
+ if (!remoteMediaGroup) {
1110
+ throw new Error('remoteMedia not found among the pinned remote media from any active speaker group');
1111
+ }
1112
+ remoteMediaGroup.unpin(remoteMedia);
1113
+ }
1114
+
1115
+ /**
1116
+ * Returns true if a given remote media object belongs to an active speaker group and has been pinned.
1117
+ * Throws an error if the remote media object doesn't belong to any active speaker remote media group.
1118
+ *
1119
+ * @param {RemoteMedia} remoteMedia remote media object
1120
+ * @returns {boolean}
1121
+ */
1122
+ }, {
1123
+ key: "isPinned",
1124
+ value: function isPinned(remoteMedia) {
1125
+ var remoteMediaGroup = (0, _values.default)(this.media.video.activeSpeakerGroups).find(function (group) {
1126
+ return group.includes(remoteMedia);
1127
+ });
1128
+ if (!remoteMediaGroup) {
1129
+ throw new Error('remoteMedia not found among any remote media (pinned or unpinned) from any active speaker group');
1130
+ }
1131
+ return remoteMediaGroup.isPinned(remoteMedia);
1132
+ }
1133
+ }]);
1134
+ return RemoteMediaManager;
1135
+ }(_eventsScope.default);
1136
+ exports.RemoteMediaManager = RemoteMediaManager;
1137
+ //# sourceMappingURL=remoteMediaManager.js.map