@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.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.
- package/dist/common/errors/webex-errors.js +5 -29
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/constants.js +15 -74
- package/dist/constants.js.map +1 -1
- package/dist/media/index.js +68 -213
- package/dist/media/index.js.map +1 -1
- package/dist/media/internal-media-core-wrapper.js +22 -0
- package/dist/media/internal-media-core-wrapper.js.map +1 -0
- package/dist/media/properties.js +20 -25
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +0 -27
- package/dist/media/util.js.map +1 -1
- package/dist/meeting/index.js +694 -432
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/request.js +1 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +3 -44
- package/dist/meeting/util.js.map +1 -1
- package/dist/meetings/index.js +64 -5
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/util.js +24 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/members/index.js +68 -0
- package/dist/members/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +132 -0
- package/dist/multistream/mediaRequestManager.js.map +1 -0
- package/dist/multistream/multistreamMedia.js +116 -0
- package/dist/multistream/multistreamMedia.js.map +1 -0
- package/dist/multistream/receiveSlot.js +209 -0
- package/dist/multistream/receiveSlot.js.map +1 -0
- package/dist/multistream/receiveSlotManager.js +195 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -0
- package/dist/multistream/remoteMedia.js +284 -0
- package/dist/multistream/remoteMedia.js.map +1 -0
- package/dist/multistream/remoteMediaGroup.js +243 -0
- package/dist/multistream/remoteMediaGroup.js.map +1 -0
- package/dist/multistream/remoteMediaManager.js +1113 -0
- package/dist/multistream/remoteMediaManager.js.map +1 -0
- package/dist/reconnection-manager/index.js +109 -130
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.js +57 -240
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +2 -114
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +11 -5
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +2 -0
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +39 -36
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/package.json +20 -19
- package/src/common/errors/webex-errors.js +0 -18
- package/src/constants.ts +139 -180
- package/src/media/index.js +60 -194
- package/src/media/internal-media-core-wrapper.ts +9 -0
- package/src/media/properties.js +19 -25
- package/src/media/util.js +0 -22
- package/src/meeting/index.js +565 -320
- package/src/meeting/request.js +1 -0
- package/src/meeting/util.js +3 -46
- package/src/meetings/index.js +30 -1
- package/src/meetings/util.js +23 -2
- package/src/members/index.js +48 -0
- package/src/multistream/mediaRequestManager.ts +164 -0
- package/src/multistream/multistreamMedia.ts +92 -0
- package/src/multistream/receiveSlot.ts +141 -0
- package/src/multistream/receiveSlotManager.ts +142 -0
- package/src/multistream/remoteMedia.ts +219 -0
- package/src/multistream/remoteMediaGroup.ts +224 -0
- package/src/multistream/remoteMediaManager.ts +911 -0
- package/src/reconnection-manager/index.js +40 -53
- package/src/roap/index.js +47 -207
- package/src/roap/request.js +1 -72
- package/src/roap/turnDiscovery.ts +12 -6
- package/src/statsAnalyzer/global.js +2 -0
- package/src/statsAnalyzer/index.js +32 -46
- package/test/integration/spec/journey.js +1 -1
- package/test/unit/spec/media/index.ts +223 -0
- package/test/unit/spec/media/properties.ts +73 -82
- package/test/unit/spec/meeting/effectsState.js +1 -3
- package/test/unit/spec/meeting/index.js +420 -228
- package/test/unit/spec/meeting/muteState.js +7 -0
- package/test/unit/spec/meeting/utils.js +61 -2
- package/test/unit/spec/meetings/index.js +0 -4
- package/test/unit/spec/members/index.js +164 -2
- package/test/unit/spec/multistream/mediaRequestManager.ts +511 -0
- package/test/unit/spec/multistream/receiveSlot.ts +104 -0
- package/test/unit/spec/multistream/receiveSlotManager.ts +173 -0
- package/test/unit/spec/multistream/remoteMedia.ts +217 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +1251 -0
- package/test/unit/spec/roap/index.ts +63 -35
- package/test/unit/spec/stats-analyzer/index.js +19 -22
- package/dist/peer-connection-manager/index.js +0 -794
- package/dist/peer-connection-manager/index.js.map +0 -1
- package/dist/roap/collection.js +0 -73
- package/dist/roap/collection.js.map +0 -1
- package/dist/roap/handler.js +0 -337
- package/dist/roap/handler.js.map +0 -1
- package/dist/roap/state.js +0 -164
- package/dist/roap/state.js.map +0 -1
- package/dist/roap/util.js +0 -102
- package/dist/roap/util.js.map +0 -1
- package/src/peer-connection-manager/index.js +0 -723
- package/src/roap/collection.js +0 -63
- package/src/roap/handler.js +0 -252
- package/src/roap/state.js +0 -149
- package/src/roap/util.js +0 -93
- package/test/unit/spec/peerconnection-manager/index.js +0 -188
- package/test/unit/spec/peerconnection-manager/utils.js +0 -48
- package/test/unit/spec/roap/util.js +0 -30
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
|
|
4
|
+
|
|
5
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
6
|
+
|
|
7
|
+
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
8
|
+
|
|
9
|
+
_Object$defineProperty(exports, "__esModule", {
|
|
10
|
+
value: true
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
exports.ReceiveSlotEvents = exports.ReceiveSlot = void 0;
|
|
14
|
+
|
|
15
|
+
var _weakMap = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/weak-map"));
|
|
16
|
+
|
|
17
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
18
|
+
|
|
19
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
20
|
+
|
|
21
|
+
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
|
|
22
|
+
|
|
23
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
|
|
24
|
+
|
|
25
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
|
|
26
|
+
|
|
27
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
|
|
28
|
+
|
|
29
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
30
|
+
|
|
31
|
+
var _classPrivateFieldGet2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classPrivateFieldGet"));
|
|
32
|
+
|
|
33
|
+
var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classPrivateFieldSet"));
|
|
34
|
+
|
|
35
|
+
var _internalMediaCore = require("@webex/internal-media-core");
|
|
36
|
+
|
|
37
|
+
var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
|
|
38
|
+
|
|
39
|
+
var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
|
|
40
|
+
|
|
41
|
+
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
|
+
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
|
+
function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
|
|
46
|
+
|
|
47
|
+
function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
|
|
48
|
+
|
|
49
|
+
var ReceiveSlotEvents = {
|
|
50
|
+
SourceUpdate: 'sourceUpdate'
|
|
51
|
+
};
|
|
52
|
+
exports.ReceiveSlotEvents = ReceiveSlotEvents;
|
|
53
|
+
var receiveSlotCounter = 0;
|
|
54
|
+
|
|
55
|
+
var _memberId = /*#__PURE__*/new _weakMap.default();
|
|
56
|
+
|
|
57
|
+
var _csi = /*#__PURE__*/new _weakMap.default();
|
|
58
|
+
|
|
59
|
+
var _sourceState = /*#__PURE__*/new _weakMap.default();
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Class representing a receive slot. A single receive slot is able to receive a single track
|
|
63
|
+
* for example some participant's main video or audio
|
|
64
|
+
*/
|
|
65
|
+
var ReceiveSlot = /*#__PURE__*/function (_EventsScope) {
|
|
66
|
+
(0, _inherits2.default)(ReceiveSlot, _EventsScope);
|
|
67
|
+
|
|
68
|
+
var _super = _createSuper(ReceiveSlot);
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* constructor - don't use it directly, you should always use meeting.receiveSlotManager.allocateSlot()
|
|
72
|
+
* to create any receive slots
|
|
73
|
+
*
|
|
74
|
+
* @param {MC.MediaType} mediaType
|
|
75
|
+
* @param {MC.ReceiveSlot} mcReceiveSlot
|
|
76
|
+
* @param {FindMemberIdCallback} findMemberIdCallback callback for finding memberId for given CSI
|
|
77
|
+
*/
|
|
78
|
+
function ReceiveSlot(mediaType, mcReceiveSlot, findMemberIdCallback) {
|
|
79
|
+
var _this;
|
|
80
|
+
|
|
81
|
+
(0, _classCallCheck2.default)(this, ReceiveSlot);
|
|
82
|
+
_this = _super.call(this);
|
|
83
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mcReceiveSlot", void 0);
|
|
84
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "findMemberIdCallback", void 0);
|
|
85
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "id", void 0);
|
|
86
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mediaType", void 0);
|
|
87
|
+
|
|
88
|
+
_classPrivateFieldInitSpec((0, _assertThisInitialized2.default)(_this), _memberId, {
|
|
89
|
+
writable: true,
|
|
90
|
+
value: void 0
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
_classPrivateFieldInitSpec((0, _assertThisInitialized2.default)(_this), _csi, {
|
|
94
|
+
writable: true,
|
|
95
|
+
value: void 0
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
_classPrivateFieldInitSpec((0, _assertThisInitialized2.default)(_this), _sourceState, {
|
|
99
|
+
writable: true,
|
|
100
|
+
value: void 0
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
receiveSlotCounter += 1;
|
|
104
|
+
_this.findMemberIdCallback = findMemberIdCallback;
|
|
105
|
+
_this.mediaType = mediaType;
|
|
106
|
+
_this.mcReceiveSlot = mcReceiveSlot;
|
|
107
|
+
(0, _classPrivateFieldSet2.default)((0, _assertThisInitialized2.default)(_this), _sourceState, 'no source');
|
|
108
|
+
_this.id = "r".concat(receiveSlotCounter);
|
|
109
|
+
|
|
110
|
+
_this.setupEventListeners();
|
|
111
|
+
|
|
112
|
+
return _this;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Getter for memberId
|
|
116
|
+
*/
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
(0, _createClass2.default)(ReceiveSlot, [{
|
|
120
|
+
key: "memberId",
|
|
121
|
+
get: function get() {
|
|
122
|
+
return (0, _classPrivateFieldGet2.default)(this, _memberId);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Getter for csi
|
|
126
|
+
*/
|
|
127
|
+
|
|
128
|
+
}, {
|
|
129
|
+
key: "csi",
|
|
130
|
+
get: function get() {
|
|
131
|
+
return (0, _classPrivateFieldGet2.default)(this, _csi);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Getter for sourceState
|
|
135
|
+
*/
|
|
136
|
+
|
|
137
|
+
}, {
|
|
138
|
+
key: "sourceState",
|
|
139
|
+
get: function get() {
|
|
140
|
+
return (0, _classPrivateFieldGet2.default)(this, _sourceState);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* registers event handlers with the underlying ReceiveSlot
|
|
144
|
+
*/
|
|
145
|
+
|
|
146
|
+
}, {
|
|
147
|
+
key: "setupEventListeners",
|
|
148
|
+
value: function setupEventListeners() {
|
|
149
|
+
var _this2 = this;
|
|
150
|
+
|
|
151
|
+
var scope = {
|
|
152
|
+
file: 'meeting/receiveSlot',
|
|
153
|
+
function: 'setupEventListeners'
|
|
154
|
+
};
|
|
155
|
+
this.mcReceiveSlot.on(_internalMediaCore.MediaConnection.ReceiveSlotEvents.SourceUpdate, function (state, csi) {
|
|
156
|
+
_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
|
+
(0, _classPrivateFieldSet2.default)(_this2, _memberId, csi ? _this2.findMemberIdCallback(csi) : undefined);
|
|
159
|
+
(0, _classPrivateFieldSet2.default)(_this2, _csi, csi);
|
|
160
|
+
(0, _classPrivateFieldSet2.default)(_this2, _sourceState, state);
|
|
161
|
+
|
|
162
|
+
_this2.emit(scope, ReceiveSlotEvents.SourceUpdate, {
|
|
163
|
+
state: (0, _classPrivateFieldGet2.default)(_this2, _sourceState),
|
|
164
|
+
csi: (0, _classPrivateFieldGet2.default)(_this2, _csi),
|
|
165
|
+
memberId: (0, _classPrivateFieldGet2.default)(_this2, _memberId)
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The MediaStream object associated with this slot.
|
|
171
|
+
*
|
|
172
|
+
* @returns {MediaStream} The MediaStreamTrack.
|
|
173
|
+
*/
|
|
174
|
+
|
|
175
|
+
}, {
|
|
176
|
+
key: "stream",
|
|
177
|
+
get: function get() {
|
|
178
|
+
return this.mcReceiveSlot.stream;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* The underlying WCME receive slot
|
|
182
|
+
*/
|
|
183
|
+
|
|
184
|
+
}, {
|
|
185
|
+
key: "wcmeReceiveSlot",
|
|
186
|
+
get: function get() {
|
|
187
|
+
return this.mcReceiveSlot;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Resets the source state to the default 'no source' value.
|
|
191
|
+
* This function should be called on receive slots that are
|
|
192
|
+
* no longer part of a media request. It's needed because WCME
|
|
193
|
+
* does not send any more events on such slots, so the sourceState
|
|
194
|
+
* value would not represent the truth anymore.
|
|
195
|
+
*/
|
|
196
|
+
|
|
197
|
+
}, {
|
|
198
|
+
key: "resetSourceState",
|
|
199
|
+
value: function resetSourceState() {
|
|
200
|
+
(0, _classPrivateFieldSet2.default)(this, _sourceState, 'no source');
|
|
201
|
+
(0, _classPrivateFieldSet2.default)(this, _csi, undefined);
|
|
202
|
+
(0, _classPrivateFieldSet2.default)(this, _memberId, undefined);
|
|
203
|
+
}
|
|
204
|
+
}]);
|
|
205
|
+
return ReceiveSlot;
|
|
206
|
+
}(_eventsScope.default);
|
|
207
|
+
|
|
208
|
+
exports.ReceiveSlot = ReceiveSlot;
|
|
209
|
+
//# sourceMappingURL=receiveSlot.js.map
|
|
@@ -0,0 +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":["import {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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
+
|
|
5
|
+
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
6
|
+
|
|
7
|
+
_Object$defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
exports.ReceiveSlotManager = void 0;
|
|
12
|
+
|
|
13
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
|
|
14
|
+
|
|
15
|
+
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
16
|
+
|
|
17
|
+
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
|
|
18
|
+
|
|
19
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
|
|
20
|
+
|
|
21
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
22
|
+
|
|
23
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
24
|
+
|
|
25
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
26
|
+
|
|
27
|
+
var _internalMediaCore = require("@webex/internal-media-core");
|
|
28
|
+
|
|
29
|
+
var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
|
|
30
|
+
|
|
31
|
+
var _receiveSlot = require("./receiveSlot");
|
|
32
|
+
|
|
33
|
+
/* eslint-disable import/prefer-default-export */
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Manages all receive slots used by a meeting. WMCE receive slots cannot be ever deleted,
|
|
37
|
+
* so this manager has a pool in order to re-use the slots that were released earlier.
|
|
38
|
+
*/
|
|
39
|
+
var ReceiveSlotManager = /*#__PURE__*/function () {
|
|
40
|
+
/**
|
|
41
|
+
* Constructor
|
|
42
|
+
* @param {Meeting} meeting
|
|
43
|
+
*/
|
|
44
|
+
function ReceiveSlotManager(meeting) {
|
|
45
|
+
var _this$allocatedSlots, _this$freeSlots;
|
|
46
|
+
|
|
47
|
+
(0, _classCallCheck2.default)(this, ReceiveSlotManager);
|
|
48
|
+
(0, _defineProperty2.default)(this, "allocatedSlots", void 0);
|
|
49
|
+
(0, _defineProperty2.default)(this, "freeSlots", void 0);
|
|
50
|
+
(0, _defineProperty2.default)(this, "meeting", void 0);
|
|
51
|
+
this.allocatedSlots = (_this$allocatedSlots = {}, (0, _defineProperty2.default)(_this$allocatedSlots, _internalMediaCore.MediaConnection.MediaType.AudioMain, []), (0, _defineProperty2.default)(_this$allocatedSlots, _internalMediaCore.MediaConnection.MediaType.VideoMain, []), (0, _defineProperty2.default)(_this$allocatedSlots, _internalMediaCore.MediaConnection.MediaType.AudioSlides, []), (0, _defineProperty2.default)(_this$allocatedSlots, _internalMediaCore.MediaConnection.MediaType.VideoSlides, []), _this$allocatedSlots);
|
|
52
|
+
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);
|
|
53
|
+
this.meeting = meeting;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Creates a new receive slot or returns one from the existing pool of free slots
|
|
57
|
+
*
|
|
58
|
+
* @param {MC.MediaType} mediaType
|
|
59
|
+
* @returns {Promise<ReceiveSlot>}
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
(0, _createClass2.default)(ReceiveSlotManager, [{
|
|
64
|
+
key: "allocateSlot",
|
|
65
|
+
value: function () {
|
|
66
|
+
var _allocateSlot = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(mediaType) {
|
|
67
|
+
var _this$meeting,
|
|
68
|
+
_this$meeting$mediaPr,
|
|
69
|
+
_this = this;
|
|
70
|
+
|
|
71
|
+
var availableSlot, wcmeReceiveSlot, receiveSlot;
|
|
72
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
73
|
+
while (1) {
|
|
74
|
+
switch (_context.prev = _context.next) {
|
|
75
|
+
case 0:
|
|
76
|
+
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) {
|
|
77
|
+
_context.next = 2;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return _context.abrupt("return", _promise.default.reject(new Error('Webrtc media connection is missing')));
|
|
82
|
+
|
|
83
|
+
case 2:
|
|
84
|
+
// try to use one of the free ones
|
|
85
|
+
availableSlot = this.freeSlots[mediaType].pop();
|
|
86
|
+
|
|
87
|
+
if (!availableSlot) {
|
|
88
|
+
_context.next = 7;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
this.allocatedSlots[mediaType].push(availableSlot);
|
|
93
|
+
|
|
94
|
+
_loggerProxy.default.logger.log("receive slot re-used: ".concat(availableSlot.id));
|
|
95
|
+
|
|
96
|
+
return _context.abrupt("return", availableSlot);
|
|
97
|
+
|
|
98
|
+
case 7:
|
|
99
|
+
_context.next = 9;
|
|
100
|
+
return this.meeting.mediaProperties.webrtcMediaConnection.createReceiveSlot(mediaType);
|
|
101
|
+
|
|
102
|
+
case 9:
|
|
103
|
+
wcmeReceiveSlot = _context.sent;
|
|
104
|
+
receiveSlot = new _receiveSlot.ReceiveSlot(mediaType, wcmeReceiveSlot, function (csi) {
|
|
105
|
+
var _this$meeting$members;
|
|
106
|
+
|
|
107
|
+
return (_this$meeting$members = _this.meeting.members.findMemberByCsi(csi)) === null || _this$meeting$members === void 0 ? void 0 : _this$meeting$members.id;
|
|
108
|
+
});
|
|
109
|
+
this.allocatedSlots[mediaType].push(receiveSlot);
|
|
110
|
+
|
|
111
|
+
_loggerProxy.default.logger.log("new receive slot allocated: ".concat(receiveSlot.id));
|
|
112
|
+
|
|
113
|
+
return _context.abrupt("return", receiveSlot);
|
|
114
|
+
|
|
115
|
+
case 14:
|
|
116
|
+
case "end":
|
|
117
|
+
return _context.stop();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}, _callee, this);
|
|
121
|
+
}));
|
|
122
|
+
|
|
123
|
+
function allocateSlot(_x) {
|
|
124
|
+
return _allocateSlot.apply(this, arguments);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return allocateSlot;
|
|
128
|
+
}()
|
|
129
|
+
/**
|
|
130
|
+
* Releases the slot back to the pool so it can be re-used by others in the future
|
|
131
|
+
* @param {ReceiveSlot} slot
|
|
132
|
+
*/
|
|
133
|
+
|
|
134
|
+
}, {
|
|
135
|
+
key: "releaseSlot",
|
|
136
|
+
value: function releaseSlot(slot) {
|
|
137
|
+
var idx = this.allocatedSlots[slot.mediaType].findIndex(function (allocatedSlot) {
|
|
138
|
+
return allocatedSlot === slot;
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
if (idx >= 0) {
|
|
142
|
+
this.allocatedSlots[slot.mediaType].splice(idx, 1);
|
|
143
|
+
this.freeSlots[slot.mediaType].push(slot);
|
|
144
|
+
|
|
145
|
+
_loggerProxy.default.logger.log("receive slot released: ".concat(slot.id));
|
|
146
|
+
} else {
|
|
147
|
+
_loggerProxy.default.logger.warn('ReceiveSlotManager#releaseSlot --> trying to release a slot that is not managed by this ReceiveSlotManager');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Resets the slot manager - this method should be called when the media connection is torn down
|
|
152
|
+
*/
|
|
153
|
+
|
|
154
|
+
}, {
|
|
155
|
+
key: "reset",
|
|
156
|
+
value: function reset() {
|
|
157
|
+
var _this$allocatedSlots2, _this$freeSlots2;
|
|
158
|
+
|
|
159
|
+
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);
|
|
160
|
+
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);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Returns statistics about the managed slots
|
|
164
|
+
*
|
|
165
|
+
* @returns {Object}
|
|
166
|
+
*/
|
|
167
|
+
|
|
168
|
+
}, {
|
|
169
|
+
key: "getStats",
|
|
170
|
+
value: function getStats() {
|
|
171
|
+
var _this2 = this;
|
|
172
|
+
|
|
173
|
+
var numAllocatedSlots = {};
|
|
174
|
+
var numFreeSlots = {};
|
|
175
|
+
(0, _keys.default)(this.allocatedSlots).forEach(function (key) {
|
|
176
|
+
if (_this2.allocatedSlots[key].length > 0) {
|
|
177
|
+
numAllocatedSlots[key] = _this2.allocatedSlots[key].length;
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
(0, _keys.default)(this.freeSlots).forEach(function (key) {
|
|
181
|
+
if (_this2.freeSlots[key].length > 0) {
|
|
182
|
+
numFreeSlots[key] = _this2.freeSlots[key].length;
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
return {
|
|
186
|
+
numAllocatedSlots: numAllocatedSlots,
|
|
187
|
+
numFreeSlots: numFreeSlots
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}]);
|
|
191
|
+
return ReceiveSlotManager;
|
|
192
|
+
}();
|
|
193
|
+
|
|
194
|
+
exports.ReceiveSlotManager = ReceiveSlotManager;
|
|
195
|
+
//# sourceMappingURL=receiveSlotManager.js.map
|
|
@@ -0,0 +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 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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"}
|