@webex/plugin-meetings 3.12.0-next.9 → 3.12.0-next.90
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/AGENTS.md +9 -0
- package/dist/aiEnableRequest/index.js +15 -2
- package/dist/aiEnableRequest/index.js.map +1 -1
- package/dist/breakouts/breakout.js +8 -3
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/index.js +26 -2
- package/dist/breakouts/index.js.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/constants.js +35 -9
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +11 -1
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/index.js +67 -29
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/util.js +91 -0
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/hashTree/constants.js +13 -1
- package/dist/hashTree/constants.js.map +1 -1
- package/dist/hashTree/hashTreeParser.js +880 -382
- package/dist/hashTree/hashTreeParser.js.map +1 -1
- package/dist/hashTree/utils.js +42 -0
- package/dist/hashTree/utils.js.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/interceptors/dataChannelAuthToken.js +75 -15
- package/dist/interceptors/dataChannelAuthToken.js.map +1 -1
- package/dist/interceptors/locusRetry.js +23 -8
- package/dist/interceptors/locusRetry.js.map +1 -1
- package/dist/interpretation/index.js +10 -1
- package/dist/interpretation/index.js.map +1 -1
- package/dist/interpretation/interpretation.types.js +7 -0
- package/dist/interpretation/interpretation.types.js.map +1 -0
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +4 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +303 -88
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +36 -5
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/types.js +19 -0
- package/dist/locus-info/types.js.map +1 -1
- package/dist/media/index.js +3 -1
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +1 -0
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +5 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +1233 -793
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +229 -82
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/muteState.js +10 -1
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +5 -2
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +35 -2
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +2 -2
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meetings/index.js +231 -118
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +6 -1
- package/dist/meetings/meetings.types.js.map +1 -1
- package/dist/meetings/request.js +39 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +79 -5
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +10 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js.map +1 -1
- package/dist/member/util.js +30 -0
- package/dist/member/util.js.map +1 -1
- package/dist/members/index.js +101 -43
- package/dist/members/index.js.map +1 -1
- package/dist/members/util.js +8 -1
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +5 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/codec/constants.js +63 -0
- package/dist/multistream/codec/constants.js.map +1 -0
- package/dist/multistream/mediaRequestManager.js +62 -15
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +9 -0
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/reachability/index.js +10 -13
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/reachability.types.js +2 -0
- package/dist/reachability/reachability.types.js.map +1 -1
- package/dist/reachability/util.js +45 -0
- package/dist/reachability/util.js.map +1 -1
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/recording-controller/index.js +1 -3
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/types/config.d.ts +2 -2
- package/dist/types/constants.d.ts +12 -1
- package/dist/types/controls-options-manager/constants.d.ts +6 -1
- package/dist/types/controls-options-manager/index.d.ts +16 -0
- package/dist/types/hashTree/constants.d.ts +2 -0
- package/dist/types/hashTree/hashTreeParser.d.ts +146 -17
- package/dist/types/hashTree/utils.d.ts +18 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/interceptors/locusRetry.d.ts +4 -4
- package/dist/types/interpretation/interpretation.types.d.ts +10 -0
- package/dist/types/locus-info/index.d.ts +50 -6
- package/dist/types/locus-info/infoUtils.d.ts +8 -0
- package/dist/types/locus-info/types.d.ts +21 -1
- package/dist/types/media/properties.d.ts +1 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +4 -0
- package/dist/types/meeting/index.d.ts +94 -7
- package/dist/types/meeting/locusMediaRequest.d.ts +12 -0
- package/dist/types/meeting/request.d.ts +1 -0
- package/dist/types/meeting/util.d.ts +9 -0
- package/dist/types/meetings/index.d.ts +30 -18
- package/dist/types/meetings/meetings.types.d.ts +15 -0
- package/dist/types/meetings/request.d.ts +14 -0
- package/dist/types/member/index.d.ts +1 -0
- package/dist/types/member/types.d.ts +1 -0
- package/dist/types/member/util.d.ts +9 -0
- package/dist/types/members/index.d.ts +15 -2
- package/dist/types/members/util.d.ts +1 -5
- package/dist/types/metrics/constants.d.ts +4 -0
- package/dist/types/multistream/codec/constants.d.ts +7 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +22 -5
- package/dist/types/reachability/index.d.ts +1 -1
- package/dist/types/reachability/reachability.types.d.ts +7 -0
- package/dist/types/reachability/util.d.ts +17 -0
- package/dist/types/reactions/reactions.type.d.ts +3 -0
- package/dist/webinar/index.js +305 -159
- package/dist/webinar/index.js.map +1 -1
- package/package.json +22 -22
- package/src/aiEnableRequest/index.ts +16 -0
- package/src/breakouts/breakout.ts +3 -1
- package/src/breakouts/index.ts +31 -0
- package/src/config.ts +2 -2
- package/src/constants.ts +20 -3
- package/src/controls-options-manager/constants.ts +14 -1
- package/src/controls-options-manager/index.ts +87 -28
- package/src/controls-options-manager/util.ts +81 -1
- package/src/hashTree/constants.ts +16 -0
- package/src/hashTree/hashTreeParser.ts +580 -196
- package/src/hashTree/utils.ts +36 -0
- package/src/index.ts +6 -0
- package/src/interceptors/dataChannelAuthToken.ts +88 -12
- package/src/interceptors/locusRetry.ts +25 -4
- package/src/interpretation/index.ts +27 -9
- package/src/interpretation/interpretation.types.ts +11 -0
- package/src/locus-info/controlsUtils.ts +3 -1
- package/src/locus-info/index.ts +304 -100
- package/src/locus-info/infoUtils.ts +41 -6
- package/src/locus-info/types.ts +25 -1
- package/src/media/index.ts +3 -0
- package/src/media/properties.ts +1 -0
- package/src/meeting/in-meeting-actions.ts +8 -0
- package/src/meeting/index.ts +494 -67
- package/src/meeting/locusMediaRequest.ts +106 -6
- package/src/meeting/muteState.ts +10 -1
- package/src/meeting/request.ts +11 -0
- package/src/meeting/util.ts +47 -5
- package/src/meeting-info/meeting-info-v2.ts +4 -2
- package/src/meetings/index.ts +133 -78
- package/src/meetings/meetings.types.ts +19 -0
- package/src/meetings/request.ts +43 -0
- package/src/meetings/util.ts +97 -1
- package/src/member/index.ts +10 -0
- package/src/member/types.ts +1 -0
- package/src/member/util.ts +29 -0
- package/src/members/index.ts +70 -7
- package/src/members/util.ts +12 -4
- package/src/metrics/constants.ts +4 -0
- package/src/multistream/codec/constants.ts +58 -0
- package/src/multistream/mediaRequestManager.ts +119 -28
- package/src/multistream/receiveSlot.ts +18 -0
- package/src/reachability/index.ts +19 -15
- package/src/reachability/reachability.types.ts +11 -0
- package/src/reachability/util.ts +36 -0
- package/src/reactions/reactions.type.ts +3 -0
- package/src/recording-controller/index.ts +1 -2
- package/src/webinar/index.ts +214 -36
- package/test/unit/spec/aiEnableRequest/index.ts +86 -0
- package/test/unit/spec/breakouts/breakout.ts +9 -3
- package/test/unit/spec/breakouts/index.ts +49 -0
- package/test/unit/spec/controls-options-manager/index.js +244 -29
- package/test/unit/spec/controls-options-manager/util.js +165 -0
- package/test/unit/spec/hashTree/hashTreeParser.ts +1838 -180
- package/test/unit/spec/hashTree/utils.ts +125 -1
- package/test/unit/spec/interceptors/dataChannelAuthToken.ts +196 -0
- package/test/unit/spec/interceptors/locusRetry.ts +205 -4
- package/test/unit/spec/interpretation/index.ts +26 -4
- package/test/unit/spec/locus-info/controlsUtils.js +172 -57
- package/test/unit/spec/locus-info/index.js +499 -81
- package/test/unit/spec/locus-info/infoUtils.js +184 -1
- package/test/unit/spec/media/index.ts +31 -0
- package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
- package/test/unit/spec/meeting/index.js +1615 -42
- package/test/unit/spec/meeting/locusMediaRequest.ts +302 -4
- package/test/unit/spec/meeting/muteState.js +81 -0
- package/test/unit/spec/meeting/request.js +12 -0
- package/test/unit/spec/meeting/utils.js +157 -1
- package/test/unit/spec/meeting-info/meetinginfov2.js +19 -10
- package/test/unit/spec/meetings/index.js +363 -36
- package/test/unit/spec/meetings/request.js +141 -0
- package/test/unit/spec/meetings/utils.js +189 -0
- package/test/unit/spec/member/index.js +7 -0
- package/test/unit/spec/member/util.js +89 -0
- package/test/unit/spec/members/index.js +216 -0
- package/test/unit/spec/members/request.js +37 -1
- package/test/unit/spec/members/utils.js +63 -0
- package/test/unit/spec/multistream/mediaRequestManager.ts +501 -37
- package/test/unit/spec/reachability/index.ts +59 -46
- package/test/unit/spec/reachability/util.ts +31 -0
- package/test/unit/spec/recording-controller/index.js +9 -8
- package/test/unit/spec/webinar/index.ts +329 -28
|
@@ -7,8 +7,10 @@ _Object$defineProperty(exports, "__esModule", {
|
|
|
7
7
|
value: true
|
|
8
8
|
});
|
|
9
9
|
exports.LocusMediaRequest = void 0;
|
|
10
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
|
|
10
11
|
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
11
12
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
13
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
|
|
12
14
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
|
|
13
15
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
|
|
14
16
|
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
|
|
@@ -22,6 +24,8 @@ var _events = require("events");
|
|
|
22
24
|
var _webexCore = require("@webex/webex-core");
|
|
23
25
|
var _constants = require("../constants");
|
|
24
26
|
var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
|
|
27
|
+
var _metrics = _interopRequireDefault(require("../metrics"));
|
|
28
|
+
var _constants2 = _interopRequireDefault(require("../metrics/constants"));
|
|
25
29
|
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
|
|
26
30
|
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /* eslint-disable valid-jsdoc */
|
|
27
31
|
/** Class representing a single /media request being sent to Locus */
|
|
@@ -64,7 +68,7 @@ var InternalRequestInfo = /*#__PURE__*/function () {
|
|
|
64
68
|
key: "execute",
|
|
65
69
|
value: function execute() {
|
|
66
70
|
var _this = this;
|
|
67
|
-
return this.sendRequestFn(this.request).then(function (result) {
|
|
71
|
+
return this.sendRequestFn(this.request, 0).then(function (result) {
|
|
68
72
|
// resolve all the pending promises associated with this request
|
|
69
73
|
_this.pendingPromises.forEach(function (d) {
|
|
70
74
|
return d.resolve(result);
|
|
@@ -78,6 +82,8 @@ var InternalRequestInfo = /*#__PURE__*/function () {
|
|
|
78
82
|
}
|
|
79
83
|
}]);
|
|
80
84
|
}();
|
|
85
|
+
var MAX_SELF_URL_RETRY_COUNT = 2;
|
|
86
|
+
|
|
81
87
|
/**
|
|
82
88
|
* Returns true if the request is triggering confluence creation in the server
|
|
83
89
|
*/
|
|
@@ -185,94 +191,235 @@ var LocusMediaRequest = exports.LocusMediaRequest = /*#__PURE__*/function (_Webe
|
|
|
185
191
|
*/
|
|
186
192
|
}, {
|
|
187
193
|
key: "sendHttpRequest",
|
|
188
|
-
value: function
|
|
189
|
-
var
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
194
|
+
value: (function () {
|
|
195
|
+
var _sendHttpRequest = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2(request) {
|
|
196
|
+
var _this4 = this;
|
|
197
|
+
var selfUrlRetryCount,
|
|
198
|
+
uri,
|
|
199
|
+
_this$getLatestMuteSt,
|
|
200
|
+
audioMuted,
|
|
201
|
+
videoMuted,
|
|
202
|
+
body,
|
|
203
|
+
localMedias,
|
|
204
|
+
upload,
|
|
205
|
+
download,
|
|
206
|
+
options,
|
|
207
|
+
promise,
|
|
208
|
+
setupProgressListener,
|
|
209
|
+
_args2 = arguments,
|
|
210
|
+
_t2;
|
|
211
|
+
return _regenerator.default.wrap(function (_context2) {
|
|
212
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
213
|
+
case 0:
|
|
214
|
+
selfUrlRetryCount = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : 0;
|
|
215
|
+
// Resolve selfUrl lazily at send time. Locus rotates it on session
|
|
216
|
+
// transitions (breakout end, move-to, lobby admit) and the value
|
|
217
|
+
// captured upstream in roap/index.ts may be stale by the time we
|
|
218
|
+
// leave the queue. Persist the resolved URL on the request so a
|
|
219
|
+
// retry can detect a further rotation.
|
|
220
|
+
request.selfUrl = this.getCurrentSelfUrl(request);
|
|
221
|
+
uri = "".concat(request.selfUrl, "/").concat(_constants.MEDIA);
|
|
222
|
+
_this$getLatestMuteSt = this.getLatestMuteState(), audioMuted = _this$getLatestMuteSt.audioMuted, videoMuted = _this$getLatestMuteSt.videoMuted; // first setup things common to all requests
|
|
223
|
+
body = {
|
|
224
|
+
device: this.config.device,
|
|
225
|
+
correlationId: this.config.correlationId
|
|
226
|
+
};
|
|
227
|
+
localMedias = {
|
|
228
|
+
audioMuted: audioMuted,
|
|
229
|
+
videoMuted: videoMuted
|
|
230
|
+
}; // now add things specific to request type
|
|
231
|
+
_t2 = request.type;
|
|
232
|
+
_context2.next = _t2 === 'LocalMute' ? 1 : _t2 === 'RoapMessage' ? 2 : 3;
|
|
233
|
+
break;
|
|
234
|
+
case 1:
|
|
235
|
+
body.respOnlySdp = true;
|
|
236
|
+
body.usingResource = null;
|
|
237
|
+
return _context2.abrupt("continue", 3);
|
|
238
|
+
case 2:
|
|
239
|
+
localMedias.roapMessage = request.roapMessage;
|
|
240
|
+
localMedias.reachability = request.reachability;
|
|
241
|
+
body.clientMediaPreferences = request.clientMediaPreferences;
|
|
242
|
+
return _context2.abrupt("continue", 3);
|
|
243
|
+
case 3:
|
|
244
|
+
if (request.sequence) {
|
|
245
|
+
body.sequence = request.sequence;
|
|
246
|
+
}
|
|
247
|
+
body.localMedias = [{
|
|
248
|
+
localSdp: (0, _stringify.default)(localMedias),
|
|
249
|
+
// this part must be JSON stringified, Locus requires this
|
|
250
|
+
mediaId: request.mediaId
|
|
251
|
+
}];
|
|
252
|
+
_loggerProxy.default.logger.info("Meeting:LocusMediaRequest#sendHttpRequest --> ".concat(request.type, " audioMuted=").concat(audioMuted, " videoMuted=").concat(videoMuted));
|
|
253
|
+
if (isRequestAffectingConfluenceState(request) && this.confluenceState === 'not created') {
|
|
254
|
+
this.confluenceState = 'creation in progress';
|
|
255
|
+
}
|
|
256
|
+
upload = new _events.EventEmitter();
|
|
257
|
+
download = new _events.EventEmitter();
|
|
258
|
+
options = {
|
|
259
|
+
method: _constants.HTTP_VERBS.PUT,
|
|
260
|
+
uri: uri,
|
|
261
|
+
body: body,
|
|
262
|
+
upload: upload,
|
|
263
|
+
download: download
|
|
264
|
+
}; // @ts-ignore
|
|
265
|
+
promise = this.request(options).then(function (result) {
|
|
266
|
+
if (isRequestAffectingConfluenceState(request)) {
|
|
267
|
+
_this4.confluenceState = 'created';
|
|
268
|
+
}
|
|
269
|
+
return result;
|
|
270
|
+
}).catch(/*#__PURE__*/function () {
|
|
271
|
+
var _ref = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(e) {
|
|
272
|
+
var _t;
|
|
273
|
+
return _regenerator.default.wrap(function (_context) {
|
|
274
|
+
while (1) switch (_context.prev = _context.next) {
|
|
275
|
+
case 0:
|
|
276
|
+
_t = (e === null || e === void 0 ? void 0 : e.statusCode) === 409;
|
|
277
|
+
if (!_t) {
|
|
278
|
+
_context.next = 2;
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
_context.next = 1;
|
|
282
|
+
return _this4.shouldRetryOnSelfUrlChange(request, selfUrlRetryCount);
|
|
283
|
+
case 1:
|
|
284
|
+
_t = _context.sent;
|
|
285
|
+
case 2:
|
|
286
|
+
if (!_t) {
|
|
287
|
+
_context.next = 3;
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
return _context.abrupt("return", _this4.sendHttpRequest(request, selfUrlRetryCount + 1));
|
|
291
|
+
case 3:
|
|
292
|
+
if (isRequestAffectingConfluenceState(request) && _this4.confluenceState === 'creation in progress') {
|
|
293
|
+
_this4.confluenceState = 'not created';
|
|
294
|
+
}
|
|
295
|
+
if (request.type === 'RoapMessage') {
|
|
296
|
+
// @ts-ignore
|
|
297
|
+
_this4.webex.internal.newMetrics.submitClientEvent({
|
|
298
|
+
name: 'client.locus.media.response',
|
|
299
|
+
options: {
|
|
300
|
+
meetingId: _this4.config.meetingId,
|
|
301
|
+
rawError: e
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
throw e;
|
|
306
|
+
case 4:
|
|
307
|
+
case "end":
|
|
308
|
+
return _context.stop();
|
|
309
|
+
}
|
|
310
|
+
}, _callee);
|
|
311
|
+
}));
|
|
312
|
+
return function (_x2) {
|
|
313
|
+
return _ref.apply(this, arguments);
|
|
314
|
+
};
|
|
315
|
+
}());
|
|
316
|
+
if (request.type === 'RoapMessage') {
|
|
317
|
+
setupProgressListener = function setupProgressListener(direction, eventEmitter) {
|
|
318
|
+
eventEmitter.on('progress', function (progressEvent) {
|
|
319
|
+
_loggerProxy.default.logger.info("".concat(request.type, ": ").concat(direction, " Progress, Timestamp: ").concat(progressEvent.timeStamp, ", Progress: ").concat(progressEvent.loaded, "/").concat(progressEvent.total));
|
|
320
|
+
});
|
|
321
|
+
};
|
|
322
|
+
setupProgressListener('Upload', options.upload);
|
|
323
|
+
setupProgressListener('Download', options.download);
|
|
324
|
+
}
|
|
325
|
+
return _context2.abrupt("return", promise);
|
|
326
|
+
case 4:
|
|
327
|
+
case "end":
|
|
328
|
+
return _context2.stop();
|
|
329
|
+
}
|
|
330
|
+
}, _callee2, this);
|
|
331
|
+
}));
|
|
332
|
+
function sendHttpRequest(_x) {
|
|
333
|
+
return _sendHttpRequest.apply(this, arguments);
|
|
228
334
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
_this4.confluenceState = 'not created';
|
|
248
|
-
}
|
|
249
|
-
if (request.type === 'RoapMessage') {
|
|
250
|
-
// @ts-ignore
|
|
251
|
-
_this4.webex.internal.newMetrics.submitClientEvent({
|
|
252
|
-
name: 'client.locus.media.response',
|
|
253
|
-
options: {
|
|
254
|
-
meetingId: _this4.config.meetingId,
|
|
255
|
-
rawError: e
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
throw e;
|
|
260
|
-
});
|
|
261
|
-
if (request.type === 'RoapMessage') {
|
|
262
|
-
var setupProgressListener = function setupProgressListener(direction, eventEmitter) {
|
|
263
|
-
eventEmitter.on('progress', function (progressEvent) {
|
|
264
|
-
_loggerProxy.default.logger.info("".concat(request.type, ": ").concat(direction, " Progress, Timestamp: ").concat(progressEvent.timeStamp, ", Progress: ").concat(progressEvent.loaded, "/").concat(progressEvent.total));
|
|
265
|
-
});
|
|
266
|
-
};
|
|
267
|
-
setupProgressListener('Upload', options.upload);
|
|
268
|
-
setupProgressListener('Download', options.download);
|
|
335
|
+
return sendHttpRequest;
|
|
336
|
+
}()
|
|
337
|
+
/**
|
|
338
|
+
* Returns the latest selfUrl for this meeting, falling back to the value
|
|
339
|
+
* captured when the request was enqueued.
|
|
340
|
+
*/
|
|
341
|
+
)
|
|
342
|
+
}, {
|
|
343
|
+
key: "getCurrentSelfUrl",
|
|
344
|
+
value: function getCurrentSelfUrl(request) {
|
|
345
|
+
var currentSelfUrl = this.config.getCurrentSelfUrl();
|
|
346
|
+
if (currentSelfUrl && currentSelfUrl !== request.selfUrl) {
|
|
347
|
+
_loggerProxy.default.logger.info("Meeting:LocusMediaRequest#getCurrentSelfUrl --> resolved updated selfUrl, using ".concat(currentSelfUrl));
|
|
348
|
+
_metrics.default.sendBehavioralMetric(_constants2.default.LOCUS_MEDIA_REQUEST_RETRY, {
|
|
349
|
+
correlation_id: this.config.correlationId,
|
|
350
|
+
reason: 'selfUrlUpdatedBeforeMediaRequest'
|
|
351
|
+
});
|
|
352
|
+
return currentSelfUrl;
|
|
269
353
|
}
|
|
270
|
-
return
|
|
354
|
+
return request.selfUrl;
|
|
271
355
|
}
|
|
272
356
|
|
|
357
|
+
/**
|
|
358
|
+
* Decides whether a 409 warrants a retry against the meeting's latest
|
|
359
|
+
* selfUrl.
|
|
360
|
+
*/
|
|
361
|
+
}, {
|
|
362
|
+
key: "shouldRetryOnSelfUrlChange",
|
|
363
|
+
value: (function () {
|
|
364
|
+
var _shouldRetryOnSelfUrlChange = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3(request, selfUrlRetryCount) {
|
|
365
|
+
var _request$roapMessage;
|
|
366
|
+
var roapMessageType, currentSelfUrl, latestSelfUrl;
|
|
367
|
+
return _regenerator.default.wrap(function (_context3) {
|
|
368
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
369
|
+
case 0:
|
|
370
|
+
if (!(selfUrlRetryCount >= MAX_SELF_URL_RETRY_COUNT)) {
|
|
371
|
+
_context3.next = 1;
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
return _context3.abrupt("return", false);
|
|
375
|
+
case 1:
|
|
376
|
+
roapMessageType = request.type === 'RoapMessage' ? (_request$roapMessage = request.roapMessage) === null || _request$roapMessage === void 0 ? void 0 : _request$roapMessage.messageType : undefined;
|
|
377
|
+
currentSelfUrl = this.getCurrentSelfUrl(request);
|
|
378
|
+
if (!(!currentSelfUrl || currentSelfUrl === request.selfUrl)) {
|
|
379
|
+
_context3.next = 4;
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
_context3.next = 2;
|
|
383
|
+
return this.config.waitForSelfUrlChange();
|
|
384
|
+
case 2:
|
|
385
|
+
latestSelfUrl = this.getCurrentSelfUrl(request);
|
|
386
|
+
if (!(!latestSelfUrl || latestSelfUrl === request.selfUrl)) {
|
|
387
|
+
_context3.next = 3;
|
|
388
|
+
break;
|
|
389
|
+
}
|
|
390
|
+
_metrics.default.sendBehavioralMetric(_constants2.default.LOCUS_MEDIA_REQUEST_RETRY, {
|
|
391
|
+
correlation_id: this.config.correlationId,
|
|
392
|
+
reason: 'selfUrlNotChangedAfterWait',
|
|
393
|
+
retryAttempt: selfUrlRetryCount,
|
|
394
|
+
roapMessageType: roapMessageType
|
|
395
|
+
});
|
|
396
|
+
_loggerProxy.default.logger.info('Meeting:LocusMediaRequest#sendHttpRequest --> 409 conflict, no new selfUrl even after waiting');
|
|
397
|
+
return _context3.abrupt("return", false);
|
|
398
|
+
case 3:
|
|
399
|
+
_metrics.default.sendBehavioralMetric(_constants2.default.LOCUS_MEDIA_REQUEST_RETRY, {
|
|
400
|
+
correlation_id: this.config.correlationId,
|
|
401
|
+
reason: 'selfUrlChangedAfterWait',
|
|
402
|
+
retryAttempt: selfUrlRetryCount,
|
|
403
|
+
roapMessageType: roapMessageType
|
|
404
|
+
});
|
|
405
|
+
case 4:
|
|
406
|
+
_loggerProxy.default.logger.info("Meeting:LocusMediaRequest#sendHttpRequest --> 409 conflict, retrying ".concat(request.type, " with updated selfUrl"));
|
|
407
|
+
return _context3.abrupt("return", true);
|
|
408
|
+
case 5:
|
|
409
|
+
case "end":
|
|
410
|
+
return _context3.stop();
|
|
411
|
+
}
|
|
412
|
+
}, _callee3, this);
|
|
413
|
+
}));
|
|
414
|
+
function shouldRetryOnSelfUrlChange(_x3, _x4) {
|
|
415
|
+
return _shouldRetryOnSelfUrlChange.apply(this, arguments);
|
|
416
|
+
}
|
|
417
|
+
return shouldRetryOnSelfUrlChange;
|
|
418
|
+
}()
|
|
273
419
|
/**
|
|
274
420
|
* Sends a media request to Locus
|
|
275
421
|
*/
|
|
422
|
+
)
|
|
276
423
|
}, {
|
|
277
424
|
key: "send",
|
|
278
425
|
value: function send(request) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_lodash","require","_common","_events","_webexCore","_constants","_loggerProxy","_interopRequireDefault","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","InternalRequestInfo","request","pendingPromise","sendRequestFn","_classCallCheck2","_defineProperty2","pendingPromises","_createClass2","key","value","getPendingPromises","addPendingPromises","_this$pendingPromises","push","_toConsumableArray2","execute","_this","then","result","forEach","d","resolve","catch","reject","isRequestAffectingConfluenceState","type","roapMessage","messageType","ROAP","ROAP_TYPES","OFFER","LocusMediaRequest","exports","_WebexPlugin","config","options","_this2","isRequestInProgress","queuedRequests","confluenceState","_inherits2","addToQueue","info","length","filter","r","executeNextQueuedRequest","_this3","nextRequest","shift","getLatestMuteState","audioMuted","latestAudioMuted","undefined","videoMuted","latestVideoMuted","sendHttpRequest","_this4","uri","concat","selfUrl","MEDIA","_this$getLatestMuteSt","body","device","correlationId","localMedias","respOnlySdp","usingResource","reachability","clientMediaPreferences","sequence","localSdp","_stringify","mediaId","LoggerProxy","logger","upload","EventEmitter","download","method","HTTP_VERBS","PUT","promise","webex","internal","newMetrics","submitClientEvent","name","meetingId","rawError","setupProgressListener","direction","eventEmitter","on","progressEvent","timeStamp","loaded","total","send","_this5","_request$muteOptions","muteOptions","_promise","Defer","newRequest","bind","defer","isConfluenceCreated","downgradeFromMultistreamToTranscoded","preferTranscoding","WebexPlugin"],"sources":["locusMediaRequest.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport {defer} from 'lodash';\nimport {Defer, transferEvents} from '@webex/common';\nimport {EventEmitter} from 'events';\nimport {WebexPlugin} from '@webex/webex-core';\nimport {MEDIA, HTTP_VERBS, ROAP} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ClientMediaPreferences} from '../reachability/reachability.types';\n\nexport type MediaRequestType = 'RoapMessage' | 'LocalMute';\nexport type RequestResult = any;\n\nexport type RoapRequest = {\n type: 'RoapMessage';\n selfUrl: string;\n mediaId: string;\n roapMessage: any;\n reachability: any;\n clientMediaPreferences: ClientMediaPreferences;\n sequence?: any;\n};\n\nexport type LocalMuteRequest = {\n type: 'LocalMute';\n selfUrl: string;\n mediaId: string;\n sequence?: any;\n muteOptions: {\n audioMuted?: boolean;\n videoMuted?: boolean;\n };\n};\n\nexport type Request = RoapRequest | LocalMuteRequest;\n\n/** Class representing a single /media request being sent to Locus */\nclass InternalRequestInfo {\n public readonly request: Request;\n private pendingPromises: Defer[];\n private sendRequestFn: (request: Request) => Promise<RequestResult>;\n\n /** Constructor */\n constructor(\n request: Request,\n pendingPromise: Defer,\n sendRequestFn: (request: Request) => Promise<RequestResult>\n ) {\n this.request = request;\n this.pendingPromises = [pendingPromise];\n this.sendRequestFn = sendRequestFn;\n }\n\n /**\n * Returns the list of pending promises associated with this request\n */\n public getPendingPromises() {\n return this.pendingPromises;\n }\n\n /**\n * Adds promises to the list of pending promises associated with this request\n */\n public addPendingPromises(pendingPromises: Defer[]) {\n this.pendingPromises.push(...pendingPromises);\n }\n\n /**\n * Executes the request. Returned promise is resolved once the request\n * is completed (no matter if it succeeded or failed).\n */\n public execute(): Promise<void> {\n return this.sendRequestFn(this.request)\n .then((result) => {\n // resolve all the pending promises associated with this request\n this.pendingPromises.forEach((d) => d.resolve(result));\n })\n .catch((e) => {\n // reject all the pending promises associated with this request\n this.pendingPromises.forEach((d) => d.reject(e));\n });\n }\n}\n\nexport type Config = {\n device: {\n url: string;\n deviceType: string;\n countryCode?: string;\n regionCode?: string;\n };\n correlationId: string;\n meetingId: string;\n preferTranscoding: boolean;\n};\n\n/**\n * Returns true if the request is triggering confluence creation in the server\n */\nfunction isRequestAffectingConfluenceState(request: Request): boolean {\n return (\n request.type === 'RoapMessage' && request.roapMessage.messageType === ROAP.ROAP_TYPES.OFFER\n );\n}\n\n/**\n * This class manages all /media API requests to Locus. Every call to that\n * Locus API has to go through this class.\n */\nexport class LocusMediaRequest extends WebexPlugin {\n private config: Config;\n private latestAudioMuted?: boolean;\n private latestVideoMuted?: boolean;\n private isRequestInProgress: boolean;\n private queuedRequests: InternalRequestInfo[];\n private confluenceState: 'not created' | 'creation in progress' | 'created';\n /**\n * Constructor\n */\n constructor(config: Config, options: any) {\n super({}, options);\n this.isRequestInProgress = false;\n this.queuedRequests = [];\n this.config = config;\n this.confluenceState = 'not created';\n }\n\n /**\n * Add a request to the internal queue.\n */\n private addToQueue(info: InternalRequestInfo) {\n if (info.request.type === 'LocalMute' && this.queuedRequests.length > 0) {\n // We don't need additional local mute requests in the queue.\n // We only need at most 1 local mute or 1 roap request, because\n // roap requests also include mute state, so whatever request\n // is sent out, it will send the latest local mute state.\n // We only need to store the pendingPromises so that they get resolved\n // when the roap request is sent out.\n this.queuedRequests[0].addPendingPromises(info.getPendingPromises());\n\n return;\n }\n\n if (info.request.type === 'RoapMessage' && this.queuedRequests.length > 0) {\n // remove any LocalMute requests from the queue, because this Roap message\n // will also update the mute status in Locus, so they are redundant\n this.queuedRequests = this.queuedRequests.filter((r) => {\n if (r.request.type === 'LocalMute') {\n // we need to keep the pending promises from the local mute request\n // that we're removing from the queue\n info.addPendingPromises(r.getPendingPromises());\n\n return false;\n }\n\n return true;\n });\n }\n\n this.queuedRequests.push(info);\n }\n\n /**\n * Takes the next request from the queue and executes it. Once that\n * request is completed, the next one will be taken from the queue\n * and executed and this is repeated until the queue is empty.\n */\n private executeNextQueuedRequest(): void {\n if (this.isRequestInProgress) {\n return;\n }\n\n const nextRequest = this.queuedRequests.shift();\n\n if (nextRequest) {\n this.isRequestInProgress = true;\n nextRequest.execute().then(() => {\n this.isRequestInProgress = false;\n this.executeNextQueuedRequest();\n });\n }\n }\n\n /**\n * Returns latest requested audio and video mute values. If they have never been\n * requested, we assume audio/video to be muted.\n */\n private getLatestMuteState() {\n const audioMuted = this.latestAudioMuted !== undefined ? this.latestAudioMuted : true;\n const videoMuted = this.latestVideoMuted !== undefined ? this.latestVideoMuted : true;\n\n return {audioMuted, videoMuted};\n }\n\n /**\n * Prepares the uri and body for the media request to be sent to Locus\n */\n private sendHttpRequest(request: Request) {\n const uri = `${request.selfUrl}/${MEDIA}`;\n\n const {audioMuted, videoMuted} = this.getLatestMuteState();\n\n // first setup things common to all requests\n const body: any = {\n device: this.config.device,\n correlationId: this.config.correlationId,\n };\n\n const localMedias: any = {\n audioMuted,\n videoMuted,\n };\n\n // now add things specific to request type\n switch (request.type) {\n case 'LocalMute':\n body.respOnlySdp = true;\n body.usingResource = null;\n break;\n\n case 'RoapMessage':\n localMedias.roapMessage = request.roapMessage;\n localMedias.reachability = request.reachability;\n body.clientMediaPreferences = request.clientMediaPreferences;\n break;\n }\n\n if (request.sequence) {\n body.sequence = request.sequence;\n }\n\n body.localMedias = [\n {\n localSdp: JSON.stringify(localMedias), // this part must be JSON stringified, Locus requires this\n mediaId: request.mediaId,\n },\n ];\n\n LoggerProxy.logger.info(\n `Meeting:LocusMediaRequest#sendHttpRequest --> ${request.type} audioMuted=${audioMuted} videoMuted=${videoMuted}`\n );\n\n if (isRequestAffectingConfluenceState(request) && this.confluenceState === 'not created') {\n this.confluenceState = 'creation in progress';\n }\n\n const upload = new EventEmitter();\n const download = new EventEmitter();\n\n const options = {\n method: HTTP_VERBS.PUT,\n uri,\n body,\n upload,\n download,\n };\n\n // @ts-ignore\n const promise = this.request(options)\n .then((result) => {\n if (isRequestAffectingConfluenceState(request)) {\n this.confluenceState = 'created';\n }\n\n return result;\n })\n .catch((e) => {\n if (\n isRequestAffectingConfluenceState(request) &&\n this.confluenceState === 'creation in progress'\n ) {\n this.confluenceState = 'not created';\n }\n\n if (request.type === 'RoapMessage') {\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.locus.media.response',\n options: {\n meetingId: this.config.meetingId,\n rawError: e,\n },\n });\n }\n\n throw e;\n });\n\n if (request.type === 'RoapMessage') {\n const setupProgressListener = (direction: string, eventEmitter: EventEmitter) => {\n eventEmitter.on('progress', (progressEvent: ProgressEvent) => {\n LoggerProxy.logger.info(\n `${request.type}: ${direction} Progress, Timestamp: ${progressEvent.timeStamp}, Progress: ${progressEvent.loaded}/${progressEvent.total}`\n );\n });\n };\n\n setupProgressListener('Upload', options.upload);\n setupProgressListener('Download', options.download);\n }\n\n return promise;\n }\n\n /**\n * Sends a media request to Locus\n */\n public send(request: Request): Promise<RequestResult> {\n if (request.type === 'LocalMute') {\n const {audioMuted, videoMuted} = request.muteOptions;\n\n if (audioMuted !== undefined) {\n this.latestAudioMuted = audioMuted;\n }\n if (videoMuted !== undefined) {\n this.latestVideoMuted = videoMuted;\n }\n\n if (this.confluenceState === 'not created') {\n // if there is no confluence, there is no point sending out local mute request\n // as it will fail so we just store the latest audio/video muted values\n // and resolve immediately, so that higher layer (MuteState class) doesn't get blocked\n // and can call us again if user mutes/unmutes again before confluence is created\n LoggerProxy.logger.info(\n 'Meeting:LocusMediaRequest#send --> called with LocalMute request before confluence creation'\n );\n\n return Promise.resolve({});\n }\n }\n\n const pendingPromise = new Defer();\n\n const newRequest = new InternalRequestInfo(\n request,\n pendingPromise,\n this.sendHttpRequest.bind(this)\n );\n\n this.addToQueue(newRequest);\n\n defer(() => this.executeNextQueuedRequest());\n\n return pendingPromise.promise;\n }\n\n /** Returns true if a confluence on the server is already created */\n public isConfluenceCreated() {\n return this.confluenceState === 'created';\n }\n\n /**\n * This method needs to be called when we downgrade from multistream to transcoded connection.\n */\n public downgradeFromMultistreamToTranscoded() {\n this.config.preferTranscoding = true;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_lodash","require","_common","_events","_webexCore","_constants","_loggerProxy","_interopRequireDefault","_metrics","_constants2","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","InternalRequestInfo","request","pendingPromise","sendRequestFn","_classCallCheck2","_defineProperty2","pendingPromises","_createClass2","key","value","getPendingPromises","addPendingPromises","_this$pendingPromises","push","_toConsumableArray2","execute","_this","then","result","forEach","d","resolve","catch","reject","MAX_SELF_URL_RETRY_COUNT","isRequestAffectingConfluenceState","type","roapMessage","messageType","ROAP","ROAP_TYPES","OFFER","LocusMediaRequest","exports","_WebexPlugin","config","options","_this2","isRequestInProgress","queuedRequests","confluenceState","_inherits2","addToQueue","info","length","filter","r","executeNextQueuedRequest","_this3","nextRequest","shift","getLatestMuteState","audioMuted","latestAudioMuted","undefined","videoMuted","latestVideoMuted","_sendHttpRequest","_asyncToGenerator2","_regenerator","mark","_callee2","_this4","selfUrlRetryCount","uri","_this$getLatestMuteSt","body","localMedias","upload","download","promise","setupProgressListener","_args2","arguments","_t2","wrap","_context2","prev","next","selfUrl","getCurrentSelfUrl","concat","MEDIA","device","correlationId","respOnlySdp","usingResource","abrupt","reachability","clientMediaPreferences","sequence","localSdp","_stringify","mediaId","LoggerProxy","logger","EventEmitter","method","HTTP_VERBS","PUT","_ref","_callee","_t","_context","statusCode","shouldRetryOnSelfUrlChange","sent","sendHttpRequest","webex","internal","newMetrics","submitClientEvent","name","meetingId","rawError","stop","_x2","direction","eventEmitter","on","progressEvent","timeStamp","loaded","total","_x","currentSelfUrl","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","LOCUS_MEDIA_REQUEST_RETRY","correlation_id","reason","_shouldRetryOnSelfUrlChange","_callee3","_request$roapMessage","roapMessageType","latestSelfUrl","_context3","waitForSelfUrlChange","retryAttempt","_x3","_x4","send","_this5","_request$muteOptions","muteOptions","_promise","Defer","newRequest","bind","defer","isConfluenceCreated","downgradeFromMultistreamToTranscoded","preferTranscoding","WebexPlugin"],"sources":["locusMediaRequest.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport {defer} from 'lodash';\nimport {Defer} from '@webex/common';\nimport {EventEmitter} from 'events';\nimport {WebexPlugin} from '@webex/webex-core';\nimport {MEDIA, HTTP_VERBS, ROAP} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ClientMediaPreferences} from '../reachability/reachability.types';\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\n\nexport type MediaRequestType = 'RoapMessage' | 'LocalMute';\nexport type RequestResult = any;\n\nexport type RoapRequest = {\n type: 'RoapMessage';\n selfUrl: string;\n mediaId: string;\n roapMessage: any;\n reachability: any;\n clientMediaPreferences: ClientMediaPreferences;\n sequence?: any;\n};\n\nexport type LocalMuteRequest = {\n type: 'LocalMute';\n selfUrl: string;\n mediaId: string;\n sequence?: any;\n muteOptions: {\n audioMuted?: boolean;\n videoMuted?: boolean;\n };\n};\n\nexport type Request = RoapRequest | LocalMuteRequest;\n\n/** Class representing a single /media request being sent to Locus */\nclass InternalRequestInfo {\n public readonly request: Request;\n private pendingPromises: Defer[];\n private sendRequestFn: (request: Request, selfUrlRetryCount: number) => Promise<RequestResult>;\n\n /** Constructor */\n constructor(\n request: Request,\n pendingPromise: Defer,\n sendRequestFn: (request: Request, selfUrlRetryCount: number) => Promise<RequestResult>\n ) {\n this.request = request;\n this.pendingPromises = [pendingPromise];\n this.sendRequestFn = sendRequestFn;\n }\n\n /**\n * Returns the list of pending promises associated with this request\n */\n public getPendingPromises() {\n return this.pendingPromises;\n }\n\n /**\n * Adds promises to the list of pending promises associated with this request\n */\n public addPendingPromises(pendingPromises: Defer[]) {\n this.pendingPromises.push(...pendingPromises);\n }\n\n /**\n * Executes the request. Returned promise is resolved once the request\n * is completed (no matter if it succeeded or failed).\n */\n public execute(): Promise<void> {\n return this.sendRequestFn(this.request, 0)\n .then((result) => {\n // resolve all the pending promises associated with this request\n this.pendingPromises.forEach((d) => d.resolve(result));\n })\n .catch((e) => {\n // reject all the pending promises associated with this request\n this.pendingPromises.forEach((d) => d.reject(e));\n });\n }\n}\n\nexport type Config = {\n device: {\n url: string;\n deviceType: string;\n countryCode?: string;\n regionCode?: string;\n };\n correlationId: string;\n meetingId: string;\n preferTranscoding: boolean;\n getCurrentSelfUrl: () => string | undefined;\n waitForSelfUrlChange: () => Promise<void>;\n};\n\nconst MAX_SELF_URL_RETRY_COUNT = 2;\n\n/**\n * Returns true if the request is triggering confluence creation in the server\n */\nfunction isRequestAffectingConfluenceState(request: Request): boolean {\n return (\n request.type === 'RoapMessage' && request.roapMessage.messageType === ROAP.ROAP_TYPES.OFFER\n );\n}\n\n/**\n * This class manages all /media API requests to Locus. Every call to that\n * Locus API has to go through this class.\n */\nexport class LocusMediaRequest extends WebexPlugin {\n private config: Config;\n private latestAudioMuted?: boolean;\n private latestVideoMuted?: boolean;\n private isRequestInProgress: boolean;\n private queuedRequests: InternalRequestInfo[];\n private confluenceState: 'not created' | 'creation in progress' | 'created';\n /**\n * Constructor\n */\n constructor(config: Config, options: any) {\n super({}, options);\n this.isRequestInProgress = false;\n this.queuedRequests = [];\n this.config = config;\n this.confluenceState = 'not created';\n }\n\n /**\n * Add a request to the internal queue.\n */\n private addToQueue(info: InternalRequestInfo) {\n if (info.request.type === 'LocalMute' && this.queuedRequests.length > 0) {\n // We don't need additional local mute requests in the queue.\n // We only need at most 1 local mute or 1 roap request, because\n // roap requests also include mute state, so whatever request\n // is sent out, it will send the latest local mute state.\n // We only need to store the pendingPromises so that they get resolved\n // when the roap request is sent out.\n this.queuedRequests[0].addPendingPromises(info.getPendingPromises());\n\n return;\n }\n\n if (info.request.type === 'RoapMessage' && this.queuedRequests.length > 0) {\n // remove any LocalMute requests from the queue, because this Roap message\n // will also update the mute status in Locus, so they are redundant\n this.queuedRequests = this.queuedRequests.filter((r) => {\n if (r.request.type === 'LocalMute') {\n // we need to keep the pending promises from the local mute request\n // that we're removing from the queue\n info.addPendingPromises(r.getPendingPromises());\n\n return false;\n }\n\n return true;\n });\n }\n\n this.queuedRequests.push(info);\n }\n\n /**\n * Takes the next request from the queue and executes it. Once that\n * request is completed, the next one will be taken from the queue\n * and executed and this is repeated until the queue is empty.\n */\n private executeNextQueuedRequest(): void {\n if (this.isRequestInProgress) {\n return;\n }\n\n const nextRequest = this.queuedRequests.shift();\n\n if (nextRequest) {\n this.isRequestInProgress = true;\n nextRequest.execute().then(() => {\n this.isRequestInProgress = false;\n this.executeNextQueuedRequest();\n });\n }\n }\n\n /**\n * Returns latest requested audio and video mute values. If they have never been\n * requested, we assume audio/video to be muted.\n */\n private getLatestMuteState() {\n const audioMuted = this.latestAudioMuted !== undefined ? this.latestAudioMuted : true;\n const videoMuted = this.latestVideoMuted !== undefined ? this.latestVideoMuted : true;\n\n return {audioMuted, videoMuted};\n }\n\n /**\n * Prepares the uri and body for the media request to be sent to Locus\n */\n private async sendHttpRequest(request: Request, selfUrlRetryCount = 0) {\n // Resolve selfUrl lazily at send time. Locus rotates it on session\n // transitions (breakout end, move-to, lobby admit) and the value\n // captured upstream in roap/index.ts may be stale by the time we\n // leave the queue. Persist the resolved URL on the request so a\n // retry can detect a further rotation.\n request.selfUrl = this.getCurrentSelfUrl(request);\n const uri = `${request.selfUrl}/${MEDIA}`;\n\n const {audioMuted, videoMuted} = this.getLatestMuteState();\n\n // first setup things common to all requests\n const body: any = {\n device: this.config.device,\n correlationId: this.config.correlationId,\n };\n\n const localMedias: any = {\n audioMuted,\n videoMuted,\n };\n\n // now add things specific to request type\n switch (request.type) {\n case 'LocalMute':\n body.respOnlySdp = true;\n body.usingResource = null;\n break;\n\n case 'RoapMessage':\n localMedias.roapMessage = request.roapMessage;\n localMedias.reachability = request.reachability;\n body.clientMediaPreferences = request.clientMediaPreferences;\n break;\n }\n\n if (request.sequence) {\n body.sequence = request.sequence;\n }\n\n body.localMedias = [\n {\n localSdp: JSON.stringify(localMedias), // this part must be JSON stringified, Locus requires this\n mediaId: request.mediaId,\n },\n ];\n\n LoggerProxy.logger.info(\n `Meeting:LocusMediaRequest#sendHttpRequest --> ${request.type} audioMuted=${audioMuted} videoMuted=${videoMuted}`\n );\n\n if (isRequestAffectingConfluenceState(request) && this.confluenceState === 'not created') {\n this.confluenceState = 'creation in progress';\n }\n\n const upload = new EventEmitter();\n const download = new EventEmitter();\n\n const options = {\n method: HTTP_VERBS.PUT,\n uri,\n body,\n upload,\n download,\n };\n\n // @ts-ignore\n const promise = this.request(options)\n .then((result) => {\n if (isRequestAffectingConfluenceState(request)) {\n this.confluenceState = 'created';\n }\n\n return result;\n })\n .catch(async (e) => {\n if (\n e?.statusCode === 409 &&\n (await this.shouldRetryOnSelfUrlChange(request, selfUrlRetryCount))\n ) {\n // In-flight race: selfUrl rotated after we left the queue but\n // before Locus rejected the request. Re-send; getCurrentSelfUrl\n // will pick up the new URL. The returned promise replaces the\n // rejection, so the caller's pendingPromise resolves correctly.\n // Advance the retry count here so the guard in\n // shouldRetryOnSelfUrlChange eventually stops after\n // MAX_SELF_URL_RETRY_COUNT attempts.\n return this.sendHttpRequest(request, selfUrlRetryCount + 1);\n }\n\n if (\n isRequestAffectingConfluenceState(request) &&\n this.confluenceState === 'creation in progress'\n ) {\n this.confluenceState = 'not created';\n }\n\n if (request.type === 'RoapMessage') {\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.locus.media.response',\n options: {\n meetingId: this.config.meetingId,\n rawError: e,\n },\n });\n }\n\n throw e;\n });\n\n if (request.type === 'RoapMessage') {\n const setupProgressListener = (direction: string, eventEmitter: EventEmitter) => {\n eventEmitter.on('progress', (progressEvent: ProgressEvent) => {\n LoggerProxy.logger.info(\n `${request.type}: ${direction} Progress, Timestamp: ${progressEvent.timeStamp}, Progress: ${progressEvent.loaded}/${progressEvent.total}`\n );\n });\n };\n\n setupProgressListener('Upload', options.upload);\n setupProgressListener('Download', options.download);\n }\n\n return promise;\n }\n\n /**\n * Returns the latest selfUrl for this meeting, falling back to the value\n * captured when the request was enqueued.\n */\n private getCurrentSelfUrl(request: Request): string {\n const currentSelfUrl = this.config.getCurrentSelfUrl();\n\n if (currentSelfUrl && currentSelfUrl !== request.selfUrl) {\n LoggerProxy.logger.info(\n `Meeting:LocusMediaRequest#getCurrentSelfUrl --> resolved updated selfUrl, using ${currentSelfUrl}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.LOCUS_MEDIA_REQUEST_RETRY, {\n correlation_id: this.config.correlationId,\n reason: 'selfUrlUpdatedBeforeMediaRequest',\n });\n\n return currentSelfUrl;\n }\n\n return request.selfUrl;\n }\n\n /**\n * Decides whether a 409 warrants a retry against the meeting's latest\n * selfUrl.\n */\n private async shouldRetryOnSelfUrlChange(\n request: Request,\n selfUrlRetryCount: number\n ): Promise<boolean> {\n if (selfUrlRetryCount >= MAX_SELF_URL_RETRY_COUNT) {\n return false;\n }\n\n const roapMessageType =\n request.type === 'RoapMessage' ? request.roapMessage?.messageType : undefined;\n\n const currentSelfUrl = this.getCurrentSelfUrl(request);\n\n if (!currentSelfUrl || currentSelfUrl === request.selfUrl) {\n await this.config.waitForSelfUrlChange();\n\n const latestSelfUrl = this.getCurrentSelfUrl(request);\n\n if (!latestSelfUrl || latestSelfUrl === request.selfUrl) {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.LOCUS_MEDIA_REQUEST_RETRY, {\n correlation_id: this.config.correlationId,\n reason: 'selfUrlNotChangedAfterWait',\n retryAttempt: selfUrlRetryCount,\n roapMessageType,\n });\n LoggerProxy.logger.info(\n 'Meeting:LocusMediaRequest#sendHttpRequest --> 409 conflict, no new selfUrl even after waiting'\n );\n\n return false;\n }\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.LOCUS_MEDIA_REQUEST_RETRY, {\n correlation_id: this.config.correlationId,\n reason: 'selfUrlChangedAfterWait',\n retryAttempt: selfUrlRetryCount,\n roapMessageType,\n });\n }\n\n LoggerProxy.logger.info(\n `Meeting:LocusMediaRequest#sendHttpRequest --> 409 conflict, retrying ${request.type} with updated selfUrl`\n );\n\n return true;\n }\n\n /**\n * Sends a media request to Locus\n */\n public send(request: Request): Promise<RequestResult> {\n if (request.type === 'LocalMute') {\n const {audioMuted, videoMuted} = request.muteOptions;\n\n if (audioMuted !== undefined) {\n this.latestAudioMuted = audioMuted;\n }\n if (videoMuted !== undefined) {\n this.latestVideoMuted = videoMuted;\n }\n\n if (this.confluenceState === 'not created') {\n // if there is no confluence, there is no point sending out local mute request\n // as it will fail so we just store the latest audio/video muted values\n // and resolve immediately, so that higher layer (MuteState class) doesn't get blocked\n // and can call us again if user mutes/unmutes again before confluence is created\n LoggerProxy.logger.info(\n 'Meeting:LocusMediaRequest#send --> called with LocalMute request before confluence creation'\n );\n\n return Promise.resolve({});\n }\n }\n\n const pendingPromise = new Defer();\n\n const newRequest = new InternalRequestInfo(\n request,\n pendingPromise,\n this.sendHttpRequest.bind(this)\n );\n\n this.addToQueue(newRequest);\n\n defer(() => this.executeNextQueuedRequest());\n\n return pendingPromise.promise;\n }\n\n /** Returns true if a confluence on the server is already created */\n public isConfluenceCreated() {\n return this.confluenceState === 'created';\n }\n\n /**\n * This method needs to be called when we downgrade from multistream to transcoded connection.\n */\n public downgradeFromMultistreamToTranscoded() {\n this.config.preferTranscoding = true;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -339,7 +339,16 @@ var MuteState = exports.MuteState = /*#__PURE__*/function () {
|
|
|
339
339
|
}
|
|
340
340
|
if (muted !== undefined) {
|
|
341
341
|
this.state.server.remoteMute = muted;
|
|
342
|
-
|
|
342
|
+
// BO->Main may replay a stale remoteMute=false from the locus cache.
|
|
343
|
+
// Only enforce the mute on muted=true (also locking client.localMute so a later stale
|
|
344
|
+
// false can't flip isMuted()), and never touch the stream on muted=false — the
|
|
345
|
+
// legitimate server-driven unmute path is LOCAL_UNMUTE_REQUIRED. Always sync client
|
|
346
|
+
// intent back so other participants' tiles still show the mute icon.
|
|
347
|
+
if (muted) {
|
|
348
|
+
this.state.client.localMute = true;
|
|
349
|
+
this.muteLocalStream(meeting, true, 'remotelyMuted');
|
|
350
|
+
}
|
|
351
|
+
this.applyClientStateToServer(meeting);
|
|
343
352
|
}
|
|
344
353
|
}
|
|
345
354
|
|