@webex/plugin-meetings 3.8.1 → 3.9.0-multiple-llm.2

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 (319) hide show
  1. package/README.md +26 -13
  2. package/dist/breakouts/breakout.js +1 -1
  3. package/dist/breakouts/index.js +1 -1
  4. package/dist/constants.js +34 -3
  5. package/dist/constants.js.map +1 -1
  6. package/dist/controls-options-manager/enums.js +1 -0
  7. package/dist/controls-options-manager/enums.js.map +1 -1
  8. package/dist/controls-options-manager/types.js.map +1 -1
  9. package/dist/controls-options-manager/util.js +26 -0
  10. package/dist/controls-options-manager/util.js.map +1 -1
  11. package/dist/interpretation/index.js +1 -1
  12. package/dist/interpretation/siLanguage.js +1 -1
  13. package/dist/locus-info/controlsUtils.js +11 -3
  14. package/dist/locus-info/controlsUtils.js.map +1 -1
  15. package/dist/locus-info/index.js +107 -95
  16. package/dist/locus-info/index.js.map +1 -1
  17. package/dist/locus-info/parser.js +4 -1
  18. package/dist/locus-info/parser.js.map +1 -1
  19. package/dist/media/index.js +2 -2
  20. package/dist/media/index.js.map +1 -1
  21. package/dist/media/properties.js +53 -5
  22. package/dist/media/properties.js.map +1 -1
  23. package/dist/meeting/brbState.js +17 -14
  24. package/dist/meeting/brbState.js.map +1 -1
  25. package/dist/meeting/in-meeting-actions.js +13 -1
  26. package/dist/meeting/in-meeting-actions.js.map +1 -1
  27. package/dist/meeting/index.js +555 -296
  28. package/dist/meeting/index.js.map +1 -1
  29. package/dist/meeting/muteState.js +2 -5
  30. package/dist/meeting/muteState.js.map +1 -1
  31. package/dist/meeting/request.js +44 -0
  32. package/dist/meeting/request.js.map +1 -1
  33. package/dist/meeting/request.type.js.map +1 -1
  34. package/dist/{rtcMetrics/constants.js → meeting/type.js} +1 -5
  35. package/dist/meeting/type.js.map +1 -0
  36. package/dist/meeting/util.js +98 -13
  37. package/dist/meeting/util.js.map +1 -1
  38. package/dist/meeting-info/meeting-info-v2.js +29 -21
  39. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  40. package/dist/meetings/index.js +18 -10
  41. package/dist/meetings/index.js.map +1 -1
  42. package/dist/member/types.js.map +1 -1
  43. package/dist/members/collection.js +13 -0
  44. package/dist/members/collection.js.map +1 -1
  45. package/dist/members/index.js +53 -29
  46. package/dist/members/index.js.map +1 -1
  47. package/dist/members/request.js +3 -3
  48. package/dist/members/request.js.map +1 -1
  49. package/dist/members/util.js +25 -8
  50. package/dist/members/util.js.map +1 -1
  51. package/dist/metrics/constants.js +3 -1
  52. package/dist/metrics/constants.js.map +1 -1
  53. package/dist/multistream/mediaRequestManager.js +1 -1
  54. package/dist/multistream/mediaRequestManager.js.map +1 -1
  55. package/dist/multistream/remoteMedia.js +34 -5
  56. package/dist/multistream/remoteMedia.js.map +1 -1
  57. package/dist/multistream/remoteMediaGroup.js +42 -2
  58. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  59. package/dist/multistream/sendSlotManager.js +32 -2
  60. package/dist/multistream/sendSlotManager.js.map +1 -1
  61. package/dist/reachability/index.js +8 -13
  62. package/dist/reachability/index.js.map +1 -1
  63. package/dist/types/constants.d.ts +30 -0
  64. package/dist/types/controls-options-manager/enums.d.ts +2 -1
  65. package/dist/types/controls-options-manager/types.d.ts +4 -1
  66. package/dist/types/locus-info/index.d.ts +54 -10
  67. package/dist/types/media/properties.d.ts +21 -0
  68. package/dist/types/meeting/brbState.d.ts +0 -1
  69. package/dist/types/meeting/in-meeting-actions.d.ts +12 -0
  70. package/dist/types/meeting/index.d.ts +58 -20
  71. package/dist/types/meeting/request.d.ts +18 -1
  72. package/dist/types/meeting/request.type.d.ts +74 -0
  73. package/dist/types/meeting/type.d.ts +9 -0
  74. package/dist/types/meeting/util.d.ts +13 -3
  75. package/dist/types/meeting-info/meeting-info-v2.d.ts +6 -3
  76. package/dist/types/meetings/index.d.ts +3 -1
  77. package/dist/types/member/types.d.ts +1 -0
  78. package/dist/types/members/collection.d.ts +6 -0
  79. package/dist/types/members/index.d.ts +22 -9
  80. package/dist/types/members/request.d.ts +1 -1
  81. package/dist/types/members/util.d.ts +13 -6
  82. package/dist/types/metrics/constants.d.ts +2 -0
  83. package/dist/types/multistream/remoteMedia.d.ts +20 -1
  84. package/dist/types/multistream/remoteMediaGroup.d.ts +11 -0
  85. package/dist/types/multistream/sendSlotManager.d.ts +16 -0
  86. package/dist/types/reachability/index.d.ts +2 -2
  87. package/dist/webinar/index.js +1 -1
  88. package/package.json +25 -26
  89. package/src/constants.ts +34 -2
  90. package/src/controls-options-manager/enums.ts +1 -0
  91. package/src/controls-options-manager/types.ts +6 -1
  92. package/src/controls-options-manager/util.ts +31 -0
  93. package/src/locus-info/controlsUtils.ts +15 -0
  94. package/src/locus-info/index.ts +174 -96
  95. package/src/locus-info/parser.ts +5 -1
  96. package/src/media/index.ts +2 -2
  97. package/src/media/properties.ts +43 -0
  98. package/src/meeting/brbState.ts +13 -9
  99. package/src/meeting/in-meeting-actions.ts +25 -0
  100. package/src/meeting/index.ts +362 -75
  101. package/src/meeting/muteState.ts +2 -6
  102. package/src/meeting/request.ts +39 -0
  103. package/src/meeting/request.type.ts +64 -0
  104. package/src/meeting/type.ts +9 -0
  105. package/src/meeting/util.ts +114 -22
  106. package/src/meeting-info/meeting-info-v2.ts +24 -5
  107. package/src/meetings/index.ts +12 -5
  108. package/src/member/types.ts +1 -0
  109. package/src/members/collection.ts +11 -0
  110. package/src/members/index.ts +51 -15
  111. package/src/members/request.ts +2 -2
  112. package/src/members/util.ts +34 -6
  113. package/src/metrics/constants.ts +2 -0
  114. package/src/multistream/mediaRequestManager.ts +7 -7
  115. package/src/multistream/remoteMedia.ts +34 -4
  116. package/src/multistream/remoteMediaGroup.ts +37 -2
  117. package/src/multistream/sendSlotManager.ts +34 -2
  118. package/src/reachability/index.ts +8 -16
  119. package/test/unit/spec/common/browser-detection.js +0 -24
  120. package/test/unit/spec/controls-options-manager/util.js +58 -0
  121. package/test/unit/spec/locus-info/controlsUtils.js +52 -0
  122. package/test/unit/spec/locus-info/index.js +270 -97
  123. package/test/unit/spec/locus-info/parser.js +3 -2
  124. package/test/unit/spec/media/index.ts +107 -0
  125. package/test/unit/spec/media/properties.ts +137 -0
  126. package/test/unit/spec/meeting/brbState.ts +23 -4
  127. package/test/unit/spec/meeting/in-meeting-actions.ts +12 -0
  128. package/test/unit/spec/meeting/index.js +1194 -97
  129. package/test/unit/spec/meeting/muteState.js +32 -6
  130. package/test/unit/spec/meeting/request.js +92 -0
  131. package/test/unit/spec/meeting/utils.js +167 -17
  132. package/test/unit/spec/meeting-info/meetinginfov2.js +8 -3
  133. package/test/unit/spec/meetings/index.js +12 -5
  134. package/test/unit/spec/members/collection.js +120 -0
  135. package/test/unit/spec/members/index.js +140 -12
  136. package/test/unit/spec/members/request.js +57 -2
  137. package/test/unit/spec/members/utils.js +139 -17
  138. package/test/unit/spec/multistream/mediaRequestManager.ts +19 -6
  139. package/test/unit/spec/multistream/remoteMedia.ts +66 -2
  140. package/test/unit/spec/multistream/sendSlotManager.ts +59 -0
  141. package/test/unit/spec/reachability/index.ts +160 -9
  142. package/test/unit/spec/roap/turnDiscovery.ts +3 -3
  143. package/dist/annotation/annotation.types.d.ts +0 -42
  144. package/dist/annotation/constants.d.ts +0 -31
  145. package/dist/annotation/index.d.ts +0 -117
  146. package/dist/breakouts/breakout.d.ts +0 -8
  147. package/dist/breakouts/collection.d.ts +0 -5
  148. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  149. package/dist/breakouts/events.d.ts +0 -8
  150. package/dist/breakouts/index.d.ts +0 -5
  151. package/dist/breakouts/request.d.ts +0 -22
  152. package/dist/breakouts/utils.d.ts +0 -15
  153. package/dist/common/browser-detection.d.ts +0 -9
  154. package/dist/common/collection.d.ts +0 -48
  155. package/dist/common/config.d.ts +0 -2
  156. package/dist/common/errors/captcha-error.d.ts +0 -15
  157. package/dist/common/errors/intent-to-join.d.ts +0 -16
  158. package/dist/common/errors/join-meeting.d.ts +0 -17
  159. package/dist/common/errors/media.d.ts +0 -15
  160. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  161. package/dist/common/errors/parameter.d.ts +0 -15
  162. package/dist/common/errors/password-error.d.ts +0 -15
  163. package/dist/common/errors/permission.d.ts +0 -14
  164. package/dist/common/errors/reclaim-host-role-error.d.ts +0 -60
  165. package/dist/common/errors/reclaim-host-role-error.js +0 -158
  166. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  167. package/dist/common/errors/reclaim-host-role-errors.d.ts +0 -60
  168. package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
  169. package/dist/common/errors/reconnection-in-progress.js +0 -35
  170. package/dist/common/errors/reconnection-in-progress.js.map +0 -1
  171. package/dist/common/errors/reconnection.d.ts +0 -15
  172. package/dist/common/errors/stats.d.ts +0 -15
  173. package/dist/common/errors/webex-errors.d.ts +0 -81
  174. package/dist/common/errors/webex-meetings-error.d.ts +0 -20
  175. package/dist/common/events/events-scope.d.ts +0 -17
  176. package/dist/common/events/events.d.ts +0 -12
  177. package/dist/common/events/trigger-proxy.d.ts +0 -2
  178. package/dist/common/events/util.d.ts +0 -2
  179. package/dist/common/logs/logger-config.d.ts +0 -2
  180. package/dist/common/logs/logger-proxy.d.ts +0 -2
  181. package/dist/common/logs/request.d.ts +0 -34
  182. package/dist/common/queue.d.ts +0 -32
  183. package/dist/config.d.ts +0 -73
  184. package/dist/constants.d.ts +0 -952
  185. package/dist/controls-options-manager/constants.d.ts +0 -4
  186. package/dist/controls-options-manager/enums.d.ts +0 -5
  187. package/dist/controls-options-manager/index.d.ts +0 -120
  188. package/dist/controls-options-manager/types.d.ts +0 -43
  189. package/dist/controls-options-manager/util.d.ts +0 -7
  190. package/dist/index.d.ts +0 -4
  191. package/dist/interceptors/index.d.ts +0 -2
  192. package/dist/interceptors/locusRetry.d.ts +0 -27
  193. package/dist/interpretation/collection.d.ts +0 -5
  194. package/dist/interpretation/index.d.ts +0 -5
  195. package/dist/interpretation/siLanguage.d.ts +0 -5
  196. package/dist/locus-info/controlsUtils.d.ts +0 -2
  197. package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
  198. package/dist/locus-info/fullState.d.ts +0 -2
  199. package/dist/locus-info/hostUtils.d.ts +0 -2
  200. package/dist/locus-info/index.d.ts +0 -269
  201. package/dist/locus-info/infoUtils.d.ts +0 -2
  202. package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
  203. package/dist/locus-info/parser.d.ts +0 -212
  204. package/dist/locus-info/selfUtils.d.ts +0 -2
  205. package/dist/media/index.d.ts +0 -32
  206. package/dist/media/properties.d.ts +0 -108
  207. package/dist/media/util.d.ts +0 -2
  208. package/dist/mediaQualityMetrics/config.d.ts +0 -233
  209. package/dist/mediaQualityMetrics/config.js +0 -513
  210. package/dist/mediaQualityMetrics/config.js.map +0 -1
  211. package/dist/meeting/effectsState.d.ts +0 -42
  212. package/dist/meeting/effectsState.js +0 -260
  213. package/dist/meeting/effectsState.js.map +0 -1
  214. package/dist/meeting/in-meeting-actions.d.ts +0 -79
  215. package/dist/meeting/index.d.ts +0 -1622
  216. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  217. package/dist/meeting/muteState.d.ts +0 -116
  218. package/dist/meeting/request.d.ts +0 -257
  219. package/dist/meeting/request.type.d.ts +0 -11
  220. package/dist/meeting/state.d.ts +0 -9
  221. package/dist/meeting/util.d.ts +0 -2
  222. package/dist/meeting/voicea-meeting.d.ts +0 -16
  223. package/dist/meeting-info/collection.d.ts +0 -20
  224. package/dist/meeting-info/index.d.ts +0 -57
  225. package/dist/meeting-info/meeting-info-v2.d.ts +0 -93
  226. package/dist/meeting-info/request.d.ts +0 -22
  227. package/dist/meeting-info/util.d.ts +0 -2
  228. package/dist/meeting-info/utilv2.d.ts +0 -2
  229. package/dist/meetings/collection.d.ts +0 -23
  230. package/dist/meetings/index.d.ts +0 -296
  231. package/dist/meetings/meetings.types.d.ts +0 -4
  232. package/dist/meetings/request.d.ts +0 -27
  233. package/dist/meetings/util.d.ts +0 -18
  234. package/dist/member/index.d.ts +0 -148
  235. package/dist/member/member.types.d.ts +0 -11
  236. package/dist/member/member.types.js +0 -18
  237. package/dist/member/member.types.js.map +0 -1
  238. package/dist/member/types.d.ts +0 -32
  239. package/dist/member/util.d.ts +0 -2
  240. package/dist/members/collection.d.ts +0 -24
  241. package/dist/members/index.d.ts +0 -308
  242. package/dist/members/request.d.ts +0 -58
  243. package/dist/members/types.d.ts +0 -25
  244. package/dist/members/util.d.ts +0 -2
  245. package/dist/metrics/config.d.ts +0 -169
  246. package/dist/metrics/config.js +0 -289
  247. package/dist/metrics/config.js.map +0 -1
  248. package/dist/metrics/constants.d.ts +0 -59
  249. package/dist/metrics/index.d.ts +0 -152
  250. package/dist/multistream/mediaRequestManager.d.ts +0 -119
  251. package/dist/multistream/receiveSlot.d.ts +0 -68
  252. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  253. package/dist/multistream/remoteMedia.d.ts +0 -72
  254. package/dist/multistream/remoteMediaGroup.d.ts +0 -49
  255. package/dist/multistream/remoteMediaManager.d.ts +0 -300
  256. package/dist/multistream/sendSlotManager.d.ts +0 -69
  257. package/dist/networkQualityMonitor/index.d.ts +0 -70
  258. package/dist/networkQualityMonitor/index.js +0 -226
  259. package/dist/networkQualityMonitor/index.js.map +0 -1
  260. package/dist/peer-connection-manager/index.d.ts +0 -6
  261. package/dist/peer-connection-manager/index.js +0 -671
  262. package/dist/peer-connection-manager/index.js.map +0 -1
  263. package/dist/peer-connection-manager/util.d.ts +0 -6
  264. package/dist/peer-connection-manager/util.js +0 -110
  265. package/dist/peer-connection-manager/util.js.map +0 -1
  266. package/dist/personal-meeting-room/index.d.ts +0 -47
  267. package/dist/personal-meeting-room/request.d.ts +0 -14
  268. package/dist/personal-meeting-room/util.d.ts +0 -2
  269. package/dist/reachability/clusterReachability.d.ts +0 -109
  270. package/dist/reachability/index.d.ts +0 -139
  271. package/dist/reachability/request.d.ts +0 -35
  272. package/dist/reachability/util.d.ts +0 -8
  273. package/dist/reactions/constants.d.ts +0 -3
  274. package/dist/reactions/reactions.d.ts +0 -4
  275. package/dist/reactions/reactions.type.d.ts +0 -32
  276. package/dist/reconnection-manager/index.d.ts +0 -112
  277. package/dist/recording-controller/enums.d.ts +0 -7
  278. package/dist/recording-controller/index.d.ts +0 -193
  279. package/dist/recording-controller/util.d.ts +0 -13
  280. package/dist/roap/collection.d.ts +0 -10
  281. package/dist/roap/collection.js +0 -63
  282. package/dist/roap/collection.js.map +0 -1
  283. package/dist/roap/handler.d.ts +0 -47
  284. package/dist/roap/handler.js +0 -279
  285. package/dist/roap/handler.js.map +0 -1
  286. package/dist/roap/index.d.ts +0 -116
  287. package/dist/roap/request.d.ts +0 -35
  288. package/dist/roap/state.d.ts +0 -9
  289. package/dist/roap/state.js +0 -127
  290. package/dist/roap/state.js.map +0 -1
  291. package/dist/roap/turnDiscovery.d.ts +0 -81
  292. package/dist/roap/util.d.ts +0 -2
  293. package/dist/roap/util.js +0 -76
  294. package/dist/roap/util.js.map +0 -1
  295. package/dist/rtcMetrics/constants.d.ts +0 -4
  296. package/dist/rtcMetrics/constants.js.map +0 -1
  297. package/dist/rtcMetrics/index.d.ts +0 -61
  298. package/dist/rtcMetrics/index.js +0 -197
  299. package/dist/rtcMetrics/index.js.map +0 -1
  300. package/dist/statsAnalyzer/global.d.ts +0 -118
  301. package/dist/statsAnalyzer/global.js +0 -127
  302. package/dist/statsAnalyzer/global.js.map +0 -1
  303. package/dist/statsAnalyzer/index.d.ts +0 -193
  304. package/dist/statsAnalyzer/index.js +0 -1019
  305. package/dist/statsAnalyzer/index.js.map +0 -1
  306. package/dist/statsAnalyzer/mqaUtil.d.ts +0 -22
  307. package/dist/statsAnalyzer/mqaUtil.js +0 -181
  308. package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
  309. package/dist/transcription/index.d.ts +0 -64
  310. package/dist/types/common/errors/reconnection-in-progress.d.ts +0 -9
  311. package/dist/types/mediaQualityMetrics/config.d.ts +0 -241
  312. package/dist/types/networkQualityMonitor/index.d.ts +0 -70
  313. package/dist/types/rtcMetrics/constants.d.ts +0 -4
  314. package/dist/types/rtcMetrics/index.d.ts +0 -71
  315. package/dist/types/statsAnalyzer/global.d.ts +0 -36
  316. package/dist/types/statsAnalyzer/index.d.ts +0 -217
  317. package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
  318. package/dist/webinar/collection.d.ts +0 -16
  319. package/dist/webinar/index.d.ts +0 -5
@@ -6,7 +6,7 @@ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequ
6
6
  _Object$defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
- exports.RemoteMediaEvents = exports.RemoteMedia = void 0;
9
+ exports.RemoteMediaEvents = exports.RemoteMedia = exports.MAX_FS_VALUES = void 0;
10
10
  exports.getMaxFs = getMaxFs;
11
11
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
12
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
@@ -26,17 +26,18 @@ var RemoteMediaEvents = exports.RemoteMediaEvents = {
26
26
  };
27
27
  // highest possible resolution
28
28
 
29
- var MAX_FS_VALUES = {
29
+ var MAX_FS_VALUES = exports.MAX_FS_VALUES = {
30
30
  '90p': 60,
31
31
  '180p': 240,
32
32
  '360p': 920,
33
+ '540p': 2040,
33
34
  '720p': 3600,
34
35
  '1080p': 8192
35
36
  };
36
37
 
37
38
  /**
38
39
  * Converts pane size into h264 maxFs
39
- * @param {PaneSize} paneSize
40
+ * @param {RemoteVideoResolution} paneSize
40
41
  * @returns {number}
41
42
  */
42
43
  function getMaxFs(paneSize) {
@@ -93,6 +94,12 @@ var RemoteMedia = exports.RemoteMedia = /*#__PURE__*/function (_EventsScope) {
93
94
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "options", void 0);
94
95
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mediaRequestId", void 0);
95
96
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "id", void 0);
97
+ /**
98
+ * The max frame size of the media request, used for logging and media requests.
99
+ * Set by setSizeHint() based on video element dimensions.
100
+ * When > 0, this value takes precedence over options.resolution in sendMediaRequest().
101
+ */
102
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "maxFrameSize", 0);
96
103
  remoteMediaCounter += 1;
97
104
  _this.receiveSlot = receiveSlot;
98
105
  _this.mediaRequestManager = mediaRequestManager;
@@ -131,14 +138,33 @@ var RemoteMedia = exports.RemoteMedia = /*#__PURE__*/function (_EventsScope) {
131
138
  fs = MAX_FS_VALUES['180p'];
132
139
  } else if (height < getThresholdHeight(360)) {
133
140
  fs = MAX_FS_VALUES['360p'];
141
+ } else if (height < getThresholdHeight(540)) {
142
+ fs = MAX_FS_VALUES['540p'];
134
143
  } else if (height <= 720) {
135
144
  fs = MAX_FS_VALUES['720p'];
136
145
  } else {
137
146
  fs = MAX_FS_VALUES['1080p'];
138
147
  }
148
+ this.maxFrameSize = fs;
139
149
  (_this$receiveSlot = this.receiveSlot) === null || _this$receiveSlot === void 0 ? void 0 : _this$receiveSlot.setMaxFs(fs);
140
150
  }
141
151
 
152
+ /**
153
+ * Get the current effective maxFs value that would be used in media requests
154
+ * @returns {number | undefined} The maxFs value, or undefined if no constraints
155
+ */
156
+ }, {
157
+ key: "getEffectiveMaxFs",
158
+ value: function getEffectiveMaxFs() {
159
+ if (this.maxFrameSize > 0) {
160
+ return this.maxFrameSize;
161
+ }
162
+ if (this.options.resolution) {
163
+ return getMaxFs(this.options.resolution);
164
+ }
165
+ return undefined;
166
+ }
167
+
142
168
  /**
143
169
  * Invalidates the remote media by clearing the reference to a receive slot and
144
170
  * cancelling the media request.
@@ -179,15 +205,18 @@ var RemoteMedia = exports.RemoteMedia = /*#__PURE__*/function (_EventsScope) {
179
205
  if (!this.receiveSlot) {
180
206
  throw new Error('sendMediaRequest() called on an invalidated RemoteMedia instance');
181
207
  }
208
+
209
+ // Use maxFrameSize from setSizeHint if available, otherwise fallback to options.resolution
210
+ var maxFs = this.getEffectiveMaxFs();
182
211
  this.mediaRequestId = this.mediaRequestManager.addRequest({
183
212
  policyInfo: {
184
213
  policy: 'receiver-selected',
185
214
  csi: csi
186
215
  },
187
216
  receiveSlots: [this.receiveSlot],
188
- codecInfo: this.options.resolution && {
217
+ codecInfo: maxFs && {
189
218
  codec: 'h264',
190
- maxFs: getMaxFs(this.options.resolution)
219
+ maxFs: maxFs
191
220
  }
192
221
  }, commit);
193
222
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_eventsScope","_receiveSlot","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","RemoteMediaEvents","exports","SourceUpdate","ReceiveSlotEvents","Stopped","MAX_FS_VALUES","getMaxFs","paneSize","maxFs","LoggerProxy","logger","warn","concat","remoteMediaCounter","RemoteMedia","_EventsScope","_inherits2","_super","receiveSlot","mediaRequestManager","options","_this","_classCallCheck2","_defineProperty2","_assertThisInitialized2","setupEventListeners","id","_createClass2","key","value","setSizeHint","width","height","_this$receiveSlot","fs","threshold","getThresholdHeight","h","Math","round","setMaxFs","stop","_this$receiveSlot2","commit","length","undefined","cancelMediaRequest","removeAllListeners","emit","file","function","sendMediaRequest","csi","mediaRequestId","Error","addRequest","policyInfo","policy","receiveSlots","codecInfo","resolution","codec","cancelRequest","_this2","scope","on","data","get","_this$receiveSlot3","mediaType","_this$receiveSlot4","memberId","_this$receiveSlot5","_this$receiveSlot6","sourceState","_this$receiveSlot7","stream","getUnderlyingReceiveSlot","EventsScope"],"sources":["remoteMedia.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport {MediaType, StreamState} from '@webex/internal-media-core';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\n\nimport {MediaRequestId, MediaRequestManager} from './mediaRequestManager';\nimport {CSI, ReceiveSlot, ReceiveSlotEvents} from './receiveSlot';\n\nexport const RemoteMediaEvents = {\n SourceUpdate: ReceiveSlotEvents.SourceUpdate,\n Stopped: 'stopped',\n};\n\nexport type RemoteVideoResolution =\n | 'thumbnail' // the smallest possible resolution, 90p or less\n | 'very small' // 180p or less\n | 'small' // 360p or less\n | 'medium' // 720p or less\n | 'large' // 1080p or less\n | 'best'; // highest possible resolution\n\nconst MAX_FS_VALUES = {\n '90p': 60,\n '180p': 240,\n '360p': 920,\n '720p': 3600,\n '1080p': 8192,\n};\n\n/**\n * Converts pane size into h264 maxFs\n * @param {PaneSize} paneSize\n * @returns {number}\n */\nexport function getMaxFs(paneSize: RemoteVideoResolution): number {\n let maxFs;\n\n switch (paneSize) {\n case 'thumbnail':\n maxFs = MAX_FS_VALUES['90p'];\n break;\n case 'very small':\n maxFs = MAX_FS_VALUES['180p'];\n break;\n case 'small':\n maxFs = MAX_FS_VALUES['360p'];\n break;\n case 'medium':\n maxFs = MAX_FS_VALUES['720p'];\n break;\n case 'large':\n maxFs = MAX_FS_VALUES['1080p'];\n break;\n case 'best':\n maxFs = MAX_FS_VALUES['1080p']; // for now 'best' is 1080p, so same as 'large'\n break;\n default:\n LoggerProxy.logger.warn(\n `RemoteMedia#getMaxFs --> unsupported paneSize: ${paneSize}, using \"medium\" instead`\n );\n maxFs = MAX_FS_VALUES['720p'];\n }\n\n return maxFs;\n}\n\ntype Options = {\n resolution?: RemoteVideoResolution; // applies only to groups of type MediaType.VideoMain and MediaType.VideoSlides\n};\n\nexport type RemoteMediaId = string;\n\nlet remoteMediaCounter = 0;\n\n/**\n * Class representing a remote audio/video stream.\n *\n * Internally it is associated with a specific receive slot\n * and a media request for it.\n */\nexport class RemoteMedia extends EventsScope {\n private receiveSlot?: ReceiveSlot;\n\n private readonly mediaRequestManager: MediaRequestManager;\n\n private readonly options: Options;\n\n private mediaRequestId?: MediaRequestId;\n\n public readonly id: RemoteMediaId;\n\n /**\n * Constructs RemoteMedia instance\n *\n * @param receiveSlot\n * @param mediaRequestManager\n * @param options\n */\n constructor(\n receiveSlot: ReceiveSlot,\n mediaRequestManager: MediaRequestManager,\n options?: Options\n ) {\n super();\n remoteMediaCounter += 1;\n this.receiveSlot = receiveSlot;\n this.mediaRequestManager = mediaRequestManager;\n this.options = options || {};\n this.setupEventListeners();\n this.id = `RM${remoteMediaCounter}-${this.receiveSlot.id}`;\n }\n\n /**\n * Supply the width and height of the video element\n * to restrict the requested resolution to this size\n * @param width width of the video element\n * @param height height of the video element\n * @note width/height of 0 will be ignored\n */\n public setSizeHint(width, height) {\n // only base on height for now\n let fs: number;\n\n if (width === 0 || height === 0) {\n return;\n }\n\n // we switch to the next resolution level when the height is 10% more than the current resolution height\n // except for 1080p - we switch to it immediately when the height is more than 720p\n const threshold = 1.1;\n const getThresholdHeight = (h: number) => Math.round(h * threshold);\n\n if (height < getThresholdHeight(90)) {\n fs = MAX_FS_VALUES['90p'];\n } else if (height < getThresholdHeight(180)) {\n fs = MAX_FS_VALUES['180p'];\n } else if (height < getThresholdHeight(360)) {\n fs = MAX_FS_VALUES['360p'];\n } else if (height <= 720) {\n fs = MAX_FS_VALUES['720p'];\n } else {\n fs = MAX_FS_VALUES['1080p'];\n }\n\n this.receiveSlot?.setMaxFs(fs);\n }\n\n /**\n * Invalidates the remote media by clearing the reference to a receive slot and\n * cancelling the media request.\n * After this call the remote media is unusable.\n *\n * @param {boolean} commit - whether to commit the cancellation of the media request\n * @internal\n */\n public stop(commit = true) {\n this.cancelMediaRequest(commit);\n this.receiveSlot?.removeAllListeners();\n this.receiveSlot = undefined;\n this.emit(\n {\n file: 'multistream/remoteMedia',\n function: 'stop',\n },\n RemoteMediaEvents.Stopped,\n {}\n );\n }\n\n /**\n * Sends a new media request. This method can only be used for receiver-selected policy,\n * because only in that policy we have a 1-1 relationship between RemoteMedia and MediaRequest\n * and the request id is then stored in this RemoteMedia instance.\n * For active-speaker policy, the same request is shared among many RemoteMedia instances,\n * so it's managed through RemoteMediaGroup\n *\n * @internal\n */\n public sendMediaRequest(csi: CSI, commit: boolean) {\n if (this.mediaRequestId) {\n this.cancelMediaRequest(false);\n }\n\n if (!this.receiveSlot) {\n throw new Error('sendMediaRequest() called on an invalidated RemoteMedia instance');\n }\n\n this.mediaRequestId = this.mediaRequestManager.addRequest(\n {\n policyInfo: {\n policy: 'receiver-selected',\n csi,\n },\n receiveSlots: [this.receiveSlot],\n codecInfo: this.options.resolution && {\n codec: 'h264',\n maxFs: getMaxFs(this.options.resolution),\n },\n },\n commit\n );\n }\n\n /**\n * @internal\n */\n public cancelMediaRequest(commit: boolean) {\n if (this.mediaRequestId) {\n this.mediaRequestManager.cancelRequest(this.mediaRequestId, commit);\n this.mediaRequestId = undefined;\n }\n }\n\n /**\n * registers event listeners on the receive slot and forwards all the events\n */\n private setupEventListeners() {\n if (this.receiveSlot) {\n const scope = {\n file: 'multistream/remoteMedia',\n function: 'setupEventListeners',\n };\n\n this.receiveSlot.on(ReceiveSlotEvents.SourceUpdate, (data) => {\n this.emit(scope, RemoteMediaEvents.SourceUpdate, data);\n });\n }\n }\n\n /**\n * Getter for mediaType\n */\n public get mediaType(): MediaType {\n return this.receiveSlot?.mediaType;\n }\n\n /**\n * Getter for memberId\n */\n public get memberId() {\n return this.receiveSlot?.memberId;\n }\n\n /**\n * Getter for csi\n */\n public get csi() {\n return this.receiveSlot?.csi;\n }\n\n /**\n * Getter for source state\n */\n public get sourceState(): StreamState {\n return this.receiveSlot?.sourceState;\n }\n\n /**\n * Getter for remote media stream\n */\n public get stream() {\n return this.receiveSlot?.stream;\n }\n\n /**\n * @internal\n * @returns {ReceiveSlot}\n */\n public getUnderlyingReceiveSlot() {\n return this.receiveSlot;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_eventsScope","_receiveSlot","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","RemoteMediaEvents","exports","SourceUpdate","ReceiveSlotEvents","Stopped","MAX_FS_VALUES","getMaxFs","paneSize","maxFs","LoggerProxy","logger","warn","concat","remoteMediaCounter","RemoteMedia","_EventsScope","_inherits2","_super","receiveSlot","mediaRequestManager","options","_this","_classCallCheck2","_defineProperty2","_assertThisInitialized2","setupEventListeners","id","_createClass2","key","value","setSizeHint","width","height","_this$receiveSlot","fs","threshold","getThresholdHeight","h","Math","round","maxFrameSize","setMaxFs","getEffectiveMaxFs","resolution","undefined","stop","_this$receiveSlot2","commit","length","cancelMediaRequest","removeAllListeners","emit","file","function","sendMediaRequest","csi","mediaRequestId","Error","addRequest","policyInfo","policy","receiveSlots","codecInfo","codec","cancelRequest","_this2","scope","on","data","get","_this$receiveSlot3","mediaType","_this$receiveSlot4","memberId","_this$receiveSlot5","_this$receiveSlot6","sourceState","_this$receiveSlot7","stream","getUnderlyingReceiveSlot","EventsScope"],"sources":["remoteMedia.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport {MediaType, StreamState} from '@webex/internal-media-core';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\n\nimport {MediaRequestId, MediaRequestManager} from './mediaRequestManager';\nimport {CSI, ReceiveSlot, ReceiveSlotEvents} from './receiveSlot';\n\nexport const RemoteMediaEvents = {\n SourceUpdate: ReceiveSlotEvents.SourceUpdate,\n Stopped: 'stopped',\n};\n\nexport type RemoteVideoResolution =\n | 'thumbnail' // the smallest possible resolution, 90p or less\n | 'very small' // 180p or less\n | 'small' // 360p or less\n | 'medium' // 720p or less\n | 'large' // 1080p or less\n | 'best'; // highest possible resolution\n\nexport const MAX_FS_VALUES = {\n '90p': 60,\n '180p': 240,\n '360p': 920,\n '540p': 2040,\n '720p': 3600,\n '1080p': 8192,\n};\n\n/**\n * Converts pane size into h264 maxFs\n * @param {RemoteVideoResolution} paneSize\n * @returns {number}\n */\nexport function getMaxFs(paneSize: RemoteVideoResolution): number {\n let maxFs;\n\n switch (paneSize) {\n case 'thumbnail':\n maxFs = MAX_FS_VALUES['90p'];\n break;\n case 'very small':\n maxFs = MAX_FS_VALUES['180p'];\n break;\n case 'small':\n maxFs = MAX_FS_VALUES['360p'];\n break;\n case 'medium':\n maxFs = MAX_FS_VALUES['720p'];\n break;\n case 'large':\n maxFs = MAX_FS_VALUES['1080p'];\n break;\n case 'best':\n maxFs = MAX_FS_VALUES['1080p']; // for now 'best' is 1080p, so same as 'large'\n break;\n default:\n LoggerProxy.logger.warn(\n `RemoteMedia#getMaxFs --> unsupported paneSize: ${paneSize}, using \"medium\" instead`\n );\n maxFs = MAX_FS_VALUES['720p'];\n }\n\n return maxFs;\n}\n\ntype Options = {\n resolution?: RemoteVideoResolution; // applies only to groups of type MediaType.VideoMain and MediaType.VideoSlides\n};\n\nexport type RemoteMediaId = string;\n\nlet remoteMediaCounter = 0;\n\n/**\n * Class representing a remote audio/video stream.\n *\n * Internally it is associated with a specific receive slot\n * and a media request for it.\n */\nexport class RemoteMedia extends EventsScope {\n private receiveSlot?: ReceiveSlot;\n\n private readonly mediaRequestManager: MediaRequestManager;\n\n private readonly options: Options;\n\n private mediaRequestId?: MediaRequestId;\n\n public readonly id: RemoteMediaId;\n\n /**\n * The max frame size of the media request, used for logging and media requests.\n * Set by setSizeHint() based on video element dimensions.\n * When > 0, this value takes precedence over options.resolution in sendMediaRequest().\n */\n private maxFrameSize = 0;\n\n /**\n * Constructs RemoteMedia instance\n *\n * @param receiveSlot\n * @param mediaRequestManager\n * @param options\n */\n constructor(\n receiveSlot: ReceiveSlot,\n mediaRequestManager: MediaRequestManager,\n options?: Options\n ) {\n super();\n remoteMediaCounter += 1;\n this.receiveSlot = receiveSlot;\n this.mediaRequestManager = mediaRequestManager;\n this.options = options || {};\n this.setupEventListeners();\n this.id = `RM${remoteMediaCounter}-${this.receiveSlot.id}`;\n }\n\n /**\n * Supply the width and height of the video element\n * to restrict the requested resolution to this size\n * @param width width of the video element\n * @param height height of the video element\n * @note width/height of 0 will be ignored\n */\n public setSizeHint(width, height) {\n // only base on height for now\n let fs: number;\n\n if (width === 0 || height === 0) {\n return;\n }\n\n // we switch to the next resolution level when the height is 10% more than the current resolution height\n // except for 1080p - we switch to it immediately when the height is more than 720p\n const threshold = 1.1;\n const getThresholdHeight = (h: number) => Math.round(h * threshold);\n\n if (height < getThresholdHeight(90)) {\n fs = MAX_FS_VALUES['90p'];\n } else if (height < getThresholdHeight(180)) {\n fs = MAX_FS_VALUES['180p'];\n } else if (height < getThresholdHeight(360)) {\n fs = MAX_FS_VALUES['360p'];\n } else if (height < getThresholdHeight(540)) {\n fs = MAX_FS_VALUES['540p'];\n } else if (height <= 720) {\n fs = MAX_FS_VALUES['720p'];\n } else {\n fs = MAX_FS_VALUES['1080p'];\n }\n\n this.maxFrameSize = fs;\n this.receiveSlot?.setMaxFs(fs);\n }\n\n /**\n * Get the current effective maxFs value that would be used in media requests\n * @returns {number | undefined} The maxFs value, or undefined if no constraints\n */\n public getEffectiveMaxFs(): number | undefined {\n if (this.maxFrameSize > 0) {\n return this.maxFrameSize;\n }\n\n if (this.options.resolution) {\n return getMaxFs(this.options.resolution);\n }\n\n return undefined;\n }\n\n /**\n * Invalidates the remote media by clearing the reference to a receive slot and\n * cancelling the media request.\n * After this call the remote media is unusable.\n *\n * @param {boolean} commit - whether to commit the cancellation of the media request\n * @internal\n */\n public stop(commit = true) {\n this.cancelMediaRequest(commit);\n this.receiveSlot?.removeAllListeners();\n this.receiveSlot = undefined;\n this.emit(\n {\n file: 'multistream/remoteMedia',\n function: 'stop',\n },\n RemoteMediaEvents.Stopped,\n {}\n );\n }\n\n /**\n * Sends a new media request. This method can only be used for receiver-selected policy,\n * because only in that policy we have a 1-1 relationship between RemoteMedia and MediaRequest\n * and the request id is then stored in this RemoteMedia instance.\n * For active-speaker policy, the same request is shared among many RemoteMedia instances,\n * so it's managed through RemoteMediaGroup\n *\n * @internal\n */\n public sendMediaRequest(csi: CSI, commit: boolean) {\n if (this.mediaRequestId) {\n this.cancelMediaRequest(false);\n }\n\n if (!this.receiveSlot) {\n throw new Error('sendMediaRequest() called on an invalidated RemoteMedia instance');\n }\n\n // Use maxFrameSize from setSizeHint if available, otherwise fallback to options.resolution\n const maxFs = this.getEffectiveMaxFs();\n\n this.mediaRequestId = this.mediaRequestManager.addRequest(\n {\n policyInfo: {\n policy: 'receiver-selected',\n csi,\n },\n receiveSlots: [this.receiveSlot],\n codecInfo: maxFs && {\n codec: 'h264',\n maxFs,\n },\n },\n commit\n );\n }\n\n /**\n * @internal\n */\n public cancelMediaRequest(commit: boolean) {\n if (this.mediaRequestId) {\n this.mediaRequestManager.cancelRequest(this.mediaRequestId, commit);\n this.mediaRequestId = undefined;\n }\n }\n\n /**\n * registers event listeners on the receive slot and forwards all the events\n */\n private setupEventListeners() {\n if (this.receiveSlot) {\n const scope = {\n file: 'multistream/remoteMedia',\n function: 'setupEventListeners',\n };\n\n this.receiveSlot.on(ReceiveSlotEvents.SourceUpdate, (data) => {\n this.emit(scope, RemoteMediaEvents.SourceUpdate, data);\n });\n }\n }\n\n /**\n * Getter for mediaType\n */\n public get mediaType(): MediaType {\n return this.receiveSlot?.mediaType;\n }\n\n /**\n * Getter for memberId\n */\n public get memberId() {\n return this.receiveSlot?.memberId;\n }\n\n /**\n * Getter for csi\n */\n public get csi() {\n return this.receiveSlot?.csi;\n }\n\n /**\n * Getter for source state\n */\n public get sourceState(): StreamState {\n return this.receiveSlot?.sourceState;\n }\n\n /**\n * Getter for remote media stream\n */\n public get stream() {\n return this.receiveSlot?.stream;\n }\n\n /**\n * @internal\n * @returns {ReceiveSlot}\n */\n public getUnderlyingReceiveSlot() {\n return this.receiveSlot;\n }\n}\n"],"mappings":"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"}
@@ -192,6 +192,9 @@ var RemoteMediaGroup = exports.RemoteMediaGroup = /*#__PURE__*/function () {
192
192
  value: function sendActiveSpeakerMediaRequest(commit) {
193
193
  var _this$options, _this$options$namedMe, _this$options2;
194
194
  this.cancelActiveSpeakerMediaRequest(false);
195
+
196
+ // Calculate the effective maxFs based on all unpinned RemoteMedia instances
197
+ var effectiveMaxFs = this.getEffectiveMaxFsForActiveSpeaker();
195
198
  this.mediaRequestId = this.mediaRequestManager.addRequest({
196
199
  policyInfo: {
197
200
  policy: 'active-speaker',
@@ -204,9 +207,9 @@ var RemoteMediaGroup = exports.RemoteMediaGroup = /*#__PURE__*/function () {
204
207
  receiveSlots: this.unpinnedRemoteMedia.map(function (remoteMedia) {
205
208
  return remoteMedia.getUnderlyingReceiveSlot();
206
209
  }),
207
- codecInfo: this.options.resolution && {
210
+ codecInfo: effectiveMaxFs && {
208
211
  codec: 'h264',
209
- maxFs: (0, _remoteMedia.getMaxFs)(this.options.resolution)
212
+ maxFs: effectiveMaxFs
210
213
  }
211
214
  }, commit);
212
215
  }
@@ -275,6 +278,43 @@ var RemoteMediaGroup = exports.RemoteMediaGroup = /*#__PURE__*/function () {
275
278
  }
276
279
  return this.unpinnedRemoteMedia.includes(remoteMedia) || this.pinnedRemoteMedia.includes(remoteMedia);
277
280
  }
281
+
282
+ /**
283
+ * Calculate the effective maxFs for the active speaker media request based on unpinned RemoteMedia instances
284
+ * @returns {number | undefined} The calculated maxFs value, or undefined if no constraints
285
+ * @private
286
+ */
287
+ }, {
288
+ key: "getEffectiveMaxFsForActiveSpeaker",
289
+ value: function getEffectiveMaxFsForActiveSpeaker() {
290
+ // Get all effective maxFs values from unpinned RemoteMedia instances
291
+ var maxFsValues = this.unpinnedRemoteMedia.map(function (remoteMedia) {
292
+ return remoteMedia.getEffectiveMaxFs();
293
+ }).filter(function (maxFs) {
294
+ return maxFs !== undefined;
295
+ });
296
+
297
+ // Use the highest maxFs value to ensure we don't under-request resolution for any instance
298
+ if (maxFsValues.length > 0) {
299
+ return Math.max.apply(Math, (0, _toConsumableArray2.default)(maxFsValues));
300
+ }
301
+
302
+ // Fall back to group's resolution option
303
+ if (this.options.resolution) {
304
+ return (0, _remoteMedia.getMaxFs)(this.options.resolution);
305
+ }
306
+ return undefined;
307
+ }
308
+
309
+ /**
310
+ * Get the current effective maxFs that would be used for the active speaker media request
311
+ * @returns {number | undefined} The effective maxFs value
312
+ */
313
+ }, {
314
+ key: "getEffectiveMaxFs",
315
+ value: function getEffectiveMaxFs() {
316
+ return this.getEffectiveMaxFsForActiveSpeaker();
317
+ }
278
318
  }]);
279
319
  return RemoteMediaGroup;
280
320
  }();
@@ -1 +1 @@
1
- {"version":3,"names":["_lodash","require","_loggerProxy","_interopRequireDefault","_remoteMedia","RemoteMediaGroup","exports","mediaRequestManager","receiveSlots","priority","commitMediaRequest","_this","options","arguments","length","undefined","_classCallCheck2","default","_defineProperty2","unpinnedRemoteMedia","map","slot","RemoteMedia","resolution","pinnedRemoteMedia","sendActiveSpeakerMediaRequest","_createClass2","key","value","getRemoteMedia","filter","_toConsumableArray2","concat","setActiveSpeakerCsis","remoteMediaCsis","_this2","commit","forEach","_ref","csi","remoteMedia","indexOf","unpinId","splice","push","Error","id","sendMediaRequest","pinId","cancelMediaRequest","cancelActiveSpeakerMediaRequest","pin","targetCsi","LoggerProxy","logger","log","idx","unpin","isPinned","setPreferLiveVideo","preferLiveVideo","_this$options","_this$options$namedMe","_this$options2","mediaRequestId","addRequest","policyInfo","policy","crossPriorityDuplication","crossPolicyDuplication","namedMediaGroups","namedMediaGroup","getUnderlyingReceiveSlot","codecInfo","codec","maxFs","getMaxFs","cancelRequest","setNamedMediaGroup","type","stop","includes"],"sources":["remoteMediaGroup.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\n/* eslint-disable require-jsdoc */\n/* eslint-disable import/prefer-default-export */\nimport {forEach} from 'lodash';\nimport {NamedMediaGroup} from '@webex/internal-media-core';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport {getMaxFs, RemoteMedia, RemoteVideoResolution} from './remoteMedia';\nimport {MediaRequestId, MediaRequestManager} from './mediaRequestManager';\nimport {CSI, ReceiveSlot} from './receiveSlot';\n\ntype Options = {\n resolution?: RemoteVideoResolution; // applies only to groups of type MediaType.VideoMain and MediaType.VideoSlides\n preferLiveVideo?: boolean; // applies only to groups of type MediaType.VideoMain and MediaType.VideoSlides\n namedMediaGroup?: NamedMediaGroup; // applies only to named media groups for audio\n};\n\nexport class RemoteMediaGroup {\n private mediaRequestManager: MediaRequestManager;\n\n private priority: number;\n\n private options: Options;\n\n private unpinnedRemoteMedia: RemoteMedia[];\n\n private mediaRequestId?: MediaRequestId; // id of the \"active-speaker\" media request id\n\n private pinnedRemoteMedia: RemoteMedia[];\n\n constructor(\n mediaRequestManager: MediaRequestManager,\n receiveSlots: ReceiveSlot[],\n priority: number,\n commitMediaRequest: boolean,\n options: Options = {}\n ) {\n this.mediaRequestManager = mediaRequestManager;\n this.priority = priority;\n this.options = options;\n\n this.unpinnedRemoteMedia = receiveSlots.map(\n (slot) =>\n new RemoteMedia(slot, this.mediaRequestManager, {\n resolution: this.options.resolution,\n })\n );\n this.pinnedRemoteMedia = [];\n\n this.sendActiveSpeakerMediaRequest(commitMediaRequest);\n }\n\n /**\n * Gets the array of remote media elements from the group\n *\n * @param {string} filter - 'all' (default) returns both pinned and unpinned\n * @returns {Array<RemoteMedia>}\n */\n public getRemoteMedia(filter: 'all' | 'pinned' | 'unpinned' = 'all') {\n if (filter === 'unpinned') {\n // return a shallow copy so that the client cannot modify this.unpinnedRemoteMedia array\n return [...this.unpinnedRemoteMedia];\n }\n if (filter === 'pinned') {\n // return a shallow copy so that the client cannot modify this.pinnedRemoteMedia array\n return [...this.pinnedRemoteMedia];\n }\n\n return [...this.unpinnedRemoteMedia, ...this.pinnedRemoteMedia];\n }\n\n /**\n * Sets CSIs for multiple RemoteMedia instances belonging to this RemoteMediaGroup.\n * For each entry in the remoteMediaCsis array:\n * - if csi is specified, the RemoteMedia instance is pinned to that CSI\n * - if csi is undefined, the RemoteMedia instance is unpinned\n * @internal\n */\n public setActiveSpeakerCsis(\n remoteMediaCsis: {remoteMedia: RemoteMedia; csi?: number}[],\n commit = true\n ): void {\n forEach(remoteMediaCsis, ({csi, remoteMedia}) => {\n if (csi) {\n if (!(this.pinnedRemoteMedia.indexOf(remoteMedia) >= 0)) {\n const unpinId = this.unpinnedRemoteMedia.indexOf(remoteMedia);\n if (unpinId >= 0) {\n this.unpinnedRemoteMedia.splice(unpinId, 1);\n this.pinnedRemoteMedia.push(remoteMedia);\n } else {\n throw new Error(\n `failed to pin a remote media object ${remoteMedia.id}, because it is not found in this remote media group`\n );\n }\n }\n remoteMedia.sendMediaRequest(csi, false);\n } else {\n if (!(this.unpinnedRemoteMedia.indexOf(remoteMedia) >= 0)) {\n const pinId = this.pinnedRemoteMedia.indexOf(remoteMedia);\n if (pinId >= 0) {\n this.pinnedRemoteMedia.splice(pinId, 1);\n this.unpinnedRemoteMedia.push(remoteMedia);\n } else {\n throw new Error(\n `failed to unpin a remote media object ${remoteMedia.id}, because it is not found in this remote media group`\n );\n }\n }\n remoteMedia.cancelMediaRequest(false);\n }\n });\n this.cancelActiveSpeakerMediaRequest(false);\n this.sendActiveSpeakerMediaRequest(false);\n if (commit) {\n this.mediaRequestManager.commit();\n }\n }\n\n /**\n * Pins a specific remote media instance to a specfic CSI, so the media will\n * no longer come from active speaker, but from that CSI.\n * If no CSI is given, the current CSI value is used.\n *\n */\n public pin(remoteMedia: RemoteMedia, csi?: CSI): void {\n // if csi is not specified, use the current one\n const targetCsi = csi || remoteMedia.csi;\n\n if (!targetCsi) {\n throw new Error(\n `failed to pin a remote media object ${remoteMedia.id}, because it has no CSI set and no CSI value was given`\n );\n }\n\n if (this.pinnedRemoteMedia.indexOf(remoteMedia) >= 0) {\n if (targetCsi === remoteMedia.csi) {\n // remote media already pinned to target CSI, nothing to do\n LoggerProxy.logger.log(\n `RemoteMediaGroup#pin --> remote media ${remoteMedia.id} already pinned`\n );\n\n return;\n }\n } else {\n const idx = this.unpinnedRemoteMedia.indexOf(remoteMedia);\n\n if (idx < 0) {\n throw new Error(\n `failed to pin a remote media object ${remoteMedia.id}, because it is not found in this remote media group`\n );\n }\n\n this.unpinnedRemoteMedia.splice(idx, 1);\n this.pinnedRemoteMedia.push(remoteMedia);\n\n this.cancelActiveSpeakerMediaRequest(false);\n this.sendActiveSpeakerMediaRequest(false);\n }\n\n remoteMedia.sendMediaRequest(targetCsi, false);\n this.mediaRequestManager.commit();\n }\n\n /**\n * Unpins a remote media instance, so that it will again provide media from active speakers\n *\n */\n public unpin(remoteMedia: RemoteMedia) {\n if (this.unpinnedRemoteMedia.indexOf(remoteMedia) >= 0) {\n LoggerProxy.logger.log(\n `RemoteMediaGroup#pin --> remote media ${remoteMedia.id} already unpinned`\n );\n\n return;\n }\n const idx = this.pinnedRemoteMedia.indexOf(remoteMedia);\n\n if (idx < 0) {\n throw new Error(\n `failed to unpin a remote media object ${remoteMedia.id}, because it is not found in this remote media group`\n );\n }\n\n this.pinnedRemoteMedia.splice(idx, 1);\n this.unpinnedRemoteMedia.push(remoteMedia);\n\n remoteMedia.cancelMediaRequest(false);\n this.cancelActiveSpeakerMediaRequest(false);\n this.sendActiveSpeakerMediaRequest(false);\n this.mediaRequestManager.commit();\n }\n\n public isPinned(remoteMedia: RemoteMedia) {\n if (this.unpinnedRemoteMedia.indexOf(remoteMedia) >= 0) {\n return false;\n }\n if (this.pinnedRemoteMedia.indexOf(remoteMedia) >= 0) {\n return true;\n }\n\n throw new Error(`remote media object ${remoteMedia.id} not found in the group`);\n }\n\n /**\n * setPreferLiveVideo - sets preferLiveVideo to true/false\n * @internal\n */\n public setPreferLiveVideo(preferLiveVideo: boolean, commit: boolean) {\n if (this.options.preferLiveVideo !== preferLiveVideo) {\n this.options.preferLiveVideo = preferLiveVideo;\n this.sendActiveSpeakerMediaRequest(commit);\n }\n }\n\n private sendActiveSpeakerMediaRequest(commit: boolean) {\n this.cancelActiveSpeakerMediaRequest(false);\n\n this.mediaRequestId = this.mediaRequestManager.addRequest(\n {\n policyInfo: {\n policy: 'active-speaker',\n priority: this.priority,\n crossPriorityDuplication: false,\n crossPolicyDuplication: false,\n preferLiveVideo: !!this.options?.preferLiveVideo,\n namedMediaGroups: this.options.namedMediaGroup?.value\n ? [this.options?.namedMediaGroup]\n : undefined,\n },\n receiveSlots: this.unpinnedRemoteMedia.map((remoteMedia) =>\n remoteMedia.getUnderlyingReceiveSlot()\n ) as ReceiveSlot[],\n codecInfo: this.options.resolution && {\n codec: 'h264',\n maxFs: getMaxFs(this.options.resolution),\n },\n },\n commit\n );\n }\n\n private cancelActiveSpeakerMediaRequest(commit: boolean) {\n if (this.mediaRequestId) {\n this.mediaRequestManager.cancelRequest(this.mediaRequestId, commit);\n this.mediaRequestId = undefined;\n }\n }\n\n /**\n * setNamedMediaGroup - sets named media group type and value\n * @internal\n */\n public setNamedMediaGroup(namedMediaGroup: NamedMediaGroup, commit: boolean) {\n if (\n this.options.namedMediaGroup.value !== namedMediaGroup.value ||\n this.options.namedMediaGroup.type !== namedMediaGroup.type\n ) {\n this.options.namedMediaGroup = namedMediaGroup;\n this.sendActiveSpeakerMediaRequest(commit);\n }\n }\n\n /**\n * Invalidates the remote media group by clearing the references to the receive slots\n * used by all remote media from that group and cancelling all media requests.\n * After this call the remote media group is unusable.\n *\n * @param{boolean} commit whether to commit the cancellation of media requests\n * @internal\n */\n public stop(commit = true) {\n this.unpinnedRemoteMedia.forEach((remoteMedia) => remoteMedia.stop(false));\n this.pinnedRemoteMedia.forEach((remoteMedia) => remoteMedia.stop(false));\n this.cancelActiveSpeakerMediaRequest(false);\n\n if (commit) {\n this.mediaRequestManager.commit();\n }\n }\n\n /**\n * Checks if a given RemoteMedia instance belongs to this group.\n *\n * @param remoteMedia RemoteMedia instance to check\n * @param filter controls which remote media from the group to check\n * @returns true if remote media is found\n */\n public includes(\n remoteMedia: RemoteMedia,\n filter: 'all' | 'pinned' | 'unpinned' = 'all'\n ): boolean {\n if (filter === 'pinned') {\n return this.pinnedRemoteMedia.includes(remoteMedia);\n }\n if (filter === 'unpinned') {\n return this.unpinnedRemoteMedia.includes(remoteMedia);\n }\n\n return (\n this.unpinnedRemoteMedia.includes(remoteMedia) || this.pinnedRemoteMedia.includes(remoteMedia)\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_lodash","require","_loggerProxy","_interopRequireDefault","_remoteMedia","RemoteMediaGroup","exports","mediaRequestManager","receiveSlots","priority","commitMediaRequest","_this","options","arguments","length","undefined","_classCallCheck2","default","_defineProperty2","unpinnedRemoteMedia","map","slot","RemoteMedia","resolution","pinnedRemoteMedia","sendActiveSpeakerMediaRequest","_createClass2","key","value","getRemoteMedia","filter","_toConsumableArray2","concat","setActiveSpeakerCsis","remoteMediaCsis","_this2","commit","forEach","_ref","csi","remoteMedia","indexOf","unpinId","splice","push","Error","id","sendMediaRequest","pinId","cancelMediaRequest","cancelActiveSpeakerMediaRequest","pin","targetCsi","LoggerProxy","logger","log","idx","unpin","isPinned","setPreferLiveVideo","preferLiveVideo","_this$options","_this$options$namedMe","_this$options2","effectiveMaxFs","getEffectiveMaxFsForActiveSpeaker","mediaRequestId","addRequest","policyInfo","policy","crossPriorityDuplication","crossPolicyDuplication","namedMediaGroups","namedMediaGroup","getUnderlyingReceiveSlot","codecInfo","codec","maxFs","cancelRequest","setNamedMediaGroup","type","stop","includes","maxFsValues","getEffectiveMaxFs","Math","max","apply","getMaxFs"],"sources":["remoteMediaGroup.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\n/* eslint-disable require-jsdoc */\n/* eslint-disable import/prefer-default-export */\nimport {forEach} from 'lodash';\nimport {NamedMediaGroup} from '@webex/internal-media-core';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport {getMaxFs, RemoteMedia, RemoteVideoResolution} from './remoteMedia';\nimport {MediaRequestId, MediaRequestManager} from './mediaRequestManager';\nimport {CSI, ReceiveSlot} from './receiveSlot';\n\ntype Options = {\n resolution?: RemoteVideoResolution; // applies only to groups of type MediaType.VideoMain and MediaType.VideoSlides\n preferLiveVideo?: boolean; // applies only to groups of type MediaType.VideoMain and MediaType.VideoSlides\n namedMediaGroup?: NamedMediaGroup; // applies only to named media groups for audio\n};\n\nexport class RemoteMediaGroup {\n private mediaRequestManager: MediaRequestManager;\n\n private priority: number;\n\n private options: Options;\n\n private unpinnedRemoteMedia: RemoteMedia[];\n\n private mediaRequestId?: MediaRequestId; // id of the \"active-speaker\" media request id\n\n private pinnedRemoteMedia: RemoteMedia[];\n\n constructor(\n mediaRequestManager: MediaRequestManager,\n receiveSlots: ReceiveSlot[],\n priority: number,\n commitMediaRequest: boolean,\n options: Options = {}\n ) {\n this.mediaRequestManager = mediaRequestManager;\n this.priority = priority;\n this.options = options;\n\n this.unpinnedRemoteMedia = receiveSlots.map(\n (slot) =>\n new RemoteMedia(slot, this.mediaRequestManager, {\n resolution: this.options.resolution,\n })\n );\n this.pinnedRemoteMedia = [];\n\n this.sendActiveSpeakerMediaRequest(commitMediaRequest);\n }\n\n /**\n * Gets the array of remote media elements from the group\n *\n * @param {string} filter - 'all' (default) returns both pinned and unpinned\n * @returns {Array<RemoteMedia>}\n */\n public getRemoteMedia(filter: 'all' | 'pinned' | 'unpinned' = 'all') {\n if (filter === 'unpinned') {\n // return a shallow copy so that the client cannot modify this.unpinnedRemoteMedia array\n return [...this.unpinnedRemoteMedia];\n }\n if (filter === 'pinned') {\n // return a shallow copy so that the client cannot modify this.pinnedRemoteMedia array\n return [...this.pinnedRemoteMedia];\n }\n\n return [...this.unpinnedRemoteMedia, ...this.pinnedRemoteMedia];\n }\n\n /**\n * Sets CSIs for multiple RemoteMedia instances belonging to this RemoteMediaGroup.\n * For each entry in the remoteMediaCsis array:\n * - if csi is specified, the RemoteMedia instance is pinned to that CSI\n * - if csi is undefined, the RemoteMedia instance is unpinned\n * @internal\n */\n public setActiveSpeakerCsis(\n remoteMediaCsis: {remoteMedia: RemoteMedia; csi?: number}[],\n commit = true\n ): void {\n forEach(remoteMediaCsis, ({csi, remoteMedia}) => {\n if (csi) {\n if (!(this.pinnedRemoteMedia.indexOf(remoteMedia) >= 0)) {\n const unpinId = this.unpinnedRemoteMedia.indexOf(remoteMedia);\n if (unpinId >= 0) {\n this.unpinnedRemoteMedia.splice(unpinId, 1);\n this.pinnedRemoteMedia.push(remoteMedia);\n } else {\n throw new Error(\n `failed to pin a remote media object ${remoteMedia.id}, because it is not found in this remote media group`\n );\n }\n }\n remoteMedia.sendMediaRequest(csi, false);\n } else {\n if (!(this.unpinnedRemoteMedia.indexOf(remoteMedia) >= 0)) {\n const pinId = this.pinnedRemoteMedia.indexOf(remoteMedia);\n if (pinId >= 0) {\n this.pinnedRemoteMedia.splice(pinId, 1);\n this.unpinnedRemoteMedia.push(remoteMedia);\n } else {\n throw new Error(\n `failed to unpin a remote media object ${remoteMedia.id}, because it is not found in this remote media group`\n );\n }\n }\n remoteMedia.cancelMediaRequest(false);\n }\n });\n this.cancelActiveSpeakerMediaRequest(false);\n this.sendActiveSpeakerMediaRequest(false);\n if (commit) {\n this.mediaRequestManager.commit();\n }\n }\n\n /**\n * Pins a specific remote media instance to a specfic CSI, so the media will\n * no longer come from active speaker, but from that CSI.\n * If no CSI is given, the current CSI value is used.\n *\n */\n public pin(remoteMedia: RemoteMedia, csi?: CSI): void {\n // if csi is not specified, use the current one\n const targetCsi = csi || remoteMedia.csi;\n\n if (!targetCsi) {\n throw new Error(\n `failed to pin a remote media object ${remoteMedia.id}, because it has no CSI set and no CSI value was given`\n );\n }\n\n if (this.pinnedRemoteMedia.indexOf(remoteMedia) >= 0) {\n if (targetCsi === remoteMedia.csi) {\n // remote media already pinned to target CSI, nothing to do\n LoggerProxy.logger.log(\n `RemoteMediaGroup#pin --> remote media ${remoteMedia.id} already pinned`\n );\n\n return;\n }\n } else {\n const idx = this.unpinnedRemoteMedia.indexOf(remoteMedia);\n\n if (idx < 0) {\n throw new Error(\n `failed to pin a remote media object ${remoteMedia.id}, because it is not found in this remote media group`\n );\n }\n\n this.unpinnedRemoteMedia.splice(idx, 1);\n this.pinnedRemoteMedia.push(remoteMedia);\n\n this.cancelActiveSpeakerMediaRequest(false);\n this.sendActiveSpeakerMediaRequest(false);\n }\n\n remoteMedia.sendMediaRequest(targetCsi, false);\n this.mediaRequestManager.commit();\n }\n\n /**\n * Unpins a remote media instance, so that it will again provide media from active speakers\n *\n */\n public unpin(remoteMedia: RemoteMedia) {\n if (this.unpinnedRemoteMedia.indexOf(remoteMedia) >= 0) {\n LoggerProxy.logger.log(\n `RemoteMediaGroup#pin --> remote media ${remoteMedia.id} already unpinned`\n );\n\n return;\n }\n const idx = this.pinnedRemoteMedia.indexOf(remoteMedia);\n\n if (idx < 0) {\n throw new Error(\n `failed to unpin a remote media object ${remoteMedia.id}, because it is not found in this remote media group`\n );\n }\n\n this.pinnedRemoteMedia.splice(idx, 1);\n this.unpinnedRemoteMedia.push(remoteMedia);\n\n remoteMedia.cancelMediaRequest(false);\n this.cancelActiveSpeakerMediaRequest(false);\n this.sendActiveSpeakerMediaRequest(false);\n this.mediaRequestManager.commit();\n }\n\n public isPinned(remoteMedia: RemoteMedia) {\n if (this.unpinnedRemoteMedia.indexOf(remoteMedia) >= 0) {\n return false;\n }\n if (this.pinnedRemoteMedia.indexOf(remoteMedia) >= 0) {\n return true;\n }\n\n throw new Error(`remote media object ${remoteMedia.id} not found in the group`);\n }\n\n /**\n * setPreferLiveVideo - sets preferLiveVideo to true/false\n * @internal\n */\n public setPreferLiveVideo(preferLiveVideo: boolean, commit: boolean) {\n if (this.options.preferLiveVideo !== preferLiveVideo) {\n this.options.preferLiveVideo = preferLiveVideo;\n this.sendActiveSpeakerMediaRequest(commit);\n }\n }\n\n private sendActiveSpeakerMediaRequest(commit: boolean) {\n this.cancelActiveSpeakerMediaRequest(false);\n\n // Calculate the effective maxFs based on all unpinned RemoteMedia instances\n const effectiveMaxFs = this.getEffectiveMaxFsForActiveSpeaker();\n\n this.mediaRequestId = this.mediaRequestManager.addRequest(\n {\n policyInfo: {\n policy: 'active-speaker',\n priority: this.priority,\n crossPriorityDuplication: false,\n crossPolicyDuplication: false,\n preferLiveVideo: !!this.options?.preferLiveVideo,\n namedMediaGroups: this.options.namedMediaGroup?.value\n ? [this.options?.namedMediaGroup]\n : undefined,\n },\n receiveSlots: this.unpinnedRemoteMedia.map((remoteMedia) =>\n remoteMedia.getUnderlyingReceiveSlot()\n ) as ReceiveSlot[],\n codecInfo: effectiveMaxFs && {\n codec: 'h264',\n maxFs: effectiveMaxFs,\n },\n },\n commit\n );\n }\n\n private cancelActiveSpeakerMediaRequest(commit: boolean) {\n if (this.mediaRequestId) {\n this.mediaRequestManager.cancelRequest(this.mediaRequestId, commit);\n this.mediaRequestId = undefined;\n }\n }\n\n /**\n * setNamedMediaGroup - sets named media group type and value\n * @internal\n */\n public setNamedMediaGroup(namedMediaGroup: NamedMediaGroup, commit: boolean) {\n if (\n this.options.namedMediaGroup.value !== namedMediaGroup.value ||\n this.options.namedMediaGroup.type !== namedMediaGroup.type\n ) {\n this.options.namedMediaGroup = namedMediaGroup;\n this.sendActiveSpeakerMediaRequest(commit);\n }\n }\n\n /**\n * Invalidates the remote media group by clearing the references to the receive slots\n * used by all remote media from that group and cancelling all media requests.\n * After this call the remote media group is unusable.\n *\n * @param{boolean} commit whether to commit the cancellation of media requests\n * @internal\n */\n public stop(commit = true) {\n this.unpinnedRemoteMedia.forEach((remoteMedia) => remoteMedia.stop(false));\n this.pinnedRemoteMedia.forEach((remoteMedia) => remoteMedia.stop(false));\n this.cancelActiveSpeakerMediaRequest(false);\n\n if (commit) {\n this.mediaRequestManager.commit();\n }\n }\n\n /**\n * Checks if a given RemoteMedia instance belongs to this group.\n *\n * @param remoteMedia RemoteMedia instance to check\n * @param filter controls which remote media from the group to check\n * @returns true if remote media is found\n */\n public includes(\n remoteMedia: RemoteMedia,\n filter: 'all' | 'pinned' | 'unpinned' = 'all'\n ): boolean {\n if (filter === 'pinned') {\n return this.pinnedRemoteMedia.includes(remoteMedia);\n }\n if (filter === 'unpinned') {\n return this.unpinnedRemoteMedia.includes(remoteMedia);\n }\n\n return (\n this.unpinnedRemoteMedia.includes(remoteMedia) || this.pinnedRemoteMedia.includes(remoteMedia)\n );\n }\n\n /**\n * Calculate the effective maxFs for the active speaker media request based on unpinned RemoteMedia instances\n * @returns {number | undefined} The calculated maxFs value, or undefined if no constraints\n * @private\n */\n private getEffectiveMaxFsForActiveSpeaker(): number | undefined {\n // Get all effective maxFs values from unpinned RemoteMedia instances\n const maxFsValues = this.unpinnedRemoteMedia\n .map((remoteMedia) => remoteMedia.getEffectiveMaxFs())\n .filter((maxFs) => maxFs !== undefined);\n\n // Use the highest maxFs value to ensure we don't under-request resolution for any instance\n if (maxFsValues.length > 0) {\n return Math.max(...maxFsValues);\n }\n\n // Fall back to group's resolution option\n if (this.options.resolution) {\n return getMaxFs(this.options.resolution);\n }\n\n return undefined;\n }\n\n /**\n * Get the current effective maxFs that would be used for the active speaker media request\n * @returns {number | undefined} The effective maxFs value\n */\n public getEffectiveMaxFs(): number | undefined {\n return this.getEffectiveMaxFsForActiveSpeaker();\n }\n}\n"],"mappings":";;;;;;;;;;;;AAGA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAC,sBAAA,CAAAF,OAAA;AAEA,IAAAG,YAAA,GAAAH,OAAA;AAPA;AACA;AACA;AAAA,IAeaI,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA;EAa3B,SAAAA,iBACEE,mBAAwC,EACxCC,YAA2B,EAC3BC,QAAgB,EAChBC,kBAA2B,EAE3B;IAAA,IAAAC,KAAA;IAAA,IADAC,OAAgB,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;IAAA,IAAAG,gBAAA,CAAAC,OAAA,QAAAZ,gBAAA;IAAA,IAAAa,gBAAA,CAAAD,OAAA;IAAA,IAAAC,gBAAA,CAAAD,OAAA;IAAA,IAAAC,gBAAA,CAAAD,OAAA;IAAA,IAAAC,gBAAA,CAAAD,OAAA;IAAA,IAAAC,gBAAA,CAAAD,OAAA;IATkB;IAAA,IAAAC,gBAAA,CAAAD,OAAA;IAWvC,IAAI,CAACV,mBAAmB,GAAGA,mBAAmB;IAC9C,IAAI,CAACE,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACG,OAAO,GAAGA,OAAO;IAEtB,IAAI,CAACO,mBAAmB,GAAGX,YAAY,CAACY,GAAG,CACzC,UAACC,IAAI;MAAA,OACH,IAAIC,wBAAW,CAACD,IAAI,EAAEV,KAAI,CAACJ,mBAAmB,EAAE;QAC9CgB,UAAU,EAAEZ,KAAI,CAACC,OAAO,CAACW;MAC3B,CAAC,CAAC;IAAA,CACN,CAAC;IACD,IAAI,CAACC,iBAAiB,GAAG,EAAE;IAE3B,IAAI,CAACC,6BAA6B,CAACf,kBAAkB,CAAC;EACxD;;EAEA;AACF;AACA;AACA;AACA;AACA;EALE,IAAAgB,aAAA,CAAAT,OAAA,EAAAZ,gBAAA;IAAAsB,GAAA;IAAAC,KAAA,EAMA,SAAAC,eAAA,EAAqE;MAAA,IAA/CC,MAAqC,GAAAjB,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,KAAK;MACjE,IAAIiB,MAAM,KAAK,UAAU,EAAE;QACzB;QACA,WAAAC,mBAAA,CAAAd,OAAA,EAAW,IAAI,CAACE,mBAAmB;MACrC;MACA,IAAIW,MAAM,KAAK,QAAQ,EAAE;QACvB;QACA,WAAAC,mBAAA,CAAAd,OAAA,EAAW,IAAI,CAACO,iBAAiB;MACnC;MAEA,UAAAQ,MAAA,KAAAD,mBAAA,CAAAd,OAAA,EAAW,IAAI,CAACE,mBAAmB,OAAAY,mBAAA,CAAAd,OAAA,EAAK,IAAI,CAACO,iBAAiB;IAChE;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAG,GAAA;IAAAC,KAAA,EAOA,SAAAK,qBACEC,eAA2D,EAErD;MAAA,IAAAC,MAAA;MAAA,IADNC,MAAM,GAAAvB,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,IAAI;MAEb,IAAAwB,eAAO,EAACH,eAAe,EAAE,UAAAI,IAAA,EAAwB;QAAA,IAAtBC,GAAG,GAAAD,IAAA,CAAHC,GAAG;UAAEC,WAAW,GAAAF,IAAA,CAAXE,WAAW;QACzC,IAAID,GAAG,EAAE;UACP,IAAI,EAAEJ,MAAI,CAACX,iBAAiB,CAACiB,OAAO,CAACD,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE;YACvD,IAAME,OAAO,GAAGP,MAAI,CAAChB,mBAAmB,CAACsB,OAAO,CAACD,WAAW,CAAC;YAC7D,IAAIE,OAAO,IAAI,CAAC,EAAE;cAChBP,MAAI,CAAChB,mBAAmB,CAACwB,MAAM,CAACD,OAAO,EAAE,CAAC,CAAC;cAC3CP,MAAI,CAACX,iBAAiB,CAACoB,IAAI,CAACJ,WAAW,CAAC;YAC1C,CAAC,MAAM;cACL,MAAM,IAAIK,KAAK,wCAAAb,MAAA,CAC0BQ,WAAW,CAACM,EAAE,yDACvD,CAAC;YACH;UACF;UACAN,WAAW,CAACO,gBAAgB,CAACR,GAAG,EAAE,KAAK,CAAC;QAC1C,CAAC,MAAM;UACL,IAAI,EAAEJ,MAAI,CAAChB,mBAAmB,CAACsB,OAAO,CAACD,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE;YACzD,IAAMQ,KAAK,GAAGb,MAAI,CAACX,iBAAiB,CAACiB,OAAO,CAACD,WAAW,CAAC;YACzD,IAAIQ,KAAK,IAAI,CAAC,EAAE;cACdb,MAAI,CAACX,iBAAiB,CAACmB,MAAM,CAACK,KAAK,EAAE,CAAC,CAAC;cACvCb,MAAI,CAAChB,mBAAmB,CAACyB,IAAI,CAACJ,WAAW,CAAC;YAC5C,CAAC,MAAM;cACL,MAAM,IAAIK,KAAK,0CAAAb,MAAA,CAC4BQ,WAAW,CAACM,EAAE,yDACzD,CAAC;YACH;UACF;UACAN,WAAW,CAACS,kBAAkB,CAAC,KAAK,CAAC;QACvC;MACF,CAAC,CAAC;MACF,IAAI,CAACC,+BAA+B,CAAC,KAAK,CAAC;MAC3C,IAAI,CAACzB,6BAA6B,CAAC,KAAK,CAAC;MACzC,IAAIW,MAAM,EAAE;QACV,IAAI,CAAC7B,mBAAmB,CAAC6B,MAAM,CAAC,CAAC;MACnC;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAT,GAAA;IAAAC,KAAA,EAMA,SAAAuB,IAAWX,WAAwB,EAAED,GAAS,EAAQ;MACpD;MACA,IAAMa,SAAS,GAAGb,GAAG,IAAIC,WAAW,CAACD,GAAG;MAExC,IAAI,CAACa,SAAS,EAAE;QACd,MAAM,IAAIP,KAAK,wCAAAb,MAAA,CAC0BQ,WAAW,CAACM,EAAE,2DACvD,CAAC;MACH;MAEA,IAAI,IAAI,CAACtB,iBAAiB,CAACiB,OAAO,CAACD,WAAW,CAAC,IAAI,CAAC,EAAE;QACpD,IAAIY,SAAS,KAAKZ,WAAW,CAACD,GAAG,EAAE;UACjC;UACAc,oBAAW,CAACC,MAAM,CAACC,GAAG,0CAAAvB,MAAA,CACqBQ,WAAW,CAACM,EAAE,oBACzD,CAAC;UAED;QACF;MACF,CAAC,MAAM;QACL,IAAMU,GAAG,GAAG,IAAI,CAACrC,mBAAmB,CAACsB,OAAO,CAACD,WAAW,CAAC;QAEzD,IAAIgB,GAAG,GAAG,CAAC,EAAE;UACX,MAAM,IAAIX,KAAK,wCAAAb,MAAA,CAC0BQ,WAAW,CAACM,EAAE,yDACvD,CAAC;QACH;QAEA,IAAI,CAAC3B,mBAAmB,CAACwB,MAAM,CAACa,GAAG,EAAE,CAAC,CAAC;QACvC,IAAI,CAAChC,iBAAiB,CAACoB,IAAI,CAACJ,WAAW,CAAC;QAExC,IAAI,CAACU,+BAA+B,CAAC,KAAK,CAAC;QAC3C,IAAI,CAACzB,6BAA6B,CAAC,KAAK,CAAC;MAC3C;MAEAe,WAAW,CAACO,gBAAgB,CAACK,SAAS,EAAE,KAAK,CAAC;MAC9C,IAAI,CAAC7C,mBAAmB,CAAC6B,MAAM,CAAC,CAAC;IACnC;;IAEA;AACF;AACA;AACA;EAHE;IAAAT,GAAA;IAAAC,KAAA,EAIA,SAAA6B,MAAajB,WAAwB,EAAE;MACrC,IAAI,IAAI,CAACrB,mBAAmB,CAACsB,OAAO,CAACD,WAAW,CAAC,IAAI,CAAC,EAAE;QACtDa,oBAAW,CAACC,MAAM,CAACC,GAAG,0CAAAvB,MAAA,CACqBQ,WAAW,CAACM,EAAE,sBACzD,CAAC;QAED;MACF;MACA,IAAMU,GAAG,GAAG,IAAI,CAAChC,iBAAiB,CAACiB,OAAO,CAACD,WAAW,CAAC;MAEvD,IAAIgB,GAAG,GAAG,CAAC,EAAE;QACX,MAAM,IAAIX,KAAK,0CAAAb,MAAA,CAC4BQ,WAAW,CAACM,EAAE,yDACzD,CAAC;MACH;MAEA,IAAI,CAACtB,iBAAiB,CAACmB,MAAM,CAACa,GAAG,EAAE,CAAC,CAAC;MACrC,IAAI,CAACrC,mBAAmB,CAACyB,IAAI,CAACJ,WAAW,CAAC;MAE1CA,WAAW,CAACS,kBAAkB,CAAC,KAAK,CAAC;MACrC,IAAI,CAACC,+BAA+B,CAAC,KAAK,CAAC;MAC3C,IAAI,CAACzB,6BAA6B,CAAC,KAAK,CAAC;MACzC,IAAI,CAAClB,mBAAmB,CAAC6B,MAAM,CAAC,CAAC;IACnC;EAAC;IAAAT,GAAA;IAAAC,KAAA,EAED,SAAA8B,SAAgBlB,WAAwB,EAAE;MACxC,IAAI,IAAI,CAACrB,mBAAmB,CAACsB,OAAO,CAACD,WAAW,CAAC,IAAI,CAAC,EAAE;QACtD,OAAO,KAAK;MACd;MACA,IAAI,IAAI,CAAChB,iBAAiB,CAACiB,OAAO,CAACD,WAAW,CAAC,IAAI,CAAC,EAAE;QACpD,OAAO,IAAI;MACb;MAEA,MAAM,IAAIK,KAAK,wBAAAb,MAAA,CAAwBQ,WAAW,CAACM,EAAE,4BAAyB,CAAC;IACjF;;IAEA;AACF;AACA;AACA;EAHE;IAAAnB,GAAA;IAAAC,KAAA,EAIA,SAAA+B,mBAA0BC,eAAwB,EAAExB,MAAe,EAAE;MACnE,IAAI,IAAI,CAACxB,OAAO,CAACgD,eAAe,KAAKA,eAAe,EAAE;QACpD,IAAI,CAAChD,OAAO,CAACgD,eAAe,GAAGA,eAAe;QAC9C,IAAI,CAACnC,6BAA6B,CAACW,MAAM,CAAC;MAC5C;IACF;EAAC;IAAAT,GAAA;IAAAC,KAAA,EAED,SAAAH,8BAAsCW,MAAe,EAAE;MAAA,IAAAyB,aAAA,EAAAC,qBAAA,EAAAC,cAAA;MACrD,IAAI,CAACb,+BAA+B,CAAC,KAAK,CAAC;;MAE3C;MACA,IAAMc,cAAc,GAAG,IAAI,CAACC,iCAAiC,CAAC,CAAC;MAE/D,IAAI,CAACC,cAAc,GAAG,IAAI,CAAC3D,mBAAmB,CAAC4D,UAAU,CACvD;QACEC,UAAU,EAAE;UACVC,MAAM,EAAE,gBAAgB;UACxB5D,QAAQ,EAAE,IAAI,CAACA,QAAQ;UACvB6D,wBAAwB,EAAE,KAAK;UAC/BC,sBAAsB,EAAE,KAAK;UAC7BX,eAAe,EAAE,CAAC,GAAAC,aAAA,GAAC,IAAI,CAACjD,OAAO,cAAAiD,aAAA,eAAZA,aAAA,CAAcD,eAAe;UAChDY,gBAAgB,EAAE,CAAAV,qBAAA,OAAI,CAAClD,OAAO,CAAC6D,eAAe,cAAAX,qBAAA,eAA5BA,qBAAA,CAA8BlC,KAAK,GACjD,EAAAmC,cAAA,GAAC,IAAI,CAACnD,OAAO,cAAAmD,cAAA,uBAAZA,cAAA,CAAcU,eAAe,CAAC,GAC/B1D;QACN,CAAC;QACDP,YAAY,EAAE,IAAI,CAACW,mBAAmB,CAACC,GAAG,CAAC,UAACoB,WAAW;UAAA,OACrDA,WAAW,CAACkC,wBAAwB,CAAC,CAAC;QAAA,CACxC,CAAkB;QAClBC,SAAS,EAAEX,cAAc,IAAI;UAC3BY,KAAK,EAAE,MAAM;UACbC,KAAK,EAAEb;QACT;MACF,CAAC,EACD5B,MACF,CAAC;IACH;EAAC;IAAAT,GAAA;IAAAC,KAAA,EAED,SAAAsB,gCAAwCd,MAAe,EAAE;MACvD,IAAI,IAAI,CAAC8B,cAAc,EAAE;QACvB,IAAI,CAAC3D,mBAAmB,CAACuE,aAAa,CAAC,IAAI,CAACZ,cAAc,EAAE9B,MAAM,CAAC;QACnE,IAAI,CAAC8B,cAAc,GAAGnD,SAAS;MACjC;IACF;;IAEA;AACF;AACA;AACA;EAHE;IAAAY,GAAA;IAAAC,KAAA,EAIA,SAAAmD,mBAA0BN,eAAgC,EAAErC,MAAe,EAAE;MAC3E,IACE,IAAI,CAACxB,OAAO,CAAC6D,eAAe,CAAC7C,KAAK,KAAK6C,eAAe,CAAC7C,KAAK,IAC5D,IAAI,CAAChB,OAAO,CAAC6D,eAAe,CAACO,IAAI,KAAKP,eAAe,CAACO,IAAI,EAC1D;QACA,IAAI,CAACpE,OAAO,CAAC6D,eAAe,GAAGA,eAAe;QAC9C,IAAI,CAAChD,6BAA6B,CAACW,MAAM,CAAC;MAC5C;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAAT,GAAA;IAAAC,KAAA,EAQA,SAAAqD,KAAA,EAA2B;MAAA,IAAf7C,MAAM,GAAAvB,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,IAAI;MACvB,IAAI,CAACM,mBAAmB,CAACkB,OAAO,CAAC,UAACG,WAAW;QAAA,OAAKA,WAAW,CAACyC,IAAI,CAAC,KAAK,CAAC;MAAA,EAAC;MAC1E,IAAI,CAACzD,iBAAiB,CAACa,OAAO,CAAC,UAACG,WAAW;QAAA,OAAKA,WAAW,CAACyC,IAAI,CAAC,KAAK,CAAC;MAAA,EAAC;MACxE,IAAI,CAAC/B,+BAA+B,CAAC,KAAK,CAAC;MAE3C,IAAId,MAAM,EAAE;QACV,IAAI,CAAC7B,mBAAmB,CAAC6B,MAAM,CAAC,CAAC;MACnC;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAT,GAAA;IAAAC,KAAA,EAOA,SAAAsD,SACE1C,WAAwB,EAEf;MAAA,IADTV,MAAqC,GAAAjB,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,KAAK;MAE7C,IAAIiB,MAAM,KAAK,QAAQ,EAAE;QACvB,OAAO,IAAI,CAACN,iBAAiB,CAAC0D,QAAQ,CAAC1C,WAAW,CAAC;MACrD;MACA,IAAIV,MAAM,KAAK,UAAU,EAAE;QACzB,OAAO,IAAI,CAACX,mBAAmB,CAAC+D,QAAQ,CAAC1C,WAAW,CAAC;MACvD;MAEA,OACE,IAAI,CAACrB,mBAAmB,CAAC+D,QAAQ,CAAC1C,WAAW,CAAC,IAAI,IAAI,CAAChB,iBAAiB,CAAC0D,QAAQ,CAAC1C,WAAW,CAAC;IAElG;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAb,GAAA;IAAAC,KAAA,EAKA,SAAAqC,kCAAA,EAAgE;MAC9D;MACA,IAAMkB,WAAW,GAAG,IAAI,CAAChE,mBAAmB,CACzCC,GAAG,CAAC,UAACoB,WAAW;QAAA,OAAKA,WAAW,CAAC4C,iBAAiB,CAAC,CAAC;MAAA,EAAC,CACrDtD,MAAM,CAAC,UAAC+C,KAAK;QAAA,OAAKA,KAAK,KAAK9D,SAAS;MAAA,EAAC;;MAEzC;MACA,IAAIoE,WAAW,CAACrE,MAAM,GAAG,CAAC,EAAE;QAC1B,OAAOuE,IAAI,CAACC,GAAG,CAAAC,KAAA,CAARF,IAAI,MAAAtD,mBAAA,CAAAd,OAAA,EAAQkE,WAAW,EAAC;MACjC;;MAEA;MACA,IAAI,IAAI,CAACvE,OAAO,CAACW,UAAU,EAAE;QAC3B,OAAO,IAAAiE,qBAAQ,EAAC,IAAI,CAAC5E,OAAO,CAACW,UAAU,CAAC;MAC1C;MAEA,OAAOR,SAAS;IAClB;;IAEA;AACF;AACA;AACA;EAHE;IAAAY,GAAA;IAAAC,KAAA,EAIA,SAAAwD,kBAAA,EAA+C;MAC7C,OAAO,IAAI,CAACnB,iCAAiC,CAAC,CAAC;IACjD;EAAC;EAAA,OAAA5D,gBAAA;AAAA"}
@@ -13,11 +13,21 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/he
13
13
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
14
14
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
15
15
  var _internalMediaCore = require("@webex/internal-media-core");
16
+ /**
17
+ * This class is used to manage the sendSlots for the given media types.
18
+ */
16
19
  var SendSlotManager = exports.default = /*#__PURE__*/function () {
20
+ /**
21
+ * Constructor for SendSlotManager
22
+ *
23
+ * @param {any} LoggerProxy is used to log the messages
24
+ * @constructor
25
+ */
17
26
  function SendSlotManager(LoggerProxy) {
18
27
  (0, _classCallCheck2.default)(this, SendSlotManager);
19
28
  (0, _defineProperty2.default)(this, "slots", new _map.default());
20
29
  (0, _defineProperty2.default)(this, "LoggerProxy", void 0);
30
+ (0, _defineProperty2.default)(this, "sourceStateOverrides", new _map.default());
21
31
  this.LoggerProxy = LoggerProxy;
22
32
  }
23
33
 
@@ -87,18 +97,38 @@ var SendSlotManager = exports.default = /*#__PURE__*/function () {
87
97
  key: "setSourceStateOverride",
88
98
  value: function setSourceStateOverride(mediaType, state) {
89
99
  if (mediaType !== _internalMediaCore.MediaType.VideoMain) {
90
- throw new Error("sendSlotManager cannot set source state override which media type is ".concat(mediaType));
100
+ throw new Error("Invalid media type '".concat(mediaType, "'. Source state overrides are only applicable to ").concat(_internalMediaCore.MediaType.VideoMain, "."));
91
101
  }
92
102
  var slot = this.slots.get(mediaType);
93
103
  if (!slot) {
94
104
  throw new Error("Slot for ".concat(mediaType, " does not exist"));
95
105
  }
106
+ var currentStateOverride = this.getSourceStateOverride(mediaType);
107
+ if (currentStateOverride === state) {
108
+ return;
109
+ }
96
110
  if (state) {
97
111
  slot.setSourceStateOverride(state);
112
+ this.sourceStateOverrides.set(mediaType, state);
98
113
  } else {
99
114
  slot.clearSourceStateOverride();
115
+ this.sourceStateOverrides.delete(mediaType);
116
+ }
117
+ this.LoggerProxy.logger.info("SendSlotManager->setSourceStateOverride#set source state override for ".concat(mediaType, " to ").concat(state));
118
+ }
119
+
120
+ /**
121
+ * Gets the source state override for the given media type.
122
+ * @param {MediaType} mediaType - The type of media to get the source state override for.
123
+ * @returns {StreamState | null} - The current source state override or null if not set.
124
+ */
125
+ }, {
126
+ key: "getSourceStateOverride",
127
+ value: function getSourceStateOverride(mediaType) {
128
+ if (mediaType !== _internalMediaCore.MediaType.VideoMain) {
129
+ throw new Error("Invalid media type '".concat(mediaType, "'. Source state overrides are only applicable to ").concat(_internalMediaCore.MediaType.VideoMain, "."));
100
130
  }
101
- this.LoggerProxy.logger.info("SendSlotsManager->setSourceStateOverride#set source state override for ".concat(mediaType, " to ").concat(state));
131
+ return this.sourceStateOverrides.get(mediaType) || null;
102
132
  }
103
133
 
104
134
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["_internalMediaCore","require","SendSlotManager","exports","default","LoggerProxy","_classCallCheck2","_defineProperty2","_map","_createClass2","key","value","createSlot","mediaConnection","mediaType","active","arguments","length","undefined","slots","has","Error","concat","slot","createSendSlot","set","logger","info","getSlot","get","setNamedMediaGroups","namedMediaGroups","MediaType","AudioMain","setSourceStateOverride","state","VideoMain","clearSourceStateOverride","_publishStream","_asyncToGenerator2","_regenerator","mark","_callee","stream","wrap","_callee$","_context","prev","next","publishStream","label","muted","stop","_x","_x2","apply","_unpublishStream","_callee2","_callee2$","_context2","unpublishStream","_x3","setActive","_setCodecParameters","_callee3","codecParameters","_callee3$","_context3","setCodecParameters","_x4","_x5","_deleteCodecParameters","_callee4","parameters","_callee4$","_context4","deleteCodecParameters","_x6","_x7","reset","clear"],"sources":["sendSlotManager.ts"],"sourcesContent":["import {\n SendSlot,\n MediaType,\n LocalStream,\n MultistreamRoapMediaConnection,\n NamedMediaGroup,\n StreamState,\n} from '@webex/internal-media-core';\n\nexport default class SendSlotManager {\n private readonly slots: Map<MediaType, SendSlot> = new Map();\n private readonly LoggerProxy: any;\n\n constructor(LoggerProxy: any) {\n this.LoggerProxy = LoggerProxy;\n }\n\n /**\n * This method is used to create a sendSlot for the given mediaType and returns the created sendSlot\n * @param {MultistreamRoapMediaConnection} mediaConnection MultistreamRoapMediaConnection for which a sendSlot needs to be created\n * @param {MediaType} mediaType MediaType for which a sendSlot needs to be created (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)\n * @param {boolean} active This is optional boolean to set the active state of the sendSlot. Default is true\n * @returns {SendSlot} slot The created sendSlot\n */\n public createSlot(\n mediaConnection: MultistreamRoapMediaConnection,\n mediaType: MediaType,\n active = true\n ): SendSlot {\n if (this.slots.has(mediaType)) {\n throw new Error(`Slot for ${mediaType} already exists`);\n }\n\n const slot: SendSlot = mediaConnection.createSendSlot(mediaType, active);\n\n this.slots.set(mediaType, slot);\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->createSlot#Created slot for ${mediaType} with active ${active}`\n );\n\n return slot;\n }\n\n /**\n * This method is used to retrieve the sendSlot for the given mediaType\n * @param {MediaType} mediaType of which the slot needs to be retrieved\n * @returns {SendSlot}\n */\n public getSlot(mediaType: MediaType): SendSlot {\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n return slot;\n }\n\n /**\n * Allow users to specify 'namedMediaGroups' to indicate which named media group its audio should be sent to.\n * @param {MediaType} mediaType MediaType of the sendSlot to which the audio stream needs to be send to the media group\n * @param {[]}namedMediaGroups - Allow users to specify 'namedMediaGroups'.If the value of 'namedMediaGroups' is zero,\n * named media group will be canceled and the audio stream will be sent to the floor.\n * @returns {void}\n */\n public setNamedMediaGroups(mediaType: MediaType, namedMediaGroups: NamedMediaGroup[]) {\n if (mediaType !== MediaType.AudioMain) {\n throw new Error(\n `sendSlotManager cannot set named media group which media type is ${mediaType}`\n );\n }\n\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n slot.setNamedMediaGroups(namedMediaGroups);\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->setNamedMediaGroups#set named media group ${namedMediaGroups}`\n );\n }\n\n /**\n * Sets the source state override for the given media type.\n * @param {MediaType} mediaType - The type of media (must be MediaType.VideoMain to apply source state changes).\n * @param {StreamState | null} state - The state to set or null to clear the override value.\n * @returns {void}\n */\n public setSourceStateOverride(mediaType: MediaType, state: StreamState | null) {\n if (mediaType !== MediaType.VideoMain) {\n throw new Error(\n `sendSlotManager cannot set source state override which media type is ${mediaType}`\n );\n }\n\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n if (state) {\n slot.setSourceStateOverride(state);\n } else {\n slot.clearSourceStateOverride();\n }\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->setSourceStateOverride#set source state override for ${mediaType} to ${state}`\n );\n }\n\n /**\n * This method publishes the given stream to the sendSlot for the given mediaType\n * @param {MediaType} mediaType MediaType of the sendSlot to which a stream needs to be published (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)\n * @param {LocalStream} stream LocalStream to be published\n * @returns {Promise<void>}\n */\n public async publishStream(mediaType: MediaType, stream: LocalStream): Promise<void> {\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n await slot.publishStream(stream);\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->publishStream#Published stream for ${mediaType} and stream with label ${stream.label} and muted ${stream.muted}`\n );\n }\n\n /**\n * This method unpublishes the stream from the sendSlot of the given mediaType\n * @param {MediaType} mediaType MediaType of the sendSlot from which a stream needs to be unpublished (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)\n * @returns {Promise<void>}\n */\n public async unpublishStream(mediaType: MediaType): Promise<void> {\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n await slot.unpublishStream();\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->unpublishStream#Unpublished stream for ${mediaType}`\n );\n }\n\n /**\n * This method is used to set the active state of the sendSlot for the given mediaType\n * @param {MediaType} mediaType The MediaType of the sendSlot for which the active state needs to be set (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)\n * @param {boolean} active The boolean to set the active state of the sendSlot. Default is true\n * @returns {void}\n */\n public setActive(mediaType: MediaType, active = true): void {\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n slot.active = active;\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->setActive#Set active for ${mediaType} to ${active}`\n );\n }\n\n /**\n * This method is used to set the codec parameters for the sendSlot of the given mediaType\n * @param {MediaType} mediaType MediaType of the sendSlot for which the codec parameters needs to be set (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)\n * @param {Object} codecParameters\n * @returns {Promise<void>}\n */\n public async setCodecParameters(\n mediaType: MediaType,\n codecParameters: {\n [key: string]: string | undefined; // As per ts-sdp undefined is considered as a valid value to be used for codec parameters\n }\n ): Promise<void> {\n // These codec parameter changes underneath are SDP value changes that are taken care by WCME automatically. So no need for any change in streams from the web sdk side\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n await slot.setCodecParameters(codecParameters);\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->setCodecParameters#Set codec parameters for ${mediaType} to ${codecParameters}`\n );\n }\n\n /**\n * This method is used to delete the codec parameters for the sendSlot of the given mediaType\n * @param {MediaType} mediaType MediaType of the sendSlot for which the codec parameters needs to be deleted (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)\n * @param {Array<String>} parameters Array of keys of the codec parameters to be deleted\n * @returns {Promise<void>}\n */\n public async deleteCodecParameters(mediaType: MediaType, parameters: string[]): Promise<void> {\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n await slot.deleteCodecParameters(parameters);\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->deleteCodecParameters#Deleted the following codec parameters -> ${parameters} for ${mediaType}`\n );\n }\n\n /**\n * This method is used to reset the SendSlotsManager by deleting all the sendSlots\n * @returns {undefined}\n */\n public reset(): void {\n this.slots.clear();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_internalMediaCore","require","SendSlotManager","exports","default","LoggerProxy","_classCallCheck2","_defineProperty2","_map","_createClass2","key","value","createSlot","mediaConnection","mediaType","active","arguments","length","undefined","slots","has","Error","concat","slot","createSendSlot","set","logger","info","getSlot","get","setNamedMediaGroups","namedMediaGroups","MediaType","AudioMain","setSourceStateOverride","state","VideoMain","currentStateOverride","getSourceStateOverride","sourceStateOverrides","clearSourceStateOverride","delete","_publishStream","_asyncToGenerator2","_regenerator","mark","_callee","stream","wrap","_callee$","_context","prev","next","publishStream","label","muted","stop","_x","_x2","apply","_unpublishStream","_callee2","_callee2$","_context2","unpublishStream","_x3","setActive","_setCodecParameters","_callee3","codecParameters","_callee3$","_context3","setCodecParameters","_x4","_x5","_deleteCodecParameters","_callee4","parameters","_callee4$","_context4","deleteCodecParameters","_x6","_x7","reset","clear"],"sources":["sendSlotManager.ts"],"sourcesContent":["import {\n SendSlot,\n MediaType,\n LocalStream,\n MultistreamRoapMediaConnection,\n NamedMediaGroup,\n StreamState,\n} from '@webex/internal-media-core';\n\n/**\n * This class is used to manage the sendSlots for the given media types.\n */\nexport default class SendSlotManager {\n private readonly slots: Map<MediaType, SendSlot> = new Map();\n private readonly LoggerProxy: any;\n private readonly sourceStateOverrides: Map<MediaType, StreamState> = new Map();\n\n /**\n * Constructor for SendSlotManager\n *\n * @param {any} LoggerProxy is used to log the messages\n * @constructor\n */\n constructor(LoggerProxy: any) {\n this.LoggerProxy = LoggerProxy;\n }\n\n /**\n * This method is used to create a sendSlot for the given mediaType and returns the created sendSlot\n * @param {MultistreamRoapMediaConnection} mediaConnection MultistreamRoapMediaConnection for which a sendSlot needs to be created\n * @param {MediaType} mediaType MediaType for which a sendSlot needs to be created (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)\n * @param {boolean} active This is optional boolean to set the active state of the sendSlot. Default is true\n * @returns {SendSlot} slot The created sendSlot\n */\n public createSlot(\n mediaConnection: MultistreamRoapMediaConnection,\n mediaType: MediaType,\n active = true\n ): SendSlot {\n if (this.slots.has(mediaType)) {\n throw new Error(`Slot for ${mediaType} already exists`);\n }\n\n const slot: SendSlot = mediaConnection.createSendSlot(mediaType, active);\n\n this.slots.set(mediaType, slot);\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->createSlot#Created slot for ${mediaType} with active ${active}`\n );\n\n return slot;\n }\n\n /**\n * This method is used to retrieve the sendSlot for the given mediaType\n * @param {MediaType} mediaType of which the slot needs to be retrieved\n * @returns {SendSlot}\n */\n public getSlot(mediaType: MediaType): SendSlot {\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n return slot;\n }\n\n /**\n * Allow users to specify 'namedMediaGroups' to indicate which named media group its audio should be sent to.\n * @param {MediaType} mediaType MediaType of the sendSlot to which the audio stream needs to be send to the media group\n * @param {[]}namedMediaGroups - Allow users to specify 'namedMediaGroups'.If the value of 'namedMediaGroups' is zero,\n * named media group will be canceled and the audio stream will be sent to the floor.\n * @returns {void}\n */\n public setNamedMediaGroups(mediaType: MediaType, namedMediaGroups: NamedMediaGroup[]) {\n if (mediaType !== MediaType.AudioMain) {\n throw new Error(\n `sendSlotManager cannot set named media group which media type is ${mediaType}`\n );\n }\n\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n slot.setNamedMediaGroups(namedMediaGroups);\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->setNamedMediaGroups#set named media group ${namedMediaGroups}`\n );\n }\n\n /**\n * Sets the source state override for the given media type.\n * @param {MediaType} mediaType - The type of media (must be MediaType.VideoMain to apply source state changes).\n * @param {StreamState | null} state - The state to set or null to clear the override value.\n * @returns {void}\n */\n public setSourceStateOverride(mediaType: MediaType, state: StreamState | null) {\n if (mediaType !== MediaType.VideoMain) {\n throw new Error(\n `Invalid media type '${mediaType}'. Source state overrides are only applicable to ${MediaType.VideoMain}.`\n );\n }\n\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n const currentStateOverride = this.getSourceStateOverride(mediaType);\n if (currentStateOverride === state) {\n return;\n }\n\n if (state) {\n slot.setSourceStateOverride(state);\n this.sourceStateOverrides.set(mediaType, state);\n } else {\n slot.clearSourceStateOverride();\n this.sourceStateOverrides.delete(mediaType);\n }\n\n this.LoggerProxy.logger.info(\n `SendSlotManager->setSourceStateOverride#set source state override for ${mediaType} to ${state}`\n );\n }\n\n /**\n * Gets the source state override for the given media type.\n * @param {MediaType} mediaType - The type of media to get the source state override for.\n * @returns {StreamState | null} - The current source state override or null if not set.\n */\n private getSourceStateOverride(mediaType: MediaType): StreamState | null {\n if (mediaType !== MediaType.VideoMain) {\n throw new Error(\n `Invalid media type '${mediaType}'. Source state overrides are only applicable to ${MediaType.VideoMain}.`\n );\n }\n\n return this.sourceStateOverrides.get(mediaType) || null;\n }\n\n /**\n * This method publishes the given stream to the sendSlot for the given mediaType\n * @param {MediaType} mediaType MediaType of the sendSlot to which a stream needs to be published (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)\n * @param {LocalStream} stream LocalStream to be published\n * @returns {Promise<void>}\n */\n public async publishStream(mediaType: MediaType, stream: LocalStream): Promise<void> {\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n await slot.publishStream(stream);\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->publishStream#Published stream for ${mediaType} and stream with label ${stream.label} and muted ${stream.muted}`\n );\n }\n\n /**\n * This method unpublishes the stream from the sendSlot of the given mediaType\n * @param {MediaType} mediaType MediaType of the sendSlot from which a stream needs to be unpublished (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)\n * @returns {Promise<void>}\n */\n public async unpublishStream(mediaType: MediaType): Promise<void> {\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n await slot.unpublishStream();\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->unpublishStream#Unpublished stream for ${mediaType}`\n );\n }\n\n /**\n * This method is used to set the active state of the sendSlot for the given mediaType\n * @param {MediaType} mediaType The MediaType of the sendSlot for which the active state needs to be set (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)\n * @param {boolean} active The boolean to set the active state of the sendSlot. Default is true\n * @returns {void}\n */\n public setActive(mediaType: MediaType, active = true): void {\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n slot.active = active;\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->setActive#Set active for ${mediaType} to ${active}`\n );\n }\n\n /**\n * This method is used to set the codec parameters for the sendSlot of the given mediaType\n * @param {MediaType} mediaType MediaType of the sendSlot for which the codec parameters needs to be set (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)\n * @param {Object} codecParameters\n * @returns {Promise<void>}\n */\n public async setCodecParameters(\n mediaType: MediaType,\n codecParameters: {\n [key: string]: string | undefined; // As per ts-sdp undefined is considered as a valid value to be used for codec parameters\n }\n ): Promise<void> {\n // These codec parameter changes underneath are SDP value changes that are taken care by WCME automatically. So no need for any change in streams from the web sdk side\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n await slot.setCodecParameters(codecParameters);\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->setCodecParameters#Set codec parameters for ${mediaType} to ${codecParameters}`\n );\n }\n\n /**\n * This method is used to delete the codec parameters for the sendSlot of the given mediaType\n * @param {MediaType} mediaType MediaType of the sendSlot for which the codec parameters needs to be deleted (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)\n * @param {Array<String>} parameters Array of keys of the codec parameters to be deleted\n * @returns {Promise<void>}\n */\n public async deleteCodecParameters(mediaType: MediaType, parameters: string[]): Promise<void> {\n const slot = this.slots.get(mediaType);\n\n if (!slot) {\n throw new Error(`Slot for ${mediaType} does not exist`);\n }\n\n await slot.deleteCodecParameters(parameters);\n\n this.LoggerProxy.logger.info(\n `SendSlotsManager->deleteCodecParameters#Deleted the following codec parameters -> ${parameters} for ${mediaType}`\n );\n }\n\n /**\n * This method is used to reset the SendSlotsManager by deleting all the sendSlots\n * @returns {undefined}\n */\n public reset(): void {\n this.slots.clear();\n }\n}\n"],"mappings":"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"}
@@ -180,7 +180,7 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
180
180
  }()
181
181
  /**
182
182
  * Checks if the given subnet is reachable
183
- * @param {string} mediaServerIp - media server ip
183
+ * @param {string} selectedSubnetFirstOctet - selected subnet first octet, e.g. "10" for "10.X.X.X"
184
184
  * @returns {boolean | null} true if reachable, false if not reachable, null if mediaServerIp is not provided
185
185
  * @public
186
186
  * @memberof Reachability
@@ -188,20 +188,15 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
188
188
  )
189
189
  }, {
190
190
  key: "isSubnetReachable",
191
- value: function isSubnetReachable(mediaServerIp) {
192
- if (!mediaServerIp) {
193
- _loggerProxy.default.logger.error("Reachability:index#isSubnetReachable --> mediaServerIp is null");
194
- return null;
195
- }
196
- var subnetFirstOctet = mediaServerIp.split('.')[0];
197
- _loggerProxy.default.logger.info("Reachability:index#isSubnetReachable --> Looking for subnet: ".concat(subnetFirstOctet, ".X.X.X"));
191
+ value: function isSubnetReachable(selectedSubnetFirstOctet) {
192
+ _loggerProxy.default.logger.info("Reachability:index#isSubnetReachable --> Looking for subnet: ".concat(selectedSubnetFirstOctet, ".X.X.X"));
198
193
  var matchingReachedClusters = (0, _values.default)(this.clusterReachability).reduce(function (acc, cluster) {
199
194
  var reachedSubnetsArray = (0, _from.default)(cluster.reachedSubnets);
200
195
  var logMessage = "Reachability:index#isSubnetReachable --> Cluster ".concat(cluster.name, " reached [");
201
196
  for (var i = 0; i < reachedSubnetsArray.length; i += 1) {
202
197
  var subnet = reachedSubnetsArray[i];
203
198
  var reachedSubnetFirstOctet = subnet.split('.')[0];
204
- if (subnetFirstOctet === reachedSubnetFirstOctet) {
199
+ if (selectedSubnetFirstOctet === reachedSubnetFirstOctet) {
205
200
  acc.add(cluster.name);
206
201
  }
207
202
  logMessage += "".concat(subnet);
@@ -213,7 +208,7 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
213
208
  _loggerProxy.default.logger.info(logMessage);
214
209
  return acc;
215
210
  }, new _set.default());
216
- _loggerProxy.default.logger.info("Reachability:index#isSubnetReachable --> Found ".concat(matchingReachedClusters.size, " clusters that use the subnet ").concat(subnetFirstOctet, ".X.X.X"));
211
+ _loggerProxy.default.logger.info("Reachability:index#isSubnetReachable --> Found ".concat(matchingReachedClusters.size, " clusters that use the subnet ").concat(selectedSubnetFirstOctet, ".X.X.X"));
217
212
  return matchingReachedClusters.size > 0;
218
213
  }
219
214
 
@@ -1120,10 +1115,10 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
1120
1115
  };
1121
1116
 
1122
1117
  // update expected results counters to include this cluster
1123
- _this4.expectedResultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'].udp += cluster.udp.length;
1118
+ _this4.expectedResultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'].udp += cluster.udp.length > 0 ? 1 : 0;
1124
1119
  if (!cluster.isVideoMesh) {
1125
- _this4.expectedResultsCount.public.tcp += cluster.tcp.length;
1126
- _this4.expectedResultsCount.public.xtls += cluster.xtls.length;
1120
+ _this4.expectedResultsCount.public.tcp += cluster.tcp.length > 0 ? 1 : 0;
1121
+ _this4.expectedResultsCount.public.xtls += cluster.xtls.length > 0 ? 1 : 0;
1127
1122
  }
1128
1123
  });
1129
1124
  isFirstResult = {