@webex/plugin-meetings 3.0.0-beta.15 → 3.0.0-beta.16

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 (183) hide show
  1. package/dist/common/browser-detection.js +1 -21
  2. package/dist/common/browser-detection.js.map +1 -1
  3. package/dist/common/collection.js +5 -20
  4. package/dist/common/collection.js.map +1 -1
  5. package/dist/common/config.js +0 -7
  6. package/dist/common/config.js.map +1 -1
  7. package/dist/common/errors/captcha-error.js +0 -21
  8. package/dist/common/errors/captcha-error.js.map +1 -1
  9. package/dist/common/errors/intent-to-join.js +0 -21
  10. package/dist/common/errors/intent-to-join.js.map +1 -1
  11. package/dist/common/errors/join-meeting.js +0 -21
  12. package/dist/common/errors/join-meeting.js.map +1 -1
  13. package/dist/common/errors/media.js +0 -21
  14. package/dist/common/errors/media.js.map +1 -1
  15. package/dist/common/errors/parameter.js +0 -28
  16. package/dist/common/errors/parameter.js.map +1 -1
  17. package/dist/common/errors/password-error.js +0 -21
  18. package/dist/common/errors/password-error.js.map +1 -1
  19. package/dist/common/errors/permission.js +0 -21
  20. package/dist/common/errors/permission.js.map +1 -1
  21. package/dist/common/errors/reconnection-in-progress.js +0 -17
  22. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  23. package/dist/common/errors/reconnection.js +0 -21
  24. package/dist/common/errors/reconnection.js.map +1 -1
  25. package/dist/common/errors/stats.js +0 -21
  26. package/dist/common/errors/stats.js.map +1 -1
  27. package/dist/common/errors/webex-errors.js +6 -41
  28. package/dist/common/errors/webex-errors.js.map +1 -1
  29. package/dist/common/errors/webex-meetings-error.js +1 -24
  30. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  31. package/dist/common/events/events-scope.js +0 -22
  32. package/dist/common/events/events-scope.js.map +1 -1
  33. package/dist/common/events/events.js +0 -23
  34. package/dist/common/events/events.js.map +1 -1
  35. package/dist/common/events/trigger-proxy.js +0 -12
  36. package/dist/common/events/trigger-proxy.js.map +1 -1
  37. package/dist/common/events/util.js +0 -15
  38. package/dist/common/events/util.js.map +1 -1
  39. package/dist/common/logs/logger-config.js +0 -4
  40. package/dist/common/logs/logger-config.js.map +1 -1
  41. package/dist/common/logs/logger-proxy.js +1 -8
  42. package/dist/common/logs/logger-proxy.js.map +1 -1
  43. package/dist/common/logs/request.js +35 -61
  44. package/dist/common/logs/request.js.map +1 -1
  45. package/dist/common/queue.js +4 -14
  46. package/dist/common/queue.js.map +1 -1
  47. package/dist/config.js +1 -5
  48. package/dist/config.js.map +1 -1
  49. package/dist/constants.js +45 -40
  50. package/dist/constants.js.map +1 -1
  51. package/dist/index.js +1 -17
  52. package/dist/index.js.map +1 -1
  53. package/dist/locus-info/controlsUtils.js +10 -28
  54. package/dist/locus-info/controlsUtils.js.map +1 -1
  55. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  56. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  57. package/dist/locus-info/fullState.js +0 -15
  58. package/dist/locus-info/fullState.js.map +1 -1
  59. package/dist/locus-info/hostUtils.js +4 -12
  60. package/dist/locus-info/hostUtils.js.map +1 -1
  61. package/dist/locus-info/index.js +90 -185
  62. package/dist/locus-info/index.js.map +1 -1
  63. package/dist/locus-info/infoUtils.js +0 -38
  64. package/dist/locus-info/infoUtils.js.map +1 -1
  65. package/dist/locus-info/mediaSharesUtils.js +12 -38
  66. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  67. package/dist/locus-info/parser.js +88 -125
  68. package/dist/locus-info/parser.js.map +1 -1
  69. package/dist/locus-info/selfUtils.js +15 -81
  70. package/dist/locus-info/selfUtils.js.map +1 -1
  71. package/dist/media/index.js +43 -97
  72. package/dist/media/index.js.map +1 -1
  73. package/dist/media/internal-media-core-wrapper.js +0 -4
  74. package/dist/media/internal-media-core-wrapper.js.map +1 -1
  75. package/dist/media/properties.js +64 -110
  76. package/dist/media/properties.js.map +1 -1
  77. package/dist/media/util.js +1 -8
  78. package/dist/media/util.js.map +1 -1
  79. package/dist/mediaQualityMetrics/config.js +10 -12
  80. package/dist/mediaQualityMetrics/config.js.map +1 -1
  81. package/dist/meeting/effectsState.js +119 -191
  82. package/dist/meeting/effectsState.js.map +1 -1
  83. package/dist/meeting/in-meeting-actions.js +0 -13
  84. package/dist/meeting/in-meeting-actions.js.map +1 -1
  85. package/dist/meeting/index.js +729 -1504
  86. package/dist/meeting/index.js.map +1 -1
  87. package/dist/meeting/muteState.js +30 -77
  88. package/dist/meeting/muteState.js.map +1 -1
  89. package/dist/meeting/request.js +160 -230
  90. package/dist/meeting/request.js.map +1 -1
  91. package/dist/meeting/request.type.js +0 -1
  92. package/dist/meeting/state.js +16 -26
  93. package/dist/meeting/state.js.map +1 -1
  94. package/dist/meeting/util.js +19 -158
  95. package/dist/meeting/util.js.map +1 -1
  96. package/dist/meeting-info/collection.js +3 -25
  97. package/dist/meeting-info/collection.js.map +1 -1
  98. package/dist/meeting-info/index.js +8 -31
  99. package/dist/meeting-info/index.js.map +1 -1
  100. package/dist/meeting-info/meeting-info-v2.js +131 -220
  101. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  102. package/dist/meeting-info/request.js +1 -16
  103. package/dist/meeting-info/request.js.map +1 -1
  104. package/dist/meeting-info/util.js +98 -183
  105. package/dist/meeting-info/util.js.map +1 -1
  106. package/dist/meeting-info/utilv2.js +137 -228
  107. package/dist/meeting-info/utilv2.js.map +1 -1
  108. package/dist/meetings/collection.js +3 -21
  109. package/dist/meetings/collection.js.map +1 -1
  110. package/dist/meetings/index.js +202 -335
  111. package/dist/meetings/index.js.map +1 -1
  112. package/dist/meetings/request.js +5 -28
  113. package/dist/meetings/request.js.map +1 -1
  114. package/dist/meetings/util.js +85 -141
  115. package/dist/meetings/util.js.map +1 -1
  116. package/dist/member/index.js +18 -58
  117. package/dist/member/index.js.map +1 -1
  118. package/dist/member/util.js +17 -68
  119. package/dist/member/util.js.map +1 -1
  120. package/dist/members/collection.js +2 -12
  121. package/dist/members/collection.js.map +1 -1
  122. package/dist/members/index.js +29 -151
  123. package/dist/members/index.js.map +1 -1
  124. package/dist/members/request.js +21 -56
  125. package/dist/members/request.js.map +1 -1
  126. package/dist/members/util.js +9 -38
  127. package/dist/members/util.js.map +1 -1
  128. package/dist/metrics/config.js +0 -2
  129. package/dist/metrics/config.js.map +1 -1
  130. package/dist/metrics/constants.js +1 -2
  131. package/dist/metrics/constants.js.map +1 -1
  132. package/dist/metrics/index.js +30 -121
  133. package/dist/metrics/index.js.map +1 -1
  134. package/dist/multistream/mediaRequestManager.js +12 -28
  135. package/dist/multistream/mediaRequestManager.js.map +1 -1
  136. package/dist/multistream/multistreamMedia.js +11 -22
  137. package/dist/multistream/multistreamMedia.js.map +1 -1
  138. package/dist/multistream/receiveSlot.js +7 -47
  139. package/dist/multistream/receiveSlot.js.map +1 -1
  140. package/dist/multistream/receiveSlotManager.js +37 -78
  141. package/dist/multistream/receiveSlotManager.js.map +1 -1
  142. package/dist/multistream/remoteMedia.js +11 -56
  143. package/dist/multistream/remoteMedia.js.map +1 -1
  144. package/dist/multistream/remoteMediaGroup.js +6 -40
  145. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  146. package/dist/multistream/remoteMediaManager.js +221 -380
  147. package/dist/multistream/remoteMediaManager.js.map +1 -1
  148. package/dist/networkQualityMonitor/index.js +20 -49
  149. package/dist/networkQualityMonitor/index.js.map +1 -1
  150. package/dist/personal-meeting-room/index.js +3 -38
  151. package/dist/personal-meeting-room/index.js.map +1 -1
  152. package/dist/personal-meeting-room/request.js +2 -33
  153. package/dist/personal-meeting-room/request.js.map +1 -1
  154. package/dist/personal-meeting-room/util.js +0 -13
  155. package/dist/personal-meeting-room/util.js.map +1 -1
  156. package/dist/reachability/index.js +100 -166
  157. package/dist/reachability/index.js.map +1 -1
  158. package/dist/reachability/request.js +2 -18
  159. package/dist/reachability/request.js.map +1 -1
  160. package/dist/reactions/reactions.js +0 -2
  161. package/dist/reactions/reactions.js.map +1 -1
  162. package/dist/reactions/reactions.type.js +0 -6
  163. package/dist/reactions/reactions.type.js.map +1 -1
  164. package/dist/reconnection-manager/index.js +290 -455
  165. package/dist/reconnection-manager/index.js.map +1 -1
  166. package/dist/roap/index.js +13 -48
  167. package/dist/roap/index.js.map +1 -1
  168. package/dist/roap/request.js +13 -55
  169. package/dist/roap/request.js.map +1 -1
  170. package/dist/roap/turnDiscovery.js +10 -52
  171. package/dist/roap/turnDiscovery.js.map +1 -1
  172. package/dist/statsAnalyzer/global.js +0 -2
  173. package/dist/statsAnalyzer/global.js.map +1 -1
  174. package/dist/statsAnalyzer/index.js +66 -174
  175. package/dist/statsAnalyzer/index.js.map +1 -1
  176. package/dist/statsAnalyzer/mqaUtil.js +54 -53
  177. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  178. package/dist/transcription/index.js +9 -44
  179. package/dist/transcription/index.js.map +1 -1
  180. package/package.json +18 -18
  181. package/test/integration/spec/journey.js +1 -1
  182. package/test/integration/spec/space-meeting.js +1 -1
  183. package/test/integration/spec/transcription.js +1 -1
@@ -1,72 +1,44 @@
1
1
  "use strict";
2
2
 
3
3
  var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
-
5
4
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
6
-
7
5
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
8
-
9
6
  _Object$defineProperty(exports, "__esModule", {
10
7
  value: true
11
8
  });
12
-
13
9
  exports.ReceiveSlotEvents = exports.ReceiveSlot = void 0;
14
-
15
10
  var _weakMap = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/weak-map"));
16
-
17
11
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
18
-
19
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
20
-
21
13
  var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
22
-
23
14
  var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
24
-
25
15
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
26
-
27
16
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
28
-
29
17
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
30
-
31
18
  var _classPrivateFieldGet2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classPrivateFieldGet"));
32
-
33
19
  var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classPrivateFieldSet"));
34
-
35
20
  var _internalMediaCore = require("@webex/internal-media-core");
36
-
37
21
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
38
-
39
22
  var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
40
-
41
23
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
42
-
43
24
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
44
-
45
25
  function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
46
-
47
26
  function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
48
-
49
27
  var ReceiveSlotEvents = {
50
28
  SourceUpdate: 'sourceUpdate'
51
29
  };
52
30
  exports.ReceiveSlotEvents = ReceiveSlotEvents;
53
31
  var receiveSlotCounter = 0;
54
-
55
32
  var _memberId = /*#__PURE__*/new _weakMap.default();
56
-
57
33
  var _csi = /*#__PURE__*/new _weakMap.default();
58
-
59
34
  var _sourceState = /*#__PURE__*/new _weakMap.default();
60
-
61
35
  /**
62
36
  * Class representing a receive slot. A single receive slot is able to receive a single track
63
37
  * for example some participant's main video or audio
64
38
  */
65
39
  var ReceiveSlot = /*#__PURE__*/function (_EventsScope) {
66
40
  (0, _inherits2.default)(ReceiveSlot, _EventsScope);
67
-
68
41
  var _super = _createSuper(ReceiveSlot);
69
-
70
42
  /**
71
43
  * constructor - don't use it directly, you should always use meeting.receiveSlotManager.allocateSlot()
72
44
  * to create any receive slots
@@ -77,88 +49,77 @@ var ReceiveSlot = /*#__PURE__*/function (_EventsScope) {
77
49
  */
78
50
  function ReceiveSlot(mediaType, mcReceiveSlot, findMemberIdCallback) {
79
51
  var _this;
80
-
81
52
  (0, _classCallCheck2.default)(this, ReceiveSlot);
82
53
  _this = _super.call(this);
83
54
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mcReceiveSlot", void 0);
84
55
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "findMemberIdCallback", void 0);
85
56
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "id", void 0);
86
57
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mediaType", void 0);
87
-
88
58
  _classPrivateFieldInitSpec((0, _assertThisInitialized2.default)(_this), _memberId, {
89
59
  writable: true,
90
60
  value: void 0
91
61
  });
92
-
93
62
  _classPrivateFieldInitSpec((0, _assertThisInitialized2.default)(_this), _csi, {
94
63
  writable: true,
95
64
  value: void 0
96
65
  });
97
-
98
66
  _classPrivateFieldInitSpec((0, _assertThisInitialized2.default)(_this), _sourceState, {
99
67
  writable: true,
100
68
  value: void 0
101
69
  });
102
-
103
70
  receiveSlotCounter += 1;
104
71
  _this.findMemberIdCallback = findMemberIdCallback;
105
72
  _this.mediaType = mediaType;
106
73
  _this.mcReceiveSlot = mcReceiveSlot;
107
74
  (0, _classPrivateFieldSet2.default)((0, _assertThisInitialized2.default)(_this), _sourceState, 'no source');
108
75
  _this.id = "r".concat(receiveSlotCounter);
109
-
110
76
  _this.setupEventListeners();
111
-
112
77
  return _this;
113
78
  }
79
+
114
80
  /**
115
81
  * Getter for memberId
116
82
  */
117
-
118
-
119
83
  (0, _createClass2.default)(ReceiveSlot, [{
120
84
  key: "memberId",
121
85
  get: function get() {
122
86
  return (0, _classPrivateFieldGet2.default)(this, _memberId);
123
87
  }
88
+
124
89
  /**
125
90
  * Getter for csi
126
91
  */
127
-
128
92
  }, {
129
93
  key: "csi",
130
94
  get: function get() {
131
95
  return (0, _classPrivateFieldGet2.default)(this, _csi);
132
96
  }
97
+
133
98
  /**
134
99
  * Getter for sourceState
135
100
  */
136
-
137
101
  }, {
138
102
  key: "sourceState",
139
103
  get: function get() {
140
104
  return (0, _classPrivateFieldGet2.default)(this, _sourceState);
141
105
  }
106
+
142
107
  /**
143
108
  * registers event handlers with the underlying ReceiveSlot
144
109
  */
145
-
146
110
  }, {
147
111
  key: "setupEventListeners",
148
112
  value: function setupEventListeners() {
149
113
  var _this2 = this;
150
-
151
114
  var scope = {
152
115
  file: 'meeting/receiveSlot',
153
116
  function: 'setupEventListeners'
154
117
  };
155
118
  this.mcReceiveSlot.on(_internalMediaCore.MediaConnection.ReceiveSlotEvents.SourceUpdate, function (state, csi) {
156
119
  _loggerProxy.default.logger.log("ReceiveSlot#setupEventListeners --> got source update on receive slot ".concat(_this2.id, ", mediaType=").concat(_this2.mediaType, ", csi=").concat(csi, ", state=").concat(state));
157
-
158
120
  (0, _classPrivateFieldSet2.default)(_this2, _memberId, csi ? _this2.findMemberIdCallback(csi) : undefined);
159
121
  (0, _classPrivateFieldSet2.default)(_this2, _csi, csi);
160
122
  (0, _classPrivateFieldSet2.default)(_this2, _sourceState, state);
161
-
162
123
  _this2.emit(scope, ReceiveSlotEvents.SourceUpdate, {
163
124
  state: (0, _classPrivateFieldGet2.default)(_this2, _sourceState),
164
125
  csi: (0, _classPrivateFieldGet2.default)(_this2, _csi),
@@ -166,26 +127,27 @@ var ReceiveSlot = /*#__PURE__*/function (_EventsScope) {
166
127
  });
167
128
  });
168
129
  }
130
+
169
131
  /**
170
132
  * The MediaStream object associated with this slot.
171
133
  *
172
134
  * @returns {MediaStream} The MediaStreamTrack.
173
135
  */
174
-
175
136
  }, {
176
137
  key: "stream",
177
138
  get: function get() {
178
139
  return this.mcReceiveSlot.stream;
179
140
  }
141
+
180
142
  /**
181
143
  * The underlying WCME receive slot
182
144
  */
183
-
184
145
  }, {
185
146
  key: "wcmeReceiveSlot",
186
147
  get: function get() {
187
148
  return this.mcReceiveSlot;
188
149
  }
150
+
189
151
  /**
190
152
  * Resets the source state to the default 'no source' value.
191
153
  * This function should be called on receive slots that are
@@ -193,7 +155,6 @@ var ReceiveSlot = /*#__PURE__*/function (_EventsScope) {
193
155
  * does not send any more events on such slots, so the sourceState
194
156
  * value would not represent the truth anymore.
195
157
  */
196
-
197
158
  }, {
198
159
  key: "resetSourceState",
199
160
  value: function resetSourceState() {
@@ -204,6 +165,5 @@ var ReceiveSlot = /*#__PURE__*/function (_EventsScope) {
204
165
  }]);
205
166
  return ReceiveSlot;
206
167
  }(_eventsScope.default);
207
-
208
168
  exports.ReceiveSlot = ReceiveSlot;
209
169
  //# sourceMappingURL=receiveSlot.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ReceiveSlotEvents","SourceUpdate","receiveSlotCounter","ReceiveSlot","mediaType","mcReceiveSlot","findMemberIdCallback","id","setupEventListeners","scope","file","function","on","MC","state","csi","LoggerProxy","logger","log","undefined","emit","memberId","stream","EventsScope"],"sources":["receiveSlot.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\n\nexport const ReceiveSlotEvents = {\n SourceUpdate: 'sourceUpdate',\n};\n\nexport type SourceState = MC.SourceState;\nexport type CSI = number;\nexport type MemberId = string;\nexport type ReceiveSlotId = string;\n\nlet receiveSlotCounter = 0;\n\nexport type FindMemberIdCallback = (csi: CSI) => MemberId | undefined;\n\n/**\n * Class representing a receive slot. A single receive slot is able to receive a single track\n * for example some participant's main video or audio\n */\nexport class ReceiveSlot extends EventsScope {\n private readonly mcReceiveSlot: MC.ReceiveSlot;\n\n private readonly findMemberIdCallback: FindMemberIdCallback;\n\n public readonly id: ReceiveSlotId;\n\n public readonly mediaType: MC.MediaType;\n\n #memberId?: MemberId;\n\n #csi?: CSI;\n\n #sourceState: MC.SourceState;\n\n /**\n * constructor - don't use it directly, you should always use meeting.receiveSlotManager.allocateSlot()\n * to create any receive slots\n *\n * @param {MC.MediaType} mediaType\n * @param {MC.ReceiveSlot} mcReceiveSlot\n * @param {FindMemberIdCallback} findMemberIdCallback callback for finding memberId for given CSI\n */\n constructor(\n mediaType: MC.MediaType,\n mcReceiveSlot: MC.ReceiveSlot,\n findMemberIdCallback: FindMemberIdCallback\n ) {\n super();\n\n receiveSlotCounter += 1;\n\n this.findMemberIdCallback = findMemberIdCallback;\n this.mediaType = mediaType;\n this.mcReceiveSlot = mcReceiveSlot;\n this.#sourceState = 'no source';\n this.id = `r${receiveSlotCounter}`;\n\n this.setupEventListeners();\n }\n\n /**\n * Getter for memberId\n */\n public get memberId() {\n return this.#memberId;\n }\n\n /**\n * Getter for csi\n */\n public get csi() {\n return this.#csi;\n }\n\n /**\n * Getter for sourceState\n */\n public get sourceState() {\n return this.#sourceState;\n }\n\n /**\n * registers event handlers with the underlying ReceiveSlot\n */\n setupEventListeners() {\n const scope = {\n file: 'meeting/receiveSlot',\n function: 'setupEventListeners',\n };\n\n this.mcReceiveSlot.on(\n MC.ReceiveSlotEvents.SourceUpdate,\n (state: MC.SourceState, csi?: number) => {\n LoggerProxy.logger.log(\n `ReceiveSlot#setupEventListeners --> got source update on receive slot ${this.id}, mediaType=${this.mediaType}, csi=${csi}, state=${state}`\n );\n this.#memberId = csi ? this.findMemberIdCallback(csi) : undefined;\n this.#csi = csi;\n this.#sourceState = state;\n\n this.emit(scope, ReceiveSlotEvents.SourceUpdate, {\n state: this.#sourceState,\n csi: this.#csi,\n memberId: this.#memberId,\n });\n }\n );\n }\n\n /**\n * The MediaStream object associated with this slot.\n *\n * @returns {MediaStream} The MediaStreamTrack.\n */\n get stream(): MediaStream {\n return this.mcReceiveSlot.stream;\n }\n\n /**\n * The underlying WCME receive slot\n */\n get wcmeReceiveSlot(): MC.ReceiveSlot {\n return this.mcReceiveSlot;\n }\n\n /**\n * Resets the source state to the default 'no source' value.\n * This function should be called on receive slots that are\n * no longer part of a media request. It's needed because WCME\n * does not send any more events on such slots, so the sourceState\n * value would not represent the truth anymore.\n */\n public resetSourceState() {\n this.#sourceState = 'no source';\n this.#csi = undefined;\n this.#memberId = undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;;AAEA;;AACA;;;;;;;;;;AAEO,IAAMA,iBAAiB,GAAG;EAC/BC,YAAY,EAAE;AADiB,CAA1B;;AASP,IAAIC,kBAAkB,GAAG,CAAzB;;;;;;;;AAIA;AACA;AACA;AACA;IACaC,W;;;;;EAeX;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,qBACEC,SADF,EAEEC,aAFF,EAGEC,oBAHF,EAIE;IAAA;;IAAA;IACA;IADA;IAAA;IAAA;IAAA;;IAAA;MAAA;MAAA;IAAA;;IAAA;MAAA;MAAA;IAAA;;IAAA;MAAA;MAAA;IAAA;;IAGAJ,kBAAkB,IAAI,CAAtB;IAEA,MAAKI,oBAAL,GAA4BA,oBAA5B;IACA,MAAKF,SAAL,GAAiBA,SAAjB;IACA,MAAKC,aAAL,GAAqBA,aAArB;IACA,+FAAoB,WAApB;IACA,MAAKE,EAAL,cAAcL,kBAAd;;IAEA,MAAKM,mBAAL;;IAXA;EAYD;EAED;AACF;AACA;;;;;SACE,eAAsB;MACpB,2CAAO,IAAP;IACD;IAED;AACF;AACA;;;;SACE,eAAiB;MACf,2CAAO,IAAP;IACD;IAED;AACF;AACA;;;;SACE,eAAyB;MACvB,2CAAO,IAAP;IACD;IAED;AACF;AACA;;;;WACE,+BAAsB;MAAA;;MACpB,IAAMC,KAAK,GAAG;QACZC,IAAI,EAAE,qBADM;QAEZC,QAAQ,EAAE;MAFE,CAAd;MAKA,KAAKN,aAAL,CAAmBO,EAAnB,CACEC,kCAAA,CAAGb,iBAAH,CAAqBC,YADvB,EAEE,UAACa,KAAD,EAAwBC,GAAxB,EAAyC;QACvCC,oBAAA,CAAYC,MAAZ,CAAmBC,GAAnB,iFAC2E,MAAI,CAACX,EADhF,yBACiG,MAAI,CAACH,SADtG,mBACwHW,GADxH,qBACsID,KADtI;;QAGA,0CAAI,aAAaC,GAAG,GAAG,MAAI,CAACT,oBAAL,CAA0BS,GAA1B,CAAH,GAAoCI,SAApD,CAAJ;QACA,0CAAI,QAAQJ,GAAR,CAAJ;QACA,0CAAI,gBAAgBD,KAAhB,CAAJ;;QAEA,MAAI,CAACM,IAAL,CAAUX,KAAV,EAAiBT,iBAAiB,CAACC,YAAnC,EAAiD;UAC/Ca,KAAK,sCAAE,MAAF,eAD0C;UAE/CC,GAAG,sCAAE,MAAF,OAF4C;UAG/CM,QAAQ,sCAAE,MAAF;QAHuC,CAAjD;MAKD,CAfH;IAiBD;IAED;AACF;AACA;AACA;AACA;;;;SACE,eAA0B;MACxB,OAAO,KAAKhB,aAAL,CAAmBiB,MAA1B;IACD;IAED;AACF;AACA;;;;SACE,eAAsC;MACpC,OAAO,KAAKjB,aAAZ;IACD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,4BAA0B;MACxB,wDAAoB,WAApB;MACA,gDAAYc,SAAZ;MACA,qDAAiBA,SAAjB;IACD;;;EArH8BI,oB"}
1
+ {"version":3,"names":["ReceiveSlotEvents","SourceUpdate","receiveSlotCounter","ReceiveSlot","mediaType","mcReceiveSlot","findMemberIdCallback","id","setupEventListeners","scope","file","function","on","MC","state","csi","LoggerProxy","logger","log","undefined","emit","memberId","stream","EventsScope"],"sources":["receiveSlot.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\n\nexport const ReceiveSlotEvents = {\n SourceUpdate: 'sourceUpdate',\n};\n\nexport type SourceState = MC.SourceState;\nexport type CSI = number;\nexport type MemberId = string;\nexport type ReceiveSlotId = string;\n\nlet receiveSlotCounter = 0;\n\nexport type FindMemberIdCallback = (csi: CSI) => MemberId | undefined;\n\n/**\n * Class representing a receive slot. A single receive slot is able to receive a single track\n * for example some participant's main video or audio\n */\nexport class ReceiveSlot extends EventsScope {\n private readonly mcReceiveSlot: MC.ReceiveSlot;\n\n private readonly findMemberIdCallback: FindMemberIdCallback;\n\n public readonly id: ReceiveSlotId;\n\n public readonly mediaType: MC.MediaType;\n\n #memberId?: MemberId;\n\n #csi?: CSI;\n\n #sourceState: MC.SourceState;\n\n /**\n * constructor - don't use it directly, you should always use meeting.receiveSlotManager.allocateSlot()\n * to create any receive slots\n *\n * @param {MC.MediaType} mediaType\n * @param {MC.ReceiveSlot} mcReceiveSlot\n * @param {FindMemberIdCallback} findMemberIdCallback callback for finding memberId for given CSI\n */\n constructor(\n mediaType: MC.MediaType,\n mcReceiveSlot: MC.ReceiveSlot,\n findMemberIdCallback: FindMemberIdCallback\n ) {\n super();\n\n receiveSlotCounter += 1;\n\n this.findMemberIdCallback = findMemberIdCallback;\n this.mediaType = mediaType;\n this.mcReceiveSlot = mcReceiveSlot;\n this.#sourceState = 'no source';\n this.id = `r${receiveSlotCounter}`;\n\n this.setupEventListeners();\n }\n\n /**\n * Getter for memberId\n */\n public get memberId() {\n return this.#memberId;\n }\n\n /**\n * Getter for csi\n */\n public get csi() {\n return this.#csi;\n }\n\n /**\n * Getter for sourceState\n */\n public get sourceState() {\n return this.#sourceState;\n }\n\n /**\n * registers event handlers with the underlying ReceiveSlot\n */\n setupEventListeners() {\n const scope = {\n file: 'meeting/receiveSlot',\n function: 'setupEventListeners',\n };\n\n this.mcReceiveSlot.on(\n MC.ReceiveSlotEvents.SourceUpdate,\n (state: MC.SourceState, csi?: number) => {\n LoggerProxy.logger.log(\n `ReceiveSlot#setupEventListeners --> got source update on receive slot ${this.id}, mediaType=${this.mediaType}, csi=${csi}, state=${state}`\n );\n this.#memberId = csi ? this.findMemberIdCallback(csi) : undefined;\n this.#csi = csi;\n this.#sourceState = state;\n\n this.emit(scope, ReceiveSlotEvents.SourceUpdate, {\n state: this.#sourceState,\n csi: this.#csi,\n memberId: this.#memberId,\n });\n }\n );\n }\n\n /**\n * The MediaStream object associated with this slot.\n *\n * @returns {MediaStream} The MediaStreamTrack.\n */\n get stream(): MediaStream {\n return this.mcReceiveSlot.stream;\n }\n\n /**\n * The underlying WCME receive slot\n */\n get wcmeReceiveSlot(): MC.ReceiveSlot {\n return this.mcReceiveSlot;\n }\n\n /**\n * Resets the source state to the default 'no source' value.\n * This function should be called on receive slots that are\n * no longer part of a media request. It's needed because WCME\n * does not send any more events on such slots, so the sourceState\n * value would not represent the truth anymore.\n */\n public resetSourceState() {\n this.#sourceState = 'no source';\n this.#csi = undefined;\n this.#memberId = undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AACA;AAEA;AACA;AAAwD;AAAA;AAAA;AAAA;AAEjD,IAAMA,iBAAiB,GAAG;EAC/BC,YAAY,EAAE;AAChB,CAAC;AAAC;AAOF,IAAIC,kBAAkB,GAAG,CAAC;AAAC;AAAA;AAAA;AAI3B;AACA;AACA;AACA;AAHA,IAIaC,WAAW;EAAA;EAAA;EAetB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,qBACEC,SAAuB,EACvBC,aAA6B,EAC7BC,oBAA0C,EAC1C;IAAA;IAAA;IACA;IAAQ;IAAA;IAAA;IAAA;IAAA;MAAA;MAAA;IAAA;IAAA;MAAA;MAAA;IAAA;IAAA;MAAA;MAAA;IAAA;IAERJ,kBAAkB,IAAI,CAAC;IAEvB,MAAKI,oBAAoB,GAAGA,oBAAoB;IAChD,MAAKF,SAAS,GAAGA,SAAS;IAC1B,MAAKC,aAAa,GAAGA,aAAa;IAClC,+FAAoB,WAAW;IAC/B,MAAKE,EAAE,cAAOL,kBAAkB,CAAE;IAElC,MAAKM,mBAAmB,EAAE;IAAC;EAC7B;;EAEA;AACF;AACA;EAFE;IAAA;IAAA,KAGA,eAAsB;MACpB,2CAAO,IAAI;IACb;;IAEA;AACF;AACA;EAFE;IAAA;IAAA,KAGA,eAAiB;MACf,2CAAO,IAAI;IACb;;IAEA;AACF;AACA;EAFE;IAAA;IAAA,KAGA,eAAyB;MACvB,2CAAO,IAAI;IACb;;IAEA;AACF;AACA;EAFE;IAAA;IAAA,OAGA,+BAAsB;MAAA;MACpB,IAAMC,KAAK,GAAG;QACZC,IAAI,EAAE,qBAAqB;QAC3BC,QAAQ,EAAE;MACZ,CAAC;MAED,IAAI,CAACN,aAAa,CAACO,EAAE,CACnBC,kCAAE,CAACb,iBAAiB,CAACC,YAAY,EACjC,UAACa,KAAqB,EAAEC,GAAY,EAAK;QACvCC,oBAAW,CAACC,MAAM,CAACC,GAAG,iFACqD,MAAI,CAACX,EAAE,yBAAe,MAAI,CAACH,SAAS,mBAASW,GAAG,qBAAWD,KAAK,EAC1I;QACD,0CAAI,aAAaC,GAAG,GAAG,MAAI,CAACT,oBAAoB,CAACS,GAAG,CAAC,GAAGI,SAAS;QACjE,0CAAI,QAAQJ,GAAG;QACf,0CAAI,gBAAgBD,KAAK;QAEzB,MAAI,CAACM,IAAI,CAACX,KAAK,EAAET,iBAAiB,CAACC,YAAY,EAAE;UAC/Ca,KAAK,sCAAE,MAAI,eAAa;UACxBC,GAAG,sCAAE,MAAI,OAAK;UACdM,QAAQ,sCAAE,MAAI;QAChB,CAAC,CAAC;MACJ,CAAC,CACF;IACH;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,KAKA,eAA0B;MACxB,OAAO,IAAI,CAAChB,aAAa,CAACiB,MAAM;IAClC;;IAEA;AACF;AACA;EAFE;IAAA;IAAA,KAGA,eAAsC;MACpC,OAAO,IAAI,CAACjB,aAAa;IAC3B;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,4BAA0B;MACxB,wCAAI,gBAAgB,WAAW;MAC/B,wCAAI,QAAQc,SAAS;MACrB,wCAAI,aAAaA,SAAS;IAC5B;EAAC;EAAA;AAAA,EArH8BI,oBAAW;AAAA"}
@@ -1,39 +1,23 @@
1
1
  "use strict";
2
2
 
3
3
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
-
5
4
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
-
7
5
  _Object$defineProperty(exports, "__esModule", {
8
6
  value: true
9
7
  });
10
-
11
8
  exports.ReceiveSlotManager = void 0;
12
-
13
9
  var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
14
-
15
10
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
16
-
17
11
  var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
18
-
19
12
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
20
-
21
13
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
22
-
23
14
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
24
-
25
15
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
26
-
27
16
  var _internalMediaCore = require("@webex/internal-media-core");
28
-
29
17
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
30
-
31
18
  var _receiveSlot = require("./receiveSlot");
32
-
33
19
  /* eslint-disable valid-jsdoc */
34
-
35
20
  /* eslint-disable import/prefer-default-export */
36
-
37
21
  /**
38
22
  * Manages all receive slots used by a meeting. WMCE receive slots cannot be ever deleted,
39
23
  * so this manager has a pool in order to re-use the slots that were released earlier.
@@ -45,7 +29,6 @@ var ReceiveSlotManager = /*#__PURE__*/function () {
45
29
  */
46
30
  function ReceiveSlotManager(meeting) {
47
31
  var _this$allocatedSlots, _this$freeSlots;
48
-
49
32
  (0, _classCallCheck2.default)(this, ReceiveSlotManager);
50
33
  (0, _defineProperty2.default)(this, "allocatedSlots", void 0);
51
34
  (0, _defineProperty2.default)(this, "freeSlots", void 0);
@@ -54,124 +37,101 @@ var ReceiveSlotManager = /*#__PURE__*/function () {
54
37
  this.freeSlots = (_this$freeSlots = {}, (0, _defineProperty2.default)(_this$freeSlots, _internalMediaCore.MediaConnection.MediaType.AudioMain, []), (0, _defineProperty2.default)(_this$freeSlots, _internalMediaCore.MediaConnection.MediaType.VideoMain, []), (0, _defineProperty2.default)(_this$freeSlots, _internalMediaCore.MediaConnection.MediaType.AudioSlides, []), (0, _defineProperty2.default)(_this$freeSlots, _internalMediaCore.MediaConnection.MediaType.VideoSlides, []), _this$freeSlots);
55
38
  this.meeting = meeting;
56
39
  }
40
+
57
41
  /**
58
42
  * Creates a new receive slot or returns one from the existing pool of free slots
59
43
  *
60
44
  * @param {MC.MediaType} mediaType
61
45
  * @returns {Promise<ReceiveSlot>}
62
46
  */
63
-
64
-
65
47
  (0, _createClass2.default)(ReceiveSlotManager, [{
66
48
  key: "allocateSlot",
67
49
  value: function () {
68
50
  var _allocateSlot = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(mediaType) {
69
51
  var _this$meeting,
70
- _this$meeting$mediaPr,
71
- _this = this;
72
-
52
+ _this$meeting$mediaPr,
53
+ _this = this;
73
54
  var availableSlot, wcmeReceiveSlot, receiveSlot;
74
55
  return _regenerator.default.wrap(function _callee$(_context) {
75
- while (1) {
76
- switch (_context.prev = _context.next) {
77
- case 0:
78
- if ((_this$meeting = this.meeting) !== null && _this$meeting !== void 0 && (_this$meeting$mediaPr = _this$meeting.mediaProperties) !== null && _this$meeting$mediaPr !== void 0 && _this$meeting$mediaPr.webrtcMediaConnection) {
79
- _context.next = 2;
80
- break;
81
- }
82
-
83
- return _context.abrupt("return", _promise.default.reject(new Error('Webrtc media connection is missing')));
84
-
85
- case 2:
86
- // try to use one of the free ones
87
- availableSlot = this.freeSlots[mediaType].pop();
88
-
89
- if (!availableSlot) {
90
- _context.next = 7;
91
- break;
92
- }
93
-
94
- this.allocatedSlots[mediaType].push(availableSlot);
95
-
96
- _loggerProxy.default.logger.log("receive slot re-used: ".concat(availableSlot.id));
97
-
98
- return _context.abrupt("return", availableSlot);
99
-
100
- case 7:
101
- _context.next = 9;
102
- return this.meeting.mediaProperties.webrtcMediaConnection.createReceiveSlot(mediaType);
103
-
104
- case 9:
105
- wcmeReceiveSlot = _context.sent;
106
- receiveSlot = new _receiveSlot.ReceiveSlot(mediaType, wcmeReceiveSlot, function (csi) {
107
- var _this$meeting$members;
108
-
109
- return (_this$meeting$members = _this.meeting.members.findMemberByCsi(csi)) === null || _this$meeting$members === void 0 ? void 0 : _this$meeting$members.id;
110
- });
111
- this.allocatedSlots[mediaType].push(receiveSlot);
112
-
113
- _loggerProxy.default.logger.log("new receive slot allocated: ".concat(receiveSlot.id));
114
-
115
- return _context.abrupt("return", receiveSlot);
116
-
117
- case 14:
118
- case "end":
119
- return _context.stop();
120
- }
56
+ while (1) switch (_context.prev = _context.next) {
57
+ case 0:
58
+ if ((_this$meeting = this.meeting) !== null && _this$meeting !== void 0 && (_this$meeting$mediaPr = _this$meeting.mediaProperties) !== null && _this$meeting$mediaPr !== void 0 && _this$meeting$mediaPr.webrtcMediaConnection) {
59
+ _context.next = 2;
60
+ break;
61
+ }
62
+ return _context.abrupt("return", _promise.default.reject(new Error('Webrtc media connection is missing')));
63
+ case 2:
64
+ // try to use one of the free ones
65
+ availableSlot = this.freeSlots[mediaType].pop();
66
+ if (!availableSlot) {
67
+ _context.next = 7;
68
+ break;
69
+ }
70
+ this.allocatedSlots[mediaType].push(availableSlot);
71
+ _loggerProxy.default.logger.log("receive slot re-used: ".concat(availableSlot.id));
72
+ return _context.abrupt("return", availableSlot);
73
+ case 7:
74
+ _context.next = 9;
75
+ return this.meeting.mediaProperties.webrtcMediaConnection.createReceiveSlot(mediaType);
76
+ case 9:
77
+ wcmeReceiveSlot = _context.sent;
78
+ receiveSlot = new _receiveSlot.ReceiveSlot(mediaType, wcmeReceiveSlot, function (csi) {
79
+ var _this$meeting$members;
80
+ return (_this$meeting$members = _this.meeting.members.findMemberByCsi(csi)) === null || _this$meeting$members === void 0 ? void 0 : _this$meeting$members.id;
81
+ });
82
+ this.allocatedSlots[mediaType].push(receiveSlot);
83
+ _loggerProxy.default.logger.log("new receive slot allocated: ".concat(receiveSlot.id));
84
+ return _context.abrupt("return", receiveSlot);
85
+ case 14:
86
+ case "end":
87
+ return _context.stop();
121
88
  }
122
89
  }, _callee, this);
123
90
  }));
124
-
125
91
  function allocateSlot(_x) {
126
92
  return _allocateSlot.apply(this, arguments);
127
93
  }
128
-
129
94
  return allocateSlot;
130
95
  }()
131
96
  /**
132
97
  * Releases the slot back to the pool so it can be re-used by others in the future
133
98
  * @param {ReceiveSlot} slot
134
99
  */
135
-
136
100
  }, {
137
101
  key: "releaseSlot",
138
102
  value: function releaseSlot(slot) {
139
103
  var idx = this.allocatedSlots[slot.mediaType].findIndex(function (allocatedSlot) {
140
104
  return allocatedSlot === slot;
141
105
  });
142
-
143
106
  if (idx >= 0) {
144
107
  this.allocatedSlots[slot.mediaType].splice(idx, 1);
145
108
  this.freeSlots[slot.mediaType].push(slot);
146
-
147
109
  _loggerProxy.default.logger.log("receive slot released: ".concat(slot.id));
148
110
  } else {
149
111
  _loggerProxy.default.logger.warn('ReceiveSlotManager#releaseSlot --> trying to release a slot that is not managed by this ReceiveSlotManager');
150
112
  }
151
113
  }
114
+
152
115
  /**
153
116
  * Resets the slot manager - this method should be called when the media connection is torn down
154
117
  */
155
-
156
118
  }, {
157
119
  key: "reset",
158
120
  value: function reset() {
159
121
  var _this$allocatedSlots2, _this$freeSlots2;
160
-
161
122
  this.allocatedSlots = (_this$allocatedSlots2 = {}, (0, _defineProperty2.default)(_this$allocatedSlots2, _internalMediaCore.MediaConnection.MediaType.AudioMain, []), (0, _defineProperty2.default)(_this$allocatedSlots2, _internalMediaCore.MediaConnection.MediaType.VideoMain, []), (0, _defineProperty2.default)(_this$allocatedSlots2, _internalMediaCore.MediaConnection.MediaType.AudioSlides, []), (0, _defineProperty2.default)(_this$allocatedSlots2, _internalMediaCore.MediaConnection.MediaType.VideoSlides, []), _this$allocatedSlots2);
162
123
  this.freeSlots = (_this$freeSlots2 = {}, (0, _defineProperty2.default)(_this$freeSlots2, _internalMediaCore.MediaConnection.MediaType.AudioMain, []), (0, _defineProperty2.default)(_this$freeSlots2, _internalMediaCore.MediaConnection.MediaType.VideoMain, []), (0, _defineProperty2.default)(_this$freeSlots2, _internalMediaCore.MediaConnection.MediaType.AudioSlides, []), (0, _defineProperty2.default)(_this$freeSlots2, _internalMediaCore.MediaConnection.MediaType.VideoSlides, []), _this$freeSlots2);
163
124
  }
125
+
164
126
  /**
165
127
  * Returns statistics about the managed slots
166
128
  *
167
129
  * @returns {Object}
168
130
  */
169
-
170
131
  }, {
171
132
  key: "getStats",
172
133
  value: function getStats() {
173
134
  var _this2 = this;
174
-
175
135
  var numAllocatedSlots = {};
176
136
  var numFreeSlots = {};
177
137
  (0, _keys.default)(this.allocatedSlots).forEach(function (key) {
@@ -192,6 +152,5 @@ var ReceiveSlotManager = /*#__PURE__*/function () {
192
152
  }]);
193
153
  return ReceiveSlotManager;
194
154
  }();
195
-
196
155
  exports.ReceiveSlotManager = ReceiveSlotManager;
197
156
  //# sourceMappingURL=receiveSlotManager.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ReceiveSlotManager","meeting","allocatedSlots","MC","MediaType","AudioMain","VideoMain","AudioSlides","VideoSlides","freeSlots","mediaType","mediaProperties","webrtcMediaConnection","reject","Error","availableSlot","pop","push","LoggerProxy","logger","log","id","createReceiveSlot","wcmeReceiveSlot","receiveSlot","ReceiveSlot","csi","members","findMemberByCsi","slot","idx","findIndex","allocatedSlot","splice","warn","numAllocatedSlots","numFreeSlots","forEach","key","length"],"sources":["receiveSlotManager.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\n/* eslint-disable import/prefer-default-export */\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Meeting from '../meeting';\n\nimport {CSI, ReceiveSlot} from './receiveSlot';\n\n/**\n * Manages all receive slots used by a meeting. WMCE receive slots cannot be ever deleted,\n * so this manager has a pool in order to re-use the slots that were released earlier.\n */\nexport class ReceiveSlotManager {\n private allocatedSlots: {[key in MC.MediaType]: ReceiveSlot[]};\n\n private freeSlots: {[key in MC.MediaType]: ReceiveSlot[]};\n\n private meeting: Meeting;\n\n /**\n * Constructor\n * @param {Meeting} meeting\n */\n constructor(meeting) {\n this.allocatedSlots = {\n [MC.MediaType.AudioMain]: [],\n [MC.MediaType.VideoMain]: [],\n [MC.MediaType.AudioSlides]: [],\n [MC.MediaType.VideoSlides]: [],\n };\n this.freeSlots = {\n [MC.MediaType.AudioMain]: [],\n [MC.MediaType.VideoMain]: [],\n [MC.MediaType.AudioSlides]: [],\n [MC.MediaType.VideoSlides]: [],\n };\n this.meeting = meeting;\n }\n\n /**\n * Creates a new receive slot or returns one from the existing pool of free slots\n *\n * @param {MC.MediaType} mediaType\n * @returns {Promise<ReceiveSlot>}\n */\n async allocateSlot(mediaType: MC.MediaType): Promise<ReceiveSlot> {\n if (!this.meeting?.mediaProperties?.webrtcMediaConnection) {\n return Promise.reject(new Error('Webrtc media connection is missing'));\n }\n\n // try to use one of the free ones\n const availableSlot = this.freeSlots[mediaType].pop();\n\n if (availableSlot) {\n this.allocatedSlots[mediaType].push(availableSlot);\n\n LoggerProxy.logger.log(`receive slot re-used: ${availableSlot.id}`);\n\n return availableSlot;\n }\n\n // we have to create a new one\n const wcmeReceiveSlot =\n await this.meeting.mediaProperties.webrtcMediaConnection.createReceiveSlot(mediaType);\n\n const receiveSlot = new ReceiveSlot(\n mediaType,\n wcmeReceiveSlot,\n (csi: CSI) => this.meeting.members.findMemberByCsi(csi)?.id\n );\n\n this.allocatedSlots[mediaType].push(receiveSlot);\n LoggerProxy.logger.log(`new receive slot allocated: ${receiveSlot.id}`);\n\n return receiveSlot;\n }\n\n /**\n * Releases the slot back to the pool so it can be re-used by others in the future\n * @param {ReceiveSlot} slot\n */\n releaseSlot(slot: ReceiveSlot) {\n const idx = this.allocatedSlots[slot.mediaType].findIndex(\n (allocatedSlot) => allocatedSlot === slot\n );\n\n if (idx >= 0) {\n this.allocatedSlots[slot.mediaType].splice(idx, 1);\n this.freeSlots[slot.mediaType].push(slot);\n LoggerProxy.logger.log(`receive slot released: ${slot.id}`);\n } else {\n LoggerProxy.logger.warn(\n 'ReceiveSlotManager#releaseSlot --> trying to release a slot that is not managed by this ReceiveSlotManager'\n );\n }\n }\n\n /**\n * Resets the slot manager - this method should be called when the media connection is torn down\n */\n reset() {\n this.allocatedSlots = {\n [MC.MediaType.AudioMain]: [],\n [MC.MediaType.VideoMain]: [],\n [MC.MediaType.AudioSlides]: [],\n [MC.MediaType.VideoSlides]: [],\n };\n this.freeSlots = {\n [MC.MediaType.AudioMain]: [],\n [MC.MediaType.VideoMain]: [],\n [MC.MediaType.AudioSlides]: [],\n [MC.MediaType.VideoSlides]: [],\n };\n }\n\n /**\n * Returns statistics about the managed slots\n *\n * @returns {Object}\n */\n getStats() {\n const numAllocatedSlots = {};\n const numFreeSlots = {};\n\n Object.keys(this.allocatedSlots).forEach((key) => {\n if (this.allocatedSlots[key].length > 0) {\n numAllocatedSlots[key] = this.allocatedSlots[key].length;\n }\n });\n\n Object.keys(this.freeSlots).forEach((key) => {\n if (this.freeSlots[key].length > 0) {\n numFreeSlots[key] = this.freeSlots[key].length;\n }\n });\n\n return {\n numAllocatedSlots,\n numFreeSlots,\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["ReceiveSlotManager","meeting","allocatedSlots","MC","MediaType","AudioMain","VideoMain","AudioSlides","VideoSlides","freeSlots","mediaType","mediaProperties","webrtcMediaConnection","reject","Error","availableSlot","pop","push","LoggerProxy","logger","log","id","createReceiveSlot","wcmeReceiveSlot","receiveSlot","ReceiveSlot","csi","members","findMemberByCsi","slot","idx","findIndex","allocatedSlot","splice","warn","numAllocatedSlots","numFreeSlots","forEach","key","length"],"sources":["receiveSlotManager.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\n/* eslint-disable import/prefer-default-export */\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Meeting from '../meeting';\n\nimport {CSI, ReceiveSlot} from './receiveSlot';\n\n/**\n * Manages all receive slots used by a meeting. WMCE receive slots cannot be ever deleted,\n * so this manager has a pool in order to re-use the slots that were released earlier.\n */\nexport class ReceiveSlotManager {\n private allocatedSlots: {[key in MC.MediaType]: ReceiveSlot[]};\n\n private freeSlots: {[key in MC.MediaType]: ReceiveSlot[]};\n\n private meeting: Meeting;\n\n /**\n * Constructor\n * @param {Meeting} meeting\n */\n constructor(meeting) {\n this.allocatedSlots = {\n [MC.MediaType.AudioMain]: [],\n [MC.MediaType.VideoMain]: [],\n [MC.MediaType.AudioSlides]: [],\n [MC.MediaType.VideoSlides]: [],\n };\n this.freeSlots = {\n [MC.MediaType.AudioMain]: [],\n [MC.MediaType.VideoMain]: [],\n [MC.MediaType.AudioSlides]: [],\n [MC.MediaType.VideoSlides]: [],\n };\n this.meeting = meeting;\n }\n\n /**\n * Creates a new receive slot or returns one from the existing pool of free slots\n *\n * @param {MC.MediaType} mediaType\n * @returns {Promise<ReceiveSlot>}\n */\n async allocateSlot(mediaType: MC.MediaType): Promise<ReceiveSlot> {\n if (!this.meeting?.mediaProperties?.webrtcMediaConnection) {\n return Promise.reject(new Error('Webrtc media connection is missing'));\n }\n\n // try to use one of the free ones\n const availableSlot = this.freeSlots[mediaType].pop();\n\n if (availableSlot) {\n this.allocatedSlots[mediaType].push(availableSlot);\n\n LoggerProxy.logger.log(`receive slot re-used: ${availableSlot.id}`);\n\n return availableSlot;\n }\n\n // we have to create a new one\n const wcmeReceiveSlot =\n await this.meeting.mediaProperties.webrtcMediaConnection.createReceiveSlot(mediaType);\n\n const receiveSlot = new ReceiveSlot(\n mediaType,\n wcmeReceiveSlot,\n (csi: CSI) => this.meeting.members.findMemberByCsi(csi)?.id\n );\n\n this.allocatedSlots[mediaType].push(receiveSlot);\n LoggerProxy.logger.log(`new receive slot allocated: ${receiveSlot.id}`);\n\n return receiveSlot;\n }\n\n /**\n * Releases the slot back to the pool so it can be re-used by others in the future\n * @param {ReceiveSlot} slot\n */\n releaseSlot(slot: ReceiveSlot) {\n const idx = this.allocatedSlots[slot.mediaType].findIndex(\n (allocatedSlot) => allocatedSlot === slot\n );\n\n if (idx >= 0) {\n this.allocatedSlots[slot.mediaType].splice(idx, 1);\n this.freeSlots[slot.mediaType].push(slot);\n LoggerProxy.logger.log(`receive slot released: ${slot.id}`);\n } else {\n LoggerProxy.logger.warn(\n 'ReceiveSlotManager#releaseSlot --> trying to release a slot that is not managed by this ReceiveSlotManager'\n );\n }\n }\n\n /**\n * Resets the slot manager - this method should be called when the media connection is torn down\n */\n reset() {\n this.allocatedSlots = {\n [MC.MediaType.AudioMain]: [],\n [MC.MediaType.VideoMain]: [],\n [MC.MediaType.AudioSlides]: [],\n [MC.MediaType.VideoSlides]: [],\n };\n this.freeSlots = {\n [MC.MediaType.AudioMain]: [],\n [MC.MediaType.VideoMain]: [],\n [MC.MediaType.AudioSlides]: [],\n [MC.MediaType.VideoSlides]: [],\n };\n }\n\n /**\n * Returns statistics about the managed slots\n *\n * @returns {Object}\n */\n getStats() {\n const numAllocatedSlots = {};\n const numFreeSlots = {};\n\n Object.keys(this.allocatedSlots).forEach((key) => {\n if (this.allocatedSlots[key].length > 0) {\n numAllocatedSlots[key] = this.allocatedSlots[key].length;\n }\n });\n\n Object.keys(this.freeSlots).forEach((key) => {\n if (this.freeSlots[key].length > 0) {\n numFreeSlots[key] = this.freeSlots[key].length;\n }\n });\n\n return {\n numAllocatedSlots,\n numFreeSlots,\n };\n }\n}\n"],"mappings":"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"}