@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/esm/index.js
CHANGED
|
@@ -10460,6 +10460,7 @@ class Transceiver {
|
|
|
10460
10460
|
class ReceiveOnlyTransceiver extends Transceiver {
|
|
10461
10461
|
constructor(rtcRtpTransceiver, mid, munger) {
|
|
10462
10462
|
super(rtcRtpTransceiver, mid);
|
|
10463
|
+
this.metadata = { isActiveSpeaker: false };
|
|
10463
10464
|
this.munger = munger;
|
|
10464
10465
|
this._receiveSlot = new ReceiveSlot(() => {
|
|
10465
10466
|
if (!this._rtcRtpTransceiver.mid) {
|
|
@@ -10480,7 +10481,24 @@ class ReceiveOnlyTransceiver extends Transceiver {
|
|
|
10480
10481
|
return this._receiveSlot;
|
|
10481
10482
|
}
|
|
10482
10483
|
getStats() {
|
|
10483
|
-
return this
|
|
10484
|
+
return __awaiter$1(this, void 0, void 0, function* () {
|
|
10485
|
+
const statsMap = new Map();
|
|
10486
|
+
const statsReport = yield this.receiver.getStats();
|
|
10487
|
+
statsReport.forEach((stats, key) => {
|
|
10488
|
+
if (stats.type === 'inbound-rtp') {
|
|
10489
|
+
stats.mid = this.mid;
|
|
10490
|
+
stats.csi = this.receiveSlot.currentRxCsi;
|
|
10491
|
+
stats.calliopeMediaType = this.metadata.mediaType;
|
|
10492
|
+
stats.requestedBitrate = this.metadata.requestedBitrate;
|
|
10493
|
+
stats.requestedFrameSize = this.metadata.requestedFrameSize;
|
|
10494
|
+
stats.isActiveSpeaker = this.metadata.isActiveSpeaker;
|
|
10495
|
+
stats.lastActiveSpeakerUpdateTimestamp = this.metadata.lastActiveSpeakerUpdateTimestamp;
|
|
10496
|
+
Object.assign(stats, this.receiverId);
|
|
10497
|
+
}
|
|
10498
|
+
statsMap.set(key, stats);
|
|
10499
|
+
});
|
|
10500
|
+
return statsMap;
|
|
10501
|
+
});
|
|
10484
10502
|
}
|
|
10485
10503
|
mungeLocalDescription(mediaDescription) {
|
|
10486
10504
|
this.munger.mungeLocalDescription(mediaDescription, { twccDisabled: this.twccDisabled });
|
|
@@ -10494,6 +10512,22 @@ class ReceiveOnlyTransceiver extends Transceiver {
|
|
|
10494
10512
|
resetSdpMunger() {
|
|
10495
10513
|
this.munger.reset();
|
|
10496
10514
|
}
|
|
10515
|
+
handleRequested(streamRequest) {
|
|
10516
|
+
var _a, _b;
|
|
10517
|
+
this.metadata.requestedBitrate = streamRequest.maxPayloadBitsPerSecond;
|
|
10518
|
+
this.metadata.requestedFrameSize = (_b = (_a = streamRequest.codecInfos[0]) === null || _a === void 0 ? void 0 : _a.h264) === null || _b === void 0 ? void 0 : _b.maxFs;
|
|
10519
|
+
}
|
|
10520
|
+
handleUnrequested() {
|
|
10521
|
+
this.metadata.requestedBitrate = undefined;
|
|
10522
|
+
this.metadata.requestedFrameSize = undefined;
|
|
10523
|
+
this.receiveSlot._updateSource('no source', undefined);
|
|
10524
|
+
}
|
|
10525
|
+
handleActiveSpeakerUpdate(value) {
|
|
10526
|
+
this.metadata.isActiveSpeaker = value;
|
|
10527
|
+
if (value) {
|
|
10528
|
+
this.metadata.lastActiveSpeakerUpdateTimestamp = performance.timeOrigin + performance.now();
|
|
10529
|
+
}
|
|
10530
|
+
}
|
|
10497
10531
|
}
|
|
10498
10532
|
ReceiveOnlyTransceiver.rid = '1';
|
|
10499
10533
|
|
|
@@ -14313,7 +14347,29 @@ class SendOnlyTransceiver extends Transceiver {
|
|
|
14313
14347
|
}
|
|
14314
14348
|
}
|
|
14315
14349
|
getStats() {
|
|
14316
|
-
return this
|
|
14350
|
+
return __awaiter$1(this, void 0, void 0, function* () {
|
|
14351
|
+
const statsMap = new Map();
|
|
14352
|
+
const statsReport = yield this.sender.getStats();
|
|
14353
|
+
statsReport.forEach((stats, key) => {
|
|
14354
|
+
var _a;
|
|
14355
|
+
if (stats.type === 'outbound-rtp') {
|
|
14356
|
+
stats.mid = this.mid;
|
|
14357
|
+
stats.csi = this.csi;
|
|
14358
|
+
stats.calliopeMediaType = this.mediaType;
|
|
14359
|
+
stats.requestedBitrate = this.getRequestedBitrate(stats.ssrc);
|
|
14360
|
+
stats.requestedFrameSize = this.getRequestedFrameSize(stats.ssrc);
|
|
14361
|
+
const trackSettings = (_a = this.publishedStream) === null || _a === void 0 ? void 0 : _a.getSettings();
|
|
14362
|
+
if (trackSettings === null || trackSettings === void 0 ? void 0 : trackSettings.frameRate) {
|
|
14363
|
+
stats.targetFrameRate = trackSettings === null || trackSettings === void 0 ? void 0 : trackSettings.frameRate;
|
|
14364
|
+
}
|
|
14365
|
+
}
|
|
14366
|
+
else if (stats.type === 'media-source') {
|
|
14367
|
+
stats.calliopeMediaType = this.mediaType;
|
|
14368
|
+
}
|
|
14369
|
+
statsMap.set(key, stats);
|
|
14370
|
+
});
|
|
14371
|
+
return statsMap;
|
|
14372
|
+
});
|
|
14317
14373
|
}
|
|
14318
14374
|
updateSendParameters(requestedIdEncodingParamsMap) {
|
|
14319
14375
|
return __awaiter$1(this, void 0, void 0, function* () {
|
|
@@ -14484,14 +14540,8 @@ const organizeTransceiverStats = (sendTransceivers, recvTransceivers) => __await
|
|
|
14484
14540
|
};
|
|
14485
14541
|
yield Promise.all([...sendTransceivers.entries()].map(([mediaType, transceiver]) => __awaiter$1(void 0, void 0, void 0, function* () {
|
|
14486
14542
|
var _a;
|
|
14487
|
-
const report = [];
|
|
14488
|
-
(yield transceiver.getStats()).forEach((senderStats) => {
|
|
14489
|
-
if (senderStats.type === 'outbound-rtp') {
|
|
14490
|
-
report.push(Object.assign(Object.assign({}, senderStats), { requestedBitrate: transceiver.getRequestedBitrate(senderStats.ssrc), requestedFrameSize: transceiver.getRequestedFrameSize(senderStats.ssrc) }));
|
|
14491
|
-
}
|
|
14492
|
-
});
|
|
14493
14543
|
const item = {
|
|
14494
|
-
report,
|
|
14544
|
+
report: yield transceiver.getStats(),
|
|
14495
14545
|
mid: transceiver.mid,
|
|
14496
14546
|
csi: transceiver.csi,
|
|
14497
14547
|
currentDirection: 'sendonly',
|
|
@@ -14513,14 +14563,8 @@ const organizeTransceiverStats = (sendTransceivers, recvTransceivers) => __await
|
|
|
14513
14563
|
yield Promise.all([...recvTransceivers.entries()].map(([mediaType, transceivers]) => __awaiter$1(void 0, void 0, void 0, function* () {
|
|
14514
14564
|
return Promise.all(transceivers.map((t) => __awaiter$1(void 0, void 0, void 0, function* () {
|
|
14515
14565
|
var _b, _c;
|
|
14516
|
-
const report = [];
|
|
14517
|
-
(yield t.getStats()).forEach((receiverStats) => {
|
|
14518
|
-
if (receiverStats.type === 'inbound-rtp') {
|
|
14519
|
-
report.push(Object.assign(Object.assign({}, receiverStats), { requestedBitrate: t.requestedBitrate, requestedFrameSize: t.requestedFrameSize }));
|
|
14520
|
-
}
|
|
14521
|
-
});
|
|
14522
14566
|
const item = {
|
|
14523
|
-
report,
|
|
14567
|
+
report: yield t.getStats(),
|
|
14524
14568
|
mid: (_b = t.receiveSlot.id) === null || _b === void 0 ? void 0 : _b.mid,
|
|
14525
14569
|
csi: t.receiveSlot.currentRxCsi,
|
|
14526
14570
|
currentDirection: 'recvonly',
|
|
@@ -14768,6 +14812,15 @@ SCTP Max Message Size: ${maxMessageSize}`);
|
|
|
14768
14812
|
});
|
|
14769
14813
|
jmpSession.on(JmpSessionEvents.ActiveSpeaker, (data) => {
|
|
14770
14814
|
this.emit(MultistreamConnectionEventNames.ActiveSpeakerNotification, data.csis);
|
|
14815
|
+
this.recvTransceivers.forEach((transceivers) => {
|
|
14816
|
+
transceivers.forEach((t) => {
|
|
14817
|
+
const { currentRxCsi } = t.receiveSlot;
|
|
14818
|
+
if (currentRxCsi !== undefined) {
|
|
14819
|
+
const isActiveSpeaker = data.csis.some((activeCsi) => (activeCsi & 0xfffffffe) === (currentRxCsi & 0xfffffffe));
|
|
14820
|
+
t.handleActiveSpeakerUpdate(isActiveSpeaker);
|
|
14821
|
+
}
|
|
14822
|
+
});
|
|
14823
|
+
});
|
|
14771
14824
|
});
|
|
14772
14825
|
this.jmpSessions.set(mediaType, jmpSession);
|
|
14773
14826
|
}
|
|
@@ -14953,6 +15006,7 @@ SCTP Max Message Size: ${maxMessageSize}`);
|
|
|
14953
15006
|
const transceiverMid = this.midPredictor.getNextMid(mediaType);
|
|
14954
15007
|
const munger = new IngressSdpMunger();
|
|
14955
15008
|
const recvOnlyTransceiver = new ReceiveOnlyTransceiver(rtcRtpTransceiver, transceiverMid, munger);
|
|
15009
|
+
recvOnlyTransceiver.metadata.mediaType = mediaType;
|
|
14956
15010
|
recvOnlyTransceiver.twccDisabled =
|
|
14957
15011
|
getMediaFamily(mediaType) === MediaFamily.Audio ? this.options.disableAudioTwcc : false;
|
|
14958
15012
|
this.recvTransceivers.set(mediaType, [
|
|
@@ -15226,35 +15280,24 @@ SCTP Max Message Size: ${maxMessageSize}`);
|
|
|
15226
15280
|
return;
|
|
15227
15281
|
}
|
|
15228
15282
|
const requestedReceiveSlotIds = [];
|
|
15229
|
-
streamRequests.forEach((
|
|
15230
|
-
|
|
15231
|
-
if (!
|
|
15283
|
+
streamRequests.forEach((request) => {
|
|
15284
|
+
request.receiveSlots.forEach((slot) => {
|
|
15285
|
+
if (!slot.id) {
|
|
15232
15286
|
logger.error(`Running stream request task, but ReceiveSlot ID is missing!`);
|
|
15233
15287
|
return;
|
|
15234
15288
|
}
|
|
15235
|
-
requestedReceiveSlotIds.push(
|
|
15289
|
+
requestedReceiveSlotIds.push(slot.id);
|
|
15236
15290
|
});
|
|
15237
15291
|
});
|
|
15292
|
+
jmpSession.sendRequests(streamRequests.map((sr) => sr._toJmpStreamRequest()));
|
|
15238
15293
|
(_a = this.recvTransceivers.get(mediaType)) === null || _a === void 0 ? void 0 : _a.forEach((transceiver) => {
|
|
15239
|
-
if (
|
|
15240
|
-
|
|
15294
|
+
if (requestedReceiveSlotIds.some((id) => compareStreamIds(id, transceiver.receiveSlot.id))) {
|
|
15295
|
+
const relevantRequest = streamRequests.find((request) => request.receiveSlots.some((slot) => compareStreamIds(slot.id, transceiver.receiveSlot.id)));
|
|
15296
|
+
transceiver.handleRequested(relevantRequest);
|
|
15297
|
+
}
|
|
15298
|
+
else {
|
|
15299
|
+
transceiver.handleUnrequested();
|
|
15241
15300
|
}
|
|
15242
|
-
});
|
|
15243
|
-
jmpSession.sendRequests(streamRequests.map((sr) => sr._toJmpStreamRequest()));
|
|
15244
|
-
streamRequests.forEach((sr) => {
|
|
15245
|
-
var _a;
|
|
15246
|
-
const isAffectedInStreamRequest = (t) => sr.receiveSlots.some((rs) => rs.id && compareStreamIds(rs.id, t.receiverId));
|
|
15247
|
-
(_a = this.recvTransceivers.get(mediaType)) === null || _a === void 0 ? void 0 : _a.forEach((t) => {
|
|
15248
|
-
var _a, _b;
|
|
15249
|
-
if (isAffectedInStreamRequest(t)) {
|
|
15250
|
-
t.requestedBitrate = sr.maxPayloadBitsPerSecond;
|
|
15251
|
-
t.requestedFrameSize = (_b = (_a = sr.codecInfos[0]) === null || _a === void 0 ? void 0 : _a.h264) === null || _b === void 0 ? void 0 : _b.maxFs;
|
|
15252
|
-
}
|
|
15253
|
-
else {
|
|
15254
|
-
t.requestedBitrate = undefined;
|
|
15255
|
-
t.requestedFrameSize = undefined;
|
|
15256
|
-
}
|
|
15257
|
-
});
|
|
15258
15301
|
});
|
|
15259
15302
|
};
|
|
15260
15303
|
if (((_a = this.dataChannel) === null || _a === void 0 ? void 0 : _a.readyState) === 'open') {
|
|
@@ -15320,42 +15363,18 @@ SCTP Max Message Size: ${maxMessageSize}`);
|
|
|
15320
15363
|
}
|
|
15321
15364
|
preProcessStats(stats) {
|
|
15322
15365
|
return __awaiter$1(this, void 0, void 0, function* () {
|
|
15323
|
-
yield Promise.all([...this.sendTransceivers.
|
|
15366
|
+
yield Promise.all([...this.sendTransceivers.values()].map((transceiver) => __awaiter$1(this, void 0, void 0, function* () {
|
|
15324
15367
|
(yield transceiver.getStats()).forEach((senderStats) => {
|
|
15325
|
-
|
|
15326
|
-
|
|
15327
|
-
const statsToModify = stats.get(senderStats.id);
|
|
15328
|
-
statsToModify.mid = transceiver.mid;
|
|
15329
|
-
statsToModify.csi = transceiver.csi;
|
|
15330
|
-
statsToModify.calliopeMediaType = mediaType;
|
|
15331
|
-
statsToModify.requestedBitrate = transceiver.getRequestedBitrate(senderStats.ssrc);
|
|
15332
|
-
statsToModify.requestedFrameSize = transceiver.getRequestedFrameSize(senderStats.ssrc);
|
|
15333
|
-
const trackSettings = (_a = transceiver.publishedStream) === null || _a === void 0 ? void 0 : _a.getSettings();
|
|
15334
|
-
if (trackSettings === null || trackSettings === void 0 ? void 0 : trackSettings.frameRate) {
|
|
15335
|
-
statsToModify.targetFrameRate = trackSettings === null || trackSettings === void 0 ? void 0 : trackSettings.frameRate;
|
|
15336
|
-
}
|
|
15337
|
-
stats.set(senderStats.id, statsToModify);
|
|
15338
|
-
}
|
|
15339
|
-
else if (senderStats.type === 'media-source') {
|
|
15340
|
-
const statsToModify = stats.get(senderStats.id);
|
|
15341
|
-
statsToModify.calliopeMediaType = mediaType;
|
|
15342
|
-
stats.set(senderStats.id, statsToModify);
|
|
15368
|
+
if (senderStats.type === 'outbound-rtp' || senderStats.type === 'media-source') {
|
|
15369
|
+
stats.set(senderStats.id, senderStats);
|
|
15343
15370
|
}
|
|
15344
15371
|
});
|
|
15345
15372
|
})));
|
|
15346
|
-
yield Promise.all([...this.recvTransceivers.
|
|
15373
|
+
yield Promise.all([...this.recvTransceivers.values()].map((transceivers) => __awaiter$1(this, void 0, void 0, function* () {
|
|
15347
15374
|
yield Promise.all(transceivers.map((transceiver) => __awaiter$1(this, void 0, void 0, function* () {
|
|
15348
15375
|
(yield transceiver.getStats()).forEach((receiverStats) => {
|
|
15349
|
-
var _a;
|
|
15350
15376
|
if (receiverStats.type === 'inbound-rtp') {
|
|
15351
|
-
|
|
15352
|
-
statsToModify.mid = (_a = transceiver.receiveSlot.id) === null || _a === void 0 ? void 0 : _a.mid;
|
|
15353
|
-
statsToModify.csi = transceiver.receiveSlot.currentRxCsi;
|
|
15354
|
-
statsToModify.calliopeMediaType = mediaType;
|
|
15355
|
-
statsToModify.requestedBitrate = transceiver.requestedBitrate;
|
|
15356
|
-
statsToModify.requestedFrameSize = transceiver.requestedFrameSize;
|
|
15357
|
-
Object.assign(statsToModify, transceiver.receiverId);
|
|
15358
|
-
stats.set(receiverStats.id, statsToModify);
|
|
15377
|
+
stats.set(receiverStats.id, receiverStats);
|
|
15359
15378
|
}
|
|
15360
15379
|
});
|
|
15361
15380
|
})));
|