mediasoup-client 3.6.89 → 3.6.90

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 (125) hide show
  1. package/lib/index.d.ts +1435 -14
  2. package/lib/index.js +11884 -43
  3. package/lib/index.js.map +1 -0
  4. package/lib/index.mjs +11860 -0
  5. package/lib/index.mjs.map +1 -0
  6. package/npm-scripts.mjs +17 -11
  7. package/package.json +12 -8
  8. package/lib/Consumer.d.ts +0 -115
  9. package/lib/Consumer.d.ts.map +0 -1
  10. package/lib/Consumer.js +0 -190
  11. package/lib/DataConsumer.d.ts +0 -93
  12. package/lib/DataConsumer.d.ts.map +0 -1
  13. package/lib/DataConsumer.js +0 -162
  14. package/lib/DataProducer.d.ts +0 -97
  15. package/lib/DataProducer.d.ts.map +0 -1
  16. package/lib/DataProducer.js +0 -180
  17. package/lib/Device.d.ts +0 -92
  18. package/lib/Device.d.ts.map +0 -1
  19. package/lib/Device.js +0 -464
  20. package/lib/EnhancedEventEmitter.d.ts +0 -24
  21. package/lib/EnhancedEventEmitter.d.ts.map +0 -1
  22. package/lib/EnhancedEventEmitter.js +0 -70
  23. package/lib/Logger.d.ts +0 -11
  24. package/lib/Logger.d.ts.map +0 -1
  25. package/lib/Logger.js +0 -37
  26. package/lib/Producer.d.ts +0 -169
  27. package/lib/Producer.d.ts.map +0 -1
  28. package/lib/Producer.js +0 -287
  29. package/lib/RtpParameters.d.ts +0 -306
  30. package/lib/RtpParameters.d.ts.map +0 -1
  31. package/lib/RtpParameters.js +0 -6
  32. package/lib/SctpParameters.d.ts +0 -68
  33. package/lib/SctpParameters.d.ts.map +0 -1
  34. package/lib/SctpParameters.js +0 -2
  35. package/lib/Transport.d.ts +0 -243
  36. package/lib/Transport.d.ts.map +0 -1
  37. package/lib/Transport.js +0 -824
  38. package/lib/errors.d.ts +0 -13
  39. package/lib/errors.d.ts.map +0 -1
  40. package/lib/errors.js +0 -39
  41. package/lib/handlers/Chrome111.d.ts +0 -49
  42. package/lib/handlers/Chrome111.d.ts.map +0 -1
  43. package/lib/handlers/Chrome111.js +0 -658
  44. package/lib/handlers/Chrome55.d.ts +0 -51
  45. package/lib/handlers/Chrome55.d.ts.map +0 -1
  46. package/lib/handlers/Chrome55.js +0 -542
  47. package/lib/handlers/Chrome67.d.ts +0 -51
  48. package/lib/handlers/Chrome67.d.ts.map +0 -1
  49. package/lib/handlers/Chrome67.js +0 -598
  50. package/lib/handlers/Chrome70.d.ts +0 -49
  51. package/lib/handlers/Chrome70.d.ts.map +0 -1
  52. package/lib/handlers/Chrome70.js +0 -627
  53. package/lib/handlers/Chrome74.d.ts +0 -49
  54. package/lib/handlers/Chrome74.d.ts.map +0 -1
  55. package/lib/handlers/Chrome74.js +0 -675
  56. package/lib/handlers/Edge11.d.ts +0 -55
  57. package/lib/handlers/Edge11.d.ts.map +0 -1
  58. package/lib/handlers/Edge11.js +0 -447
  59. package/lib/handlers/FakeHandler.d.ts +0 -49
  60. package/lib/handlers/FakeHandler.d.ts.map +0 -1
  61. package/lib/handlers/FakeHandler.js +0 -276
  62. package/lib/handlers/Firefox60.d.ts +0 -48
  63. package/lib/handlers/Firefox60.d.ts.map +0 -1
  64. package/lib/handlers/Firefox60.js +0 -681
  65. package/lib/handlers/HandlerInterface.d.ts +0 -97
  66. package/lib/handlers/HandlerInterface.d.ts.map +0 -1
  67. package/lib/handlers/HandlerInterface.js +0 -10
  68. package/lib/handlers/ReactNative.d.ts +0 -51
  69. package/lib/handlers/ReactNative.d.ts.map +0 -1
  70. package/lib/handlers/ReactNative.js +0 -558
  71. package/lib/handlers/ReactNativeUnifiedPlan.d.ts +0 -49
  72. package/lib/handlers/ReactNativeUnifiedPlan.d.ts.map +0 -1
  73. package/lib/handlers/ReactNativeUnifiedPlan.js +0 -694
  74. package/lib/handlers/Safari11.d.ts +0 -51
  75. package/lib/handlers/Safari11.d.ts.map +0 -1
  76. package/lib/handlers/Safari11.js +0 -592
  77. package/lib/handlers/Safari12.d.ts +0 -49
  78. package/lib/handlers/Safari12.d.ts.map +0 -1
  79. package/lib/handlers/Safari12.js +0 -648
  80. package/lib/handlers/ortc/edgeUtils.d.ts +0 -11
  81. package/lib/handlers/ortc/edgeUtils.d.ts.map +0 -1
  82. package/lib/handlers/ortc/edgeUtils.js +0 -86
  83. package/lib/handlers/ortc/utils.d.ts +0 -6
  84. package/lib/handlers/ortc/utils.d.ts.map +0 -1
  85. package/lib/handlers/ortc/utils.js +0 -20
  86. package/lib/handlers/sdp/MediaSection.d.ts +0 -68
  87. package/lib/handlers/sdp/MediaSection.d.ts.map +0 -1
  88. package/lib/handlers/sdp/MediaSection.js +0 -589
  89. package/lib/handlers/sdp/RemoteSdp.d.ts +0 -75
  90. package/lib/handlers/sdp/RemoteSdp.d.ts.map +0 -1
  91. package/lib/handlers/sdp/RemoteSdp.js +0 -303
  92. package/lib/handlers/sdp/commonUtils.d.ts +0 -24
  93. package/lib/handlers/sdp/commonUtils.d.ts.map +0 -1
  94. package/lib/handlers/sdp/commonUtils.js +0 -224
  95. package/lib/handlers/sdp/plainRtpUtils.d.ts +0 -14
  96. package/lib/handlers/sdp/plainRtpUtils.d.ts.map +0 -1
  97. package/lib/handlers/sdp/plainRtpUtils.js +0 -33
  98. package/lib/handlers/sdp/planBUtils.d.ts +0 -14
  99. package/lib/handlers/sdp/planBUtils.d.ts.map +0 -1
  100. package/lib/handlers/sdp/planBUtils.js +0 -155
  101. package/lib/handlers/sdp/unifiedPlanUtils.d.ts +0 -12
  102. package/lib/handlers/sdp/unifiedPlanUtils.d.ts.map +0 -1
  103. package/lib/handlers/sdp/unifiedPlanUtils.js +0 -131
  104. package/lib/index.d.ts.map +0 -1
  105. package/lib/ortc.d.ts +0 -123
  106. package/lib/ortc.d.ts.map +0 -1
  107. package/lib/ortc.js +0 -943
  108. package/lib/scalabilityModes.d.ts +0 -6
  109. package/lib/scalabilityModes.d.ts.map +0 -1
  110. package/lib/scalabilityModes.js +0 -20
  111. package/lib/tests/fakeParameters.d.ts +0 -20
  112. package/lib/tests/fakeParameters.d.ts.map +0 -1
  113. package/lib/tests/fakeParameters.js +0 -659
  114. package/lib/tests/test.d.ts +0 -6
  115. package/lib/tests/test.d.ts.map +0 -1
  116. package/lib/tests/test.js +0 -1297
  117. package/lib/tests/uaTestCases.d.ts +0 -9
  118. package/lib/tests/uaTestCases.d.ts.map +0 -1
  119. package/lib/tests/uaTestCases.js +0 -85
  120. package/lib/types.d.ts +0 -15
  121. package/lib/types.d.ts.map +0 -1
  122. package/lib/types.js +0 -26
  123. package/lib/utils.d.ts +0 -9
  124. package/lib/utils.d.ts.map +0 -1
  125. package/lib/utils.js +0 -20
@@ -1,681 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.Firefox60 = void 0;
27
- const sdpTransform = __importStar(require("sdp-transform"));
28
- const Logger_1 = require("../Logger");
29
- const errors_1 = require("../errors");
30
- const utils = __importStar(require("../utils"));
31
- const ortc = __importStar(require("../ortc"));
32
- const sdpCommonUtils = __importStar(require("./sdp/commonUtils"));
33
- const sdpUnifiedPlanUtils = __importStar(require("./sdp/unifiedPlanUtils"));
34
- const HandlerInterface_1 = require("./HandlerInterface");
35
- const RemoteSdp_1 = require("./sdp/RemoteSdp");
36
- const scalabilityModes_1 = require("../scalabilityModes");
37
- const logger = new Logger_1.Logger('Firefox60');
38
- const SCTP_NUM_STREAMS = { OS: 16, MIS: 2048 };
39
- class Firefox60 extends HandlerInterface_1.HandlerInterface {
40
- /**
41
- * Creates a factory function.
42
- */
43
- static createFactory() {
44
- return () => new Firefox60();
45
- }
46
- constructor() {
47
- super();
48
- // Map of RTCTransceivers indexed by MID.
49
- this._mapMidTransceiver = new Map();
50
- // Local stream for sending.
51
- this._sendStream = new MediaStream();
52
- // Whether a DataChannel m=application section has been created.
53
- this._hasDataChannelMediaSection = false;
54
- // Sending DataChannel id value counter. Incremented for each new DataChannel.
55
- this._nextSendSctpStreamId = 0;
56
- // Got transport local and remote parameters.
57
- this._transportReady = false;
58
- }
59
- get name() {
60
- return 'Firefox60';
61
- }
62
- close() {
63
- logger.debug('close()');
64
- // Close RTCPeerConnection.
65
- if (this._pc) {
66
- try {
67
- this._pc.close();
68
- }
69
- catch (error) { }
70
- }
71
- this.emit('@close');
72
- }
73
- async getNativeRtpCapabilities() {
74
- logger.debug('getNativeRtpCapabilities()');
75
- const pc = new RTCPeerConnection({
76
- iceServers: [],
77
- iceTransportPolicy: 'all',
78
- bundlePolicy: 'max-bundle',
79
- rtcpMuxPolicy: 'require'
80
- });
81
- // NOTE: We need to add a real video track to get the RID extension mapping.
82
- const canvas = document.createElement('canvas');
83
- // NOTE: Otherwise Firefox fails in next line.
84
- canvas.getContext('2d');
85
- const fakeStream = canvas.captureStream();
86
- const fakeVideoTrack = fakeStream.getVideoTracks()[0];
87
- try {
88
- pc.addTransceiver('audio', { direction: 'sendrecv' });
89
- const videoTransceiver = pc.addTransceiver(fakeVideoTrack, { direction: 'sendrecv' });
90
- const parameters = videoTransceiver.sender.getParameters();
91
- const encodings = [
92
- { rid: 'r0', maxBitrate: 100000 },
93
- { rid: 'r1', maxBitrate: 500000 }
94
- ];
95
- parameters.encodings = encodings;
96
- await videoTransceiver.sender.setParameters(parameters);
97
- const offer = await pc.createOffer();
98
- try {
99
- canvas.remove();
100
- }
101
- catch (error) { }
102
- try {
103
- fakeVideoTrack.stop();
104
- }
105
- catch (error) { }
106
- try {
107
- pc.close();
108
- }
109
- catch (error) { }
110
- const sdpObject = sdpTransform.parse(offer.sdp);
111
- const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({ sdpObject });
112
- return nativeRtpCapabilities;
113
- }
114
- catch (error) {
115
- try {
116
- canvas.remove();
117
- }
118
- catch (error2) { }
119
- try {
120
- fakeVideoTrack.stop();
121
- }
122
- catch (error2) { }
123
- try {
124
- pc.close();
125
- }
126
- catch (error2) { }
127
- throw error;
128
- }
129
- }
130
- async getNativeSctpCapabilities() {
131
- logger.debug('getNativeSctpCapabilities()');
132
- return {
133
- numStreams: SCTP_NUM_STREAMS
134
- };
135
- }
136
- run({ direction, iceParameters, iceCandidates, dtlsParameters, sctpParameters, iceServers, iceTransportPolicy, additionalSettings, proprietaryConstraints, extendedRtpCapabilities }) {
137
- logger.debug('run()');
138
- this._direction = direction;
139
- this._remoteSdp = new RemoteSdp_1.RemoteSdp({
140
- iceParameters,
141
- iceCandidates,
142
- dtlsParameters,
143
- sctpParameters
144
- });
145
- this._sendingRtpParametersByKind =
146
- {
147
- audio: ortc.getSendingRtpParameters('audio', extendedRtpCapabilities),
148
- video: ortc.getSendingRtpParameters('video', extendedRtpCapabilities)
149
- };
150
- this._sendingRemoteRtpParametersByKind =
151
- {
152
- audio: ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities),
153
- video: ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)
154
- };
155
- this._pc = new RTCPeerConnection({
156
- iceServers: iceServers || [],
157
- iceTransportPolicy: iceTransportPolicy || 'all',
158
- bundlePolicy: 'max-bundle',
159
- rtcpMuxPolicy: 'require',
160
- ...additionalSettings
161
- }, proprietaryConstraints);
162
- if (this._pc.connectionState) {
163
- this._pc.addEventListener('connectionstatechange', () => {
164
- this.emit('@connectionstatechange', this._pc.connectionState);
165
- });
166
- }
167
- else {
168
- this._pc.addEventListener('iceconnectionstatechange', () => {
169
- logger.warn('run() | pc.connectionState not supported, using pc.iceConnectionState');
170
- switch (this._pc.iceConnectionState) {
171
- case 'checking':
172
- this.emit('@connectionstatechange', 'connecting');
173
- break;
174
- case 'connected':
175
- case 'completed':
176
- this.emit('@connectionstatechange', 'connected');
177
- break;
178
- case 'failed':
179
- this.emit('@connectionstatechange', 'failed');
180
- break;
181
- case 'disconnected':
182
- this.emit('@connectionstatechange', 'disconnected');
183
- break;
184
- case 'closed':
185
- this.emit('@connectionstatechange', 'closed');
186
- break;
187
- }
188
- });
189
- }
190
- }
191
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
192
- async updateIceServers(iceServers) {
193
- // NOTE: Firefox does not implement pc.setConfiguration().
194
- throw new errors_1.UnsupportedError('not supported');
195
- }
196
- async restartIce(iceParameters) {
197
- logger.debug('restartIce()');
198
- // Provide the remote SDP handler with new remote ICE parameters.
199
- this._remoteSdp.updateIceParameters(iceParameters);
200
- if (!this._transportReady) {
201
- return;
202
- }
203
- if (this._direction === 'send') {
204
- const offer = await this._pc.createOffer({ iceRestart: true });
205
- logger.debug('restartIce() | calling pc.setLocalDescription() [offer:%o]', offer);
206
- await this._pc.setLocalDescription(offer);
207
- const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() };
208
- logger.debug('restartIce() | calling pc.setRemoteDescription() [answer:%o]', answer);
209
- await this._pc.setRemoteDescription(answer);
210
- }
211
- else {
212
- const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() };
213
- logger.debug('restartIce() | calling pc.setRemoteDescription() [offer:%o]', offer);
214
- await this._pc.setRemoteDescription(offer);
215
- const answer = await this._pc.createAnswer();
216
- logger.debug('restartIce() | calling pc.setLocalDescription() [answer:%o]', answer);
217
- await this._pc.setLocalDescription(answer);
218
- }
219
- }
220
- async getTransportStats() {
221
- return this._pc.getStats();
222
- }
223
- async send({ track, encodings, codecOptions, codec }) {
224
- this.assertSendDirection();
225
- logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);
226
- if (encodings) {
227
- encodings = utils.clone(encodings, []);
228
- if (encodings.length > 1) {
229
- encodings.forEach((encoding, idx) => {
230
- encoding.rid = `r${idx}`;
231
- });
232
- // Clone the encodings and reverse them because Firefox likes them
233
- // from high to low.
234
- encodings.reverse();
235
- }
236
- }
237
- const sendingRtpParameters = utils.clone(this._sendingRtpParametersByKind[track.kind], {});
238
- // This may throw.
239
- sendingRtpParameters.codecs =
240
- ortc.reduceCodecs(sendingRtpParameters.codecs, codec);
241
- const sendingRemoteRtpParameters = utils.clone(this._sendingRemoteRtpParametersByKind[track.kind], {});
242
- // This may throw.
243
- sendingRemoteRtpParameters.codecs =
244
- ortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec);
245
- // NOTE: Firefox fails sometimes to properly anticipate the closed media
246
- // section that it should use, so don't reuse closed media sections.
247
- // https://github.com/versatica/mediasoup-client/issues/104
248
- //
249
- // const mediaSectionIdx = this._remoteSdp!.getNextMediaSectionIdx();
250
- const transceiver = this._pc.addTransceiver(track, { direction: 'sendonly', streams: [this._sendStream] });
251
- // NOTE: This is not spec compliants. Encodings should be given in addTransceiver
252
- // second argument, but Firefox does not support it.
253
- if (encodings) {
254
- const parameters = transceiver.sender.getParameters();
255
- parameters.encodings = encodings;
256
- await transceiver.sender.setParameters(parameters);
257
- }
258
- const offer = await this._pc.createOffer();
259
- let localSdpObject = sdpTransform.parse(offer.sdp);
260
- // In Firefox use DTLS role client even if we are the "offerer" since
261
- // Firefox does not respect ICE-Lite.
262
- if (!this._transportReady) {
263
- await this.setupTransport({ localDtlsRole: 'client', localSdpObject });
264
- }
265
- const layers = (0, scalabilityModes_1.parse)((encodings || [{}])[0].scalabilityMode);
266
- logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer);
267
- await this._pc.setLocalDescription(offer);
268
- // We can now get the transceiver.mid.
269
- const localId = transceiver.mid;
270
- // Set MID.
271
- sendingRtpParameters.mid = localId;
272
- localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);
273
- const offerMediaObject = localSdpObject.media[localSdpObject.media.length - 1];
274
- // Set RTCP CNAME.
275
- sendingRtpParameters.rtcp.cname =
276
- sdpCommonUtils.getCname({ offerMediaObject });
277
- // Set RTP encodings by parsing the SDP offer if no encodings are given.
278
- if (!encodings) {
279
- sendingRtpParameters.encodings =
280
- sdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject });
281
- }
282
- // Set RTP encodings by parsing the SDP offer and complete them with given
283
- // one if just a single encoding has been given.
284
- else if (encodings.length === 1) {
285
- const newEncodings = sdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject });
286
- Object.assign(newEncodings[0], encodings[0]);
287
- sendingRtpParameters.encodings = newEncodings;
288
- }
289
- // Otherwise if more than 1 encoding are given use them verbatim (but
290
- // reverse them back since we reversed them above to satisfy Firefox).
291
- else {
292
- sendingRtpParameters.encodings = encodings.reverse();
293
- }
294
- // If VP8 or H264 and there is effective simulcast, add scalabilityMode to
295
- // each encoding.
296
- if (sendingRtpParameters.encodings.length > 1 &&
297
- (sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' ||
298
- sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/h264')) {
299
- for (const encoding of sendingRtpParameters.encodings) {
300
- if (encoding.scalabilityMode) {
301
- encoding.scalabilityMode = `L1T${layers.temporalLayers}`;
302
- }
303
- else {
304
- encoding.scalabilityMode = 'L1T3';
305
- }
306
- }
307
- }
308
- this._remoteSdp.send({
309
- offerMediaObject,
310
- offerRtpParameters: sendingRtpParameters,
311
- answerRtpParameters: sendingRemoteRtpParameters,
312
- codecOptions,
313
- extmapAllowMixed: true
314
- });
315
- const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() };
316
- logger.debug('send() | calling pc.setRemoteDescription() [answer:%o]', answer);
317
- await this._pc.setRemoteDescription(answer);
318
- // Store in the map.
319
- this._mapMidTransceiver.set(localId, transceiver);
320
- return {
321
- localId,
322
- rtpParameters: sendingRtpParameters,
323
- rtpSender: transceiver.sender
324
- };
325
- }
326
- async stopSending(localId) {
327
- logger.debug('stopSending() [localId:%s]', localId);
328
- const transceiver = this._mapMidTransceiver.get(localId);
329
- if (!transceiver) {
330
- throw new Error('associated transceiver not found');
331
- }
332
- transceiver.sender.replaceTrack(null);
333
- // NOTE: Cannot use stop() the transceiver due to the the note above in
334
- // send() method.
335
- // try
336
- // {
337
- // transceiver.stop();
338
- // }
339
- // catch (error)
340
- // {}
341
- this._pc.removeTrack(transceiver.sender);
342
- // NOTE: Cannot use closeMediaSection() due to the the note above in send()
343
- // method.
344
- // this._remoteSdp!.closeMediaSection(transceiver.mid);
345
- this._remoteSdp.disableMediaSection(transceiver.mid);
346
- const offer = await this._pc.createOffer();
347
- logger.debug('stopSending() | calling pc.setLocalDescription() [offer:%o]', offer);
348
- await this._pc.setLocalDescription(offer);
349
- const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() };
350
- logger.debug('stopSending() | calling pc.setRemoteDescription() [answer:%o]', answer);
351
- await this._pc.setRemoteDescription(answer);
352
- this._mapMidTransceiver.delete(localId);
353
- }
354
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
355
- async pauseSending(localId) {
356
- this.assertSendDirection();
357
- logger.debug('pauseSending() [localId:%s]', localId);
358
- const transceiver = this._mapMidTransceiver.get(localId);
359
- if (!transceiver) {
360
- throw new Error('associated RTCRtpTransceiver not found');
361
- }
362
- transceiver.direction = 'inactive';
363
- this._remoteSdp.pauseMediaSection(localId);
364
- const offer = await this._pc.createOffer();
365
- logger.debug('pauseSending() | calling pc.setLocalDescription() [offer:%o]', offer);
366
- await this._pc.setLocalDescription(offer);
367
- const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() };
368
- logger.debug('pauseSending() | calling pc.setRemoteDescription() [answer:%o]', answer);
369
- await this._pc.setRemoteDescription(answer);
370
- }
371
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
372
- async resumeSending(localId) {
373
- this.assertSendDirection();
374
- logger.debug('resumeSending() [localId:%s]', localId);
375
- const transceiver = this._mapMidTransceiver.get(localId);
376
- if (!transceiver) {
377
- throw new Error('associated RTCRtpTransceiver not found');
378
- }
379
- transceiver.direction = 'sendonly';
380
- this._remoteSdp.resumeSendingMediaSection(localId);
381
- const offer = await this._pc.createOffer();
382
- logger.debug('resumeSending() | calling pc.setLocalDescription() [offer:%o]', offer);
383
- await this._pc.setLocalDescription(offer);
384
- const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() };
385
- logger.debug('resumeSending() | calling pc.setRemoteDescription() [answer:%o]', answer);
386
- await this._pc.setRemoteDescription(answer);
387
- }
388
- async replaceTrack(localId, track) {
389
- this.assertSendDirection();
390
- if (track) {
391
- logger.debug('replaceTrack() [localId:%s, track.id:%s]', localId, track.id);
392
- }
393
- else {
394
- logger.debug('replaceTrack() [localId:%s, no track]', localId);
395
- }
396
- const transceiver = this._mapMidTransceiver.get(localId);
397
- if (!transceiver) {
398
- throw new Error('associated RTCRtpTransceiver not found');
399
- }
400
- await transceiver.sender.replaceTrack(track);
401
- }
402
- async setMaxSpatialLayer(localId, spatialLayer) {
403
- this.assertSendDirection();
404
- logger.debug('setMaxSpatialLayer() [localId:%s, spatialLayer:%s]', localId, spatialLayer);
405
- const transceiver = this._mapMidTransceiver.get(localId);
406
- if (!transceiver) {
407
- throw new Error('associated transceiver not found');
408
- }
409
- const parameters = transceiver.sender.getParameters();
410
- // NOTE: We require encodings given from low to high, however Firefox
411
- // requires them in reverse order, so do magic here.
412
- spatialLayer = parameters.encodings.length - 1 - spatialLayer;
413
- parameters.encodings.forEach((encoding, idx) => {
414
- if (idx >= spatialLayer) {
415
- encoding.active = true;
416
- }
417
- else {
418
- encoding.active = false;
419
- }
420
- });
421
- await transceiver.sender.setParameters(parameters);
422
- this._remoteSdp.muxMediaSectionSimulcast(localId, parameters.encodings);
423
- const offer = await this._pc.createOffer();
424
- logger.debug('setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]', offer);
425
- await this._pc.setLocalDescription(offer);
426
- const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() };
427
- logger.debug('setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]', answer);
428
- await this._pc.setRemoteDescription(answer);
429
- }
430
- async setRtpEncodingParameters(localId, params) {
431
- this.assertSendDirection();
432
- logger.debug('setRtpEncodingParameters() [localId:%s, params:%o]', localId, params);
433
- const transceiver = this._mapMidTransceiver.get(localId);
434
- if (!transceiver) {
435
- throw new Error('associated RTCRtpTransceiver not found');
436
- }
437
- const parameters = transceiver.sender.getParameters();
438
- parameters.encodings.forEach((encoding, idx) => {
439
- parameters.encodings[idx] = { ...encoding, ...params };
440
- });
441
- await transceiver.sender.setParameters(parameters);
442
- this._remoteSdp.muxMediaSectionSimulcast(localId, parameters.encodings);
443
- const offer = await this._pc.createOffer();
444
- logger.debug('setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]', offer);
445
- await this._pc.setLocalDescription(offer);
446
- const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() };
447
- logger.debug('setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]', answer);
448
- await this._pc.setRemoteDescription(answer);
449
- }
450
- async getSenderStats(localId) {
451
- this.assertSendDirection();
452
- const transceiver = this._mapMidTransceiver.get(localId);
453
- if (!transceiver) {
454
- throw new Error('associated RTCRtpTransceiver not found');
455
- }
456
- return transceiver.sender.getStats();
457
- }
458
- async sendDataChannel({ ordered, maxPacketLifeTime, maxRetransmits, label, protocol }) {
459
- this.assertSendDirection();
460
- const options = {
461
- negotiated: true,
462
- id: this._nextSendSctpStreamId,
463
- ordered,
464
- maxPacketLifeTime,
465
- maxRetransmits,
466
- protocol
467
- };
468
- logger.debug('sendDataChannel() [options:%o]', options);
469
- const dataChannel = this._pc.createDataChannel(label, options);
470
- // Increase next id.
471
- this._nextSendSctpStreamId =
472
- ++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS;
473
- // If this is the first DataChannel we need to create the SDP answer with
474
- // m=application section.
475
- if (!this._hasDataChannelMediaSection) {
476
- const offer = await this._pc.createOffer();
477
- const localSdpObject = sdpTransform.parse(offer.sdp);
478
- const offerMediaObject = localSdpObject.media
479
- .find((m) => m.type === 'application');
480
- if (!this._transportReady) {
481
- await this.setupTransport({ localDtlsRole: 'client', localSdpObject });
482
- }
483
- logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer);
484
- await this._pc.setLocalDescription(offer);
485
- this._remoteSdp.sendSctpAssociation({ offerMediaObject });
486
- const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() };
487
- logger.debug('sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer);
488
- await this._pc.setRemoteDescription(answer);
489
- this._hasDataChannelMediaSection = true;
490
- }
491
- const sctpStreamParameters = {
492
- streamId: options.id,
493
- ordered: options.ordered,
494
- maxPacketLifeTime: options.maxPacketLifeTime,
495
- maxRetransmits: options.maxRetransmits
496
- };
497
- return { dataChannel, sctpStreamParameters };
498
- }
499
- async receive(
500
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
501
- optionsList) {
502
- this.assertRecvDirection();
503
- const results = [];
504
- const mapLocalId = new Map();
505
- for (const options of optionsList) {
506
- const { trackId, kind, rtpParameters, streamId } = options;
507
- logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
508
- const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
509
- mapLocalId.set(trackId, localId);
510
- this._remoteSdp.receive({
511
- mid: localId,
512
- kind,
513
- offerRtpParameters: rtpParameters,
514
- streamId: streamId || rtpParameters.rtcp.cname,
515
- trackId
516
- });
517
- }
518
- const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() };
519
- logger.debug('receive() | calling pc.setRemoteDescription() [offer:%o]', offer);
520
- await this._pc.setRemoteDescription(offer);
521
- let answer = await this._pc.createAnswer();
522
- const localSdpObject = sdpTransform.parse(answer.sdp);
523
- for (const options of optionsList) {
524
- const { trackId, rtpParameters } = options;
525
- const localId = mapLocalId.get(trackId);
526
- const answerMediaObject = localSdpObject.media
527
- .find((m) => String(m.mid) === localId);
528
- // May need to modify codec parameters in the answer based on codec
529
- // parameters in the offer.
530
- sdpCommonUtils.applyCodecParameters({
531
- offerRtpParameters: rtpParameters,
532
- answerMediaObject
533
- });
534
- answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
535
- }
536
- if (!this._transportReady) {
537
- await this.setupTransport({ localDtlsRole: 'client', localSdpObject });
538
- }
539
- logger.debug('receive() | calling pc.setLocalDescription() [answer:%o]', answer);
540
- await this._pc.setLocalDescription(answer);
541
- for (const options of optionsList) {
542
- const { trackId } = options;
543
- const localId = mapLocalId.get(trackId);
544
- const transceiver = this._pc.getTransceivers()
545
- .find((t) => t.mid === localId);
546
- if (!transceiver) {
547
- throw new Error('new RTCRtpTransceiver not found');
548
- }
549
- // Store in the map.
550
- this._mapMidTransceiver.set(localId, transceiver);
551
- results.push({
552
- localId,
553
- track: transceiver.receiver.track,
554
- rtpReceiver: transceiver.receiver
555
- });
556
- }
557
- return results;
558
- }
559
- async stopReceiving(localIds) {
560
- this.assertRecvDirection();
561
- for (const localId of localIds) {
562
- logger.debug('stopReceiving() [localId:%s]', localId);
563
- const transceiver = this._mapMidTransceiver.get(localId);
564
- if (!transceiver) {
565
- throw new Error('associated RTCRtpTransceiver not found');
566
- }
567
- this._remoteSdp.closeMediaSection(transceiver.mid);
568
- }
569
- const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() };
570
- logger.debug('stopReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer);
571
- await this._pc.setRemoteDescription(offer);
572
- const answer = await this._pc.createAnswer();
573
- logger.debug('stopReceiving() | calling pc.setLocalDescription() [answer:%o]', answer);
574
- await this._pc.setLocalDescription(answer);
575
- for (const localId of localIds) {
576
- this._mapMidTransceiver.delete(localId);
577
- }
578
- }
579
- async pauseReceiving(localIds) {
580
- this.assertRecvDirection();
581
- for (const localId of localIds) {
582
- logger.debug('pauseReceiving() [localId:%s]', localId);
583
- const transceiver = this._mapMidTransceiver.get(localId);
584
- if (!transceiver) {
585
- throw new Error('associated RTCRtpTransceiver not found');
586
- }
587
- transceiver.direction = 'inactive';
588
- this._remoteSdp.pauseMediaSection(localId);
589
- }
590
- const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() };
591
- logger.debug('pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer);
592
- await this._pc.setRemoteDescription(offer);
593
- const answer = await this._pc.createAnswer();
594
- logger.debug('pauseReceiving() | calling pc.setLocalDescription() [answer:%o]', answer);
595
- await this._pc.setLocalDescription(answer);
596
- }
597
- async resumeReceiving(localIds) {
598
- this.assertRecvDirection();
599
- for (const localId of localIds) {
600
- logger.debug('resumeReceiving() [localId:%s]', localId);
601
- const transceiver = this._mapMidTransceiver.get(localId);
602
- if (!transceiver) {
603
- throw new Error('associated RTCRtpTransceiver not found');
604
- }
605
- transceiver.direction = 'recvonly';
606
- this._remoteSdp.resumeReceivingMediaSection(localId);
607
- }
608
- const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() };
609
- logger.debug('resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer);
610
- await this._pc.setRemoteDescription(offer);
611
- const answer = await this._pc.createAnswer();
612
- logger.debug('resumeReceiving() | calling pc.setLocalDescription() [answer:%o]', answer);
613
- await this._pc.setLocalDescription(answer);
614
- }
615
- async getReceiverStats(localId) {
616
- this.assertRecvDirection();
617
- const transceiver = this._mapMidTransceiver.get(localId);
618
- if (!transceiver) {
619
- throw new Error('associated RTCRtpTransceiver not found');
620
- }
621
- return transceiver.receiver.getStats();
622
- }
623
- async receiveDataChannel({ sctpStreamParameters, label, protocol }) {
624
- this.assertRecvDirection();
625
- const { streamId, ordered, maxPacketLifeTime, maxRetransmits } = sctpStreamParameters;
626
- const options = {
627
- negotiated: true,
628
- id: streamId,
629
- ordered,
630
- maxPacketLifeTime,
631
- maxRetransmits,
632
- protocol
633
- };
634
- logger.debug('receiveDataChannel() [options:%o]', options);
635
- const dataChannel = this._pc.createDataChannel(label, options);
636
- // If this is the first DataChannel we need to create the SDP offer with
637
- // m=application section.
638
- if (!this._hasDataChannelMediaSection) {
639
- this._remoteSdp.receiveSctpAssociation();
640
- const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() };
641
- logger.debug('receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]', offer);
642
- await this._pc.setRemoteDescription(offer);
643
- const answer = await this._pc.createAnswer();
644
- if (!this._transportReady) {
645
- const localSdpObject = sdpTransform.parse(answer.sdp);
646
- await this.setupTransport({ localDtlsRole: 'client', localSdpObject });
647
- }
648
- logger.debug('receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer);
649
- await this._pc.setLocalDescription(answer);
650
- this._hasDataChannelMediaSection = true;
651
- }
652
- return { dataChannel };
653
- }
654
- async setupTransport({ localDtlsRole, localSdpObject }) {
655
- if (!localSdpObject) {
656
- localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);
657
- }
658
- // Get our local DTLS parameters.
659
- const dtlsParameters = sdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject });
660
- // Set our DTLS role.
661
- dtlsParameters.role = localDtlsRole;
662
- // Update the remote DTLS role in the SDP.
663
- this._remoteSdp.updateDtlsRole(localDtlsRole === 'client' ? 'server' : 'client');
664
- // Need to tell the remote transport about our parameters.
665
- await new Promise((resolve, reject) => {
666
- this.safeEmit('@connect', { dtlsParameters }, resolve, reject);
667
- });
668
- this._transportReady = true;
669
- }
670
- assertSendDirection() {
671
- if (this._direction !== 'send') {
672
- throw new Error('method can just be called for handlers with "send" direction');
673
- }
674
- }
675
- assertRecvDirection() {
676
- if (this._direction !== 'recv') {
677
- throw new Error('method can just be called for handlers with "recv" direction');
678
- }
679
- }
680
- }
681
- exports.Firefox60 = Firefox60;