mediasoup-client 3.7.1 → 3.7.2

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 (105) hide show
  1. package/README.md +85 -112
  2. package/lib/Consumer.d.ts +1 -1
  3. package/lib/Consumer.d.ts.map +1 -1
  4. package/lib/Consumer.js +1 -1
  5. package/lib/DataConsumer.d.ts +1 -1
  6. package/lib/DataConsumer.d.ts.map +1 -1
  7. package/lib/DataConsumer.js +1 -1
  8. package/lib/DataProducer.d.ts +1 -1
  9. package/lib/DataProducer.d.ts.map +1 -1
  10. package/lib/DataProducer.js +1 -1
  11. package/lib/Device.d.ts +3 -3
  12. package/lib/Device.d.ts.map +1 -1
  13. package/lib/Device.js +66 -89
  14. package/lib/EnhancedEventEmitter.d.ts.map +1 -1
  15. package/lib/Logger.d.ts.map +1 -1
  16. package/lib/Producer.d.ts +5 -15
  17. package/lib/Producer.d.ts.map +1 -1
  18. package/lib/Producer.js +2 -2
  19. package/lib/RtpParameters.d.ts.map +1 -1
  20. package/lib/SctpParameters.d.ts.map +1 -1
  21. package/lib/Transport.d.ts +14 -10
  22. package/lib/Transport.d.ts.map +1 -1
  23. package/lib/Transport.js +71 -53
  24. package/lib/errors.d.ts.map +1 -1
  25. package/lib/errors.js +6 -6
  26. package/lib/handlers/Chrome111.d.ts +4 -4
  27. package/lib/handlers/Chrome111.d.ts.map +1 -1
  28. package/lib/handlers/Chrome111.js +74 -77
  29. package/lib/handlers/Chrome55.d.ts +4 -4
  30. package/lib/handlers/Chrome55.d.ts.map +1 -1
  31. package/lib/handlers/Chrome55.js +83 -80
  32. package/lib/handlers/Chrome67.d.ts +4 -4
  33. package/lib/handlers/Chrome67.d.ts.map +1 -1
  34. package/lib/handlers/Chrome67.js +85 -83
  35. package/lib/handlers/Chrome70.d.ts +4 -4
  36. package/lib/handlers/Chrome70.d.ts.map +1 -1
  37. package/lib/handlers/Chrome70.js +76 -78
  38. package/lib/handlers/Chrome74.d.ts +4 -4
  39. package/lib/handlers/Chrome74.d.ts.map +1 -1
  40. package/lib/handlers/Chrome74.js +75 -78
  41. package/lib/handlers/Edge11.d.ts +1 -1
  42. package/lib/handlers/Edge11.d.ts.map +1 -1
  43. package/lib/handlers/Edge11.js +63 -77
  44. package/lib/handlers/FakeHandler.d.ts +3 -3
  45. package/lib/handlers/FakeHandler.d.ts.map +1 -1
  46. package/lib/handlers/FakeHandler.js +19 -22
  47. package/lib/handlers/Firefox60.d.ts +4 -4
  48. package/lib/handlers/Firefox60.d.ts.map +1 -1
  49. package/lib/handlers/Firefox60.js +75 -72
  50. package/lib/handlers/HandlerInterface.d.ts.map +1 -1
  51. package/lib/handlers/ReactNative.d.ts +4 -4
  52. package/lib/handlers/ReactNative.d.ts.map +1 -1
  53. package/lib/handlers/ReactNative.js +84 -82
  54. package/lib/handlers/ReactNativeUnifiedPlan.d.ts +4 -4
  55. package/lib/handlers/ReactNativeUnifiedPlan.d.ts.map +1 -1
  56. package/lib/handlers/ReactNativeUnifiedPlan.js +75 -78
  57. package/lib/handlers/Safari11.d.ts +4 -4
  58. package/lib/handlers/Safari11.d.ts.map +1 -1
  59. package/lib/handlers/Safari11.js +84 -81
  60. package/lib/handlers/Safari12.d.ts +4 -4
  61. package/lib/handlers/Safari12.d.ts.map +1 -1
  62. package/lib/handlers/Safari12.js +75 -77
  63. package/lib/handlers/ortc/edgeUtils.d.ts.map +1 -1
  64. package/lib/handlers/ortc/utils.d.ts.map +1 -1
  65. package/lib/handlers/ortc/utils.js +2 -2
  66. package/lib/handlers/sdp/MediaSection.d.ts +5 -5
  67. package/lib/handlers/sdp/MediaSection.d.ts.map +1 -1
  68. package/lib/handlers/sdp/MediaSection.js +293 -317
  69. package/lib/handlers/sdp/RemoteSdp.d.ts +5 -5
  70. package/lib/handlers/sdp/RemoteSdp.d.ts.map +1 -1
  71. package/lib/handlers/sdp/RemoteSdp.js +28 -30
  72. package/lib/handlers/sdp/commonUtils.d.ts +4 -4
  73. package/lib/handlers/sdp/commonUtils.d.ts.map +1 -1
  74. package/lib/handlers/sdp/commonUtils.js +47 -58
  75. package/lib/handlers/sdp/plainRtpUtils.d.ts +2 -2
  76. package/lib/handlers/sdp/plainRtpUtils.d.ts.map +1 -1
  77. package/lib/handlers/sdp/plainRtpUtils.js +5 -7
  78. package/lib/handlers/sdp/planBUtils.d.ts +2 -2
  79. package/lib/handlers/sdp/planBUtils.d.ts.map +1 -1
  80. package/lib/handlers/sdp/planBUtils.js +11 -14
  81. package/lib/handlers/sdp/unifiedPlanUtils.d.ts +2 -2
  82. package/lib/handlers/sdp/unifiedPlanUtils.d.ts.map +1 -1
  83. package/lib/handlers/sdp/unifiedPlanUtils.js +11 -14
  84. package/lib/index.d.ts +1 -1
  85. package/lib/index.js +1 -1
  86. package/lib/ortc.d.ts.map +1 -1
  87. package/lib/ortc.js +98 -108
  88. package/lib/scalabilityModes.d.ts.map +1 -1
  89. package/lib/scalabilityModes.js +2 -2
  90. package/lib/{tests → test}/fakeParameters.d.ts +2 -2
  91. package/lib/test/fakeParameters.d.ts.map +1 -0
  92. package/lib/test/fakeParameters.js +645 -0
  93. package/lib/{tests → test}/test.d.ts.map +1 -1
  94. package/lib/{tests → test}/test.js +466 -495
  95. package/lib/test/uaTestCases.d.ts.map +1 -0
  96. package/lib/{tests → test}/uaTestCases.js +17 -17
  97. package/lib/types.d.ts.map +1 -1
  98. package/lib/utils.d.ts.map +1 -1
  99. package/npm-scripts.mjs +72 -98
  100. package/package.json +93 -90
  101. package/lib/tests/fakeParameters.d.ts.map +0 -1
  102. package/lib/tests/fakeParameters.js +0 -662
  103. package/lib/tests/uaTestCases.d.ts.map +0 -1
  104. /package/lib/{tests → test}/test.d.ts +0 -0
  105. /package/lib/{tests → test}/uaTestCases.d.ts +0 -0
@@ -27,7 +27,7 @@ exports.OfferMediaSection = exports.AnswerMediaSection = exports.MediaSection =
27
27
  const sdpTransform = __importStar(require("sdp-transform"));
28
28
  const utils = __importStar(require("../../utils"));
29
29
  class MediaSection {
30
- constructor({ iceParameters, iceCandidates, dtlsParameters, planB = false }) {
30
+ constructor({ iceParameters, iceCandidates, dtlsParameters, planB = false, }) {
31
31
  this._mediaObject = {};
32
32
  this._planB = planB;
33
33
  if (iceParameters) {
@@ -91,7 +91,7 @@ class MediaSection {
91
91
  }
92
92
  exports.MediaSection = MediaSection;
93
93
  class AnswerMediaSection extends MediaSection {
94
- constructor({ iceParameters, iceCandidates, dtlsParameters, sctpParameters, plainRtpParameters, planB = false, offerMediaObject, offerRtpParameters, answerRtpParameters, codecOptions, extmapAllowMixed = false }) {
94
+ constructor({ iceParameters, iceCandidates, dtlsParameters, sctpParameters, plainRtpParameters, planB = false, offerMediaObject, offerRtpParameters, answerRtpParameters, codecOptions, extmapAllowMixed = false, }) {
95
95
  super({ iceParameters, iceCandidates, dtlsParameters, planB });
96
96
  this._mediaObject.mid = String(offerMediaObject.mid);
97
97
  this._mediaObject.type = offerMediaObject.type;
@@ -101,217 +101,204 @@ class AnswerMediaSection extends MediaSection {
101
101
  this._mediaObject.port = 7;
102
102
  }
103
103
  else {
104
- this._mediaObject.connection =
105
- {
106
- ip: plainRtpParameters.ip,
107
- version: plainRtpParameters.ipVersion
108
- };
104
+ this._mediaObject.connection = {
105
+ ip: plainRtpParameters.ip,
106
+ version: plainRtpParameters.ipVersion,
107
+ };
109
108
  this._mediaObject.port = plainRtpParameters.port;
110
109
  }
111
110
  switch (offerMediaObject.type) {
112
111
  case 'audio':
113
- case 'video':
114
- {
115
- this._mediaObject.direction = 'recvonly';
116
- this._mediaObject.rtp = [];
117
- this._mediaObject.rtcpFb = [];
118
- this._mediaObject.fmtp = [];
119
- for (const codec of answerRtpParameters.codecs) {
120
- const rtp = {
121
- payload: codec.payloadType,
122
- codec: getCodecName(codec),
123
- rate: codec.clockRate
124
- };
125
- if (codec.channels > 1) {
126
- rtp.encoding = codec.channels;
127
- }
128
- this._mediaObject.rtp.push(rtp);
129
- const codecParameters = utils.clone(codec.parameters) ?? {};
130
- let codecRtcpFeedback = utils.clone(codec.rtcpFeedback) ?? [];
131
- if (codecOptions) {
132
- const { opusStereo, opusFec, opusDtx, opusMaxPlaybackRate, opusMaxAverageBitrate, opusPtime, opusNack, videoGoogleStartBitrate, videoGoogleMaxBitrate, videoGoogleMinBitrate } = codecOptions;
133
- const offerCodec = offerRtpParameters.codecs
134
- .find((c) => (c.payloadType === codec.payloadType));
135
- switch (codec.mimeType.toLowerCase()) {
136
- case 'audio/opus':
137
- case 'audio/multiopus':
138
- {
139
- if (opusStereo !== undefined) {
140
- offerCodec.parameters['sprop-stereo'] = opusStereo ? 1 : 0;
141
- codecParameters.stereo = opusStereo ? 1 : 0;
142
- }
143
- if (opusFec !== undefined) {
144
- offerCodec.parameters.useinbandfec = opusFec ? 1 : 0;
145
- codecParameters.useinbandfec = opusFec ? 1 : 0;
146
- }
147
- if (opusDtx !== undefined) {
148
- offerCodec.parameters.usedtx = opusDtx ? 1 : 0;
149
- codecParameters.usedtx = opusDtx ? 1 : 0;
150
- }
151
- if (opusMaxPlaybackRate !== undefined) {
152
- codecParameters.maxplaybackrate = opusMaxPlaybackRate;
153
- }
154
- if (opusMaxAverageBitrate !== undefined) {
155
- codecParameters.maxaveragebitrate = opusMaxAverageBitrate;
156
- }
157
- if (opusPtime !== undefined) {
158
- offerCodec.parameters.ptime = opusPtime;
159
- codecParameters.ptime = opusPtime;
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
- }
171
- break;
172
- }
173
- case 'video/vp8':
174
- case 'video/vp9':
175
- case 'video/h264':
176
- case 'video/h265':
177
- {
178
- if (videoGoogleStartBitrate !== undefined) {
179
- codecParameters['x-google-start-bitrate'] = videoGoogleStartBitrate;
180
- }
181
- if (videoGoogleMaxBitrate !== undefined) {
182
- codecParameters['x-google-max-bitrate'] = videoGoogleMaxBitrate;
183
- }
184
- if (videoGoogleMinBitrate !== undefined) {
185
- codecParameters['x-google-min-bitrate'] = videoGoogleMinBitrate;
186
- }
187
- break;
188
- }
112
+ case 'video': {
113
+ this._mediaObject.direction = 'recvonly';
114
+ this._mediaObject.rtp = [];
115
+ this._mediaObject.rtcpFb = [];
116
+ this._mediaObject.fmtp = [];
117
+ for (const codec of answerRtpParameters.codecs) {
118
+ const rtp = {
119
+ payload: codec.payloadType,
120
+ codec: getCodecName(codec),
121
+ rate: codec.clockRate,
122
+ };
123
+ if (codec.channels > 1) {
124
+ rtp.encoding = codec.channels;
125
+ }
126
+ this._mediaObject.rtp.push(rtp);
127
+ const codecParameters = utils.clone(codec.parameters) ?? {};
128
+ let codecRtcpFeedback = utils.clone(codec.rtcpFeedback) ?? [];
129
+ if (codecOptions) {
130
+ const { opusStereo, opusFec, opusDtx, opusMaxPlaybackRate, opusMaxAverageBitrate, opusPtime, opusNack, videoGoogleStartBitrate, videoGoogleMaxBitrate, videoGoogleMinBitrate, } = codecOptions;
131
+ const offerCodec = offerRtpParameters.codecs.find((c) => c.payloadType === codec.payloadType);
132
+ switch (codec.mimeType.toLowerCase()) {
133
+ case 'audio/opus':
134
+ case 'audio/multiopus': {
135
+ if (opusStereo !== undefined) {
136
+ offerCodec.parameters['sprop-stereo'] = opusStereo ? 1 : 0;
137
+ codecParameters.stereo = opusStereo ? 1 : 0;
138
+ }
139
+ if (opusFec !== undefined) {
140
+ offerCodec.parameters.useinbandfec = opusFec ? 1 : 0;
141
+ codecParameters.useinbandfec = opusFec ? 1 : 0;
142
+ }
143
+ if (opusDtx !== undefined) {
144
+ offerCodec.parameters.usedtx = opusDtx ? 1 : 0;
145
+ codecParameters.usedtx = opusDtx ? 1 : 0;
146
+ }
147
+ if (opusMaxPlaybackRate !== undefined) {
148
+ codecParameters.maxplaybackrate = opusMaxPlaybackRate;
149
+ }
150
+ if (opusMaxAverageBitrate !== undefined) {
151
+ codecParameters.maxaveragebitrate = opusMaxAverageBitrate;
152
+ }
153
+ if (opusPtime !== undefined) {
154
+ offerCodec.parameters.ptime = opusPtime;
155
+ codecParameters.ptime = opusPtime;
156
+ }
157
+ // If opusNack is not set, we must remove NACK support for OPUS.
158
+ // Otherwise it would be enabled for those handlers that artificially
159
+ // announce it in their RTP capabilities.
160
+ if (!opusNack) {
161
+ offerCodec.rtcpFeedback = offerCodec.rtcpFeedback.filter(fb => fb.type !== 'nack' || fb.parameter);
162
+ codecRtcpFeedback = codecRtcpFeedback.filter(fb => fb.type !== 'nack' || fb.parameter);
163
+ }
164
+ break;
189
165
  }
190
- }
191
- const fmtp = {
192
- payload: codec.payloadType,
193
- config: ''
194
- };
195
- for (const key of Object.keys(codecParameters)) {
196
- if (fmtp.config) {
197
- fmtp.config += ';';
166
+ case 'video/vp8':
167
+ case 'video/vp9':
168
+ case 'video/h264':
169
+ case 'video/h265': {
170
+ if (videoGoogleStartBitrate !== undefined) {
171
+ codecParameters['x-google-start-bitrate'] =
172
+ videoGoogleStartBitrate;
173
+ }
174
+ if (videoGoogleMaxBitrate !== undefined) {
175
+ codecParameters['x-google-max-bitrate'] =
176
+ videoGoogleMaxBitrate;
177
+ }
178
+ if (videoGoogleMinBitrate !== undefined) {
179
+ codecParameters['x-google-min-bitrate'] =
180
+ videoGoogleMinBitrate;
181
+ }
182
+ break;
198
183
  }
199
- fmtp.config += `${key}=${codecParameters[key]}`;
200
184
  }
185
+ }
186
+ const fmtp = {
187
+ payload: codec.payloadType,
188
+ config: '',
189
+ };
190
+ for (const key of Object.keys(codecParameters)) {
201
191
  if (fmtp.config) {
202
- this._mediaObject.fmtp.push(fmtp);
203
- }
204
- for (const fb of codecRtcpFeedback) {
205
- this._mediaObject.rtcpFb.push({
206
- payload: codec.payloadType,
207
- type: fb.type,
208
- subtype: fb.parameter
209
- });
192
+ fmtp.config += ';';
210
193
  }
194
+ fmtp.config += `${key}=${codecParameters[key]}`;
211
195
  }
212
- this._mediaObject.payloads = answerRtpParameters.codecs
213
- .map((codec) => codec.payloadType)
214
- .join(' ');
215
- this._mediaObject.ext = [];
216
- for (const ext of answerRtpParameters.headerExtensions) {
217
- // Don't add a header extension if not present in the offer.
218
- const found = (offerMediaObject.ext || [])
219
- .some((localExt) => localExt.uri === ext.uri);
220
- if (!found) {
221
- continue;
222
- }
223
- this._mediaObject.ext.push({
224
- uri: ext.uri,
225
- value: ext.id
196
+ if (fmtp.config) {
197
+ this._mediaObject.fmtp.push(fmtp);
198
+ }
199
+ for (const fb of codecRtcpFeedback) {
200
+ this._mediaObject.rtcpFb.push({
201
+ payload: codec.payloadType,
202
+ type: fb.type,
203
+ subtype: fb.parameter,
226
204
  });
227
205
  }
228
- // Allow both 1 byte and 2 bytes length header extensions.
229
- if (extmapAllowMixed &&
230
- offerMediaObject.extmapAllowMixed === 'extmap-allow-mixed') {
231
- this._mediaObject.extmapAllowMixed = 'extmap-allow-mixed';
206
+ }
207
+ this._mediaObject.payloads = answerRtpParameters.codecs
208
+ .map((codec) => codec.payloadType)
209
+ .join(' ');
210
+ this._mediaObject.ext = [];
211
+ for (const ext of answerRtpParameters.headerExtensions) {
212
+ // Don't add a header extension if not present in the offer.
213
+ const found = (offerMediaObject.ext || []).some((localExt) => localExt.uri === ext.uri);
214
+ if (!found) {
215
+ continue;
232
216
  }
233
- // Simulcast.
234
- if (offerMediaObject.simulcast) {
235
- this._mediaObject.simulcast =
236
- {
237
- dir1: 'recv',
238
- list1: offerMediaObject.simulcast.list1
239
- };
240
- this._mediaObject.rids = [];
241
- for (const rid of offerMediaObject.rids || []) {
242
- if (rid.direction !== 'send') {
243
- continue;
244
- }
245
- this._mediaObject.rids.push({
246
- id: rid.id,
247
- direction: 'recv'
248
- });
217
+ this._mediaObject.ext.push({
218
+ uri: ext.uri,
219
+ value: ext.id,
220
+ });
221
+ }
222
+ // Allow both 1 byte and 2 bytes length header extensions.
223
+ if (extmapAllowMixed &&
224
+ offerMediaObject.extmapAllowMixed === 'extmap-allow-mixed') {
225
+ this._mediaObject.extmapAllowMixed = 'extmap-allow-mixed';
226
+ }
227
+ // Simulcast.
228
+ if (offerMediaObject.simulcast) {
229
+ this._mediaObject.simulcast = {
230
+ dir1: 'recv',
231
+ list1: offerMediaObject.simulcast.list1,
232
+ };
233
+ this._mediaObject.rids = [];
234
+ for (const rid of offerMediaObject.rids || []) {
235
+ if (rid.direction !== 'send') {
236
+ continue;
249
237
  }
238
+ this._mediaObject.rids.push({
239
+ id: rid.id,
240
+ direction: 'recv',
241
+ });
250
242
  }
251
- // Simulcast (draft version 03).
252
- else if (offerMediaObject.simulcast_03) {
253
- // eslint-disable-next-line camelcase
254
- this._mediaObject.simulcast_03 =
255
- {
256
- value: offerMediaObject.simulcast_03.value.replace(/send/g, 'recv')
257
- };
258
- this._mediaObject.rids = [];
259
- for (const rid of offerMediaObject.rids || []) {
260
- if (rid.direction !== 'send') {
261
- continue;
262
- }
263
- this._mediaObject.rids.push({
264
- id: rid.id,
265
- direction: 'recv'
266
- });
243
+ }
244
+ // Simulcast (draft version 03).
245
+ else if (offerMediaObject.simulcast_03) {
246
+ // eslint-disable-next-line camelcase
247
+ this._mediaObject.simulcast_03 = {
248
+ value: offerMediaObject.simulcast_03.value.replace(/send/g, 'recv'),
249
+ };
250
+ this._mediaObject.rids = [];
251
+ for (const rid of offerMediaObject.rids || []) {
252
+ if (rid.direction !== 'send') {
253
+ continue;
267
254
  }
255
+ this._mediaObject.rids.push({
256
+ id: rid.id,
257
+ direction: 'recv',
258
+ });
268
259
  }
269
- this._mediaObject.rtcpMux = 'rtcp-mux';
270
- this._mediaObject.rtcpRsize = 'rtcp-rsize';
271
- if (this._planB && this._mediaObject.type === 'video') {
272
- this._mediaObject.xGoogleFlag = 'conference';
273
- }
274
- break;
275
260
  }
276
- case 'application':
277
- {
278
- // New spec.
279
- if (typeof offerMediaObject.sctpPort === 'number') {
280
- this._mediaObject.payloads = 'webrtc-datachannel';
281
- this._mediaObject.sctpPort = sctpParameters.port;
282
- this._mediaObject.maxMessageSize = sctpParameters.maxMessageSize;
283
- }
284
- // Old spec.
285
- else if (offerMediaObject.sctpmap) {
286
- this._mediaObject.payloads = sctpParameters.port;
287
- this._mediaObject.sctpmap =
288
- {
289
- app: 'webrtc-datachannel',
290
- sctpmapNumber: sctpParameters.port,
291
- maxMessageSize: sctpParameters.maxMessageSize
292
- };
293
- }
294
- break;
261
+ this._mediaObject.rtcpMux = 'rtcp-mux';
262
+ this._mediaObject.rtcpRsize = 'rtcp-rsize';
263
+ if (this._planB && this._mediaObject.type === 'video') {
264
+ this._mediaObject.xGoogleFlag = 'conference';
295
265
  }
266
+ break;
267
+ }
268
+ case 'application': {
269
+ // New spec.
270
+ if (typeof offerMediaObject.sctpPort === 'number') {
271
+ this._mediaObject.payloads = 'webrtc-datachannel';
272
+ this._mediaObject.sctpPort = sctpParameters.port;
273
+ this._mediaObject.maxMessageSize = sctpParameters.maxMessageSize;
274
+ }
275
+ // Old spec.
276
+ else if (offerMediaObject.sctpmap) {
277
+ this._mediaObject.payloads = sctpParameters.port;
278
+ this._mediaObject.sctpmap = {
279
+ app: 'webrtc-datachannel',
280
+ sctpmapNumber: sctpParameters.port,
281
+ maxMessageSize: sctpParameters.maxMessageSize,
282
+ };
283
+ }
284
+ break;
285
+ }
296
286
  }
297
287
  }
298
288
  setDtlsRole(role) {
299
289
  switch (role) {
300
- case 'client':
301
- {
302
- this._mediaObject.setup = 'active';
303
- break;
304
- }
305
- case 'server':
306
- {
307
- this._mediaObject.setup = 'passive';
308
- break;
309
- }
310
- case 'auto':
311
- {
312
- this._mediaObject.setup = 'actpass';
313
- break;
314
- }
290
+ case 'client': {
291
+ this._mediaObject.setup = 'active';
292
+ break;
293
+ }
294
+ case 'server': {
295
+ this._mediaObject.setup = 'passive';
296
+ break;
297
+ }
298
+ case 'auto': {
299
+ this._mediaObject.setup = 'actpass';
300
+ break;
301
+ }
315
302
  }
316
303
  }
317
304
  resume() {
@@ -334,12 +321,14 @@ class AnswerMediaSection extends MediaSection {
334
321
  simulcastFormat.paused = !layers[simulcastFormat.scid]?.active;
335
322
  }
336
323
  }
337
- this._mediaObject.simulcast.list1 = simulcastStreams.map((simulcastFormats) => simulcastFormats.map((f) => `${f.paused ? '~' : ''}${f.scid}`).join(',')).join(';');
324
+ this._mediaObject.simulcast.list1 = simulcastStreams
325
+ .map(simulcastFormats => simulcastFormats.map(f => `${f.paused ? '~' : ''}${f.scid}`).join(','))
326
+ .join(';');
338
327
  }
339
328
  }
340
329
  exports.AnswerMediaSection = AnswerMediaSection;
341
330
  class OfferMediaSection extends MediaSection {
342
- constructor({ iceParameters, iceCandidates, dtlsParameters, sctpParameters, plainRtpParameters, planB = false, mid, kind, offerRtpParameters, streamId, trackId, oldDataChannelSpec = false }) {
331
+ constructor({ iceParameters, iceCandidates, dtlsParameters, sctpParameters, plainRtpParameters, planB = false, mid, kind, offerRtpParameters, streamId, trackId, oldDataChannelSpec = false, }) {
343
332
  super({ iceParameters, iceCandidates, dtlsParameters, planB });
344
333
  this._mediaObject.mid = String(mid);
345
334
  this._mediaObject.type = kind;
@@ -354,132 +343,126 @@ class OfferMediaSection extends MediaSection {
354
343
  this._mediaObject.port = 7;
355
344
  }
356
345
  else {
357
- this._mediaObject.connection =
358
- {
359
- ip: plainRtpParameters.ip,
360
- version: plainRtpParameters.ipVersion
361
- };
346
+ this._mediaObject.connection = {
347
+ ip: plainRtpParameters.ip,
348
+ version: plainRtpParameters.ipVersion,
349
+ };
362
350
  this._mediaObject.protocol = 'RTP/AVP';
363
351
  this._mediaObject.port = plainRtpParameters.port;
364
352
  }
365
353
  switch (kind) {
366
354
  case 'audio':
367
- case 'video':
368
- {
369
- this._mediaObject.direction = 'sendonly';
370
- this._mediaObject.rtp = [];
371
- this._mediaObject.rtcpFb = [];
372
- this._mediaObject.fmtp = [];
373
- if (!this._planB) {
374
- this._mediaObject.msid = `${streamId || '-'} ${trackId}`;
355
+ case 'video': {
356
+ this._mediaObject.direction = 'sendonly';
357
+ this._mediaObject.rtp = [];
358
+ this._mediaObject.rtcpFb = [];
359
+ this._mediaObject.fmtp = [];
360
+ if (!this._planB) {
361
+ this._mediaObject.msid = `${streamId || '-'} ${trackId}`;
362
+ }
363
+ for (const codec of offerRtpParameters.codecs) {
364
+ const rtp = {
365
+ payload: codec.payloadType,
366
+ codec: getCodecName(codec),
367
+ rate: codec.clockRate,
368
+ };
369
+ if (codec.channels > 1) {
370
+ rtp.encoding = codec.channels;
375
371
  }
376
- for (const codec of offerRtpParameters.codecs) {
377
- const rtp = {
378
- payload: codec.payloadType,
379
- codec: getCodecName(codec),
380
- rate: codec.clockRate
381
- };
382
- if (codec.channels > 1) {
383
- rtp.encoding = codec.channels;
384
- }
385
- this._mediaObject.rtp.push(rtp);
386
- const fmtp = {
387
- payload: codec.payloadType,
388
- config: ''
389
- };
390
- for (const key of Object.keys(codec.parameters)) {
391
- if (fmtp.config) {
392
- fmtp.config += ';';
393
- }
394
- fmtp.config += `${key}=${codec.parameters[key]}`;
395
- }
372
+ this._mediaObject.rtp.push(rtp);
373
+ const fmtp = {
374
+ payload: codec.payloadType,
375
+ config: '',
376
+ };
377
+ for (const key of Object.keys(codec.parameters)) {
396
378
  if (fmtp.config) {
397
- this._mediaObject.fmtp.push(fmtp);
398
- }
399
- for (const fb of codec.rtcpFeedback) {
400
- this._mediaObject.rtcpFb.push({
401
- payload: codec.payloadType,
402
- type: fb.type,
403
- subtype: fb.parameter
404
- });
379
+ fmtp.config += ';';
405
380
  }
381
+ fmtp.config += `${key}=${codec.parameters[key]}`;
382
+ }
383
+ if (fmtp.config) {
384
+ this._mediaObject.fmtp.push(fmtp);
406
385
  }
407
- this._mediaObject.payloads = offerRtpParameters.codecs
408
- .map((codec) => codec.payloadType)
409
- .join(' ');
410
- this._mediaObject.ext = [];
411
- for (const ext of offerRtpParameters.headerExtensions) {
412
- this._mediaObject.ext.push({
413
- uri: ext.uri,
414
- value: ext.id
386
+ for (const fb of codec.rtcpFeedback) {
387
+ this._mediaObject.rtcpFb.push({
388
+ payload: codec.payloadType,
389
+ type: fb.type,
390
+ subtype: fb.parameter,
415
391
  });
416
392
  }
417
- this._mediaObject.rtcpMux = 'rtcp-mux';
418
- this._mediaObject.rtcpRsize = 'rtcp-rsize';
419
- const encoding = offerRtpParameters.encodings[0];
420
- const ssrc = encoding.ssrc;
421
- const rtxSsrc = (encoding.rtx && encoding.rtx.ssrc)
422
- ? encoding.rtx.ssrc
423
- : undefined;
424
- this._mediaObject.ssrcs = [];
425
- this._mediaObject.ssrcGroups = [];
393
+ }
394
+ this._mediaObject.payloads = offerRtpParameters.codecs
395
+ .map((codec) => codec.payloadType)
396
+ .join(' ');
397
+ this._mediaObject.ext = [];
398
+ for (const ext of offerRtpParameters.headerExtensions) {
399
+ this._mediaObject.ext.push({
400
+ uri: ext.uri,
401
+ value: ext.id,
402
+ });
403
+ }
404
+ this._mediaObject.rtcpMux = 'rtcp-mux';
405
+ this._mediaObject.rtcpRsize = 'rtcp-rsize';
406
+ const encoding = offerRtpParameters.encodings[0];
407
+ const ssrc = encoding.ssrc;
408
+ const rtxSsrc = encoding.rtx && encoding.rtx.ssrc ? encoding.rtx.ssrc : undefined;
409
+ this._mediaObject.ssrcs = [];
410
+ this._mediaObject.ssrcGroups = [];
411
+ if (offerRtpParameters.rtcp.cname) {
412
+ this._mediaObject.ssrcs.push({
413
+ id: ssrc,
414
+ attribute: 'cname',
415
+ value: offerRtpParameters.rtcp.cname,
416
+ });
417
+ }
418
+ if (this._planB) {
419
+ this._mediaObject.ssrcs.push({
420
+ id: ssrc,
421
+ attribute: 'msid',
422
+ value: `${streamId || '-'} ${trackId}`,
423
+ });
424
+ }
425
+ if (rtxSsrc) {
426
426
  if (offerRtpParameters.rtcp.cname) {
427
427
  this._mediaObject.ssrcs.push({
428
- id: ssrc,
428
+ id: rtxSsrc,
429
429
  attribute: 'cname',
430
- value: offerRtpParameters.rtcp.cname
430
+ value: offerRtpParameters.rtcp.cname,
431
431
  });
432
432
  }
433
433
  if (this._planB) {
434
434
  this._mediaObject.ssrcs.push({
435
- id: ssrc,
435
+ id: rtxSsrc,
436
436
  attribute: 'msid',
437
- value: `${streamId || '-'} ${trackId}`
438
- });
439
- }
440
- if (rtxSsrc) {
441
- if (offerRtpParameters.rtcp.cname) {
442
- this._mediaObject.ssrcs.push({
443
- id: rtxSsrc,
444
- attribute: 'cname',
445
- value: offerRtpParameters.rtcp.cname
446
- });
447
- }
448
- if (this._planB) {
449
- this._mediaObject.ssrcs.push({
450
- id: rtxSsrc,
451
- attribute: 'msid',
452
- value: `${streamId || '-'} ${trackId}`
453
- });
454
- }
455
- // Associate original and retransmission SSRCs.
456
- this._mediaObject.ssrcGroups.push({
457
- semantics: 'FID',
458
- ssrcs: `${ssrc} ${rtxSsrc}`
437
+ value: `${streamId || '-'} ${trackId}`,
459
438
  });
460
439
  }
461
- break;
440
+ // Associate original and retransmission SSRCs.
441
+ this._mediaObject.ssrcGroups.push({
442
+ semantics: 'FID',
443
+ ssrcs: `${ssrc} ${rtxSsrc}`,
444
+ });
462
445
  }
463
- case 'application':
464
- {
465
- // New spec.
466
- if (!oldDataChannelSpec) {
467
- this._mediaObject.payloads = 'webrtc-datachannel';
468
- this._mediaObject.sctpPort = sctpParameters.port;
469
- this._mediaObject.maxMessageSize = sctpParameters.maxMessageSize;
470
- }
471
- // Old spec.
472
- else {
473
- this._mediaObject.payloads = sctpParameters.port;
474
- this._mediaObject.sctpmap =
475
- {
476
- app: 'webrtc-datachannel',
477
- sctpmapNumber: sctpParameters.port,
478
- maxMessageSize: sctpParameters.maxMessageSize
479
- };
480
- }
481
- break;
446
+ break;
447
+ }
448
+ case 'application': {
449
+ // New spec.
450
+ if (!oldDataChannelSpec) {
451
+ this._mediaObject.payloads = 'webrtc-datachannel';
452
+ this._mediaObject.sctpPort = sctpParameters.port;
453
+ this._mediaObject.maxMessageSize = sctpParameters.maxMessageSize;
454
+ }
455
+ // Old spec.
456
+ else {
457
+ this._mediaObject.payloads = sctpParameters.port;
458
+ this._mediaObject.sctpmap = {
459
+ app: 'webrtc-datachannel',
460
+ sctpmapNumber: sctpParameters.port,
461
+ maxMessageSize: sctpParameters.maxMessageSize,
462
+ };
482
463
  }
464
+ break;
465
+ }
483
466
  }
484
467
  }
485
468
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -490,12 +473,10 @@ class OfferMediaSection extends MediaSection {
490
473
  resume() {
491
474
  this._mediaObject.direction = 'sendonly';
492
475
  }
493
- planBReceive({ offerRtpParameters, streamId, trackId }) {
476
+ planBReceive({ offerRtpParameters, streamId, trackId, }) {
494
477
  const encoding = offerRtpParameters.encodings[0];
495
478
  const ssrc = encoding.ssrc;
496
- const rtxSsrc = (encoding.rtx && encoding.rtx.ssrc)
497
- ? encoding.rtx.ssrc
498
- : undefined;
479
+ const rtxSsrc = encoding.rtx && encoding.rtx.ssrc ? encoding.rtx.ssrc : undefined;
499
480
  const payloads = this._mediaObject.payloads.split(' ');
500
481
  for (const codec of offerRtpParameters.codecs) {
501
482
  if (payloads.includes(String(codec.payloadType))) {
@@ -504,7 +485,7 @@ class OfferMediaSection extends MediaSection {
504
485
  const rtp = {
505
486
  payload: codec.payloadType,
506
487
  codec: getCodecName(codec),
507
- rate: codec.clockRate
488
+ rate: codec.clockRate,
508
489
  };
509
490
  if (codec.channels > 1) {
510
491
  rtp.encoding = codec.channels;
@@ -512,7 +493,7 @@ class OfferMediaSection extends MediaSection {
512
493
  this._mediaObject.rtp.push(rtp);
513
494
  const fmtp = {
514
495
  payload: codec.payloadType,
515
- config: ''
496
+ config: '',
516
497
  };
517
498
  for (const key of Object.keys(codec.parameters)) {
518
499
  if (fmtp.config) {
@@ -527,12 +508,11 @@ class OfferMediaSection extends MediaSection {
527
508
  this._mediaObject.rtcpFb.push({
528
509
  payload: codec.payloadType,
529
510
  type: fb.type,
530
- subtype: fb.parameter
511
+ subtype: fb.parameter,
531
512
  });
532
513
  }
533
514
  }
534
- this._mediaObject.payloads += ` ${offerRtpParameters
535
- .codecs
515
+ this._mediaObject.payloads += ` ${offerRtpParameters.codecs
536
516
  .filter((codec) => !this._mediaObject.payloads.includes(codec.payloadType))
537
517
  .map((codec) => codec.payloadType)
538
518
  .join(' ')}`;
@@ -541,45 +521,41 @@ class OfferMediaSection extends MediaSection {
541
521
  this._mediaObject.ssrcs.push({
542
522
  id: ssrc,
543
523
  attribute: 'cname',
544
- value: offerRtpParameters.rtcp.cname
524
+ value: offerRtpParameters.rtcp.cname,
545
525
  });
546
526
  }
547
527
  this._mediaObject.ssrcs.push({
548
528
  id: ssrc,
549
529
  attribute: 'msid',
550
- value: `${streamId || '-'} ${trackId}`
530
+ value: `${streamId || '-'} ${trackId}`,
551
531
  });
552
532
  if (rtxSsrc) {
553
533
  if (offerRtpParameters.rtcp.cname) {
554
534
  this._mediaObject.ssrcs.push({
555
535
  id: rtxSsrc,
556
536
  attribute: 'cname',
557
- value: offerRtpParameters.rtcp.cname
537
+ value: offerRtpParameters.rtcp.cname,
558
538
  });
559
539
  }
560
540
  this._mediaObject.ssrcs.push({
561
541
  id: rtxSsrc,
562
542
  attribute: 'msid',
563
- value: `${streamId || '-'} ${trackId}`
543
+ value: `${streamId || '-'} ${trackId}`,
564
544
  });
565
545
  // Associate original and retransmission SSRCs.
566
546
  this._mediaObject.ssrcGroups.push({
567
547
  semantics: 'FID',
568
- ssrcs: `${ssrc} ${rtxSsrc}`
548
+ ssrcs: `${ssrc} ${rtxSsrc}`,
569
549
  });
570
550
  }
571
551
  }
572
- planBStopReceiving({ offerRtpParameters }) {
552
+ planBStopReceiving({ offerRtpParameters, }) {
573
553
  const encoding = offerRtpParameters.encodings[0];
574
554
  const ssrc = encoding.ssrc;
575
- const rtxSsrc = (encoding.rtx && encoding.rtx.ssrc)
576
- ? encoding.rtx.ssrc
577
- : undefined;
578
- this._mediaObject.ssrcs = this._mediaObject.ssrcs
579
- .filter((s) => s.id !== ssrc && s.id !== rtxSsrc);
555
+ const rtxSsrc = encoding.rtx && encoding.rtx.ssrc ? encoding.rtx.ssrc : undefined;
556
+ this._mediaObject.ssrcs = this._mediaObject.ssrcs.filter((s) => s.id !== ssrc && s.id !== rtxSsrc);
580
557
  if (rtxSsrc) {
581
- this._mediaObject.ssrcGroups = this._mediaObject.ssrcGroups
582
- .filter((group) => group.ssrcs !== `${ssrc} ${rtxSsrc}`);
558
+ this._mediaObject.ssrcGroups = this._mediaObject.ssrcGroups.filter((group) => group.ssrcs !== `${ssrc} ${rtxSsrc}`);
583
559
  }
584
560
  }
585
561
  }