mediasoup-client 3.6.40 → 3.6.44
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 +2 -0
- package/lib/Consumer.d.ts.map +1 -1
- package/lib/Consumer.js +4 -0
- package/lib/Transport.d.ts +3 -3
- package/lib/Transport.d.ts.map +1 -1
- package/lib/Transport.js +8 -0
- package/lib/handlers/Chrome55.d.ts +3 -0
- package/lib/handlers/Chrome55.d.ts.map +1 -1
- package/lib/handlers/Chrome55.js +41 -7
- package/lib/handlers/Chrome67.d.ts +3 -0
- package/lib/handlers/Chrome67.d.ts.map +1 -1
- package/lib/handlers/Chrome67.js +41 -7
- package/lib/handlers/Chrome70.d.ts +3 -0
- package/lib/handlers/Chrome70.d.ts.map +1 -1
- package/lib/handlers/Chrome70.js +43 -7
- package/lib/handlers/Chrome74.d.ts +3 -0
- package/lib/handlers/Chrome74.d.ts.map +1 -1
- package/lib/handlers/Chrome74.js +61 -7
- package/lib/handlers/Edge11.d.ts +2 -0
- package/lib/handlers/Edge11.d.ts.map +1 -1
- package/lib/handlers/Edge11.js +10 -0
- package/lib/handlers/FakeHandler.d.ts +2 -0
- package/lib/handlers/FakeHandler.d.ts.map +1 -1
- package/lib/handlers/FakeHandler.js +10 -0
- package/lib/handlers/Firefox60.d.ts +2 -0
- package/lib/handlers/Firefox60.d.ts.map +1 -1
- package/lib/handlers/Firefox60.js +31 -1
- package/lib/handlers/HandlerInterface.d.ts +2 -0
- package/lib/handlers/HandlerInterface.d.ts.map +1 -1
- package/lib/handlers/ReactNative.d.ts +3 -0
- package/lib/handlers/ReactNative.d.ts.map +1 -1
- package/lib/handlers/ReactNative.js +45 -7
- package/lib/handlers/Safari11.d.ts +3 -0
- package/lib/handlers/Safari11.d.ts.map +1 -1
- package/lib/handlers/Safari11.js +41 -7
- package/lib/handlers/Safari12.d.ts +3 -0
- package/lib/handlers/Safari12.d.ts.map +1 -1
- package/lib/handlers/Safari12.js +61 -7
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/package.json +5 -5
- package/src/Consumer.ts +6 -0
- package/src/Transport.ts +19 -3
- package/src/handlers/Chrome55.ts +50 -4
- package/src/handlers/Chrome67.ts +50 -4
- package/src/handlers/Chrome70.ts +54 -4
- package/src/handlers/Chrome74.ts +100 -4
- package/src/handlers/Edge11.ts +14 -0
- package/src/handlers/FakeHandler.ts +14 -0
- package/src/handlers/Firefox60.ts +65 -1
- package/src/handlers/HandlerInterface.ts +4 -0
- package/src/handlers/ReactNative.ts +55 -4
- package/src/handlers/Safari11.ts +50 -4
- package/src/handlers/Safari12.ts +100 -4
package/src/handlers/Chrome74.ts
CHANGED
|
@@ -42,6 +42,9 @@ export class Chrome74 extends HandlerInterface
|
|
|
42
42
|
// Generic sending RTP parameters for audio and video suitable for the SDP
|
|
43
43
|
// remote answer.
|
|
44
44
|
private _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };
|
|
45
|
+
// Initial server side DTLS role. If not 'auto', it will force the opposite
|
|
46
|
+
// value in client side.
|
|
47
|
+
private _forcedLocalDtlsRole?: DtlsRole;
|
|
45
48
|
// RTCPeerConnection instance.
|
|
46
49
|
private _pc: any;
|
|
47
50
|
// Map of RTCTransceivers indexed by MID.
|
|
@@ -172,6 +175,13 @@ export class Chrome74 extends HandlerInterface
|
|
|
172
175
|
video : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)
|
|
173
176
|
};
|
|
174
177
|
|
|
178
|
+
if (dtlsParameters.role && dtlsParameters.role !== 'auto')
|
|
179
|
+
{
|
|
180
|
+
this._forcedLocalDtlsRole = dtlsParameters.role === 'server'
|
|
181
|
+
? 'client'
|
|
182
|
+
: 'server';
|
|
183
|
+
}
|
|
184
|
+
|
|
175
185
|
this._pc = new (RTCPeerConnection as any)(
|
|
176
186
|
{
|
|
177
187
|
iceServers : iceServers || [],
|
|
@@ -315,7 +325,13 @@ export class Chrome74 extends HandlerInterface
|
|
|
315
325
|
let offerMediaObject;
|
|
316
326
|
|
|
317
327
|
if (!this._transportReady)
|
|
318
|
-
|
|
328
|
+
{
|
|
329
|
+
await this._setupTransport(
|
|
330
|
+
{
|
|
331
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
|
|
332
|
+
localSdpObject
|
|
333
|
+
});
|
|
334
|
+
}
|
|
319
335
|
|
|
320
336
|
// Special case for VP9 with SVC.
|
|
321
337
|
let hackVp9Svc = false;
|
|
@@ -465,6 +481,8 @@ export class Chrome74 extends HandlerInterface
|
|
|
465
481
|
answer);
|
|
466
482
|
|
|
467
483
|
await this._pc.setRemoteDescription(answer);
|
|
484
|
+
|
|
485
|
+
this._mapMidTransceiver.delete(localId);
|
|
468
486
|
}
|
|
469
487
|
|
|
470
488
|
async replaceTrack(
|
|
@@ -592,7 +610,13 @@ export class Chrome74 extends HandlerInterface
|
|
|
592
610
|
.find((m: any) => m.type === 'application');
|
|
593
611
|
|
|
594
612
|
if (!this._transportReady)
|
|
595
|
-
|
|
613
|
+
{
|
|
614
|
+
await this._setupTransport(
|
|
615
|
+
{
|
|
616
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
|
|
617
|
+
localSdpObject
|
|
618
|
+
});
|
|
619
|
+
}
|
|
596
620
|
|
|
597
621
|
logger.debug(
|
|
598
622
|
'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',
|
|
@@ -667,7 +691,13 @@ export class Chrome74 extends HandlerInterface
|
|
|
667
691
|
answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
|
|
668
692
|
|
|
669
693
|
if (!this._transportReady)
|
|
670
|
-
|
|
694
|
+
{
|
|
695
|
+
await this._setupTransport(
|
|
696
|
+
{
|
|
697
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
698
|
+
localSdpObject
|
|
699
|
+
});
|
|
700
|
+
}
|
|
671
701
|
|
|
672
702
|
logger.debug(
|
|
673
703
|
'receive() | calling pc.setLocalDescription() [answer:%o]',
|
|
@@ -719,6 +749,68 @@ export class Chrome74 extends HandlerInterface
|
|
|
719
749
|
answer);
|
|
720
750
|
|
|
721
751
|
await this._pc.setLocalDescription(answer);
|
|
752
|
+
|
|
753
|
+
this._mapMidTransceiver.delete(localId);
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
async pauseReceiving(localId: string): Promise<void>
|
|
757
|
+
{
|
|
758
|
+
this._assertRecvDirection();
|
|
759
|
+
|
|
760
|
+
logger.debug('pauseReceiving() [localId:%s]', localId);
|
|
761
|
+
|
|
762
|
+
const transceiver = this._mapMidTransceiver.get(localId);
|
|
763
|
+
|
|
764
|
+
if (!transceiver)
|
|
765
|
+
throw new Error('associated RTCRtpTransceiver not found');
|
|
766
|
+
|
|
767
|
+
transceiver.direction = 'inactive';
|
|
768
|
+
|
|
769
|
+
const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
|
|
770
|
+
|
|
771
|
+
logger.debug(
|
|
772
|
+
'pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]',
|
|
773
|
+
offer);
|
|
774
|
+
|
|
775
|
+
await this._pc.setRemoteDescription(offer);
|
|
776
|
+
|
|
777
|
+
const answer = await this._pc.createAnswer();
|
|
778
|
+
|
|
779
|
+
logger.debug(
|
|
780
|
+
'pauseReceiving() | calling pc.setLocalDescription() [answer:%o]',
|
|
781
|
+
answer);
|
|
782
|
+
|
|
783
|
+
await this._pc.setLocalDescription(answer);
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
async resumeReceiving(localId: string): Promise<void>
|
|
787
|
+
{
|
|
788
|
+
this._assertRecvDirection();
|
|
789
|
+
|
|
790
|
+
logger.debug('resumeReceiving() [localId:%s]', localId);
|
|
791
|
+
|
|
792
|
+
const transceiver = this._mapMidTransceiver.get(localId);
|
|
793
|
+
|
|
794
|
+
if (!transceiver)
|
|
795
|
+
throw new Error('associated RTCRtpTransceiver not found');
|
|
796
|
+
|
|
797
|
+
transceiver.direction = 'recvonly';
|
|
798
|
+
|
|
799
|
+
const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
|
|
800
|
+
|
|
801
|
+
logger.debug(
|
|
802
|
+
'resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]',
|
|
803
|
+
offer);
|
|
804
|
+
|
|
805
|
+
await this._pc.setRemoteDescription(offer);
|
|
806
|
+
|
|
807
|
+
const answer = await this._pc.createAnswer();
|
|
808
|
+
|
|
809
|
+
logger.debug(
|
|
810
|
+
'resumeReceiving() | calling pc.setLocalDescription() [answer:%o]',
|
|
811
|
+
answer);
|
|
812
|
+
|
|
813
|
+
await this._pc.setLocalDescription(answer);
|
|
722
814
|
}
|
|
723
815
|
|
|
724
816
|
async getReceiverStats(localId: string): Promise<RTCStatsReport>
|
|
@@ -780,7 +872,11 @@ export class Chrome74 extends HandlerInterface
|
|
|
780
872
|
{
|
|
781
873
|
const localSdpObject = sdpTransform.parse(answer.sdp);
|
|
782
874
|
|
|
783
|
-
await this._setupTransport(
|
|
875
|
+
await this._setupTransport(
|
|
876
|
+
{
|
|
877
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
878
|
+
localSdpObject
|
|
879
|
+
});
|
|
784
880
|
}
|
|
785
881
|
|
|
786
882
|
logger.debug(
|
package/src/handlers/Edge11.ts
CHANGED
|
@@ -424,6 +424,20 @@ export class Edge11 extends HandlerInterface
|
|
|
424
424
|
}
|
|
425
425
|
}
|
|
426
426
|
|
|
427
|
+
async pauseReceiving(
|
|
428
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
429
|
+
localId: string): Promise<void>
|
|
430
|
+
{
|
|
431
|
+
// Unimplemented.
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
async resumeReceiving(
|
|
435
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
436
|
+
localId: string): Promise<void>
|
|
437
|
+
{
|
|
438
|
+
// Unimplemented.
|
|
439
|
+
}
|
|
440
|
+
|
|
427
441
|
async getReceiverStats(localId: string): Promise<RTCStatsReport>
|
|
428
442
|
{
|
|
429
443
|
const rtpReceiver = this._rtpReceivers.get(localId);
|
|
@@ -348,6 +348,20 @@ export class FakeHandler extends HandlerInterface
|
|
|
348
348
|
this._tracks.delete(Number(localId));
|
|
349
349
|
}
|
|
350
350
|
|
|
351
|
+
async pauseReceiving(
|
|
352
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
353
|
+
localId: string): Promise<void>
|
|
354
|
+
{
|
|
355
|
+
// Unimplemented.
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
async resumeReceiving(
|
|
359
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
360
|
+
localId: string): Promise<void>
|
|
361
|
+
{
|
|
362
|
+
// Unimplemented.
|
|
363
|
+
}
|
|
364
|
+
|
|
351
365
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
352
366
|
async getReceiverStats(localId: string): Promise<RTCStatsReport>
|
|
353
367
|
{
|
|
@@ -477,6 +477,8 @@ export class Firefox60 extends HandlerInterface
|
|
|
477
477
|
answer);
|
|
478
478
|
|
|
479
479
|
await this._pc.setRemoteDescription(answer);
|
|
480
|
+
|
|
481
|
+
this._mapMidTransceiver.delete(localId);
|
|
480
482
|
}
|
|
481
483
|
|
|
482
484
|
async replaceTrack(
|
|
@@ -608,7 +610,7 @@ export class Firefox60 extends HandlerInterface
|
|
|
608
610
|
.find((m: any) => m.type === 'application');
|
|
609
611
|
|
|
610
612
|
if (!this._transportReady)
|
|
611
|
-
await this._setupTransport({ localDtlsRole: '
|
|
613
|
+
await this._setupTransport({ localDtlsRole: 'client', localSdpObject });
|
|
612
614
|
|
|
613
615
|
logger.debug(
|
|
614
616
|
'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',
|
|
@@ -735,6 +737,68 @@ export class Firefox60 extends HandlerInterface
|
|
|
735
737
|
answer);
|
|
736
738
|
|
|
737
739
|
await this._pc.setLocalDescription(answer);
|
|
740
|
+
|
|
741
|
+
this._mapMidTransceiver.delete(localId);
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
async pauseReceiving(localId: string): Promise<void>
|
|
745
|
+
{
|
|
746
|
+
this._assertRecvDirection();
|
|
747
|
+
|
|
748
|
+
logger.debug('pauseReceiving() [localId:%s]', localId);
|
|
749
|
+
|
|
750
|
+
const transceiver = this._mapMidTransceiver.get(localId);
|
|
751
|
+
|
|
752
|
+
if (!transceiver)
|
|
753
|
+
throw new Error('associated RTCRtpTransceiver not found');
|
|
754
|
+
|
|
755
|
+
transceiver.direction = 'inactive';
|
|
756
|
+
|
|
757
|
+
const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
|
|
758
|
+
|
|
759
|
+
logger.debug(
|
|
760
|
+
'pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]',
|
|
761
|
+
offer);
|
|
762
|
+
|
|
763
|
+
await this._pc.setRemoteDescription(offer);
|
|
764
|
+
|
|
765
|
+
const answer = await this._pc.createAnswer();
|
|
766
|
+
|
|
767
|
+
logger.debug(
|
|
768
|
+
'pauseReceiving() | calling pc.setLocalDescription() [answer:%o]',
|
|
769
|
+
answer);
|
|
770
|
+
|
|
771
|
+
await this._pc.setLocalDescription(answer);
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
async resumeReceiving(localId: string): Promise<void>
|
|
775
|
+
{
|
|
776
|
+
this._assertRecvDirection();
|
|
777
|
+
|
|
778
|
+
logger.debug('resumeReceiving() [localId:%s]', localId);
|
|
779
|
+
|
|
780
|
+
const transceiver = this._mapMidTransceiver.get(localId);
|
|
781
|
+
|
|
782
|
+
if (!transceiver)
|
|
783
|
+
throw new Error('associated RTCRtpTransceiver not found');
|
|
784
|
+
|
|
785
|
+
transceiver.direction = 'recvonly';
|
|
786
|
+
|
|
787
|
+
const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
|
|
788
|
+
|
|
789
|
+
logger.debug(
|
|
790
|
+
'resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]',
|
|
791
|
+
offer);
|
|
792
|
+
|
|
793
|
+
await this._pc.setRemoteDescription(offer);
|
|
794
|
+
|
|
795
|
+
const answer = await this._pc.createAnswer();
|
|
796
|
+
|
|
797
|
+
logger.debug(
|
|
798
|
+
'resumeReceiving() | calling pc.setLocalDescription() [answer:%o]',
|
|
799
|
+
answer);
|
|
800
|
+
|
|
801
|
+
await this._pc.setLocalDescription(answer);
|
|
738
802
|
}
|
|
739
803
|
|
|
740
804
|
async getReceiverStats(localId: string): Promise<RTCStatsReport>
|
|
@@ -141,6 +141,10 @@ export abstract class HandlerInterface extends EnhancedEventEmitter
|
|
|
141
141
|
|
|
142
142
|
abstract stopReceiving(localId: string): Promise<void>;
|
|
143
143
|
|
|
144
|
+
abstract pauseReceiving(localId: string): Promise<void>;
|
|
145
|
+
|
|
146
|
+
abstract resumeReceiving(localId: string): Promise<void>;
|
|
147
|
+
|
|
144
148
|
abstract getReceiverStats(localId: string): Promise<RTCStatsReport>;
|
|
145
149
|
|
|
146
150
|
abstract receiveDataChannel(
|
|
@@ -38,6 +38,9 @@ export class ReactNative extends HandlerInterface
|
|
|
38
38
|
// Generic sending RTP parameters for audio and video suitable for the SDP
|
|
39
39
|
// remote answer.
|
|
40
40
|
private _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };
|
|
41
|
+
// Initial server side DTLS role. If not 'auto', it will force the opposite
|
|
42
|
+
// value in client side.
|
|
43
|
+
private _forcedLocalDtlsRole?: DtlsRole;
|
|
41
44
|
// RTCPeerConnection instance.
|
|
42
45
|
private _pc: any;
|
|
43
46
|
// Local stream for sending.
|
|
@@ -85,6 +88,11 @@ export class ReactNative extends HandlerInterface
|
|
|
85
88
|
{
|
|
86
89
|
logger.debug('close()');
|
|
87
90
|
|
|
91
|
+
// Free/dispose native MediaStream but DO NOT free/dispose native
|
|
92
|
+
// MediaStreamTracks (that is parent's business).
|
|
93
|
+
// @ts-ignore (proprietary API in react-native-webrtc).
|
|
94
|
+
this._sendStream.release(/* releaseTracks */ false);
|
|
95
|
+
|
|
88
96
|
// Close RTCPeerConnection.
|
|
89
97
|
if (this._pc)
|
|
90
98
|
{
|
|
@@ -181,6 +189,13 @@ export class ReactNative extends HandlerInterface
|
|
|
181
189
|
video : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)
|
|
182
190
|
};
|
|
183
191
|
|
|
192
|
+
if (dtlsParameters.role && dtlsParameters.role !== 'auto')
|
|
193
|
+
{
|
|
194
|
+
this._forcedLocalDtlsRole = dtlsParameters.role === 'server'
|
|
195
|
+
? 'client'
|
|
196
|
+
: 'server';
|
|
197
|
+
}
|
|
198
|
+
|
|
184
199
|
this._pc = new (RTCPeerConnection as any)(
|
|
185
200
|
{
|
|
186
201
|
iceServers : iceServers || [],
|
|
@@ -315,7 +330,13 @@ export class ReactNative extends HandlerInterface
|
|
|
315
330
|
ortc.reduceCodecs(sendingRemoteRtpParameters.codecs);
|
|
316
331
|
|
|
317
332
|
if (!this._transportReady)
|
|
318
|
-
|
|
333
|
+
{
|
|
334
|
+
await this._setupTransport(
|
|
335
|
+
{
|
|
336
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
|
|
337
|
+
localSdpObject
|
|
338
|
+
});
|
|
339
|
+
}
|
|
319
340
|
|
|
320
341
|
if (track.kind === 'video' && encodings && encodings.length > 1)
|
|
321
342
|
{
|
|
@@ -528,7 +549,13 @@ export class ReactNative extends HandlerInterface
|
|
|
528
549
|
.find((m: any) => m.type === 'application');
|
|
529
550
|
|
|
530
551
|
if (!this._transportReady)
|
|
531
|
-
|
|
552
|
+
{
|
|
553
|
+
await this._setupTransport(
|
|
554
|
+
{
|
|
555
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
|
|
556
|
+
localSdpObject
|
|
557
|
+
});
|
|
558
|
+
}
|
|
532
559
|
|
|
533
560
|
logger.debug(
|
|
534
561
|
'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',
|
|
@@ -614,7 +641,13 @@ export class ReactNative extends HandlerInterface
|
|
|
614
641
|
answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
|
|
615
642
|
|
|
616
643
|
if (!this._transportReady)
|
|
617
|
-
|
|
644
|
+
{
|
|
645
|
+
await this._setupTransport(
|
|
646
|
+
{
|
|
647
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
648
|
+
localSdpObject
|
|
649
|
+
});
|
|
650
|
+
}
|
|
618
651
|
|
|
619
652
|
logger.debug(
|
|
620
653
|
'receive() | calling pc.setLocalDescription() [answer:%o]',
|
|
@@ -666,6 +699,20 @@ export class ReactNative extends HandlerInterface
|
|
|
666
699
|
await this._pc.setLocalDescription(answer);
|
|
667
700
|
}
|
|
668
701
|
|
|
702
|
+
async pauseReceiving(
|
|
703
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
704
|
+
localId: string): Promise<void>
|
|
705
|
+
{
|
|
706
|
+
// Unimplemented.
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
async resumeReceiving(
|
|
710
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
711
|
+
localId: string): Promise<void>
|
|
712
|
+
{
|
|
713
|
+
// Unimplemented.
|
|
714
|
+
}
|
|
715
|
+
|
|
669
716
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
670
717
|
async getReceiverStats(localId: string): Promise<RTCStatsReport>
|
|
671
718
|
{
|
|
@@ -720,7 +767,11 @@ export class ReactNative extends HandlerInterface
|
|
|
720
767
|
{
|
|
721
768
|
const localSdpObject = sdpTransform.parse(answer.sdp);
|
|
722
769
|
|
|
723
|
-
await this._setupTransport(
|
|
770
|
+
await this._setupTransport(
|
|
771
|
+
{
|
|
772
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
773
|
+
localSdpObject
|
|
774
|
+
});
|
|
724
775
|
}
|
|
725
776
|
|
|
726
777
|
logger.debug(
|
package/src/handlers/Safari11.ts
CHANGED
|
@@ -37,6 +37,9 @@ export class Safari11 extends HandlerInterface
|
|
|
37
37
|
// Generic sending RTP parameters for audio and video suitable for the SDP
|
|
38
38
|
// remote answer.
|
|
39
39
|
private _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };
|
|
40
|
+
// Initial server side DTLS role. If not 'auto', it will force the opposite
|
|
41
|
+
// value in client side.
|
|
42
|
+
private _forcedLocalDtlsRole?: DtlsRole;
|
|
40
43
|
// RTCPeerConnection instance.
|
|
41
44
|
private _pc: any;
|
|
42
45
|
// Local stream for sending.
|
|
@@ -182,6 +185,13 @@ export class Safari11 extends HandlerInterface
|
|
|
182
185
|
video : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)
|
|
183
186
|
};
|
|
184
187
|
|
|
188
|
+
if (dtlsParameters.role && dtlsParameters.role !== 'auto')
|
|
189
|
+
{
|
|
190
|
+
this._forcedLocalDtlsRole = dtlsParameters.role === 'server'
|
|
191
|
+
? 'client'
|
|
192
|
+
: 'server';
|
|
193
|
+
}
|
|
194
|
+
|
|
185
195
|
this._pc = new (RTCPeerConnection as any)(
|
|
186
196
|
{
|
|
187
197
|
iceServers : iceServers || [],
|
|
@@ -315,7 +325,13 @@ export class Safari11 extends HandlerInterface
|
|
|
315
325
|
ortc.reduceCodecs(sendingRemoteRtpParameters.codecs);
|
|
316
326
|
|
|
317
327
|
if (!this._transportReady)
|
|
318
|
-
|
|
328
|
+
{
|
|
329
|
+
await this._setupTransport(
|
|
330
|
+
{
|
|
331
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
|
|
332
|
+
localSdpObject
|
|
333
|
+
});
|
|
334
|
+
}
|
|
319
335
|
|
|
320
336
|
if (track.kind === 'video' && encodings && encodings.length > 1)
|
|
321
337
|
{
|
|
@@ -596,7 +612,13 @@ export class Safari11 extends HandlerInterface
|
|
|
596
612
|
.find((m: any) => m.type === 'application');
|
|
597
613
|
|
|
598
614
|
if (!this._transportReady)
|
|
599
|
-
|
|
615
|
+
{
|
|
616
|
+
await this._setupTransport(
|
|
617
|
+
{
|
|
618
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
|
|
619
|
+
localSdpObject
|
|
620
|
+
});
|
|
621
|
+
}
|
|
600
622
|
|
|
601
623
|
logger.debug(
|
|
602
624
|
'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',
|
|
@@ -672,7 +694,13 @@ export class Safari11 extends HandlerInterface
|
|
|
672
694
|
answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
|
|
673
695
|
|
|
674
696
|
if (!this._transportReady)
|
|
675
|
-
|
|
697
|
+
{
|
|
698
|
+
await this._setupTransport(
|
|
699
|
+
{
|
|
700
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
701
|
+
localSdpObject
|
|
702
|
+
});
|
|
703
|
+
}
|
|
676
704
|
|
|
677
705
|
logger.debug(
|
|
678
706
|
'receive() | calling pc.setLocalDescription() [answer:%o]',
|
|
@@ -739,6 +767,20 @@ export class Safari11 extends HandlerInterface
|
|
|
739
767
|
return rtpReceiver.getStats();
|
|
740
768
|
}
|
|
741
769
|
|
|
770
|
+
async pauseReceiving(
|
|
771
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
772
|
+
localId: string): Promise<void>
|
|
773
|
+
{
|
|
774
|
+
// Unimplemented.
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
async resumeReceiving(
|
|
778
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
779
|
+
localId: string): Promise<void>
|
|
780
|
+
{
|
|
781
|
+
// Unimplemented.
|
|
782
|
+
}
|
|
783
|
+
|
|
742
784
|
async receiveDataChannel(
|
|
743
785
|
{ sctpStreamParameters, label, protocol }: HandlerReceiveDataChannelOptions
|
|
744
786
|
): Promise<HandlerReceiveDataChannelResult>
|
|
@@ -786,7 +828,11 @@ export class Safari11 extends HandlerInterface
|
|
|
786
828
|
{
|
|
787
829
|
const localSdpObject = sdpTransform.parse(answer.sdp);
|
|
788
830
|
|
|
789
|
-
await this._setupTransport(
|
|
831
|
+
await this._setupTransport(
|
|
832
|
+
{
|
|
833
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
834
|
+
localSdpObject
|
|
835
|
+
});
|
|
790
836
|
}
|
|
791
837
|
|
|
792
838
|
logger.debug(
|
package/src/handlers/Safari12.ts
CHANGED
|
@@ -37,6 +37,9 @@ export class Safari12 extends HandlerInterface
|
|
|
37
37
|
// Generic sending RTP parameters for audio and video suitable for the SDP
|
|
38
38
|
// remote answer.
|
|
39
39
|
private _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };
|
|
40
|
+
// Initial server side DTLS role. If not 'auto', it will force the opposite
|
|
41
|
+
// value in client side.
|
|
42
|
+
private _forcedLocalDtlsRole?: DtlsRole;
|
|
40
43
|
// RTCPeerConnection instance.
|
|
41
44
|
private _pc: any;
|
|
42
45
|
// Map of RTCTransceivers indexed by MID.
|
|
@@ -166,6 +169,13 @@ export class Safari12 extends HandlerInterface
|
|
|
166
169
|
video : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)
|
|
167
170
|
};
|
|
168
171
|
|
|
172
|
+
if (dtlsParameters.role && dtlsParameters.role !== 'auto')
|
|
173
|
+
{
|
|
174
|
+
this._forcedLocalDtlsRole = dtlsParameters.role === 'server'
|
|
175
|
+
? 'client'
|
|
176
|
+
: 'server';
|
|
177
|
+
}
|
|
178
|
+
|
|
169
179
|
this._pc = new (RTCPeerConnection as any)(
|
|
170
180
|
{
|
|
171
181
|
iceServers : iceServers || [],
|
|
@@ -295,7 +305,13 @@ export class Safari12 extends HandlerInterface
|
|
|
295
305
|
let offerMediaObject;
|
|
296
306
|
|
|
297
307
|
if (!this._transportReady)
|
|
298
|
-
|
|
308
|
+
{
|
|
309
|
+
await this._setupTransport(
|
|
310
|
+
{
|
|
311
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
|
|
312
|
+
localSdpObject
|
|
313
|
+
});
|
|
314
|
+
}
|
|
299
315
|
|
|
300
316
|
if (encodings && encodings.length > 1)
|
|
301
317
|
{
|
|
@@ -419,6 +435,8 @@ export class Safari12 extends HandlerInterface
|
|
|
419
435
|
answer);
|
|
420
436
|
|
|
421
437
|
await this._pc.setRemoteDescription(answer);
|
|
438
|
+
|
|
439
|
+
this._mapMidTransceiver.delete(localId);
|
|
422
440
|
}
|
|
423
441
|
|
|
424
442
|
async replaceTrack(
|
|
@@ -546,7 +564,13 @@ export class Safari12 extends HandlerInterface
|
|
|
546
564
|
.find((m: any) => m.type === 'application');
|
|
547
565
|
|
|
548
566
|
if (!this._transportReady)
|
|
549
|
-
|
|
567
|
+
{
|
|
568
|
+
await this._setupTransport(
|
|
569
|
+
{
|
|
570
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
|
|
571
|
+
localSdpObject
|
|
572
|
+
});
|
|
573
|
+
}
|
|
550
574
|
|
|
551
575
|
logger.debug(
|
|
552
576
|
'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',
|
|
@@ -621,7 +645,13 @@ export class Safari12 extends HandlerInterface
|
|
|
621
645
|
answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
|
|
622
646
|
|
|
623
647
|
if (!this._transportReady)
|
|
624
|
-
|
|
648
|
+
{
|
|
649
|
+
await this._setupTransport(
|
|
650
|
+
{
|
|
651
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
652
|
+
localSdpObject
|
|
653
|
+
});
|
|
654
|
+
}
|
|
625
655
|
|
|
626
656
|
logger.debug(
|
|
627
657
|
'receive() | calling pc.setLocalDescription() [answer:%o]',
|
|
@@ -673,6 +703,68 @@ export class Safari12 extends HandlerInterface
|
|
|
673
703
|
answer);
|
|
674
704
|
|
|
675
705
|
await this._pc.setLocalDescription(answer);
|
|
706
|
+
|
|
707
|
+
this._mapMidTransceiver.delete(localId);
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
async pauseReceiving(localId: string): Promise<void>
|
|
711
|
+
{
|
|
712
|
+
this._assertRecvDirection();
|
|
713
|
+
|
|
714
|
+
logger.debug('pauseReceiving() [localId:%s]', localId);
|
|
715
|
+
|
|
716
|
+
const transceiver = this._mapMidTransceiver.get(localId);
|
|
717
|
+
|
|
718
|
+
if (!transceiver)
|
|
719
|
+
throw new Error('associated RTCRtpTransceiver not found');
|
|
720
|
+
|
|
721
|
+
transceiver.direction = 'inactive';
|
|
722
|
+
|
|
723
|
+
const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
|
|
724
|
+
|
|
725
|
+
logger.debug(
|
|
726
|
+
'pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]',
|
|
727
|
+
offer);
|
|
728
|
+
|
|
729
|
+
await this._pc.setRemoteDescription(offer);
|
|
730
|
+
|
|
731
|
+
const answer = await this._pc.createAnswer();
|
|
732
|
+
|
|
733
|
+
logger.debug(
|
|
734
|
+
'pauseReceiving() | calling pc.setLocalDescription() [answer:%o]',
|
|
735
|
+
answer);
|
|
736
|
+
|
|
737
|
+
await this._pc.setLocalDescription(answer);
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
async resumeReceiving(localId: string): Promise<void>
|
|
741
|
+
{
|
|
742
|
+
this._assertRecvDirection();
|
|
743
|
+
|
|
744
|
+
logger.debug('resumeReceiving() [localId:%s]', localId);
|
|
745
|
+
|
|
746
|
+
const transceiver = this._mapMidTransceiver.get(localId);
|
|
747
|
+
|
|
748
|
+
if (!transceiver)
|
|
749
|
+
throw new Error('associated RTCRtpTransceiver not found');
|
|
750
|
+
|
|
751
|
+
transceiver.direction = 'recvonly';
|
|
752
|
+
|
|
753
|
+
const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
|
|
754
|
+
|
|
755
|
+
logger.debug(
|
|
756
|
+
'resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]',
|
|
757
|
+
offer);
|
|
758
|
+
|
|
759
|
+
await this._pc.setRemoteDescription(offer);
|
|
760
|
+
|
|
761
|
+
const answer = await this._pc.createAnswer();
|
|
762
|
+
|
|
763
|
+
logger.debug(
|
|
764
|
+
'resumeReceiving() | calling pc.setLocalDescription() [answer:%o]',
|
|
765
|
+
answer);
|
|
766
|
+
|
|
767
|
+
await this._pc.setLocalDescription(answer);
|
|
676
768
|
}
|
|
677
769
|
|
|
678
770
|
async getReceiverStats(localId: string): Promise<RTCStatsReport>
|
|
@@ -734,7 +826,11 @@ export class Safari12 extends HandlerInterface
|
|
|
734
826
|
{
|
|
735
827
|
const localSdpObject = sdpTransform.parse(answer.sdp);
|
|
736
828
|
|
|
737
|
-
await this._setupTransport(
|
|
829
|
+
await this._setupTransport(
|
|
830
|
+
{
|
|
831
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
832
|
+
localSdpObject
|
|
833
|
+
});
|
|
738
834
|
}
|
|
739
835
|
|
|
740
836
|
logger.debug(
|