mediasoup-client 3.6.44 → 3.6.48

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.
Files changed (65) hide show
  1. package/lib/DataConsumer.d.ts +2 -2
  2. package/lib/DataConsumer.d.ts.map +1 -1
  3. package/lib/Device.d.ts.map +1 -1
  4. package/lib/Device.js +7 -3
  5. package/lib/Logger.js +6 -6
  6. package/lib/Transport.d.ts +3 -0
  7. package/lib/Transport.d.ts.map +1 -1
  8. package/lib/Transport.js +111 -40
  9. package/lib/handlers/Chrome55.d.ts +1 -1
  10. package/lib/handlers/Chrome55.d.ts.map +1 -1
  11. package/lib/handlers/Chrome55.js +53 -32
  12. package/lib/handlers/Chrome67.d.ts +1 -1
  13. package/lib/handlers/Chrome67.d.ts.map +1 -1
  14. package/lib/handlers/Chrome67.js +57 -35
  15. package/lib/handlers/Chrome70.d.ts +1 -1
  16. package/lib/handlers/Chrome70.d.ts.map +1 -1
  17. package/lib/handlers/Chrome70.js +55 -35
  18. package/lib/handlers/Chrome74.d.ts +1 -1
  19. package/lib/handlers/Chrome74.d.ts.map +1 -1
  20. package/lib/handlers/Chrome74.js +58 -35
  21. package/lib/handlers/Edge11.d.ts +1 -1
  22. package/lib/handlers/Edge11.d.ts.map +1 -1
  23. package/lib/handlers/Edge11.js +31 -22
  24. package/lib/handlers/FakeHandler.d.ts +1 -1
  25. package/lib/handlers/FakeHandler.d.ts.map +1 -1
  26. package/lib/handlers/FakeHandler.js +14 -11
  27. package/lib/handlers/Firefox60.d.ts +1 -1
  28. package/lib/handlers/Firefox60.d.ts.map +1 -1
  29. package/lib/handlers/Firefox60.js +54 -33
  30. package/lib/handlers/HandlerInterface.d.ts +1 -1
  31. package/lib/handlers/HandlerInterface.d.ts.map +1 -1
  32. package/lib/handlers/ReactNative.d.ts +1 -1
  33. package/lib/handlers/ReactNative.d.ts.map +1 -1
  34. package/lib/handlers/ReactNative.js +59 -38
  35. package/lib/handlers/Safari11.d.ts +1 -1
  36. package/lib/handlers/Safari11.d.ts.map +1 -1
  37. package/lib/handlers/Safari11.js +54 -35
  38. package/lib/handlers/Safari12.d.ts +1 -1
  39. package/lib/handlers/Safari12.d.ts.map +1 -1
  40. package/lib/handlers/Safari12.js +53 -34
  41. package/lib/handlers/ortc/edgeUtils.js +1 -1
  42. package/lib/handlers/sdp/MediaSection.js +1 -1
  43. package/lib/handlers/sdp/RemoteSdp.js +1 -1
  44. package/lib/handlers/sdp/commonUtils.js +1 -1
  45. package/lib/index.d.ts +1 -1
  46. package/lib/index.js +3 -3
  47. package/lib/ortc.js +5 -7
  48. package/lib/types.js +1 -1
  49. package/package.json +11 -11
  50. package/src/DataConsumer.ts +2 -2
  51. package/src/Device.ts +7 -2
  52. package/src/Transport.ts +162 -58
  53. package/src/handlers/Chrome55.ts +55 -34
  54. package/src/handlers/Chrome67.ts +57 -36
  55. package/src/handlers/Chrome70.ts +54 -34
  56. package/src/handlers/Chrome74.ts +58 -34
  57. package/src/handlers/Edge11.ts +42 -26
  58. package/src/handlers/FakeHandler.ts +18 -10
  59. package/src/handlers/Firefox60.ts +54 -33
  60. package/src/handlers/HandlerInterface.ts +2 -2
  61. package/src/handlers/ReactNative.ts +62 -41
  62. package/src/handlers/Safari11.ts +57 -36
  63. package/src/handlers/Safari12.ts +54 -34
  64. package/src/ortc.ts +6 -8
  65. package/tsconfig.json +1 -1
@@ -324,21 +324,29 @@ export class FakeHandler extends HandlerInterface
324
324
  }
325
325
 
326
326
  async receive(
327
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
328
- { trackId, kind, rtpParameters }: HandlerReceiveOptions
329
- ): Promise<HandlerReceiveResult>
327
+ optionsList: HandlerReceiveOptions[]
328
+ ) : Promise<HandlerReceiveResult[]>
330
329
  {
331
- if (!this._transportReady)
332
- await this._setupTransport({ localDtlsRole: 'client' });
330
+ const results: HandlerReceiveResult[] = [];
333
331
 
334
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
332
+ for (const options of optionsList)
333
+ {
334
+ const { trackId, kind } = options;
335
335
 
336
- const localId = this._nextLocalId++;
337
- const track = new FakeMediaStreamTrack({ kind });
336
+ if (!this._transportReady)
337
+ await this._setupTransport({ localDtlsRole: 'client' });
338
338
 
339
- this._tracks.set(localId, track);
339
+ logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
340
+
341
+ const localId = this._nextLocalId++;
342
+ const track = new FakeMediaStreamTrack({ kind });
343
+
344
+ this._tracks.set(localId, track);
345
+
346
+ results.push({ localId: String(localId), track });
347
+ }
340
348
 
341
- return { localId: String(localId), track };
349
+ return results;
342
350
  }
343
351
 
344
352
  async stopReceiving(localId: string): Promise<void>
@@ -643,23 +643,31 @@ export class Firefox60 extends HandlerInterface
643
643
  }
644
644
 
645
645
  async receive(
646
- { trackId, kind, rtpParameters }: HandlerReceiveOptions
647
- ): Promise<HandlerReceiveResult>
646
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
647
+ optionsList: HandlerReceiveOptions[]
648
+ ) : Promise<HandlerReceiveResult[]>
648
649
  {
649
650
  this._assertRecvDirection();
650
651
 
651
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
652
+ const results: HandlerReceiveResult[] = [];
652
653
 
653
- const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
654
+ for (const options of optionsList)
655
+ {
656
+ const { trackId, kind, rtpParameters } = options;
654
657
 
655
- this._remoteSdp!.receive(
656
- {
657
- mid : localId,
658
- kind,
659
- offerRtpParameters : rtpParameters,
660
- streamId : rtpParameters.rtcp!.cname!,
661
- trackId
662
- });
658
+ logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
659
+
660
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
661
+
662
+ this._remoteSdp!.receive(
663
+ {
664
+ mid : localId,
665
+ kind,
666
+ offerRtpParameters : rtpParameters,
667
+ streamId : rtpParameters.rtcp!.cname!,
668
+ trackId
669
+ });
670
+ }
663
671
 
664
672
  const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
665
673
 
@@ -671,18 +679,24 @@ export class Firefox60 extends HandlerInterface
671
679
 
672
680
  let answer = await this._pc.createAnswer();
673
681
  const localSdpObject = sdpTransform.parse(answer.sdp);
674
- const answerMediaObject = localSdpObject.media
675
- .find((m: any) => String(m.mid) === localId);
676
682
 
677
- // May need to modify codec parameters in the answer based on codec
678
- // parameters in the offer.
679
- sdpCommonUtils.applyCodecParameters(
680
- {
681
- offerRtpParameters : rtpParameters,
682
- answerMediaObject
683
- });
683
+ for (const options of optionsList)
684
+ {
685
+ const { rtpParameters } = options;
686
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
687
+ const answerMediaObject = localSdpObject.media
688
+ .find((m: any) => String(m.mid) === localId);
689
+
690
+ // May need to modify codec parameters in the answer based on codec
691
+ // parameters in the offer.
692
+ sdpCommonUtils.applyCodecParameters(
693
+ {
694
+ offerRtpParameters : rtpParameters,
695
+ answerMediaObject
696
+ });
684
697
 
685
- answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
698
+ answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
699
+ }
686
700
 
687
701
  if (!this._transportReady)
688
702
  await this._setupTransport({ localDtlsRole: 'client', localSdpObject });
@@ -693,20 +707,27 @@ export class Firefox60 extends HandlerInterface
693
707
 
694
708
  await this._pc.setLocalDescription(answer);
695
709
 
696
- const transceiver = this._pc.getTransceivers()
697
- .find((t: RTCRtpTransceiver) => t.mid === localId);
710
+ for (const options of optionsList)
711
+ {
712
+ const { rtpParameters } = options;
713
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
714
+ const transceiver = this._pc.getTransceivers()
715
+ .find((t: RTCRtpTransceiver) => t.mid === localId);
698
716
 
699
- if (!transceiver)
700
- throw new Error('new RTCRtpTransceiver not found');
717
+ if (!transceiver)
718
+ throw new Error('new RTCRtpTransceiver not found');
701
719
 
702
- // Store in the map.
703
- this._mapMidTransceiver.set(localId, transceiver);
720
+ // Store in the map.
721
+ this._mapMidTransceiver.set(localId, transceiver);
704
722
 
705
- return {
706
- localId,
707
- track : transceiver.receiver.track,
708
- rtpReceiver : transceiver.receiver
709
- };
723
+ results.push({
724
+ localId,
725
+ track : transceiver.receiver.track,
726
+ rtpReceiver : transceiver.receiver
727
+ });
728
+ }
729
+
730
+ return results;
710
731
  }
711
732
 
712
733
  async stopReceiving(localId: string): Promise<void>
@@ -136,8 +136,8 @@ export abstract class HandlerInterface extends EnhancedEventEmitter
136
136
  ): Promise<HandlerSendDataChannelResult>;
137
137
 
138
138
  abstract receive(
139
- options: HandlerReceiveOptions
140
- ): Promise<HandlerReceiveResult>;
139
+ optionsList: HandlerReceiveOptions[]
140
+ ) : Promise<HandlerReceiveResult[]>
141
141
 
142
142
  abstract stopReceiving(localId: string): Promise<void>;
143
143
 
@@ -333,7 +333,7 @@ export class ReactNative extends HandlerInterface
333
333
  {
334
334
  await this._setupTransport(
335
335
  {
336
- localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
336
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
337
337
  localSdpObject
338
338
  });
339
339
  }
@@ -462,7 +462,7 @@ export class ReactNative extends HandlerInterface
462
462
  {
463
463
  logger.warn(
464
464
  'stopSending() | ignoring expected error due no sending tracks: %s',
465
- error.toString());
465
+ (error as Error).toString());
466
466
 
467
467
  return;
468
468
  }
@@ -552,7 +552,7 @@ export class ReactNative extends HandlerInterface
552
552
  {
553
553
  await this._setupTransport(
554
554
  {
555
- localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
555
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
556
556
  localSdpObject
557
557
  });
558
558
  }
@@ -588,34 +588,40 @@ export class ReactNative extends HandlerInterface
588
588
  }
589
589
 
590
590
  async receive(
591
- { trackId, kind, rtpParameters }: HandlerReceiveOptions
592
- ): Promise<HandlerReceiveResult>
591
+ optionsList: HandlerReceiveOptions[]
592
+ ) : Promise<HandlerReceiveResult[]>
593
593
  {
594
594
  this._assertRecvDirection();
595
595
 
596
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
596
+ const results: HandlerReceiveResult[] = [];
597
597
 
598
- const localId = trackId;
599
- const mid = kind;
600
- let streamId = rtpParameters.rtcp!.cname!;
598
+ for (const options of optionsList)
599
+ {
600
+ const { trackId, kind, rtpParameters } = options;
601
601
 
602
- // NOTE: In React-Native we cannot reuse the same remote MediaStream for new
603
- // remote tracks. This is because react-native-webrtc does not react on new
604
- // tracks generated within already existing streams, so force the streamId
605
- // to be different.
606
- logger.debug(
607
- 'receive() | forcing a random remote streamId to avoid well known bug in react-native-webrtc');
602
+ logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
608
603
 
609
- streamId += `-hack-${utils.generateRandomNumber()}`;
604
+ const mid = kind;
605
+ let streamId = rtpParameters.rtcp!.cname!;
610
606
 
611
- this._remoteSdp!.receive(
612
- {
613
- mid,
614
- kind,
615
- offerRtpParameters : rtpParameters,
616
- streamId,
617
- trackId
618
- });
607
+ // NOTE: In React-Native we cannot reuse the same remote MediaStream for new
608
+ // remote tracks. This is because react-native-webrtc does not react on new
609
+ // tracks generated within already existing streams, so force the streamId
610
+ // to be different.
611
+ logger.debug(
612
+ 'receive() | forcing a random remote streamId to avoid well known bug in react-native-webrtc');
613
+
614
+ streamId += `-hack-${utils.generateRandomNumber()}`;
615
+
616
+ this._remoteSdp!.receive(
617
+ {
618
+ mid,
619
+ kind,
620
+ offerRtpParameters : rtpParameters,
621
+ streamId,
622
+ trackId
623
+ });
624
+ }
619
625
 
620
626
  const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
621
627
 
@@ -627,16 +633,22 @@ export class ReactNative extends HandlerInterface
627
633
 
628
634
  let answer = await this._pc.createAnswer();
629
635
  const localSdpObject = sdpTransform.parse(answer.sdp);
630
- const answerMediaObject = localSdpObject.media
631
- .find((m: any) => String(m.mid) === mid);
632
636
 
633
- // May need to modify codec parameters in the answer based on codec
634
- // parameters in the offer.
635
- sdpCommonUtils.applyCodecParameters(
636
- {
637
- offerRtpParameters : rtpParameters,
638
- answerMediaObject
639
- });
637
+ for (const options of optionsList)
638
+ {
639
+ const { kind, rtpParameters } = options;
640
+ const mid = kind;
641
+ const answerMediaObject = localSdpObject.media
642
+ .find((m: any) => String(m.mid) === mid);
643
+
644
+ // May need to modify codec parameters in the answer based on codec
645
+ // parameters in the offer.
646
+ sdpCommonUtils.applyCodecParameters(
647
+ {
648
+ offerRtpParameters : rtpParameters,
649
+ answerMediaObject
650
+ });
651
+ }
640
652
 
641
653
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
642
654
 
@@ -655,17 +667,26 @@ export class ReactNative extends HandlerInterface
655
667
 
656
668
  await this._pc.setLocalDescription(answer);
657
669
 
658
- const stream = this._pc.getRemoteStreams()
659
- .find((s: MediaStream) => s.id === streamId);
660
- const track = stream.getTrackById(localId);
670
+ for (const options of optionsList)
671
+ {
672
+ const { kind, trackId, rtpParameters } = options;
673
+ const localId = trackId;
674
+ const mid = kind;
675
+ const streamId = rtpParameters.rtcp!.cname!;
676
+ const stream = this._pc.getRemoteStreams()
677
+ .find((s: MediaStream) => s.id === streamId);
678
+ const track = stream.getTrackById(localId);
661
679
 
662
- if (!track)
663
- throw new Error('remote track not found');
680
+ if (!track)
681
+ throw new Error('remote track not found');
664
682
 
665
- // Insert into the map.
666
- this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters });
683
+ // Insert into the map.
684
+ this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters });
685
+
686
+ results.push({ localId, track });
687
+ }
667
688
 
668
- return { localId, track };
689
+ return results;
669
690
  }
670
691
 
671
692
  async stopReceiving(localId: string): Promise<void>
@@ -328,7 +328,7 @@ export class Safari11 extends HandlerInterface
328
328
  {
329
329
  await this._setupTransport(
330
330
  {
331
- localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
331
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
332
332
  localSdpObject
333
333
  });
334
334
  }
@@ -457,7 +457,7 @@ export class Safari11 extends HandlerInterface
457
457
  {
458
458
  logger.warn(
459
459
  'stopSending() | ignoring expected error due no sending tracks: %s',
460
- error.toString());
460
+ (error as Error).toString());
461
461
 
462
462
  return;
463
463
  }
@@ -615,7 +615,7 @@ export class Safari11 extends HandlerInterface
615
615
  {
616
616
  await this._setupTransport(
617
617
  {
618
- localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
618
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
619
619
  localSdpObject
620
620
  });
621
621
  }
@@ -651,24 +651,30 @@ export class Safari11 extends HandlerInterface
651
651
  }
652
652
 
653
653
  async receive(
654
- { trackId, kind, rtpParameters }: HandlerReceiveOptions
655
- ): Promise<HandlerReceiveResult>
654
+ optionsList: HandlerReceiveOptions[]
655
+ ) : Promise<HandlerReceiveResult[]>
656
656
  {
657
657
  this._assertRecvDirection();
658
658
 
659
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
659
+ const results: HandlerReceiveResult[] = [];
660
660
 
661
- const localId = trackId;
662
- const mid = kind;
661
+ for (const options of optionsList)
662
+ {
663
+ const { trackId, kind, rtpParameters } = options;
663
664
 
664
- this._remoteSdp!.receive(
665
- {
666
- mid,
667
- kind,
668
- offerRtpParameters : rtpParameters,
669
- streamId : rtpParameters.rtcp!.cname!,
670
- trackId
671
- });
665
+ logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
666
+
667
+ const mid = kind;
668
+
669
+ this._remoteSdp!.receive(
670
+ {
671
+ mid,
672
+ kind,
673
+ offerRtpParameters : rtpParameters,
674
+ streamId : rtpParameters.rtcp!.cname!,
675
+ trackId
676
+ });
677
+ }
672
678
 
673
679
  const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
674
680
 
@@ -680,16 +686,22 @@ export class Safari11 extends HandlerInterface
680
686
 
681
687
  let answer = await this._pc.createAnswer();
682
688
  const localSdpObject = sdpTransform.parse(answer.sdp);
683
- const answerMediaObject = localSdpObject.media
684
- .find((m: any) => String(m.mid) === mid);
685
689
 
686
- // May need to modify codec parameters in the answer based on codec
687
- // parameters in the offer.
688
- sdpCommonUtils.applyCodecParameters(
689
- {
690
- offerRtpParameters : rtpParameters,
691
- answerMediaObject
692
- });
690
+ for (const options of optionsList)
691
+ {
692
+ const { kind, rtpParameters } = options;
693
+ const mid = kind;
694
+ const answerMediaObject = localSdpObject.media
695
+ .find((m: any) => String(m.mid) === mid);
696
+
697
+ // May need to modify codec parameters in the answer based on codec
698
+ // parameters in the offer.
699
+ sdpCommonUtils.applyCodecParameters(
700
+ {
701
+ offerRtpParameters : rtpParameters,
702
+ answerMediaObject
703
+ });
704
+ }
693
705
 
694
706
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
695
707
 
@@ -708,20 +720,29 @@ export class Safari11 extends HandlerInterface
708
720
 
709
721
  await this._pc.setLocalDescription(answer);
710
722
 
711
- const rtpReceiver = this._pc.getReceivers()
712
- .find((r: RTCRtpReceiver) => r.track && r.track.id === localId);
723
+ for (const options of optionsList)
724
+ {
725
+ const { kind, trackId, rtpParameters } = options;
726
+ const mid = kind;
727
+ const localId = trackId;
713
728
 
714
- if (!rtpReceiver)
715
- throw new Error('new RTCRtpReceiver not');
729
+ const rtpReceiver = this._pc.getReceivers()
730
+ .find((r: RTCRtpReceiver) => r.track && r.track.id === localId);
716
731
 
717
- // Insert into the map.
718
- this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters, rtpReceiver });
732
+ if (!rtpReceiver)
733
+ throw new Error('new RTCRtpReceiver not');
719
734
 
720
- return {
721
- localId,
722
- track : rtpReceiver.track,
723
- rtpReceiver
724
- };
735
+ // Insert into the map.
736
+ this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters, rtpReceiver });
737
+
738
+ results.push({
739
+ localId,
740
+ track : rtpReceiver.track,
741
+ rtpReceiver
742
+ });
743
+ }
744
+
745
+ return results;
725
746
  }
726
747
 
727
748
  async stopReceiving(localId: string): Promise<void>
@@ -308,7 +308,7 @@ export class Safari12 extends HandlerInterface
308
308
  {
309
309
  await this._setupTransport(
310
310
  {
311
- localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
311
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
312
312
  localSdpObject
313
313
  });
314
314
  }
@@ -567,7 +567,7 @@ export class Safari12 extends HandlerInterface
567
567
  {
568
568
  await this._setupTransport(
569
569
  {
570
- localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
570
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
571
571
  localSdpObject
572
572
  });
573
573
  }
@@ -603,23 +603,30 @@ export class Safari12 extends HandlerInterface
603
603
  }
604
604
 
605
605
  async receive(
606
- { trackId, kind, rtpParameters }: HandlerReceiveOptions
607
- ): Promise<HandlerReceiveResult>
606
+ optionsList: HandlerReceiveOptions[]
607
+ ) : Promise<HandlerReceiveResult[]>
608
608
  {
609
609
  this._assertRecvDirection();
610
610
 
611
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
611
+ const results: HandlerReceiveResult[] = [];
612
612
 
613
- const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
613
+ for (const options of optionsList)
614
+ {
615
+ const { trackId, kind, rtpParameters } = options;
614
616
 
615
- this._remoteSdp!.receive(
616
- {
617
- mid : localId,
618
- kind,
619
- offerRtpParameters : rtpParameters,
620
- streamId : rtpParameters.rtcp!.cname!,
621
- trackId
622
- });
617
+ logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
618
+
619
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
620
+
621
+ this._remoteSdp!.receive(
622
+ {
623
+ mid : localId,
624
+ kind,
625
+ offerRtpParameters : rtpParameters,
626
+ streamId : rtpParameters.rtcp!.cname!,
627
+ trackId
628
+ });
629
+ }
623
630
 
624
631
  const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
625
632
 
@@ -631,16 +638,22 @@ export class Safari12 extends HandlerInterface
631
638
 
632
639
  let answer = await this._pc.createAnswer();
633
640
  const localSdpObject = sdpTransform.parse(answer.sdp);
634
- const answerMediaObject = localSdpObject.media
635
- .find((m: any) => String(m.mid) === localId);
636
641
 
637
- // May need to modify codec parameters in the answer based on codec
638
- // parameters in the offer.
639
- sdpCommonUtils.applyCodecParameters(
640
- {
641
- offerRtpParameters : rtpParameters,
642
- answerMediaObject
643
- });
642
+ for (const options of optionsList)
643
+ {
644
+ const { rtpParameters } = options;
645
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
646
+ const answerMediaObject = localSdpObject.media
647
+ .find((m: any) => String(m.mid) === localId);
648
+
649
+ // May need to modify codec parameters in the answer based on codec
650
+ // parameters in the offer.
651
+ sdpCommonUtils.applyCodecParameters(
652
+ {
653
+ offerRtpParameters : rtpParameters,
654
+ answerMediaObject
655
+ });
656
+ }
644
657
 
645
658
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
646
659
 
@@ -659,20 +672,27 @@ export class Safari12 extends HandlerInterface
659
672
 
660
673
  await this._pc.setLocalDescription(answer);
661
674
 
662
- const transceiver = this._pc.getTransceivers()
663
- .find((t: RTCRtpTransceiver) => t.mid === localId);
675
+ for (const options of optionsList)
676
+ {
677
+ const { rtpParameters } = options;
678
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
679
+ const transceiver = this._pc.getTransceivers()
680
+ .find((t: RTCRtpTransceiver) => t.mid === localId);
664
681
 
665
- if (!transceiver)
666
- throw new Error('new RTCRtpTransceiver not found');
682
+ if (!transceiver)
683
+ throw new Error('new RTCRtpTransceiver not found');
667
684
 
668
- // Store in the map.
669
- this._mapMidTransceiver.set(localId, transceiver);
685
+ // Store in the map.
686
+ this._mapMidTransceiver.set(localId, transceiver);
670
687
 
671
- return {
672
- localId,
673
- track : transceiver.receiver.track,
674
- rtpReceiver : transceiver.receiver
675
- };
688
+ results.push({
689
+ localId,
690
+ track : transceiver.receiver.track,
691
+ rtpReceiver : transceiver.receiver
692
+ });
693
+ }
694
+
695
+ return results;
676
696
  }
677
697
 
678
698
  async stopReceiving(localId: string): Promise<void>
package/src/ortc.ts CHANGED
@@ -1073,15 +1073,14 @@ function matchCodecs(
1073
1073
  {
1074
1074
  case 'video/h264':
1075
1075
  {
1076
- const aPacketizationMode = aCodec.parameters['packetization-mode'] || 0;
1077
- const bPacketizationMode = bCodec.parameters['packetization-mode'] || 0;
1078
-
1079
- if (aPacketizationMode !== bPacketizationMode)
1080
- return false;
1081
-
1082
- // If strict matching check profile-level-id.
1083
1076
  if (strict)
1084
1077
  {
1078
+ const aPacketizationMode = aCodec.parameters['packetization-mode'] || 0;
1079
+ const bPacketizationMode = bCodec.parameters['packetization-mode'] || 0;
1080
+
1081
+ if (aPacketizationMode !== bPacketizationMode)
1082
+ return false;
1083
+
1085
1084
  if (!h264.isSameProfile(aCodec.parameters, bCodec.parameters))
1086
1085
  return false;
1087
1086
 
@@ -1117,7 +1116,6 @@ function matchCodecs(
1117
1116
 
1118
1117
  case 'video/vp9':
1119
1118
  {
1120
- // If strict matching check profile-id.
1121
1119
  if (strict)
1122
1120
  {
1123
1121
  const aProfileId = aCodec.parameters['profile-id'] || 0;
package/tsconfig.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "compilerOptions":
4
4
  {
5
5
  "lib": [ "es2018", "dom" ],
6
- "target": "es2017",
6
+ "target": "es2018",
7
7
  "module": "commonjs",
8
8
  "moduleResolution": "node",
9
9
  "esModuleInterop": true,