mediasoup-client 3.6.45 → 3.6.49

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 (67) hide show
  1. package/.vimrc +21 -0
  2. package/NO_GIT/Notes.txt +18 -0
  3. package/lib/DataConsumer.d.ts +2 -2
  4. package/lib/DataConsumer.d.ts.map +1 -1
  5. package/lib/Device.d.ts.map +1 -1
  6. package/lib/Device.js +7 -3
  7. package/lib/Logger.js +6 -6
  8. package/lib/Transport.d.ts +3 -0
  9. package/lib/Transport.d.ts.map +1 -1
  10. package/lib/Transport.js +111 -40
  11. package/lib/handlers/Chrome55.d.ts +1 -1
  12. package/lib/handlers/Chrome55.d.ts.map +1 -1
  13. package/lib/handlers/Chrome55.js +51 -30
  14. package/lib/handlers/Chrome67.d.ts +1 -1
  15. package/lib/handlers/Chrome67.d.ts.map +1 -1
  16. package/lib/handlers/Chrome67.js +55 -33
  17. package/lib/handlers/Chrome70.d.ts +1 -1
  18. package/lib/handlers/Chrome70.d.ts.map +1 -1
  19. package/lib/handlers/Chrome70.js +53 -33
  20. package/lib/handlers/Chrome74.d.ts +1 -1
  21. package/lib/handlers/Chrome74.d.ts.map +1 -1
  22. package/lib/handlers/Chrome74.js +56 -33
  23. package/lib/handlers/Edge11.d.ts +1 -1
  24. package/lib/handlers/Edge11.d.ts.map +1 -1
  25. package/lib/handlers/Edge11.js +31 -22
  26. package/lib/handlers/FakeHandler.d.ts +1 -1
  27. package/lib/handlers/FakeHandler.d.ts.map +1 -1
  28. package/lib/handlers/FakeHandler.js +14 -11
  29. package/lib/handlers/Firefox60.d.ts +1 -1
  30. package/lib/handlers/Firefox60.d.ts.map +1 -1
  31. package/lib/handlers/Firefox60.js +54 -33
  32. package/lib/handlers/HandlerInterface.d.ts +1 -1
  33. package/lib/handlers/HandlerInterface.d.ts.map +1 -1
  34. package/lib/handlers/ReactNative.d.ts +1 -1
  35. package/lib/handlers/ReactNative.d.ts.map +1 -1
  36. package/lib/handlers/ReactNative.js +59 -36
  37. package/lib/handlers/Safari11.d.ts +1 -1
  38. package/lib/handlers/Safari11.d.ts.map +1 -1
  39. package/lib/handlers/Safari11.js +52 -33
  40. package/lib/handlers/Safari12.d.ts +1 -1
  41. package/lib/handlers/Safari12.d.ts.map +1 -1
  42. package/lib/handlers/Safari12.js +51 -32
  43. package/lib/handlers/ortc/edgeUtils.js +1 -1
  44. package/lib/handlers/sdp/MediaSection.js +1 -1
  45. package/lib/handlers/sdp/RemoteSdp.js +1 -1
  46. package/lib/handlers/sdp/commonUtils.js +1 -1
  47. package/lib/index.d.ts +1 -1
  48. package/lib/index.js +3 -3
  49. package/lib/ortc.js +5 -7
  50. package/lib/types.js +1 -1
  51. package/package.json +11 -11
  52. package/src/DataConsumer.ts +2 -2
  53. package/src/Device.ts +7 -2
  54. package/src/Transport.ts +162 -58
  55. package/src/handlers/Chrome55.ts +53 -32
  56. package/src/handlers/Chrome67.ts +55 -34
  57. package/src/handlers/Chrome70.ts +52 -32
  58. package/src/handlers/Chrome74.ts +56 -32
  59. package/src/handlers/Edge11.ts +42 -26
  60. package/src/handlers/FakeHandler.ts +18 -10
  61. package/src/handlers/Firefox60.ts +54 -33
  62. package/src/handlers/HandlerInterface.ts +2 -2
  63. package/src/handlers/ReactNative.ts +63 -39
  64. package/src/handlers/Safari11.ts +55 -34
  65. package/src/handlers/Safari12.ts +52 -32
  66. package/src/ortc.ts +6 -8
  67. package/tsconfig.json +1 -1
@@ -454,7 +454,7 @@ export class Chrome55 extends HandlerInterface
454
454
  {
455
455
  logger.warn(
456
456
  'stopSending() | ignoring expected error due no sending tracks: %s',
457
- error.toString());
457
+ (error as Error).toString());
458
458
 
459
459
  return;
460
460
  }
@@ -580,25 +580,31 @@ export class Chrome55 extends HandlerInterface
580
580
  }
581
581
 
582
582
  async receive(
583
- { trackId, kind, rtpParameters }: HandlerReceiveOptions
584
- ): Promise<HandlerReceiveResult>
583
+ optionsList: HandlerReceiveOptions[]
584
+ ) : Promise<HandlerReceiveResult[]>
585
585
  {
586
586
  this._assertRecvDirection();
587
587
 
588
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
588
+ const results: HandlerReceiveResult[] = [];
589
589
 
590
- const localId = trackId;
591
- const mid = kind;
592
- const streamId = rtpParameters.rtcp!.cname!;
590
+ for (const options of optionsList)
591
+ {
592
+ const { trackId, kind, rtpParameters } = options;
593
593
 
594
- this._remoteSdp!.receive(
595
- {
596
- mid,
597
- kind,
598
- offerRtpParameters : rtpParameters,
599
- streamId,
600
- trackId
601
- });
594
+ logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
595
+
596
+ const mid = kind;
597
+ const streamId = rtpParameters.rtcp!.cname!;
598
+
599
+ this._remoteSdp!.receive(
600
+ {
601
+ mid,
602
+ kind,
603
+ offerRtpParameters : rtpParameters,
604
+ streamId,
605
+ trackId
606
+ });
607
+ }
602
608
 
603
609
  const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
604
610
 
@@ -610,16 +616,22 @@ export class Chrome55 extends HandlerInterface
610
616
 
611
617
  let answer = await this._pc.createAnswer();
612
618
  const localSdpObject = sdpTransform.parse(answer.sdp);
613
- const answerMediaObject = localSdpObject.media
614
- .find((m: any) => String(m.mid) === mid);
615
619
 
616
- // May need to modify codec parameters in the answer based on codec
617
- // parameters in the offer.
618
- sdpCommonUtils.applyCodecParameters(
619
- {
620
- offerRtpParameters : rtpParameters,
621
- answerMediaObject
622
- });
620
+ for (const options of optionsList)
621
+ {
622
+ const { kind, rtpParameters } = options;
623
+ const mid = kind;
624
+ const answerMediaObject = localSdpObject.media
625
+ .find((m: any) => String(m.mid) === mid);
626
+
627
+ // May need to modify codec parameters in the answer based on codec
628
+ // parameters in the offer.
629
+ sdpCommonUtils.applyCodecParameters(
630
+ {
631
+ offerRtpParameters : rtpParameters,
632
+ answerMediaObject
633
+ });
634
+ }
623
635
 
624
636
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
625
637
 
@@ -638,17 +650,26 @@ export class Chrome55 extends HandlerInterface
638
650
 
639
651
  await this._pc.setLocalDescription(answer);
640
652
 
641
- const stream = this._pc.getRemoteStreams()
642
- .find((s: any) => s.id === streamId);
643
- const track = stream.getTrackById(localId);
653
+ for (const options of optionsList)
654
+ {
655
+ const { kind, trackId, rtpParameters } = options;
656
+ const mid = kind;
657
+ const localId = trackId;
658
+ const streamId = rtpParameters.rtcp!.cname!;
659
+ const stream = this._pc.getRemoteStreams()
660
+ .find((s: any) => s.id === streamId);
661
+ const track = stream.getTrackById(localId);
644
662
 
645
- if (!track)
646
- throw new Error('remote track not found');
663
+ if (!track)
664
+ throw new Error('remote track not found');
647
665
 
648
- // Insert into the map.
649
- this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters });
666
+ // Insert into the map.
667
+ this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters });
668
+
669
+ results.push({ localId, track });
670
+ }
650
671
 
651
- return { localId, track };
672
+ return results;
652
673
  }
653
674
 
654
675
  async stopReceiving(localId: string): Promise<void>
@@ -462,7 +462,7 @@ export class Chrome67 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
  }
@@ -657,24 +657,31 @@ export class Chrome67 extends HandlerInterface
657
657
  }
658
658
 
659
659
  async receive(
660
- { trackId, kind, rtpParameters }: HandlerReceiveOptions
661
- ): Promise<HandlerReceiveResult>
660
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
661
+ optionsList: HandlerReceiveOptions[]
662
+ ) : Promise<HandlerReceiveResult[]>
662
663
  {
663
664
  this._assertRecvDirection();
664
665
 
665
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
666
+ const results: HandlerReceiveResult[] = [];
666
667
 
667
- const localId = trackId;
668
- const mid = kind;
668
+ for (const options of optionsList)
669
+ {
670
+ const { trackId, kind, rtpParameters } = options;
669
671
 
670
- this._remoteSdp!.receive(
671
- {
672
- mid,
673
- kind,
674
- offerRtpParameters : rtpParameters,
675
- streamId : rtpParameters.rtcp!.cname!,
676
- trackId
677
- });
672
+ logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
673
+
674
+ const mid = kind;
675
+
676
+ this._remoteSdp!.receive(
677
+ {
678
+ mid,
679
+ kind,
680
+ offerRtpParameters : rtpParameters,
681
+ streamId : rtpParameters.rtcp!.cname!,
682
+ trackId
683
+ });
684
+ }
678
685
 
679
686
  const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
680
687
 
@@ -686,16 +693,22 @@ export class Chrome67 extends HandlerInterface
686
693
 
687
694
  let answer = await this._pc.createAnswer();
688
695
  const localSdpObject = sdpTransform.parse(answer.sdp);
689
- const answerMediaObject = localSdpObject.media
690
- .find((m: any) => String(m.mid) === mid);
691
696
 
692
- // May need to modify codec parameters in the answer based on codec
693
- // parameters in the offer.
694
- sdpCommonUtils.applyCodecParameters(
695
- {
696
- offerRtpParameters : rtpParameters,
697
- answerMediaObject
698
- });
697
+ for (const options of optionsList)
698
+ {
699
+ const { kind, rtpParameters } = options;
700
+ const mid = kind;
701
+ const answerMediaObject = localSdpObject.media
702
+ .find((m: any) => String(m.mid) === mid);
703
+
704
+ // May need to modify codec parameters in the answer based on codec
705
+ // parameters in the offer.
706
+ sdpCommonUtils.applyCodecParameters(
707
+ {
708
+ offerRtpParameters : rtpParameters,
709
+ answerMediaObject
710
+ });
711
+ }
699
712
 
700
713
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
701
714
 
@@ -714,20 +727,28 @@ export class Chrome67 extends HandlerInterface
714
727
 
715
728
  await this._pc.setLocalDescription(answer);
716
729
 
717
- const rtpReceiver = this._pc.getReceivers()
718
- .find((r: RTCRtpReceiver) => r.track && r.track.id === localId);
730
+ for (const options of optionsList)
731
+ {
732
+ const { kind, trackId, rtpParameters } = options;
733
+ const localId = trackId;
734
+ const mid = kind;
735
+ const rtpReceiver = this._pc.getReceivers()
736
+ .find((r: RTCRtpReceiver) => r.track && r.track.id === localId);
719
737
 
720
- if (!rtpReceiver)
721
- throw new Error('new RTCRtpReceiver not');
738
+ if (!rtpReceiver)
739
+ throw new Error('new RTCRtpReceiver not');
722
740
 
723
- // Insert into the map.
724
- this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters, rtpReceiver });
741
+ // Insert into the map.
742
+ this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters, rtpReceiver });
725
743
 
726
- return {
727
- localId,
728
- track : rtpReceiver.track,
729
- rtpReceiver
730
- };
744
+ results.push({
745
+ localId,
746
+ track : rtpReceiver.track,
747
+ rtpReceiver
748
+ });
749
+ }
750
+
751
+ return results;
731
752
  }
732
753
 
733
754
  async stopReceiving(localId: string): Promise<void>
@@ -663,23 +663,30 @@ export class Chrome70 extends HandlerInterface
663
663
  }
664
664
 
665
665
  async receive(
666
- { trackId, kind, rtpParameters }: HandlerReceiveOptions
667
- ): Promise<HandlerReceiveResult>
666
+ optionsList: HandlerReceiveOptions[]
667
+ ) : Promise<HandlerReceiveResult[]>
668
668
  {
669
669
  this._assertRecvDirection();
670
670
 
671
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
671
+ const results: HandlerReceiveResult[] = [];
672
672
 
673
- const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
673
+ for (const options of optionsList)
674
+ {
675
+ const { trackId, kind, rtpParameters } = options;
674
676
 
675
- this._remoteSdp!.receive(
676
- {
677
- mid : localId,
678
- kind,
679
- offerRtpParameters : rtpParameters,
680
- streamId : rtpParameters.rtcp!.cname!,
681
- trackId
682
- });
677
+ logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
678
+
679
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
680
+
681
+ this._remoteSdp!.receive(
682
+ {
683
+ mid : localId,
684
+ kind,
685
+ offerRtpParameters : rtpParameters,
686
+ streamId : rtpParameters.rtcp!.cname!,
687
+ trackId
688
+ });
689
+ }
683
690
 
684
691
  const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
685
692
 
@@ -691,16 +698,22 @@ export class Chrome70 extends HandlerInterface
691
698
 
692
699
  let answer = await this._pc.createAnswer();
693
700
  const localSdpObject = sdpTransform.parse(answer.sdp);
694
- const answerMediaObject = localSdpObject.media
695
- .find((m: any) => String(m.mid) === localId);
696
701
 
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
- });
702
+ for (const options of optionsList)
703
+ {
704
+ const { rtpParameters } = options;
705
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
706
+ const answerMediaObject = localSdpObject.media
707
+ .find((m: any) => String(m.mid) === localId);
708
+
709
+ // May need to modify codec parameters in the answer based on codec
710
+ // parameters in the offer.
711
+ sdpCommonUtils.applyCodecParameters(
712
+ {
713
+ offerRtpParameters : rtpParameters,
714
+ answerMediaObject
715
+ });
716
+ }
704
717
 
705
718
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
706
719
 
@@ -719,20 +732,27 @@ export class Chrome70 extends HandlerInterface
719
732
 
720
733
  await this._pc.setLocalDescription(answer);
721
734
 
722
- const transceiver = this._pc.getTransceivers()
723
- .find((t: RTCRtpTransceiver) => t.mid === localId);
735
+ for (const options of optionsList)
736
+ {
737
+ const { rtpParameters } = options;
738
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
739
+ const transceiver = this._pc.getTransceivers()
740
+ .find((t: RTCRtpTransceiver) => t.mid === localId);
724
741
 
725
- if (!transceiver)
726
- throw new Error('new RTCRtpTransceiver not found');
742
+ if (!transceiver)
743
+ throw new Error('new RTCRtpTransceiver not found');
727
744
 
728
- // Store in the map.
729
- this._mapMidTransceiver.set(localId, transceiver);
745
+ // Store in the map.
746
+ this._mapMidTransceiver.set(localId, transceiver);
730
747
 
731
- return {
732
- localId,
733
- track : transceiver.receiver.track,
734
- rtpReceiver : transceiver.receiver
735
- };
748
+ results.push({
749
+ localId,
750
+ track : transceiver.receiver.track,
751
+ rtpReceiver : transceiver.receiver
752
+ });
753
+ }
754
+
755
+ return results;
736
756
  }
737
757
 
738
758
  async stopReceiving(localId: string): Promise<void>
@@ -649,23 +649,30 @@ export class Chrome74 extends HandlerInterface
649
649
  }
650
650
 
651
651
  async receive(
652
- { trackId, kind, rtpParameters }: HandlerReceiveOptions
653
- ): Promise<HandlerReceiveResult>
652
+ optionsList: HandlerReceiveOptions[]
653
+ ) : Promise<HandlerReceiveResult[]>
654
654
  {
655
655
  this._assertRecvDirection();
656
656
 
657
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
657
+ const results: HandlerReceiveResult[] = [];
658
658
 
659
- const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
659
+ for (const options of optionsList)
660
+ {
661
+ const { trackId, kind, rtpParameters } = options;
660
662
 
661
- this._remoteSdp!.receive(
662
- {
663
- mid : localId,
664
- kind,
665
- offerRtpParameters : rtpParameters,
666
- streamId : rtpParameters.rtcp!.cname!,
667
- trackId
668
- });
663
+ logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
664
+
665
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
666
+
667
+ this._remoteSdp!.receive(
668
+ {
669
+ mid : localId,
670
+ kind,
671
+ offerRtpParameters : rtpParameters,
672
+ streamId : rtpParameters.rtcp!.cname!,
673
+ trackId
674
+ });
675
+ }
669
676
 
670
677
  const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
671
678
 
@@ -677,16 +684,22 @@ export class Chrome74 extends HandlerInterface
677
684
 
678
685
  let answer = await this._pc.createAnswer();
679
686
  const localSdpObject = sdpTransform.parse(answer.sdp);
680
- const answerMediaObject = localSdpObject.media
681
- .find((m: any) => String(m.mid) === localId);
682
687
 
683
- // May need to modify codec parameters in the answer based on codec
684
- // parameters in the offer.
685
- sdpCommonUtils.applyCodecParameters(
686
- {
687
- offerRtpParameters : rtpParameters,
688
- answerMediaObject
689
- });
688
+ for (const options of optionsList)
689
+ {
690
+ const { rtpParameters } = options;
691
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
692
+ const answerMediaObject = localSdpObject.media
693
+ .find((m: any) => String(m.mid) === localId);
694
+
695
+ // May need to modify codec parameters in the answer based on codec
696
+ // parameters in the offer.
697
+ sdpCommonUtils.applyCodecParameters(
698
+ {
699
+ offerRtpParameters : rtpParameters,
700
+ answerMediaObject
701
+ });
702
+ }
690
703
 
691
704
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
692
705
 
@@ -705,20 +718,31 @@ export class Chrome74 extends HandlerInterface
705
718
 
706
719
  await this._pc.setLocalDescription(answer);
707
720
 
708
- const transceiver = this._pc.getTransceivers()
709
- .find((t: RTCRtpTransceiver) => t.mid === localId);
721
+ for (const options of optionsList)
722
+ {
723
+ const { rtpParameters } = options;
724
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
725
+ const transceiver = this._pc.getTransceivers()
726
+ .find((t: RTCRtpTransceiver) => t.mid === localId);
710
727
 
711
- if (!transceiver)
712
- throw new Error('new RTCRtpTransceiver not found');
728
+ if (!transceiver)
729
+ {
730
+ throw new Error('new RTCRtpTransceiver not found');
731
+ }
732
+ else
733
+ {
734
+ // Store in the map.
735
+ this._mapMidTransceiver.set(localId, transceiver);
713
736
 
714
- // Store in the map.
715
- this._mapMidTransceiver.set(localId, transceiver);
737
+ results.push({
738
+ localId,
739
+ track : transceiver.receiver.track,
740
+ rtpReceiver : transceiver.receiver
741
+ });
742
+ }
743
+ }
716
744
 
717
- return {
718
- localId,
719
- track : transceiver.receiver.track,
720
- rtpReceiver : transceiver.receiver
721
- };
745
+ return results;
722
746
  }
723
747
 
724
748
  async stopReceiving(localId: string): Promise<void>
@@ -361,44 +361,58 @@ export class Edge11 extends HandlerInterface
361
361
  }
362
362
 
363
363
  async receive(
364
- { trackId, kind, rtpParameters }: HandlerReceiveOptions
365
- ): Promise<HandlerReceiveResult>
364
+ optionsList: HandlerReceiveOptions[]
365
+ ) : Promise<HandlerReceiveResult[]>
366
366
  {
367
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
367
+ const results: HandlerReceiveResult[] = [];
368
+
369
+ for (const options of optionsList)
370
+ {
371
+ const { trackId, kind } = options;
372
+
373
+ logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
374
+ }
368
375
 
369
376
  if (!this._transportReady)
370
377
  await this._setupTransport({ localDtlsRole: 'server' });
371
378
 
372
- logger.debug('receive() | calling new RTCRtpReceiver()');
379
+ for (const options of optionsList)
380
+ {
381
+ const { trackId, kind, rtpParameters } = options;
373
382
 
374
- const rtpReceiver = new (RTCRtpReceiver as any)(this._dtlsTransport, kind);
383
+ logger.debug('receive() | calling new RTCRtpReceiver()');
375
384
 
376
- rtpReceiver.addEventListener('error', (event: any) =>
377
- {
378
- logger.error('rtpReceiver "error" event [event:%o]', event);
379
- });
385
+ const rtpReceiver = new (RTCRtpReceiver as any)(this._dtlsTransport, kind);
380
386
 
381
- // NOTE: Convert our standard RTCRtpParameters into those that Edge
382
- // expects.
383
- const edgeRtpParameters =
384
- edgeUtils.mangleRtpParameters(rtpParameters);
387
+ rtpReceiver.addEventListener('error', (event: any) =>
388
+ {
389
+ logger.error('rtpReceiver "error" event [event:%o]', event);
390
+ });
385
391
 
386
- logger.debug(
387
- 'receive() | calling rtpReceiver.receive() [params:%o]',
388
- edgeRtpParameters);
392
+ // NOTE: Convert our standard RTCRtpParameters into those that Edge
393
+ // expects.
394
+ const edgeRtpParameters =
395
+ edgeUtils.mangleRtpParameters(rtpParameters);
389
396
 
390
- await rtpReceiver.receive(edgeRtpParameters);
397
+ logger.debug(
398
+ 'receive() | calling rtpReceiver.receive() [params:%o]',
399
+ edgeRtpParameters);
391
400
 
392
- const localId = trackId;
401
+ await rtpReceiver.receive(edgeRtpParameters);
393
402
 
394
- // Store it.
395
- this._rtpReceivers.set(localId, rtpReceiver);
403
+ const localId = trackId;
396
404
 
397
- return {
398
- localId,
399
- track : rtpReceiver.track,
400
- rtpReceiver
401
- };
405
+ // Store it.
406
+ this._rtpReceivers.set(localId, rtpReceiver);
407
+
408
+ results.push({
409
+ localId,
410
+ track : rtpReceiver.track,
411
+ rtpReceiver
412
+ });
413
+ }
414
+
415
+ return results;
402
416
  }
403
417
 
404
418
  async stopReceiving(localId: string): Promise<void>
@@ -461,6 +475,7 @@ export class Edge11 extends HandlerInterface
461
475
  { iceServers?: any[]; iceTransportPolicy?: RTCIceTransportPolicy }
462
476
  ): void
463
477
  {
478
+ // @ts-ignore
464
479
  const iceGatherer = new (RTCIceGatherer as any)(
465
480
  {
466
481
  iceServers : iceServers || [],
@@ -480,7 +495,8 @@ export class Edge11 extends HandlerInterface
480
495
  catch (error)
481
496
  {
482
497
  logger.debug(
483
- '_setIceGatherer() | iceGatherer.gather() failed: %s', error.toString());
498
+ '_setIceGatherer() | iceGatherer.gather() failed: %s',
499
+ (error as Error).toString());
484
500
  }
485
501
 
486
502
  this._iceGatherer = iceGatherer;
@@ -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>