mediasoup-client 3.6.52 → 3.6.55

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 (85) hide show
  1. package/.vimrc +21 -0
  2. package/NO_GIT/Notes.txt +18 -0
  3. package/lib/Consumer.d.ts +16 -18
  4. package/lib/Consumer.d.ts.map +1 -1
  5. package/lib/Consumer.js +11 -17
  6. package/lib/DataConsumer.d.ts +13 -15
  7. package/lib/DataConsumer.d.ts.map +1 -1
  8. package/lib/DataConsumer.js +0 -13
  9. package/lib/DataProducer.d.ts +13 -15
  10. package/lib/DataProducer.d.ts.map +1 -1
  11. package/lib/DataProducer.js +0 -13
  12. package/lib/Device.d.ts +4 -6
  13. package/lib/Device.d.ts.map +1 -1
  14. package/lib/Device.js +1 -10
  15. package/lib/EnhancedEventEmitter.d.ts +19 -3
  16. package/lib/EnhancedEventEmitter.d.ts.map +1 -1
  17. package/lib/EnhancedEventEmitter.js +50 -14
  18. package/lib/Producer.d.ts +37 -22
  19. package/lib/Producer.d.ts.map +1 -1
  20. package/lib/Producer.js +18 -28
  21. package/lib/Transport.d.ts +43 -18
  22. package/lib/Transport.d.ts.map +1 -1
  23. package/lib/Transport.js +87 -41
  24. package/lib/handlers/Chrome55.d.ts +3 -1
  25. package/lib/handlers/Chrome55.d.ts.map +1 -1
  26. package/lib/handlers/Chrome55.js +20 -12
  27. package/lib/handlers/Chrome67.d.ts +3 -1
  28. package/lib/handlers/Chrome67.d.ts.map +1 -1
  29. package/lib/handlers/Chrome67.js +20 -12
  30. package/lib/handlers/Chrome70.d.ts +3 -1
  31. package/lib/handlers/Chrome70.d.ts.map +1 -1
  32. package/lib/handlers/Chrome70.js +23 -13
  33. package/lib/handlers/Chrome74.d.ts +3 -1
  34. package/lib/handlers/Chrome74.d.ts.map +1 -1
  35. package/lib/handlers/Chrome74.js +43 -13
  36. package/lib/handlers/Edge11.d.ts +3 -1
  37. package/lib/handlers/Edge11.d.ts.map +1 -1
  38. package/lib/handlers/Edge11.js +26 -18
  39. package/lib/handlers/FakeHandler.d.ts +5 -3
  40. package/lib/handlers/FakeHandler.d.ts.map +1 -1
  41. package/lib/handlers/FakeHandler.js +14 -8
  42. package/lib/handlers/Firefox60.d.ts +3 -1
  43. package/lib/handlers/Firefox60.d.ts.map +1 -1
  44. package/lib/handlers/Firefox60.js +45 -13
  45. package/lib/handlers/HandlerInterface.d.ts +15 -11
  46. package/lib/handlers/HandlerInterface.d.ts.map +1 -1
  47. package/lib/handlers/HandlerInterface.js +0 -8
  48. package/lib/handlers/ReactNative.d.ts +3 -1
  49. package/lib/handlers/ReactNative.d.ts.map +1 -1
  50. package/lib/handlers/ReactNative.js +20 -12
  51. package/lib/handlers/Safari11.d.ts +3 -1
  52. package/lib/handlers/Safari11.d.ts.map +1 -1
  53. package/lib/handlers/Safari11.js +20 -12
  54. package/lib/handlers/Safari12.d.ts +3 -1
  55. package/lib/handlers/Safari12.d.ts.map +1 -1
  56. package/lib/handlers/Safari12.js +45 -13
  57. package/lib/handlers/ortc/edgeUtils.js +1 -5
  58. package/lib/handlers/sdp/MediaSection.js +1 -5
  59. package/lib/handlers/sdp/RemoteSdp.js +1 -5
  60. package/lib/handlers/sdp/commonUtils.js +1 -5
  61. package/lib/index.d.ts +1 -1
  62. package/lib/index.js +2 -6
  63. package/lib/ortc.js +1 -5
  64. package/lib/types.js +1 -5
  65. package/lib/utils.d.ts.map +1 -1
  66. package/package.json +7 -7
  67. package/src/Consumer.ts +44 -20
  68. package/src/DataConsumer.ts +19 -16
  69. package/src/DataProducer.ts +19 -16
  70. package/src/Device.ts +6 -6
  71. package/src/EnhancedEventEmitter.ts +105 -22
  72. package/src/Producer.ts +97 -31
  73. package/src/Transport.ts +185 -58
  74. package/src/handlers/Chrome55.ts +31 -8
  75. package/src/handlers/Chrome67.ts +31 -8
  76. package/src/handlers/Chrome70.ts +34 -8
  77. package/src/handlers/Chrome74.ts +82 -8
  78. package/src/handlers/Edge11.ts +38 -15
  79. package/src/handlers/FakeHandler.ts +22 -6
  80. package/src/handlers/Firefox60.ts +84 -8
  81. package/src/handlers/HandlerInterface.ts +19 -11
  82. package/src/handlers/ReactNative.ts +31 -8
  83. package/src/handlers/Safari11.ts +31 -8
  84. package/src/handlers/Safari12.ts +84 -8
  85. package/src/utils.ts +0 -1
package/src/Transport.ts CHANGED
@@ -9,7 +9,10 @@ import { Producer, ProducerOptions } from './Producer';
9
9
  import { Consumer, ConsumerOptions } from './Consumer';
10
10
  import { DataProducer, DataProducerOptions } from './DataProducer';
11
11
  import { DataConsumer, DataConsumerOptions } from './DataConsumer';
12
- import { SctpParameters } from './SctpParameters';
12
+ import { RtpParameters, MediaKind } from './RtpParameters';
13
+ import { SctpParameters, SctpStreamParameters } from './SctpParameters';
14
+
15
+ const logger = new Logger('Transport');
13
16
 
14
17
  interface InternalTransportOptions extends TransportOptions
15
18
  {
@@ -29,7 +32,7 @@ class ConsumerCreationTask
29
32
  constructor(consumerOptions: ConsumerOptions)
30
33
  {
31
34
  this.consumerOptions = consumerOptions;
32
- this.promise = new Promise((resolve, reject) =>
35
+ this.promise = new Promise<Consumer>((resolve, reject) =>
33
36
  {
34
37
  this.resolve = resolve;
35
38
  this.reject = reject;
@@ -148,9 +151,43 @@ export type PlainRtpParameters =
148
151
  port: number;
149
152
  };
150
153
 
151
- const logger = new Logger('Transport');
154
+ export type TransportEvents =
155
+ {
156
+ connect: [{ dtlsParameters: DtlsParameters }, () => void, (error: Error) => void];
157
+ connectionstatechange: [ConnectionState];
158
+ produce:
159
+ [
160
+ {
161
+ kind: MediaKind;
162
+ rtpParameters: RtpParameters;
163
+ appData: Record<string, unknown>;
164
+ },
165
+ ({ id }: { id: string }) => void,
166
+ (error: Error) => void
167
+ ];
168
+ producedata:
169
+ [
170
+ {
171
+ sctpStreamParameters: SctpStreamParameters;
172
+ label?: string;
173
+ protocol?: string;
174
+ appData: Record<string, unknown>;
175
+ },
176
+ ({ id }: { id: string }) => void,
177
+ (error: Error) => void
178
+ ];
179
+ };
152
180
 
153
- export class Transport extends EnhancedEventEmitter
181
+ export type TransportObserverEvents =
182
+ {
183
+ close: [];
184
+ newproducer: [Producer];
185
+ newconsumer: [Consumer];
186
+ newdataproducer: [DataProducer];
187
+ newdataconsumer: [DataConsumer];
188
+ };
189
+
190
+ export class Transport extends EnhancedEventEmitter<TransportEvents>
154
191
  {
155
192
  // Id.
156
193
  private readonly _id: string;
@@ -195,15 +232,13 @@ export class Transport extends EnhancedEventEmitter
195
232
  private _pendingResumeConsumers: Map<string, Consumer> = new Map();
196
233
  // Consumer resume in progress flag.
197
234
  private _consumerResumeInProgress = false;
235
+ // Consumers pending to be closed.
236
+ private _pendingCloseConsumers: Map<string, Consumer> = new Map();
237
+ // Consumer close in progress flag.
238
+ private _consumerCloseInProgress = false;
198
239
  // Observer instance.
199
- protected readonly _observer = new EnhancedEventEmitter();
240
+ protected readonly _observer = new EnhancedEventEmitter<TransportObserverEvents>();
200
241
 
201
- /**
202
- * @emits connect - (transportLocalParameters: any, callback: Function, errback: Function)
203
- * @emits connectionstatechange - (connectionState: ConnectionState)
204
- * @emits produce - (producerLocalParameters: any, callback: Function, errback: Function)
205
- * @emits producedata - (dataProducerLocalParameters: any, callback: Function, errback: Function)
206
- */
207
242
  constructor(
208
243
  {
209
244
  direction,
@@ -321,15 +356,6 @@ export class Transport extends EnhancedEventEmitter
321
356
  throw new Error('cannot override appData object');
322
357
  }
323
358
 
324
- /**
325
- * Observer.
326
- *
327
- * @emits close
328
- * @emits newproducer - (producer: Producer)
329
- * @emits newconsumer - (producer: Producer)
330
- * @emits newdataproducer - (dataProducer: DataProducer)
331
- * @emits newdataconsumer - (dataProducer: DataProducer)
332
- */
333
359
  get observer(): EnhancedEventEmitter
334
360
  {
335
361
  return this._observer;
@@ -530,13 +556,19 @@ export class Transport extends EnhancedEventEmitter
530
556
  // This will fill rtpParameters's missing fields with default values.
531
557
  ortc.validateRtpParameters(rtpParameters);
532
558
 
533
- const { id } = await this.safeEmitAsPromise(
534
- 'produce',
535
- {
536
- kind : track.kind,
537
- rtpParameters,
538
- appData
539
- });
559
+ const { id } = await new Promise<{ id: string }>((resolve, reject) =>
560
+ {
561
+ this.safeEmit(
562
+ 'produce',
563
+ {
564
+ kind : track.kind as MediaKind,
565
+ rtpParameters,
566
+ appData
567
+ },
568
+ resolve,
569
+ reject
570
+ );
571
+ });
540
572
 
541
573
  const producer = new Producer(
542
574
  {
@@ -692,14 +724,20 @@ export class Transport extends EnhancedEventEmitter
692
724
  // This will fill sctpStreamParameters's missing fields with default values.
693
725
  ortc.validateSctpStreamParameters(sctpStreamParameters);
694
726
 
695
- const { id } = await this.safeEmitAsPromise(
696
- 'producedata',
697
- {
698
- sctpStreamParameters,
699
- label,
700
- protocol,
701
- appData
702
- });
727
+ const { id } = await new Promise<{ id: string }>((resolve, reject) =>
728
+ {
729
+ this.safeEmit(
730
+ 'producedata',
731
+ {
732
+ sctpStreamParameters,
733
+ label,
734
+ protocol,
735
+ appData
736
+ },
737
+ resolve,
738
+ reject
739
+ );
740
+ });
703
741
 
704
742
  const dataProducer =
705
743
  new DataProducer({ id, dataChannel, sctpStreamParameters, appData });
@@ -787,10 +825,17 @@ export class Transport extends EnhancedEventEmitter
787
825
  // This method is guaranteed to never throw.
788
826
  async _createPendingConsumers(): Promise<void>
789
827
  {
828
+ this._consumerCreationInProgress = true;
829
+
790
830
  this._awaitQueue.push(
791
831
  async () =>
792
832
  {
793
- this._consumerCreationInProgress = true;
833
+ if (this._pendingConsumerTasks.length === 0)
834
+ {
835
+ logger.debug('_createPendingConsumers() | there is no Consumer to be created');
836
+
837
+ return;
838
+ }
794
839
 
795
840
  const pendingConsumerTasks = [ ...this._pendingConsumerTasks ];
796
841
 
@@ -885,12 +930,12 @@ export class Transport extends EnhancedEventEmitter
885
930
  error);
886
931
  }
887
932
  }
888
-
889
- this._consumerCreationInProgress = false;
890
933
  },
891
934
  'transport._createPendingConsumers()')
892
935
  .then(() =>
893
936
  {
937
+ this._consumerCreationInProgress = false;
938
+
894
939
  // There are pending Consumer tasks, enqueue their creation.
895
940
  if (this._pendingConsumerTasks.length > 0)
896
941
  {
@@ -903,10 +948,17 @@ export class Transport extends EnhancedEventEmitter
903
948
 
904
949
  _pausePendingConsumers()
905
950
  {
951
+ this._consumerPauseInProgress = true;
952
+
906
953
  this._awaitQueue.push(
907
954
  async () =>
908
955
  {
909
- this._consumerPauseInProgress = true;
956
+ if (this._pendingPauseConsumers.size === 0)
957
+ {
958
+ logger.debug('_pausePendingConsumers() | there is no Consumer to be paused');
959
+
960
+ return;
961
+ }
910
962
 
911
963
  const pendingPauseConsumers = Array.from(this._pendingPauseConsumers.values());
912
964
 
@@ -915,20 +967,21 @@ export class Transport extends EnhancedEventEmitter
915
967
 
916
968
  try
917
969
  {
918
- await this._handler.pauseReceiving(
919
- pendingPauseConsumers.map((consumer) => consumer.localId)
920
- );
970
+ const localIds = pendingPauseConsumers
971
+ .map((consumer) => consumer.localId);
972
+
973
+ await this._handler.pauseReceiving(localIds);
921
974
  }
922
975
  catch (error)
923
976
  {
924
977
  logger.error('_pausePendingConsumers() | failed to pause Consumers:', error);
925
978
  }
926
-
927
- this._consumerPauseInProgress = false;
928
979
  },
929
- 'consumer @pause event')
980
+ 'transport._pausePendingConsumers')
930
981
  .then(() =>
931
982
  {
983
+ this._consumerPauseInProgress = false;
984
+
932
985
  // There are pending Consumers to be paused, do it.
933
986
  if (this._pendingPauseConsumers.size > 0)
934
987
  {
@@ -941,10 +994,17 @@ export class Transport extends EnhancedEventEmitter
941
994
 
942
995
  _resumePendingConsumers()
943
996
  {
997
+ this._consumerResumeInProgress = true;
998
+
944
999
  this._awaitQueue.push(
945
1000
  async () =>
946
1001
  {
947
- this._consumerResumeInProgress = true;
1002
+ if (this._pendingResumeConsumers.size === 0)
1003
+ {
1004
+ logger.debug('_resumePendingConsumers() | there is no Consumer to be resumed');
1005
+
1006
+ return;
1007
+ }
948
1008
 
949
1009
  const pendingResumeConsumers = Array.from(this._pendingResumeConsumers.values());
950
1010
 
@@ -953,16 +1013,17 @@ export class Transport extends EnhancedEventEmitter
953
1013
 
954
1014
  try
955
1015
  {
956
- await this._handler.resumeReceiving(
957
- pendingResumeConsumers.map((consumer) => consumer.localId)
958
- );
1016
+ const localIds = pendingResumeConsumers
1017
+ .map((consumer) => consumer.localId);
1018
+
1019
+ await this._handler.resumeReceiving(localIds);
959
1020
  }
960
1021
  catch (error)
961
1022
  {
962
1023
  logger.error('_resumePendingConsumers() | failed to resume Consumers:', error);
963
1024
  }
964
1025
  },
965
- 'consumer @resume event')
1026
+ 'transport._resumePendingConsumers')
966
1027
  .then(() =>
967
1028
  {
968
1029
  this._consumerResumeInProgress = false;
@@ -977,14 +1038,58 @@ export class Transport extends EnhancedEventEmitter
977
1038
  .catch(() => { });
978
1039
  }
979
1040
 
1041
+ _closePendingConsumers()
1042
+ {
1043
+ this._consumerCloseInProgress = true;
1044
+
1045
+ this._awaitQueue.push(
1046
+ async () =>
1047
+ {
1048
+ if (this._pendingCloseConsumers.size === 0)
1049
+ {
1050
+ logger.debug('_closePendingConsumers() | there is no Consumer to be closed');
1051
+
1052
+ return;
1053
+ }
1054
+
1055
+ const pendingCloseConsumers = Array.from(this._pendingCloseConsumers.values());
1056
+
1057
+ // Clear pending close Consumer map.
1058
+ this._pendingCloseConsumers.clear();
1059
+
1060
+ try
1061
+ {
1062
+ await this._handler.stopReceiving(
1063
+ pendingCloseConsumers.map((consumer) => consumer.localId)
1064
+ );
1065
+ }
1066
+ catch (error)
1067
+ {
1068
+ logger.error('_closePendingConsumers() | failed to close Consumers:', error);
1069
+ }
1070
+ },
1071
+ 'transport._closePendingConsumers')
1072
+ .then(() =>
1073
+ {
1074
+ this._consumerCloseInProgress = false;
1075
+
1076
+ // There are pending Consumer to be resumed, do it.
1077
+ if (this._pendingCloseConsumers.size > 0)
1078
+ {
1079
+ this._closePendingConsumers();
1080
+ }
1081
+ })
1082
+ // NOTE: We only get here when the await queue is closed.
1083
+ .catch(() => { });
1084
+ }
980
1085
  _handleHandler(): void
981
1086
  {
982
1087
  const handler = this._handler;
983
1088
 
984
1089
  handler.on('@connect', (
985
1090
  { dtlsParameters }: { dtlsParameters: DtlsParameters },
986
- callback: Function,
987
- errback: Function
1091
+ callback: () => void,
1092
+ errback: (error: Error) => void
988
1093
  ) =>
989
1094
  {
990
1095
  if (this._closed)
@@ -1026,6 +1131,24 @@ export class Transport extends EnhancedEventEmitter
1026
1131
  .catch((error: Error) => logger.warn('producer.close() failed:%o', error));
1027
1132
  });
1028
1133
 
1134
+ producer.on('@pause', (callback, errback) =>
1135
+ {
1136
+ this._awaitQueue.push(
1137
+ async () => this._handler.pauseSending(producer.localId),
1138
+ 'producer @pause event')
1139
+ .then(callback)
1140
+ .catch(errback);
1141
+ });
1142
+
1143
+ producer.on('@resume', (callback, errback) =>
1144
+ {
1145
+ this._awaitQueue.push(
1146
+ async () => this._handler.resumeSending(producer.localId),
1147
+ 'producer @resume event')
1148
+ .then(callback)
1149
+ .catch(errback);
1150
+ });
1151
+
1029
1152
  producer.on('@replacetrack', (track, callback, errback) =>
1030
1153
  {
1031
1154
  this._awaitQueue.push(
@@ -1058,7 +1181,7 @@ export class Transport extends EnhancedEventEmitter
1058
1181
  producer.on('@getstats', (callback, errback) =>
1059
1182
  {
1060
1183
  if (this._closed)
1061
- return errback(new InvalidStateError('closed'));
1184
+ return errback!(new InvalidStateError('closed'));
1062
1185
 
1063
1186
  this._handler.getSenderStats(producer.localId)
1064
1187
  .then(callback)
@@ -1077,10 +1200,14 @@ export class Transport extends EnhancedEventEmitter
1077
1200
  if (this._closed)
1078
1201
  return;
1079
1202
 
1080
- this._awaitQueue.push(
1081
- async () => this._handler.stopReceiving(consumer.localId),
1082
- 'consumer @close event')
1083
- .catch(() => {});
1203
+ // Store the Consumer into the close list.
1204
+ this._pendingCloseConsumers.set(consumer.id, consumer);
1205
+
1206
+ // There is no Consumer close in progress, do it now.
1207
+ if (this._consumerCloseInProgress === false)
1208
+ {
1209
+ this._closePendingConsumers();
1210
+ }
1084
1211
  });
1085
1212
 
1086
1213
  consumer.on('@pause', () =>
@@ -1122,7 +1249,7 @@ export class Transport extends EnhancedEventEmitter
1122
1249
  consumer.on('@getstats', (callback, errback) =>
1123
1250
  {
1124
1251
  if (this._closed)
1125
- return errback(new InvalidStateError('closed'));
1252
+ return errback!(new InvalidStateError('closed'));
1126
1253
 
1127
1254
  this._handler.getReceiverStats(consumer.localId)
1128
1255
  .then(callback)
@@ -474,6 +474,18 @@ export class Chrome55 extends HandlerInterface
474
474
  await this._pc.setRemoteDescription(answer);
475
475
  }
476
476
 
477
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
478
+ async pauseSending(localId: string): Promise<void>
479
+ {
480
+ // Unimplemented.
481
+ }
482
+
483
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
484
+ async resumeSending(localId: string): Promise<void>
485
+ {
486
+ // Unimplemented.
487
+ }
488
+
477
489
  async replaceTrack(
478
490
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
479
491
  localId: string, track: MediaStreamTrack | null
@@ -672,19 +684,22 @@ export class Chrome55 extends HandlerInterface
672
684
  return results;
673
685
  }
674
686
 
675
- async stopReceiving(localId: string): Promise<void>
687
+ async stopReceiving(localIds: string[]): Promise<void>
676
688
  {
677
689
  this._assertRecvDirection();
678
690
 
679
- logger.debug('stopReceiving() [localId:%s]', localId);
691
+ for (const localId of localIds)
692
+ {
693
+ logger.debug('stopReceiving() [localId:%s]', localId);
680
694
 
681
- const { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) || {};
695
+ const { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) || {};
682
696
 
683
- // Remove from the map.
684
- this._mapRecvLocalIdInfo.delete(localId);
697
+ // Remove from the map.
698
+ this._mapRecvLocalIdInfo.delete(localId);
685
699
 
686
- this._remoteSdp!.planBStopReceiving(
687
- { mid: mid!, offerRtpParameters: rtpParameters! });
700
+ this._remoteSdp!.planBStopReceiving(
701
+ { mid: mid!, offerRtpParameters: rtpParameters! });
702
+ }
688
703
 
689
704
  const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
690
705
 
@@ -816,7 +831,15 @@ export class Chrome55 extends HandlerInterface
816
831
  localDtlsRole === 'client' ? 'server' : 'client');
817
832
 
818
833
  // Need to tell the remote transport about our parameters.
819
- await this.safeEmitAsPromise('@connect', { dtlsParameters });
834
+ await new Promise<void>((resolve, reject) =>
835
+ {
836
+ this.safeEmit(
837
+ '@connect',
838
+ { dtlsParameters },
839
+ resolve,
840
+ reject
841
+ );
842
+ });
820
843
 
821
844
  this._transportReady = true;
822
845
  }
@@ -482,6 +482,18 @@ export class Chrome67 extends HandlerInterface
482
482
  await this._pc.setRemoteDescription(answer);
483
483
  }
484
484
 
485
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
486
+ async pauseSending(localId: string): Promise<void>
487
+ {
488
+ // Unimplemented.
489
+ }
490
+
491
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
492
+ async resumeSending(localId: string): Promise<void>
493
+ {
494
+ // Unimplemented.
495
+ }
496
+
485
497
  async replaceTrack(
486
498
  localId: string, track: MediaStreamTrack | null
487
499
  ): Promise<void>
@@ -751,19 +763,22 @@ export class Chrome67 extends HandlerInterface
751
763
  return results;
752
764
  }
753
765
 
754
- async stopReceiving(localId: string): Promise<void>
766
+ async stopReceiving(localIds: string[]): Promise<void>
755
767
  {
756
768
  this._assertRecvDirection();
757
769
 
758
- logger.debug('stopReceiving() [localId:%s]', localId);
770
+ for (const localId of localIds)
771
+ {
772
+ logger.debug('stopReceiving() [localId:%s]', localId);
759
773
 
760
- const { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) || {};
774
+ const { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) || {};
761
775
 
762
- // Remove from the map.
763
- this._mapRecvLocalIdInfo.delete(localId);
776
+ // Remove from the map.
777
+ this._mapRecvLocalIdInfo.delete(localId);
764
778
 
765
- this._remoteSdp!.planBStopReceiving(
766
- { mid: mid!, offerRtpParameters: rtpParameters! });
779
+ this._remoteSdp!.planBStopReceiving(
780
+ { mid: mid!, offerRtpParameters: rtpParameters! });
781
+ }
767
782
 
768
783
  const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
769
784
 
@@ -901,7 +916,15 @@ export class Chrome67 extends HandlerInterface
901
916
  localDtlsRole === 'client' ? 'server' : 'client');
902
917
 
903
918
  // Need to tell the remote transport about our parameters.
904
- await this.safeEmitAsPromise('@connect', { dtlsParameters });
919
+ await new Promise<void>((resolve, reject) =>
920
+ {
921
+ this.safeEmit(
922
+ '@connect',
923
+ { dtlsParameters },
924
+ resolve,
925
+ reject
926
+ );
927
+ });
905
928
 
906
929
  this._transportReady = true;
907
930
  }
@@ -498,6 +498,18 @@ export class Chrome70 extends HandlerInterface
498
498
  this._mapMidTransceiver.delete(localId);
499
499
  }
500
500
 
501
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
502
+ async pauseSending(localId: string): Promise<void>
503
+ {
504
+ // Unimplemented.
505
+ }
506
+
507
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
508
+ async resumeSending(localId: string): Promise<void>
509
+ {
510
+ // Unimplemented.
511
+ }
512
+
501
513
  async replaceTrack(
502
514
  localId: string, track: MediaStreamTrack | null
503
515
  ): Promise<void>
@@ -758,18 +770,21 @@ export class Chrome70 extends HandlerInterface
758
770
  return results;
759
771
  }
760
772
 
761
- async stopReceiving(localId: string): Promise<void>
773
+ async stopReceiving(localIds: string[]): Promise<void>
762
774
  {
763
775
  this._assertRecvDirection();
764
776
 
765
- logger.debug('stopReceiving() [localId:%s]', localId);
777
+ for (const localId of localIds)
778
+ {
779
+ logger.debug('stopReceiving() [localId:%s]', localId);
766
780
 
767
- const transceiver = this._mapMidTransceiver.get(localId);
781
+ const transceiver = this._mapMidTransceiver.get(localId);
768
782
 
769
- if (!transceiver)
770
- throw new Error('associated RTCRtpTransceiver not found');
783
+ if (!transceiver)
784
+ throw new Error('associated RTCRtpTransceiver not found');
771
785
 
772
- this._remoteSdp!.closeMediaSection(transceiver.mid!);
786
+ this._remoteSdp!.closeMediaSection(transceiver.mid!);
787
+ }
773
788
 
774
789
  const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
775
790
 
@@ -787,7 +802,10 @@ export class Chrome70 extends HandlerInterface
787
802
 
788
803
  await this._pc.setLocalDescription(answer);
789
804
 
790
- this._mapMidTransceiver.delete(localId);
805
+ for (const localId of localIds)
806
+ {
807
+ this._mapMidTransceiver.delete(localId);
808
+ }
791
809
  }
792
810
 
793
811
  async pauseReceiving(
@@ -909,7 +927,15 @@ export class Chrome70 extends HandlerInterface
909
927
  localDtlsRole === 'client' ? 'server' : 'client');
910
928
 
911
929
  // Need to tell the remote transport about our parameters.
912
- await this.safeEmitAsPromise('@connect', { dtlsParameters });
930
+ await new Promise<void>((resolve, reject) =>
931
+ {
932
+ this.safeEmit(
933
+ '@connect',
934
+ { dtlsParameters },
935
+ resolve,
936
+ reject
937
+ );
938
+ });
913
939
 
914
940
  this._transportReady = true;
915
941
  }