@webex/web-client-media-engine 3.16.0 → 3.17.1
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/cjs/index.js +86 -67
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +86 -67
- package/dist/esm/index.js.map +1 -1
- package/dist/types/index.d.ts +7 -5
- package/package.json +1 -1
package/dist/cjs/index.js
CHANGED
|
@@ -10464,6 +10464,7 @@ class Transceiver {
|
|
|
10464
10464
|
class ReceiveOnlyTransceiver extends Transceiver {
|
|
10465
10465
|
constructor(rtcRtpTransceiver, mid, munger) {
|
|
10466
10466
|
super(rtcRtpTransceiver, mid);
|
|
10467
|
+
this.metadata = { isActiveSpeaker: false };
|
|
10467
10468
|
this.munger = munger;
|
|
10468
10469
|
this._receiveSlot = new ReceiveSlot(() => {
|
|
10469
10470
|
if (!this._rtcRtpTransceiver.mid) {
|
|
@@ -10484,7 +10485,24 @@ class ReceiveOnlyTransceiver extends Transceiver {
|
|
|
10484
10485
|
return this._receiveSlot;
|
|
10485
10486
|
}
|
|
10486
10487
|
getStats() {
|
|
10487
|
-
return this
|
|
10488
|
+
return __awaiter$1(this, void 0, void 0, function* () {
|
|
10489
|
+
const statsMap = new Map();
|
|
10490
|
+
const statsReport = yield this.receiver.getStats();
|
|
10491
|
+
statsReport.forEach((stats, key) => {
|
|
10492
|
+
if (stats.type === 'inbound-rtp') {
|
|
10493
|
+
stats.mid = this.mid;
|
|
10494
|
+
stats.csi = this.receiveSlot.currentRxCsi;
|
|
10495
|
+
stats.calliopeMediaType = this.metadata.mediaType;
|
|
10496
|
+
stats.requestedBitrate = this.metadata.requestedBitrate;
|
|
10497
|
+
stats.requestedFrameSize = this.metadata.requestedFrameSize;
|
|
10498
|
+
stats.isActiveSpeaker = this.metadata.isActiveSpeaker;
|
|
10499
|
+
stats.lastActiveSpeakerUpdateTimestamp = this.metadata.lastActiveSpeakerUpdateTimestamp;
|
|
10500
|
+
Object.assign(stats, this.receiverId);
|
|
10501
|
+
}
|
|
10502
|
+
statsMap.set(key, stats);
|
|
10503
|
+
});
|
|
10504
|
+
return statsMap;
|
|
10505
|
+
});
|
|
10488
10506
|
}
|
|
10489
10507
|
mungeLocalDescription(mediaDescription) {
|
|
10490
10508
|
this.munger.mungeLocalDescription(mediaDescription, { twccDisabled: this.twccDisabled });
|
|
@@ -10498,6 +10516,22 @@ class ReceiveOnlyTransceiver extends Transceiver {
|
|
|
10498
10516
|
resetSdpMunger() {
|
|
10499
10517
|
this.munger.reset();
|
|
10500
10518
|
}
|
|
10519
|
+
handleRequested(streamRequest) {
|
|
10520
|
+
var _a, _b;
|
|
10521
|
+
this.metadata.requestedBitrate = streamRequest.maxPayloadBitsPerSecond;
|
|
10522
|
+
this.metadata.requestedFrameSize = (_b = (_a = streamRequest.codecInfos[0]) === null || _a === void 0 ? void 0 : _a.h264) === null || _b === void 0 ? void 0 : _b.maxFs;
|
|
10523
|
+
}
|
|
10524
|
+
handleUnrequested() {
|
|
10525
|
+
this.metadata.requestedBitrate = undefined;
|
|
10526
|
+
this.metadata.requestedFrameSize = undefined;
|
|
10527
|
+
this.receiveSlot._updateSource('no source', undefined);
|
|
10528
|
+
}
|
|
10529
|
+
handleActiveSpeakerUpdate(value) {
|
|
10530
|
+
this.metadata.isActiveSpeaker = value;
|
|
10531
|
+
if (value) {
|
|
10532
|
+
this.metadata.lastActiveSpeakerUpdateTimestamp = performance.timeOrigin + performance.now();
|
|
10533
|
+
}
|
|
10534
|
+
}
|
|
10501
10535
|
}
|
|
10502
10536
|
ReceiveOnlyTransceiver.rid = '1';
|
|
10503
10537
|
|
|
@@ -14317,7 +14351,29 @@ class SendOnlyTransceiver extends Transceiver {
|
|
|
14317
14351
|
}
|
|
14318
14352
|
}
|
|
14319
14353
|
getStats() {
|
|
14320
|
-
return this
|
|
14354
|
+
return __awaiter$1(this, void 0, void 0, function* () {
|
|
14355
|
+
const statsMap = new Map();
|
|
14356
|
+
const statsReport = yield this.sender.getStats();
|
|
14357
|
+
statsReport.forEach((stats, key) => {
|
|
14358
|
+
var _a;
|
|
14359
|
+
if (stats.type === 'outbound-rtp') {
|
|
14360
|
+
stats.mid = this.mid;
|
|
14361
|
+
stats.csi = this.csi;
|
|
14362
|
+
stats.calliopeMediaType = this.mediaType;
|
|
14363
|
+
stats.requestedBitrate = this.getRequestedBitrate(stats.ssrc);
|
|
14364
|
+
stats.requestedFrameSize = this.getRequestedFrameSize(stats.ssrc);
|
|
14365
|
+
const trackSettings = (_a = this.publishedStream) === null || _a === void 0 ? void 0 : _a.getSettings();
|
|
14366
|
+
if (trackSettings === null || trackSettings === void 0 ? void 0 : trackSettings.frameRate) {
|
|
14367
|
+
stats.targetFrameRate = trackSettings === null || trackSettings === void 0 ? void 0 : trackSettings.frameRate;
|
|
14368
|
+
}
|
|
14369
|
+
}
|
|
14370
|
+
else if (stats.type === 'media-source') {
|
|
14371
|
+
stats.calliopeMediaType = this.mediaType;
|
|
14372
|
+
}
|
|
14373
|
+
statsMap.set(key, stats);
|
|
14374
|
+
});
|
|
14375
|
+
return statsMap;
|
|
14376
|
+
});
|
|
14321
14377
|
}
|
|
14322
14378
|
updateSendParameters(requestedIdEncodingParamsMap) {
|
|
14323
14379
|
return __awaiter$1(this, void 0, void 0, function* () {
|
|
@@ -14488,14 +14544,8 @@ const organizeTransceiverStats = (sendTransceivers, recvTransceivers) => __await
|
|
|
14488
14544
|
};
|
|
14489
14545
|
yield Promise.all([...sendTransceivers.entries()].map(([mediaType, transceiver]) => __awaiter$1(void 0, void 0, void 0, function* () {
|
|
14490
14546
|
var _a;
|
|
14491
|
-
const report = [];
|
|
14492
|
-
(yield transceiver.getStats()).forEach((senderStats) => {
|
|
14493
|
-
if (senderStats.type === 'outbound-rtp') {
|
|
14494
|
-
report.push(Object.assign(Object.assign({}, senderStats), { requestedBitrate: transceiver.getRequestedBitrate(senderStats.ssrc), requestedFrameSize: transceiver.getRequestedFrameSize(senderStats.ssrc) }));
|
|
14495
|
-
}
|
|
14496
|
-
});
|
|
14497
14547
|
const item = {
|
|
14498
|
-
report,
|
|
14548
|
+
report: yield transceiver.getStats(),
|
|
14499
14549
|
mid: transceiver.mid,
|
|
14500
14550
|
csi: transceiver.csi,
|
|
14501
14551
|
currentDirection: 'sendonly',
|
|
@@ -14517,14 +14567,8 @@ const organizeTransceiverStats = (sendTransceivers, recvTransceivers) => __await
|
|
|
14517
14567
|
yield Promise.all([...recvTransceivers.entries()].map(([mediaType, transceivers]) => __awaiter$1(void 0, void 0, void 0, function* () {
|
|
14518
14568
|
return Promise.all(transceivers.map((t) => __awaiter$1(void 0, void 0, void 0, function* () {
|
|
14519
14569
|
var _b, _c;
|
|
14520
|
-
const report = [];
|
|
14521
|
-
(yield t.getStats()).forEach((receiverStats) => {
|
|
14522
|
-
if (receiverStats.type === 'inbound-rtp') {
|
|
14523
|
-
report.push(Object.assign(Object.assign({}, receiverStats), { requestedBitrate: t.requestedBitrate, requestedFrameSize: t.requestedFrameSize }));
|
|
14524
|
-
}
|
|
14525
|
-
});
|
|
14526
14570
|
const item = {
|
|
14527
|
-
report,
|
|
14571
|
+
report: yield t.getStats(),
|
|
14528
14572
|
mid: (_b = t.receiveSlot.id) === null || _b === void 0 ? void 0 : _b.mid,
|
|
14529
14573
|
csi: t.receiveSlot.currentRxCsi,
|
|
14530
14574
|
currentDirection: 'recvonly',
|
|
@@ -14772,6 +14816,15 @@ SCTP Max Message Size: ${maxMessageSize}`);
|
|
|
14772
14816
|
});
|
|
14773
14817
|
jmpSession.on(JmpSessionEvents.ActiveSpeaker, (data) => {
|
|
14774
14818
|
this.emit(exports.MultistreamConnectionEventNames.ActiveSpeakerNotification, data.csis);
|
|
14819
|
+
this.recvTransceivers.forEach((transceivers) => {
|
|
14820
|
+
transceivers.forEach((t) => {
|
|
14821
|
+
const { currentRxCsi } = t.receiveSlot;
|
|
14822
|
+
if (currentRxCsi !== undefined) {
|
|
14823
|
+
const isActiveSpeaker = data.csis.some((activeCsi) => (activeCsi & 0xfffffffe) === (currentRxCsi & 0xfffffffe));
|
|
14824
|
+
t.handleActiveSpeakerUpdate(isActiveSpeaker);
|
|
14825
|
+
}
|
|
14826
|
+
});
|
|
14827
|
+
});
|
|
14775
14828
|
});
|
|
14776
14829
|
this.jmpSessions.set(mediaType, jmpSession);
|
|
14777
14830
|
}
|
|
@@ -14957,6 +15010,7 @@ SCTP Max Message Size: ${maxMessageSize}`);
|
|
|
14957
15010
|
const transceiverMid = this.midPredictor.getNextMid(mediaType);
|
|
14958
15011
|
const munger = new IngressSdpMunger();
|
|
14959
15012
|
const recvOnlyTransceiver = new ReceiveOnlyTransceiver(rtcRtpTransceiver, transceiverMid, munger);
|
|
15013
|
+
recvOnlyTransceiver.metadata.mediaType = mediaType;
|
|
14960
15014
|
recvOnlyTransceiver.twccDisabled =
|
|
14961
15015
|
getMediaFamily(mediaType) === exports.MediaFamily.Audio ? this.options.disableAudioTwcc : false;
|
|
14962
15016
|
this.recvTransceivers.set(mediaType, [
|
|
@@ -15230,35 +15284,24 @@ SCTP Max Message Size: ${maxMessageSize}`);
|
|
|
15230
15284
|
return;
|
|
15231
15285
|
}
|
|
15232
15286
|
const requestedReceiveSlotIds = [];
|
|
15233
|
-
streamRequests.forEach((
|
|
15234
|
-
|
|
15235
|
-
if (!
|
|
15287
|
+
streamRequests.forEach((request) => {
|
|
15288
|
+
request.receiveSlots.forEach((slot) => {
|
|
15289
|
+
if (!slot.id) {
|
|
15236
15290
|
logger.error(`Running stream request task, but ReceiveSlot ID is missing!`);
|
|
15237
15291
|
return;
|
|
15238
15292
|
}
|
|
15239
|
-
requestedReceiveSlotIds.push(
|
|
15293
|
+
requestedReceiveSlotIds.push(slot.id);
|
|
15240
15294
|
});
|
|
15241
15295
|
});
|
|
15296
|
+
jmpSession.sendRequests(streamRequests.map((sr) => sr._toJmpStreamRequest()));
|
|
15242
15297
|
(_a = this.recvTransceivers.get(mediaType)) === null || _a === void 0 ? void 0 : _a.forEach((transceiver) => {
|
|
15243
|
-
if (
|
|
15244
|
-
|
|
15298
|
+
if (requestedReceiveSlotIds.some((id) => compareStreamIds(id, transceiver.receiveSlot.id))) {
|
|
15299
|
+
const relevantRequest = streamRequests.find((request) => request.receiveSlots.some((slot) => compareStreamIds(slot.id, transceiver.receiveSlot.id)));
|
|
15300
|
+
transceiver.handleRequested(relevantRequest);
|
|
15301
|
+
}
|
|
15302
|
+
else {
|
|
15303
|
+
transceiver.handleUnrequested();
|
|
15245
15304
|
}
|
|
15246
|
-
});
|
|
15247
|
-
jmpSession.sendRequests(streamRequests.map((sr) => sr._toJmpStreamRequest()));
|
|
15248
|
-
streamRequests.forEach((sr) => {
|
|
15249
|
-
var _a;
|
|
15250
|
-
const isAffectedInStreamRequest = (t) => sr.receiveSlots.some((rs) => rs.id && compareStreamIds(rs.id, t.receiverId));
|
|
15251
|
-
(_a = this.recvTransceivers.get(mediaType)) === null || _a === void 0 ? void 0 : _a.forEach((t) => {
|
|
15252
|
-
var _a, _b;
|
|
15253
|
-
if (isAffectedInStreamRequest(t)) {
|
|
15254
|
-
t.requestedBitrate = sr.maxPayloadBitsPerSecond;
|
|
15255
|
-
t.requestedFrameSize = (_b = (_a = sr.codecInfos[0]) === null || _a === void 0 ? void 0 : _a.h264) === null || _b === void 0 ? void 0 : _b.maxFs;
|
|
15256
|
-
}
|
|
15257
|
-
else {
|
|
15258
|
-
t.requestedBitrate = undefined;
|
|
15259
|
-
t.requestedFrameSize = undefined;
|
|
15260
|
-
}
|
|
15261
|
-
});
|
|
15262
15305
|
});
|
|
15263
15306
|
};
|
|
15264
15307
|
if (((_a = this.dataChannel) === null || _a === void 0 ? void 0 : _a.readyState) === 'open') {
|
|
@@ -15324,42 +15367,18 @@ SCTP Max Message Size: ${maxMessageSize}`);
|
|
|
15324
15367
|
}
|
|
15325
15368
|
preProcessStats(stats) {
|
|
15326
15369
|
return __awaiter$1(this, void 0, void 0, function* () {
|
|
15327
|
-
yield Promise.all([...this.sendTransceivers.
|
|
15370
|
+
yield Promise.all([...this.sendTransceivers.values()].map((transceiver) => __awaiter$1(this, void 0, void 0, function* () {
|
|
15328
15371
|
(yield transceiver.getStats()).forEach((senderStats) => {
|
|
15329
|
-
|
|
15330
|
-
|
|
15331
|
-
const statsToModify = stats.get(senderStats.id);
|
|
15332
|
-
statsToModify.mid = transceiver.mid;
|
|
15333
|
-
statsToModify.csi = transceiver.csi;
|
|
15334
|
-
statsToModify.calliopeMediaType = mediaType;
|
|
15335
|
-
statsToModify.requestedBitrate = transceiver.getRequestedBitrate(senderStats.ssrc);
|
|
15336
|
-
statsToModify.requestedFrameSize = transceiver.getRequestedFrameSize(senderStats.ssrc);
|
|
15337
|
-
const trackSettings = (_a = transceiver.publishedStream) === null || _a === void 0 ? void 0 : _a.getSettings();
|
|
15338
|
-
if (trackSettings === null || trackSettings === void 0 ? void 0 : trackSettings.frameRate) {
|
|
15339
|
-
statsToModify.targetFrameRate = trackSettings === null || trackSettings === void 0 ? void 0 : trackSettings.frameRate;
|
|
15340
|
-
}
|
|
15341
|
-
stats.set(senderStats.id, statsToModify);
|
|
15342
|
-
}
|
|
15343
|
-
else if (senderStats.type === 'media-source') {
|
|
15344
|
-
const statsToModify = stats.get(senderStats.id);
|
|
15345
|
-
statsToModify.calliopeMediaType = mediaType;
|
|
15346
|
-
stats.set(senderStats.id, statsToModify);
|
|
15372
|
+
if (senderStats.type === 'outbound-rtp' || senderStats.type === 'media-source') {
|
|
15373
|
+
stats.set(senderStats.id, senderStats);
|
|
15347
15374
|
}
|
|
15348
15375
|
});
|
|
15349
15376
|
})));
|
|
15350
|
-
yield Promise.all([...this.recvTransceivers.
|
|
15377
|
+
yield Promise.all([...this.recvTransceivers.values()].map((transceivers) => __awaiter$1(this, void 0, void 0, function* () {
|
|
15351
15378
|
yield Promise.all(transceivers.map((transceiver) => __awaiter$1(this, void 0, void 0, function* () {
|
|
15352
15379
|
(yield transceiver.getStats()).forEach((receiverStats) => {
|
|
15353
|
-
var _a;
|
|
15354
15380
|
if (receiverStats.type === 'inbound-rtp') {
|
|
15355
|
-
|
|
15356
|
-
statsToModify.mid = (_a = transceiver.receiveSlot.id) === null || _a === void 0 ? void 0 : _a.mid;
|
|
15357
|
-
statsToModify.csi = transceiver.receiveSlot.currentRxCsi;
|
|
15358
|
-
statsToModify.calliopeMediaType = mediaType;
|
|
15359
|
-
statsToModify.requestedBitrate = transceiver.requestedBitrate;
|
|
15360
|
-
statsToModify.requestedFrameSize = transceiver.requestedFrameSize;
|
|
15361
|
-
Object.assign(statsToModify, transceiver.receiverId);
|
|
15362
|
-
stats.set(receiverStats.id, statsToModify);
|
|
15381
|
+
stats.set(receiverStats.id, receiverStats);
|
|
15363
15382
|
}
|
|
15364
15383
|
});
|
|
15365
15384
|
})));
|