mediasoup-client 3.7.14 → 3.7.16
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/lib/Consumer.d.ts +1 -1
- package/lib/Consumer.d.ts.map +1 -1
- package/lib/Consumer.js +4 -4
- package/lib/DataConsumer.d.ts +1 -1
- package/lib/DataConsumer.d.ts.map +1 -1
- package/lib/DataConsumer.js +4 -4
- package/lib/DataProducer.d.ts +1 -1
- package/lib/DataProducer.d.ts.map +1 -1
- package/lib/DataProducer.js +4 -4
- package/lib/Device.d.ts +1 -1
- package/lib/Device.d.ts.map +1 -1
- package/lib/Device.js +3 -2
- package/lib/Producer.d.ts +1 -1
- package/lib/Producer.d.ts.map +1 -1
- package/lib/Producer.js +4 -4
- package/lib/Transport.d.ts +1 -1
- package/lib/Transport.d.ts.map +1 -1
- package/lib/Transport.js +7 -7
- package/lib/{EnhancedEventEmitter.d.ts → enhancedEvents.d.ts} +1 -1
- package/lib/enhancedEvents.d.ts.map +1 -0
- package/lib/{EnhancedEventEmitter.js → enhancedEvents.js} +9 -4
- package/lib/errors.d.ts.map +1 -1
- package/lib/errors.js +0 -3
- package/lib/handlers/Chrome111.d.ts.map +1 -1
- package/lib/handlers/Chrome111.js +7 -6
- package/lib/handlers/Chrome55.d.ts.map +1 -1
- package/lib/handlers/Chrome55.js +7 -6
- package/lib/handlers/Chrome67.d.ts.map +1 -1
- package/lib/handlers/Chrome67.js +7 -6
- package/lib/handlers/Chrome70.d.ts.map +1 -1
- package/lib/handlers/Chrome70.js +9 -8
- package/lib/handlers/Chrome74.d.ts.map +1 -1
- package/lib/handlers/Chrome74.js +8 -7
- package/lib/handlers/Edge11.d.ts.map +1 -1
- package/lib/handlers/Edge11.js +5 -4
- package/lib/handlers/FakeHandler.d.ts.map +1 -1
- package/lib/handlers/FakeHandler.js +6 -5
- package/lib/handlers/Firefox120.d.ts.map +1 -1
- package/lib/handlers/Firefox120.js +9 -12
- package/lib/handlers/Firefox60.d.ts.map +1 -1
- package/lib/handlers/Firefox60.js +15 -20
- package/lib/handlers/HandlerInterface.d.ts +1 -1
- package/lib/handlers/HandlerInterface.d.ts.map +1 -1
- package/lib/handlers/HandlerInterface.js +2 -2
- package/lib/handlers/ReactNative.d.ts.map +1 -1
- package/lib/handlers/ReactNative.js +7 -6
- package/lib/handlers/ReactNativeUnifiedPlan.d.ts.map +1 -1
- package/lib/handlers/ReactNativeUnifiedPlan.js +9 -8
- package/lib/handlers/Safari11.d.ts.map +1 -1
- package/lib/handlers/Safari11.js +7 -6
- package/lib/handlers/Safari12.d.ts.map +1 -1
- package/lib/handlers/Safari12.js +8 -9
- package/lib/handlers/ortc/edgeUtils.js +10 -10
- package/lib/handlers/ortc/utils.js +1 -1
- package/lib/handlers/sdp/MediaSection.d.ts.map +1 -1
- package/lib/handlers/sdp/MediaSection.js +12 -13
- package/lib/handlers/sdp/RemoteSdp.js +1 -1
- package/lib/handlers/sdp/commonUtils.js +1 -1
- package/lib/handlers/sdp/planBUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/planBUtils.js +1 -2
- package/lib/handlers/sdp/unifiedPlanUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/unifiedPlanUtils.js +2 -3
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/ortc.js +7 -7
- package/lib/scalabilityModes.js +1 -1
- package/lib/test/fakeParameters.d.ts.map +1 -1
- package/lib/test/fakeParameters.js +7 -8
- package/lib/test/test.js +50 -48
- package/npm-scripts.mjs +4 -3
- package/package.json +13 -9
- package/lib/EnhancedEventEmitter.d.ts.map +0 -1
|
@@ -34,6 +34,7 @@ const sdpPlanBUtils = __importStar(require("./sdp/planBUtils"));
|
|
|
34
34
|
const HandlerInterface_1 = require("./HandlerInterface");
|
|
35
35
|
const RemoteSdp_1 = require("./sdp/RemoteSdp");
|
|
36
36
|
const logger = new Logger_1.Logger('ReactNative');
|
|
37
|
+
const NAME = 'ReactNative';
|
|
37
38
|
const SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };
|
|
38
39
|
class ReactNative extends HandlerInterface_1.HandlerInterface {
|
|
39
40
|
/**
|
|
@@ -61,13 +62,13 @@ class ReactNative extends HandlerInterface_1.HandlerInterface {
|
|
|
61
62
|
this._transportReady = false;
|
|
62
63
|
}
|
|
63
64
|
get name() {
|
|
64
|
-
return
|
|
65
|
+
return NAME;
|
|
65
66
|
}
|
|
66
67
|
close() {
|
|
67
68
|
logger.debug('close()');
|
|
68
69
|
// Free/dispose native MediaStream but DO NOT free/dispose native
|
|
69
70
|
// MediaStreamTracks (that is parent's business).
|
|
70
|
-
// @ts-
|
|
71
|
+
// @ts-expect-error --- Proprietary API in react-native-webrtc.
|
|
71
72
|
this._sendStream.release(/* releaseTracks */ false);
|
|
72
73
|
// Close RTCPeerConnection.
|
|
73
74
|
if (this._pc) {
|
|
@@ -139,8 +140,8 @@ class ReactNative extends HandlerInterface_1.HandlerInterface {
|
|
|
139
140
|
dtlsParameters.role === 'server' ? 'client' : 'server';
|
|
140
141
|
}
|
|
141
142
|
this._pc = new RTCPeerConnection({
|
|
142
|
-
iceServers: iceServers
|
|
143
|
-
iceTransportPolicy: iceTransportPolicy
|
|
143
|
+
iceServers: iceServers ?? [],
|
|
144
|
+
iceTransportPolicy: iceTransportPolicy ?? 'all',
|
|
144
145
|
bundlePolicy: 'max-bundle',
|
|
145
146
|
rtcpMuxPolicy: 'require',
|
|
146
147
|
sdpSemantics: 'plan-b',
|
|
@@ -409,7 +410,7 @@ class ReactNative extends HandlerInterface_1.HandlerInterface {
|
|
|
409
410
|
const { trackId, kind, rtpParameters } = options;
|
|
410
411
|
logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
|
|
411
412
|
const mid = kind;
|
|
412
|
-
let streamId = options.streamId
|
|
413
|
+
let streamId = options.streamId ?? rtpParameters.rtcp.cname;
|
|
413
414
|
// NOTE: In React-Native we cannot reuse the same remote MediaStream for new
|
|
414
415
|
// remote tracks. This is because react-native-webrtc does not react on new
|
|
415
416
|
// tracks generated within already existing streams, so force the streamId
|
|
@@ -473,7 +474,7 @@ class ReactNative extends HandlerInterface_1.HandlerInterface {
|
|
|
473
474
|
this.assertRecvDirection();
|
|
474
475
|
for (const localId of localIds) {
|
|
475
476
|
logger.debug('stopReceiving() [localId:%s]', localId);
|
|
476
|
-
const { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId)
|
|
477
|
+
const { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) ?? {};
|
|
477
478
|
// Remove from the map.
|
|
478
479
|
this._mapRecvLocalIdInfo.delete(localId);
|
|
479
480
|
this._remoteSdp.planBStopReceiving({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactNativeUnifiedPlan.d.ts","sourceRoot":"","sources":["../../src/handlers/ReactNativeUnifiedPlan.ts"],"names":[],"mappings":"AAQA,OAAO,EACN,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,gCAAgC,EAChC,+BAA+B,EAC/B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,aAAa,EAAY,MAAM,cAAc,CAAC;AACvD,OAAO,EACN,eAAe,EAGf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAwB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ReactNativeUnifiedPlan.d.ts","sourceRoot":"","sources":["../../src/handlers/ReactNativeUnifiedPlan.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,7 @@ const HandlerInterface_1 = require("./HandlerInterface");
|
|
|
36
36
|
const RemoteSdp_1 = require("./sdp/RemoteSdp");
|
|
37
37
|
const scalabilityModes_1 = require("../scalabilityModes");
|
|
38
38
|
const logger = new Logger_1.Logger('ReactNativeUnifiedPlan');
|
|
39
|
+
const NAME = 'ReactNativeUnifiedPlan';
|
|
39
40
|
const SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };
|
|
40
41
|
class ReactNativeUnifiedPlan extends HandlerInterface_1.HandlerInterface {
|
|
41
42
|
/**
|
|
@@ -60,7 +61,7 @@ class ReactNativeUnifiedPlan extends HandlerInterface_1.HandlerInterface {
|
|
|
60
61
|
this._transportReady = false;
|
|
61
62
|
}
|
|
62
63
|
get name() {
|
|
63
|
-
return
|
|
64
|
+
return NAME;
|
|
64
65
|
}
|
|
65
66
|
close() {
|
|
66
67
|
logger.debug('close()');
|
|
@@ -70,7 +71,7 @@ class ReactNativeUnifiedPlan extends HandlerInterface_1.HandlerInterface {
|
|
|
70
71
|
this._closed = true;
|
|
71
72
|
// Free/dispose native MediaStream but DO NOT free/dispose native
|
|
72
73
|
// MediaStreamTracks (that is parent's business).
|
|
73
|
-
// @ts-
|
|
74
|
+
// @ts-expect-error --- Proprietary API in react-native-webrtc.
|
|
74
75
|
this._sendStream.release(/* releaseTracks */ false);
|
|
75
76
|
// Close RTCPeerConnection.
|
|
76
77
|
if (this._pc) {
|
|
@@ -143,8 +144,8 @@ class ReactNativeUnifiedPlan extends HandlerInterface_1.HandlerInterface {
|
|
|
143
144
|
dtlsParameters.role === 'server' ? 'client' : 'server';
|
|
144
145
|
}
|
|
145
146
|
this._pc = new RTCPeerConnection({
|
|
146
|
-
iceServers: iceServers
|
|
147
|
-
iceTransportPolicy: iceTransportPolicy
|
|
147
|
+
iceServers: iceServers ?? [],
|
|
148
|
+
iceTransportPolicy: iceTransportPolicy ?? 'all',
|
|
148
149
|
bundlePolicy: 'max-bundle',
|
|
149
150
|
rtcpMuxPolicy: 'require',
|
|
150
151
|
sdpSemantics: 'unified-plan',
|
|
@@ -258,7 +259,7 @@ class ReactNativeUnifiedPlan extends HandlerInterface_1.HandlerInterface {
|
|
|
258
259
|
}
|
|
259
260
|
// Special case for VP9 with SVC.
|
|
260
261
|
let hackVp9Svc = false;
|
|
261
|
-
const layers = (0, scalabilityModes_1.parse)((encodings
|
|
262
|
+
const layers = (0, scalabilityModes_1.parse)((encodings ?? [{}])[0].scalabilityMode);
|
|
262
263
|
if (encodings &&
|
|
263
264
|
encodings.length === 1 &&
|
|
264
265
|
layers.spatialLayers > 1 &&
|
|
@@ -369,7 +370,7 @@ class ReactNativeUnifiedPlan extends HandlerInterface_1.HandlerInterface {
|
|
|
369
370
|
if (!transceiver) {
|
|
370
371
|
throw new Error('associated RTCRtpTransceiver not found');
|
|
371
372
|
}
|
|
372
|
-
transceiver.sender.replaceTrack(null);
|
|
373
|
+
void transceiver.sender.replaceTrack(null);
|
|
373
374
|
this._pc.removeTrack(transceiver.sender);
|
|
374
375
|
const mediaSectionClosed = this._remoteSdp.closeMediaSection(transceiver.mid);
|
|
375
376
|
if (mediaSectionClosed) {
|
|
@@ -543,13 +544,13 @@ class ReactNativeUnifiedPlan extends HandlerInterface_1.HandlerInterface {
|
|
|
543
544
|
for (const options of optionsList) {
|
|
544
545
|
const { trackId, kind, rtpParameters, streamId } = options;
|
|
545
546
|
logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
|
|
546
|
-
const localId = rtpParameters.mid
|
|
547
|
+
const localId = rtpParameters.mid ?? String(this._mapMidTransceiver.size);
|
|
547
548
|
mapLocalId.set(trackId, localId);
|
|
548
549
|
this._remoteSdp.receive({
|
|
549
550
|
mid: localId,
|
|
550
551
|
kind,
|
|
551
552
|
offerRtpParameters: rtpParameters,
|
|
552
|
-
streamId: streamId
|
|
553
|
+
streamId: streamId ?? rtpParameters.rtcp.cname,
|
|
553
554
|
trackId,
|
|
554
555
|
});
|
|
555
556
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Safari11.d.ts","sourceRoot":"","sources":["../../src/handlers/Safari11.ts"],"names":[],"mappings":"AAMA,OAAO,EACN,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,gCAAgC,EAChC,+BAA+B,EAC/B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAY,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,eAAe,EAAiB,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAwB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"Safari11.d.ts","sourceRoot":"","sources":["../../src/handlers/Safari11.ts"],"names":[],"mappings":"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"}
|
package/lib/handlers/Safari11.js
CHANGED
|
@@ -33,6 +33,7 @@ const sdpPlanBUtils = __importStar(require("./sdp/planBUtils"));
|
|
|
33
33
|
const HandlerInterface_1 = require("./HandlerInterface");
|
|
34
34
|
const RemoteSdp_1 = require("./sdp/RemoteSdp");
|
|
35
35
|
const logger = new Logger_1.Logger('Safari11');
|
|
36
|
+
const NAME = 'Safari11';
|
|
36
37
|
const SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };
|
|
37
38
|
class Safari11 extends HandlerInterface_1.HandlerInterface {
|
|
38
39
|
/**
|
|
@@ -60,7 +61,7 @@ class Safari11 extends HandlerInterface_1.HandlerInterface {
|
|
|
60
61
|
this._transportReady = false;
|
|
61
62
|
}
|
|
62
63
|
get name() {
|
|
63
|
-
return
|
|
64
|
+
return NAME;
|
|
64
65
|
}
|
|
65
66
|
close() {
|
|
66
67
|
logger.debug('close()');
|
|
@@ -134,8 +135,8 @@ class Safari11 extends HandlerInterface_1.HandlerInterface {
|
|
|
134
135
|
dtlsParameters.role === 'server' ? 'client' : 'server';
|
|
135
136
|
}
|
|
136
137
|
this._pc = new RTCPeerConnection({
|
|
137
|
-
iceServers: iceServers
|
|
138
|
-
iceTransportPolicy: iceTransportPolicy
|
|
138
|
+
iceServers: iceServers ?? [],
|
|
139
|
+
iceTransportPolicy: iceTransportPolicy ?? 'all',
|
|
139
140
|
bundlePolicy: 'max-bundle',
|
|
140
141
|
rtcpMuxPolicy: 'require',
|
|
141
142
|
...additionalSettings,
|
|
@@ -448,7 +449,7 @@ class Safari11 extends HandlerInterface_1.HandlerInterface {
|
|
|
448
449
|
mid,
|
|
449
450
|
kind,
|
|
450
451
|
offerRtpParameters: rtpParameters,
|
|
451
|
-
streamId: streamId
|
|
452
|
+
streamId: streamId ?? rtpParameters.rtcp.cname,
|
|
452
453
|
trackId,
|
|
453
454
|
});
|
|
454
455
|
}
|
|
@@ -505,7 +506,7 @@ class Safari11 extends HandlerInterface_1.HandlerInterface {
|
|
|
505
506
|
this.assertRecvDirection();
|
|
506
507
|
for (const localId of localIds) {
|
|
507
508
|
logger.debug('stopReceiving() [localId:%s]', localId);
|
|
508
|
-
const { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId)
|
|
509
|
+
const { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) ?? {};
|
|
509
510
|
// Remove from the map.
|
|
510
511
|
this._mapRecvLocalIdInfo.delete(localId);
|
|
511
512
|
this._remoteSdp.planBStopReceiving({
|
|
@@ -522,7 +523,7 @@ class Safari11 extends HandlerInterface_1.HandlerInterface {
|
|
|
522
523
|
}
|
|
523
524
|
async getReceiverStats(localId) {
|
|
524
525
|
this.assertRecvDirection();
|
|
525
|
-
const { rtpReceiver } = this._mapRecvLocalIdInfo.get(localId)
|
|
526
|
+
const { rtpReceiver } = this._mapRecvLocalIdInfo.get(localId) ?? {};
|
|
526
527
|
if (!rtpReceiver) {
|
|
527
528
|
throw new Error('associated RTCRtpReceiver not found');
|
|
528
529
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Safari12.d.ts","sourceRoot":"","sources":["../../src/handlers/Safari12.ts"],"names":[],"mappings":"AAQA,OAAO,EACN,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,gCAAgC,EAChC,+BAA+B,EAC/B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,aAAa,EAAY,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,eAAe,EAAiB,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAwB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"Safari12.d.ts","sourceRoot":"","sources":["../../src/handlers/Safari12.ts"],"names":[],"mappings":"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"}
|
package/lib/handlers/Safari12.js
CHANGED
|
@@ -36,6 +36,7 @@ const HandlerInterface_1 = require("./HandlerInterface");
|
|
|
36
36
|
const RemoteSdp_1 = require("./sdp/RemoteSdp");
|
|
37
37
|
const scalabilityModes_1 = require("../scalabilityModes");
|
|
38
38
|
const logger = new Logger_1.Logger('Safari12');
|
|
39
|
+
const NAME = 'Safari12';
|
|
39
40
|
const SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };
|
|
40
41
|
class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
41
42
|
/**
|
|
@@ -60,7 +61,7 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
60
61
|
this._transportReady = false;
|
|
61
62
|
}
|
|
62
63
|
get name() {
|
|
63
|
-
return
|
|
64
|
+
return NAME;
|
|
64
65
|
}
|
|
65
66
|
close() {
|
|
66
67
|
logger.debug('close()');
|
|
@@ -138,8 +139,8 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
138
139
|
dtlsParameters.role === 'server' ? 'client' : 'server';
|
|
139
140
|
}
|
|
140
141
|
this._pc = new RTCPeerConnection({
|
|
141
|
-
iceServers: iceServers
|
|
142
|
-
iceTransportPolicy: iceTransportPolicy
|
|
142
|
+
iceServers: iceServers ?? [],
|
|
143
|
+
iceTransportPolicy: iceTransportPolicy ?? 'all',
|
|
143
144
|
bundlePolicy: 'max-bundle',
|
|
144
145
|
rtcpMuxPolicy: 'require',
|
|
145
146
|
...additionalSettings,
|
|
@@ -244,7 +245,7 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
244
245
|
localSdpObject,
|
|
245
246
|
});
|
|
246
247
|
}
|
|
247
|
-
const layers = (0, scalabilityModes_1.parse)((encodings
|
|
248
|
+
const layers = (0, scalabilityModes_1.parse)((encodings ?? [{}])[0].scalabilityMode);
|
|
248
249
|
if (encodings && encodings.length > 1) {
|
|
249
250
|
logger.debug('send() | enabling legacy simulcast');
|
|
250
251
|
localSdpObject = sdpTransform.parse(offer.sdp);
|
|
@@ -321,7 +322,7 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
321
322
|
if (!transceiver) {
|
|
322
323
|
throw new Error('associated RTCRtpTransceiver not found');
|
|
323
324
|
}
|
|
324
|
-
transceiver.sender.replaceTrack(null);
|
|
325
|
+
void transceiver.sender.replaceTrack(null);
|
|
325
326
|
this._pc.removeTrack(transceiver.sender);
|
|
326
327
|
const mediaSectionClosed = this._remoteSdp.closeMediaSection(transceiver.mid);
|
|
327
328
|
if (mediaSectionClosed) {
|
|
@@ -338,7 +339,6 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
338
339
|
await this._pc.setRemoteDescription(answer);
|
|
339
340
|
this._mapMidTransceiver.delete(localId);
|
|
340
341
|
}
|
|
341
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
342
342
|
async pauseSending(localId) {
|
|
343
343
|
this.assertNotClosed();
|
|
344
344
|
this.assertSendDirection();
|
|
@@ -356,7 +356,6 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
356
356
|
logger.debug('pauseSending() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
357
357
|
await this._pc.setRemoteDescription(answer);
|
|
358
358
|
}
|
|
359
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
360
359
|
async resumeSending(localId) {
|
|
361
360
|
this.assertNotClosed();
|
|
362
361
|
this.assertSendDirection();
|
|
@@ -497,13 +496,13 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
497
496
|
for (const options of optionsList) {
|
|
498
497
|
const { trackId, kind, rtpParameters, streamId } = options;
|
|
499
498
|
logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
|
|
500
|
-
const localId = rtpParameters.mid
|
|
499
|
+
const localId = rtpParameters.mid ?? String(this._mapMidTransceiver.size);
|
|
501
500
|
mapLocalId.set(trackId, localId);
|
|
502
501
|
this._remoteSdp.receive({
|
|
503
502
|
mid: localId,
|
|
504
503
|
kind,
|
|
505
504
|
offerRtpParameters: rtpParameters,
|
|
506
|
-
streamId: streamId
|
|
505
|
+
streamId: streamId ?? rtpParameters.rtcp.cname,
|
|
507
506
|
trackId,
|
|
508
507
|
});
|
|
509
508
|
}
|
|
@@ -35,13 +35,13 @@ function getCapabilities() {
|
|
|
35
35
|
const caps = utils.clone(nativeCaps);
|
|
36
36
|
for (const codec of caps.codecs ?? []) {
|
|
37
37
|
// Rename numChannels to channels.
|
|
38
|
-
// @ts-
|
|
38
|
+
// @ts-expect-error --- On purpose.
|
|
39
39
|
codec.channels = codec.numChannels;
|
|
40
|
-
// @ts-
|
|
40
|
+
// @ts-expect-error --- On purpose.
|
|
41
41
|
delete codec.numChannels;
|
|
42
42
|
// Add mimeType.
|
|
43
|
-
// @ts-
|
|
44
|
-
codec.mimeType = codec.mimeType
|
|
43
|
+
// @ts-expect-error --- On purpose (due to codec.name).
|
|
44
|
+
codec.mimeType = codec.mimeType ?? `${codec.kind}/${codec.name}`;
|
|
45
45
|
// NOTE: Edge sets some numeric parameters as string rather than number. Fix them.
|
|
46
46
|
if (codec.parameters) {
|
|
47
47
|
const parameters = codec.parameters;
|
|
@@ -53,7 +53,7 @@ function getCapabilities() {
|
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
// Delete emty parameter String in rtcpFeedback.
|
|
56
|
-
for (const feedback of codec.rtcpFeedback
|
|
56
|
+
for (const feedback of codec.rtcpFeedback ?? []) {
|
|
57
57
|
if (!feedback.parameter) {
|
|
58
58
|
feedback.parameter = '';
|
|
59
59
|
}
|
|
@@ -68,25 +68,25 @@ function mangleRtpParameters(rtpParameters) {
|
|
|
68
68
|
const params = utils.clone(rtpParameters);
|
|
69
69
|
// Rename mid to muxId.
|
|
70
70
|
if (params.mid) {
|
|
71
|
-
// @ts-
|
|
71
|
+
// @ts-expect-error --- On purpose (due to muxId).
|
|
72
72
|
params.muxId = params.mid;
|
|
73
73
|
delete params.mid;
|
|
74
74
|
}
|
|
75
75
|
for (const codec of params.codecs) {
|
|
76
76
|
// Rename channels to numChannels.
|
|
77
77
|
if (codec.channels) {
|
|
78
|
-
// @ts-
|
|
78
|
+
// @ts-expect-error --- On purpose.
|
|
79
79
|
codec.numChannels = codec.channels;
|
|
80
80
|
delete codec.channels;
|
|
81
81
|
}
|
|
82
82
|
// Add codec.name (requried by Edge).
|
|
83
|
-
// @ts-
|
|
83
|
+
// @ts-expect-error --- On purpose (due to name).
|
|
84
84
|
if (codec.mimeType && !codec.name) {
|
|
85
|
-
// @ts-
|
|
85
|
+
// @ts-expect-error --- On purpose (due to name).
|
|
86
86
|
codec.name = codec.mimeType.split('/')[1];
|
|
87
87
|
}
|
|
88
88
|
// Remove mimeType.
|
|
89
|
-
// @ts-
|
|
89
|
+
// @ts-expect-error --- On purpose.
|
|
90
90
|
delete codec.mimeType;
|
|
91
91
|
}
|
|
92
92
|
return params;
|
|
@@ -5,7 +5,7 @@ exports.addNackSuppportForOpus = addNackSuppportForOpus;
|
|
|
5
5
|
* This function adds RTCP NACK support for OPUS codec in given capabilities.
|
|
6
6
|
*/
|
|
7
7
|
function addNackSuppportForOpus(rtpCapabilities) {
|
|
8
|
-
for (const codec of rtpCapabilities.codecs
|
|
8
|
+
for (const codec of rtpCapabilities.codecs ?? []) {
|
|
9
9
|
if ((codec.mimeType.toLowerCase() === 'audio/opus' ||
|
|
10
10
|
codec.mimeType.toLowerCase() === 'audio/multiopus') &&
|
|
11
11
|
!codec.rtcpFeedback?.some(fb => fb.type === 'nack' && !fb.parameter)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaSection.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/MediaSection.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,aAAa,EACb,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACN,SAAS,EACT,aAAa,EAIb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,8BAAsB,YAAY;IAEjC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC;IAErC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;gBAEvB,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,KAAa,GACb,EAAE;QACF,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;QAC/B,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,KAAK,EAAE,OAAO,CAAC;KACf;IA0CD,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAE1C,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,SAAS,IAAI,MAAM;IAInB,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAKpD,KAAK,IAAI,IAAI;IAIb,QAAQ,CAAC,MAAM,IAAI,IAAI;IAEvB,OAAO,IAAI,IAAI;IAYf,KAAK,IAAI,IAAI;CAKb;AAED,qBAAa,kBAAmB,SAAQ,YAAY;gBACvC,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,KAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,gBAAwB,GACxB,EAAE;QACF,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;QAC/B,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;QACxC,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,gBAAgB,EAAE,GAAG,CAAC;QACtB,kBAAkB,CAAC,EAAE,aAAa,CAAC;QACnC,mBAAmB,CAAC,EAAE,aAAa,CAAC;QACpC,YAAY,CAAC,EAAE,oBAAoB,CAAC;QACpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC3B;
|
|
1
|
+
{"version":3,"file":"MediaSection.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/MediaSection.ts"],"names":[],"mappings":"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"}
|
|
@@ -212,7 +212,7 @@ class AnswerMediaSection extends MediaSection {
|
|
|
212
212
|
this._mediaObject.ext = [];
|
|
213
213
|
for (const ext of answerRtpParameters.headerExtensions) {
|
|
214
214
|
// Don't add a header extension if not present in the offer.
|
|
215
|
-
const found = (offerMediaObject.ext
|
|
215
|
+
const found = (offerMediaObject.ext ?? []).some((localExt) => localExt.uri === ext.uri);
|
|
216
216
|
if (!found) {
|
|
217
217
|
continue;
|
|
218
218
|
}
|
|
@@ -233,7 +233,7 @@ class AnswerMediaSection extends MediaSection {
|
|
|
233
233
|
list1: offerMediaObject.simulcast.list1,
|
|
234
234
|
};
|
|
235
235
|
this._mediaObject.rids = [];
|
|
236
|
-
for (const rid of offerMediaObject.rids
|
|
236
|
+
for (const rid of offerMediaObject.rids ?? []) {
|
|
237
237
|
if (rid.direction !== 'send') {
|
|
238
238
|
continue;
|
|
239
239
|
}
|
|
@@ -245,12 +245,11 @@ class AnswerMediaSection extends MediaSection {
|
|
|
245
245
|
}
|
|
246
246
|
// Simulcast (draft version 03).
|
|
247
247
|
else if (offerMediaObject.simulcast_03) {
|
|
248
|
-
// eslint-disable-next-line camelcase
|
|
249
248
|
this._mediaObject.simulcast_03 = {
|
|
250
249
|
value: offerMediaObject.simulcast_03.value.replace(/send/g, 'recv'),
|
|
251
250
|
};
|
|
252
251
|
this._mediaObject.rids = [];
|
|
253
|
-
for (const rid of offerMediaObject.rids
|
|
252
|
+
for (const rid of offerMediaObject.rids ?? []) {
|
|
254
253
|
if (rid.direction !== 'send') {
|
|
255
254
|
continue;
|
|
256
255
|
}
|
|
@@ -307,7 +306,7 @@ class AnswerMediaSection extends MediaSection {
|
|
|
307
306
|
this._mediaObject.direction = 'recvonly';
|
|
308
307
|
}
|
|
309
308
|
muxSimulcastStreams(encodings) {
|
|
310
|
-
if (!this._mediaObject.simulcast
|
|
309
|
+
if (!this._mediaObject.simulcast?.list1) {
|
|
311
310
|
return;
|
|
312
311
|
}
|
|
313
312
|
const layers = {};
|
|
@@ -360,7 +359,7 @@ class OfferMediaSection extends MediaSection {
|
|
|
360
359
|
this._mediaObject.rtcpFb = [];
|
|
361
360
|
this._mediaObject.fmtp = [];
|
|
362
361
|
if (!this._planB) {
|
|
363
|
-
this._mediaObject.msid = `${streamId
|
|
362
|
+
this._mediaObject.msid = `${streamId ?? '-'} ${trackId}`;
|
|
364
363
|
}
|
|
365
364
|
for (const codec of offerRtpParameters.codecs) {
|
|
366
365
|
const rtp = {
|
|
@@ -407,7 +406,7 @@ class OfferMediaSection extends MediaSection {
|
|
|
407
406
|
this._mediaObject.rtcpRsize = 'rtcp-rsize';
|
|
408
407
|
const encoding = offerRtpParameters.encodings[0];
|
|
409
408
|
const ssrc = encoding.ssrc;
|
|
410
|
-
const rtxSsrc = encoding.rtx
|
|
409
|
+
const rtxSsrc = encoding.rtx?.ssrc;
|
|
411
410
|
this._mediaObject.ssrcs = [];
|
|
412
411
|
this._mediaObject.ssrcGroups = [];
|
|
413
412
|
if (offerRtpParameters.rtcp.cname) {
|
|
@@ -421,7 +420,7 @@ class OfferMediaSection extends MediaSection {
|
|
|
421
420
|
this._mediaObject.ssrcs.push({
|
|
422
421
|
id: ssrc,
|
|
423
422
|
attribute: 'msid',
|
|
424
|
-
value: `${streamId
|
|
423
|
+
value: `${streamId ?? '-'} ${trackId}`,
|
|
425
424
|
});
|
|
426
425
|
}
|
|
427
426
|
if (rtxSsrc) {
|
|
@@ -436,7 +435,7 @@ class OfferMediaSection extends MediaSection {
|
|
|
436
435
|
this._mediaObject.ssrcs.push({
|
|
437
436
|
id: rtxSsrc,
|
|
438
437
|
attribute: 'msid',
|
|
439
|
-
value: `${streamId
|
|
438
|
+
value: `${streamId ?? '-'} ${trackId}`,
|
|
440
439
|
});
|
|
441
440
|
}
|
|
442
441
|
// Associate original and retransmission SSRCs.
|
|
@@ -478,7 +477,7 @@ class OfferMediaSection extends MediaSection {
|
|
|
478
477
|
planBReceive({ offerRtpParameters, streamId, trackId, }) {
|
|
479
478
|
const encoding = offerRtpParameters.encodings[0];
|
|
480
479
|
const ssrc = encoding.ssrc;
|
|
481
|
-
const rtxSsrc = encoding.rtx
|
|
480
|
+
const rtxSsrc = encoding.rtx?.ssrc;
|
|
482
481
|
const payloads = this._mediaObject.payloads.split(' ');
|
|
483
482
|
for (const codec of offerRtpParameters.codecs) {
|
|
484
483
|
if (payloads.includes(String(codec.payloadType))) {
|
|
@@ -529,7 +528,7 @@ class OfferMediaSection extends MediaSection {
|
|
|
529
528
|
this._mediaObject.ssrcs.push({
|
|
530
529
|
id: ssrc,
|
|
531
530
|
attribute: 'msid',
|
|
532
|
-
value: `${streamId
|
|
531
|
+
value: `${streamId ?? '-'} ${trackId}`,
|
|
533
532
|
});
|
|
534
533
|
if (rtxSsrc) {
|
|
535
534
|
if (offerRtpParameters.rtcp.cname) {
|
|
@@ -542,7 +541,7 @@ class OfferMediaSection extends MediaSection {
|
|
|
542
541
|
this._mediaObject.ssrcs.push({
|
|
543
542
|
id: rtxSsrc,
|
|
544
543
|
attribute: 'msid',
|
|
545
|
-
value: `${streamId
|
|
544
|
+
value: `${streamId ?? '-'} ${trackId}`,
|
|
546
545
|
});
|
|
547
546
|
// Associate original and retransmission SSRCs.
|
|
548
547
|
this._mediaObject.ssrcGroups.push({
|
|
@@ -554,7 +553,7 @@ class OfferMediaSection extends MediaSection {
|
|
|
554
553
|
planBStopReceiving({ offerRtpParameters, }) {
|
|
555
554
|
const encoding = offerRtpParameters.encodings[0];
|
|
556
555
|
const ssrc = encoding.ssrc;
|
|
557
|
-
const rtxSsrc = encoding.rtx
|
|
556
|
+
const rtxSsrc = encoding.rtx?.ssrc;
|
|
558
557
|
this._mediaObject.ssrcs = this._mediaObject.ssrcs.filter((s) => s.id !== ssrc && s.id !== rtxSsrc);
|
|
559
558
|
if (rtxSsrc) {
|
|
560
559
|
this._mediaObject.ssrcGroups = this._mediaObject.ssrcGroups.filter((group) => group.ssrcs !== `${ssrc} ${rtxSsrc}`);
|
|
@@ -55,7 +55,7 @@ class RemoteSdp {
|
|
|
55
55
|
media: [],
|
|
56
56
|
};
|
|
57
57
|
// If ICE parameters are given, add ICE-Lite indicator.
|
|
58
|
-
if (iceParameters
|
|
58
|
+
if (iceParameters?.iceLite) {
|
|
59
59
|
this._sdpObject.icelite = 'ice-lite';
|
|
60
60
|
}
|
|
61
61
|
// If DTLS parameters are given, assume WebRTC and BUNDLE.
|
|
@@ -82,7 +82,7 @@ function extractRtpCapabilities({ sdpObject, }) {
|
|
|
82
82
|
continue;
|
|
83
83
|
}
|
|
84
84
|
// Specials case to convert parameter value to string.
|
|
85
|
-
if (parameters
|
|
85
|
+
if (parameters?.hasOwnProperty('profile-level-id')) {
|
|
86
86
|
parameters['profile-level-id'] = String(parameters['profile-level-id']);
|
|
87
87
|
}
|
|
88
88
|
codec.parameters = parameters;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planBUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/planBUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,wBAAgB,eAAe,CAAC,EAC/B,gBAAgB,EAChB,KAAK,GACL,EAAE;IACF,gBAAgB,EAAE,GAAG,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;CACxB,GAAG,qBAAqB,EAAE,CAyE1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAClC,gBAAgB,EAChB,KAAK,EACL,UAAU,GACV,EAAE;IACF,gBAAgB,EAAE,GAAG,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"planBUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/planBUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,wBAAgB,eAAe,CAAC,EAC/B,gBAAgB,EAChB,KAAK,GACL,EAAE;IACF,gBAAgB,EAAE,GAAG,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;CACxB,GAAG,qBAAqB,EAAE,CAyE1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAClC,gBAAgB,EAChB,KAAK,EACL,UAAU,GACV,EAAE;IACF,gBAAgB,EAAE,GAAG,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAmHP"}
|
|
@@ -117,8 +117,7 @@ function addLegacySimulcast({ offerMediaObject, track, numStreams, }) {
|
|
|
117
117
|
semantics: 'SIM',
|
|
118
118
|
ssrcs: ssrcs.join(' '),
|
|
119
119
|
});
|
|
120
|
-
for (
|
|
121
|
-
const ssrc = ssrcs[i];
|
|
120
|
+
for (const ssrc of ssrcs) {
|
|
122
121
|
offerMediaObject.ssrcs.push({
|
|
123
122
|
id: ssrc,
|
|
124
123
|
attribute: 'cname',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unifiedPlanUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/unifiedPlanUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,wBAAgB,eAAe,CAAC,EAC/B,gBAAgB,GAChB,EAAE;IACF,gBAAgB,EAAE,GAAG,CAAC;CACtB,GAAG,qBAAqB,EAAE,CAyD1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAClC,gBAAgB,EAChB,UAAU,GACV,EAAE;IACF,gBAAgB,EAAE,GAAG,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"unifiedPlanUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/unifiedPlanUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,wBAAgB,eAAe,CAAC,EAC/B,gBAAgB,GAChB,EAAE;IACF,gBAAgB,EAAE,GAAG,CAAC;CACtB,GAAG,qBAAqB,EAAE,CAyD1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAClC,gBAAgB,EAChB,UAAU,GACV,EAAE;IACF,gBAAgB,EAAE,GAAG,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAkGP"}
|
|
@@ -58,7 +58,7 @@ function addLegacySimulcast({ offerMediaObject, numStreams, }) {
|
|
|
58
58
|
throw new Error('a=ssrc line with msid information not found');
|
|
59
59
|
}
|
|
60
60
|
const [streamId, trackId] = ssrcMsidLine.value.split(' ');
|
|
61
|
-
const firstSsrc = ssrcMsidLine.id;
|
|
61
|
+
const firstSsrc = Number(ssrcMsidLine.id);
|
|
62
62
|
let firstRtxSsrc;
|
|
63
63
|
// Get the SSRC for RTX.
|
|
64
64
|
(offerMediaObject.ssrcGroups || []).some((line) => {
|
|
@@ -93,8 +93,7 @@ function addLegacySimulcast({ offerMediaObject, numStreams, }) {
|
|
|
93
93
|
semantics: 'SIM',
|
|
94
94
|
ssrcs: ssrcs.join(' '),
|
|
95
95
|
});
|
|
96
|
-
for (
|
|
97
|
-
const ssrc = ssrcs[i];
|
|
96
|
+
for (const ssrc of ssrcs) {
|
|
98
97
|
offerMediaObject.ssrcs.push({
|
|
99
98
|
id: ssrc,
|
|
100
99
|
attribute: 'cname',
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
package/lib/ortc.js
CHANGED
|
@@ -194,11 +194,11 @@ function getExtendedRtpCapabilities(localCaps, remoteCaps) {
|
|
|
194
194
|
headerExtensions: [],
|
|
195
195
|
};
|
|
196
196
|
// Match media codecs and keep the order preferred by remoteCaps.
|
|
197
|
-
for (const remoteCodec of remoteCaps.codecs
|
|
197
|
+
for (const remoteCodec of remoteCaps.codecs ?? []) {
|
|
198
198
|
if (isRtxCodec(remoteCodec)) {
|
|
199
199
|
continue;
|
|
200
200
|
}
|
|
201
|
-
const matchingLocalCodec = (localCaps.codecs
|
|
201
|
+
const matchingLocalCodec = (localCaps.codecs ?? []).find((localCodec) => matchCodecs(localCodec, remoteCodec, { strict: true, modify: true }));
|
|
202
202
|
if (!matchingLocalCodec) {
|
|
203
203
|
continue;
|
|
204
204
|
}
|
|
@@ -433,17 +433,17 @@ function getSendingRemoteRtpParameters(kind, extendedRtpCapabilities) {
|
|
|
433
433
|
if (rtpParameters.headerExtensions.some(ext => ext.uri ===
|
|
434
434
|
'http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01')) {
|
|
435
435
|
for (const codec of rtpParameters.codecs) {
|
|
436
|
-
codec.rtcpFeedback = (codec.rtcpFeedback
|
|
436
|
+
codec.rtcpFeedback = (codec.rtcpFeedback ?? []).filter((fb) => fb.type !== 'goog-remb');
|
|
437
437
|
}
|
|
438
438
|
}
|
|
439
439
|
else if (rtpParameters.headerExtensions.some(ext => ext.uri === 'http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time')) {
|
|
440
440
|
for (const codec of rtpParameters.codecs) {
|
|
441
|
-
codec.rtcpFeedback = (codec.rtcpFeedback
|
|
441
|
+
codec.rtcpFeedback = (codec.rtcpFeedback ?? []).filter(fb => fb.type !== 'transport-cc');
|
|
442
442
|
}
|
|
443
443
|
}
|
|
444
444
|
else {
|
|
445
445
|
for (const codec of rtpParameters.codecs) {
|
|
446
|
-
codec.rtcpFeedback = (codec.rtcpFeedback
|
|
446
|
+
codec.rtcpFeedback = (codec.rtcpFeedback ?? []).filter((fb) => fb.type !== 'transport-cc' && fb.type !== 'goog-remb');
|
|
447
447
|
}
|
|
448
448
|
}
|
|
449
449
|
return rtpParameters;
|
|
@@ -893,8 +893,8 @@ function matchHeaderExtensions(aExt, bExt) {
|
|
|
893
893
|
}
|
|
894
894
|
function reduceRtcpFeedback(codecA, codecB) {
|
|
895
895
|
const reducedRtcpFeedback = [];
|
|
896
|
-
for (const aFb of codecA.rtcpFeedback
|
|
897
|
-
const matchingBFb = (codecB.rtcpFeedback
|
|
896
|
+
for (const aFb of codecA.rtcpFeedback ?? []) {
|
|
897
|
+
const matchingBFb = (codecB.rtcpFeedback ?? []).find((bFb) => bFb.type === aFb.type &&
|
|
898
898
|
(bFb.parameter === aFb.parameter || (!bFb.parameter && !aFb.parameter)));
|
|
899
899
|
if (matchingBFb) {
|
|
900
900
|
reducedRtcpFeedback.push(matchingBFb);
|
package/lib/scalabilityModes.js
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.parse = parse;
|
|
4
4
|
const ScalabilityModeRegex = new RegExp('^[LS]([1-9]\\d{0,1})T([1-9]\\d{0,1})');
|
|
5
5
|
function parse(scalabilityMode) {
|
|
6
|
-
const match = ScalabilityModeRegex.exec(scalabilityMode
|
|
6
|
+
const match = ScalabilityModeRegex.exec(scalabilityMode ?? '');
|
|
7
7
|
if (match) {
|
|
8
8
|
return {
|
|
9
9
|
spatialLayers: Number(match[1]),
|