mediasoup-client 3.6.47 → 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 (52) hide show
  1. package/lib/Transport.d.ts +3 -0
  2. package/lib/Transport.d.ts.map +1 -1
  3. package/lib/Transport.js +110 -39
  4. package/lib/handlers/Chrome55.d.ts +1 -1
  5. package/lib/handlers/Chrome55.d.ts.map +1 -1
  6. package/lib/handlers/Chrome55.js +42 -28
  7. package/lib/handlers/Chrome67.d.ts +1 -1
  8. package/lib/handlers/Chrome67.d.ts.map +1 -1
  9. package/lib/handlers/Chrome67.js +45 -30
  10. package/lib/handlers/Chrome70.d.ts +1 -1
  11. package/lib/handlers/Chrome70.d.ts.map +1 -1
  12. package/lib/handlers/Chrome70.js +42 -29
  13. package/lib/handlers/Chrome74.d.ts +1 -1
  14. package/lib/handlers/Chrome74.d.ts.map +1 -1
  15. package/lib/handlers/Chrome74.js +45 -29
  16. package/lib/handlers/Edge11.d.ts +1 -1
  17. package/lib/handlers/Edge11.d.ts.map +1 -1
  18. package/lib/handlers/Edge11.js +28 -20
  19. package/lib/handlers/FakeHandler.d.ts +1 -1
  20. package/lib/handlers/FakeHandler.d.ts.map +1 -1
  21. package/lib/handlers/FakeHandler.js +13 -10
  22. package/lib/handlers/Firefox60.d.ts +1 -1
  23. package/lib/handlers/Firefox60.d.ts.map +1 -1
  24. package/lib/handlers/Firefox60.js +45 -30
  25. package/lib/handlers/HandlerInterface.d.ts +1 -1
  26. package/lib/handlers/HandlerInterface.d.ts.map +1 -1
  27. package/lib/handlers/ReactNative.d.ts +1 -1
  28. package/lib/handlers/ReactNative.d.ts.map +1 -1
  29. package/lib/handlers/ReactNative.js +48 -34
  30. package/lib/handlers/Safari11.d.ts +1 -1
  31. package/lib/handlers/Safari11.d.ts.map +1 -1
  32. package/lib/handlers/Safari11.js +43 -30
  33. package/lib/handlers/Safari12.d.ts +1 -1
  34. package/lib/handlers/Safari12.d.ts.map +1 -1
  35. package/lib/handlers/Safari12.js +42 -29
  36. package/lib/index.d.ts +1 -1
  37. package/lib/index.js +1 -1
  38. package/lib/ortc.js +0 -2
  39. package/package.json +10 -10
  40. package/src/Transport.ts +162 -58
  41. package/src/handlers/Chrome55.ts +52 -31
  42. package/src/handlers/Chrome67.ts +54 -33
  43. package/src/handlers/Chrome70.ts +52 -32
  44. package/src/handlers/Chrome74.ts +56 -32
  45. package/src/handlers/Edge11.ts +39 -25
  46. package/src/handlers/FakeHandler.ts +18 -10
  47. package/src/handlers/Firefox60.ts +54 -33
  48. package/src/handlers/HandlerInterface.ts +2 -2
  49. package/src/handlers/ReactNative.ts +59 -38
  50. package/src/handlers/Safari11.ts +54 -33
  51. package/src/handlers/Safari12.ts +52 -32
  52. package/src/ortc.ts +0 -2
@@ -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>
@@ -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