@webex/web-client-media-engine 3.11.1 → 3.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +139 -116
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +139 -116
- package/dist/esm/index.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/package.json +5 -4
package/dist/esm/index.js
CHANGED
|
@@ -1281,11 +1281,30 @@ class _LocalStream extends Stream {
|
|
|
1281
1281
|
get inputTrack() {
|
|
1282
1282
|
return this.inputStream.getTracks()[0];
|
|
1283
1283
|
}
|
|
1284
|
+
/**
|
|
1285
|
+
* @inheritdoc
|
|
1286
|
+
*/
|
|
1287
|
+
handleTrackMuted() {
|
|
1288
|
+
if (this.inputTrack.enabled) {
|
|
1289
|
+
super.handleTrackMuted();
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
/**
|
|
1293
|
+
* @inheritdoc
|
|
1294
|
+
*/
|
|
1295
|
+
handleTrackUnmuted() {
|
|
1296
|
+
if (this.inputTrack.enabled) {
|
|
1297
|
+
super.handleTrackUnmuted();
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1284
1300
|
/**
|
|
1285
1301
|
* @inheritdoc
|
|
1286
1302
|
*/
|
|
1287
1303
|
get muted() {
|
|
1288
|
-
|
|
1304
|
+
// Calls to `setMuted` will only affect the "enabled" state, but there are specific cases in
|
|
1305
|
+
// which the browser may mute the track, which will affect the "muted" state but not the
|
|
1306
|
+
// "enabled" state, e.g. minimizing a shared window or unplugging a shared screen.
|
|
1307
|
+
return !this.inputTrack.enabled || this.inputTrack.muted;
|
|
1289
1308
|
}
|
|
1290
1309
|
/**
|
|
1291
1310
|
* Set the mute state of this stream.
|
|
@@ -1296,7 +1315,9 @@ class _LocalStream extends Stream {
|
|
|
1296
1315
|
if (this.inputTrack.enabled === isMuted) {
|
|
1297
1316
|
this.inputTrack.enabled = !isMuted;
|
|
1298
1317
|
// setting `enabled` will not automatically emit MuteStateChange, so we emit it here
|
|
1299
|
-
this
|
|
1318
|
+
if (!this.inputTrack.muted) {
|
|
1319
|
+
this[StreamEventNames.MuteStateChange].emit(isMuted);
|
|
1320
|
+
}
|
|
1300
1321
|
}
|
|
1301
1322
|
}
|
|
1302
1323
|
/**
|
|
@@ -6224,6 +6245,80 @@ Logger$1.useDefaults({
|
|
|
6224
6245
|
},
|
|
6225
6246
|
});
|
|
6226
6247
|
|
|
6248
|
+
var MediaFamily;
|
|
6249
|
+
(function (MediaFamily) {
|
|
6250
|
+
MediaFamily["Audio"] = "AUDIO";
|
|
6251
|
+
MediaFamily["Video"] = "VIDEO";
|
|
6252
|
+
})(MediaFamily || (MediaFamily = {}));
|
|
6253
|
+
var MediaContent;
|
|
6254
|
+
(function (MediaContent) {
|
|
6255
|
+
MediaContent["Main"] = "MAIN";
|
|
6256
|
+
MediaContent["Slides"] = "SLIDES";
|
|
6257
|
+
})(MediaContent || (MediaContent = {}));
|
|
6258
|
+
var Policy;
|
|
6259
|
+
(function (Policy) {
|
|
6260
|
+
Policy["ActiveSpeaker"] = "active-speaker";
|
|
6261
|
+
Policy["ReceiverSelected"] = "receiver-selected";
|
|
6262
|
+
})(Policy || (Policy = {}));
|
|
6263
|
+
var MediaType;
|
|
6264
|
+
(function (MediaType) {
|
|
6265
|
+
MediaType["VideoMain"] = "VIDEO-MAIN";
|
|
6266
|
+
MediaType["VideoSlides"] = "VIDEO-SLIDES";
|
|
6267
|
+
MediaType["AudioMain"] = "AUDIO-MAIN";
|
|
6268
|
+
MediaType["AudioSlides"] = "AUDIO-SLIDES";
|
|
6269
|
+
})(MediaType || (MediaType = {}));
|
|
6270
|
+
|
|
6271
|
+
function randomInteger(min, max) {
|
|
6272
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
6273
|
+
}
|
|
6274
|
+
function generateSceneId() {
|
|
6275
|
+
return randomInteger(0, 0x7fffff);
|
|
6276
|
+
}
|
|
6277
|
+
function generateCsi(mediaFamily, sceneId) {
|
|
6278
|
+
let av;
|
|
6279
|
+
if (mediaFamily === MediaFamily.Audio) {
|
|
6280
|
+
av = 0;
|
|
6281
|
+
}
|
|
6282
|
+
else {
|
|
6283
|
+
av = 1;
|
|
6284
|
+
}
|
|
6285
|
+
return (sceneId << 8) | av;
|
|
6286
|
+
}
|
|
6287
|
+
function getMediaType(mediaFamily, mediaContent) {
|
|
6288
|
+
if (mediaFamily === MediaFamily.Video && mediaContent === MediaContent.Main) {
|
|
6289
|
+
return MediaType.VideoMain;
|
|
6290
|
+
}
|
|
6291
|
+
if (mediaFamily === MediaFamily.Video && mediaContent === MediaContent.Slides) {
|
|
6292
|
+
return MediaType.VideoSlides;
|
|
6293
|
+
}
|
|
6294
|
+
if (mediaFamily === MediaFamily.Audio && mediaContent === MediaContent.Main) {
|
|
6295
|
+
return MediaType.AudioMain;
|
|
6296
|
+
}
|
|
6297
|
+
return MediaType.AudioSlides;
|
|
6298
|
+
}
|
|
6299
|
+
function getMediaFamily(mediaType) {
|
|
6300
|
+
return [MediaType.VideoMain, MediaType.VideoSlides].includes(mediaType)
|
|
6301
|
+
? MediaFamily.Video
|
|
6302
|
+
: MediaFamily.Audio;
|
|
6303
|
+
}
|
|
6304
|
+
function getMediaContent(mediaType) {
|
|
6305
|
+
return [MediaType.VideoMain, MediaType.AudioMain].includes(mediaType)
|
|
6306
|
+
? MediaContent.Main
|
|
6307
|
+
: MediaContent.Slides;
|
|
6308
|
+
}
|
|
6309
|
+
const truthyOrZero = (value) => value === 0 || value;
|
|
6310
|
+
function arraysAreEqual(left, right, predicate) {
|
|
6311
|
+
if (left.length !== right.length) {
|
|
6312
|
+
return false;
|
|
6313
|
+
}
|
|
6314
|
+
for (let i = 0; i < left.length; i += 1) {
|
|
6315
|
+
if (!predicate(left[i], right[i])) {
|
|
6316
|
+
return false;
|
|
6317
|
+
}
|
|
6318
|
+
}
|
|
6319
|
+
return true;
|
|
6320
|
+
}
|
|
6321
|
+
|
|
6227
6322
|
class ActiveSpeakerInfo {
|
|
6228
6323
|
constructor(priority, crossPriorityDuplication, crossPolicyDuplication, preferLiveVideo, namedMediaGroups) {
|
|
6229
6324
|
this.priority = priority;
|
|
@@ -6247,15 +6342,7 @@ function areNamedMediaGroupArraysEqual(left, right) {
|
|
|
6247
6342
|
if (left === undefined || right === undefined) {
|
|
6248
6343
|
return left === right;
|
|
6249
6344
|
}
|
|
6250
|
-
|
|
6251
|
-
return false;
|
|
6252
|
-
}
|
|
6253
|
-
for (let i = 0; i < left.length; i += 1) {
|
|
6254
|
-
if (left[i] !== right[i]) {
|
|
6255
|
-
return false;
|
|
6256
|
-
}
|
|
6257
|
-
}
|
|
6258
|
-
return true;
|
|
6345
|
+
return arraysAreEqual(left, right, (l, r) => l.type === r.type && l.value === r.value);
|
|
6259
6346
|
}
|
|
6260
6347
|
function areActiveSpeakerInfosEqual(left, right) {
|
|
6261
6348
|
return (left.priority === right.priority &&
|
|
@@ -6457,69 +6544,6 @@ function areReceiverSelectedInfosEqual(left, right) {
|
|
|
6457
6544
|
return left.csi === right.csi;
|
|
6458
6545
|
}
|
|
6459
6546
|
|
|
6460
|
-
var MediaFamily;
|
|
6461
|
-
(function (MediaFamily) {
|
|
6462
|
-
MediaFamily["Audio"] = "AUDIO";
|
|
6463
|
-
MediaFamily["Video"] = "VIDEO";
|
|
6464
|
-
})(MediaFamily || (MediaFamily = {}));
|
|
6465
|
-
var MediaContent;
|
|
6466
|
-
(function (MediaContent) {
|
|
6467
|
-
MediaContent["Main"] = "MAIN";
|
|
6468
|
-
MediaContent["Slides"] = "SLIDES";
|
|
6469
|
-
})(MediaContent || (MediaContent = {}));
|
|
6470
|
-
var Policy;
|
|
6471
|
-
(function (Policy) {
|
|
6472
|
-
Policy["ActiveSpeaker"] = "active-speaker";
|
|
6473
|
-
Policy["ReceiverSelected"] = "receiver-selected";
|
|
6474
|
-
})(Policy || (Policy = {}));
|
|
6475
|
-
var MediaType;
|
|
6476
|
-
(function (MediaType) {
|
|
6477
|
-
MediaType["VideoMain"] = "VIDEO-MAIN";
|
|
6478
|
-
MediaType["VideoSlides"] = "VIDEO-SLIDES";
|
|
6479
|
-
MediaType["AudioMain"] = "AUDIO-MAIN";
|
|
6480
|
-
MediaType["AudioSlides"] = "AUDIO-SLIDES";
|
|
6481
|
-
})(MediaType || (MediaType = {}));
|
|
6482
|
-
|
|
6483
|
-
function randomInteger(min, max) {
|
|
6484
|
-
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
6485
|
-
}
|
|
6486
|
-
function generateSceneId() {
|
|
6487
|
-
return randomInteger(0, 0x7fffff);
|
|
6488
|
-
}
|
|
6489
|
-
function generateCsi(mediaFamily, sceneId) {
|
|
6490
|
-
let av;
|
|
6491
|
-
if (mediaFamily === MediaFamily.Audio) {
|
|
6492
|
-
av = 0;
|
|
6493
|
-
}
|
|
6494
|
-
else {
|
|
6495
|
-
av = 1;
|
|
6496
|
-
}
|
|
6497
|
-
return (sceneId << 8) | av;
|
|
6498
|
-
}
|
|
6499
|
-
function getMediaType(mediaFamily, mediaContent) {
|
|
6500
|
-
if (mediaFamily === MediaFamily.Video && mediaContent === MediaContent.Main) {
|
|
6501
|
-
return MediaType.VideoMain;
|
|
6502
|
-
}
|
|
6503
|
-
if (mediaFamily === MediaFamily.Video && mediaContent === MediaContent.Slides) {
|
|
6504
|
-
return MediaType.VideoSlides;
|
|
6505
|
-
}
|
|
6506
|
-
if (mediaFamily === MediaFamily.Audio && mediaContent === MediaContent.Main) {
|
|
6507
|
-
return MediaType.AudioMain;
|
|
6508
|
-
}
|
|
6509
|
-
return MediaType.AudioSlides;
|
|
6510
|
-
}
|
|
6511
|
-
function getMediaFamily(mediaType) {
|
|
6512
|
-
return [MediaType.VideoMain, MediaType.VideoSlides].includes(mediaType)
|
|
6513
|
-
? MediaFamily.Video
|
|
6514
|
-
: MediaFamily.Audio;
|
|
6515
|
-
}
|
|
6516
|
-
function getMediaContent(mediaType) {
|
|
6517
|
-
return [MediaType.VideoMain, MediaType.AudioMain].includes(mediaType)
|
|
6518
|
-
? MediaContent.Main
|
|
6519
|
-
: MediaContent.Slides;
|
|
6520
|
-
}
|
|
6521
|
-
const truthyOrZero = (value) => value === 0 || value;
|
|
6522
|
-
|
|
6523
6547
|
class SourceAdvertisementMsg {
|
|
6524
6548
|
constructor(seqNum, numTotalSources, numLiveSources, namedMediaGroups, videoContentHint) {
|
|
6525
6549
|
this.seqNum = seqNum;
|
|
@@ -6580,26 +6604,10 @@ function arePolicySpecificInfosEqual(left, right) {
|
|
|
6580
6604
|
throw new Error('Invalid PolicySpecificInfo');
|
|
6581
6605
|
}
|
|
6582
6606
|
function areCodecInfoArraysEqual(left, right) {
|
|
6583
|
-
|
|
6584
|
-
return false;
|
|
6585
|
-
}
|
|
6586
|
-
for (let i = 0; i < left.length; i += 1) {
|
|
6587
|
-
if (!areCodecInfosEqual(left[i], right[i])) {
|
|
6588
|
-
return false;
|
|
6589
|
-
}
|
|
6590
|
-
}
|
|
6591
|
-
return true;
|
|
6607
|
+
return arraysAreEqual(left, right, areCodecInfosEqual);
|
|
6592
6608
|
}
|
|
6593
6609
|
function areStreamIdArraysEqual(left, right) {
|
|
6594
|
-
|
|
6595
|
-
return false;
|
|
6596
|
-
}
|
|
6597
|
-
for (let i = 0; i < left.length; i += 1) {
|
|
6598
|
-
if (!compareStreamIds(left[i], right[i])) {
|
|
6599
|
-
return false;
|
|
6600
|
-
}
|
|
6601
|
-
}
|
|
6602
|
-
return true;
|
|
6610
|
+
return arraysAreEqual(left, right, compareStreamIds);
|
|
6603
6611
|
}
|
|
6604
6612
|
function areStreamRequestsEqual(left, right) {
|
|
6605
6613
|
if (left.policy !== right.policy) {
|
|
@@ -6671,7 +6679,7 @@ function areStreamRequestArraysEqual(left, right) {
|
|
|
6671
6679
|
return true;
|
|
6672
6680
|
}
|
|
6673
6681
|
class JmpSession extends EventEmitter$5 {
|
|
6674
|
-
constructor(mediaFamily, mediaContent, maxNumRetransmits =
|
|
6682
|
+
constructor(mediaFamily, mediaContent, maxNumRetransmits = 200, retransmitIntervalMs = 250) {
|
|
6675
6683
|
super();
|
|
6676
6684
|
this.currMediaRequestSeqNum = 1;
|
|
6677
6685
|
this.currSourceAdvertisementSeqNum = 1;
|
|
@@ -6696,16 +6704,25 @@ class JmpSession extends EventEmitter$5 {
|
|
|
6696
6704
|
!areStreamRequestArraysEqual(this.lastSentMediaRequest.msg.requests, requests)) {
|
|
6697
6705
|
this.sendJmpMsg(JmpMsgType.MediaRequest, mediaRequestMsg);
|
|
6698
6706
|
(_a = this.lastSentMediaRequest) === null || _a === void 0 ? void 0 : _a.cancel();
|
|
6699
|
-
this.lastSentMediaRequest = new RetransmitHandler(mediaRequestMsg, this.maxNumRetransmits, this.retransmitIntervalMs, () =>
|
|
6707
|
+
this.lastSentMediaRequest = new RetransmitHandler(mediaRequestMsg, this.maxNumRetransmits, this.retransmitIntervalMs, () => {
|
|
6708
|
+
this.logger.info(`Retransmitting previously sent MediaRequest...`);
|
|
6709
|
+
this.sendJmpMsg(JmpMsgType.MediaRequest, mediaRequestMsg);
|
|
6710
|
+
}, (expiredJmpMsg) => {
|
|
6700
6711
|
this.logger.warn(`Retransmits for message expired: ${expiredJmpMsg}`);
|
|
6701
6712
|
});
|
|
6702
6713
|
this.currMediaRequestSeqNum++;
|
|
6703
6714
|
}
|
|
6715
|
+
else {
|
|
6716
|
+
this.logger.info(`Duplicate MediaRequest detected and will not be sent: ${mediaRequestMsg}`);
|
|
6717
|
+
}
|
|
6704
6718
|
}
|
|
6705
6719
|
sendSourceAdvertisement(numTotalSources, numLiveSources, namedMediaGroups, videoContentHint) {
|
|
6706
6720
|
const sourceAdvertisementMsg = new SourceAdvertisementMsg(this.currSourceAdvertisementSeqNum++, numTotalSources, numLiveSources, namedMediaGroups, videoContentHint);
|
|
6707
6721
|
this.sendJmpMsg(JmpMsgType.SourceAdvertisement, sourceAdvertisementMsg);
|
|
6708
|
-
this.lastSentSourceAdvertisement = new RetransmitHandler(sourceAdvertisementMsg, this.maxNumRetransmits, this.retransmitIntervalMs, () =>
|
|
6722
|
+
this.lastSentSourceAdvertisement = new RetransmitHandler(sourceAdvertisementMsg, this.maxNumRetransmits, this.retransmitIntervalMs, () => {
|
|
6723
|
+
this.logger.info(`Retransmitting previously sent SourceAdvertisement...`);
|
|
6724
|
+
this.sendJmpMsg(JmpMsgType.SourceAdvertisement, sourceAdvertisementMsg);
|
|
6725
|
+
}, (expiredMsg) => {
|
|
6709
6726
|
this.logger.warn(`Retransmits for message expired: `, expiredMsg);
|
|
6710
6727
|
});
|
|
6711
6728
|
}
|
|
@@ -6720,11 +6737,17 @@ class JmpSession extends EventEmitter$5 {
|
|
|
6720
6737
|
!compareStreamStateArrays(filteredStreamStates, this.lastSentMediaRequestStatus.msg.streamStates)) {
|
|
6721
6738
|
this.sendJmpMsg(JmpMsgType.MediaRequestStatus, mediaRequestStatus);
|
|
6722
6739
|
(_b = this.lastSentMediaRequestStatus) === null || _b === void 0 ? void 0 : _b.cancel();
|
|
6723
|
-
this.lastSentMediaRequestStatus = new RetransmitHandler(mediaRequestStatus, this.maxNumRetransmits, this.retransmitIntervalMs, () =>
|
|
6740
|
+
this.lastSentMediaRequestStatus = new RetransmitHandler(mediaRequestStatus, this.maxNumRetransmits, this.retransmitIntervalMs, () => {
|
|
6741
|
+
this.logger.info(`Retransmitting previously sent MediaRequestStatus...`);
|
|
6742
|
+
this.sendJmpMsg(JmpMsgType.MediaRequestStatus, mediaRequestStatus);
|
|
6743
|
+
}, (expiredMsg) => {
|
|
6724
6744
|
this.logger.warn(`Retransmits for message expired: `, expiredMsg);
|
|
6725
6745
|
});
|
|
6726
6746
|
this.currMediaRequestStatusSeqNum++;
|
|
6727
6747
|
}
|
|
6748
|
+
else {
|
|
6749
|
+
this.logger.info(`Duplicate MediaRequestStatus detected and will not be sent: `, mediaRequestStatus);
|
|
6750
|
+
}
|
|
6728
6751
|
}
|
|
6729
6752
|
receive(jmpMsg) {
|
|
6730
6753
|
if (jmpMsg.mediaContent !== this.mediaContent || jmpMsg.mediaFamily !== this.mediaFamily) {
|
|
@@ -6921,6 +6944,26 @@ class JmpSession extends EventEmitter$5 {
|
|
|
6921
6944
|
}
|
|
6922
6945
|
}
|
|
6923
6946
|
|
|
6947
|
+
var WcmeErrorType;
|
|
6948
|
+
(function (WcmeErrorType) {
|
|
6949
|
+
WcmeErrorType["CREATE_OFFER_FAILED"] = "CREATE_OFFER_FAILED";
|
|
6950
|
+
WcmeErrorType["SET_ANSWER_FAILED"] = "SET_ANSWER_FAILED";
|
|
6951
|
+
WcmeErrorType["OFFER_ANSWER_MISMATCH"] = "OFFER_ANSWER_MISMATCH";
|
|
6952
|
+
WcmeErrorType["SDP_MUNGE_FAILED"] = "SDP_MUNGE_FAILED";
|
|
6953
|
+
WcmeErrorType["SDP_MUNGE_MISSING_CODECS"] = "SDP_MUNGE_MISSING_CODECS";
|
|
6954
|
+
WcmeErrorType["INVALID_STREAM_REQUEST"] = "INVALID_STREAM_REQUEST";
|
|
6955
|
+
WcmeErrorType["GET_TRANSCEIVER_FAILED"] = "GET_TRANSCEIVER_FAILED";
|
|
6956
|
+
WcmeErrorType["GET_MAX_BITRATE_FAILED"] = "GET_MAX_BITRATE_FAILED";
|
|
6957
|
+
WcmeErrorType["GET_PAYLOAD_TYPE_FAILED"] = "GET_PAYLOAD_TYPE_FAILED";
|
|
6958
|
+
WcmeErrorType["SET_NMG_FAILED"] = "SET_NMG_FAILED";
|
|
6959
|
+
})(WcmeErrorType || (WcmeErrorType = {}));
|
|
6960
|
+
class WcmeError {
|
|
6961
|
+
constructor(type, message = '') {
|
|
6962
|
+
this.type = type;
|
|
6963
|
+
this.message = message;
|
|
6964
|
+
}
|
|
6965
|
+
}
|
|
6966
|
+
|
|
6924
6967
|
var commonjsGlobal$1 = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
6925
6968
|
|
|
6926
6969
|
var logger$1 = {exports: {}};
|
|
@@ -7207,26 +7250,6 @@ var logger$1 = {exports: {}};
|
|
|
7207
7250
|
|
|
7208
7251
|
var Logger = logger$1.exports;
|
|
7209
7252
|
|
|
7210
|
-
var WcmeErrorType;
|
|
7211
|
-
(function (WcmeErrorType) {
|
|
7212
|
-
WcmeErrorType["CREATE_OFFER_FAILED"] = "CREATE_OFFER_FAILED";
|
|
7213
|
-
WcmeErrorType["SET_ANSWER_FAILED"] = "SET_ANSWER_FAILED";
|
|
7214
|
-
WcmeErrorType["OFFER_ANSWER_MISMATCH"] = "OFFER_ANSWER_MISMATCH";
|
|
7215
|
-
WcmeErrorType["SDP_MUNGE_FAILED"] = "SDP_MUNGE_FAILED";
|
|
7216
|
-
WcmeErrorType["SDP_MUNGE_MISSING_CODECS"] = "SDP_MUNGE_MISSING_CODECS";
|
|
7217
|
-
WcmeErrorType["INVALID_STREAM_REQUEST"] = "INVALID_STREAM_REQUEST";
|
|
7218
|
-
WcmeErrorType["GET_TRANSCEIVER_FAILED"] = "GET_TRANSCEIVER_FAILED";
|
|
7219
|
-
WcmeErrorType["GET_MAX_BITRATE_FAILED"] = "GET_MAX_BITRATE_FAILED";
|
|
7220
|
-
WcmeErrorType["GET_PAYLOAD_TYPE_FAILED"] = "GET_PAYLOAD_TYPE_FAILED";
|
|
7221
|
-
WcmeErrorType["SET_NMG_FAILED"] = "SET_NMG_FAILED";
|
|
7222
|
-
})(WcmeErrorType || (WcmeErrorType = {}));
|
|
7223
|
-
class WcmeError {
|
|
7224
|
-
constructor(type, message = '') {
|
|
7225
|
-
this.type = type;
|
|
7226
|
-
this.message = message;
|
|
7227
|
-
}
|
|
7228
|
-
}
|
|
7229
|
-
|
|
7230
7253
|
const DEFAULT_LOGGER_NAME = 'web-client-media-engine';
|
|
7231
7254
|
const logger = Logger.get(DEFAULT_LOGGER_NAME);
|
|
7232
7255
|
logger.setLevel(Logger.DEBUG);
|