mediasoup-client 3.13.0 → 3.14.0
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.
- package/lib/DataConsumer.d.ts.map +1 -1
- package/lib/DataConsumer.js +5 -8
- package/lib/DataProducer.d.ts.map +1 -1
- package/lib/DataProducer.js +5 -7
- package/lib/Device.d.ts +2 -2
- package/lib/Device.d.ts.map +1 -1
- package/lib/Device.js +53 -70
- package/lib/RtpParameters.d.ts +8 -8
- package/lib/RtpParameters.d.ts.map +1 -1
- package/lib/Transport.d.ts +4 -4
- package/lib/Transport.d.ts.map +1 -1
- package/lib/Transport.js +6 -7
- package/lib/enhancedEvents.d.ts.map +1 -1
- package/lib/enhancedEvents.js +1 -0
- package/lib/handlers/Chrome111.d.ts +7 -12
- package/lib/handlers/Chrome111.d.ts.map +1 -1
- package/lib/handlers/Chrome111.js +130 -89
- package/lib/handlers/Chrome74.d.ts +7 -12
- package/lib/handlers/Chrome74.d.ts.map +1 -1
- package/lib/handlers/Chrome74.js +130 -85
- package/lib/handlers/FakeHandler.d.ts +6 -9
- package/lib/handlers/FakeHandler.d.ts.map +1 -1
- package/lib/handlers/FakeHandler.js +201 -60
- package/lib/handlers/Firefox120.d.ts +7 -12
- package/lib/handlers/Firefox120.d.ts.map +1 -1
- package/lib/handlers/Firefox120.js +154 -111
- package/lib/handlers/HandlerInterface.d.ts +11 -9
- package/lib/handlers/HandlerInterface.d.ts.map +1 -1
- package/lib/handlers/ReactNative106.d.ts +7 -12
- package/lib/handlers/ReactNative106.d.ts.map +1 -1
- package/lib/handlers/ReactNative106.js +136 -92
- package/lib/handlers/Safari12.d.ts +7 -12
- package/lib/handlers/Safari12.d.ts.map +1 -1
- package/lib/handlers/Safari12.js +132 -86
- package/lib/handlers/sdp/MediaSection.d.ts +5 -5
- package/lib/handlers/sdp/MediaSection.d.ts.map +1 -1
- package/lib/handlers/sdp/MediaSection.js +43 -45
- package/lib/handlers/sdp/RemoteSdp.d.ts +5 -6
- package/lib/handlers/sdp/RemoteSdp.d.ts.map +1 -1
- package/lib/handlers/sdp/RemoteSdp.js +5 -8
- package/lib/handlers/sdp/commonUtils.d.ts +5 -4
- package/lib/handlers/sdp/commonUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/commonUtils.js +2 -2
- package/lib/handlers/sdp/plainRtpUtils.d.ts +4 -3
- package/lib/handlers/sdp/plainRtpUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/plainRtpUtils.js +2 -2
- package/lib/handlers/sdp/unifiedPlanUtils.d.ts +3 -2
- package/lib/handlers/sdp/unifiedPlanUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/unifiedPlanUtils.js +10 -8
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/ortc.d.ts +7 -6
- package/lib/ortc.d.ts.map +1 -1
- package/lib/ortc.js +13 -14
- package/lib/privateTypes.d.ts +27 -0
- package/lib/privateTypes.d.ts.map +1 -0
- package/lib/privateTypes.js +2 -0
- package/lib/test/test.js +18 -1
- package/lib/utils.d.ts +1 -1
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +5 -4
- package/package.json +1 -2
package/lib/handlers/Safari12.js
CHANGED
|
@@ -5,13 +5,13 @@ const sdpTransform = require("sdp-transform");
|
|
|
5
5
|
const Logger_1 = require("../Logger");
|
|
6
6
|
const utils = require("../utils");
|
|
7
7
|
const ortc = require("../ortc");
|
|
8
|
-
const sdpCommonUtils = require("./sdp/commonUtils");
|
|
9
|
-
const sdpUnifiedPlanUtils = require("./sdp/unifiedPlanUtils");
|
|
10
|
-
const ortcUtils = require("./ortc/utils");
|
|
11
8
|
const errors_1 = require("../errors");
|
|
9
|
+
const scalabilityModes_1 = require("../scalabilityModes");
|
|
12
10
|
const HandlerInterface_1 = require("./HandlerInterface");
|
|
13
11
|
const RemoteSdp_1 = require("./sdp/RemoteSdp");
|
|
14
|
-
const
|
|
12
|
+
const sdpCommonUtils = require("./sdp/commonUtils");
|
|
13
|
+
const sdpUnifiedPlanUtils = require("./sdp/unifiedPlanUtils");
|
|
14
|
+
const ortcUtils = require("./ortc/utils");
|
|
15
15
|
const logger = new Logger_1.Logger('Safari12');
|
|
16
16
|
const NAME = 'Safari12';
|
|
17
17
|
const SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };
|
|
@@ -46,70 +46,52 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
46
46
|
* Creates a factory function.
|
|
47
47
|
*/
|
|
48
48
|
static createFactory() {
|
|
49
|
-
return () => new Safari12();
|
|
50
|
-
}
|
|
51
|
-
constructor() {
|
|
52
|
-
super();
|
|
53
|
-
}
|
|
54
|
-
get name() {
|
|
55
|
-
return NAME;
|
|
56
|
-
}
|
|
57
|
-
close() {
|
|
58
|
-
logger.debug('close()');
|
|
59
|
-
if (this._closed) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
this._closed = true;
|
|
63
|
-
// Close RTCPeerConnection.
|
|
64
|
-
if (this._pc) {
|
|
65
|
-
try {
|
|
66
|
-
this._pc.close();
|
|
67
|
-
}
|
|
68
|
-
catch (error) { }
|
|
69
|
-
}
|
|
70
|
-
this.emit('@close');
|
|
71
|
-
}
|
|
72
|
-
async getNativeRtpCapabilities() {
|
|
73
|
-
logger.debug('getNativeRtpCapabilities()');
|
|
74
|
-
const pc = new RTCPeerConnection({
|
|
75
|
-
iceServers: [],
|
|
76
|
-
iceTransportPolicy: 'all',
|
|
77
|
-
bundlePolicy: 'max-bundle',
|
|
78
|
-
rtcpMuxPolicy: 'require',
|
|
79
|
-
});
|
|
80
|
-
try {
|
|
81
|
-
pc.addTransceiver('audio');
|
|
82
|
-
pc.addTransceiver('video');
|
|
83
|
-
const offer = await pc.createOffer();
|
|
84
|
-
try {
|
|
85
|
-
pc.close();
|
|
86
|
-
}
|
|
87
|
-
catch (error) { }
|
|
88
|
-
const sdpObject = sdpTransform.parse(offer.sdp);
|
|
89
|
-
const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({
|
|
90
|
-
sdpObject,
|
|
91
|
-
});
|
|
92
|
-
// libwebrtc supports NACK for OPUS but doesn't announce it.
|
|
93
|
-
ortcUtils.addNackSupportForOpus(nativeRtpCapabilities);
|
|
94
|
-
return nativeRtpCapabilities;
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
try {
|
|
98
|
-
pc.close();
|
|
99
|
-
}
|
|
100
|
-
catch (error2) { }
|
|
101
|
-
throw error;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
async getNativeSctpCapabilities() {
|
|
105
|
-
logger.debug('getNativeSctpCapabilities()');
|
|
106
49
|
return {
|
|
107
|
-
|
|
50
|
+
name: NAME,
|
|
51
|
+
factory: (options) => new Safari12(options),
|
|
52
|
+
getNativeRtpCapabilities: async () => {
|
|
53
|
+
logger.debug('getNativeRtpCapabilities()');
|
|
54
|
+
const pc = new RTCPeerConnection({
|
|
55
|
+
iceServers: [],
|
|
56
|
+
iceTransportPolicy: 'all',
|
|
57
|
+
bundlePolicy: 'max-bundle',
|
|
58
|
+
rtcpMuxPolicy: 'require',
|
|
59
|
+
});
|
|
60
|
+
try {
|
|
61
|
+
pc.addTransceiver('audio');
|
|
62
|
+
pc.addTransceiver('video');
|
|
63
|
+
const offer = await pc.createOffer();
|
|
64
|
+
try {
|
|
65
|
+
pc.close();
|
|
66
|
+
}
|
|
67
|
+
catch (error) { }
|
|
68
|
+
const sdpObject = sdpTransform.parse(offer.sdp);
|
|
69
|
+
const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({
|
|
70
|
+
sdpObject,
|
|
71
|
+
});
|
|
72
|
+
// libwebrtc supports NACK for OPUS but doesn't announce it.
|
|
73
|
+
ortcUtils.addNackSupportForOpus(nativeRtpCapabilities);
|
|
74
|
+
return nativeRtpCapabilities;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
try {
|
|
78
|
+
pc.close();
|
|
79
|
+
}
|
|
80
|
+
catch (error2) { }
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
getNativeSctpCapabilities: async () => {
|
|
85
|
+
logger.debug('getNativeSctpCapabilities()');
|
|
86
|
+
return {
|
|
87
|
+
numStreams: SCTP_NUM_STREAMS,
|
|
88
|
+
};
|
|
89
|
+
},
|
|
108
90
|
};
|
|
109
91
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
logger.debug('
|
|
92
|
+
constructor({ direction, iceParameters, iceCandidates, dtlsParameters, sctpParameters, iceServers, iceTransportPolicy, additionalSettings, extendedRtpCapabilities, }) {
|
|
93
|
+
super();
|
|
94
|
+
logger.debug('constructor()');
|
|
113
95
|
this._direction = direction;
|
|
114
96
|
this._remoteSdp = new RemoteSdp_1.RemoteSdp({
|
|
115
97
|
iceParameters,
|
|
@@ -135,7 +117,7 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
135
117
|
bundlePolicy: 'max-bundle',
|
|
136
118
|
rtcpMuxPolicy: 'require',
|
|
137
119
|
...additionalSettings,
|
|
138
|
-
}
|
|
120
|
+
});
|
|
139
121
|
this._pc.addEventListener('icegatheringstatechange', () => {
|
|
140
122
|
this.emit('@icegatheringstatechange', this._pc.iceGatheringState);
|
|
141
123
|
});
|
|
@@ -176,6 +158,24 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
176
158
|
});
|
|
177
159
|
}
|
|
178
160
|
}
|
|
161
|
+
get name() {
|
|
162
|
+
return NAME;
|
|
163
|
+
}
|
|
164
|
+
close() {
|
|
165
|
+
logger.debug('close()');
|
|
166
|
+
if (this._closed) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
this._closed = true;
|
|
170
|
+
// Close RTCPeerConnection.
|
|
171
|
+
if (this._pc) {
|
|
172
|
+
try {
|
|
173
|
+
this._pc.close();
|
|
174
|
+
}
|
|
175
|
+
catch (error) { }
|
|
176
|
+
}
|
|
177
|
+
this.emit('@close');
|
|
178
|
+
}
|
|
179
179
|
async updateIceServers(iceServers) {
|
|
180
180
|
this.assertNotClosed();
|
|
181
181
|
logger.debug('updateIceServers()');
|
|
@@ -195,12 +195,18 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
195
195
|
const offer = await this._pc.createOffer({ iceRestart: true });
|
|
196
196
|
logger.debug('restartIce() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
197
197
|
await this._pc.setLocalDescription(offer);
|
|
198
|
-
const answer = {
|
|
198
|
+
const answer = {
|
|
199
|
+
type: 'answer',
|
|
200
|
+
sdp: this._remoteSdp.getSdp(),
|
|
201
|
+
};
|
|
199
202
|
logger.debug('restartIce() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
200
203
|
await this._pc.setRemoteDescription(answer);
|
|
201
204
|
}
|
|
202
205
|
else {
|
|
203
|
-
const offer = {
|
|
206
|
+
const offer = {
|
|
207
|
+
type: 'offer',
|
|
208
|
+
sdp: this._remoteSdp.getSdp(),
|
|
209
|
+
};
|
|
204
210
|
logger.debug('restartIce() | calling pc.setRemoteDescription() [offer:%o]', offer);
|
|
205
211
|
await this._pc.setRemoteDescription(offer);
|
|
206
212
|
const answer = await this._pc.createAnswer();
|
|
@@ -232,8 +238,6 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
232
238
|
}
|
|
233
239
|
let offer = await this._pc.createOffer();
|
|
234
240
|
let localSdpObject = sdpTransform.parse(offer.sdp);
|
|
235
|
-
// @ts-expect-error --- sdpTransform.SessionDescription type doesn't
|
|
236
|
-
// define extmapAllowMixed field.
|
|
237
241
|
if (localSdpObject.extmapAllowMixed) {
|
|
238
242
|
this._remoteSdp.setSessionExtmapAllowMixed();
|
|
239
243
|
}
|
|
@@ -253,7 +257,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
253
257
|
offerMediaObject,
|
|
254
258
|
numStreams: encodings.length,
|
|
255
259
|
});
|
|
256
|
-
offer = {
|
|
260
|
+
offer = {
|
|
261
|
+
type: 'offer',
|
|
262
|
+
sdp: sdpTransform.write(localSdpObject),
|
|
263
|
+
};
|
|
257
264
|
}
|
|
258
265
|
logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
259
266
|
await this._pc.setLocalDescription(offer);
|
|
@@ -300,7 +307,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
300
307
|
answerRtpParameters: sendingRemoteRtpParameters,
|
|
301
308
|
codecOptions,
|
|
302
309
|
});
|
|
303
|
-
const answer = {
|
|
310
|
+
const answer = {
|
|
311
|
+
type: 'answer',
|
|
312
|
+
sdp: this._remoteSdp.getSdp(),
|
|
313
|
+
};
|
|
304
314
|
logger.debug('send() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
305
315
|
await this._pc.setRemoteDescription(answer);
|
|
306
316
|
// Store in the map.
|
|
@@ -333,7 +343,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
333
343
|
const offer = await this._pc.createOffer();
|
|
334
344
|
logger.debug('stopSending() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
335
345
|
await this._pc.setLocalDescription(offer);
|
|
336
|
-
const answer = {
|
|
346
|
+
const answer = {
|
|
347
|
+
type: 'answer',
|
|
348
|
+
sdp: this._remoteSdp.getSdp(),
|
|
349
|
+
};
|
|
337
350
|
logger.debug('stopSending() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
338
351
|
await this._pc.setRemoteDescription(answer);
|
|
339
352
|
this._mapMidTransceiver.delete(localId);
|
|
@@ -351,7 +364,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
351
364
|
const offer = await this._pc.createOffer();
|
|
352
365
|
logger.debug('pauseSending() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
353
366
|
await this._pc.setLocalDescription(offer);
|
|
354
|
-
const answer = {
|
|
367
|
+
const answer = {
|
|
368
|
+
type: 'answer',
|
|
369
|
+
sdp: this._remoteSdp.getSdp(),
|
|
370
|
+
};
|
|
355
371
|
logger.debug('pauseSending() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
356
372
|
await this._pc.setRemoteDescription(answer);
|
|
357
373
|
}
|
|
@@ -368,7 +384,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
368
384
|
const offer = await this._pc.createOffer();
|
|
369
385
|
logger.debug('resumeSending() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
370
386
|
await this._pc.setLocalDescription(offer);
|
|
371
|
-
const answer = {
|
|
387
|
+
const answer = {
|
|
388
|
+
type: 'answer',
|
|
389
|
+
sdp: this._remoteSdp.getSdp(),
|
|
390
|
+
};
|
|
372
391
|
logger.debug('resumeSending() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
373
392
|
await this._pc.setRemoteDescription(answer);
|
|
374
393
|
}
|
|
@@ -409,7 +428,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
409
428
|
const offer = await this._pc.createOffer();
|
|
410
429
|
logger.debug('setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
411
430
|
await this._pc.setLocalDescription(offer);
|
|
412
|
-
const answer = {
|
|
431
|
+
const answer = {
|
|
432
|
+
type: 'answer',
|
|
433
|
+
sdp: this._remoteSdp.getSdp(),
|
|
434
|
+
};
|
|
413
435
|
logger.debug('setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
414
436
|
await this._pc.setRemoteDescription(answer);
|
|
415
437
|
}
|
|
@@ -430,7 +452,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
430
452
|
const offer = await this._pc.createOffer();
|
|
431
453
|
logger.debug('setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
432
454
|
await this._pc.setLocalDescription(offer);
|
|
433
|
-
const answer = {
|
|
455
|
+
const answer = {
|
|
456
|
+
type: 'answer',
|
|
457
|
+
sdp: this._remoteSdp.getSdp(),
|
|
458
|
+
};
|
|
434
459
|
logger.debug('setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
435
460
|
await this._pc.setRemoteDescription(answer);
|
|
436
461
|
}
|
|
@@ -464,7 +489,7 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
464
489
|
if (!this._hasDataChannelMediaSection) {
|
|
465
490
|
const offer = await this._pc.createOffer();
|
|
466
491
|
const localSdpObject = sdpTransform.parse(offer.sdp);
|
|
467
|
-
const offerMediaObject = localSdpObject.media.find(
|
|
492
|
+
const offerMediaObject = localSdpObject.media.find(m => m.type === 'application');
|
|
468
493
|
if (!this._transportReady) {
|
|
469
494
|
await this.setupTransport({
|
|
470
495
|
localDtlsRole: this._forcedLocalDtlsRole ?? 'client',
|
|
@@ -474,7 +499,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
474
499
|
logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer);
|
|
475
500
|
await this._pc.setLocalDescription(offer);
|
|
476
501
|
this._remoteSdp.sendSctpAssociation({ offerMediaObject });
|
|
477
|
-
const answer = {
|
|
502
|
+
const answer = {
|
|
503
|
+
type: 'answer',
|
|
504
|
+
sdp: this._remoteSdp.getSdp(),
|
|
505
|
+
};
|
|
478
506
|
logger.debug('sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer);
|
|
479
507
|
await this._pc.setRemoteDescription(answer);
|
|
480
508
|
this._hasDataChannelMediaSection = true;
|
|
@@ -505,7 +533,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
505
533
|
trackId,
|
|
506
534
|
});
|
|
507
535
|
}
|
|
508
|
-
const offer = {
|
|
536
|
+
const offer = {
|
|
537
|
+
type: 'offer',
|
|
538
|
+
sdp: this._remoteSdp.getSdp(),
|
|
539
|
+
};
|
|
509
540
|
logger.debug('receive() | calling pc.setRemoteDescription() [offer:%o]', offer);
|
|
510
541
|
await this._pc.setRemoteDescription(offer);
|
|
511
542
|
for (const options of optionsList) {
|
|
@@ -526,7 +557,7 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
526
557
|
for (const options of optionsList) {
|
|
527
558
|
const { trackId, rtpParameters } = options;
|
|
528
559
|
const localId = mapLocalId.get(trackId);
|
|
529
|
-
const answerMediaObject = localSdpObject.media.find(
|
|
560
|
+
const answerMediaObject = localSdpObject.media.find(m => String(m.mid) === localId);
|
|
530
561
|
// May need to modify codec parameters in the answer based on codec
|
|
531
562
|
// parameters in the offer.
|
|
532
563
|
sdpCommonUtils.applyCodecParameters({
|
|
@@ -534,7 +565,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
534
565
|
answerMediaObject,
|
|
535
566
|
});
|
|
536
567
|
}
|
|
537
|
-
answer = {
|
|
568
|
+
answer = {
|
|
569
|
+
type: 'answer',
|
|
570
|
+
sdp: sdpTransform.write(localSdpObject),
|
|
571
|
+
};
|
|
538
572
|
if (!this._transportReady) {
|
|
539
573
|
await this.setupTransport({
|
|
540
574
|
localDtlsRole: this._forcedLocalDtlsRole ?? 'client',
|
|
@@ -575,7 +609,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
575
609
|
}
|
|
576
610
|
this._remoteSdp.closeMediaSection(transceiver.mid);
|
|
577
611
|
}
|
|
578
|
-
const offer = {
|
|
612
|
+
const offer = {
|
|
613
|
+
type: 'offer',
|
|
614
|
+
sdp: this._remoteSdp.getSdp(),
|
|
615
|
+
};
|
|
579
616
|
logger.debug('stopReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer);
|
|
580
617
|
await this._pc.setRemoteDescription(offer);
|
|
581
618
|
const answer = await this._pc.createAnswer();
|
|
@@ -597,7 +634,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
597
634
|
transceiver.direction = 'inactive';
|
|
598
635
|
this._remoteSdp.pauseMediaSection(localId);
|
|
599
636
|
}
|
|
600
|
-
const offer = {
|
|
637
|
+
const offer = {
|
|
638
|
+
type: 'offer',
|
|
639
|
+
sdp: this._remoteSdp.getSdp(),
|
|
640
|
+
};
|
|
601
641
|
logger.debug('pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer);
|
|
602
642
|
await this._pc.setRemoteDescription(offer);
|
|
603
643
|
const answer = await this._pc.createAnswer();
|
|
@@ -616,7 +656,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
616
656
|
transceiver.direction = 'recvonly';
|
|
617
657
|
this._remoteSdp.resumeReceivingMediaSection(localId);
|
|
618
658
|
}
|
|
619
|
-
const offer = {
|
|
659
|
+
const offer = {
|
|
660
|
+
type: 'offer',
|
|
661
|
+
sdp: this._remoteSdp.getSdp(),
|
|
662
|
+
};
|
|
620
663
|
logger.debug('resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer);
|
|
621
664
|
await this._pc.setRemoteDescription(offer);
|
|
622
665
|
const answer = await this._pc.createAnswer();
|
|
@@ -650,7 +693,10 @@ class Safari12 extends HandlerInterface_1.HandlerInterface {
|
|
|
650
693
|
// m=application section.
|
|
651
694
|
if (!this._hasDataChannelMediaSection) {
|
|
652
695
|
this._remoteSdp.receiveSctpAssociation();
|
|
653
|
-
const offer = {
|
|
696
|
+
const offer = {
|
|
697
|
+
type: 'offer',
|
|
698
|
+
sdp: this._remoteSdp.getSdp(),
|
|
699
|
+
};
|
|
654
700
|
logger.debug('receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]', offer);
|
|
655
701
|
await this._pc.setRemoteDescription(offer);
|
|
656
702
|
const answer = await this._pc.createAnswer();
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import type * as SdpTransform from 'sdp-transform';
|
|
1
2
|
import type { IceParameters, IceCandidate, DtlsParameters, DtlsRole, PlainRtpParameters } from '../../Transport';
|
|
2
3
|
import type { ProducerCodecOptions } from '../../Producer';
|
|
3
4
|
import type { MediaKind, RtpParameters } from '../../RtpParameters';
|
|
4
5
|
import type { SctpParameters } from '../../SctpParameters';
|
|
5
6
|
export declare abstract class MediaSection {
|
|
6
|
-
protected readonly _mediaObject:
|
|
7
|
+
protected readonly _mediaObject: SdpTransform.MediaDescription;
|
|
7
8
|
constructor({ iceParameters, iceCandidates, dtlsParameters, }: {
|
|
8
9
|
iceParameters?: IceParameters;
|
|
9
10
|
iceCandidates?: IceCandidate[];
|
|
@@ -12,7 +13,7 @@ export declare abstract class MediaSection {
|
|
|
12
13
|
abstract setDtlsRole(role: DtlsRole): void;
|
|
13
14
|
get mid(): string;
|
|
14
15
|
get closed(): boolean;
|
|
15
|
-
getObject():
|
|
16
|
+
getObject(): SdpTransform.MediaDescription;
|
|
16
17
|
setIceParameters(iceParameters: IceParameters): void;
|
|
17
18
|
pause(): void;
|
|
18
19
|
abstract resume(): void;
|
|
@@ -26,7 +27,7 @@ export declare class AnswerMediaSection extends MediaSection {
|
|
|
26
27
|
dtlsParameters?: DtlsParameters;
|
|
27
28
|
sctpParameters?: SctpParameters;
|
|
28
29
|
plainRtpParameters?: PlainRtpParameters;
|
|
29
|
-
offerMediaObject:
|
|
30
|
+
offerMediaObject: SdpTransform.MediaDescription;
|
|
30
31
|
offerRtpParameters?: RtpParameters;
|
|
31
32
|
answerRtpParameters?: RtpParameters;
|
|
32
33
|
codecOptions?: ProducerCodecOptions;
|
|
@@ -36,7 +37,7 @@ export declare class AnswerMediaSection extends MediaSection {
|
|
|
36
37
|
muxSimulcastStreams(encodings: RTCRtpEncodingParameters[]): void;
|
|
37
38
|
}
|
|
38
39
|
export declare class OfferMediaSection extends MediaSection {
|
|
39
|
-
constructor({ iceParameters, iceCandidates, dtlsParameters, sctpParameters, plainRtpParameters, mid, kind, offerRtpParameters, streamId, trackId,
|
|
40
|
+
constructor({ iceParameters, iceCandidates, dtlsParameters, sctpParameters, plainRtpParameters, mid, kind, offerRtpParameters, streamId, trackId, }: {
|
|
40
41
|
iceParameters?: IceParameters;
|
|
41
42
|
iceCandidates?: IceCandidate[];
|
|
42
43
|
dtlsParameters?: DtlsParameters;
|
|
@@ -47,7 +48,6 @@ export declare class OfferMediaSection extends MediaSection {
|
|
|
47
48
|
offerRtpParameters?: RtpParameters;
|
|
48
49
|
streamId?: string;
|
|
49
50
|
trackId?: string;
|
|
50
|
-
oldDataChannelSpec?: boolean;
|
|
51
51
|
});
|
|
52
52
|
setDtlsRole(role: DtlsRole): void;
|
|
53
53
|
resume(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaSection.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/MediaSection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MediaSection.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/MediaSection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,YAAY,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EACX,aAAa,EACb,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EACX,SAAS,EACT,aAAa,EAGb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,8BAAsB,YAAY;IAEjC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC,gBAAgB,CAAC;gBAEnD,EACX,aAAa,EACb,aAAa,EACb,cAAc,GACd,EAAE;QACF,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;QAC/B,cAAc,CAAC,EAAE,cAAc,CAAC;KAChC;IAmDD,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAE1C,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,SAAS,IAAI,YAAY,CAAC,gBAAgB;IAI1C,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAKpD,KAAK,IAAI,IAAI;IAIb,QAAQ,CAAC,MAAM,IAAI,IAAI;IAEvB,OAAO,IAAI,IAAI;IAYf,KAAK,IAAI,IAAI;CAKb;AAED,qBAAa,kBAAmB,SAAQ,YAAY;gBACvC,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,GACZ,EAAE;QACF,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;QAC/B,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;QACxC,gBAAgB,EAAE,YAAY,CAAC,gBAAgB,CAAC;QAChD,kBAAkB,CAAC,EAAE,aAAa,CAAC;QACnC,mBAAmB,CAAC,EAAE,aAAa,CAAC;QACpC,YAAY,CAAC,EAAE,oBAAoB,CAAC;KACpC;IAiQD,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAsBjC,MAAM,IAAI,IAAI;IAId,mBAAmB,CAAC,SAAS,EAAE,wBAAwB,EAAE,GAAG,IAAI;CA6BhE;AAED,qBAAa,iBAAkB,SAAQ,YAAY;gBACtC,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,GAAG,EACH,IAAI,EACJ,kBAAkB,EAClB,QAAQ,EACR,OAAO,GACP,EAAE;QACF,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;QAC/B,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;QACxC,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,SAAS,GAAG,aAAa,CAAC;QAChC,kBAAkB,CAAC,EAAE,aAAa,CAAC;QACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KACjB;IA4ID,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAKjC,MAAM,IAAI,IAAI;CAGd"}
|
|
@@ -7,25 +7,33 @@ class MediaSection {
|
|
|
7
7
|
// SDP media object.
|
|
8
8
|
_mediaObject;
|
|
9
9
|
constructor({ iceParameters, iceCandidates, dtlsParameters, }) {
|
|
10
|
-
this._mediaObject = {
|
|
10
|
+
this._mediaObject = {
|
|
11
|
+
type: '',
|
|
12
|
+
port: 0,
|
|
13
|
+
protocol: '',
|
|
14
|
+
payloads: '',
|
|
15
|
+
rtp: [],
|
|
16
|
+
fmtp: [],
|
|
17
|
+
};
|
|
11
18
|
if (iceParameters) {
|
|
12
19
|
this.setIceParameters(iceParameters);
|
|
13
20
|
}
|
|
14
21
|
if (iceCandidates) {
|
|
15
22
|
this._mediaObject.candidates = [];
|
|
16
23
|
for (const candidate of iceCandidates) {
|
|
17
|
-
const candidateObject = {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
const candidateObject = {
|
|
25
|
+
foundation: candidate.foundation,
|
|
26
|
+
// mediasoup does mandates rtcp-mux so candidates component is always
|
|
27
|
+
// RTP (1).
|
|
28
|
+
component: 1,
|
|
29
|
+
// Be ready for new candidate.address field in mediasoup server side
|
|
30
|
+
// field and keep backward compatibility with deprecated candidate.ip.
|
|
31
|
+
ip: candidate.address ?? candidate.ip,
|
|
32
|
+
port: candidate.port,
|
|
33
|
+
priority: candidate.priority,
|
|
34
|
+
transport: candidate.protocol,
|
|
35
|
+
type: candidate.type,
|
|
36
|
+
};
|
|
29
37
|
if (candidate.tcpType) {
|
|
30
38
|
candidateObject.tcptype = candidate.tcpType;
|
|
31
39
|
}
|
|
@@ -114,25 +122,25 @@ class AnswerMediaSection extends MediaSection {
|
|
|
114
122
|
case 'audio/multiopus': {
|
|
115
123
|
if (opusStereo !== undefined) {
|
|
116
124
|
offerCodec.parameters['sprop-stereo'] = opusStereo ? 1 : 0;
|
|
117
|
-
codecParameters
|
|
125
|
+
codecParameters['stereo'] = opusStereo ? 1 : 0;
|
|
118
126
|
}
|
|
119
127
|
if (opusFec !== undefined) {
|
|
120
|
-
offerCodec.parameters
|
|
121
|
-
codecParameters
|
|
128
|
+
offerCodec.parameters['useinbandfec'] = opusFec ? 1 : 0;
|
|
129
|
+
codecParameters['useinbandfec'] = opusFec ? 1 : 0;
|
|
122
130
|
}
|
|
123
131
|
if (opusDtx !== undefined) {
|
|
124
|
-
offerCodec.parameters
|
|
125
|
-
codecParameters
|
|
132
|
+
offerCodec.parameters['usedtx'] = opusDtx ? 1 : 0;
|
|
133
|
+
codecParameters['usedtx'] = opusDtx ? 1 : 0;
|
|
126
134
|
}
|
|
127
135
|
if (opusMaxPlaybackRate !== undefined) {
|
|
128
|
-
codecParameters
|
|
136
|
+
codecParameters['maxplaybackrate'] = opusMaxPlaybackRate;
|
|
129
137
|
}
|
|
130
138
|
if (opusMaxAverageBitrate !== undefined) {
|
|
131
|
-
codecParameters
|
|
139
|
+
codecParameters['maxaveragebitrate'] = opusMaxAverageBitrate;
|
|
132
140
|
}
|
|
133
141
|
if (opusPtime !== undefined) {
|
|
134
|
-
offerCodec.parameters
|
|
135
|
-
codecParameters
|
|
142
|
+
offerCodec.parameters['ptime'] = opusPtime;
|
|
143
|
+
codecParameters['ptime'] = opusPtime;
|
|
136
144
|
}
|
|
137
145
|
// If opusNack is not set, we must remove NACK support for OPUS.
|
|
138
146
|
// Otherwise it would be enabled for those handlers that artificially
|
|
@@ -251,7 +259,7 @@ class AnswerMediaSection extends MediaSection {
|
|
|
251
259
|
}
|
|
252
260
|
// Old spec.
|
|
253
261
|
else if (offerMediaObject.sctpmap) {
|
|
254
|
-
this._mediaObject.payloads = sctpParameters.port;
|
|
262
|
+
this._mediaObject.payloads = String(sctpParameters.port);
|
|
255
263
|
this._mediaObject.sctpmap = {
|
|
256
264
|
app: 'webrtc-datachannel',
|
|
257
265
|
sctpmapNumber: sctpParameters.port,
|
|
@@ -305,7 +313,7 @@ class AnswerMediaSection extends MediaSection {
|
|
|
305
313
|
}
|
|
306
314
|
exports.AnswerMediaSection = AnswerMediaSection;
|
|
307
315
|
class OfferMediaSection extends MediaSection {
|
|
308
|
-
constructor({ iceParameters, iceCandidates, dtlsParameters, sctpParameters, plainRtpParameters, mid, kind, offerRtpParameters, streamId, trackId,
|
|
316
|
+
constructor({ iceParameters, iceCandidates, dtlsParameters, sctpParameters, plainRtpParameters, mid, kind, offerRtpParameters, streamId, trackId, }) {
|
|
309
317
|
super({ iceParameters, iceCandidates, dtlsParameters });
|
|
310
318
|
this._mediaObject.mid = String(mid);
|
|
311
319
|
this._mediaObject.type = kind;
|
|
@@ -352,7 +360,7 @@ class OfferMediaSection extends MediaSection {
|
|
|
352
360
|
payload: codec.payloadType,
|
|
353
361
|
config: '',
|
|
354
362
|
};
|
|
355
|
-
for (const key of Object.keys(codec.parameters)) {
|
|
363
|
+
for (const key of Object.keys(codec.parameters ?? {})) {
|
|
356
364
|
if (fmtp.config) {
|
|
357
365
|
fmtp.config += ';';
|
|
358
366
|
}
|
|
@@ -386,7 +394,7 @@ class OfferMediaSection extends MediaSection {
|
|
|
386
394
|
const rtxSsrc = encoding.rtx?.ssrc;
|
|
387
395
|
this._mediaObject.ssrcs = [];
|
|
388
396
|
this._mediaObject.ssrcGroups = [];
|
|
389
|
-
if (offerRtpParameters.rtcp.cname) {
|
|
397
|
+
if (ssrc && offerRtpParameters.rtcp.cname) {
|
|
390
398
|
this._mediaObject.ssrcs.push({
|
|
391
399
|
id: ssrc,
|
|
392
400
|
attribute: 'cname',
|
|
@@ -402,29 +410,19 @@ class OfferMediaSection extends MediaSection {
|
|
|
402
410
|
});
|
|
403
411
|
}
|
|
404
412
|
// Associate original and retransmission SSRCs.
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
413
|
+
if (ssrc) {
|
|
414
|
+
this._mediaObject.ssrcGroups.push({
|
|
415
|
+
semantics: 'FID',
|
|
416
|
+
ssrcs: `${ssrc} ${rtxSsrc}`,
|
|
417
|
+
});
|
|
418
|
+
}
|
|
409
419
|
}
|
|
410
420
|
break;
|
|
411
421
|
}
|
|
412
422
|
case 'application': {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
this._mediaObject.sctpPort = sctpParameters.port;
|
|
417
|
-
this._mediaObject.maxMessageSize = sctpParameters.maxMessageSize;
|
|
418
|
-
}
|
|
419
|
-
// Old spec.
|
|
420
|
-
else {
|
|
421
|
-
this._mediaObject.payloads = sctpParameters.port;
|
|
422
|
-
this._mediaObject.sctpmap = {
|
|
423
|
-
app: 'webrtc-datachannel',
|
|
424
|
-
sctpmapNumber: sctpParameters.port,
|
|
425
|
-
maxMessageSize: sctpParameters.maxMessageSize,
|
|
426
|
-
};
|
|
427
|
-
}
|
|
423
|
+
this._mediaObject.payloads = 'webrtc-datachannel';
|
|
424
|
+
this._mediaObject.sctpPort = sctpParameters.port;
|
|
425
|
+
this._mediaObject.maxMessageSize = sctpParameters.maxMessageSize;
|
|
428
426
|
break;
|
|
429
427
|
}
|
|
430
428
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type * as SdpTransform from 'sdp-transform';
|
|
1
2
|
import { MediaSection } from './MediaSection';
|
|
2
3
|
import type { IceParameters, IceCandidate, DtlsParameters, DtlsRole, PlainRtpParameters } from '../../Transport';
|
|
3
4
|
import type { ProducerCodecOptions } from '../../Producer';
|
|
@@ -31,7 +32,7 @@ export declare class RemoteSdp {
|
|
|
31
32
|
reuseMid?: string;
|
|
32
33
|
};
|
|
33
34
|
send({ offerMediaObject, reuseMid, offerRtpParameters, answerRtpParameters, codecOptions, }: {
|
|
34
|
-
offerMediaObject:
|
|
35
|
+
offerMediaObject: SdpTransform.MediaDescription;
|
|
35
36
|
reuseMid?: string;
|
|
36
37
|
offerRtpParameters: RtpParameters;
|
|
37
38
|
answerRtpParameters: RtpParameters;
|
|
@@ -57,12 +58,10 @@ export declare class RemoteSdp {
|
|
|
57
58
|
*/
|
|
58
59
|
closeMediaSection(mid: string): boolean;
|
|
59
60
|
muxMediaSectionSimulcast(mid: string, encodings: RTCRtpEncodingParameters[]): void;
|
|
60
|
-
sendSctpAssociation({ offerMediaObject }: {
|
|
61
|
-
offerMediaObject:
|
|
62
|
-
}): void;
|
|
63
|
-
receiveSctpAssociation({ oldDataChannelSpec, }?: {
|
|
64
|
-
oldDataChannelSpec?: boolean;
|
|
61
|
+
sendSctpAssociation({ offerMediaObject, }: {
|
|
62
|
+
offerMediaObject: SdpTransform.MediaDescription;
|
|
65
63
|
}): void;
|
|
64
|
+
receiveSctpAssociation(): void;
|
|
66
65
|
getSdp(): string;
|
|
67
66
|
_addMediaSection(newMediaSection: MediaSection): void;
|
|
68
67
|
_replaceMediaSection(newMediaSection: MediaSection, reuseMid?: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteSdp.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/RemoteSdp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RemoteSdp.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/RemoteSdp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,YAAY,MAAM,eAAe,CAAC;AAEnD,OAAO,EACN,YAAY,EAGZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACX,aAAa,EACb,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM3D,qBAAa,SAAS;IAErB,OAAO,CAAC,cAAc,CAAC,CAAgB;IAEvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IAEjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAElD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAElD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAqB;IAE1D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;IAErD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAE9D,OAAO,CAAC,SAAS,CAAC,CAAS;IAE3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;gBAEjD,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,GAClB,EAAE;QACF,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;QAC/B,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;KACxC;IAgDD,mBAAmB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAWvD,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAUpC;;OAEG;IACH,0BAA0B,IAAI,IAAI;IAMlC,sBAAsB,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAc5D,IAAI,CAAC,EACJ,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,GACZ,EAAE;QACF,gBAAgB,EAAE,YAAY,CAAC,gBAAgB,CAAC;QAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,kBAAkB,EAAE,aAAa,CAAC;QAClC,mBAAmB,EAAE,aAAa,CAAC;QACnC,YAAY,CAAC,EAAE,oBAAoB,CAAC;KACpC,GAAG,IAAI;IA0CR,OAAO,CAAC,EACP,GAAG,EACH,IAAI,EACJ,kBAAkB,EAClB,QAAQ,EACR,OAAO,GACP,EAAE;QACF,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,SAAS,CAAC;QAChB,kBAAkB,EAAE,aAAa,CAAC;QAClC,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KAChB,GAAG,IAAI;IA4BR,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMpC,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM5C,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM9C,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMtC;;;;;;OAMG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAwBvC,wBAAwB,CACvB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,wBAAwB,EAAE,GACnC,IAAI;IAQP,mBAAmB,CAAC,EACnB,gBAAgB,GAChB,EAAE;QACF,gBAAgB,EAAE,YAAY,CAAC,gBAAgB,CAAC;KAChD,GAAG,IAAI;IAaR,sBAAsB,IAAI,IAAI;IAc9B,MAAM,IAAI,MAAM;IAOhB,gBAAgB,CAAC,eAAe,EAAE,YAAY,GAAG,IAAI;IAkBrD,oBAAoB,CAAC,eAAe,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAwC5E,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;IAU5C,qBAAqB,IAAI,IAAI;CAU7B"}
|