mediasoup-client 3.6.46 → 3.6.50

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 (54) hide show
  1. package/.vimrc +21 -0
  2. package/NO_GIT/Notes.txt +18 -0
  3. package/lib/Transport.d.ts +3 -0
  4. package/lib/Transport.d.ts.map +1 -1
  5. package/lib/Transport.js +110 -39
  6. package/lib/handlers/Chrome55.d.ts +1 -1
  7. package/lib/handlers/Chrome55.d.ts.map +1 -1
  8. package/lib/handlers/Chrome55.js +42 -28
  9. package/lib/handlers/Chrome67.d.ts +1 -1
  10. package/lib/handlers/Chrome67.d.ts.map +1 -1
  11. package/lib/handlers/Chrome67.js +45 -30
  12. package/lib/handlers/Chrome70.d.ts +1 -1
  13. package/lib/handlers/Chrome70.d.ts.map +1 -1
  14. package/lib/handlers/Chrome70.js +44 -29
  15. package/lib/handlers/Chrome74.d.ts +1 -1
  16. package/lib/handlers/Chrome74.d.ts.map +1 -1
  17. package/lib/handlers/Chrome74.js +47 -29
  18. package/lib/handlers/Edge11.d.ts +1 -1
  19. package/lib/handlers/Edge11.d.ts.map +1 -1
  20. package/lib/handlers/Edge11.js +28 -20
  21. package/lib/handlers/FakeHandler.d.ts +1 -1
  22. package/lib/handlers/FakeHandler.d.ts.map +1 -1
  23. package/lib/handlers/FakeHandler.js +13 -10
  24. package/lib/handlers/Firefox60.d.ts +1 -1
  25. package/lib/handlers/Firefox60.d.ts.map +1 -1
  26. package/lib/handlers/Firefox60.js +47 -30
  27. package/lib/handlers/HandlerInterface.d.ts +1 -1
  28. package/lib/handlers/HandlerInterface.d.ts.map +1 -1
  29. package/lib/handlers/ReactNative.d.ts +1 -1
  30. package/lib/handlers/ReactNative.d.ts.map +1 -1
  31. package/lib/handlers/ReactNative.js +50 -34
  32. package/lib/handlers/Safari11.d.ts +1 -1
  33. package/lib/handlers/Safari11.d.ts.map +1 -1
  34. package/lib/handlers/Safari11.js +43 -30
  35. package/lib/handlers/Safari12.d.ts +1 -1
  36. package/lib/handlers/Safari12.d.ts.map +1 -1
  37. package/lib/handlers/Safari12.js +44 -29
  38. package/lib/index.d.ts +1 -1
  39. package/lib/index.js +1 -1
  40. package/lib/ortc.js +4 -6
  41. package/package.json +10 -10
  42. package/src/Transport.ts +162 -58
  43. package/src/handlers/Chrome55.ts +52 -31
  44. package/src/handlers/Chrome67.ts +54 -33
  45. package/src/handlers/Chrome70.ts +55 -32
  46. package/src/handlers/Chrome74.ts +59 -32
  47. package/src/handlers/Edge11.ts +39 -25
  48. package/src/handlers/FakeHandler.ts +18 -10
  49. package/src/handlers/Firefox60.ts +57 -33
  50. package/src/handlers/HandlerInterface.ts +2 -2
  51. package/src/handlers/ReactNative.ts +62 -38
  52. package/src/handlers/Safari11.ts +54 -33
  53. package/src/handlers/Safari12.ts +55 -32
  54. package/src/ortc.ts +6 -8
@@ -399,32 +399,39 @@ class Safari11 extends HandlerInterface_1.HandlerInterface {
399
399
  };
400
400
  return { dataChannel, sctpStreamParameters };
401
401
  }
402
- async receive({ trackId, kind, rtpParameters }) {
402
+ async receive(optionsList) {
403
403
  var _a;
404
404
  this._assertRecvDirection();
405
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
406
- const localId = trackId;
407
- const mid = kind;
408
- this._remoteSdp.receive({
409
- mid,
410
- kind,
411
- offerRtpParameters: rtpParameters,
412
- streamId: rtpParameters.rtcp.cname,
413
- trackId
414
- });
405
+ const results = [];
406
+ for (const options of optionsList) {
407
+ const { trackId, kind, rtpParameters } = options;
408
+ logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
409
+ const mid = kind;
410
+ this._remoteSdp.receive({
411
+ mid,
412
+ kind,
413
+ offerRtpParameters: rtpParameters,
414
+ streamId: rtpParameters.rtcp.cname,
415
+ trackId
416
+ });
417
+ }
415
418
  const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() };
416
419
  logger.debug('receive() | calling pc.setRemoteDescription() [offer:%o]', offer);
417
420
  await this._pc.setRemoteDescription(offer);
418
421
  let answer = await this._pc.createAnswer();
419
422
  const localSdpObject = sdpTransform.parse(answer.sdp);
420
- const answerMediaObject = localSdpObject.media
421
- .find((m) => String(m.mid) === mid);
422
- // May need to modify codec parameters in the answer based on codec
423
- // parameters in the offer.
424
- sdpCommonUtils.applyCodecParameters({
425
- offerRtpParameters: rtpParameters,
426
- answerMediaObject
427
- });
423
+ for (const options of optionsList) {
424
+ const { kind, rtpParameters } = options;
425
+ const mid = kind;
426
+ const answerMediaObject = localSdpObject.media
427
+ .find((m) => String(m.mid) === mid);
428
+ // May need to modify codec parameters in the answer based on codec
429
+ // parameters in the offer.
430
+ sdpCommonUtils.applyCodecParameters({
431
+ offerRtpParameters: rtpParameters,
432
+ answerMediaObject
433
+ });
434
+ }
428
435
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
429
436
  if (!this._transportReady) {
430
437
  await this._setupTransport({
@@ -434,17 +441,23 @@ class Safari11 extends HandlerInterface_1.HandlerInterface {
434
441
  }
435
442
  logger.debug('receive() | calling pc.setLocalDescription() [answer:%o]', answer);
436
443
  await this._pc.setLocalDescription(answer);
437
- const rtpReceiver = this._pc.getReceivers()
438
- .find((r) => r.track && r.track.id === localId);
439
- if (!rtpReceiver)
440
- throw new Error('new RTCRtpReceiver not');
441
- // Insert into the map.
442
- this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters, rtpReceiver });
443
- return {
444
- localId,
445
- track: rtpReceiver.track,
446
- rtpReceiver
447
- };
444
+ for (const options of optionsList) {
445
+ const { kind, trackId, rtpParameters } = options;
446
+ const mid = kind;
447
+ const localId = trackId;
448
+ const rtpReceiver = this._pc.getReceivers()
449
+ .find((r) => r.track && r.track.id === localId);
450
+ if (!rtpReceiver)
451
+ throw new Error('new RTCRtpReceiver not');
452
+ // Insert into the map.
453
+ this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters, rtpReceiver });
454
+ results.push({
455
+ localId,
456
+ track: rtpReceiver.track,
457
+ rtpReceiver
458
+ });
459
+ }
460
+ return results;
448
461
  }
449
462
  async stopReceiving(localId) {
450
463
  this._assertRecvDirection();
@@ -34,7 +34,7 @@ export declare class Safari12 extends HandlerInterface {
34
34
  setRtpEncodingParameters(localId: string, params: any): Promise<void>;
35
35
  getSenderStats(localId: string): Promise<RTCStatsReport>;
36
36
  sendDataChannel({ ordered, maxPacketLifeTime, maxRetransmits, label, protocol }: HandlerSendDataChannelOptions): Promise<HandlerSendDataChannelResult>;
37
- receive({ trackId, kind, rtpParameters }: HandlerReceiveOptions): Promise<HandlerReceiveResult>;
37
+ receive(optionsList: HandlerReceiveOptions[]): Promise<HandlerReceiveResult[]>;
38
38
  stopReceiving(localId: string): Promise<void>;
39
39
  pauseReceiving(localId: string): Promise<void>;
40
40
  resumeReceiving(localId: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"Safari12.d.ts","sourceRoot":"","sources":["../../src/handlers/Safari12.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Safari12.d.ts","sourceRoot":"","sources":["../../src/handlers/Safari12.ts"],"names":[],"mappings":"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"}
@@ -372,31 +372,41 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
372
372
  };
373
373
  return { dataChannel, sctpStreamParameters };
374
374
  }
375
- async receive({ trackId, kind, rtpParameters }) {
375
+ async receive(optionsList) {
376
376
  var _a;
377
377
  this._assertRecvDirection();
378
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
379
- const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
380
- this._remoteSdp.receive({
381
- mid: localId,
382
- kind,
383
- offerRtpParameters: rtpParameters,
384
- streamId: rtpParameters.rtcp.cname,
385
- trackId
386
- });
378
+ const results = [];
379
+ const mapLocalId = new Map();
380
+ for (const options of optionsList) {
381
+ const { trackId, kind, rtpParameters } = options;
382
+ logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
383
+ const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
384
+ mapLocalId.set(trackId, localId);
385
+ this._remoteSdp.receive({
386
+ mid: localId,
387
+ kind,
388
+ offerRtpParameters: rtpParameters,
389
+ streamId: rtpParameters.rtcp.cname,
390
+ trackId
391
+ });
392
+ }
387
393
  const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() };
388
394
  logger.debug('receive() | calling pc.setRemoteDescription() [offer:%o]', offer);
389
395
  await this._pc.setRemoteDescription(offer);
390
396
  let answer = await this._pc.createAnswer();
391
397
  const localSdpObject = sdpTransform.parse(answer.sdp);
392
- const answerMediaObject = localSdpObject.media
393
- .find((m) => String(m.mid) === localId);
394
- // May need to modify codec parameters in the answer based on codec
395
- // parameters in the offer.
396
- sdpCommonUtils.applyCodecParameters({
397
- offerRtpParameters: rtpParameters,
398
- answerMediaObject
399
- });
398
+ for (const options of optionsList) {
399
+ const { trackId, rtpParameters } = options;
400
+ const localId = mapLocalId.get(trackId);
401
+ const answerMediaObject = localSdpObject.media
402
+ .find((m) => String(m.mid) === localId);
403
+ // May need to modify codec parameters in the answer based on codec
404
+ // parameters in the offer.
405
+ sdpCommonUtils.applyCodecParameters({
406
+ offerRtpParameters: rtpParameters,
407
+ answerMediaObject
408
+ });
409
+ }
400
410
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
401
411
  if (!this._transportReady) {
402
412
  await this._setupTransport({
@@ -406,17 +416,22 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
406
416
  }
407
417
  logger.debug('receive() | calling pc.setLocalDescription() [answer:%o]', answer);
408
418
  await this._pc.setLocalDescription(answer);
409
- const transceiver = this._pc.getTransceivers()
410
- .find((t) => t.mid === localId);
411
- if (!transceiver)
412
- throw new Error('new RTCRtpTransceiver not found');
413
- // Store in the map.
414
- this._mapMidTransceiver.set(localId, transceiver);
415
- return {
416
- localId,
417
- track: transceiver.receiver.track,
418
- rtpReceiver: transceiver.receiver
419
- };
419
+ for (const options of optionsList) {
420
+ const { trackId } = options;
421
+ const localId = mapLocalId.get(trackId);
422
+ const transceiver = this._pc.getTransceivers()
423
+ .find((t) => t.mid === localId);
424
+ if (!transceiver)
425
+ throw new Error('new RTCRtpTransceiver not found');
426
+ // Store in the map.
427
+ this._mapMidTransceiver.set(localId, transceiver);
428
+ results.push({
429
+ localId,
430
+ track: transceiver.receiver.track,
431
+ rtpReceiver: transceiver.receiver
432
+ });
433
+ }
434
+ return results;
420
435
  }
421
436
  async stopReceiving(localId) {
422
437
  this._assertRecvDirection();
package/lib/index.d.ts CHANGED
@@ -8,7 +8,7 @@ export { types };
8
8
  /**
9
9
  * Expose mediasoup-client version.
10
10
  */
11
- export declare const version = "3.6.46";
11
+ export declare const version = "3.6.50";
12
12
  /**
13
13
  * Expose Device class and detectDevice() helper.
14
14
  */
package/lib/index.js CHANGED
@@ -33,7 +33,7 @@ exports.types = types;
33
33
  /**
34
34
  * Expose mediasoup-client version.
35
35
  */
36
- exports.version = '3.6.46';
36
+ exports.version = '3.6.50';
37
37
  /**
38
38
  * Expose parseScalabilityMode() function.
39
39
  */
package/lib/ortc.js CHANGED
@@ -780,12 +780,11 @@ function matchCodecs(aCodec, bCodec, { strict = false, modify = false } = {}) {
780
780
  switch (aMimeType) {
781
781
  case 'video/h264':
782
782
  {
783
- const aPacketizationMode = aCodec.parameters['packetization-mode'] || 0;
784
- const bPacketizationMode = bCodec.parameters['packetization-mode'] || 0;
785
- if (aPacketizationMode !== bPacketizationMode)
786
- return false;
787
- // If strict matching check profile-level-id.
788
783
  if (strict) {
784
+ const aPacketizationMode = aCodec.parameters['packetization-mode'] || 0;
785
+ const bPacketizationMode = bCodec.parameters['packetization-mode'] || 0;
786
+ if (aPacketizationMode !== bPacketizationMode)
787
+ return false;
789
788
  if (!h264.isSameProfile(aCodec.parameters, bCodec.parameters))
790
789
  return false;
791
790
  let selectedProfileLevelId;
@@ -811,7 +810,6 @@ function matchCodecs(aCodec, bCodec, { strict = false, modify = false } = {}) {
811
810
  }
812
811
  case 'video/vp9':
813
812
  {
814
- // If strict matching check profile-id.
815
813
  if (strict) {
816
814
  const aProfileId = aCodec.parameters['profile-id'] || 0;
817
815
  const bProfileId = bCodec.parameters['profile-id'] || 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mediasoup-client",
3
- "version": "3.6.46",
3
+ "version": "3.6.50",
4
4
  "description": "mediasoup client side JavaScript library",
5
5
  "contributors": [
6
6
  "Iñaki Baz Castillo <ibc@aliax.net> (https://inakibaz.me)",
@@ -39,25 +39,25 @@
39
39
  "@types/events": "^3.0.0",
40
40
  "awaitqueue": "^2.3.3",
41
41
  "bowser": "^2.11.0",
42
- "debug": "^4.3.2",
42
+ "debug": "^4.3.3",
43
43
  "events": "^3.3.0",
44
44
  "fake-mediastreamtrack": "^1.1.6",
45
45
  "h264-profile-level-id": "^1.0.1",
46
46
  "sdp-transform": "^2.14.1",
47
- "supports-color": "^9.1.0"
47
+ "supports-color": "^9.2.1"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/sdp-transform": "^2.4.5",
51
51
  "@types/uuid": "^3.4.9",
52
- "@typescript-eslint/eslint-plugin": "^5.4.0",
53
- "@typescript-eslint/parser": "^5.4.0",
54
- "eslint": "^8.3.0",
55
- "eslint-plugin-jest": "^25.3.0",
56
- "jest": "^27.3.1",
52
+ "@typescript-eslint/eslint-plugin": "^5.9.1",
53
+ "@typescript-eslint/parser": "^5.9.1",
54
+ "eslint": "^8.6.0",
55
+ "eslint-plugin-jest": "^25.3.4",
56
+ "jest": "^27.4.7",
57
57
  "jest-tobetype": "^1.2.3",
58
58
  "open-cli": "^7.0.1",
59
- "tsc-watch": "^4.5.0",
60
- "typescript": "^4.5.2",
59
+ "tsc-watch": "^4.6.0",
60
+ "typescript": "^4.5.4",
61
61
  "uuid": "^3.4.0"
62
62
  }
63
63
  }
package/src/Transport.ts CHANGED
@@ -4,7 +4,7 @@ import { EnhancedEventEmitter } from './EnhancedEventEmitter';
4
4
  import { UnsupportedError, InvalidStateError } from './errors';
5
5
  import * as utils from './utils';
6
6
  import * as ortc from './ortc';
7
- import { HandlerFactory, HandlerInterface } from './handlers/HandlerInterface';
7
+ import { HandlerFactory, HandlerInterface, HandlerReceiveOptions } from './handlers/HandlerInterface';
8
8
  import { Producer, ProducerOptions } from './Producer';
9
9
  import { Consumer, ConsumerOptions } from './Consumer';
10
10
  import { DataProducer, DataProducerOptions } from './DataProducer';
@@ -19,6 +19,24 @@ interface InternalTransportOptions extends TransportOptions
19
19
  canProduceByKind: CanProduceByKind;
20
20
  }
21
21
 
22
+ class ConsumerCreationTask
23
+ {
24
+ consumerOptions: ConsumerOptions;
25
+ promise: Promise<Consumer>;
26
+ resolve?: (consumer: Consumer) => void;
27
+ reject?: (error: Error) => void;
28
+
29
+ constructor(consumerOptions: ConsumerOptions)
30
+ {
31
+ this.consumerOptions = consumerOptions;
32
+ this.promise = new Promise((resolve, reject) =>
33
+ {
34
+ this.resolve = resolve;
35
+ this.reject = reject;
36
+ });
37
+ }
38
+ }
39
+
22
40
  export type TransportOptions =
23
41
  {
24
42
  id: string;
@@ -165,6 +183,10 @@ export class Transport extends EnhancedEventEmitter
165
183
  private _probatorConsumerCreated = false;
166
184
  // AwaitQueue instance to make async tasks happen sequentially.
167
185
  private readonly _awaitQueue = new AwaitQueue({ ClosedErrorClass: InvalidStateError });
186
+ // Consumer creation tasks awaiting to be processed.
187
+ private _pendingConsumerTasks: ConsumerCreationTask[] = [];
188
+ // Consumer creation in progress flag.
189
+ private _consumerCreationInProgress = false;
168
190
  // Observer instance.
169
191
  protected readonly _observer = new EnhancedEventEmitter();
170
192
 
@@ -583,68 +605,33 @@ export class Transport extends EnhancedEventEmitter
583
605
  else if (appData && typeof appData !== 'object')
584
606
  throw new TypeError('if given, appData must be an object');
585
607
 
586
- // Enqueue command.
587
- return this._awaitQueue.push(
588
- async () =>
589
- {
590
- // Ensure the device can consume it.
591
- const canConsume = ortc.canReceive(
592
- rtpParameters, this._extendedRtpCapabilities);
593
-
594
- if (!canConsume)
595
- throw new UnsupportedError('cannot consume this Producer');
596
-
597
- const { localId, rtpReceiver, track } =
598
- await this._handler.receive({ trackId: id, kind, rtpParameters });
599
-
600
- const consumer = new Consumer(
601
- {
602
- id,
603
- localId,
604
- producerId,
605
- rtpReceiver,
606
- track,
607
- rtpParameters,
608
- appData
609
- });
610
-
611
- this._consumers.set(consumer.id, consumer);
612
- this._handleConsumer(consumer);
613
-
614
- // If this is the first video Consumer and the Consumer for RTP probation
615
- // has not yet been created, create it now.
616
- if (!this._probatorConsumerCreated && kind === 'video')
617
- {
618
- try
619
- {
620
- const probatorRtpParameters =
621
- ortc.generateProbatorRtpParameters(consumer.rtpParameters);
608
+ // Ensure the device can consume it.
609
+ const canConsume = ortc.canReceive(
610
+ rtpParameters, this._extendedRtpCapabilities);
622
611
 
623
- await this._handler.receive(
624
- {
625
- trackId : 'probator',
626
- kind : 'video',
627
- rtpParameters : probatorRtpParameters
628
- });
612
+ if (!canConsume)
613
+ throw new UnsupportedError('cannot consume this Producer');
629
614
 
630
- logger.debug('consume() | Consumer for RTP probation created');
615
+ const consumerCreationTask = new ConsumerCreationTask(
616
+ {
617
+ id,
618
+ producerId,
619
+ kind,
620
+ rtpParameters,
621
+ appData
622
+ }
623
+ );
631
624
 
632
- this._probatorConsumerCreated = true;
633
- }
634
- catch (error)
635
- {
636
- logger.error(
637
- 'consume() | failed to create Consumer for RTP probation:%o',
638
- error);
639
- }
640
- }
625
+ // Store the Consumer creation task.
626
+ this._pendingConsumerTasks.push(consumerCreationTask);
641
627
 
642
- // Emit observer event.
643
- this._observer.safeEmit('newconsumer', consumer);
628
+ // There is no Consumer creation in progress, create it now.
629
+ if (this._consumerCreationInProgress === false)
630
+ {
631
+ this._createPendingConsumers();
632
+ }
644
633
 
645
- return consumer;
646
- },
647
- 'transport.consume()');
634
+ return consumerCreationTask.promise;
648
635
  }
649
636
 
650
637
  /**
@@ -788,6 +775,123 @@ export class Transport extends EnhancedEventEmitter
788
775
  'transport.consumeData()');
789
776
  }
790
777
 
778
+ // This method is guaranteed to never throw.
779
+ async _createPendingConsumers(): Promise<void>
780
+ {
781
+ this._awaitQueue.push(
782
+ async () =>
783
+ {
784
+ this._consumerCreationInProgress = true;
785
+
786
+ const pendingConsumerTasks = [ ...this._pendingConsumerTasks ];
787
+
788
+ // Clear pending Consumer tasks.
789
+ this._pendingConsumerTasks = [];
790
+
791
+ // Video Consumer in order to create the probator.
792
+ let videoConsumerForProbator: Consumer | undefined = undefined;
793
+
794
+ // Fill options list.
795
+ const optionsList: HandlerReceiveOptions[] = [];
796
+
797
+ for (const task of pendingConsumerTasks)
798
+ {
799
+ const { id, kind, rtpParameters } = task.consumerOptions;
800
+
801
+ optionsList.push({
802
+ trackId : id!,
803
+ kind : kind as 'audio' | 'video',
804
+ rtpParameters
805
+ });
806
+ }
807
+
808
+ try
809
+ {
810
+ const results = await this._handler.receive(optionsList);
811
+
812
+ for (let idx=0; idx < results.length; idx++)
813
+ {
814
+ const task = pendingConsumerTasks[idx];
815
+ const result = results[idx];
816
+ const { id, producerId, kind, rtpParameters, appData } = task.consumerOptions;
817
+ const { localId, rtpReceiver, track } = result;
818
+ const consumer = new Consumer(
819
+ {
820
+ id : id!,
821
+ localId,
822
+ producerId : producerId!,
823
+ rtpReceiver,
824
+ track,
825
+ rtpParameters,
826
+ appData
827
+ });
828
+
829
+ this._consumers.set(consumer.id, consumer);
830
+ this._handleConsumer(consumer);
831
+
832
+ // If this is the first video Consumer and the Consumer for RTP probation
833
+ // has not yet been created, it's time to create it.
834
+ if (!this._probatorConsumerCreated && !videoConsumerForProbator && kind === 'video')
835
+ {
836
+ videoConsumerForProbator = consumer;
837
+ }
838
+
839
+ // Emit observer event.
840
+ this._observer.safeEmit('newconsumer', consumer);
841
+
842
+ task.resolve!(consumer);
843
+ }
844
+ }
845
+ catch (error)
846
+ {
847
+ for (const task of pendingConsumerTasks)
848
+ {
849
+ task.reject!(error as Error);
850
+ }
851
+ }
852
+
853
+ // If RTP probation must be handled, do it now.
854
+ if (videoConsumerForProbator)
855
+ {
856
+ try
857
+ {
858
+ const probatorRtpParameters =
859
+ ortc.generateProbatorRtpParameters(videoConsumerForProbator!.rtpParameters);
860
+
861
+ await this._handler.receive(
862
+ [ {
863
+ trackId : 'probator',
864
+ kind : 'video',
865
+ rtpParameters : probatorRtpParameters
866
+ } ]);
867
+
868
+ logger.debug('_createPendingConsumers() | Consumer for RTP probation created');
869
+
870
+ this._probatorConsumerCreated = true;
871
+ }
872
+ catch (error)
873
+ {
874
+ logger.error(
875
+ '_createPendingConsumers() | failed to create Consumer for RTP probation:%o',
876
+ error);
877
+ }
878
+ }
879
+
880
+ this._consumerCreationInProgress = false;
881
+ },
882
+ 'transport._createPendingConsumers()')
883
+ .then(() =>
884
+ {
885
+ // There are pending Consumer tasks, enqueue their creation.
886
+ if (this._pendingConsumerTasks.length > 0)
887
+ {
888
+ this._createPendingConsumers();
889
+ }
890
+ })
891
+ // NOTE: We only get here when the await queue is closed.
892
+ .catch(() => {});
893
+ }
894
+
791
895
  _handleHandler(): void
792
896
  {
793
897
  const handler = this._handler;