mediasoup-client 3.6.80 → 3.6.81

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 (59) hide show
  1. package/lib/Consumer.d.ts.map +1 -1
  2. package/lib/Consumer.js +6 -3
  3. package/lib/DataConsumer.d.ts.map +1 -1
  4. package/lib/DataConsumer.js +14 -7
  5. package/lib/DataProducer.d.ts.map +1 -1
  6. package/lib/DataProducer.js +18 -9
  7. package/lib/Device.d.ts.map +1 -1
  8. package/lib/Device.js +24 -12
  9. package/lib/Producer.d.ts +1 -0
  10. package/lib/Producer.d.ts.map +1 -1
  11. package/lib/Producer.js +28 -14
  12. package/lib/handlers/Chrome111.d.ts.map +1 -1
  13. package/lib/handlers/Chrome111.js +33 -15
  14. package/lib/handlers/Chrome55.d.ts.map +1 -1
  15. package/lib/handlers/Chrome55.js +12 -6
  16. package/lib/handlers/Chrome67.d.ts.map +1 -1
  17. package/lib/handlers/Chrome67.js +32 -16
  18. package/lib/handlers/Chrome70.d.ts.map +1 -1
  19. package/lib/handlers/Chrome70.js +28 -14
  20. package/lib/handlers/Chrome74.d.ts.map +1 -1
  21. package/lib/handlers/Chrome74.js +35 -16
  22. package/lib/handlers/Edge11.d.ts.map +1 -1
  23. package/lib/handlers/Edge11.js +30 -15
  24. package/lib/handlers/FakeHandler.d.ts.map +1 -1
  25. package/lib/handlers/FakeHandler.js +16 -8
  26. package/lib/handlers/Firefox60.d.ts.map +1 -1
  27. package/lib/handlers/Firefox60.js +38 -19
  28. package/lib/handlers/ReactNative.d.ts.map +1 -1
  29. package/lib/handlers/ReactNative.js +12 -6
  30. package/lib/handlers/ReactNativeUnifiedPlan.d.ts.map +1 -1
  31. package/lib/handlers/ReactNativeUnifiedPlan.js +35 -16
  32. package/lib/handlers/Safari11.d.ts.map +1 -1
  33. package/lib/handlers/Safari11.js +32 -16
  34. package/lib/handlers/Safari12.d.ts.map +1 -1
  35. package/lib/handlers/Safari12.js +37 -17
  36. package/lib/handlers/ortc/edgeUtils.d.ts.map +1 -1
  37. package/lib/handlers/ortc/edgeUtils.js +8 -4
  38. package/lib/handlers/ortc/utils.d.ts +6 -0
  39. package/lib/handlers/ortc/utils.d.ts.map +1 -0
  40. package/lib/handlers/ortc/utils.js +20 -0
  41. package/lib/handlers/sdp/MediaSection.d.ts.map +1 -1
  42. package/lib/handlers/sdp/MediaSection.js +56 -23
  43. package/lib/handlers/sdp/RemoteSdp.d.ts.map +1 -1
  44. package/lib/handlers/sdp/RemoteSdp.js +8 -4
  45. package/lib/handlers/sdp/commonUtils.d.ts.map +1 -1
  46. package/lib/handlers/sdp/commonUtils.js +26 -13
  47. package/lib/handlers/sdp/plainRtpUtils.d.ts.map +1 -1
  48. package/lib/handlers/sdp/plainRtpUtils.js +8 -4
  49. package/lib/handlers/sdp/planBUtils.d.ts.map +1 -1
  50. package/lib/handlers/sdp/planBUtils.js +22 -11
  51. package/lib/handlers/sdp/unifiedPlanUtils.d.ts.map +1 -1
  52. package/lib/handlers/sdp/unifiedPlanUtils.js +16 -8
  53. package/lib/index.d.ts +1 -1
  54. package/lib/index.js +1 -1
  55. package/lib/ortc.d.ts.map +1 -1
  56. package/lib/ortc.js +196 -98
  57. package/lib/utils.d.ts.map +1 -1
  58. package/lib/utils.js +2 -1
  59. package/package.json +3 -3
@@ -46,8 +46,9 @@ class MediaSection {
46
46
  candidateObject.priority = candidate.priority;
47
47
  candidateObject.transport = candidate.protocol;
48
48
  candidateObject.type = candidate.type;
49
- if (candidate.tcpType)
49
+ if (candidate.tcpType) {
50
50
  candidateObject.tcptype = candidate.tcpType;
51
+ }
51
52
  this._mediaObject.candidates.push(candidateObject);
52
53
  }
53
54
  this._mediaObject.endOfCandidates = 'end-of-candidates';
@@ -121,16 +122,19 @@ class AnswerMediaSection extends MediaSection {
121
122
  codec: getCodecName(codec),
122
123
  rate: codec.clockRate
123
124
  };
124
- if (codec.channels > 1)
125
+ if (codec.channels > 1) {
125
126
  rtp.encoding = codec.channels;
127
+ }
126
128
  this._mediaObject.rtp.push(rtp);
127
129
  const codecParameters = utils.clone(codec.parameters, {});
130
+ let codecRtcpFeedback = utils.clone(codec.rtcpFeedback, []);
128
131
  if (codecOptions) {
129
- const { opusStereo, opusFec, opusDtx, opusMaxPlaybackRate, opusMaxAverageBitrate, opusPtime, videoGoogleStartBitrate, videoGoogleMaxBitrate, videoGoogleMinBitrate } = codecOptions;
132
+ const { opusStereo, opusFec, opusDtx, opusMaxPlaybackRate, opusMaxAverageBitrate, opusPtime, opusNack, videoGoogleStartBitrate, videoGoogleMaxBitrate, videoGoogleMinBitrate } = codecOptions;
130
133
  const offerCodec = offerRtpParameters.codecs
131
134
  .find((c) => (c.payloadType === codec.payloadType));
132
135
  switch (codec.mimeType.toLowerCase()) {
133
136
  case 'audio/opus':
137
+ case 'audio/multiopus':
134
138
  {
135
139
  if (opusStereo !== undefined) {
136
140
  offerCodec.parameters['sprop-stereo'] = opusStereo ? 1 : 0;
@@ -154,6 +158,16 @@ class AnswerMediaSection extends MediaSection {
154
158
  offerCodec.parameters.ptime = opusPtime;
155
159
  codecParameters.ptime = opusPtime;
156
160
  }
161
+ // If opusNack is not set, we must remove NACK support for OPUS.
162
+ // Otherwise it would be enabled for those handlers that artificially
163
+ // announce it in their RTP capabilities.
164
+ if (!opusNack) {
165
+ offerCodec.rtcpFeedback = offerCodec
166
+ .rtcpFeedback
167
+ .filter((fb) => fb.type !== 'nack' || fb.parameter);
168
+ codecRtcpFeedback = codecRtcpFeedback
169
+ .filter((fb) => fb.type !== 'nack' || fb.parameter);
170
+ }
157
171
  break;
158
172
  }
159
173
  case 'video/vp8':
@@ -161,12 +175,15 @@ class AnswerMediaSection extends MediaSection {
161
175
  case 'video/h264':
162
176
  case 'video/h265':
163
177
  {
164
- if (videoGoogleStartBitrate !== undefined)
178
+ if (videoGoogleStartBitrate !== undefined) {
165
179
  codecParameters['x-google-start-bitrate'] = videoGoogleStartBitrate;
166
- if (videoGoogleMaxBitrate !== undefined)
180
+ }
181
+ if (videoGoogleMaxBitrate !== undefined) {
167
182
  codecParameters['x-google-max-bitrate'] = videoGoogleMaxBitrate;
168
- if (videoGoogleMinBitrate !== undefined)
183
+ }
184
+ if (videoGoogleMinBitrate !== undefined) {
169
185
  codecParameters['x-google-min-bitrate'] = videoGoogleMinBitrate;
186
+ }
170
187
  break;
171
188
  }
172
189
  }
@@ -176,13 +193,15 @@ class AnswerMediaSection extends MediaSection {
176
193
  config: ''
177
194
  };
178
195
  for (const key of Object.keys(codecParameters)) {
179
- if (fmtp.config)
196
+ if (fmtp.config) {
180
197
  fmtp.config += ';';
198
+ }
181
199
  fmtp.config += `${key}=${codecParameters[key]}`;
182
200
  }
183
- if (fmtp.config)
201
+ if (fmtp.config) {
184
202
  this._mediaObject.fmtp.push(fmtp);
185
- for (const fb of codec.rtcpFeedback) {
203
+ }
204
+ for (const fb of codecRtcpFeedback) {
186
205
  this._mediaObject.rtcpFb.push({
187
206
  payload: codec.payloadType,
188
207
  type: fb.type,
@@ -198,8 +217,9 @@ class AnswerMediaSection extends MediaSection {
198
217
  // Don't add a header extension if not present in the offer.
199
218
  const found = (offerMediaObject.ext || [])
200
219
  .some((localExt) => localExt.uri === ext.uri);
201
- if (!found)
220
+ if (!found) {
202
221
  continue;
222
+ }
203
223
  this._mediaObject.ext.push({
204
224
  uri: ext.uri,
205
225
  value: ext.id
@@ -219,8 +239,9 @@ class AnswerMediaSection extends MediaSection {
219
239
  };
220
240
  this._mediaObject.rids = [];
221
241
  for (const rid of offerMediaObject.rids || []) {
222
- if (rid.direction !== 'send')
242
+ if (rid.direction !== 'send') {
223
243
  continue;
244
+ }
224
245
  this._mediaObject.rids.push({
225
246
  id: rid.id,
226
247
  direction: 'recv'
@@ -236,8 +257,9 @@ class AnswerMediaSection extends MediaSection {
236
257
  };
237
258
  this._mediaObject.rids = [];
238
259
  for (const rid of offerMediaObject.rids || []) {
239
- if (rid.direction !== 'send')
260
+ if (rid.direction !== 'send') {
240
261
  continue;
262
+ }
241
263
  this._mediaObject.rids.push({
242
264
  id: rid.id,
243
265
  direction: 'recv'
@@ -246,8 +268,9 @@ class AnswerMediaSection extends MediaSection {
246
268
  }
247
269
  this._mediaObject.rtcpMux = 'rtcp-mux';
248
270
  this._mediaObject.rtcpRsize = 'rtcp-rsize';
249
- if (this._planB && this._mediaObject.type === 'video')
271
+ if (this._planB && this._mediaObject.type === 'video') {
250
272
  this._mediaObject.xGoogleFlag = 'conference';
273
+ }
251
274
  break;
252
275
  }
253
276
  case 'application':
@@ -320,10 +343,12 @@ class OfferMediaSection extends MediaSection {
320
343
  this._mediaObject.type = kind;
321
344
  if (!plainRtpParameters) {
322
345
  this._mediaObject.connection = { ip: '127.0.0.1', version: 4 };
323
- if (!sctpParameters)
346
+ if (!sctpParameters) {
324
347
  this._mediaObject.protocol = 'UDP/TLS/RTP/SAVPF';
325
- else
348
+ }
349
+ else {
326
350
  this._mediaObject.protocol = 'UDP/DTLS/SCTP';
351
+ }
327
352
  this._mediaObject.port = 7;
328
353
  }
329
354
  else {
@@ -343,28 +368,32 @@ class OfferMediaSection extends MediaSection {
343
368
  this._mediaObject.rtp = [];
344
369
  this._mediaObject.rtcpFb = [];
345
370
  this._mediaObject.fmtp = [];
346
- if (!this._planB)
371
+ if (!this._planB) {
347
372
  this._mediaObject.msid = `${streamId || '-'} ${trackId}`;
373
+ }
348
374
  for (const codec of offerRtpParameters.codecs) {
349
375
  const rtp = {
350
376
  payload: codec.payloadType,
351
377
  codec: getCodecName(codec),
352
378
  rate: codec.clockRate
353
379
  };
354
- if (codec.channels > 1)
380
+ if (codec.channels > 1) {
355
381
  rtp.encoding = codec.channels;
382
+ }
356
383
  this._mediaObject.rtp.push(rtp);
357
384
  const fmtp = {
358
385
  payload: codec.payloadType,
359
386
  config: ''
360
387
  };
361
388
  for (const key of Object.keys(codec.parameters)) {
362
- if (fmtp.config)
389
+ if (fmtp.config) {
363
390
  fmtp.config += ';';
391
+ }
364
392
  fmtp.config += `${key}=${codec.parameters[key]}`;
365
393
  }
366
- if (fmtp.config)
394
+ if (fmtp.config) {
367
395
  this._mediaObject.fmtp.push(fmtp);
396
+ }
368
397
  for (const fb of codec.rtcpFeedback) {
369
398
  this._mediaObject.rtcpFb.push({
370
399
  payload: codec.payloadType,
@@ -475,20 +504,23 @@ class OfferMediaSection extends MediaSection {
475
504
  codec: getCodecName(codec),
476
505
  rate: codec.clockRate
477
506
  };
478
- if (codec.channels > 1)
507
+ if (codec.channels > 1) {
479
508
  rtp.encoding = codec.channels;
509
+ }
480
510
  this._mediaObject.rtp.push(rtp);
481
511
  const fmtp = {
482
512
  payload: codec.payloadType,
483
513
  config: ''
484
514
  };
485
515
  for (const key of Object.keys(codec.parameters)) {
486
- if (fmtp.config)
516
+ if (fmtp.config) {
487
517
  fmtp.config += ';';
518
+ }
488
519
  fmtp.config += `${key}=${codec.parameters[key]}`;
489
520
  }
490
- if (fmtp.config)
521
+ if (fmtp.config) {
491
522
  this._mediaObject.fmtp.push(fmtp);
523
+ }
492
524
  for (const fb of codec.rtcpFeedback) {
493
525
  this._mediaObject.rtcpFb.push({
494
526
  payload: codec.payloadType,
@@ -553,7 +585,8 @@ exports.OfferMediaSection = OfferMediaSection;
553
585
  function getCodecName(codec) {
554
586
  const MimeTypeRegex = new RegExp('^(audio|video)/(.+)', 'i');
555
587
  const mimeTypeMatch = MimeTypeRegex.exec(codec.mimeType);
556
- if (!mimeTypeMatch)
588
+ if (!mimeTypeMatch) {
557
589
  throw new TypeError('invalid codec.mimeType');
590
+ }
558
591
  return mimeTypeMatch[2];
559
592
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteSdp.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/RemoteSdp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RemoteSdp.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/RemoteSdp.ts"],"names":[],"mappings":"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"}
@@ -96,8 +96,9 @@ class RemoteSdp {
96
96
  // If a closed media section is found, return its index.
97
97
  for (let idx = 0; idx < this._mediaSections.length; ++idx) {
98
98
  const mediaSection = this._mediaSections[idx];
99
- if (mediaSection.closed)
99
+ if (mediaSection.closed) {
100
100
  return { idx, reuseMid: mediaSection.mid };
101
+ }
101
102
  }
102
103
  // If no closed media section is found, return next one.
103
104
  return { idx: this._mediaSections.length };
@@ -131,8 +132,9 @@ class RemoteSdp {
131
132
  receive({ mid, kind, offerRtpParameters, streamId, trackId }) {
132
133
  const idx = this._midToIndex.get(mid);
133
134
  let mediaSection;
134
- if (idx !== undefined)
135
+ if (idx !== undefined) {
135
136
  mediaSection = this._mediaSections[idx];
137
+ }
136
138
  // Unified-Plan or different media kind.
137
139
  if (!mediaSection) {
138
140
  mediaSection = new MediaSection_1.OfferMediaSection({
@@ -240,8 +242,9 @@ class RemoteSdp {
240
242
  return sdpTransform.write(this._sdpObject);
241
243
  }
242
244
  _addMediaSection(newMediaSection) {
243
- if (!this._firstMid)
245
+ if (!this._firstMid) {
244
246
  this._firstMid = newMediaSection.mid;
247
+ }
245
248
  // Add to the vector.
246
249
  this._mediaSections.push(newMediaSection);
247
250
  // Add to the map.
@@ -288,8 +291,9 @@ class RemoteSdp {
288
291
  return this._mediaSections[idx];
289
292
  }
290
293
  _regenerateBundleMids() {
291
- if (!this._dtlsParameters)
294
+ if (!this._dtlsParameters) {
292
295
  return;
296
+ }
293
297
  this._sdpObject.groups[0].mids = this._mediaSections
294
298
  .filter((mediaSection) => !mediaSection.closed)
295
299
  .map((mediaSection) => mediaSection.mid)
@@ -1 +1 @@
1
- {"version":3,"file":"commonUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/commonUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAY,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACN,eAAe,EAGf,aAAa,EAEb,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,wBAAgB,sBAAsB,CACrC,EAAE,SAAS,EAAE,EACb;IAAE,SAAS,EAAE,GAAG,CAAA;CAAE,GAChB,eAAe,CAuIjB;AAED,wBAAgB,qBAAqB,CACpC,EAAE,SAAS,EAAE,EACb;IAAE,SAAS,EAAE,GAAG,CAAA;CAAE,GAChB,cAAc,CAuChB;AAED,wBAAgB,QAAQ,CACvB,EAAE,gBAAgB,EAAE,EACpB;IAAE,gBAAgB,EAAE,GAAG,CAAA;CAAE,GACvB,MAAM,CASR;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CACnC,EACC,kBAAkB,EAClB,iBAAiB,EACjB,EACD;IACC,kBAAkB,EAAE,aAAa,CAAC;IAClC,iBAAiB,EAAE,GAAG,CAAC;CACvB,GACC,IAAI,CAsDN"}
1
+ {"version":3,"file":"commonUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/commonUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAY,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACN,eAAe,EAGf,aAAa,EAEb,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,wBAAgB,sBAAsB,CACrC,EAAE,SAAS,EAAE,EACb;IAAE,SAAS,EAAE,GAAG,CAAA;CAAE,GAChB,eAAe,CAqJjB;AAED,wBAAgB,qBAAqB,CACpC,EAAE,SAAS,EAAE,EACb;IAAE,SAAS,EAAE,GAAG,CAAA;CAAE,GAChB,cAAc,CAyChB;AAED,wBAAgB,QAAQ,CACvB,EAAE,gBAAgB,EAAE,EACpB;IAAE,gBAAgB,EAAE,GAAG,CAAA;CAAE,GACvB,MAAM,CAWR;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CACnC,EACC,kBAAkB,EAClB,iBAAiB,EACjB,EACD;IACC,kBAAkB,EAAE,aAAa,CAAC;IAClC,iBAAiB,EAAE,GAAG,CAAC;CACvB,GACC,IAAI,CA8DN"}
@@ -42,15 +42,17 @@ function extractRtpCapabilities({ sdpObject }) {
42
42
  switch (kind) {
43
43
  case 'audio':
44
44
  {
45
- if (gotAudio)
45
+ if (gotAudio) {
46
46
  continue;
47
+ }
47
48
  gotAudio = true;
48
49
  break;
49
50
  }
50
51
  case 'video':
51
52
  {
52
- if (gotVideo)
53
+ if (gotVideo) {
53
54
  continue;
55
+ }
54
56
  gotVideo = true;
55
57
  break;
56
58
  }
@@ -76,11 +78,13 @@ function extractRtpCapabilities({ sdpObject }) {
76
78
  for (const fmtp of m.fmtp || []) {
77
79
  const parameters = sdpTransform.parseParams(fmtp.config);
78
80
  const codec = codecsMap.get(fmtp.payload);
79
- if (!codec)
81
+ if (!codec) {
80
82
  continue;
83
+ }
81
84
  // Specials case to convert parameter value to string.
82
- if (parameters && parameters.hasOwnProperty('profile-level-id'))
85
+ if (parameters && parameters.hasOwnProperty('profile-level-id')) {
83
86
  parameters['profile-level-id'] = String(parameters['profile-level-id']);
87
+ }
84
88
  codec.parameters = parameters;
85
89
  }
86
90
  // Get RTCP feedback for each codec.
@@ -89,14 +93,16 @@ function extractRtpCapabilities({ sdpObject }) {
89
93
  type: fb.type,
90
94
  parameter: fb.subtype
91
95
  };
92
- if (!feedback.parameter)
96
+ if (!feedback.parameter) {
93
97
  delete feedback.parameter;
98
+ }
94
99
  // rtcp-fb payload is not '*', so just apply it to its corresponding
95
100
  // codec.
96
101
  if (fb.payload !== '*') {
97
102
  const codec = codecsMap.get(fb.payload);
98
- if (!codec)
103
+ if (!codec) {
99
104
  continue;
105
+ }
100
106
  codec.rtcpFeedback.push(feedback);
101
107
  }
102
108
  // If rtcp-fb payload is '*' it must be applied to all codecs with same
@@ -112,8 +118,9 @@ function extractRtpCapabilities({ sdpObject }) {
112
118
  // Get RTP header extensions.
113
119
  for (const ext of m.ext || []) {
114
120
  // Ignore encrypted extensions (not yet supported in mediasoup).
115
- if (ext['encrypt-uri'])
121
+ if (ext['encrypt-uri']) {
116
122
  continue;
123
+ }
117
124
  const headerExtension = {
118
125
  kind: kind,
119
126
  uri: ext.uri,
@@ -132,8 +139,9 @@ exports.extractRtpCapabilities = extractRtpCapabilities;
132
139
  function extractDtlsParameters({ sdpObject }) {
133
140
  const mediaObject = (sdpObject.media || [])
134
141
  .find((m) => (m.iceUfrag && m.port !== 0));
135
- if (!mediaObject)
142
+ if (!mediaObject) {
136
143
  throw new Error('no active media section found');
144
+ }
137
145
  const fingerprint = mediaObject.fingerprint || sdpObject.fingerprint;
138
146
  let role;
139
147
  switch (mediaObject.setup) {
@@ -162,8 +170,9 @@ exports.extractDtlsParameters = extractDtlsParameters;
162
170
  function getCname({ offerMediaObject }) {
163
171
  const ssrcCnameLine = (offerMediaObject.ssrcs || [])
164
172
  .find((line) => line.attribute === 'cname');
165
- if (!ssrcCnameLine)
173
+ if (!ssrcCnameLine) {
166
174
  return '';
175
+ }
167
176
  return ssrcCnameLine.value;
168
177
  }
169
178
  exports.getCname = getCname;
@@ -175,12 +184,14 @@ function applyCodecParameters({ offerRtpParameters, answerMediaObject }) {
175
184
  for (const codec of offerRtpParameters.codecs) {
176
185
  const mimeType = codec.mimeType.toLowerCase();
177
186
  // Avoid parsing codec parameters for unhandled codecs.
178
- if (mimeType !== 'audio/opus')
187
+ if (mimeType !== 'audio/opus') {
179
188
  continue;
189
+ }
180
190
  const rtp = (answerMediaObject.rtp || [])
181
191
  .find((r) => r.payload === codec.payloadType);
182
- if (!rtp)
192
+ if (!rtp) {
183
193
  continue;
194
+ }
184
195
  // Just in case.
185
196
  answerMediaObject.fmtp = answerMediaObject.fmtp || [];
186
197
  let fmtp = answerMediaObject.fmtp
@@ -194,16 +205,18 @@ function applyCodecParameters({ offerRtpParameters, answerMediaObject }) {
194
205
  case 'audio/opus':
195
206
  {
196
207
  const spropStereo = codec.parameters['sprop-stereo'];
197
- if (spropStereo !== undefined)
208
+ if (spropStereo !== undefined) {
198
209
  parameters.stereo = spropStereo ? 1 : 0;
210
+ }
199
211
  break;
200
212
  }
201
213
  }
202
214
  // Write the codec fmtp.config back.
203
215
  fmtp.config = '';
204
216
  for (const key of Object.keys(parameters)) {
205
- if (fmtp.config)
217
+ if (fmtp.config) {
206
218
  fmtp.config += ';';
219
+ }
207
220
  fmtp.config += `${key}=${parameters[key]}`;
208
221
  }
209
222
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plainRtpUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/plainRtpUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEvE,wBAAgB,yBAAyB,CACxC,EACC,SAAS,EACT,IAAI,EACJ,EACD;IACC,SAAS,EAAE,GAAG,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;CAChB,GAEF;IACC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACb,CAeA;AAED,wBAAgB,eAAe,CAC9B,EACC,SAAS,EACT,IAAI,EACJ,EACD;IACC,SAAS,EAAE,GAAG,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;CAChB,GACC,qBAAqB,EAAE,CAezB"}
1
+ {"version":3,"file":"plainRtpUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/plainRtpUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEvE,wBAAgB,yBAAyB,CACxC,EACC,SAAS,EACT,IAAI,EACJ,EACD;IACC,SAAS,EAAE,GAAG,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;CAChB,GAEF;IACC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACb,CAiBA;AAED,wBAAgB,eAAe,CAC9B,EACC,SAAS,EACT,IAAI,EACJ,EACD;IACC,SAAS,EAAE,GAAG,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;CAChB,GACC,qBAAqB,EAAE,CAqBzB"}
@@ -4,8 +4,9 @@ exports.getRtpEncodings = exports.extractPlainRtpParameters = void 0;
4
4
  function extractPlainRtpParameters({ sdpObject, kind }) {
5
5
  const mediaObject = (sdpObject.media || [])
6
6
  .find((m) => m.type === kind);
7
- if (!mediaObject)
7
+ if (!mediaObject) {
8
8
  throw new Error(`m=${kind} section not found`);
9
+ }
9
10
  const connectionObject = mediaObject.connection || sdpObject.connection;
10
11
  return {
11
12
  ip: connectionObject.ip,
@@ -17,13 +18,16 @@ exports.extractPlainRtpParameters = extractPlainRtpParameters;
17
18
  function getRtpEncodings({ sdpObject, kind }) {
18
19
  const mediaObject = (sdpObject.media || [])
19
20
  .find((m) => m.type === kind);
20
- if (!mediaObject)
21
+ if (!mediaObject) {
21
22
  throw new Error(`m=${kind} section not found`);
23
+ }
22
24
  const ssrcCnameLine = (mediaObject.ssrcs || [])[0];
23
25
  const ssrc = ssrcCnameLine ? ssrcCnameLine.id : null;
24
- if (ssrc)
26
+ if (ssrc) {
25
27
  return [{ ssrc }];
26
- else
28
+ }
29
+ else {
27
30
  return [];
31
+ }
28
32
  }
29
33
  exports.getRtpEncodings = getRtpEncodings;
@@ -1 +1 @@
1
- {"version":3,"file":"planBUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/planBUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,wBAAgB,eAAe,CAC9B,EACC,gBAAgB,EAChB,KAAK,EACL,EACD;IACC,gBAAgB,EAAE,GAAG,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;CACxB,GACC,qBAAqB,EAAE,CAyEzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,EACC,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,EACD;IACC,gBAAgB,EAAE,GAAG,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACnB,GACC,IAAI,CA8HN"}
1
+ {"version":3,"file":"planBUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/planBUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,wBAAgB,eAAe,CAC9B,EACC,gBAAgB,EAChB,KAAK,EACL,EACD;IACC,gBAAgB,EAAE,GAAG,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;CACxB,GACC,qBAAqB,EAAE,CAmFzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,EACC,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,EACD;IACC,gBAAgB,EAAE,GAAG,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACnB,GACC,IAAI,CA0IN"}
@@ -6,23 +6,27 @@ function getRtpEncodings({ offerMediaObject, track }) {
6
6
  let firstSsrc;
7
7
  const ssrcs = new Set();
8
8
  for (const line of offerMediaObject.ssrcs || []) {
9
- if (line.attribute !== 'msid')
9
+ if (line.attribute !== 'msid') {
10
10
  continue;
11
+ }
11
12
  const trackId = line.value.split(' ')[1];
12
13
  if (trackId === track.id) {
13
14
  const ssrc = line.id;
14
15
  ssrcs.add(ssrc);
15
- if (!firstSsrc)
16
+ if (!firstSsrc) {
16
17
  firstSsrc = ssrc;
18
+ }
17
19
  }
18
20
  }
19
- if (ssrcs.size === 0)
21
+ if (ssrcs.size === 0) {
20
22
  throw new Error(`a=ssrc line with msid information not found [track.id:${track.id}]`);
23
+ }
21
24
  const ssrcToRtxSsrc = new Map();
22
25
  // First assume RTX is used.
23
26
  for (const line of offerMediaObject.ssrcGroups || []) {
24
- if (line.semantics !== 'FID')
27
+ if (line.semantics !== 'FID') {
25
28
  continue;
29
+ }
26
30
  let [ssrc, rtxSsrc] = line.ssrcs.split(/\s+/);
27
31
  ssrc = Number(ssrc);
28
32
  rtxSsrc = Number(rtxSsrc);
@@ -44,8 +48,9 @@ function getRtpEncodings({ offerMediaObject, track }) {
44
48
  const encodings = [];
45
49
  for (const [ssrc, rtxSsrc] of ssrcToRtxSsrc) {
46
50
  const encoding = { ssrc };
47
- if (rtxSsrc)
51
+ if (rtxSsrc) {
48
52
  encoding.rtx = { ssrc: rtxSsrc };
53
+ }
49
54
  encodings.push(encoding);
50
55
  }
51
56
  return encodings;
@@ -55,16 +60,18 @@ exports.getRtpEncodings = getRtpEncodings;
55
60
  * Adds multi-ssrc based simulcast into the given SDP media section offer.
56
61
  */
57
62
  function addLegacySimulcast({ offerMediaObject, track, numStreams }) {
58
- if (numStreams <= 1)
63
+ if (numStreams <= 1) {
59
64
  throw new TypeError('numStreams must be greater than 1');
65
+ }
60
66
  let firstSsrc;
61
67
  let firstRtxSsrc;
62
68
  let streamId;
63
69
  // Get the SSRC.
64
70
  const ssrcMsidLine = (offerMediaObject.ssrcs || [])
65
71
  .find((line) => {
66
- if (line.attribute !== 'msid')
72
+ if (line.attribute !== 'msid') {
67
73
  return false;
74
+ }
68
75
  const trackId = line.value.split(' ')[1];
69
76
  if (trackId === track.id) {
70
77
  firstSsrc = line.id;
@@ -75,13 +82,15 @@ function addLegacySimulcast({ offerMediaObject, track, numStreams }) {
75
82
  return false;
76
83
  }
77
84
  });
78
- if (!ssrcMsidLine)
85
+ if (!ssrcMsidLine) {
79
86
  throw new Error(`a=ssrc line with msid information not found [track.id:${track.id}]`);
87
+ }
80
88
  // Get the SSRC for RTX.
81
89
  (offerMediaObject.ssrcGroups || [])
82
90
  .some((line) => {
83
- if (line.semantics !== 'FID')
91
+ if (line.semantics !== 'FID') {
84
92
  return false;
93
+ }
85
94
  const ssrcs = line.ssrcs.split(/\s+/);
86
95
  if (Number(ssrcs[0]) === firstSsrc) {
87
96
  firstRtxSsrc = Number(ssrcs[1]);
@@ -93,15 +102,17 @@ function addLegacySimulcast({ offerMediaObject, track, numStreams }) {
93
102
  });
94
103
  const ssrcCnameLine = offerMediaObject.ssrcs
95
104
  .find((line) => (line.attribute === 'cname' && line.id === firstSsrc));
96
- if (!ssrcCnameLine)
105
+ if (!ssrcCnameLine) {
97
106
  throw new Error(`a=ssrc line with cname information not found [track.id:${track.id}]`);
107
+ }
98
108
  const cname = ssrcCnameLine.value;
99
109
  const ssrcs = [];
100
110
  const rtxSsrcs = [];
101
111
  for (let i = 0; i < numStreams; ++i) {
102
112
  ssrcs.push(firstSsrc + i);
103
- if (firstRtxSsrc)
113
+ if (firstRtxSsrc) {
104
114
  rtxSsrcs.push(firstRtxSsrc + i);
115
+ }
105
116
  }
106
117
  offerMediaObject.ssrcGroups = offerMediaObject.ssrcGroups || [];
107
118
  offerMediaObject.ssrcs = offerMediaObject.ssrcs || [];
@@ -1 +1 @@
1
- {"version":3,"file":"unifiedPlanUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/unifiedPlanUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,wBAAgB,eAAe,CAC9B,EAAE,gBAAgB,EAAE,EACpB;IAAE,gBAAgB,EAAE,GAAG,CAAA;CAAE,GACvB,qBAAqB,EAAE,CA4DzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,EACC,gBAAgB,EAChB,UAAU,EACV,EACD;IACC,gBAAgB,EAAE,GAAG,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACnB,GACC,IAAI,CA4GN"}
1
+ {"version":3,"file":"unifiedPlanUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/unifiedPlanUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,wBAAgB,eAAe,CAC9B,EAAE,gBAAgB,EAAE,EACpB;IAAE,gBAAgB,EAAE,GAAG,CAAA;CAAE,GACvB,qBAAqB,EAAE,CAkEzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,EACC,gBAAgB,EAChB,UAAU,EACV,EACD;IACC,gBAAgB,EAAE,GAAG,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACnB,GACC,IAAI,CAsHN"}
@@ -7,13 +7,15 @@ function getRtpEncodings({ offerMediaObject }) {
7
7
  const ssrc = line.id;
8
8
  ssrcs.add(ssrc);
9
9
  }
10
- if (ssrcs.size === 0)
10
+ if (ssrcs.size === 0) {
11
11
  throw new Error('no a=ssrc lines found');
12
+ }
12
13
  const ssrcToRtxSsrc = new Map();
13
14
  // First assume RTX is used.
14
15
  for (const line of offerMediaObject.ssrcGroups || []) {
15
- if (line.semantics !== 'FID')
16
+ if (line.semantics !== 'FID') {
16
17
  continue;
18
+ }
17
19
  let [ssrc, rtxSsrc] = line.ssrcs.split(/\s+/);
18
20
  ssrc = Number(ssrc);
19
21
  rtxSsrc = Number(rtxSsrc);
@@ -35,8 +37,9 @@ function getRtpEncodings({ offerMediaObject }) {
35
37
  const encodings = [];
36
38
  for (const [ssrc, rtxSsrc] of ssrcToRtxSsrc) {
37
39
  const encoding = { ssrc };
38
- if (rtxSsrc)
40
+ if (rtxSsrc) {
39
41
  encoding.rtx = { ssrc: rtxSsrc };
42
+ }
40
43
  encodings.push(encoding);
41
44
  }
42
45
  return encodings;
@@ -46,21 +49,24 @@ exports.getRtpEncodings = getRtpEncodings;
46
49
  * Adds multi-ssrc based simulcast into the given SDP media section offer.
47
50
  */
48
51
  function addLegacySimulcast({ offerMediaObject, numStreams }) {
49
- if (numStreams <= 1)
52
+ if (numStreams <= 1) {
50
53
  throw new TypeError('numStreams must be greater than 1');
54
+ }
51
55
  // Get the SSRC.
52
56
  const ssrcMsidLine = (offerMediaObject.ssrcs || [])
53
57
  .find((line) => line.attribute === 'msid');
54
- if (!ssrcMsidLine)
58
+ if (!ssrcMsidLine) {
55
59
  throw new Error('a=ssrc line with msid information not found');
60
+ }
56
61
  const [streamId, trackId] = ssrcMsidLine.value.split(' ');
57
62
  const firstSsrc = ssrcMsidLine.id;
58
63
  let firstRtxSsrc;
59
64
  // Get the SSRC for RTX.
60
65
  (offerMediaObject.ssrcGroups || [])
61
66
  .some((line) => {
62
- if (line.semantics !== 'FID')
67
+ if (line.semantics !== 'FID') {
63
68
  return false;
69
+ }
64
70
  const ssrcs = line.ssrcs.split(/\s+/);
65
71
  if (Number(ssrcs[0]) === firstSsrc) {
66
72
  firstRtxSsrc = Number(ssrcs[1]);
@@ -72,15 +78,17 @@ function addLegacySimulcast({ offerMediaObject, numStreams }) {
72
78
  });
73
79
  const ssrcCnameLine = offerMediaObject.ssrcs
74
80
  .find((line) => line.attribute === 'cname');
75
- if (!ssrcCnameLine)
81
+ if (!ssrcCnameLine) {
76
82
  throw new Error('a=ssrc line with cname information not found');
83
+ }
77
84
  const cname = ssrcCnameLine.value;
78
85
  const ssrcs = [];
79
86
  const rtxSsrcs = [];
80
87
  for (let i = 0; i < numStreams; ++i) {
81
88
  ssrcs.push(firstSsrc + i);
82
- if (firstRtxSsrc)
89
+ if (firstRtxSsrc) {
83
90
  rtxSsrcs.push(firstRtxSsrc + i);
91
+ }
84
92
  }
85
93
  offerMediaObject.ssrcGroups = [];
86
94
  offerMediaObject.ssrcs = [];
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.80";
11
+ export declare const version = "3.6.81";
12
12
  /**
13
13
  * Expose Device class and detectDevice() helper.
14
14
  */
package/lib/index.js CHANGED
@@ -37,7 +37,7 @@ exports.types = types;
37
37
  /**
38
38
  * Expose mediasoup-client version.
39
39
  */
40
- exports.version = '3.6.80';
40
+ exports.version = '3.6.81';
41
41
  /**
42
42
  * Expose parseScalabilityMode() function.
43
43
  */