mediasoup-client 3.6.40 → 3.6.44

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/lib/Consumer.d.ts +2 -0
  2. package/lib/Consumer.d.ts.map +1 -1
  3. package/lib/Consumer.js +4 -0
  4. package/lib/Transport.d.ts +3 -3
  5. package/lib/Transport.d.ts.map +1 -1
  6. package/lib/Transport.js +8 -0
  7. package/lib/handlers/Chrome55.d.ts +3 -0
  8. package/lib/handlers/Chrome55.d.ts.map +1 -1
  9. package/lib/handlers/Chrome55.js +41 -7
  10. package/lib/handlers/Chrome67.d.ts +3 -0
  11. package/lib/handlers/Chrome67.d.ts.map +1 -1
  12. package/lib/handlers/Chrome67.js +41 -7
  13. package/lib/handlers/Chrome70.d.ts +3 -0
  14. package/lib/handlers/Chrome70.d.ts.map +1 -1
  15. package/lib/handlers/Chrome70.js +43 -7
  16. package/lib/handlers/Chrome74.d.ts +3 -0
  17. package/lib/handlers/Chrome74.d.ts.map +1 -1
  18. package/lib/handlers/Chrome74.js +61 -7
  19. package/lib/handlers/Edge11.d.ts +2 -0
  20. package/lib/handlers/Edge11.d.ts.map +1 -1
  21. package/lib/handlers/Edge11.js +10 -0
  22. package/lib/handlers/FakeHandler.d.ts +2 -0
  23. package/lib/handlers/FakeHandler.d.ts.map +1 -1
  24. package/lib/handlers/FakeHandler.js +10 -0
  25. package/lib/handlers/Firefox60.d.ts +2 -0
  26. package/lib/handlers/Firefox60.d.ts.map +1 -1
  27. package/lib/handlers/Firefox60.js +31 -1
  28. package/lib/handlers/HandlerInterface.d.ts +2 -0
  29. package/lib/handlers/HandlerInterface.d.ts.map +1 -1
  30. package/lib/handlers/ReactNative.d.ts +3 -0
  31. package/lib/handlers/ReactNative.d.ts.map +1 -1
  32. package/lib/handlers/ReactNative.js +45 -7
  33. package/lib/handlers/Safari11.d.ts +3 -0
  34. package/lib/handlers/Safari11.d.ts.map +1 -1
  35. package/lib/handlers/Safari11.js +41 -7
  36. package/lib/handlers/Safari12.d.ts +3 -0
  37. package/lib/handlers/Safari12.d.ts.map +1 -1
  38. package/lib/handlers/Safari12.js +61 -7
  39. package/lib/index.d.ts +1 -1
  40. package/lib/index.js +1 -1
  41. package/package.json +5 -5
  42. package/src/Consumer.ts +6 -0
  43. package/src/Transport.ts +19 -3
  44. package/src/handlers/Chrome55.ts +50 -4
  45. package/src/handlers/Chrome67.ts +50 -4
  46. package/src/handlers/Chrome70.ts +54 -4
  47. package/src/handlers/Chrome74.ts +100 -4
  48. package/src/handlers/Edge11.ts +14 -0
  49. package/src/handlers/FakeHandler.ts +14 -0
  50. package/src/handlers/Firefox60.ts +65 -1
  51. package/src/handlers/HandlerInterface.ts +4 -0
  52. package/src/handlers/ReactNative.ts +55 -4
  53. package/src/handlers/Safari11.ts +50 -4
  54. package/src/handlers/Safari12.ts +100 -4
@@ -7,6 +7,7 @@ export declare class Safari12 extends HandlerInterface {
7
7
  private _remoteSdp?;
8
8
  private _sendingRtpParametersByKind?;
9
9
  private _sendingRemoteRtpParametersByKind?;
10
+ private _forcedLocalDtlsRole?;
10
11
  private _pc;
11
12
  private readonly _mapMidTransceiver;
12
13
  private readonly _sendStream;
@@ -35,6 +36,8 @@ export declare class Safari12 extends HandlerInterface {
35
36
  sendDataChannel({ ordered, maxPacketLifeTime, maxRetransmits, label, protocol }: HandlerSendDataChannelOptions): Promise<HandlerSendDataChannelResult>;
36
37
  receive({ trackId, kind, rtpParameters }: HandlerReceiveOptions): Promise<HandlerReceiveResult>;
37
38
  stopReceiving(localId: string): Promise<void>;
39
+ pauseReceiving(localId: string): Promise<void>;
40
+ resumeReceiving(localId: string): Promise<void>;
38
41
  getReceiverStats(localId: string): Promise<RTCStatsReport>;
39
42
  receiveDataChannel({ sctpStreamParameters, label, protocol }: HandlerReceiveDataChannelOptions): Promise<HandlerReceiveDataChannelResult>;
40
43
  private _setupTransport;
@@ -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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"}
@@ -116,6 +116,11 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
116
116
  audio: ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities),
117
117
  video: ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)
118
118
  };
119
+ if (dtlsParameters.role && dtlsParameters.role !== 'auto') {
120
+ this._forcedLocalDtlsRole = dtlsParameters.role === 'server'
121
+ ? 'client'
122
+ : 'server';
123
+ }
119
124
  this._pc = new RTCPeerConnection(Object.assign({ iceServers: iceServers || [], iceTransportPolicy: iceTransportPolicy || 'all', bundlePolicy: 'max-bundle', rtcpMuxPolicy: 'require' }, additionalSettings), proprietaryConstraints);
120
125
  // Handle RTCPeerConnection connection status.
121
126
  this._pc.addEventListener('iceconnectionstatechange', () => {
@@ -172,6 +177,7 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
172
177
  return this._pc.getStats();
173
178
  }
174
179
  async send({ track, encodings, codecOptions, codec }) {
180
+ var _a;
175
181
  this._assertSendDirection();
176
182
  logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);
177
183
  const sendingRtpParameters = utils.clone(this._sendingRtpParametersByKind[track.kind], {});
@@ -187,8 +193,12 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
187
193
  let offer = await this._pc.createOffer();
188
194
  let localSdpObject = sdpTransform.parse(offer.sdp);
189
195
  let offerMediaObject;
190
- if (!this._transportReady)
191
- await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
196
+ if (!this._transportReady) {
197
+ await this._setupTransport({
198
+ localDtlsRole: (_a = this._forcedLocalDtlsRole) !== null && _a !== void 0 ? _a : 'server',
199
+ localSdpObject
200
+ });
201
+ }
192
202
  if (encodings && encodings.length > 1) {
193
203
  logger.debug('send() | enabling legacy simulcast');
194
204
  localSdpObject = sdpTransform.parse(offer.sdp);
@@ -262,6 +272,7 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
262
272
  const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() };
263
273
  logger.debug('stopSending() | calling pc.setRemoteDescription() [answer:%o]', answer);
264
274
  await this._pc.setRemoteDescription(answer);
275
+ this._mapMidTransceiver.delete(localId);
265
276
  }
266
277
  async replaceTrack(localId, track) {
267
278
  this._assertSendDirection();
@@ -311,6 +322,7 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
311
322
  return transceiver.sender.getStats();
312
323
  }
313
324
  async sendDataChannel({ ordered, maxPacketLifeTime, maxRetransmits, label, protocol }) {
325
+ var _a;
314
326
  this._assertSendDirection();
315
327
  const options = {
316
328
  negotiated: true,
@@ -332,8 +344,12 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
332
344
  const localSdpObject = sdpTransform.parse(offer.sdp);
333
345
  const offerMediaObject = localSdpObject.media
334
346
  .find((m) => m.type === 'application');
335
- if (!this._transportReady)
336
- await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
347
+ if (!this._transportReady) {
348
+ await this._setupTransport({
349
+ localDtlsRole: (_a = this._forcedLocalDtlsRole) !== null && _a !== void 0 ? _a : 'server',
350
+ localSdpObject
351
+ });
352
+ }
337
353
  logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer);
338
354
  await this._pc.setLocalDescription(offer);
339
355
  this._remoteSdp.sendSctpAssociation({ offerMediaObject });
@@ -351,6 +367,7 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
351
367
  return { dataChannel, sctpStreamParameters };
352
368
  }
353
369
  async receive({ trackId, kind, rtpParameters }) {
370
+ var _a;
354
371
  this._assertRecvDirection();
355
372
  logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
356
373
  const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
@@ -375,8 +392,12 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
375
392
  answerMediaObject
376
393
  });
377
394
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
378
- if (!this._transportReady)
379
- await this._setupTransport({ localDtlsRole: 'client', localSdpObject });
395
+ if (!this._transportReady) {
396
+ await this._setupTransport({
397
+ localDtlsRole: (_a = this._forcedLocalDtlsRole) !== null && _a !== void 0 ? _a : 'client',
398
+ localSdpObject
399
+ });
400
+ }
380
401
  logger.debug('receive() | calling pc.setLocalDescription() [answer:%o]', answer);
381
402
  await this._pc.setLocalDescription(answer);
382
403
  const transceiver = this._pc.getTransceivers()
@@ -404,6 +425,35 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
404
425
  const answer = await this._pc.createAnswer();
405
426
  logger.debug('stopReceiving() | calling pc.setLocalDescription() [answer:%o]', answer);
406
427
  await this._pc.setLocalDescription(answer);
428
+ this._mapMidTransceiver.delete(localId);
429
+ }
430
+ async pauseReceiving(localId) {
431
+ this._assertRecvDirection();
432
+ logger.debug('pauseReceiving() [localId:%s]', localId);
433
+ const transceiver = this._mapMidTransceiver.get(localId);
434
+ if (!transceiver)
435
+ throw new Error('associated RTCRtpTransceiver not found');
436
+ transceiver.direction = 'inactive';
437
+ const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() };
438
+ logger.debug('pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer);
439
+ await this._pc.setRemoteDescription(offer);
440
+ const answer = await this._pc.createAnswer();
441
+ logger.debug('pauseReceiving() | calling pc.setLocalDescription() [answer:%o]', answer);
442
+ await this._pc.setLocalDescription(answer);
443
+ }
444
+ async resumeReceiving(localId) {
445
+ this._assertRecvDirection();
446
+ logger.debug('resumeReceiving() [localId:%s]', localId);
447
+ const transceiver = this._mapMidTransceiver.get(localId);
448
+ if (!transceiver)
449
+ throw new Error('associated RTCRtpTransceiver not found');
450
+ transceiver.direction = 'recvonly';
451
+ const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() };
452
+ logger.debug('resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer);
453
+ await this._pc.setRemoteDescription(offer);
454
+ const answer = await this._pc.createAnswer();
455
+ logger.debug('resumeReceiving() | calling pc.setLocalDescription() [answer:%o]', answer);
456
+ await this._pc.setLocalDescription(answer);
407
457
  }
408
458
  async getReceiverStats(localId) {
409
459
  this._assertRecvDirection();
@@ -413,6 +463,7 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
413
463
  return transceiver.receiver.getStats();
414
464
  }
415
465
  async receiveDataChannel({ sctpStreamParameters, label, protocol }) {
466
+ var _a;
416
467
  this._assertRecvDirection();
417
468
  const { streamId, ordered, maxPacketLifeTime, maxRetransmits } = sctpStreamParameters;
418
469
  const options = {
@@ -435,7 +486,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
435
486
  const answer = await this._pc.createAnswer();
436
487
  if (!this._transportReady) {
437
488
  const localSdpObject = sdpTransform.parse(answer.sdp);
438
- await this._setupTransport({ localDtlsRole: 'client', localSdpObject });
489
+ await this._setupTransport({
490
+ localDtlsRole: (_a = this._forcedLocalDtlsRole) !== null && _a !== void 0 ? _a : 'client',
491
+ localSdpObject
492
+ });
439
493
  }
440
494
  logger.debug('receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer);
441
495
  await this._pc.setLocalDescription(answer);
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.40";
11
+ export declare const version = "3.6.44";
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.40';
36
+ exports.version = '3.6.44';
37
37
  /**
38
38
  * Expose parseScalabilityMode() function.
39
39
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mediasoup-client",
3
- "version": "3.6.40",
3
+ "version": "3.6.44",
4
4
  "description": "mediasoup client side JavaScript library",
5
5
  "contributors": [
6
6
  "Iñaki Baz Castillo <ibc@aliax.net> (https://inakibaz.me)",
@@ -49,11 +49,11 @@
49
49
  "devDependencies": {
50
50
  "@types/sdp-transform": "^2.4.5",
51
51
  "@types/uuid": "^3.4.9",
52
- "@typescript-eslint/eslint-plugin": "^4.31.0",
53
- "@typescript-eslint/parser": "^4.31.0",
52
+ "@typescript-eslint/eslint-plugin": "^4.33.0",
53
+ "@typescript-eslint/parser": "^4.33.0",
54
54
  "eslint": "^7.32.0",
55
- "eslint-plugin-jest": "^24.4.0",
56
- "jest": "^27.1.1",
55
+ "eslint-plugin-jest": "^24.5.2",
56
+ "jest": "^27.3.1",
57
57
  "jest-tobetype": "^1.2.3",
58
58
  "open-cli": "^6.0.1",
59
59
  "tsc-watch": "^4.5.0",
package/src/Consumer.ts CHANGED
@@ -42,6 +42,8 @@ export class Consumer extends EnhancedEventEmitter
42
42
  * @emits trackended
43
43
  * @emits @getstats
44
44
  * @emits @close
45
+ * @emits @pause
46
+ * @emits @resume
45
47
  */
46
48
  constructor(
47
49
  {
@@ -250,6 +252,8 @@ export class Consumer extends EnhancedEventEmitter
250
252
  this._paused = true;
251
253
  this._track.enabled = false;
252
254
 
255
+ this.emit('@pause');
256
+
253
257
  // Emit observer event.
254
258
  this._observer.safeEmit('pause');
255
259
  }
@@ -271,6 +275,8 @@ export class Consumer extends EnhancedEventEmitter
271
275
  this._paused = false;
272
276
  this._track.enabled = true;
273
277
 
278
+ this.emit('@resume');
279
+
274
280
  // Emit observer event.
275
281
  this._observer.safeEmit('resume');
276
282
  }
package/src/Transport.ts CHANGED
@@ -80,7 +80,7 @@ export type IceCandidate =
80
80
  */
81
81
  port: number;
82
82
  /**
83
- * The type of candidate..
83
+ * The type of candidate.
84
84
  */
85
85
  type: 'host' | 'srflx' | 'prflx' | 'relay';
86
86
  /**
@@ -92,11 +92,11 @@ export type IceCandidate =
92
92
  export type DtlsParameters =
93
93
  {
94
94
  /**
95
- * DTLS role. Default 'auto'.
95
+ * Server DTLS role. Default 'auto'.
96
96
  */
97
97
  role?: DtlsRole;
98
98
  /**
99
- * DTLS fingerprints.
99
+ * Server DTLS fingerprints.
100
100
  */
101
101
  fingerprints: DtlsFingerprint[];
102
102
  }
@@ -892,6 +892,22 @@ export class Transport extends EnhancedEventEmitter
892
892
  .catch(() => {});
893
893
  });
894
894
 
895
+ consumer.on('@pause', () =>
896
+ {
897
+ this._awaitQueue.push(
898
+ async () => this._handler.pauseReceiving(consumer.localId),
899
+ 'consumer @pause event')
900
+ .catch(() => {});
901
+ });
902
+
903
+ consumer.on('@resume', () =>
904
+ {
905
+ this._awaitQueue.push(
906
+ async () => this._handler.resumeReceiving(consumer.localId),
907
+ 'consumer @resume event')
908
+ .catch(() => {});
909
+ });
910
+
895
911
  consumer.on('@getstats', (callback, errback) =>
896
912
  {
897
913
  if (this._closed)
@@ -38,6 +38,9 @@ export class Chrome55 extends HandlerInterface
38
38
  // Generic sending RTP parameters for audio and video suitable for the SDP
39
39
  // remote answer.
40
40
  private _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };
41
+ // Initial server side DTLS role. If not 'auto', it will force the opposite
42
+ // value in client side.
43
+ private _forcedLocalDtlsRole?: DtlsRole;
41
44
  // RTCPeerConnection instance.
42
45
  private _pc: any;
43
46
  // Local stream for sending.
@@ -181,6 +184,13 @@ export class Chrome55 extends HandlerInterface
181
184
  video : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)
182
185
  };
183
186
 
187
+ if (dtlsParameters.role && dtlsParameters.role !== 'auto')
188
+ {
189
+ this._forcedLocalDtlsRole = dtlsParameters.role === 'server'
190
+ ? 'client'
191
+ : 'server';
192
+ }
193
+
184
194
  this._pc = new (RTCPeerConnection as any)(
185
195
  {
186
196
  iceServers : iceServers || [],
@@ -315,7 +325,13 @@ export class Chrome55 extends HandlerInterface
315
325
  ortc.reduceCodecs(sendingRemoteRtpParameters.codecs);
316
326
 
317
327
  if (!this._transportReady)
318
- await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
328
+ {
329
+ await this._setupTransport(
330
+ {
331
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
332
+ localSdpObject
333
+ });
334
+ }
319
335
 
320
336
  if (track.kind === 'video' && encodings && encodings.length > 1)
321
337
  {
@@ -525,7 +541,13 @@ export class Chrome55 extends HandlerInterface
525
541
  .find((m: any) => m.type === 'application');
526
542
 
527
543
  if (!this._transportReady)
528
- await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
544
+ {
545
+ await this._setupTransport(
546
+ {
547
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
548
+ localSdpObject
549
+ });
550
+ }
529
551
 
530
552
  logger.debug(
531
553
  'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',
@@ -602,7 +624,13 @@ export class Chrome55 extends HandlerInterface
602
624
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
603
625
 
604
626
  if (!this._transportReady)
605
- await this._setupTransport({ localDtlsRole: 'client', localSdpObject });
627
+ {
628
+ await this._setupTransport(
629
+ {
630
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
631
+ localSdpObject
632
+ });
633
+ }
606
634
 
607
635
  logger.debug(
608
636
  'receive() | calling pc.setLocalDescription() [answer:%o]',
@@ -653,6 +681,20 @@ export class Chrome55 extends HandlerInterface
653
681
 
654
682
  await this._pc.setLocalDescription(answer);
655
683
  }
684
+
685
+ async pauseReceiving(
686
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
687
+ localId: string): Promise<void>
688
+ {
689
+ // Unimplemented.
690
+ }
691
+
692
+ async resumeReceiving(
693
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
694
+ localId: string): Promise<void>
695
+ {
696
+ // Unimplemented.
697
+ }
656
698
 
657
699
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
658
700
  async getReceiverStats(localId: string): Promise<RTCStatsReport>
@@ -708,7 +750,11 @@ export class Chrome55 extends HandlerInterface
708
750
  {
709
751
  const localSdpObject = sdpTransform.parse(answer.sdp);
710
752
 
711
- await this._setupTransport({ localDtlsRole: 'client', localSdpObject });
753
+ await this._setupTransport(
754
+ {
755
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
756
+ localSdpObject
757
+ });
712
758
  }
713
759
 
714
760
  logger.debug(
@@ -37,6 +37,9 @@ export class Chrome67 extends HandlerInterface
37
37
  // Generic sending RTP parameters for audio and video suitable for the SDP
38
38
  // remote answer.
39
39
  private _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };
40
+ // Initial server side DTLS role. If not 'auto', it will force the opposite
41
+ // value in client side.
42
+ private _forcedLocalDtlsRole?: DtlsRole;
40
43
  // RTCPeerConnection instance.
41
44
  private _pc: any;
42
45
  // Local stream for sending.
@@ -182,6 +185,13 @@ export class Chrome67 extends HandlerInterface
182
185
  video : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)
183
186
  };
184
187
 
188
+ if (dtlsParameters.role && dtlsParameters.role !== 'auto')
189
+ {
190
+ this._forcedLocalDtlsRole = dtlsParameters.role === 'server'
191
+ ? 'client'
192
+ : 'server';
193
+ }
194
+
185
195
  this._pc = new (RTCPeerConnection as any)(
186
196
  {
187
197
  iceServers : iceServers || [],
@@ -316,7 +326,13 @@ export class Chrome67 extends HandlerInterface
316
326
  ortc.reduceCodecs(sendingRemoteRtpParameters.codecs);
317
327
 
318
328
  if (!this._transportReady)
319
- await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
329
+ {
330
+ await this._setupTransport(
331
+ {
332
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
333
+ localSdpObject
334
+ });
335
+ }
320
336
 
321
337
  if (track.kind === 'video' && encodings && encodings.length > 1)
322
338
  {
@@ -602,7 +618,13 @@ export class Chrome67 extends HandlerInterface
602
618
  .find((m: any) => m.type === 'application');
603
619
 
604
620
  if (!this._transportReady)
605
- await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
621
+ {
622
+ await this._setupTransport(
623
+ {
624
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
625
+ localSdpObject
626
+ });
627
+ }
606
628
 
607
629
  logger.debug(
608
630
  'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',
@@ -678,7 +700,13 @@ export class Chrome67 extends HandlerInterface
678
700
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
679
701
 
680
702
  if (!this._transportReady)
681
- await this._setupTransport({ localDtlsRole: 'client', localSdpObject });
703
+ {
704
+ await this._setupTransport(
705
+ {
706
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
707
+ localSdpObject
708
+ });
709
+ }
682
710
 
683
711
  logger.debug(
684
712
  'receive() | calling pc.setLocalDescription() [answer:%o]',
@@ -733,6 +761,20 @@ export class Chrome67 extends HandlerInterface
733
761
  await this._pc.setLocalDescription(answer);
734
762
  }
735
763
 
764
+ async pauseReceiving(
765
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
766
+ localId: string): Promise<void>
767
+ {
768
+ // Unimplemented.
769
+ }
770
+
771
+ async resumeReceiving(
772
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
773
+ localId: string): Promise<void>
774
+ {
775
+ // Unimplemented.
776
+ }
777
+
736
778
  async getReceiverStats(localId: string): Promise<RTCStatsReport>
737
779
  {
738
780
  this._assertRecvDirection();
@@ -793,7 +835,11 @@ export class Chrome67 extends HandlerInterface
793
835
  {
794
836
  const localSdpObject = sdpTransform.parse(answer.sdp);
795
837
 
796
- await this._setupTransport({ localDtlsRole: 'client', localSdpObject });
838
+ await this._setupTransport(
839
+ {
840
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
841
+ localSdpObject
842
+ });
797
843
  }
798
844
 
799
845
  logger.debug(
@@ -38,6 +38,9 @@ export class Chrome70 extends HandlerInterface
38
38
  // Generic sending RTP parameters for audio and video suitable for the SDP
39
39
  // remote answer.
40
40
  private _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };
41
+ // Initial server side DTLS role. If not 'auto', it will force the opposite
42
+ // value in client side.
43
+ private _forcedLocalDtlsRole?: DtlsRole;
41
44
  // RTCPeerConnection instance.
42
45
  private _pc: any;
43
46
  // Map of RTCTransceivers indexed by MID.
@@ -168,6 +171,13 @@ export class Chrome70 extends HandlerInterface
168
171
  video : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)
169
172
  };
170
173
 
174
+ if (dtlsParameters.role && dtlsParameters.role !== 'auto')
175
+ {
176
+ this._forcedLocalDtlsRole = dtlsParameters.role === 'server'
177
+ ? 'client'
178
+ : 'server';
179
+ }
180
+
171
181
  this._pc = new (RTCPeerConnection as any)(
172
182
  {
173
183
  iceServers : iceServers || [],
@@ -298,7 +308,13 @@ export class Chrome70 extends HandlerInterface
298
308
  let offerMediaObject;
299
309
 
300
310
  if (!this._transportReady)
301
- await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
311
+ {
312
+ await this._setupTransport(
313
+ {
314
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
315
+ localSdpObject
316
+ });
317
+ }
302
318
 
303
319
  if (encodings && encodings.length > 1)
304
320
  {
@@ -478,6 +494,8 @@ export class Chrome70 extends HandlerInterface
478
494
  answer);
479
495
 
480
496
  await this._pc.setRemoteDescription(answer);
497
+
498
+ this._mapMidTransceiver.delete(localId);
481
499
  }
482
500
 
483
501
  async replaceTrack(
@@ -606,7 +624,13 @@ export class Chrome70 extends HandlerInterface
606
624
  .find((m: any) => m.type === 'application');
607
625
 
608
626
  if (!this._transportReady)
609
- await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
627
+ {
628
+ await this._setupTransport(
629
+ {
630
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'server',
631
+ localSdpObject
632
+ });
633
+ }
610
634
 
611
635
  logger.debug(
612
636
  'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',
@@ -681,7 +705,13 @@ export class Chrome70 extends HandlerInterface
681
705
  answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
682
706
 
683
707
  if (!this._transportReady)
684
- await this._setupTransport({ localDtlsRole: 'client', localSdpObject });
708
+ {
709
+ await this._setupTransport(
710
+ {
711
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
712
+ localSdpObject
713
+ });
714
+ }
685
715
 
686
716
  logger.debug(
687
717
  'receive() | calling pc.setLocalDescription() [answer:%o]',
@@ -733,6 +763,22 @@ export class Chrome70 extends HandlerInterface
733
763
  answer);
734
764
 
735
765
  await this._pc.setLocalDescription(answer);
766
+
767
+ this._mapMidTransceiver.delete(localId);
768
+ }
769
+
770
+ async pauseReceiving(
771
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
772
+ localId: string): Promise<void>
773
+ {
774
+ // Unimplemented.
775
+ }
776
+
777
+ async resumeReceiving(
778
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
779
+ localId: string): Promise<void>
780
+ {
781
+ // Unimplemented.
736
782
  }
737
783
 
738
784
  async getReceiverStats(localId: string): Promise<RTCStatsReport>
@@ -795,7 +841,11 @@ export class Chrome70 extends HandlerInterface
795
841
  {
796
842
  const localSdpObject = sdpTransform.parse(answer.sdp);
797
843
 
798
- await this._setupTransport({ localDtlsRole: 'client', localSdpObject });
844
+ await this._setupTransport(
845
+ {
846
+ localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
847
+ localSdpObject
848
+ });
799
849
  }
800
850
 
801
851
  logger.debug(