@webex/web-client-media-engine 3.16.0 → 3.17.0

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 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 = {};
10467
10468
  this.munger = munger;
10468
10469
  this._receiveSlot = new ReceiveSlot(() => {
10469
10470
  if (!this._rtcRtpTransceiver.mid) {
@@ -10484,7 +10485,22 @@ class ReceiveOnlyTransceiver extends Transceiver {
10484
10485
  return this._receiveSlot;
10485
10486
  }
10486
10487
  getStats() {
10487
- return this.receiver.getStats();
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
+ Object.assign(stats, this.receiverId);
10499
+ }
10500
+ statsMap.set(key, stats);
10501
+ });
10502
+ return statsMap;
10503
+ });
10488
10504
  }
10489
10505
  mungeLocalDescription(mediaDescription) {
10490
10506
  this.munger.mungeLocalDescription(mediaDescription, { twccDisabled: this.twccDisabled });
@@ -10498,6 +10514,16 @@ class ReceiveOnlyTransceiver extends Transceiver {
10498
10514
  resetSdpMunger() {
10499
10515
  this.munger.reset();
10500
10516
  }
10517
+ handleRequested(streamRequest) {
10518
+ var _a, _b;
10519
+ this.metadata.requestedBitrate = streamRequest.maxPayloadBitsPerSecond;
10520
+ this.metadata.requestedFrameSize = (_b = (_a = streamRequest.codecInfos[0]) === null || _a === void 0 ? void 0 : _a.h264) === null || _b === void 0 ? void 0 : _b.maxFs;
10521
+ }
10522
+ handleUnrequested() {
10523
+ this.metadata.requestedBitrate = undefined;
10524
+ this.metadata.requestedFrameSize = undefined;
10525
+ this.receiveSlot._updateSource('no source', undefined);
10526
+ }
10501
10527
  }
10502
10528
  ReceiveOnlyTransceiver.rid = '1';
10503
10529
 
@@ -14317,7 +14343,29 @@ class SendOnlyTransceiver extends Transceiver {
14317
14343
  }
14318
14344
  }
14319
14345
  getStats() {
14320
- return this.sender.getStats();
14346
+ return __awaiter$1(this, void 0, void 0, function* () {
14347
+ const statsMap = new Map();
14348
+ const statsReport = yield this.sender.getStats();
14349
+ statsReport.forEach((stats, key) => {
14350
+ var _a;
14351
+ if (stats.type === 'outbound-rtp') {
14352
+ stats.mid = this.mid;
14353
+ stats.csi = this.csi;
14354
+ stats.calliopeMediaType = this.mediaType;
14355
+ stats.requestedBitrate = this.getRequestedBitrate(stats.ssrc);
14356
+ stats.requestedFrameSize = this.getRequestedFrameSize(stats.ssrc);
14357
+ const trackSettings = (_a = this.publishedStream) === null || _a === void 0 ? void 0 : _a.getSettings();
14358
+ if (trackSettings === null || trackSettings === void 0 ? void 0 : trackSettings.frameRate) {
14359
+ stats.targetFrameRate = trackSettings === null || trackSettings === void 0 ? void 0 : trackSettings.frameRate;
14360
+ }
14361
+ }
14362
+ else if (stats.type === 'media-source') {
14363
+ stats.calliopeMediaType = this.mediaType;
14364
+ }
14365
+ statsMap.set(key, stats);
14366
+ });
14367
+ return statsMap;
14368
+ });
14321
14369
  }
14322
14370
  updateSendParameters(requestedIdEncodingParamsMap) {
14323
14371
  return __awaiter$1(this, void 0, void 0, function* () {
@@ -14488,14 +14536,8 @@ const organizeTransceiverStats = (sendTransceivers, recvTransceivers) => __await
14488
14536
  };
14489
14537
  yield Promise.all([...sendTransceivers.entries()].map(([mediaType, transceiver]) => __awaiter$1(void 0, void 0, void 0, function* () {
14490
14538
  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
14539
  const item = {
14498
- report,
14540
+ report: yield transceiver.getStats(),
14499
14541
  mid: transceiver.mid,
14500
14542
  csi: transceiver.csi,
14501
14543
  currentDirection: 'sendonly',
@@ -14517,14 +14559,8 @@ const organizeTransceiverStats = (sendTransceivers, recvTransceivers) => __await
14517
14559
  yield Promise.all([...recvTransceivers.entries()].map(([mediaType, transceivers]) => __awaiter$1(void 0, void 0, void 0, function* () {
14518
14560
  return Promise.all(transceivers.map((t) => __awaiter$1(void 0, void 0, void 0, function* () {
14519
14561
  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
14562
  const item = {
14527
- report,
14563
+ report: yield t.getStats(),
14528
14564
  mid: (_b = t.receiveSlot.id) === null || _b === void 0 ? void 0 : _b.mid,
14529
14565
  csi: t.receiveSlot.currentRxCsi,
14530
14566
  currentDirection: 'recvonly',
@@ -14957,6 +14993,7 @@ SCTP Max Message Size: ${maxMessageSize}`);
14957
14993
  const transceiverMid = this.midPredictor.getNextMid(mediaType);
14958
14994
  const munger = new IngressSdpMunger();
14959
14995
  const recvOnlyTransceiver = new ReceiveOnlyTransceiver(rtcRtpTransceiver, transceiverMid, munger);
14996
+ recvOnlyTransceiver.metadata.mediaType = mediaType;
14960
14997
  recvOnlyTransceiver.twccDisabled =
14961
14998
  getMediaFamily(mediaType) === exports.MediaFamily.Audio ? this.options.disableAudioTwcc : false;
14962
14999
  this.recvTransceivers.set(mediaType, [
@@ -15230,35 +15267,24 @@ SCTP Max Message Size: ${maxMessageSize}`);
15230
15267
  return;
15231
15268
  }
15232
15269
  const requestedReceiveSlotIds = [];
15233
- streamRequests.forEach((sr) => {
15234
- sr.receiveSlots.forEach((rs) => {
15235
- if (!rs.id) {
15270
+ streamRequests.forEach((request) => {
15271
+ request.receiveSlots.forEach((slot) => {
15272
+ if (!slot.id) {
15236
15273
  logger.error(`Running stream request task, but ReceiveSlot ID is missing!`);
15237
15274
  return;
15238
15275
  }
15239
- requestedReceiveSlotIds.push(rs.id);
15276
+ requestedReceiveSlotIds.push(slot.id);
15240
15277
  });
15241
15278
  });
15279
+ jmpSession.sendRequests(streamRequests.map((sr) => sr._toJmpStreamRequest()));
15242
15280
  (_a = this.recvTransceivers.get(mediaType)) === null || _a === void 0 ? void 0 : _a.forEach((transceiver) => {
15243
- if (!requestedReceiveSlotIds.some((id) => compareStreamIds(id, transceiver.receiveSlot.id))) {
15244
- transceiver.receiveSlot._updateSource('no source', undefined);
15281
+ if (requestedReceiveSlotIds.some((id) => compareStreamIds(id, transceiver.receiveSlot.id))) {
15282
+ const relevantRequest = streamRequests.find((request) => request.receiveSlots.some((slot) => compareStreamIds(slot.id, transceiver.receiveSlot.id)));
15283
+ transceiver.handleRequested(relevantRequest);
15284
+ }
15285
+ else {
15286
+ transceiver.handleUnrequested();
15245
15287
  }
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
15288
  });
15263
15289
  };
15264
15290
  if (((_a = this.dataChannel) === null || _a === void 0 ? void 0 : _a.readyState) === 'open') {
@@ -15324,42 +15350,18 @@ SCTP Max Message Size: ${maxMessageSize}`);
15324
15350
  }
15325
15351
  preProcessStats(stats) {
15326
15352
  return __awaiter$1(this, void 0, void 0, function* () {
15327
- yield Promise.all([...this.sendTransceivers.entries()].map(([mediaType, transceiver]) => __awaiter$1(this, void 0, void 0, function* () {
15353
+ yield Promise.all([...this.sendTransceivers.values()].map((transceiver) => __awaiter$1(this, void 0, void 0, function* () {
15328
15354
  (yield transceiver.getStats()).forEach((senderStats) => {
15329
- var _a;
15330
- if (senderStats.type === 'outbound-rtp') {
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);
15355
+ if (senderStats.type === 'outbound-rtp' || senderStats.type === 'media-source') {
15356
+ stats.set(senderStats.id, senderStats);
15347
15357
  }
15348
15358
  });
15349
15359
  })));
15350
- yield Promise.all([...this.recvTransceivers.entries()].map(([mediaType, transceivers]) => __awaiter$1(this, void 0, void 0, function* () {
15360
+ yield Promise.all([...this.recvTransceivers.values()].map((transceivers) => __awaiter$1(this, void 0, void 0, function* () {
15351
15361
  yield Promise.all(transceivers.map((transceiver) => __awaiter$1(this, void 0, void 0, function* () {
15352
15362
  (yield transceiver.getStats()).forEach((receiverStats) => {
15353
- var _a;
15354
15363
  if (receiverStats.type === 'inbound-rtp') {
15355
- const statsToModify = stats.get(receiverStats.id);
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);
15364
+ stats.set(receiverStats.id, receiverStats);
15363
15365
  }
15364
15366
  });
15365
15367
  })));