mediasoup-client 3.24.1 → 3.24.3
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/Producer.d.ts.map +1 -1
- package/lib/Producer.js +18 -4
- package/lib/Transport.d.ts.map +1 -1
- package/lib/Transport.js +30 -11
- package/lib/handlers/Chrome111.d.ts.map +1 -1
- package/lib/handlers/Chrome111.js +130 -95
- package/lib/handlers/Chrome74.d.ts.map +1 -1
- package/lib/handlers/Chrome74.js +166 -129
- package/lib/handlers/Firefox120.d.ts.map +1 -1
- package/lib/handlers/Firefox120.js +142 -102
- package/lib/handlers/ReactNative106.d.ts.map +1 -1
- package/lib/handlers/ReactNative106.js +183 -146
- package/lib/handlers/Safari12.d.ts.map +1 -1
- package/lib/handlers/Safari12.js +149 -112
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/ortc.d.ts.map +1 -1
- package/lib/ortc.js +9 -5
- package/lib/test/test.js +60 -1
- package/package.json +3 -3
|
@@ -247,144 +247,163 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
247
247
|
streams: [this._sendStream],
|
|
248
248
|
sendEncodings: encodings,
|
|
249
249
|
});
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
onRtpSender
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
250
|
+
try {
|
|
251
|
+
if (this._forcedRtpExtensions) {
|
|
252
|
+
ortcUtils.applyForcedRtpExtensions(transceiver, this._forcedRtpExtensions);
|
|
253
|
+
}
|
|
254
|
+
if (onRtpSender) {
|
|
255
|
+
onRtpSender(transceiver.sender);
|
|
256
|
+
}
|
|
257
|
+
let offer = await this._pc.createOffer();
|
|
258
|
+
let localSdpObject = sdpTransform.parse(offer.sdp);
|
|
259
|
+
if (localSdpObject.extmapAllowMixed) {
|
|
260
|
+
this._remoteSdp.setSessionExtmapAllowMixed();
|
|
261
|
+
}
|
|
262
|
+
const nativeRtpCapabilities = ReactNative106.getLocalRtpCapabilities(localSdpObject);
|
|
263
|
+
const sendExtendedRtpCapabilities = this._getSendExtendedRtpCapabilities(nativeRtpCapabilities);
|
|
264
|
+
// Generic sending RTP parameters.
|
|
265
|
+
const sendingRtpParameters = ortc.getSendingRtpParameters(track.kind, sendExtendedRtpCapabilities);
|
|
266
|
+
// This may throw.
|
|
267
|
+
sendingRtpParameters.codecs = ortc.reduceCodecs(sendingRtpParameters.codecs, codec);
|
|
268
|
+
// Generic sending RTP parameters suitable for the SDP remote answer.
|
|
269
|
+
const sendingRemoteRtpParameters = ortc.getSendingRemoteRtpParameters(track.kind, sendExtendedRtpCapabilities);
|
|
270
|
+
// This may throw.
|
|
271
|
+
sendingRemoteRtpParameters.codecs = ortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec);
|
|
272
|
+
if (!this._transportReady) {
|
|
273
|
+
await this.setupTransport({
|
|
274
|
+
localDtlsRole: this._forcedLocalDtlsRole ?? 'client',
|
|
275
|
+
localSdpObject,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// Special case for VP9 with SVC.
|
|
279
|
+
let hackVp9Svc = false;
|
|
280
|
+
const layers = (0, scalabilityModes_1.parse)((encodings ?? [{}])[0].scalabilityMode);
|
|
281
|
+
let offerMediaObject;
|
|
282
|
+
if (encodings?.length === 1 &&
|
|
283
|
+
layers.spatialLayers > 1 &&
|
|
284
|
+
sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp9') {
|
|
285
|
+
logger.debug('send() | enabling legacy simulcast for VP9 SVC');
|
|
286
|
+
hackVp9Svc = true;
|
|
287
|
+
localSdpObject = sdpTransform.parse(offer.sdp);
|
|
288
|
+
offerMediaObject = localSdpObject.media[mediaSectionIdx.idx];
|
|
289
|
+
sdpUnifiedPlanUtils.addLegacySimulcast({
|
|
290
|
+
offerMediaObject,
|
|
291
|
+
numStreams: layers.spatialLayers,
|
|
292
|
+
});
|
|
293
|
+
offer = {
|
|
294
|
+
type: 'offer',
|
|
295
|
+
sdp: sdpTransform.write(localSdpObject),
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
299
|
+
await this._pc.setLocalDescription(offer);
|
|
300
|
+
// We can now get the transceiver.mid.
|
|
301
|
+
// NOTE: We cannot read generated MID on iOS react-native-webrtc 111.0.0
|
|
302
|
+
// because transceiver.mid is not available until setRemoteDescription()
|
|
303
|
+
// is called, so this is best effort.
|
|
304
|
+
// Issue: https://github.com/react-native-webrtc/react-native-webrtc/issues/1404
|
|
305
|
+
// NOTE: So let's fill MID in sendingRtpParameters later.
|
|
306
|
+
// NOTE: This is fixed in react-native-webrtc 111.0.3.
|
|
307
|
+
let localId = transceiver.mid ?? undefined;
|
|
308
|
+
if (!localId) {
|
|
309
|
+
logger.warn('send() | missing transceiver.mid (bug in react-native-webrtc, using a workaround');
|
|
310
|
+
}
|
|
311
|
+
// Set MID.
|
|
312
|
+
// NOTE: As per above, it could be unset yet.
|
|
313
|
+
sendingRtpParameters.mid = localId;
|
|
314
|
+
localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);
|
|
287
315
|
offerMediaObject = localSdpObject.media[mediaSectionIdx.idx];
|
|
288
|
-
|
|
316
|
+
// Set RTCP CNAME.
|
|
317
|
+
sendingRtpParameters.rtcp.cname = sdpCommonUtils.getCname({
|
|
289
318
|
offerMediaObject,
|
|
290
|
-
numStreams: layers.spatialLayers,
|
|
291
319
|
});
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
320
|
+
// Set msid.
|
|
321
|
+
sendingRtpParameters.msid = `${streamId ?? this._sendStream.id} ${track.id}`;
|
|
322
|
+
// Set RTP encodings by parsing the SDP offer if no encodings are given.
|
|
323
|
+
if (!encodings) {
|
|
324
|
+
sendingRtpParameters.encodings = sdpUnifiedPlanUtils.getRtpEncodings({
|
|
325
|
+
offerMediaObject,
|
|
326
|
+
codecs: sendingRtpParameters.codecs,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
// Set RTP encodings by parsing the SDP offer and complete them with given
|
|
330
|
+
// one if just a single encoding has been given.
|
|
331
|
+
else if (encodings.length === 1) {
|
|
332
|
+
let newEncodings = sdpUnifiedPlanUtils.getRtpEncodings({
|
|
333
|
+
offerMediaObject,
|
|
334
|
+
codecs: sendingRtpParameters.codecs,
|
|
335
|
+
});
|
|
336
|
+
Object.assign(newEncodings[0], encodings[0]);
|
|
337
|
+
// Hack for VP9 SVC.
|
|
338
|
+
if (hackVp9Svc) {
|
|
339
|
+
newEncodings = [newEncodings[0]];
|
|
340
|
+
}
|
|
341
|
+
sendingRtpParameters.encodings = newEncodings;
|
|
342
|
+
}
|
|
343
|
+
// Otherwise if more than 1 encoding are given use them verbatim.
|
|
344
|
+
else {
|
|
345
|
+
sendingRtpParameters.encodings = encodings;
|
|
346
|
+
}
|
|
347
|
+
// If VP8 or H264 and there is effective simulcast, add scalabilityMode to
|
|
348
|
+
// each encoding.
|
|
349
|
+
if (sendingRtpParameters.encodings.length > 1 &&
|
|
350
|
+
(sendingRtpParameters.codecs[0].mimeType.toLowerCase() ===
|
|
351
|
+
'video/vp8' ||
|
|
352
|
+
sendingRtpParameters.codecs[0].mimeType.toLowerCase() ===
|
|
353
|
+
'video/h264')) {
|
|
354
|
+
for (const encoding of sendingRtpParameters.encodings) {
|
|
355
|
+
if (encoding.scalabilityMode) {
|
|
356
|
+
encoding.scalabilityMode = `L1T${layers.temporalLayers}`;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
encoding.scalabilityMode = 'L1T3';
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
this._remoteSdp.send({
|
|
332
364
|
offerMediaObject,
|
|
333
|
-
|
|
365
|
+
reuseMid: mediaSectionIdx.reuseMid,
|
|
366
|
+
offerRtpParameters: sendingRtpParameters,
|
|
367
|
+
answerRtpParameters: sendingRemoteRtpParameters,
|
|
368
|
+
codecOptions,
|
|
334
369
|
});
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
370
|
+
const answer = {
|
|
371
|
+
type: 'answer',
|
|
372
|
+
sdp: this._remoteSdp.getSdp(),
|
|
373
|
+
};
|
|
374
|
+
logger.debug('send() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
375
|
+
await this._pc.setRemoteDescription(answer);
|
|
376
|
+
// Follow up of iOS react-native-webrtc 111.0.0 issue told above. Now yes,
|
|
377
|
+
// we can read generated MID (if not done above) and fill sendingRtpParameters.
|
|
378
|
+
// NOTE: This is fixed in react-native-webrtc 111.0.3 so this block isn't
|
|
379
|
+
// needed starting from that version.
|
|
380
|
+
if (!localId) {
|
|
381
|
+
localId = transceiver.mid;
|
|
382
|
+
sendingRtpParameters.mid = localId;
|
|
339
383
|
}
|
|
340
|
-
|
|
384
|
+
// Store in the map.
|
|
385
|
+
this._mapMidTransceiver.set(localId, transceiver);
|
|
386
|
+
return {
|
|
387
|
+
localId,
|
|
388
|
+
rtpParameters: sendingRtpParameters,
|
|
389
|
+
rtpSender: transceiver.sender,
|
|
390
|
+
};
|
|
341
391
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
for (const encoding of sendingRtpParameters.encodings) {
|
|
352
|
-
if (encoding.scalabilityMode) {
|
|
353
|
-
encoding.scalabilityMode = `L1T${layers.temporalLayers}`;
|
|
354
|
-
}
|
|
355
|
-
else {
|
|
356
|
-
encoding.scalabilityMode = 'L1T3';
|
|
392
|
+
catch (error) {
|
|
393
|
+
// Undo the changes done in the PeerConnection, otherwise it gets out of
|
|
394
|
+
// sync with the remote SDP and later calls to send() fail.
|
|
395
|
+
try {
|
|
396
|
+
if (this._pc.signalingState === 'have-local-offer') {
|
|
397
|
+
try {
|
|
398
|
+
await this._pc.setLocalDescription({ type: 'rollback' });
|
|
399
|
+
}
|
|
400
|
+
catch (error2) { }
|
|
357
401
|
}
|
|
402
|
+
transceiver.stop();
|
|
358
403
|
}
|
|
404
|
+
catch (error3) { }
|
|
405
|
+
throw error;
|
|
359
406
|
}
|
|
360
|
-
this._remoteSdp.send({
|
|
361
|
-
offerMediaObject,
|
|
362
|
-
reuseMid: mediaSectionIdx.reuseMid,
|
|
363
|
-
offerRtpParameters: sendingRtpParameters,
|
|
364
|
-
answerRtpParameters: sendingRemoteRtpParameters,
|
|
365
|
-
codecOptions,
|
|
366
|
-
});
|
|
367
|
-
const answer = {
|
|
368
|
-
type: 'answer',
|
|
369
|
-
sdp: this._remoteSdp.getSdp(),
|
|
370
|
-
};
|
|
371
|
-
logger.debug('send() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
372
|
-
await this._pc.setRemoteDescription(answer);
|
|
373
|
-
// Follow up of iOS react-native-webrtc 111.0.0 issue told above. Now yes,
|
|
374
|
-
// we can read generated MID (if not done above) and fill sendingRtpParameters.
|
|
375
|
-
// NOTE: This is fixed in react-native-webrtc 111.0.3 so this block isn't
|
|
376
|
-
// needed starting from that version.
|
|
377
|
-
if (!localId) {
|
|
378
|
-
localId = transceiver.mid;
|
|
379
|
-
sendingRtpParameters.mid = localId;
|
|
380
|
-
}
|
|
381
|
-
// Store in the map.
|
|
382
|
-
this._mapMidTransceiver.set(localId, transceiver);
|
|
383
|
-
return {
|
|
384
|
-
localId,
|
|
385
|
-
rtpParameters: sendingRtpParameters,
|
|
386
|
-
rtpSender: transceiver.sender,
|
|
387
|
-
};
|
|
388
407
|
}
|
|
389
408
|
async stopSending(localId) {
|
|
390
409
|
this.assertSendDirection();
|
|
@@ -552,25 +571,43 @@ class ReactNative106 extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
552
571
|
// If this is the first DataChannel we need to create the SDP answer with
|
|
553
572
|
// m=application section.
|
|
554
573
|
if (!this._hasDataChannelMediaSection) {
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
574
|
+
try {
|
|
575
|
+
const offer = await this._pc.createOffer();
|
|
576
|
+
const localSdpObject = sdpTransform.parse(offer.sdp);
|
|
577
|
+
const offerMediaObject = localSdpObject.media.find(m => m.type === 'application');
|
|
578
|
+
if (!this._transportReady) {
|
|
579
|
+
await this.setupTransport({
|
|
580
|
+
localDtlsRole: this._forcedLocalDtlsRole ?? 'client',
|
|
581
|
+
localSdpObject,
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
585
|
+
await this._pc.setLocalDescription(offer);
|
|
586
|
+
this._remoteSdp.sendSctpAssociation({ offerMediaObject });
|
|
587
|
+
const answer = {
|
|
588
|
+
type: 'answer',
|
|
589
|
+
sdp: this._remoteSdp.getSdp(),
|
|
590
|
+
};
|
|
591
|
+
logger.debug('sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
592
|
+
await this._pc.setRemoteDescription(answer);
|
|
593
|
+
this._hasDataChannelMediaSection = true;
|
|
594
|
+
}
|
|
595
|
+
catch (error) {
|
|
596
|
+
// Undo the changes done in the PeerConnection, otherwise it gets out of
|
|
597
|
+
// sync with the remote SDP and later calls to send() and
|
|
598
|
+
// sendDataChannel() fail.
|
|
599
|
+
try {
|
|
600
|
+
if (this._pc.signalingState === 'have-local-offer') {
|
|
601
|
+
try {
|
|
602
|
+
await this._pc.setLocalDescription({ type: 'rollback' });
|
|
603
|
+
}
|
|
604
|
+
catch (error2) { }
|
|
605
|
+
}
|
|
606
|
+
dataChannel.close();
|
|
607
|
+
}
|
|
608
|
+
catch (error3) { }
|
|
609
|
+
throw error;
|
|
563
610
|
}
|
|
564
|
-
logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
565
|
-
await this._pc.setLocalDescription(offer);
|
|
566
|
-
this._remoteSdp.sendSctpAssociation({ offerMediaObject });
|
|
567
|
-
const answer = {
|
|
568
|
-
type: 'answer',
|
|
569
|
-
sdp: this._remoteSdp.getSdp(),
|
|
570
|
-
};
|
|
571
|
-
logger.debug('sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
572
|
-
await this._pc.setRemoteDescription(answer);
|
|
573
|
-
this._hasDataChannelMediaSection = true;
|
|
574
611
|
}
|
|
575
612
|
const newSctpStreamParameters = {
|
|
576
613
|
streamId: options.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Safari12.d.ts","sourceRoot":"","sources":["../../src/handlers/Safari12.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAKzD,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,cAAc,CAAC;AAW5D,OAAO,KAAK,EACX,qBAAqB,EAErB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,cAAc,EAEd,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,gCAAgC,EAChC,+BAA+B,EAC/B,MAAM,oBAAoB,CAAC;AAM5B,qBAAa,QACZ,SAAQ,oBAAoB,CAAC,aAAa,CAC1C,YAAW,gBAAgB;IAG3B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,UAAU,CAAkB;IAEpC,OAAO,CAAC,0BAA0B,CAAC,CAAS;IAE5C,OAAO,CAAC,UAAU,CAAY;IAE9B,OAAO,CAAC,+BAA+B,CAEV;IAC7B,OAAO,CAAC,oBAAoB,CAAC,CAA6B;IAG1D,OAAO,CAAC,oBAAoB,CAAC,CAAW;IAExC,OAAO,CAAC,GAAG,CAAoB;IAE/B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CACxB;IAEX,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAEjD,OAAO,CAAC,2BAA2B,CAAS;IAE5C,OAAO,CAAC,qBAAqB,CAAK;IAElC,OAAO,CAAC,eAAe,CAAS;IAEhC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,EACpB,mBAAmB,GACnB,EAAE,qBAAqB,GAAG,cAAc;IA+DzC,OAAO,CAAC,MAAM,CAAC,uBAAuB;gBAgB1B,EACX,SAAS,EACT,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,8BAA8B,EAC9B,mBAAmB,GACnB,EAAE,cAAc;IAqEjB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEQ,KAAK,IAAI,IAAI;IAqChB,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3D,UAAU,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDvD,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC;IAM5C,IAAI,CAAC,EACV,KAAK,EACL,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,KAAK,EACL,WAAW,GACX,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Safari12.d.ts","sourceRoot":"","sources":["../../src/handlers/Safari12.ts"],"names":[],"mappings":"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"}
|