werift 0.19.8 → 0.20.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/webrtc/src/nonstandard/navigator.d.ts +8 -0
- package/lib/webrtc/src/nonstandard/navigator.js +22 -0
- package/lib/webrtc/src/nonstandard/navigator.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +3 -0
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +6 -4
- package/lib/webrtc/src/peerConnection.js +18 -7
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +1 -1
- package/lib/webrtc/src/transport/ice.js +4 -1
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/package.json +1 -1
- package/src/nonstandard/navigator.ts +27 -0
- package/src/nonstandard/recorder/writer/webm.ts +4 -0
- package/src/peerConnection.ts +26 -14
- package/src/transport/ice.ts +5 -4
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { RTCRtpCodecParameters } from "..";
|
|
1
2
|
import { MediaStream, MediaStreamTrack } from "../media/track";
|
|
2
3
|
export declare class Navigator {
|
|
3
4
|
mediaDevices: MediaDevices;
|
|
@@ -16,6 +17,13 @@ export declare class MediaDevices extends EventTarget {
|
|
|
16
17
|
});
|
|
17
18
|
readonly getUserMedia: (constraints: MediaStreamConstraints) => Promise<MediaStream>;
|
|
18
19
|
readonly getDisplayMedia: (constraints: MediaStreamConstraints) => Promise<MediaStream>;
|
|
20
|
+
readonly getUdpMedia: ({ port, codec, }: {
|
|
21
|
+
port: number;
|
|
22
|
+
codec: ConstructorParameters<typeof RTCRtpCodecParameters>[0];
|
|
23
|
+
}) => {
|
|
24
|
+
track: MediaStreamTrack;
|
|
25
|
+
disposer: () => void;
|
|
26
|
+
};
|
|
19
27
|
}
|
|
20
28
|
interface MediaStreamConstraints {
|
|
21
29
|
audio?: boolean | MediaTrackConstraints;
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MediaDevices = exports.Navigator = void 0;
|
|
4
4
|
const crypto_1 = require("crypto");
|
|
5
|
+
const dgram_1 = require("dgram");
|
|
5
6
|
const jspack_1 = require("@shinyoshiaki/jspack");
|
|
7
|
+
const __1 = require("..");
|
|
6
8
|
const track_1 = require("../media/track");
|
|
7
9
|
class Navigator {
|
|
8
10
|
constructor(props = {}) {
|
|
@@ -80,6 +82,26 @@ class MediaDevices extends EventTarget {
|
|
|
80
82
|
writable: true,
|
|
81
83
|
value: this.getUserMedia
|
|
82
84
|
});
|
|
85
|
+
Object.defineProperty(this, "getUdpMedia", {
|
|
86
|
+
enumerable: true,
|
|
87
|
+
configurable: true,
|
|
88
|
+
writable: true,
|
|
89
|
+
value: ({ port, codec, }) => {
|
|
90
|
+
const track = new track_1.MediaStreamTrack({
|
|
91
|
+
kind: "audio",
|
|
92
|
+
codec: new __1.RTCRtpCodecParameters(codec),
|
|
93
|
+
});
|
|
94
|
+
const udp = (0, dgram_1.createSocket)("udp4");
|
|
95
|
+
udp.bind(port);
|
|
96
|
+
udp.on("message", (data) => {
|
|
97
|
+
track.writeRtp(data);
|
|
98
|
+
});
|
|
99
|
+
const disposer = () => {
|
|
100
|
+
udp.close();
|
|
101
|
+
};
|
|
102
|
+
return { track, disposer };
|
|
103
|
+
}
|
|
104
|
+
});
|
|
83
105
|
this.video = props.video;
|
|
84
106
|
this.audio = props.audio;
|
|
85
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigator.js","sourceRoot":"","sources":["../../../../src/nonstandard/navigator.ts"],"names":[],"mappings":";;;AAAA,mCAAqC;AACrC,iDAA8C;AAC9C,0CAA+D;AAE/D,MAAa,SAAS;IAGpB,YAAY,QAAuD,EAAE;QAFrE;;;;;WAA2B;QAGzB,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;CACF;AAND,8BAMC;AAED,MAAa,YAAa,SAAQ,WAAW;IAI3C,YACW,KAA6D;QAEtE,KAAK,EAAE,CAAC;QAFR;;;;mBAAS,KAAK;WAAwD;QAJxE;;;;;WAAyB;QACzB;;;;;WAAyB;QAUhB;;;;mBAAe,KAAK,EAC3B,WAAmC,EACb,EAAE;gBACxB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK;oBAC7B,CAAC,CAAC,IAAI,wBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oBACzC,CAAC,CAAC,SAAS,CAAC;gBACd,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;wBACzC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;wBAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,eAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAA,oBAAW,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC5D,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACrC,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK;oBAC7B,CAAC,CAAC,IAAI,wBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oBACzC,CAAC,CAAC,SAAS,CAAC;gBACd,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;wBACzC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;wBAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,eAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAA,oBAAW,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC5D,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACrC,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;oBAC3C,OAAO,IAAI,mBAAW,CAAC,CAAC,KAAM,EAAE,KAAM,CAAC,CAAC,CAAC;gBAC3C,CAAC;qBAAM,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;oBAC7B,OAAO,IAAI,mBAAW,CAAC,CAAC,KAAM,CAAC,CAAC,CAAC;gBACnC,CAAC;qBAAM,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;oBAC7B,OAAO,IAAI,mBAAW,CAAC,CAAC,KAAM,CAAC,CAAC,CAAC;gBACnC,CAAC;gBAED,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACrC,CAAC;WAAC;QAEO;;;;mBAAkB,IAAI,CAAC,YAAY;WAAC;
|
|
1
|
+
{"version":3,"file":"navigator.js","sourceRoot":"","sources":["../../../../src/nonstandard/navigator.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { createSocket } from \"dgram\";\nimport { jspack } from \"@shinyoshiaki/jspack\";\nimport { RTCRtpCodecParameters } from \"..\";\nimport { MediaStream, MediaStreamTrack } from \"../media/track\";\n\nexport class Navigator {\n mediaDevices: MediaDevices;\n\n constructor(props: ConstructorParameters<typeof MediaDevices>[0] = {}) {\n this.mediaDevices = new MediaDevices(props);\n }\n}\n\nexport class MediaDevices extends EventTarget {\n video?: MediaStreamTrack;\n audio?: MediaStreamTrack;\n\n constructor(\n readonly props: { video?: MediaStreamTrack; audio?: MediaStreamTrack },\n ) {\n super();\n this.video = props.video;\n this.audio = props.audio;\n }\n\n readonly getUserMedia = async (\n constraints: MediaStreamConstraints,\n ): Promise<MediaStream> => {\n const video = constraints.video\n ? new MediaStreamTrack({ kind: \"video\" })\n : undefined;\n if (video) {\n this.video?.onReceiveRtp.subscribe((rtp) => {\n const cloned = rtp.clone();\n cloned.header.ssrc = jspack.Unpack(\"!L\", randomBytes(4))[0];\n video.onReceiveRtp.execute(cloned);\n });\n }\n const audio = constraints.audio\n ? new MediaStreamTrack({ kind: \"audio\" })\n : undefined;\n if (audio) {\n this.audio?.onReceiveRtp.subscribe((rtp) => {\n const cloned = rtp.clone();\n cloned.header.ssrc = jspack.Unpack(\"!L\", randomBytes(4))[0];\n audio.onReceiveRtp.execute(cloned);\n });\n }\n\n if (constraints.video && constraints.audio) {\n return new MediaStream([video!, audio!]);\n } else if (constraints.audio) {\n return new MediaStream([audio!]);\n } else if (constraints.video) {\n return new MediaStream([video!]);\n }\n\n throw new Error(\"Not implemented\");\n };\n\n readonly getDisplayMedia = this.getUserMedia;\n\n readonly getUdpMedia = ({\n port,\n codec,\n }: {\n port: number;\n codec: ConstructorParameters<typeof RTCRtpCodecParameters>[0];\n }) => {\n const track = new MediaStreamTrack({\n kind: \"audio\",\n codec: new RTCRtpCodecParameters(codec),\n });\n\n const udp = createSocket(\"udp4\");\n udp.bind(port);\n udp.on(\"message\", (data) => {\n track.writeRtp(data);\n });\n\n const disposer = () => {\n udp.close();\n };\n\n return { track, disposer };\n };\n}\n\ninterface MediaStreamConstraints {\n audio?: boolean | MediaTrackConstraints;\n peerIdentity?: string;\n preferCurrentTab?: boolean;\n video?: boolean | MediaTrackConstraints;\n}\n\ninterface MediaTrackConstraints extends MediaTrackConstraintSet {\n advanced?: MediaTrackConstraintSet[];\n}\n\ninterface MediaTrackConstraintSet {\n aspectRatio?: ConstrainDouble;\n autoGainControl?: ConstrainBoolean;\n channelCount?: ConstrainULong;\n deviceId?: ConstrainDOMString;\n displaySurface?: ConstrainDOMString;\n echoCancellation?: ConstrainBoolean;\n facingMode?: ConstrainDOMString;\n frameRate?: ConstrainDouble;\n groupId?: ConstrainDOMString;\n height?: ConstrainULong;\n noiseSuppression?: ConstrainBoolean;\n sampleRate?: ConstrainULong;\n sampleSize?: ConstrainULong;\n width?: ConstrainULong;\n}\n\ntype ConstrainDOMString = string | string[] | ConstrainDOMStringParameters;\ninterface ConstrainDOMStringParameters {\n exact?: string | string[];\n ideal?: string | string[];\n}\ntype ConstrainBoolean = boolean | ConstrainBooleanParameters;\ninterface ConstrainBooleanParameters {\n exact?: boolean;\n ideal?: boolean;\n}\ntype ConstrainULong = number | ConstrainULongRange;\ninterface ConstrainULongRange extends ULongRange {\n exact?: number;\n ideal?: number;\n}\ninterface ULongRange {\n max?: number;\n min?: number;\n}\ntype ConstrainDouble = number | ConstrainDoubleRange;\ninterface ConstrainDoubleRange extends DoubleRange {\n exact?: number;\n ideal?: number;\n}\ninterface DoubleRange {\n max?: number;\n min?: number;\n}\n"]}
|
|
@@ -74,6 +74,9 @@ class WebmFactory extends _1.MediaWriter {
|
|
|
74
74
|
duration: this.props.defaultDuration ?? 1000 * 60 * 60 * 24,
|
|
75
75
|
});
|
|
76
76
|
const lipsync = new extra_1.LipsyncCallback();
|
|
77
|
+
if (inputTracks.length === 1 || this.props.disableNtp) {
|
|
78
|
+
this.props.disableLipSync = true;
|
|
79
|
+
}
|
|
77
80
|
this.rtpSources = inputTracks.map(({ track, clockRate, codec }) => {
|
|
78
81
|
const rtpSource = new extra_1.RtpSourceCallback();
|
|
79
82
|
const rtcpSource = new extra_1.RtcpSourceCallback();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/webm.ts"],"names":[],"mappings":";;;AAAA,0CAAqC;AACrC,qCAAwC;AAExC,wBAAgC;AAChC,gCAA8D;AAC9D,wDAWsC;AAEtC,MAAM,UAAU,GAAG,yDAAyD,CAAC;AAE7E,MAAa,WAAY,SAAQ,cAAW;IAA5C;;QACE;;;;mBAAkC,EAAE;WAAC;QAErC;;;;mBAAgB,IAAI,uBAAa,EAAE;WAAC;
|
|
1
|
+
{"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/webm.ts"],"names":[],"mappings":";;;AAAA,0CAAqC;AACrC,qCAAwC;AAExC,wBAAgC;AAChC,gCAA8D;AAC9D,wDAWsC;AAEtC,MAAM,UAAU,GAAG,yDAAyD,CAAC;AAE7E,MAAa,WAAY,SAAQ,cAAW;IAA5C;;QACE;;;;mBAAkC,EAAE;WAAC;QAErC;;;;mBAAgB,IAAI,uBAAa,EAAE;WAAC;IA+HtC,CAAC;IA7HC,KAAK,CAAC,KAAK,CAAC,MAA0B;QACpC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,IAAA,iBAAM,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAC1C,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,WAAW,GAAG,KAAK,CAAC,KAAM,CAAC,WAAW,CAAC;YAE7C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,CAAC,GAAmB,EAAE;oBAClC,QAAQ,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAyB,EAAE,CAAC;wBAC/D,KAAK,KAAK;4BACR,OAAO,KAAK,CAAC;wBACf,KAAK,KAAK;4BACR,OAAO,KAAK,CAAC;wBACf,KAAK,MAAM;4BACT,OAAO,eAAe,CAAC;wBACzB,KAAK,MAAM;4BACT,OAAO,KAAK,CAAC;wBACf;4BACE,MAAM,IAAI,eAAW,CAAC;gCACpB,OAAO,EAAE,mBAAmB;gCAC5B,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE;6BACrC,CAAC,CAAC;oBACP,CAAC;gBACH,CAAC,CAAC,EAAE,CAAC;gBACL,OAAO;oBACL,IAAI,EAAE,OAAgB;oBACtB,KAAK;oBACL,SAAS,EAAE,KAAK;oBAChB,WAAW;oBACX,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,GAAG;oBAC9B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG;oBAChC,WAAW;oBACX,KAAK;iBACN,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,IAAI,EAAE,OAAgB;oBACtB,KAAK,EAAE,MAAe;oBACtB,SAAS,EAAE,KAAK;oBAChB,WAAW;oBACX,WAAW;oBACX,KAAK;iBACN,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAI,oBAAY,CAAC,WAAW,EAAE;YACzC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;SAC5D,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,uBAAe,EAAE,CAAC;QAEtC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;YAChE,MAAM,SAAS,GAAG,IAAI,yBAAiB,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,0BAAkB,EAAE,CAAC;YAC5C,KAAK,CAAC,YAAY;iBACf,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;gBACjB,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/B,CAAC,CAAC;iBACD,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAChC,KAAK,CAAC,aAAa;iBAChB,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;gBAClB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC,CAAC;iBACD,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU;gBAChC,CAAC,CAAC,IAAI,uBAAe,CAAC,SAAS,CAAC;gBAChC,CAAC,CAAC,IAAI,uBAAe,CAAC,SAAS,CAAC,CAAC;YAEnC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,MAAM,YAAY,GAAG,IAAI,2BAAmB,CAAC,KAAK,EAAE;oBAClD,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;iBACzC,CAAC,CAAC;gBACH,MAAM,YAAY,GAAG,IAAI,4BAAoB,CAAC,SAAS,EAAE;oBACvD,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB;oBACvC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB;iBACxC,CAAC,CAAC;gBAEH,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACnC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAE5B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;oBAC9B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBACtC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,GAAG,IAAI,2BAAmB,CAAC,KAAK,CAAC,CAAC;gBAEpD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAE5B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;oBAC9B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBACtC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,IAAA,wBAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBACpB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;CACF;AAlID,kCAkIC;AAED,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC","sourcesContent":["import { unlink } from \"fs/promises\";\nimport { EventDisposer } from \"rx.mini\";\n\nimport { MediaWriter } from \".\";\nimport { type MediaStreamTrack, WeriftError } from \"../../..\";\nimport {\n DepacketizeCallback,\n JitterBufferCallback,\n LipsyncCallback,\n NtpTimeCallback,\n RtcpSourceCallback,\n RtpSourceCallback,\n RtpTimeCallback,\n type SupportedCodec,\n WebmCallback,\n saveToFileSystem,\n} from \"../../../../../rtp/src/extra\";\n\nconst sourcePath = \"packages/webrtc/src/nonstandard/recorder/writer/webm.ts\";\n\nexport class WebmFactory extends MediaWriter {\n rtpSources: RtpSourceCallback[] = [];\n\n unSubscribers = new EventDisposer();\n\n async start(tracks: MediaStreamTrack[]) {\n if (this.props.path) {\n await unlink(this.props.path).catch((e) => e);\n }\n\n const inputTracks = tracks.map((track, i) => {\n const trackNumber = i + 1;\n const payloadType = track.codec!.payloadType;\n\n if (track.kind === \"video\") {\n const codec = ((): SupportedCodec => {\n switch (track.codec?.name.toLowerCase() as SupportedVideoCodec) {\n case \"vp8\":\n return \"VP8\";\n case \"vp9\":\n return \"VP9\";\n case \"h264\":\n return \"MPEG4/ISO/AVC\";\n case \"av1x\":\n return \"AV1\";\n default:\n throw new WeriftError({\n message: \"unsupported codec\",\n payload: { track, path: sourcePath },\n });\n }\n })();\n return {\n kind: \"video\" as const,\n codec,\n clockRate: 90000,\n trackNumber,\n width: this.props.width ?? 640,\n height: this.props.height ?? 360,\n payloadType,\n track,\n };\n } else {\n return {\n kind: \"audio\" as const,\n codec: \"OPUS\" as const,\n clockRate: 48000,\n trackNumber,\n payloadType,\n track,\n };\n }\n });\n\n const webm = new WebmCallback(inputTracks, {\n duration: this.props.defaultDuration ?? 1000 * 60 * 60 * 24,\n });\n const lipsync = new LipsyncCallback();\n\n if (inputTracks.length === 1 || this.props.disableNtp) {\n this.props.disableLipSync = true;\n }\n\n this.rtpSources = inputTracks.map(({ track, clockRate, codec }) => {\n const rtpSource = new RtpSourceCallback();\n const rtcpSource = new RtcpSourceCallback();\n track.onReceiveRtp\n .subscribe((rtp) => {\n rtpSource.input(rtp.clone());\n })\n .disposer(this.unSubscribers);\n track.onReceiveRtcp\n .subscribe((rtcp) => {\n rtcpSource.input(rtcp);\n })\n .disposer(this.unSubscribers);\n const time = this.props.disableNtp\n ? new RtpTimeCallback(clockRate)\n : new NtpTimeCallback(clockRate);\n\n if (track.kind === \"video\") {\n const depacketizer = new DepacketizeCallback(codec, {\n isFinalPacketInSequence: (h) => h.marker,\n });\n const jitterBuffer = new JitterBufferCallback(clockRate, {\n bufferSize: this.props.jitterBufferSize,\n latency: this.props.jitterBufferLatency,\n });\n\n rtpSource.pipe(jitterBuffer.input);\n rtcpSource.pipe(time.input);\n\n jitterBuffer.pipe(time.input);\n time.pipe(depacketizer.input);\n if (this.props.disableLipSync) {\n depacketizer.pipe(webm.inputVideo);\n } else {\n depacketizer.pipe(lipsync.inputVideo);\n lipsync.pipeVideo(webm.inputVideo);\n }\n } else {\n const depacketizer = new DepacketizeCallback(codec);\n\n rtpSource.pipe(time.input);\n rtcpSource.pipe(time.input);\n\n time.pipe(depacketizer.input);\n if (this.props.disableLipSync) {\n depacketizer.pipe(webm.inputAudio);\n } else {\n depacketizer.pipe(lipsync.inputAudio);\n lipsync.pipeAudio(webm.inputAudio);\n }\n }\n\n return rtpSource;\n });\n if (this.props.path) {\n webm.pipe(saveToFileSystem(this.props.path));\n } else if (this.props.stream) {\n webm.pipe(async (o) => {\n this.props.stream.execute(o);\n });\n }\n }\n\n async stop() {\n await Promise.all(this.rtpSources.map((r) => r.stop()));\n this.unSubscribers.dispose();\n }\n}\n\nconst supportedVideoCodecs = [\"h264\", \"vp8\", \"vp9\", \"av1x\"] as const;\ntype SupportedVideoCodec = (typeof supportedVideoCodecs)[number];\n"]}
|
|
@@ -37,7 +37,7 @@ export declare class RTCPeerConnection extends EventTarget {
|
|
|
37
37
|
readonly onDataChannel: Event<[RTCDataChannel]>;
|
|
38
38
|
readonly onRemoteTransceiverAdded: Event<[RTCRtpTransceiver]>;
|
|
39
39
|
readonly onTransceiverAdded: Event<[RTCRtpTransceiver]>;
|
|
40
|
-
readonly onIceCandidate: Event<[RTCIceCandidate]>;
|
|
40
|
+
readonly onIceCandidate: Event<[RTCIceCandidate | undefined]>;
|
|
41
41
|
readonly onNegotiationneeded: Event<[]>;
|
|
42
42
|
readonly onTrack: Event<[MediaStreamTrack]>;
|
|
43
43
|
ondatachannel?: CallbackWithValue<RTCDataChannelEvent>;
|
|
@@ -64,8 +64,10 @@ export declare class RTCPeerConnection extends EventTarget {
|
|
|
64
64
|
constructor(config?: Partial<PeerConfig>);
|
|
65
65
|
get localDescription(): import("./sdp").RTCSessionDescription | undefined;
|
|
66
66
|
get remoteDescription(): import("./sdp").RTCSessionDescription | undefined;
|
|
67
|
-
private
|
|
68
|
-
|
|
67
|
+
/**@private */
|
|
68
|
+
get _localDescription(): SessionDescription | undefined;
|
|
69
|
+
/**@private */
|
|
70
|
+
get _remoteDescription(): SessionDescription | undefined;
|
|
69
71
|
private getTransceiverByMid;
|
|
70
72
|
private getTransceiverByMLineIndex;
|
|
71
73
|
getConfiguration(): Required<PeerConfig>;
|
|
@@ -186,7 +188,7 @@ export interface RTCDataChannelEvent {
|
|
|
186
188
|
channel: RTCDataChannel;
|
|
187
189
|
}
|
|
188
190
|
export interface RTCPeerConnectionIceEvent {
|
|
189
|
-
candidate
|
|
191
|
+
candidate?: RTCIceCandidate;
|
|
190
192
|
}
|
|
191
193
|
export interface RTCSessionDescriptionInit {
|
|
192
194
|
sdp?: string;
|
|
@@ -387,9 +387,11 @@ class RTCPeerConnection extends helper_1.EventTarget {
|
|
|
387
387
|
}
|
|
388
388
|
return this._remoteDescription.toJSON();
|
|
389
389
|
}
|
|
390
|
+
/**@private */
|
|
390
391
|
get _localDescription() {
|
|
391
392
|
return this.pendingLocalDescription || this.currentLocalDescription;
|
|
392
393
|
}
|
|
394
|
+
/**@private */
|
|
393
395
|
get _remoteDescription() {
|
|
394
396
|
return this.pendingRemoteDescription || this.currentRemoteDescription;
|
|
395
397
|
}
|
|
@@ -602,6 +604,15 @@ class RTCPeerConnection extends helper_1.EventTarget {
|
|
|
602
604
|
log("localDescription not found when ice candidate was gathered");
|
|
603
605
|
return;
|
|
604
606
|
}
|
|
607
|
+
if (!candidate) {
|
|
608
|
+
this.setLocal(this._localDescription);
|
|
609
|
+
this.onIceCandidate.execute(undefined);
|
|
610
|
+
if (this.onicecandidate) {
|
|
611
|
+
this.onicecandidate({ candidate: undefined });
|
|
612
|
+
}
|
|
613
|
+
this.emit("icecandidate", { candidate: undefined });
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
605
616
|
if (this.config.bundlePolicy === "max-bundle" || this.remoteIsBundled) {
|
|
606
617
|
candidate.sdpMLineIndex = 0;
|
|
607
618
|
const media = this._localDescription?.media[0];
|
|
@@ -733,6 +744,13 @@ class RTCPeerConnection extends helper_1.EventTarget {
|
|
|
733
744
|
this.setConnectionState("failed");
|
|
734
745
|
});
|
|
735
746
|
}
|
|
747
|
+
this.setLocal(description);
|
|
748
|
+
if (this.shouldNegotiationneeded) {
|
|
749
|
+
this.needNegotiation();
|
|
750
|
+
}
|
|
751
|
+
return description;
|
|
752
|
+
}
|
|
753
|
+
setLocal(description) {
|
|
736
754
|
description.media
|
|
737
755
|
.filter((m) => ["audio", "video"].includes(m.kind))
|
|
738
756
|
.forEach((m, i) => {
|
|
@@ -742,13 +760,6 @@ class RTCPeerConnection extends helper_1.EventTarget {
|
|
|
742
760
|
if (this.sctpTransport && sctpMedia) {
|
|
743
761
|
addTransportDescription(sctpMedia, this.sctpTransport.dtlsTransport);
|
|
744
762
|
}
|
|
745
|
-
this.setLocal(description);
|
|
746
|
-
if (this.shouldNegotiationneeded) {
|
|
747
|
-
this.needNegotiation();
|
|
748
|
-
}
|
|
749
|
-
return description;
|
|
750
|
-
}
|
|
751
|
-
setLocal(description) {
|
|
752
763
|
if (description.type === "answer") {
|
|
753
764
|
this.currentLocalDescription = description;
|
|
754
765
|
this.pendingLocalDescription = undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport cloneDeep from \"lodash/cloneDeep\";\nimport isEqual from \"lodash/isEqual\";\nimport Event from \"rx.mini\";\nimport * as uuid from \"uuid\";\n\nimport {\n type Address,\n type CandidatePair,\n type InterfaceAddresses,\n Recvonly,\n Sendonly,\n Sendrecv,\n deepMerge,\n} from \".\";\nimport {\n type DtlsKeys,\n codecParametersFromString,\n useNACK,\n usePLI,\n useREMB,\n} from \".\";\nimport type { Profile } from \"../../dtls/src/context/srtp\";\nimport type { Message } from \"../../ice/src/stun/message\";\nimport type { Protocol } from \"../../ice/src/types/model\";\nimport {\n DISCARD_HOST,\n DISCARD_PORT,\n ReceiverDirection,\n SRTP_PROFILE,\n SenderDirections,\n} from \"./const\";\nimport { RTCDataChannel, RTCDataChannelParameters } from \"./dataChannel\";\nimport { EventTarget, enumerate } from \"./helper\";\nimport {\n RTCRtpCodecParameters,\n RTCRtpCodingParameters,\n type RTCRtpHeaderExtensionParameters,\n type RTCRtpParameters,\n type RTCRtpReceiveParameters,\n RTCRtpRtxParameters,\n RTCRtpSimulcastParameters,\n} from \"./media/parameters\";\nimport { RtpRouter } from \"./media/router\";\nimport { RTCRtpReceiver } from \"./media/rtpReceiver\";\nimport { RTCRtpSender } from \"./media/rtpSender\";\nimport {\n type Direction,\n RTCRtpTransceiver,\n type TransceiverOptions,\n} from \"./media/rtpTransceiver\";\nimport { MediaStream, type MediaStreamTrack } from \"./media/track\";\nimport {\n GroupDescription,\n MediaDescription,\n SessionDescription,\n SsrcDescription,\n addSDPHeader,\n} from \"./sdp\";\nimport { RTCCertificate, RTCDtlsTransport } from \"./transport/dtls\";\nimport {\n IceCandidate,\n type IceGathererState,\n type RTCIceCandidate,\n type RTCIceConnectionState,\n RTCIceGatherer,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport type { ConnectionState, Kind, RTCSignalingState } from \"./types/domain\";\nimport type { Callback, CallbackWithValue } from \"./types/util\";\nimport {\n andDirection,\n parseIceServers,\n reverseDirection,\n reverseSimulcastDirection,\n} from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/peerConnection.ts\");\n\nexport class RTCPeerConnection extends EventTarget {\n readonly cname = uuid.v4();\n sctpTransport?: RTCSctpTransport;\n transportEstablished = false;\n config: Required<PeerConfig> = cloneDeep<PeerConfig>(defaultPeerConfig);\n connectionState: ConnectionState = \"new\";\n iceConnectionState: RTCIceConnectionState = \"new\";\n iceGatheringState: IceGathererState = \"new\";\n signalingState: RTCSignalingState = \"stable\";\n negotiationneeded = false;\n private readonly transceivers: RTCRtpTransceiver[] = [];\n private pushTransceiver(t: RTCRtpTransceiver) {\n this.transceivers.push(t);\n }\n private replaceTransceiver(t: RTCRtpTransceiver, index: number) {\n this.transceivers[index] = t;\n }\n\n candidatesSent = new Set<string>();\n\n readonly iceGatheringStateChange = new Event<[IceGathererState]>();\n readonly iceConnectionStateChange = new Event<[RTCIceConnectionState]>();\n readonly signalingStateChange = new Event<[RTCSignalingState]>();\n readonly connectionStateChange = new Event<[ConnectionState]>();\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onIceCandidate = new Event<[RTCIceCandidate]>();\n readonly onNegotiationneeded = new Event<[]>();\n readonly onTrack = new Event<[MediaStreamTrack]>();\n\n ondatachannel?: CallbackWithValue<RTCDataChannelEvent>;\n onicecandidate?: CallbackWithValue<RTCPeerConnectionIceEvent>;\n onnegotiationneeded?: CallbackWithValue<any>;\n onsignalingstatechange?: CallbackWithValue<any>;\n ontrack?: CallbackWithValue<RTCTrackEvent>;\n onconnectionstatechange?: Callback;\n\n private readonly router = new RtpRouter();\n private readonly certificates: RTCCertificate[] = [];\n sctpRemotePort?: number;\n private seenMid = new Set<string>();\n private currentLocalDescription?: SessionDescription;\n private currentRemoteDescription?: SessionDescription;\n private pendingLocalDescription?: SessionDescription;\n private pendingRemoteDescription?: SessionDescription;\n private isClosed = false;\n private shouldNegotiationneeded = false;\n\n get dtlsTransports() {\n const transports = this.transceivers.map((t) => t.dtlsTransport);\n if (this.sctpTransport) {\n transports.push(this.sctpTransport.dtlsTransport);\n }\n return transports.reduce((acc: RTCDtlsTransport[], cur) => {\n if (!acc.map((d) => d.id).includes(cur.id)) {\n acc.push(cur);\n }\n return acc;\n }, []);\n }\n get iceTransports() {\n return this.dtlsTransports.map((d) => d.iceTransport);\n }\n\n get extIdUriMap() {\n return this.router.extIdUriMap;\n }\n\n constructor(config: Partial<PeerConfig> = {}) {\n super();\n\n deepMerge(this.config, config);\n\n if (this.config.icePortRange) {\n const [min, max] = this.config.icePortRange;\n if (min === max) throw new Error(\"should not be same value\");\n if (min >= max) throw new Error(\"The min must be less than max\");\n }\n\n for (const [i, codecParams] of enumerate([\n ...(this.config.codecs.audio || []),\n ...(this.config.codecs.video || []),\n ])) {\n if (codecParams.payloadType != undefined) {\n continue;\n }\n\n codecParams.payloadType = 96 + i;\n switch (codecParams.name.toLowerCase()) {\n case \"rtx\":\n {\n codecParams.parameters = `apt=${codecParams.payloadType - 1}`;\n }\n break;\n case \"red\":\n {\n if (codecParams.contentType === \"audio\") {\n const redundant = codecParams.payloadType + 1;\n codecParams.parameters = `${redundant}/${redundant}`;\n codecParams.payloadType = 63;\n }\n }\n break;\n }\n }\n\n [\n ...(this.config.headerExtensions.audio || []),\n ...(this.config.headerExtensions.video || []),\n ].forEach((v, i) => {\n v.id = 1 + i;\n });\n\n if (this.config.dtls) {\n const { keys } = this.config.dtls;\n if (keys) {\n this.certificates.push(\n new RTCCertificate(keys.keyPem, keys.certPem, keys.signatureHash),\n );\n }\n }\n\n this.iceConnectionStateChange.subscribe((state) => {\n switch (state) {\n case \"disconnected\":\n this.setConnectionState(\"disconnected\");\n break;\n case \"closed\":\n this.close();\n break;\n }\n });\n }\n\n get localDescription() {\n if (!this._localDescription) {\n return undefined;\n }\n return this._localDescription.toJSON();\n }\n\n get remoteDescription() {\n if (!this._remoteDescription) {\n return undefined;\n }\n return this._remoteDescription.toJSON();\n }\n\n private get _localDescription() {\n return this.pendingLocalDescription || this.currentLocalDescription;\n }\n\n private get _remoteDescription() {\n return this.pendingRemoteDescription || this.currentRemoteDescription;\n }\n\n private getTransceiverByMid(mid: string) {\n return this.transceivers.find((transceiver) => transceiver.mid === mid);\n }\n\n private getTransceiverByMLineIndex(index: number) {\n return this.transceivers.find(\n (transceiver) => transceiver.mLineIndex === index,\n );\n }\n\n getConfiguration() {\n return this.config;\n }\n\n async createOffer() {\n await this.ensureCerts();\n const description = this.buildOfferSdp();\n return description.toJSON();\n }\n\n private assignTransceiverCodecs(transceiver: RTCRtpTransceiver) {\n const codecs = (\n this.config.codecs[transceiver.kind] as RTCRtpCodecParameters[]\n ).filter((codecCandidate) => {\n switch (codecCandidate.direction) {\n case \"recvonly\": {\n if (ReceiverDirection.includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendonly\": {\n if (SenderDirections.includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendrecv\": {\n if ([Sendrecv, Recvonly, Sendonly].includes(transceiver.direction))\n return true;\n return false;\n }\n case \"all\": {\n return true;\n }\n default:\n return false;\n }\n });\n transceiver.codecs = codecs;\n }\n\n buildOfferSdp() {\n this.transceivers.forEach((transceiver) => {\n if (transceiver.codecs.length === 0) {\n this.assignTransceiverCodecs(transceiver);\n }\n if (transceiver.headerExtensions.length === 0) {\n transceiver.headerExtensions =\n this.config.headerExtensions[transceiver.kind] ?? [];\n }\n });\n\n const description = new SessionDescription();\n addSDPHeader(\"offer\", description);\n\n // # handle existing transceivers / sctp\n\n const currentMedia = this._localDescription\n ? this._localDescription.media\n : [];\n\n currentMedia.forEach((m, i) => {\n const mid = m.rtp.muxId;\n if (!mid) {\n log(\"mid missing\", m);\n return;\n }\n if (m.kind === \"application\") {\n if (!this.sctpTransport) {\n throw new Error(\"sctpTransport not found\");\n }\n this.sctpTransport.mLineIndex = i;\n description.media.push(\n createMediaDescriptionForSctp(this.sctpTransport),\n );\n } else {\n const transceiver = this.getTransceiverByMid(mid);\n if (!transceiver) {\n if (m.direction === \"inactive\") {\n description.media.push(m);\n return;\n }\n throw new Error(\"transceiver not found\");\n }\n transceiver.mLineIndex = i;\n description.media.push(\n createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n transceiver.direction,\n ),\n );\n }\n });\n\n // # handle new transceivers / sctp\n this.transceivers\n .filter((t) => !description.media.find((m) => m.rtp.muxId === t.mid))\n .forEach((transceiver) => {\n if (transceiver.mid == undefined) {\n transceiver.mid = allocateMid(\n this.seenMid,\n this.config.midSuffix ? \"av\" : \"\",\n );\n }\n const mediaDescription = createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n transceiver.direction,\n );\n if (transceiver.mLineIndex === undefined) {\n transceiver.mLineIndex = description.media.length;\n description.media.push(mediaDescription);\n } else {\n description.media[transceiver.mLineIndex] = mediaDescription;\n }\n });\n\n if (\n this.sctpTransport &&\n !description.media.find((m) => m.kind === \"application\")\n ) {\n this.sctpTransport.mLineIndex = description.media.length;\n if (this.sctpTransport.mid == undefined) {\n this.sctpTransport.mid = allocateMid(\n this.seenMid,\n this.config.midSuffix ? \"dc\" : \"\",\n );\n }\n description.media.push(createMediaDescriptionForSctp(this.sctpTransport));\n }\n\n if (this.config.bundlePolicy !== \"disable\") {\n const mids = description.media\n .map((m) => (m.direction !== \"inactive\" ? m.rtp.muxId : undefined))\n .filter((v) => v) as string[];\n if (mids.length) {\n const bundle = new GroupDescription(\"BUNDLE\", mids);\n description.group.push(bundle);\n }\n }\n\n return description;\n }\n\n createDataChannel(\n label: string,\n options: Partial<{\n maxPacketLifeTime?: number;\n protocol: string;\n maxRetransmits?: number;\n ordered: boolean;\n negotiated: boolean;\n id?: number;\n }> = {},\n ): RTCDataChannel {\n const base: typeof options = {\n protocol: \"\",\n ordered: true,\n negotiated: false,\n };\n const settings: Required<typeof base> = { ...base, ...options } as any;\n\n if (settings.maxPacketLifeTime && settings.maxRetransmits) {\n throw new Error(\"can not select both\");\n }\n\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n this.needNegotiation();\n }\n\n const parameters = new RTCDataChannelParameters({\n id: settings.id,\n label,\n maxPacketLifeTime: settings.maxPacketLifeTime,\n maxRetransmits: settings.maxRetransmits,\n negotiated: settings.negotiated,\n ordered: settings.ordered,\n protocol: settings.protocol,\n });\n\n const channel = new RTCDataChannel(this.sctpTransport, parameters);\n return channel;\n }\n\n removeTrack(sender: RTCRtpSender) {\n if (this.isClosed) throw new Error(\"peer closed\");\n if (!this.getSenders().find(({ ssrc }) => sender.ssrc === ssrc)) {\n throw new Error(\"unExist\");\n }\n\n const transceiver = this.transceivers.find(\n ({ sender: { ssrc } }) => sender.ssrc === ssrc,\n );\n if (!transceiver) throw new Error(\"unExist\");\n\n sender.stop();\n\n if (transceiver.currentDirection === \"recvonly\") {\n this.needNegotiation();\n return;\n }\n\n if (transceiver.stopping || transceiver.stopped) {\n transceiver.setDirection(\"inactive\");\n } else {\n if (transceiver.direction === \"sendrecv\") {\n transceiver.setDirection(\"recvonly\");\n } else if (\n transceiver.direction === \"sendonly\" ||\n transceiver.direction === \"recvonly\"\n ) {\n transceiver.setDirection(\"inactive\");\n }\n }\n this.needNegotiation();\n }\n\n private needNegotiation = async () => {\n this.shouldNegotiationneeded = true;\n if (this.negotiationneeded || this.signalingState !== \"stable\") return;\n this.shouldNegotiationneeded = false;\n setImmediate(() => {\n this.negotiationneeded = true;\n this.onNegotiationneeded.execute();\n if (this.onnegotiationneeded) this.onnegotiationneeded({});\n });\n };\n\n private createTransport(srtpProfiles: Profile[] = []) {\n const [existing] = this.iceTransports;\n\n // Gather ICE candidates for only one track. If the remote endpoint is not bundle-aware, negotiate only one media track.\n // https://w3c.github.io/webrtc-pc/#rtcbundlepolicy-enum\n if (this.config.bundlePolicy === \"max-bundle\") {\n if (existing) {\n return this.dtlsTransports[0];\n }\n }\n\n const iceGatherer = new RTCIceGatherer({\n ...parseIceServers(this.config.iceServers),\n forceTurn: this.config.iceTransportPolicy === \"relay\",\n portRange: this.config.icePortRange,\n interfaceAddresses: this.config.iceInterfaceAddresses,\n additionalHostAddresses: this.config.iceAdditionalHostAddresses,\n filterStunResponse: this.config.iceFilterStunResponse,\n filterCandidatePair: this.config.iceFilterCandidatePair,\n useIpv4: this.config.iceUseIpv4,\n useIpv6: this.config.iceUseIpv6,\n });\n if (existing) {\n iceGatherer.connection.localUserName = existing.connection.localUserName;\n iceGatherer.connection.localPassword = existing.connection.localPassword;\n }\n iceGatherer.onGatheringStateChange.subscribe(() => {\n this.updateIceGatheringState();\n });\n this.updateIceGatheringState();\n const iceTransport = new RTCIceTransport(iceGatherer);\n iceTransport.onStateChange.subscribe(() => {\n this.updateIceConnectionState();\n });\n\n iceTransport.iceGather.onIceCandidate = (candidate) => {\n if (!this.localDescription) {\n log(\"localDescription not found when ice candidate was gathered\");\n return;\n }\n if (this.config.bundlePolicy === \"max-bundle\" || this.remoteIsBundled) {\n candidate.sdpMLineIndex = 0;\n const media = this._localDescription?.media[0];\n if (media) {\n candidate.sdpMid = media.rtp.muxId;\n }\n } else {\n const transceiver = this.transceivers.find(\n (t) => t.dtlsTransport.iceTransport.id === iceTransport.id,\n );\n if (transceiver) {\n candidate.sdpMLineIndex = transceiver.mLineIndex;\n candidate.sdpMid = transceiver.mid;\n }\n if (\n this.sctpTransport?.dtlsTransport.iceTransport.id === iceTransport.id\n ) {\n candidate.sdpMLineIndex = this.sctpTransport.mLineIndex;\n candidate.sdpMid = this.sctpTransport.mid;\n }\n }\n\n candidate.foundation = \"candidate:\" + candidate.foundation;\n\n // prevent ice candidates that have already been sent from being being resent\n // when the connection is renegotiated during a later setLocalDescription call.\n if (candidate.sdpMid) {\n const candidateKey = `${candidate.foundation}:${candidate.sdpMid}`;\n if (this.candidatesSent.has(candidateKey)) {\n return;\n }\n this.candidatesSent.add(candidateKey);\n }\n\n this.onIceCandidate.execute(candidate.toJSON());\n if (this.onicecandidate) {\n this.onicecandidate({ candidate: candidate.toJSON() });\n }\n this.emit(\"icecandidate\", { candidate });\n };\n\n const dtlsTransport = new RTCDtlsTransport(\n this.config,\n iceTransport,\n this.router,\n this.certificates,\n srtpProfiles,\n );\n\n return dtlsTransport;\n }\n\n private createSctpTransport() {\n const dtlsTransport = this.createTransport([\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n ]);\n const sctp = new RTCSctpTransport();\n sctp.setDtlsTransport(dtlsTransport);\n sctp.mid = undefined;\n\n sctp.onDataChannel.subscribe((channel) => {\n this.onDataChannel.execute(channel);\n\n const event: RTCDataChannelEvent = { channel };\n if (this.ondatachannel) this.ondatachannel(event);\n this.emit(\"datachannel\", event);\n });\n\n this.sctpTransport = sctp;\n this.updateIceConnectionState();\n\n return sctp;\n }\n\n async setLocalDescription(sessionDescription: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }): Promise<SessionDescription> {\n // # parse and validate description\n const description = SessionDescription.parse(sessionDescription.sdp);\n description.type = sessionDescription.type;\n this.validateDescription(description, true);\n\n // # update signaling state\n if (description.type === \"offer\") {\n this.setSignalingState(\"have-local-offer\");\n } else if (description.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // # assign MID\n description.media.forEach((media, i) => {\n const mid = media.rtp.muxId!;\n this.seenMid.add(mid);\n if ([\"audio\", \"video\"].includes(media.kind)) {\n const transceiver = this.getTransceiverByMLineIndex(i);\n if (transceiver) {\n transceiver.mid = mid;\n }\n }\n if (media.kind === \"application\" && this.sctpTransport) {\n this.sctpTransport.mid = mid;\n }\n });\n\n const setupRole = (dtlsTransport: RTCDtlsTransport) => {\n const iceTransport = dtlsTransport.iceTransport;\n\n // # set ICE role\n if (description.type === \"offer\") {\n iceTransport.connection.iceControlling = true;\n } else {\n iceTransport.connection.iceControlling = false;\n }\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (iceTransport.connection.remoteIsLite) {\n iceTransport.connection.iceControlling = true;\n }\n\n // # set DTLS role for mediasoup\n if (description.type === \"answer\") {\n const role = description.media.find((media) => media.dtlsParams)\n ?.dtlsParams?.role;\n if (role) {\n dtlsTransport.role = role;\n }\n }\n };\n this.dtlsTransports.forEach((d) => setupRole(d));\n\n // # configure direction\n if ([\"answer\", \"pranswer\"].includes(description.type)) {\n this.transceivers.forEach((t) => {\n const direction = andDirection(t.direction, t.offerDirection);\n t.setCurrentDirection(direction);\n });\n }\n\n // for trickle ice\n this.setLocal(description);\n\n // # gather candidates\n const connected = this.iceTransports.find(\n (transport) => transport.state === \"connected\",\n );\n if (this.remoteIsBundled && connected) {\n // no need to gather ice candidates on an existing bundled connection\n await connected.iceGather.gather();\n } else {\n await Promise.allSettled(\n this.iceTransports.map((iceTransport) =>\n iceTransport.iceGather.gather(),\n ),\n );\n }\n\n // connect transports\n if (description.type === \"answer\") {\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.setConnectionState(\"failed\");\n });\n }\n\n description.media\n .filter((m) => [\"audio\", \"video\"].includes(m.kind))\n .forEach((m, i) => {\n addTransportDescription(m, this.transceivers[i].dtlsTransport);\n });\n const sctpMedia = description.media.find((m) => m.kind === \"application\");\n if (this.sctpTransport && sctpMedia) {\n addTransportDescription(sctpMedia, this.sctpTransport.dtlsTransport);\n }\n\n this.setLocal(description);\n\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n\n return description;\n }\n\n private setLocal(description: SessionDescription) {\n if (description.type === \"answer\") {\n this.currentLocalDescription = description;\n this.pendingLocalDescription = undefined;\n } else {\n this.pendingLocalDescription = description;\n }\n }\n\n private getTransportByMid(mid: string) {\n let iceTransport: RTCIceTransport | undefined;\n\n const transceiver = this.transceivers.find((t) => t.mid === mid);\n if (transceiver) {\n iceTransport = transceiver.dtlsTransport.iceTransport;\n } else if (!iceTransport && this.sctpTransport?.mid === mid) {\n iceTransport = this.sctpTransport?.dtlsTransport.iceTransport;\n }\n\n return iceTransport;\n }\n\n private getTransportByMLineIndex(index: number) {\n const sdp = this.buildOfferSdp();\n const media = sdp.media[index];\n if (!media) {\n return;\n }\n const transport = this.getTransportByMid(media.rtp.muxId!);\n\n return transport;\n }\n\n async addIceCandidate(candidateMessage: RTCIceCandidate) {\n const candidate = IceCandidate.fromJSON(candidateMessage);\n if (!candidate) {\n return;\n }\n\n let iceTransport: RTCIceTransport | undefined;\n\n if (typeof candidate.sdpMid === \"number\") {\n iceTransport = this.getTransportByMid(candidate.sdpMid);\n }\n\n if (!iceTransport && typeof candidate.sdpMLineIndex === \"number\") {\n iceTransport = this.getTransportByMLineIndex(candidate.sdpMLineIndex);\n }\n\n if (!iceTransport) {\n iceTransport = this.iceTransports[0];\n }\n\n if (iceTransport) {\n await iceTransport.addRemoteCandidate(candidate);\n } else {\n log(\"iceTransport not found\", candidate);\n }\n }\n\n private async connect() {\n if (this.transportEstablished) {\n return;\n }\n log(\"start connect\");\n\n this.setConnectionState(\"connecting\");\n\n await Promise.allSettled(\n this.dtlsTransports.map(async (dtlsTransport) => {\n const { iceTransport } = dtlsTransport;\n await iceTransport.start().catch((err) => {\n log(\"iceTransport.start failed\", err);\n throw err;\n });\n await dtlsTransport.start().catch((err) => {\n log(\"dtlsTransport.start failed\", err);\n throw err;\n });\n if (\n this.sctpTransport &&\n this.sctpRemotePort &&\n this.sctpTransport.dtlsTransport.id === dtlsTransport.id\n ) {\n await this.sctpTransport.start(this.sctpRemotePort);\n await this.sctpTransport.sctp.stateChanged.connected.asPromise();\n log(\"sctp connected\");\n }\n }),\n );\n\n this.transportEstablished = true;\n this.setConnectionState(\"connected\");\n }\n\n private getLocalRtpParams(transceiver: RTCRtpTransceiver): RTCRtpParameters {\n if (transceiver.mid == undefined) throw new Error(\"mid not assigned\");\n\n const rtp: RTCRtpParameters = {\n codecs: transceiver.codecs,\n muxId: transceiver.mid,\n headerExtensions: transceiver.headerExtensions,\n rtcp: { cname: this.cname, ssrc: transceiver.sender.ssrc, mux: true },\n };\n return rtp;\n }\n\n private getRemoteRtpParams(\n media: MediaDescription,\n transceiver: RTCRtpTransceiver,\n ): RTCRtpReceiveParameters {\n const receiveParameters: RTCRtpReceiveParameters = {\n muxId: media.rtp.muxId,\n rtcp: media.rtp.rtcp,\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n encodings: Object.values(\n transceiver.codecs.reduce(\n (acc: { [pt: number]: RTCRtpCodingParameters }, codec) => {\n if (codec.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(codec.parameters ?? \"\");\n const apt = acc[params[\"apt\"]];\n if (apt && media.ssrc.length === 2) {\n apt.rtx = new RTCRtpRtxParameters({ ssrc: media.ssrc[1].ssrc });\n }\n return acc;\n }\n acc[codec.payloadType] = new RTCRtpCodingParameters({\n ssrc: media.ssrc[0]?.ssrc,\n payloadType: codec.payloadType,\n });\n return acc;\n },\n {},\n ),\n ),\n };\n\n return receiveParameters;\n }\n\n get remoteIsBundled() {\n const remoteSdp = this._remoteDescription;\n if (!remoteSdp) {\n return undefined;\n }\n const bundle = remoteSdp.group.find(\n (g) => g.semantic === \"BUNDLE\" && this.config.bundlePolicy !== \"disable\",\n );\n return bundle;\n }\n\n async setRemoteDescription(sessionDescription: RTCSessionDescriptionInit) {\n if (\n !sessionDescription.sdp ||\n !sessionDescription.type ||\n sessionDescription.type === \"rollback\" ||\n sessionDescription.type === \"pranswer\"\n ) {\n throw new Error(\"invalid sessionDescription\");\n }\n\n // # parse and validate description\n const remoteSdp = SessionDescription.parse(sessionDescription.sdp);\n remoteSdp.type = sessionDescription.type;\n this.validateDescription(remoteSdp, false);\n\n if (remoteSdp.type === \"answer\") {\n this.currentRemoteDescription = remoteSdp;\n this.pendingRemoteDescription = undefined;\n } else {\n this.pendingRemoteDescription = remoteSdp;\n }\n\n let bundleTransport: RTCDtlsTransport | undefined;\n\n // # apply description\n\n const matchTransceiverWithMedia = (\n transceiver: RTCRtpTransceiver,\n media: MediaDescription,\n ) =>\n transceiver.kind === media.kind &&\n [undefined, media.rtp.muxId].includes(transceiver.mid);\n\n let transports = remoteSdp.media.map((remoteMedia, i) => {\n let dtlsTransport: RTCDtlsTransport;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n let transceiver = this.transceivers.find((t) =>\n matchTransceiverWithMedia(t, remoteMedia),\n );\n if (!transceiver) {\n // create remote transceiver\n transceiver = this._addTransceiver(remoteMedia.kind, {\n direction: \"recvonly\",\n });\n transceiver.mid = remoteMedia.rtp.muxId;\n this.onRemoteTransceiverAdded.execute(transceiver);\n } else {\n if (transceiver.direction === \"inactive\" && transceiver.stopping) {\n transceiver.stopped = true;\n\n if (sessionDescription.type === \"answer\") {\n transceiver.setCurrentDirection(\"inactive\");\n }\n return;\n }\n }\n\n if (this.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = transceiver.dtlsTransport;\n } else {\n transceiver.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = transceiver.dtlsTransport;\n\n this.setRemoteRTP(transceiver, remoteMedia, remoteSdp.type, i);\n } else if (remoteMedia.kind === \"application\") {\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n this.sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n\n if (this.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = this.sctpTransport.dtlsTransport;\n } else {\n this.sctpTransport.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = this.sctpTransport.dtlsTransport;\n\n this.setRemoteSCTP(remoteMedia, this.sctpTransport, i);\n } else {\n throw new Error(\"invalid media kind\");\n }\n\n const iceTransport = dtlsTransport.iceTransport;\n\n if (remoteMedia.iceParams && remoteMedia.dtlsParams) {\n iceTransport.setRemoteParams(remoteMedia.iceParams);\n dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);\n\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (remoteMedia.iceParams?.iceLite) {\n iceTransport.connection.iceControlling = true;\n }\n }\n\n // # add ICE candidates\n remoteMedia.iceCandidates.forEach(iceTransport.addRemoteCandidate);\n\n if (remoteMedia.iceCandidatesComplete) {\n iceTransport.addRemoteCandidate(undefined);\n }\n\n // # set DTLS role\n if (remoteSdp.type === \"answer\" && remoteMedia.dtlsParams?.role) {\n dtlsTransport.role =\n remoteMedia.dtlsParams.role === \"client\" ? \"server\" : \"client\";\n }\n return iceTransport;\n }) as RTCIceTransport[];\n\n // filter out inactive transports\n transports = transports.filter((iceTransport) => !!iceTransport);\n\n const removedTransceivers = this.transceivers.filter(\n (t) =>\n remoteSdp.media.find((m) => matchTransceiverWithMedia(t, m)) ==\n undefined,\n );\n\n if (sessionDescription.type === \"answer\") {\n for (const transceiver of removedTransceivers) {\n // todo: handle answer side transceiver removal work.\n // event should trigger to notify media source to stop.\n transceiver.stop();\n transceiver.stopped = true;\n }\n }\n\n if (remoteSdp.type === \"offer\") {\n this.setSignalingState(\"have-remote-offer\");\n } else if (remoteSdp.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // connect transports\n if (remoteSdp.type === \"answer\") {\n log(\"caller start connect\");\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.setConnectionState(\"failed\");\n });\n }\n\n this.negotiationneeded = false;\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n }\n\n private setRemoteRTP(\n transceiver: RTCRtpTransceiver,\n remoteMedia: MediaDescription,\n type: \"offer\" | \"answer\",\n mLineIndex: number,\n ) {\n if (!transceiver.mid) {\n transceiver.mid = remoteMedia.rtp.muxId;\n }\n transceiver.mLineIndex = mLineIndex;\n\n // # negotiate codecs\n transceiver.codecs = remoteMedia.rtp.codecs.filter((remoteCodec) => {\n const localCodecs = this.config.codecs[remoteMedia.kind] || [];\n\n const existCodec = findCodecByMimeType(localCodecs, remoteCodec);\n if (!existCodec) return false;\n\n if (existCodec?.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(existCodec.parameters ?? \"\");\n const pt = params[\"apt\"];\n const origin = remoteMedia.rtp.codecs.find((c) => c.payloadType === pt);\n if (!origin) return false;\n return !!findCodecByMimeType(localCodecs, origin);\n }\n\n return true;\n });\n\n log(\"negotiated codecs\", transceiver.codecs);\n if (transceiver.codecs.length === 0) {\n throw new Error(\"negotiate codecs failed.\");\n }\n transceiver.headerExtensions = remoteMedia.rtp.headerExtensions.filter(\n (extension) =>\n (this.config.headerExtensions[remoteMedia.kind as Media] || []).find(\n (v) => v.uri === extension.uri,\n ),\n );\n\n // # configure direction\n const mediaDirection = remoteMedia.direction ?? \"inactive\";\n const direction = reverseDirection(mediaDirection);\n if ([\"answer\", \"pranswer\"].includes(type)) {\n transceiver.setCurrentDirection(direction);\n } else {\n transceiver.offerDirection = direction;\n }\n const localParams = this.getLocalRtpParams(transceiver);\n transceiver.sender.prepareSend(localParams);\n\n if ([\"recvonly\", \"sendrecv\"].includes(transceiver.direction)) {\n const remotePrams = this.getRemoteRtpParams(remoteMedia, transceiver);\n\n // register simulcast receiver\n remoteMedia.simulcastParameters.forEach((param) => {\n this.router.registerRtpReceiverByRid(transceiver, param, remotePrams);\n });\n\n transceiver.receiver.prepareReceive(remotePrams);\n // register ssrc receiver\n this.router.registerRtpReceiverBySsrc(transceiver, remotePrams);\n }\n if ([\"sendonly\", \"sendrecv\"].includes(mediaDirection)) {\n // assign msid\n if (remoteMedia.msid != undefined) {\n const [streamId, trackId] = remoteMedia.msid.split(\" \");\n transceiver.receiver.remoteStreamId = streamId;\n transceiver.receiver.remoteTrackId = trackId;\n\n this.fireOnTrack(\n transceiver.receiver.track,\n transceiver,\n new MediaStream({\n id: streamId,\n tracks: [transceiver.receiver.track],\n }),\n );\n }\n }\n\n if (remoteMedia.ssrc[0]?.ssrc) {\n transceiver.receiver.setupTWCC(remoteMedia.ssrc[0].ssrc);\n }\n }\n\n private setRemoteSCTP(\n remoteMedia: MediaDescription,\n sctpTransport: RTCSctpTransport,\n mLineIndex: number,\n ) {\n // # configure sctp\n this.sctpRemotePort = remoteMedia.sctpPort;\n if (!this.sctpRemotePort) {\n throw new Error(\"sctpRemotePort not exist\");\n }\n\n sctpTransport.setRemotePort(this.sctpRemotePort);\n sctpTransport.mLineIndex = mLineIndex;\n if (!sctpTransport.mid) {\n sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n }\n\n private validateDescription(\n description: SessionDescription,\n isLocal: boolean,\n ) {\n if (isLocal) {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-local-offer\"].includes(this.signalingState))\n throw new Error(\"Cannot handle offer in signaling state\");\n } else if (description.type === \"answer\") {\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(\n this.signalingState,\n )\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n } else {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-remote-offer\"].includes(this.signalingState)) {\n throw new Error(\"Cannot handle offer in signaling state\");\n }\n } else if (description.type === \"answer\") {\n if (\n ![\"have-local-offer\", \"have-remote-pranswer\"].includes(\n this.signalingState,\n )\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n }\n\n description.media.forEach((media) => {\n if (media.direction === \"inactive\") return;\n if (\n !media.iceParams ||\n !media.iceParams.usernameFragment ||\n !media.iceParams.password\n )\n throw new Error(\"ICE username fragment or password is missing\");\n });\n\n if ([\"answer\", \"pranswer\"].includes(description.type || \"\")) {\n const offer = isLocal ? this._remoteDescription : this._localDescription;\n if (!offer) throw new Error();\n\n const answerMedia = description.media.map((v, i) => [v.kind, i]);\n const offerMedia = offer.media.map((v, i) => [v.kind, i]);\n if (!isEqual(offerMedia, answerMedia)) {\n throw new Error(\"Media sections in answer do not match offer\");\n }\n }\n }\n\n private fireOnTrack(\n track: MediaStreamTrack,\n transceiver: RTCRtpTransceiver,\n stream: MediaStream,\n ) {\n const event: RTCTrackEvent = {\n track,\n streams: [stream],\n transceiver,\n receiver: transceiver.receiver,\n };\n this.onTrack.execute(track);\n this.emit(\"track\", event);\n if (this.ontrack) this.ontrack(event);\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {},\n ) {\n return this._addTransceiver(trackOrKind, options);\n }\n\n private _addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {},\n ) {\n const kind =\n typeof trackOrKind === \"string\" ? trackOrKind : trackOrKind.kind;\n\n const direction = options.direction || \"sendrecv\";\n\n const dtlsTransport = this.createTransport([\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n ]);\n\n const sender = new RTCRtpSender(trackOrKind);\n const receiver = new RTCRtpReceiver(this.config, kind, sender.ssrc);\n const newTransceiver = new RTCRtpTransceiver(\n kind,\n dtlsTransport,\n receiver,\n sender,\n direction,\n );\n newTransceiver.options = options;\n this.router.registerRtpSender(newTransceiver.sender);\n\n // reuse inactive\n const inactiveTransceiverIndex = this.transceivers.findIndex(\n (t) => t.currentDirection === \"inactive\",\n );\n const inactiveTransceiver = this.transceivers.find(\n (t) => t.currentDirection === \"inactive\",\n );\n if (inactiveTransceiverIndex > -1 && inactiveTransceiver) {\n this.replaceTransceiver(newTransceiver, inactiveTransceiverIndex);\n newTransceiver.mLineIndex = inactiveTransceiver.mLineIndex;\n inactiveTransceiver.setCurrentDirection(undefined);\n } else {\n this.pushTransceiver(newTransceiver);\n }\n this.onTransceiverAdded.execute(newTransceiver);\n\n this.updateIceConnectionState();\n this.needNegotiation();\n\n return newTransceiver;\n }\n\n getTransceivers() {\n return this.transceivers;\n }\n\n getSenders(): RTCRtpSender[] {\n return this.getTransceivers().map((t) => t.sender);\n }\n\n getReceivers() {\n return this.getTransceivers().map((t) => t.receiver);\n }\n\n // todo fix\n addTrack(\n track: MediaStreamTrack,\n /**todo impl */\n ms?: MediaStream,\n ) {\n if (this.isClosed) throw new Error(\"is closed\");\n if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {\n throw new Error(\"track exist\");\n }\n\n const emptyTrackSender = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === true,\n );\n if (emptyTrackSender) {\n const sender = emptyTrackSender.sender;\n sender.registerTrack(track);\n this.needNegotiation();\n return sender;\n }\n\n const notSendTransceiver = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === false &&\n !t.usedForSender,\n );\n if (notSendTransceiver) {\n const sender = notSendTransceiver.sender;\n sender.registerTrack(track);\n switch (notSendTransceiver.direction) {\n case \"recvonly\":\n notSendTransceiver.setDirection(\"sendrecv\");\n break;\n case \"inactive\":\n notSendTransceiver.setDirection(\"sendonly\");\n break;\n }\n this.needNegotiation();\n return sender;\n } else {\n const transceiver = this._addTransceiver(track, {\n direction: \"sendrecv\",\n });\n this.needNegotiation();\n return transceiver.sender;\n }\n }\n\n private async ensureCerts() {\n const ensureCert = async (dtlsTransport: RTCDtlsTransport) => {\n if (this.certificates.length === 0) {\n const localCertificate = await dtlsTransport.setupCertificate();\n this.certificates.push(localCertificate);\n } else {\n dtlsTransport.localCertificate = this.certificates[0];\n }\n };\n\n for (const dtlsTransport of this.dtlsTransports) {\n await ensureCert(dtlsTransport);\n }\n }\n\n async createAnswer() {\n await this.ensureCerts();\n const description = this.buildAnswer();\n return description.toJSON();\n }\n\n private buildAnswer() {\n this.assertNotClosed();\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(\n this.signalingState,\n )\n ) {\n throw new Error(\"createAnswer failed\");\n }\n if (!this._remoteDescription) {\n throw new Error(\"wrong state\");\n }\n\n const description = new SessionDescription();\n addSDPHeader(\"answer\", description);\n\n this._remoteDescription.media.forEach((remoteMedia) => {\n let dtlsTransport!: RTCDtlsTransport;\n let media: MediaDescription;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n const transceiver = this.getTransceiverByMid(remoteMedia.rtp.muxId!)!;\n media = createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n andDirection(transceiver.direction, transceiver.offerDirection),\n );\n dtlsTransport = transceiver.dtlsTransport;\n } else if (remoteMedia.kind === \"application\") {\n if (!this.sctpTransport || !this.sctpTransport.mid) {\n throw new Error(\"sctpTransport not found\");\n }\n media = createMediaDescriptionForSctp(this.sctpTransport);\n\n dtlsTransport = this.sctpTransport.dtlsTransport;\n } else {\n throw new Error(\"invalid kind\");\n }\n\n // # determine DTLS role, or preserve the currently configured role\n if (media.dtlsParams) {\n if (dtlsTransport.role === \"auto\") {\n media.dtlsParams.role = \"client\";\n } else {\n media.dtlsParams.role = dtlsTransport.role;\n }\n }\n\n media.simulcastParameters = remoteMedia.simulcastParameters.map((v) => ({\n ...v,\n direction: reverseSimulcastDirection(v.direction),\n }));\n\n description.media.push(media);\n });\n\n if (this.config.bundlePolicy !== \"disable\") {\n const bundle = new GroupDescription(\"BUNDLE\", []);\n description.media.forEach((media) => {\n if (media.direction !== \"inactive\") {\n bundle.items.push(media.rtp.muxId!);\n }\n });\n description.group.push(bundle);\n }\n\n return description;\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.setSignalingState(\"closed\");\n this.setConnectionState(\"closed\");\n\n this.transceivers.forEach((transceiver) => {\n transceiver.receiver.stop();\n transceiver.sender.stop();\n });\n\n if (this.sctpTransport) {\n await this.sctpTransport.stop();\n }\n for (const dtlsTransport of this.dtlsTransports) {\n await dtlsTransport.stop();\n await dtlsTransport.iceTransport.stop();\n }\n\n this.dispose();\n log(\"peerConnection closed\");\n }\n\n private assertNotClosed() {\n if (this.isClosed) {\n throw new Error(\"RTCPeerConnection is closed\");\n }\n }\n\n // https://w3c.github.io/webrtc-pc/#dom-rtcicegatheringstate\n private updateIceGatheringState() {\n const all = this.iceTransports;\n\n function allMatch(...state: IceGathererState[]) {\n return (\n all.filter((check) => state.includes(check.iceGather.gatheringState))\n .length === all.length\n );\n }\n\n let newState: IceGathererState;\n\n if (all.length && allMatch(\"complete\")) {\n newState = \"complete\";\n } else if (!all.length || allMatch(\"new\", \"complete\")) {\n newState = \"new\";\n } else if (\n all.map((check) => check.iceGather.gatheringState).includes(\"gathering\")\n ) {\n newState = \"gathering\";\n } else {\n newState = \"new\";\n }\n\n if (this.iceGatheringState === newState) {\n return;\n }\n\n log(\"iceGatheringStateChange\", newState);\n this.iceGatheringState = newState;\n this.iceGatheringStateChange.execute(newState);\n this.emit(\"icegatheringstatechange\", newState);\n }\n\n // https://w3c.github.io/webrtc-pc/#dom-rtciceconnectionstate\n private updateIceConnectionState() {\n const all = this.iceTransports;\n let newState: RTCIceConnectionState;\n\n function allMatch(...state: RTCIceConnectionState[]) {\n return (\n all.filter((check) => state.includes(check.state)).length === all.length\n );\n }\n\n if (this.connectionState === \"closed\") {\n newState = \"closed\";\n } else if (allMatch(\"failed\")) {\n newState = \"failed\";\n } else if (allMatch(\"disconnected\")) {\n newState = \"disconnected\";\n } else if (allMatch(\"new\", \"closed\")) {\n newState = \"new\";\n } else if (allMatch(\"new\", \"checking\")) {\n newState = \"checking\";\n } else if (allMatch(\"completed\", \"closed\")) {\n newState = \"completed\";\n } else if (allMatch(\"connected\", \"completed\", \"closed\")) {\n newState = \"connected\";\n } else {\n // unreachable?\n newState = \"new\";\n }\n\n if (this.iceConnectionState === newState) {\n return;\n }\n\n log(\"iceConnectionStateChange\", newState);\n this.iceConnectionState = newState;\n this.iceConnectionStateChange.execute(newState);\n this.emit(\"iceconnectionstatechange\", newState);\n }\n\n private setSignalingState(state: RTCSignalingState) {\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) this.onsignalingstatechange({});\n }\n\n private setConnectionState(state: ConnectionState) {\n log(\"connectionStateChange\", state);\n this.connectionState = state;\n this.connectionStateChange.execute(state);\n if (this.onconnectionstatechange) this.onconnectionstatechange();\n this.emit(\"connectionstatechange\");\n }\n\n private dispose() {\n this.onDataChannel.allUnsubscribe();\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.signalingStateChange.allUnsubscribe();\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n }\n}\n\nexport function createMediaDescriptionForTransceiver(\n transceiver: RTCRtpTransceiver,\n cname: string,\n direction: Direction,\n) {\n const media = new MediaDescription(\n transceiver.kind,\n 9,\n \"UDP/TLS/RTP/SAVPF\",\n transceiver.codecs.map((c) => c.payloadType),\n );\n media.direction = direction;\n media.msid = transceiver.msid;\n media.rtp = {\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n muxId: transceiver.mid,\n };\n media.rtcpHost = \"0.0.0.0\";\n media.rtcpPort = 9;\n media.rtcpMux = true;\n media.ssrc = [new SsrcDescription({ ssrc: transceiver.sender.ssrc, cname })];\n\n if (transceiver.options.simulcast) {\n media.simulcastParameters = transceiver.options.simulcast.map(\n (o) => new RTCRtpSimulcastParameters(o),\n );\n }\n\n if (media.rtp.codecs.find((c) => c.name.toLowerCase() === \"rtx\")) {\n media.ssrc.push(\n new SsrcDescription({ ssrc: transceiver.sender.rtxSsrc, cname }),\n );\n media.ssrcGroup = [\n new GroupDescription(\"FID\", [\n transceiver.sender.ssrc.toString(),\n transceiver.sender.rtxSsrc.toString(),\n ]),\n ];\n }\n\n addTransportDescription(media, transceiver.dtlsTransport);\n return media;\n}\n\nexport function createMediaDescriptionForSctp(sctp: RTCSctpTransport) {\n const media = new MediaDescription(\n \"application\",\n DISCARD_PORT,\n \"UDP/DTLS/SCTP\",\n [\"webrtc-datachannel\"],\n );\n media.sctpPort = sctp.port;\n media.rtp.muxId = sctp.mid;\n media.sctpCapabilities = RTCSctpTransport.getCapabilities();\n\n addTransportDescription(media, sctp.dtlsTransport);\n return media;\n}\n\nexport function addTransportDescription(\n media: MediaDescription,\n dtlsTransport: RTCDtlsTransport,\n) {\n const iceTransport = dtlsTransport.iceTransport;\n const iceGatherer = iceTransport.iceGather;\n\n media.iceCandidates = iceGatherer.localCandidates;\n media.iceCandidatesComplete = iceGatherer.gatheringState === \"complete\";\n media.iceParams = iceGatherer.localParameters;\n media.iceOptions = \"trickle\";\n\n media.host = DISCARD_HOST;\n media.port = DISCARD_PORT;\n\n if (media.direction === \"inactive\") {\n media.port = 0;\n media.msid = undefined;\n }\n\n if (!media.dtlsParams) {\n media.dtlsParams = dtlsTransport.localParameters;\n if (!media.dtlsParams.fingerprints) {\n media.dtlsParams.fingerprints =\n dtlsTransport.localParameters.fingerprints;\n }\n }\n}\n\nexport function allocateMid(mids: Set<string>, type: \"dc\" | \"av\" | \"\") {\n let mid = \"\";\n for (let i = 0; ; ) {\n // rfc9143.html#name-security-considerations\n // SHOULD be 3 bytes or fewer to allow them to efficiently fit into the MID RTP header extension\n mid = (i++).toString() + type;\n if (!mids.has(mid)) break;\n }\n mids.add(mid);\n return mid;\n}\n\nexport type BundlePolicy = \"max-compat\" | \"max-bundle\" | \"disable\";\n\nexport interface PeerConfig {\n codecs: Partial<{\n /**\n * When specifying a codec with a fixed payloadType such as PCMU,\n * it is necessary to set the correct PayloadType in RTCRtpCodecParameters in advance.\n */\n audio: RTCRtpCodecParameters[];\n video: RTCRtpCodecParameters[];\n }>;\n headerExtensions: Partial<{\n audio: RTCRtpHeaderExtensionParameters[];\n video: RTCRtpHeaderExtensionParameters[];\n }>;\n iceTransportPolicy: \"all\" | \"relay\";\n iceServers: RTCIceServer[];\n /**Minimum port and Maximum port must not be the same value */\n icePortRange: [number, number] | undefined;\n iceInterfaceAddresses: InterfaceAddresses | undefined;\n /** Add additional host (local) addresses to use for candidate gathering.\n * Notably, you can include hosts that are normally excluded, such as loopback, tun interfaces, etc.\n */\n iceAdditionalHostAddresses: string[] | undefined;\n iceUseIpv4: boolean;\n iceUseIpv6: boolean;\n /** If provided, is called on each STUN request.\n * Return `true` if a STUN response should be sent, false if it should be skipped. */\n iceFilterStunResponse:\n | ((message: Message, addr: Address, protocol: Protocol) => boolean)\n | undefined;\n iceFilterCandidatePair: ((pair: CandidatePair) => boolean) | undefined;\n dtls: Partial<{\n keys: DtlsKeys;\n }>;\n bundlePolicy: BundlePolicy;\n debug: Partial<{\n /**% */\n inboundPacketLoss: number;\n /**% */\n outboundPacketLoss: number;\n /**ms */\n receiverReportDelay: number;\n disableSendNack: boolean;\n disableRecvRetransmit: boolean;\n }>;\n midSuffix: boolean;\n}\n\nexport const findCodecByMimeType = (\n codecs: RTCRtpCodecParameters[],\n target: RTCRtpCodecParameters,\n) =>\n codecs.find(\n (localCodec) =>\n localCodec.mimeType.toLowerCase() === target.mimeType.toLowerCase(),\n )\n ? target\n : undefined;\n\nexport type RTCIceServer = {\n urls: string;\n username?: string;\n credential?: string;\n};\n\nexport const defaultPeerConfig: PeerConfig = {\n codecs: {\n audio: [\n new RTCRtpCodecParameters({\n mimeType: \"audio/opus\",\n clockRate: 48000,\n channels: 2,\n }),\n new RTCRtpCodecParameters({\n mimeType: \"audio/PCMU\",\n clockRate: 8000,\n channels: 1,\n payloadType: 0,\n }),\n ],\n video: [\n new RTCRtpCodecParameters({\n mimeType: \"video/VP8\",\n clockRate: 90000,\n rtcpFeedback: [useNACK(), usePLI(), useREMB()],\n }),\n ],\n },\n headerExtensions: {\n audio: [],\n video: [],\n },\n iceTransportPolicy: \"all\",\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n icePortRange: undefined,\n iceInterfaceAddresses: undefined,\n iceAdditionalHostAddresses: undefined,\n iceUseIpv4: true,\n iceUseIpv6: true,\n iceFilterStunResponse: undefined,\n iceFilterCandidatePair: undefined,\n dtls: {},\n bundlePolicy: \"max-compat\",\n debug: {},\n midSuffix: false,\n};\n\nexport interface RTCTrackEvent {\n track: MediaStreamTrack;\n streams: MediaStream[];\n transceiver: RTCRtpTransceiver;\n receiver: RTCRtpReceiver;\n}\n\nexport interface RTCDataChannelEvent {\n channel: RTCDataChannel;\n}\n\nexport interface RTCPeerConnectionIceEvent {\n candidate: RTCIceCandidate;\n}\n\ntype Media = \"audio\" | \"video\";\n\nexport interface RTCSessionDescriptionInit {\n sdp?: string;\n type: RTCSdpType;\n}\nexport type RTCSdpType = \"answer\" | \"offer\" | \"pranswer\" | \"rollback\";\n"]}
|
|
1
|
+
{"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAggDA,oFA2CC;AAED,sEAaC;AAED,0DA2BC;AAED,kCAUC;AAnmDD,kDAA0B;AAC1B,iEAAyC;AACzC,6DAAqC;AACrC,sDAA4B;AAC5B,2CAA6B;AAE7B,wBAQW;AACX,wBAMW;AAIX,mCAMiB;AACjB,+CAAyE;AACzE,qCAAkD;AAClD,mDAQ4B;AAC5B,2CAA2C;AAC3C,qDAAqD;AACrD,iDAAiD;AACjD,2DAIgC;AAChC,yCAAmE;AACnE,+BAMe;AACf,2CAAoE;AACpE,yCAOyB;AACzB,2CAAoD;AAGpD,mCAKiB;AAEjB,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,8CAA8C,CAAC,CAAC;AAElE,MAAa,iBAAkB,SAAQ,oBAAW;IAWxC,eAAe,CAAC,CAAoB;QAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACO,kBAAkB,CAAC,CAAoB,EAAE,KAAa;QAC5D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAiCD,IAAI,cAAc;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,GAAuB,EAAE,GAAG,EAAE,EAAE;YACxD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC3C,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IACD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;IACjC,CAAC;IAED,YAAY,SAA8B,EAAE;QAC1C,KAAK,EAAE,CAAC;QArED;;;;mBAAQ,IAAI,CAAC,EAAE,EAAE;WAAC;QAC3B;;;;;WAAiC;QACjC;;;;mBAAuB,KAAK;WAAC;QAC7B;;;;mBAA+B,IAAA,mBAAS,EAAa,yBAAiB,CAAC;WAAC;QACxE;;;;mBAAmC,KAAK;WAAC;QACzC;;;;mBAA4C,KAAK;WAAC;QAClD;;;;mBAAsC,KAAK;WAAC;QAC5C;;;;mBAAoC,QAAQ;WAAC;QAC7C;;;;mBAAoB,KAAK;WAAC;QACT;;;;mBAAoC,EAAE;WAAC;QAQxD;;;;mBAAiB,IAAI,GAAG,EAAU;WAAC;QAE1B;;;;mBAA0B,IAAI,iBAAK,EAAsB;WAAC;QAC1D;;;;mBAA2B,IAAI,iBAAK,EAA2B;WAAC;QAChE;;;;mBAAuB,IAAI,iBAAK,EAAuB;WAAC;QACxD;;;;mBAAwB,IAAI,iBAAK,EAAqB;WAAC;QACvD;;;;mBAAgB,IAAI,iBAAK,EAAoB;WAAC;QAC9C;;;;mBAA2B,IAAI,iBAAK,EAAuB;WAAC;QAC5D;;;;mBAAqB,IAAI,iBAAK,EAAuB;WAAC;QACtD;;;;mBAAiB,IAAI,iBAAK,EAAiC;WAAC;QAC5D;;;;mBAAsB,IAAI,iBAAK,EAAM;WAAC;QACtC;;;;mBAAU,IAAI,iBAAK,EAAsB;WAAC;QAEnD;;;;;WAAuD;QACvD;;;;;WAA8D;QAC9D;;;;;WAA6C;QAC7C;;;;;WAAgD;QAChD;;;;;WAA2C;QAC3C;;;;;WAAmC;QAElB;;;;mBAAS,IAAI,kBAAS,EAAE;WAAC;QACzB;;;;mBAAiC,EAAE;WAAC;QACrD;;;;;WAAwB;QAChB;;;;mBAAU,IAAI,GAAG,EAAU;WAAC;QAC5B;;;;;WAA6C;QAC7C;;;;;WAA8C;QAC9C;;;;;WAA6C;QAC7C;;;;;WAA8C;QAC9C;;;;mBAAW,KAAK;WAAC;QACjB;;;;mBAA0B,KAAK;WAAC;QAkVhC;;;;mBAAkB,KAAK,IAAI,EAAE;gBACnC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;gBACpC,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ;oBAAE,OAAO;gBACvE,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;gBACrC,YAAY,CAAC,GAAG,EAAE;oBAChB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;oBAC9B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;oBACnC,IAAI,IAAI,CAAC,mBAAmB;wBAAE,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;gBAC7D,CAAC,CAAC,CAAC;YACL,CAAC;WAAC;QAlUA,IAAA,YAAS,EAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE/B,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAC5C,IAAI,GAAG,KAAK,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC7D,IAAI,GAAG,IAAI,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnE,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,IAAI,IAAA,kBAAS,EAAC;YACvC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACpC,CAAC,EAAE,CAAC;YACH,IAAI,WAAW,CAAC,WAAW,IAAI,SAAS,EAAE,CAAC;gBACzC,SAAS;YACX,CAAC;YAED,WAAW,CAAC,WAAW,GAAG,EAAE,GAAG,CAAC,CAAC;YACjC,QAAQ,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvC,KAAK,KAAK;oBACR,CAAC;wBACC,WAAW,CAAC,UAAU,GAAG,OAAO,WAAW,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;oBAChE,CAAC;oBACD,MAAM;gBACR,KAAK,KAAK;oBACR,CAAC;wBACC,IAAI,WAAW,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;4BACxC,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,GAAG,CAAC,CAAC;4BAC9C,WAAW,CAAC,UAAU,GAAG,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC;4BACrD,WAAW,CAAC,WAAW,GAAG,EAAE,CAAC;wBAC/B,CAAC;oBACH,CAAC;oBACD,MAAM;YACV,CAAC;QACH,CAAC;QAED;YACE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC;SAC9C,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjB,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAClC,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,IAAI,qBAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAClE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAChD,QAAQ,KAAK,EAAE,CAAC;gBACd,KAAK,cAAc;oBACjB,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;oBACxC,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,CAAC,KAAK,EAAE,CAAC;oBACb,MAAM;YACV,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,gBAAgB;QAClB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,iBAAiB;QACnB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED,cAAc;IACd,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,uBAAuB,CAAC;IACtE,CAAC;IAED,cAAc;IACd,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,wBAAwB,CAAC;IACxE,CAAC;IAEO,mBAAmB,CAAC,GAAW;QACrC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAC1E,CAAC;IAEO,0BAA0B,CAAC,KAAa;QAC9C,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAC3B,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,KAAK,KAAK,CAClD,CAAC;IACJ,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACzC,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAEO,uBAAuB,CAAC,WAA8B;QAC5D,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CACpC,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,EAAE;YAC1B,QAAQ,cAAc,CAAC,SAAS,EAAE,CAAC;gBACjC,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,IAAI,yBAAiB,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC;wBAAE,OAAO,IAAI,CAAC;oBACnE,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,IAAI,wBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC;wBAAE,OAAO,IAAI,CAAC;oBAClE,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,IAAI,CAAC,WAAQ,EAAE,WAAQ,EAAE,WAAQ,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC;wBAChE,OAAO,IAAI,CAAC;oBACd,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD;oBACE,OAAO,KAAK,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACxC,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,WAAW,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,WAAW,CAAC,gBAAgB;oBAC1B,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACzD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,IAAI,wBAAkB,EAAE,CAAC;QAC7C,IAAA,kBAAY,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEnC,wCAAwC;QAExC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB;YACzC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK;YAC9B,CAAC,CAAC,EAAE,CAAC;QAEP,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAC7C,CAAC;gBACD,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC;gBAClC,WAAW,CAAC,KAAK,CAAC,IAAI,CACpB,6BAA6B,CAAC,IAAI,CAAC,aAAa,CAAC,CAClD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBAClD,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,IAAI,CAAC,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;wBAC/B,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC1B,OAAO;oBACT,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAC3C,CAAC;gBACD,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC;gBAC3B,WAAW,CAAC,KAAK,CAAC,IAAI,CACpB,oCAAoC,CAClC,WAAW,EACX,IAAI,CAAC,KAAK,EACV,WAAW,CAAC,SAAS,CACtB,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,IAAI,CAAC,YAAY;aACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;aACpE,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACvB,IAAI,WAAW,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;gBACjC,WAAW,CAAC,GAAG,GAAG,WAAW,CAC3B,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAClC,CAAC;YACJ,CAAC;YACD,MAAM,gBAAgB,GAAG,oCAAoC,CAC3D,WAAW,EACX,IAAI,CAAC,KAAK,EACV,WAAW,CAAC,SAAS,CACtB,CAAC;YACF,IAAI,WAAW,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACzC,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;gBAClD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,gBAAgB,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,IACE,IAAI,CAAC,aAAa;YAClB,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,EACxD,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;YACzD,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;gBACxC,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,WAAW,CAClC,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAClC,CAAC;YACJ,CAAC;YACD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK;iBAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;iBAClE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAa,CAAC;YAChC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,IAAI,sBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACpD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,iBAAiB,CACf,KAAa,EACb,UAOK,EAAE;QAEP,MAAM,IAAI,GAAmB;YAC3B,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,KAAK;SAClB,CAAC;QACF,MAAM,QAAQ,GAA0B,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAS,CAAC;QAEvE,IAAI,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAChD,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,sCAAwB,CAAC;YAC9C,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,KAAK;YACL,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;YAC7C,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,4BAAc,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACnE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,MAAoB;QAC9B,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CACxC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAC/C,CAAC;QACF,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAE7C,MAAM,CAAC,IAAI,EAAE,CAAC;QAEd,IAAI,WAAW,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;YAChD,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YAChD,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,WAAW,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;gBACzC,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC;iBAAM,IACL,WAAW,CAAC,SAAS,KAAK,UAAU;gBACpC,WAAW,CAAC,SAAS,KAAK,UAAU,EACpC,CAAC;gBACD,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAaO,eAAe,CAAC,eAA0B,EAAE;QAClD,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAEtC,wHAAwH;QACxH,wDAAwD;QACxD,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;YAC9C,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,oBAAc,CAAC;YACrC,GAAG,IAAA,uBAAe,EAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;YAC1C,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,KAAK,OAAO;YACrD,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACnC,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB;YACrD,uBAAuB,EAAE,IAAI,CAAC,MAAM,CAAC,0BAA0B;YAC/D,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB;YACrD,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,sBAAsB;YACvD,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAC/B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;SAChC,CAAC,CAAC;QACH,IAAI,QAAQ,EAAE,CAAC;YACb,WAAW,CAAC,UAAU,CAAC,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC;YACzE,WAAW,CAAC,UAAU,CAAC,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC;QAC3E,CAAC;QACD,WAAW,CAAC,sBAAsB,CAAC,SAAS,CAAC,GAAG,EAAE;YAChD,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,IAAI,qBAAe,CAAC,WAAW,CAAC,CAAC;QACtD,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,EAAE;YACxC,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,cAAc,GAAG,CAAC,SAAS,EAAE,EAAE;YACpD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC3B,GAAG,CAAC,4DAA4D,CAAC,CAAC;gBAClE,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAkB,CAAC,CAAC;gBACvC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACvC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,IAAI,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;gBAChD,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,YAAY,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACtE,SAAS,CAAC,aAAa,GAAG,CAAC,CAAC;gBAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC/C,IAAI,KAAK,EAAE,CAAC;oBACV,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;gBACrC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,CAC3D,CAAC;gBACF,IAAI,WAAW,EAAE,CAAC;oBAChB,SAAS,CAAC,aAAa,GAAG,WAAW,CAAC,UAAU,CAAC;oBACjD,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC;gBACrC,CAAC;gBACD,IACE,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,EACrE,CAAC;oBACD,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;oBACxD,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,SAAS,CAAC,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC,UAAU,CAAC;YAE3D,6EAA6E;YAC7E,+EAA+E;YAC/E,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACrB,MAAM,YAAY,GAAG,GAAG,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACnE,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC1C,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACxC,CAAC;YAED,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YAChD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,IAAI,uBAAgB,CACxC,IAAI,CAAC,MAAM,EACX,YAAY,EACZ,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,YAAY,EACjB,YAAY,CACb,CAAC;QAEF,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,mBAAmB;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC;YACzC,oBAAY,CAAC,qBAAqB,EAAE,SAAS;YAC7C,oBAAY,CAAC,2BAA2B;SACzC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,uBAAgB,EAAE,CAAC;QACpC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;QAErB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;YACvC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAEpC,MAAM,KAAK,GAAwB,EAAE,OAAO,EAAE,CAAC;YAC/C,IAAI,IAAI,CAAC,aAAa;gBAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,kBAGzB;QACC,mCAAmC;QACnC,MAAM,WAAW,GAAG,wBAAkB,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACrE,WAAW,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAE5C,2BAA2B;QAC3B,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,eAAe;QACf,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAM,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;gBACvD,IAAI,WAAW,EAAE,CAAC;oBAChB,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC;gBACxB,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvD,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,CAAC,aAA+B,EAAE,EAAE;YACpD,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;YAEhD,iBAAiB;YACjB,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACjC,YAAY,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,UAAU,CAAC,cAAc,GAAG,KAAK,CAAC;YACjD,CAAC;YACD,6HAA6H;YAC7H,kBAAkB;YAClB,IAAI,YAAY,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;gBACzC,YAAY,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC;YAChD,CAAC;YAED,gCAAgC;YAChC,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;oBAC9D,EAAE,UAAU,EAAE,IAAI,CAAC;gBACrB,IAAI,IAAI,EAAE,CAAC;oBACT,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjD,wBAAwB;QACxB,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9B,MAAM,SAAS,GAAG,IAAA,oBAAY,EAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;gBAC9D,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE3B,sBAAsB;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CACvC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,WAAW,CAC/C,CAAC;QACF,IAAI,IAAI,CAAC,eAAe,IAAI,SAAS,EAAE,CAAC;YACtC,qEAAqE;YACrE,MAAM,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CACtC,YAAY,CAAC,SAAS,CAAC,MAAM,EAAE,CAChC,CACF,CAAC;QACJ,CAAC;QAED,qBAAqB;QACrB,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC3B,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE3B,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,QAAQ,CAAC,WAA+B;QAC9C,WAAW,CAAC,KAAK;aACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aAClD,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAChB,uBAAuB,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QACL,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;QAC1E,IAAI,IAAI,CAAC,aAAa,IAAI,SAAS,EAAE,CAAC;YACpC,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC,uBAAuB,GAAG,WAAW,CAAC;YAC3C,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,uBAAuB,GAAG,WAAW,CAAC;QAC7C,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,GAAW;QACnC,IAAI,YAAyC,CAAC;QAE9C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QACjE,IAAI,WAAW,EAAE,CAAC;YAChB,YAAY,GAAG,WAAW,CAAC,aAAa,CAAC,YAAY,CAAC;QACxD,CAAC;aAAM,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC;YAC5D,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC;QAChE,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,wBAAwB,CAAC,KAAa;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,KAAM,CAAC,CAAC;QAE3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,gBAAiC;QACrD,MAAM,SAAS,GAAG,kBAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,IAAI,YAAyC,CAAC;QAE9C,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzC,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,YAAY,IAAI,OAAO,SAAS,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;YACjE,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,GAAG,CAAC,eAAe,CAAC,CAAC;QAErB,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAEtC,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;YAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC;YACvC,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACvC,GAAG,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;gBACtC,MAAM,GAAG,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACxC,GAAG,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;gBACvC,MAAM,GAAG,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,IACE,IAAI,CAAC,aAAa;gBAClB,IAAI,CAAC,cAAc;gBACnB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,EACxD,CAAC;gBACD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACpD,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;gBACjE,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAEO,iBAAiB,CAAC,WAA8B;QACtD,IAAI,WAAW,CAAC,GAAG,IAAI,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAEtE,MAAM,GAAG,GAAqB;YAC5B,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,KAAK,EAAE,WAAW,CAAC,GAAG;YACtB,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;YAC9C,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;SACtE,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,kBAAkB,CACxB,KAAuB,EACvB,WAA8B;QAE9B,MAAM,iBAAiB,GAA4B;YACjD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;YACtB,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI;YACpB,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;YAC9C,SAAS,EAAE,MAAM,CAAC,MAAM,CACtB,WAAW,CAAC,MAAM,CAAC,MAAM,CACvB,CAAC,GAA6C,EAAE,KAAK,EAAE,EAAE;gBACvD,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;oBACvC,MAAM,MAAM,GAAG,IAAA,4BAAyB,EAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;oBACjE,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC/B,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACnC,GAAG,CAAC,GAAG,GAAG,IAAI,gCAAmB,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBAClE,CAAC;oBACD,OAAO,GAAG,CAAC;gBACb,CAAC;gBACD,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,IAAI,mCAAsB,CAAC;oBAClD,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI;oBACzB,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC/B,CAAC,CAAC;gBACH,OAAO,GAAG,CAAC;YACb,CAAC,EACD,EAAE,CACH,CACF;SACF,CAAC;QAEF,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,IAAI,eAAe;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CACzE,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,kBAA6C;QACtE,IACE,CAAC,kBAAkB,CAAC,GAAG;YACvB,CAAC,kBAAkB,CAAC,IAAI;YACxB,kBAAkB,CAAC,IAAI,KAAK,UAAU;YACtC,kBAAkB,CAAC,IAAI,KAAK,UAAU,EACtC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,mCAAmC;QACnC,MAAM,SAAS,GAAG,wBAAkB,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACnE,SAAS,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;QACzC,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAE3C,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAC1C,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;QAC5C,CAAC;QAED,IAAI,eAA6C,CAAC;QAElD,sBAAsB;QAEtB,MAAM,yBAAyB,GAAG,CAChC,WAA8B,EAC9B,KAAuB,EACvB,EAAE,CACF,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YAC/B,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEzD,IAAI,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE;YACtD,IAAI,aAA+B,CAAC;YAEpC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,yBAAyB,CAAC,CAAC,EAAE,WAAW,CAAC,CAC1C,CAAC;gBACF,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,4BAA4B;oBAC5B,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,EAAE;wBACnD,SAAS,EAAE,UAAU;qBACtB,CAAC,CAAC;oBACH,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;oBACxC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBACrD,CAAC;qBAAM,CAAC;oBACN,IAAI,WAAW,CAAC,SAAS,KAAK,UAAU,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;wBACjE,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;wBAE3B,IAAI,kBAAkB,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BACzC,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;wBAC9C,CAAC;wBACD,OAAO;oBACT,CAAC;gBACH,CAAC;gBAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACzB,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,eAAe,GAAG,WAAW,CAAC,aAAa,CAAC;oBAC9C,CAAC;yBAAM,CAAC;wBACN,WAAW,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;oBAChD,CAAC;gBACH,CAAC;gBAED,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC;gBAE1C,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAChD,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;gBACjD,CAAC;gBAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACzB,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;oBACrD,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC;gBAED,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;gBAEjD,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;YAEhD,IAAI,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;gBACpD,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBACpD,aAAa,CAAC,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;gBAEtD,6HAA6H;gBAC7H,kBAAkB;gBAClB,IAAI,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;oBACnC,YAAY,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC;gBAChD,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;YAEnE,IAAI,WAAW,CAAC,qBAAqB,EAAE,CAAC;gBACtC,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAC7C,CAAC;YAED,kBAAkB;YAClB,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;gBAChE,aAAa,CAAC,IAAI;oBAChB,WAAW,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;YACnE,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC,CAAsB,CAAC;QAExB,iCAAiC;QACjC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAEjE,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAClD,CAAC,CAAC,EAAE,EAAE,CACJ,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,SAAS,CACZ,CAAC;QAEF,IAAI,kBAAkB,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzC,KAAK,MAAM,WAAW,IAAI,mBAAmB,EAAE,CAAC;gBAC9C,qDAAqD;gBACrD,uDAAuD;gBACvD,WAAW,CAAC,IAAI,EAAE,CAAC;gBACnB,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,qBAAqB;QACrB,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC3B,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,YAAY,CAClB,WAA8B,EAC9B,WAA6B,EAC7B,IAAwB,EACxB,UAAkB;QAElB,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;YACrB,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1C,CAAC;QACD,WAAW,CAAC,UAAU,GAAG,UAAU,CAAC;QAEpC,qBAAqB;QACrB,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE;YACjE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAE/D,MAAM,UAAU,GAAG,IAAA,2BAAmB,EAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACjE,IAAI,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC;YAE9B,IAAI,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,IAAA,4BAAyB,EAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;gBACtE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBACzB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;gBACxE,IAAI,CAAC,MAAM;oBAAE,OAAO,KAAK,CAAC;gBAC1B,OAAO,CAAC,CAAC,IAAA,2BAAmB,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACpD,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,WAAW,CAAC,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CACpE,CAAC,SAAS,EAAE,EAAE,CACZ,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAa,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAClE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,CAC/B,CACJ,CAAC;QAEF,wBAAwB;QACxB,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,IAAI,UAAU,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAA,wBAAgB,EAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,cAAc,GAAG,SAAS,CAAC;QACzC,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACxD,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAE5C,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAEtE,8BAA8B;YAC9B,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAChD,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;YAEH,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YACjD,yBAAyB;YACzB,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACtD,cAAc;YACd,IAAI,WAAW,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;gBAClC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxD,WAAW,CAAC,QAAQ,CAAC,cAAc,GAAG,QAAQ,CAAC;gBAC/C,WAAW,CAAC,QAAQ,CAAC,aAAa,GAAG,OAAO,CAAC;gBAE7C,IAAI,CAAC,WAAW,CACd,WAAW,CAAC,QAAQ,CAAC,KAAK,EAC1B,WAAW,EACX,IAAI,mBAAW,CAAC;oBACd,EAAE,EAAE,QAAQ;oBACZ,MAAM,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;iBACrC,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAC9B,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAEO,aAAa,CACnB,WAA6B,EAC7B,aAA+B,EAC/B,UAAkB;QAElB,mBAAmB;QACnB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjD,aAAa,CAAC,UAAU,GAAG,UAAU,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;YACvB,aAAa,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5C,CAAC;IACH,CAAC;IAEO,mBAAmB,CACzB,WAA+B,EAC/B,OAAgB;QAEhB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACjC,IAAI,CAAC,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;oBAC/D,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC9D,CAAC;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzC,IACE,CAAC,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CACpD,IAAI,CAAC,cAAc,CACpB,EACD,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACjC,IAAI,CAAC,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;oBACnE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzC,IACE,CAAC,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CACpD,IAAI,CAAC,cAAc,CACpB,EACD,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;QAED,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAClC,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU;gBAAE,OAAO;YAC3C,IACE,CAAC,KAAK,CAAC,SAAS;gBAChB,CAAC,KAAK,CAAC,SAAS,CAAC,gBAAgB;gBACjC,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ;gBAEzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;YACzE,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;YAE9B,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,IAAA,iBAAO,EAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,WAAW,CACjB,KAAuB,EACvB,WAA8B,EAC9B,MAAmB;QAEnB,MAAM,KAAK,GAAkB;YAC3B,KAAK;YACL,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,WAAW;YACX,QAAQ,EAAE,WAAW,CAAC,QAAQ;SAC/B,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,cAAc,CACZ,WAAoC,EACpC,UAAuC,EAAE;QAEzC,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAEO,eAAe,CACrB,WAAoC,EACpC,UAAuC,EAAE;QAEzC,MAAM,IAAI,GACR,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;QAEnE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC;QAElD,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC;YACzC,oBAAY,CAAC,qBAAqB,EAAE,SAAS;YAC7C,oBAAY,CAAC,2BAA2B;SACzC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,wBAAY,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,4BAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,cAAc,GAAG,IAAI,kCAAiB,CAC1C,IAAI,EACJ,aAAa,EACb,QAAQ,EACR,MAAM,EACN,SAAS,CACV,CAAC;QACF,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAErD,iBAAiB;QACjB,MAAM,wBAAwB,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAC1D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,UAAU,CACzC,CAAC;QACF,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,UAAU,CACzC,CAAC;QACF,IAAI,wBAAwB,GAAG,CAAC,CAAC,IAAI,mBAAmB,EAAE,CAAC;YACzD,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;YAClE,cAAc,CAAC,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC;YAC3D,mBAAmB,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAEhD,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,WAAW;IACX,QAAQ,CACN,KAAuB;IACvB,eAAe;IACf,EAAgB;QAEhB,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAC7C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS;YAC3B,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YACrB,wBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,CAClD,CAAC;QACF,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;YACvC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAC/C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS;YAC3B,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YACrB,wBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK;YAChD,CAAC,CAAC,CAAC,aAAa,CACnB,CAAC;QACF,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC;YACzC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5B,QAAQ,kBAAkB,CAAC,SAAS,EAAE,CAAC;gBACrC,KAAK,UAAU;oBACb,kBAAkB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;oBAC5C,MAAM;gBACR,KAAK,UAAU;oBACb,kBAAkB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;oBAC5C,MAAM;YACV,CAAC;YACD,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;gBAC9C,SAAS,EAAE,UAAU;aACtB,CAAC,CAAC;YACH,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO,WAAW,CAAC,MAAM,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,UAAU,GAAG,KAAK,EAAE,aAA+B,EAAE,EAAE;YAC3D,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,MAAM,gBAAgB,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE,CAAC;gBAChE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IACE,CAAC,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CACpD,IAAI,CAAC,cAAc,CACpB,EACD,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,wBAAkB,EAAE,CAAC;QAC7C,IAAA,kBAAY,EAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAEpC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACpD,IAAI,aAAgC,CAAC;YACrC,IAAI,KAAuB,CAAC;YAE5B,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,GAAG,CAAC,KAAM,CAAE,CAAC;gBACtE,KAAK,GAAG,oCAAoC,CAC1C,WAAW,EACX,IAAI,CAAC,KAAK,EACV,IAAA,oBAAY,EAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,CAChE,CAAC;gBACF,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC;YAC5C,CAAC;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;oBACnD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAC7C,CAAC;gBACD,KAAK,GAAG,6BAA6B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAE1D,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YAClC,CAAC;YAED,mEAAmE;YACnE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,IAAI,aAAa,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAClC,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;gBAC7C,CAAC;YACH,CAAC;YAED,KAAK,CAAC,mBAAmB,GAAG,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtE,GAAG,CAAC;gBACJ,SAAS,EAAE,IAAA,iCAAyB,EAAC,CAAC,CAAC,SAAS,CAAC;aAClD,CAAC,CAAC,CAAC;YAEJ,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,sBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClD,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAClC,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;oBACnC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAM,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC,CAAC,CAAC;YACH,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAElC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACxC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5B,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC;QACD,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;YAC3B,MAAM,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC/B,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,4DAA4D;IACpD,uBAAuB;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC;QAE/B,SAAS,QAAQ,CAAC,GAAG,KAAyB;YAC5C,OAAO,CACL,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;iBAClE,MAAM,KAAK,GAAG,CAAC,MAAM,CACzB,CAAC;QACJ,CAAC;QAED,IAAI,QAA0B,CAAC;QAE/B,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACvC,QAAQ,GAAG,UAAU,CAAC;QACxB,CAAC;aAAM,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;YACtD,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC;aAAM,IACL,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EACxE,CAAC;YACD,QAAQ,GAAG,WAAW,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QAED,GAAG,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;QAClC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,6DAA6D;IACrD,wBAAwB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC;QAC/B,IAAI,QAA+B,CAAC;QAEpC,SAAS,QAAQ,CAAC,GAAG,KAA8B;YACjD,OAAO,CACL,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CACzE,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;YACtC,QAAQ,GAAG,QAAQ,CAAC;QACtB,CAAC;aAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,QAAQ,GAAG,QAAQ,CAAC;QACtB,CAAC;aAAM,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACpC,QAAQ,GAAG,cAAc,CAAC;QAC5B,CAAC;aAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YACrC,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC;aAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;YACvC,QAAQ,GAAG,UAAU,CAAC;QACxB,CAAC;aAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC3C,QAAQ,GAAG,WAAW,CAAC;QACzB,CAAC;aAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;YACxD,QAAQ,GAAG,WAAW,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,eAAe;YACf,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QAED,GAAG,CAAC,0BAA0B,EAAE,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;QACnC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAEO,iBAAiB,CAAC,KAAwB;QAChD,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,sBAAsB;YAAE,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IAEO,kBAAkB,CAAC,KAAsB;QAC/C,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,uBAAuB;YAAE,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACrC,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC;QAC9C,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,CAAC;QAC/C,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC;QACzC,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;IACvC,CAAC;CACF;AA96CD,8CA86CC;AAED,SAAgB,oCAAoC,CAClD,WAA8B,EAC9B,KAAa,EACb,SAAoB;IAEpB,MAAM,KAAK,GAAG,IAAI,sBAAgB,CAChC,WAAW,CAAC,IAAI,EAChB,CAAC,EACD,mBAAmB,EACnB,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAC7C,CAAC;IACF,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;IAC9B,KAAK,CAAC,GAAG,GAAG;QACV,MAAM,EAAE,WAAW,CAAC,MAAM;QAC1B,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;QAC9C,KAAK,EAAE,WAAW,CAAC,GAAG;KACvB,CAAC;IACF,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;IACnB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,qBAAe,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAE7E,IAAI,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAClC,KAAK,CAAC,mBAAmB,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,sCAAyB,CAAC,CAAC,CAAC,CACxC,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,IAAI,CACb,IAAI,qBAAe,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CACjE,CAAC;QACF,KAAK,CAAC,SAAS,GAAG;YAChB,IAAI,sBAAgB,CAAC,KAAK,EAAE;gBAC1B,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;aACtC,CAAC;SACH,CAAC;IACJ,CAAC;IAED,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,6BAA6B,CAAC,IAAsB;IAClE,MAAM,KAAK,GAAG,IAAI,sBAAgB,CAChC,aAAa,EACb,oBAAY,EACZ,eAAe,EACf,CAAC,oBAAoB,CAAC,CACvB,CAAC;IACF,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;IAC3B,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3B,KAAK,CAAC,gBAAgB,GAAG,uBAAgB,CAAC,eAAe,EAAE,CAAC;IAE5D,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,uBAAuB,CACrC,KAAuB,EACvB,aAA+B;IAE/B,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;IAChD,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC;IAE3C,KAAK,CAAC,aAAa,GAAG,WAAW,CAAC,eAAe,CAAC;IAClD,KAAK,CAAC,qBAAqB,GAAG,WAAW,CAAC,cAAc,KAAK,UAAU,CAAC;IACxE,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC;IAC9C,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;IAE7B,KAAK,CAAC,IAAI,GAAG,oBAAY,CAAC;IAC1B,KAAK,CAAC,IAAI,GAAG,oBAAY,CAAC;IAE1B,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACtB,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC,eAAe,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YACnC,KAAK,CAAC,UAAU,CAAC,YAAY;gBAC3B,aAAa,CAAC,eAAe,CAAC,YAAY,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,WAAW,CAAC,IAAiB,EAAE,IAAsB;IACnE,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,IAAM,CAAC;QACnB,4CAA4C;QAC5C,gGAAgG;QAChG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAM;IAC5B,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,GAAG,CAAC;AACb,CAAC;AAmDM,MAAM,mBAAmB,GAAG,CACjC,MAA+B,EAC/B,MAA6B,EAC7B,EAAE,CACF,MAAM,CAAC,IAAI,CACT,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CACtE;IACC,CAAC,CAAC,MAAM;IACR,CAAC,CAAC,SAAS,CAAC;AATH,QAAA,mBAAmB,uBAShB;AAQH,QAAA,iBAAiB,GAAe;IAC3C,MAAM,EAAE;QACN,KAAK,EAAE;YACL,IAAI,kCAAqB,CAAC;gBACxB,QAAQ,EAAE,YAAY;gBACtB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,CAAC;aACZ,CAAC;YACF,IAAI,kCAAqB,CAAC;gBACxB,QAAQ,EAAE,YAAY;gBACtB,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE,CAAC;gBACX,WAAW,EAAE,CAAC;aACf,CAAC;SACH;QACD,KAAK,EAAE;YACL,IAAI,kCAAqB,CAAC;gBACxB,QAAQ,EAAE,WAAW;gBACrB,SAAS,EAAE,KAAK;gBAChB,YAAY,EAAE,CAAC,IAAA,UAAO,GAAE,EAAE,IAAA,SAAM,GAAE,EAAE,IAAA,UAAO,GAAE,CAAC;aAC/C,CAAC;SACH;KACF;IACD,gBAAgB,EAAE;QAChB,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;KACV;IACD,kBAAkB,EAAE,KAAK;IACzB,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC;IACtD,YAAY,EAAE,SAAS;IACvB,qBAAqB,EAAE,SAAS;IAChC,0BAA0B,EAAE,SAAS;IACrC,UAAU,EAAE,IAAI;IAChB,UAAU,EAAE,IAAI;IAChB,qBAAqB,EAAE,SAAS;IAChC,sBAAsB,EAAE,SAAS;IACjC,IAAI,EAAE,EAAE;IACR,YAAY,EAAE,YAAY;IAC1B,KAAK,EAAE,EAAE;IACT,SAAS,EAAE,KAAK;CACjB,CAAC","sourcesContent":["import debug from \"debug\";\nimport cloneDeep from \"lodash/cloneDeep\";\nimport isEqual from \"lodash/isEqual\";\nimport Event from \"rx.mini\";\nimport * as uuid from \"uuid\";\n\nimport {\n type Address,\n type CandidatePair,\n type InterfaceAddresses,\n Recvonly,\n Sendonly,\n Sendrecv,\n deepMerge,\n} from \".\";\nimport {\n type DtlsKeys,\n codecParametersFromString,\n useNACK,\n usePLI,\n useREMB,\n} from \".\";\nimport type { Profile } from \"../../dtls/src/context/srtp\";\nimport type { Message } from \"../../ice/src/stun/message\";\nimport type { Protocol } from \"../../ice/src/types/model\";\nimport {\n DISCARD_HOST,\n DISCARD_PORT,\n ReceiverDirection,\n SRTP_PROFILE,\n SenderDirections,\n} from \"./const\";\nimport { RTCDataChannel, RTCDataChannelParameters } from \"./dataChannel\";\nimport { EventTarget, enumerate } from \"./helper\";\nimport {\n RTCRtpCodecParameters,\n RTCRtpCodingParameters,\n type RTCRtpHeaderExtensionParameters,\n type RTCRtpParameters,\n type RTCRtpReceiveParameters,\n RTCRtpRtxParameters,\n RTCRtpSimulcastParameters,\n} from \"./media/parameters\";\nimport { RtpRouter } from \"./media/router\";\nimport { RTCRtpReceiver } from \"./media/rtpReceiver\";\nimport { RTCRtpSender } from \"./media/rtpSender\";\nimport {\n type Direction,\n RTCRtpTransceiver,\n type TransceiverOptions,\n} from \"./media/rtpTransceiver\";\nimport { MediaStream, type MediaStreamTrack } from \"./media/track\";\nimport {\n GroupDescription,\n MediaDescription,\n SessionDescription,\n SsrcDescription,\n addSDPHeader,\n} from \"./sdp\";\nimport { RTCCertificate, RTCDtlsTransport } from \"./transport/dtls\";\nimport {\n IceCandidate,\n type IceGathererState,\n type RTCIceCandidate,\n type RTCIceConnectionState,\n RTCIceGatherer,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport type { ConnectionState, Kind, RTCSignalingState } from \"./types/domain\";\nimport type { Callback, CallbackWithValue } from \"./types/util\";\nimport {\n andDirection,\n parseIceServers,\n reverseDirection,\n reverseSimulcastDirection,\n} from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/peerConnection.ts\");\n\nexport class RTCPeerConnection extends EventTarget {\n readonly cname = uuid.v4();\n sctpTransport?: RTCSctpTransport;\n transportEstablished = false;\n config: Required<PeerConfig> = cloneDeep<PeerConfig>(defaultPeerConfig);\n connectionState: ConnectionState = \"new\";\n iceConnectionState: RTCIceConnectionState = \"new\";\n iceGatheringState: IceGathererState = \"new\";\n signalingState: RTCSignalingState = \"stable\";\n negotiationneeded = false;\n private readonly transceivers: RTCRtpTransceiver[] = [];\n private pushTransceiver(t: RTCRtpTransceiver) {\n this.transceivers.push(t);\n }\n private replaceTransceiver(t: RTCRtpTransceiver, index: number) {\n this.transceivers[index] = t;\n }\n\n candidatesSent = new Set<string>();\n\n readonly iceGatheringStateChange = new Event<[IceGathererState]>();\n readonly iceConnectionStateChange = new Event<[RTCIceConnectionState]>();\n readonly signalingStateChange = new Event<[RTCSignalingState]>();\n readonly connectionStateChange = new Event<[ConnectionState]>();\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onIceCandidate = new Event<[RTCIceCandidate | undefined]>();\n readonly onNegotiationneeded = new Event<[]>();\n readonly onTrack = new Event<[MediaStreamTrack]>();\n\n ondatachannel?: CallbackWithValue<RTCDataChannelEvent>;\n onicecandidate?: CallbackWithValue<RTCPeerConnectionIceEvent>;\n onnegotiationneeded?: CallbackWithValue<any>;\n onsignalingstatechange?: CallbackWithValue<any>;\n ontrack?: CallbackWithValue<RTCTrackEvent>;\n onconnectionstatechange?: Callback;\n\n private readonly router = new RtpRouter();\n private readonly certificates: RTCCertificate[] = [];\n sctpRemotePort?: number;\n private seenMid = new Set<string>();\n private currentLocalDescription?: SessionDescription;\n private currentRemoteDescription?: SessionDescription;\n private pendingLocalDescription?: SessionDescription;\n private pendingRemoteDescription?: SessionDescription;\n private isClosed = false;\n private shouldNegotiationneeded = false;\n\n get dtlsTransports() {\n const transports = this.transceivers.map((t) => t.dtlsTransport);\n if (this.sctpTransport) {\n transports.push(this.sctpTransport.dtlsTransport);\n }\n return transports.reduce((acc: RTCDtlsTransport[], cur) => {\n if (!acc.map((d) => d.id).includes(cur.id)) {\n acc.push(cur);\n }\n return acc;\n }, []);\n }\n get iceTransports() {\n return this.dtlsTransports.map((d) => d.iceTransport);\n }\n\n get extIdUriMap() {\n return this.router.extIdUriMap;\n }\n\n constructor(config: Partial<PeerConfig> = {}) {\n super();\n\n deepMerge(this.config, config);\n\n if (this.config.icePortRange) {\n const [min, max] = this.config.icePortRange;\n if (min === max) throw new Error(\"should not be same value\");\n if (min >= max) throw new Error(\"The min must be less than max\");\n }\n\n for (const [i, codecParams] of enumerate([\n ...(this.config.codecs.audio || []),\n ...(this.config.codecs.video || []),\n ])) {\n if (codecParams.payloadType != undefined) {\n continue;\n }\n\n codecParams.payloadType = 96 + i;\n switch (codecParams.name.toLowerCase()) {\n case \"rtx\":\n {\n codecParams.parameters = `apt=${codecParams.payloadType - 1}`;\n }\n break;\n case \"red\":\n {\n if (codecParams.contentType === \"audio\") {\n const redundant = codecParams.payloadType + 1;\n codecParams.parameters = `${redundant}/${redundant}`;\n codecParams.payloadType = 63;\n }\n }\n break;\n }\n }\n\n [\n ...(this.config.headerExtensions.audio || []),\n ...(this.config.headerExtensions.video || []),\n ].forEach((v, i) => {\n v.id = 1 + i;\n });\n\n if (this.config.dtls) {\n const { keys } = this.config.dtls;\n if (keys) {\n this.certificates.push(\n new RTCCertificate(keys.keyPem, keys.certPem, keys.signatureHash),\n );\n }\n }\n\n this.iceConnectionStateChange.subscribe((state) => {\n switch (state) {\n case \"disconnected\":\n this.setConnectionState(\"disconnected\");\n break;\n case \"closed\":\n this.close();\n break;\n }\n });\n }\n\n get localDescription() {\n if (!this._localDescription) {\n return undefined;\n }\n return this._localDescription.toJSON();\n }\n\n get remoteDescription() {\n if (!this._remoteDescription) {\n return undefined;\n }\n return this._remoteDescription.toJSON();\n }\n\n /**@private */\n get _localDescription() {\n return this.pendingLocalDescription || this.currentLocalDescription;\n }\n\n /**@private */\n get _remoteDescription() {\n return this.pendingRemoteDescription || this.currentRemoteDescription;\n }\n\n private getTransceiverByMid(mid: string) {\n return this.transceivers.find((transceiver) => transceiver.mid === mid);\n }\n\n private getTransceiverByMLineIndex(index: number) {\n return this.transceivers.find(\n (transceiver) => transceiver.mLineIndex === index,\n );\n }\n\n getConfiguration() {\n return this.config;\n }\n\n async createOffer() {\n await this.ensureCerts();\n const description = this.buildOfferSdp();\n return description.toJSON();\n }\n\n private assignTransceiverCodecs(transceiver: RTCRtpTransceiver) {\n const codecs = (\n this.config.codecs[transceiver.kind] as RTCRtpCodecParameters[]\n ).filter((codecCandidate) => {\n switch (codecCandidate.direction) {\n case \"recvonly\": {\n if (ReceiverDirection.includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendonly\": {\n if (SenderDirections.includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendrecv\": {\n if ([Sendrecv, Recvonly, Sendonly].includes(transceiver.direction))\n return true;\n return false;\n }\n case \"all\": {\n return true;\n }\n default:\n return false;\n }\n });\n transceiver.codecs = codecs;\n }\n\n buildOfferSdp() {\n this.transceivers.forEach((transceiver) => {\n if (transceiver.codecs.length === 0) {\n this.assignTransceiverCodecs(transceiver);\n }\n if (transceiver.headerExtensions.length === 0) {\n transceiver.headerExtensions =\n this.config.headerExtensions[transceiver.kind] ?? [];\n }\n });\n\n const description = new SessionDescription();\n addSDPHeader(\"offer\", description);\n\n // # handle existing transceivers / sctp\n\n const currentMedia = this._localDescription\n ? this._localDescription.media\n : [];\n\n currentMedia.forEach((m, i) => {\n const mid = m.rtp.muxId;\n if (!mid) {\n log(\"mid missing\", m);\n return;\n }\n if (m.kind === \"application\") {\n if (!this.sctpTransport) {\n throw new Error(\"sctpTransport not found\");\n }\n this.sctpTransport.mLineIndex = i;\n description.media.push(\n createMediaDescriptionForSctp(this.sctpTransport),\n );\n } else {\n const transceiver = this.getTransceiverByMid(mid);\n if (!transceiver) {\n if (m.direction === \"inactive\") {\n description.media.push(m);\n return;\n }\n throw new Error(\"transceiver not found\");\n }\n transceiver.mLineIndex = i;\n description.media.push(\n createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n transceiver.direction,\n ),\n );\n }\n });\n\n // # handle new transceivers / sctp\n this.transceivers\n .filter((t) => !description.media.find((m) => m.rtp.muxId === t.mid))\n .forEach((transceiver) => {\n if (transceiver.mid == undefined) {\n transceiver.mid = allocateMid(\n this.seenMid,\n this.config.midSuffix ? \"av\" : \"\",\n );\n }\n const mediaDescription = createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n transceiver.direction,\n );\n if (transceiver.mLineIndex === undefined) {\n transceiver.mLineIndex = description.media.length;\n description.media.push(mediaDescription);\n } else {\n description.media[transceiver.mLineIndex] = mediaDescription;\n }\n });\n\n if (\n this.sctpTransport &&\n !description.media.find((m) => m.kind === \"application\")\n ) {\n this.sctpTransport.mLineIndex = description.media.length;\n if (this.sctpTransport.mid == undefined) {\n this.sctpTransport.mid = allocateMid(\n this.seenMid,\n this.config.midSuffix ? \"dc\" : \"\",\n );\n }\n description.media.push(createMediaDescriptionForSctp(this.sctpTransport));\n }\n\n if (this.config.bundlePolicy !== \"disable\") {\n const mids = description.media\n .map((m) => (m.direction !== \"inactive\" ? m.rtp.muxId : undefined))\n .filter((v) => v) as string[];\n if (mids.length) {\n const bundle = new GroupDescription(\"BUNDLE\", mids);\n description.group.push(bundle);\n }\n }\n\n return description;\n }\n\n createDataChannel(\n label: string,\n options: Partial<{\n maxPacketLifeTime?: number;\n protocol: string;\n maxRetransmits?: number;\n ordered: boolean;\n negotiated: boolean;\n id?: number;\n }> = {},\n ): RTCDataChannel {\n const base: typeof options = {\n protocol: \"\",\n ordered: true,\n negotiated: false,\n };\n const settings: Required<typeof base> = { ...base, ...options } as any;\n\n if (settings.maxPacketLifeTime && settings.maxRetransmits) {\n throw new Error(\"can not select both\");\n }\n\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n this.needNegotiation();\n }\n\n const parameters = new RTCDataChannelParameters({\n id: settings.id,\n label,\n maxPacketLifeTime: settings.maxPacketLifeTime,\n maxRetransmits: settings.maxRetransmits,\n negotiated: settings.negotiated,\n ordered: settings.ordered,\n protocol: settings.protocol,\n });\n\n const channel = new RTCDataChannel(this.sctpTransport, parameters);\n return channel;\n }\n\n removeTrack(sender: RTCRtpSender) {\n if (this.isClosed) throw new Error(\"peer closed\");\n if (!this.getSenders().find(({ ssrc }) => sender.ssrc === ssrc)) {\n throw new Error(\"unExist\");\n }\n\n const transceiver = this.transceivers.find(\n ({ sender: { ssrc } }) => sender.ssrc === ssrc,\n );\n if (!transceiver) throw new Error(\"unExist\");\n\n sender.stop();\n\n if (transceiver.currentDirection === \"recvonly\") {\n this.needNegotiation();\n return;\n }\n\n if (transceiver.stopping || transceiver.stopped) {\n transceiver.setDirection(\"inactive\");\n } else {\n if (transceiver.direction === \"sendrecv\") {\n transceiver.setDirection(\"recvonly\");\n } else if (\n transceiver.direction === \"sendonly\" ||\n transceiver.direction === \"recvonly\"\n ) {\n transceiver.setDirection(\"inactive\");\n }\n }\n this.needNegotiation();\n }\n\n private needNegotiation = async () => {\n this.shouldNegotiationneeded = true;\n if (this.negotiationneeded || this.signalingState !== \"stable\") return;\n this.shouldNegotiationneeded = false;\n setImmediate(() => {\n this.negotiationneeded = true;\n this.onNegotiationneeded.execute();\n if (this.onnegotiationneeded) this.onnegotiationneeded({});\n });\n };\n\n private createTransport(srtpProfiles: Profile[] = []) {\n const [existing] = this.iceTransports;\n\n // Gather ICE candidates for only one track. If the remote endpoint is not bundle-aware, negotiate only one media track.\n // https://w3c.github.io/webrtc-pc/#rtcbundlepolicy-enum\n if (this.config.bundlePolicy === \"max-bundle\") {\n if (existing) {\n return this.dtlsTransports[0];\n }\n }\n\n const iceGatherer = new RTCIceGatherer({\n ...parseIceServers(this.config.iceServers),\n forceTurn: this.config.iceTransportPolicy === \"relay\",\n portRange: this.config.icePortRange,\n interfaceAddresses: this.config.iceInterfaceAddresses,\n additionalHostAddresses: this.config.iceAdditionalHostAddresses,\n filterStunResponse: this.config.iceFilterStunResponse,\n filterCandidatePair: this.config.iceFilterCandidatePair,\n useIpv4: this.config.iceUseIpv4,\n useIpv6: this.config.iceUseIpv6,\n });\n if (existing) {\n iceGatherer.connection.localUserName = existing.connection.localUserName;\n iceGatherer.connection.localPassword = existing.connection.localPassword;\n }\n iceGatherer.onGatheringStateChange.subscribe(() => {\n this.updateIceGatheringState();\n });\n this.updateIceGatheringState();\n const iceTransport = new RTCIceTransport(iceGatherer);\n iceTransport.onStateChange.subscribe(() => {\n this.updateIceConnectionState();\n });\n\n iceTransport.iceGather.onIceCandidate = (candidate) => {\n if (!this.localDescription) {\n log(\"localDescription not found when ice candidate was gathered\");\n return;\n }\n if (!candidate) {\n this.setLocal(this._localDescription!);\n this.onIceCandidate.execute(undefined);\n if (this.onicecandidate) {\n this.onicecandidate({ candidate: undefined });\n }\n this.emit(\"icecandidate\", { candidate: undefined });\n return;\n }\n\n if (this.config.bundlePolicy === \"max-bundle\" || this.remoteIsBundled) {\n candidate.sdpMLineIndex = 0;\n const media = this._localDescription?.media[0];\n if (media) {\n candidate.sdpMid = media.rtp.muxId;\n }\n } else {\n const transceiver = this.transceivers.find(\n (t) => t.dtlsTransport.iceTransport.id === iceTransport.id,\n );\n if (transceiver) {\n candidate.sdpMLineIndex = transceiver.mLineIndex;\n candidate.sdpMid = transceiver.mid;\n }\n if (\n this.sctpTransport?.dtlsTransport.iceTransport.id === iceTransport.id\n ) {\n candidate.sdpMLineIndex = this.sctpTransport.mLineIndex;\n candidate.sdpMid = this.sctpTransport.mid;\n }\n }\n\n candidate.foundation = \"candidate:\" + candidate.foundation;\n\n // prevent ice candidates that have already been sent from being being resent\n // when the connection is renegotiated during a later setLocalDescription call.\n if (candidate.sdpMid) {\n const candidateKey = `${candidate.foundation}:${candidate.sdpMid}`;\n if (this.candidatesSent.has(candidateKey)) {\n return;\n }\n this.candidatesSent.add(candidateKey);\n }\n\n this.onIceCandidate.execute(candidate.toJSON());\n if (this.onicecandidate) {\n this.onicecandidate({ candidate: candidate.toJSON() });\n }\n this.emit(\"icecandidate\", { candidate });\n };\n\n const dtlsTransport = new RTCDtlsTransport(\n this.config,\n iceTransport,\n this.router,\n this.certificates,\n srtpProfiles,\n );\n\n return dtlsTransport;\n }\n\n private createSctpTransport() {\n const dtlsTransport = this.createTransport([\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n ]);\n const sctp = new RTCSctpTransport();\n sctp.setDtlsTransport(dtlsTransport);\n sctp.mid = undefined;\n\n sctp.onDataChannel.subscribe((channel) => {\n this.onDataChannel.execute(channel);\n\n const event: RTCDataChannelEvent = { channel };\n if (this.ondatachannel) this.ondatachannel(event);\n this.emit(\"datachannel\", event);\n });\n\n this.sctpTransport = sctp;\n this.updateIceConnectionState();\n\n return sctp;\n }\n\n async setLocalDescription(sessionDescription: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }): Promise<SessionDescription> {\n // # parse and validate description\n const description = SessionDescription.parse(sessionDescription.sdp);\n description.type = sessionDescription.type;\n this.validateDescription(description, true);\n\n // # update signaling state\n if (description.type === \"offer\") {\n this.setSignalingState(\"have-local-offer\");\n } else if (description.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // # assign MID\n description.media.forEach((media, i) => {\n const mid = media.rtp.muxId!;\n this.seenMid.add(mid);\n if ([\"audio\", \"video\"].includes(media.kind)) {\n const transceiver = this.getTransceiverByMLineIndex(i);\n if (transceiver) {\n transceiver.mid = mid;\n }\n }\n if (media.kind === \"application\" && this.sctpTransport) {\n this.sctpTransport.mid = mid;\n }\n });\n\n const setupRole = (dtlsTransport: RTCDtlsTransport) => {\n const iceTransport = dtlsTransport.iceTransport;\n\n // # set ICE role\n if (description.type === \"offer\") {\n iceTransport.connection.iceControlling = true;\n } else {\n iceTransport.connection.iceControlling = false;\n }\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (iceTransport.connection.remoteIsLite) {\n iceTransport.connection.iceControlling = true;\n }\n\n // # set DTLS role for mediasoup\n if (description.type === \"answer\") {\n const role = description.media.find((media) => media.dtlsParams)\n ?.dtlsParams?.role;\n if (role) {\n dtlsTransport.role = role;\n }\n }\n };\n this.dtlsTransports.forEach((d) => setupRole(d));\n\n // # configure direction\n if ([\"answer\", \"pranswer\"].includes(description.type)) {\n this.transceivers.forEach((t) => {\n const direction = andDirection(t.direction, t.offerDirection);\n t.setCurrentDirection(direction);\n });\n }\n\n // for trickle ice\n this.setLocal(description);\n\n // # gather candidates\n const connected = this.iceTransports.find(\n (transport) => transport.state === \"connected\",\n );\n if (this.remoteIsBundled && connected) {\n // no need to gather ice candidates on an existing bundled connection\n await connected.iceGather.gather();\n } else {\n await Promise.allSettled(\n this.iceTransports.map((iceTransport) =>\n iceTransport.iceGather.gather(),\n ),\n );\n }\n\n // connect transports\n if (description.type === \"answer\") {\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.setConnectionState(\"failed\");\n });\n }\n\n this.setLocal(description);\n\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n\n return description;\n }\n\n private setLocal(description: SessionDescription) {\n description.media\n .filter((m) => [\"audio\", \"video\"].includes(m.kind))\n .forEach((m, i) => {\n addTransportDescription(m, this.transceivers[i].dtlsTransport);\n });\n const sctpMedia = description.media.find((m) => m.kind === \"application\");\n if (this.sctpTransport && sctpMedia) {\n addTransportDescription(sctpMedia, this.sctpTransport.dtlsTransport);\n }\n\n if (description.type === \"answer\") {\n this.currentLocalDescription = description;\n this.pendingLocalDescription = undefined;\n } else {\n this.pendingLocalDescription = description;\n }\n }\n\n private getTransportByMid(mid: string) {\n let iceTransport: RTCIceTransport | undefined;\n\n const transceiver = this.transceivers.find((t) => t.mid === mid);\n if (transceiver) {\n iceTransport = transceiver.dtlsTransport.iceTransport;\n } else if (!iceTransport && this.sctpTransport?.mid === mid) {\n iceTransport = this.sctpTransport?.dtlsTransport.iceTransport;\n }\n\n return iceTransport;\n }\n\n private getTransportByMLineIndex(index: number) {\n const sdp = this.buildOfferSdp();\n const media = sdp.media[index];\n if (!media) {\n return;\n }\n const transport = this.getTransportByMid(media.rtp.muxId!);\n\n return transport;\n }\n\n async addIceCandidate(candidateMessage: RTCIceCandidate) {\n const candidate = IceCandidate.fromJSON(candidateMessage);\n if (!candidate) {\n return;\n }\n\n let iceTransport: RTCIceTransport | undefined;\n\n if (typeof candidate.sdpMid === \"number\") {\n iceTransport = this.getTransportByMid(candidate.sdpMid);\n }\n\n if (!iceTransport && typeof candidate.sdpMLineIndex === \"number\") {\n iceTransport = this.getTransportByMLineIndex(candidate.sdpMLineIndex);\n }\n\n if (!iceTransport) {\n iceTransport = this.iceTransports[0];\n }\n\n if (iceTransport) {\n await iceTransport.addRemoteCandidate(candidate);\n } else {\n log(\"iceTransport not found\", candidate);\n }\n }\n\n private async connect() {\n if (this.transportEstablished) {\n return;\n }\n log(\"start connect\");\n\n this.setConnectionState(\"connecting\");\n\n await Promise.allSettled(\n this.dtlsTransports.map(async (dtlsTransport) => {\n const { iceTransport } = dtlsTransport;\n await iceTransport.start().catch((err) => {\n log(\"iceTransport.start failed\", err);\n throw err;\n });\n await dtlsTransport.start().catch((err) => {\n log(\"dtlsTransport.start failed\", err);\n throw err;\n });\n if (\n this.sctpTransport &&\n this.sctpRemotePort &&\n this.sctpTransport.dtlsTransport.id === dtlsTransport.id\n ) {\n await this.sctpTransport.start(this.sctpRemotePort);\n await this.sctpTransport.sctp.stateChanged.connected.asPromise();\n log(\"sctp connected\");\n }\n }),\n );\n\n this.transportEstablished = true;\n this.setConnectionState(\"connected\");\n }\n\n private getLocalRtpParams(transceiver: RTCRtpTransceiver): RTCRtpParameters {\n if (transceiver.mid == undefined) throw new Error(\"mid not assigned\");\n\n const rtp: RTCRtpParameters = {\n codecs: transceiver.codecs,\n muxId: transceiver.mid,\n headerExtensions: transceiver.headerExtensions,\n rtcp: { cname: this.cname, ssrc: transceiver.sender.ssrc, mux: true },\n };\n return rtp;\n }\n\n private getRemoteRtpParams(\n media: MediaDescription,\n transceiver: RTCRtpTransceiver,\n ): RTCRtpReceiveParameters {\n const receiveParameters: RTCRtpReceiveParameters = {\n muxId: media.rtp.muxId,\n rtcp: media.rtp.rtcp,\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n encodings: Object.values(\n transceiver.codecs.reduce(\n (acc: { [pt: number]: RTCRtpCodingParameters }, codec) => {\n if (codec.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(codec.parameters ?? \"\");\n const apt = acc[params[\"apt\"]];\n if (apt && media.ssrc.length === 2) {\n apt.rtx = new RTCRtpRtxParameters({ ssrc: media.ssrc[1].ssrc });\n }\n return acc;\n }\n acc[codec.payloadType] = new RTCRtpCodingParameters({\n ssrc: media.ssrc[0]?.ssrc,\n payloadType: codec.payloadType,\n });\n return acc;\n },\n {},\n ),\n ),\n };\n\n return receiveParameters;\n }\n\n get remoteIsBundled() {\n const remoteSdp = this._remoteDescription;\n if (!remoteSdp) {\n return undefined;\n }\n const bundle = remoteSdp.group.find(\n (g) => g.semantic === \"BUNDLE\" && this.config.bundlePolicy !== \"disable\",\n );\n return bundle;\n }\n\n async setRemoteDescription(sessionDescription: RTCSessionDescriptionInit) {\n if (\n !sessionDescription.sdp ||\n !sessionDescription.type ||\n sessionDescription.type === \"rollback\" ||\n sessionDescription.type === \"pranswer\"\n ) {\n throw new Error(\"invalid sessionDescription\");\n }\n\n // # parse and validate description\n const remoteSdp = SessionDescription.parse(sessionDescription.sdp);\n remoteSdp.type = sessionDescription.type;\n this.validateDescription(remoteSdp, false);\n\n if (remoteSdp.type === \"answer\") {\n this.currentRemoteDescription = remoteSdp;\n this.pendingRemoteDescription = undefined;\n } else {\n this.pendingRemoteDescription = remoteSdp;\n }\n\n let bundleTransport: RTCDtlsTransport | undefined;\n\n // # apply description\n\n const matchTransceiverWithMedia = (\n transceiver: RTCRtpTransceiver,\n media: MediaDescription,\n ) =>\n transceiver.kind === media.kind &&\n [undefined, media.rtp.muxId].includes(transceiver.mid);\n\n let transports = remoteSdp.media.map((remoteMedia, i) => {\n let dtlsTransport: RTCDtlsTransport;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n let transceiver = this.transceivers.find((t) =>\n matchTransceiverWithMedia(t, remoteMedia),\n );\n if (!transceiver) {\n // create remote transceiver\n transceiver = this._addTransceiver(remoteMedia.kind, {\n direction: \"recvonly\",\n });\n transceiver.mid = remoteMedia.rtp.muxId;\n this.onRemoteTransceiverAdded.execute(transceiver);\n } else {\n if (transceiver.direction === \"inactive\" && transceiver.stopping) {\n transceiver.stopped = true;\n\n if (sessionDescription.type === \"answer\") {\n transceiver.setCurrentDirection(\"inactive\");\n }\n return;\n }\n }\n\n if (this.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = transceiver.dtlsTransport;\n } else {\n transceiver.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = transceiver.dtlsTransport;\n\n this.setRemoteRTP(transceiver, remoteMedia, remoteSdp.type, i);\n } else if (remoteMedia.kind === \"application\") {\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n this.sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n\n if (this.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = this.sctpTransport.dtlsTransport;\n } else {\n this.sctpTransport.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = this.sctpTransport.dtlsTransport;\n\n this.setRemoteSCTP(remoteMedia, this.sctpTransport, i);\n } else {\n throw new Error(\"invalid media kind\");\n }\n\n const iceTransport = dtlsTransport.iceTransport;\n\n if (remoteMedia.iceParams && remoteMedia.dtlsParams) {\n iceTransport.setRemoteParams(remoteMedia.iceParams);\n dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);\n\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (remoteMedia.iceParams?.iceLite) {\n iceTransport.connection.iceControlling = true;\n }\n }\n\n // # add ICE candidates\n remoteMedia.iceCandidates.forEach(iceTransport.addRemoteCandidate);\n\n if (remoteMedia.iceCandidatesComplete) {\n iceTransport.addRemoteCandidate(undefined);\n }\n\n // # set DTLS role\n if (remoteSdp.type === \"answer\" && remoteMedia.dtlsParams?.role) {\n dtlsTransport.role =\n remoteMedia.dtlsParams.role === \"client\" ? \"server\" : \"client\";\n }\n return iceTransport;\n }) as RTCIceTransport[];\n\n // filter out inactive transports\n transports = transports.filter((iceTransport) => !!iceTransport);\n\n const removedTransceivers = this.transceivers.filter(\n (t) =>\n remoteSdp.media.find((m) => matchTransceiverWithMedia(t, m)) ==\n undefined,\n );\n\n if (sessionDescription.type === \"answer\") {\n for (const transceiver of removedTransceivers) {\n // todo: handle answer side transceiver removal work.\n // event should trigger to notify media source to stop.\n transceiver.stop();\n transceiver.stopped = true;\n }\n }\n\n if (remoteSdp.type === \"offer\") {\n this.setSignalingState(\"have-remote-offer\");\n } else if (remoteSdp.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // connect transports\n if (remoteSdp.type === \"answer\") {\n log(\"caller start connect\");\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.setConnectionState(\"failed\");\n });\n }\n\n this.negotiationneeded = false;\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n }\n\n private setRemoteRTP(\n transceiver: RTCRtpTransceiver,\n remoteMedia: MediaDescription,\n type: \"offer\" | \"answer\",\n mLineIndex: number,\n ) {\n if (!transceiver.mid) {\n transceiver.mid = remoteMedia.rtp.muxId;\n }\n transceiver.mLineIndex = mLineIndex;\n\n // # negotiate codecs\n transceiver.codecs = remoteMedia.rtp.codecs.filter((remoteCodec) => {\n const localCodecs = this.config.codecs[remoteMedia.kind] || [];\n\n const existCodec = findCodecByMimeType(localCodecs, remoteCodec);\n if (!existCodec) return false;\n\n if (existCodec?.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(existCodec.parameters ?? \"\");\n const pt = params[\"apt\"];\n const origin = remoteMedia.rtp.codecs.find((c) => c.payloadType === pt);\n if (!origin) return false;\n return !!findCodecByMimeType(localCodecs, origin);\n }\n\n return true;\n });\n\n log(\"negotiated codecs\", transceiver.codecs);\n if (transceiver.codecs.length === 0) {\n throw new Error(\"negotiate codecs failed.\");\n }\n transceiver.headerExtensions = remoteMedia.rtp.headerExtensions.filter(\n (extension) =>\n (this.config.headerExtensions[remoteMedia.kind as Media] || []).find(\n (v) => v.uri === extension.uri,\n ),\n );\n\n // # configure direction\n const mediaDirection = remoteMedia.direction ?? \"inactive\";\n const direction = reverseDirection(mediaDirection);\n if ([\"answer\", \"pranswer\"].includes(type)) {\n transceiver.setCurrentDirection(direction);\n } else {\n transceiver.offerDirection = direction;\n }\n const localParams = this.getLocalRtpParams(transceiver);\n transceiver.sender.prepareSend(localParams);\n\n if ([\"recvonly\", \"sendrecv\"].includes(transceiver.direction)) {\n const remotePrams = this.getRemoteRtpParams(remoteMedia, transceiver);\n\n // register simulcast receiver\n remoteMedia.simulcastParameters.forEach((param) => {\n this.router.registerRtpReceiverByRid(transceiver, param, remotePrams);\n });\n\n transceiver.receiver.prepareReceive(remotePrams);\n // register ssrc receiver\n this.router.registerRtpReceiverBySsrc(transceiver, remotePrams);\n }\n if ([\"sendonly\", \"sendrecv\"].includes(mediaDirection)) {\n // assign msid\n if (remoteMedia.msid != undefined) {\n const [streamId, trackId] = remoteMedia.msid.split(\" \");\n transceiver.receiver.remoteStreamId = streamId;\n transceiver.receiver.remoteTrackId = trackId;\n\n this.fireOnTrack(\n transceiver.receiver.track,\n transceiver,\n new MediaStream({\n id: streamId,\n tracks: [transceiver.receiver.track],\n }),\n );\n }\n }\n\n if (remoteMedia.ssrc[0]?.ssrc) {\n transceiver.receiver.setupTWCC(remoteMedia.ssrc[0].ssrc);\n }\n }\n\n private setRemoteSCTP(\n remoteMedia: MediaDescription,\n sctpTransport: RTCSctpTransport,\n mLineIndex: number,\n ) {\n // # configure sctp\n this.sctpRemotePort = remoteMedia.sctpPort;\n if (!this.sctpRemotePort) {\n throw new Error(\"sctpRemotePort not exist\");\n }\n\n sctpTransport.setRemotePort(this.sctpRemotePort);\n sctpTransport.mLineIndex = mLineIndex;\n if (!sctpTransport.mid) {\n sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n }\n\n private validateDescription(\n description: SessionDescription,\n isLocal: boolean,\n ) {\n if (isLocal) {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-local-offer\"].includes(this.signalingState))\n throw new Error(\"Cannot handle offer in signaling state\");\n } else if (description.type === \"answer\") {\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(\n this.signalingState,\n )\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n } else {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-remote-offer\"].includes(this.signalingState)) {\n throw new Error(\"Cannot handle offer in signaling state\");\n }\n } else if (description.type === \"answer\") {\n if (\n ![\"have-local-offer\", \"have-remote-pranswer\"].includes(\n this.signalingState,\n )\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n }\n\n description.media.forEach((media) => {\n if (media.direction === \"inactive\") return;\n if (\n !media.iceParams ||\n !media.iceParams.usernameFragment ||\n !media.iceParams.password\n )\n throw new Error(\"ICE username fragment or password is missing\");\n });\n\n if ([\"answer\", \"pranswer\"].includes(description.type || \"\")) {\n const offer = isLocal ? this._remoteDescription : this._localDescription;\n if (!offer) throw new Error();\n\n const answerMedia = description.media.map((v, i) => [v.kind, i]);\n const offerMedia = offer.media.map((v, i) => [v.kind, i]);\n if (!isEqual(offerMedia, answerMedia)) {\n throw new Error(\"Media sections in answer do not match offer\");\n }\n }\n }\n\n private fireOnTrack(\n track: MediaStreamTrack,\n transceiver: RTCRtpTransceiver,\n stream: MediaStream,\n ) {\n const event: RTCTrackEvent = {\n track,\n streams: [stream],\n transceiver,\n receiver: transceiver.receiver,\n };\n this.onTrack.execute(track);\n this.emit(\"track\", event);\n if (this.ontrack) this.ontrack(event);\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {},\n ) {\n return this._addTransceiver(trackOrKind, options);\n }\n\n private _addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {},\n ) {\n const kind =\n typeof trackOrKind === \"string\" ? trackOrKind : trackOrKind.kind;\n\n const direction = options.direction || \"sendrecv\";\n\n const dtlsTransport = this.createTransport([\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n ]);\n\n const sender = new RTCRtpSender(trackOrKind);\n const receiver = new RTCRtpReceiver(this.config, kind, sender.ssrc);\n const newTransceiver = new RTCRtpTransceiver(\n kind,\n dtlsTransport,\n receiver,\n sender,\n direction,\n );\n newTransceiver.options = options;\n this.router.registerRtpSender(newTransceiver.sender);\n\n // reuse inactive\n const inactiveTransceiverIndex = this.transceivers.findIndex(\n (t) => t.currentDirection === \"inactive\",\n );\n const inactiveTransceiver = this.transceivers.find(\n (t) => t.currentDirection === \"inactive\",\n );\n if (inactiveTransceiverIndex > -1 && inactiveTransceiver) {\n this.replaceTransceiver(newTransceiver, inactiveTransceiverIndex);\n newTransceiver.mLineIndex = inactiveTransceiver.mLineIndex;\n inactiveTransceiver.setCurrentDirection(undefined);\n } else {\n this.pushTransceiver(newTransceiver);\n }\n this.onTransceiverAdded.execute(newTransceiver);\n\n this.updateIceConnectionState();\n this.needNegotiation();\n\n return newTransceiver;\n }\n\n getTransceivers() {\n return this.transceivers;\n }\n\n getSenders(): RTCRtpSender[] {\n return this.getTransceivers().map((t) => t.sender);\n }\n\n getReceivers() {\n return this.getTransceivers().map((t) => t.receiver);\n }\n\n // todo fix\n addTrack(\n track: MediaStreamTrack,\n /**todo impl */\n ms?: MediaStream,\n ) {\n if (this.isClosed) throw new Error(\"is closed\");\n if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {\n throw new Error(\"track exist\");\n }\n\n const emptyTrackSender = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === true,\n );\n if (emptyTrackSender) {\n const sender = emptyTrackSender.sender;\n sender.registerTrack(track);\n this.needNegotiation();\n return sender;\n }\n\n const notSendTransceiver = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === false &&\n !t.usedForSender,\n );\n if (notSendTransceiver) {\n const sender = notSendTransceiver.sender;\n sender.registerTrack(track);\n switch (notSendTransceiver.direction) {\n case \"recvonly\":\n notSendTransceiver.setDirection(\"sendrecv\");\n break;\n case \"inactive\":\n notSendTransceiver.setDirection(\"sendonly\");\n break;\n }\n this.needNegotiation();\n return sender;\n } else {\n const transceiver = this._addTransceiver(track, {\n direction: \"sendrecv\",\n });\n this.needNegotiation();\n return transceiver.sender;\n }\n }\n\n private async ensureCerts() {\n const ensureCert = async (dtlsTransport: RTCDtlsTransport) => {\n if (this.certificates.length === 0) {\n const localCertificate = await dtlsTransport.setupCertificate();\n this.certificates.push(localCertificate);\n } else {\n dtlsTransport.localCertificate = this.certificates[0];\n }\n };\n\n for (const dtlsTransport of this.dtlsTransports) {\n await ensureCert(dtlsTransport);\n }\n }\n\n async createAnswer() {\n await this.ensureCerts();\n const description = this.buildAnswer();\n return description.toJSON();\n }\n\n private buildAnswer() {\n this.assertNotClosed();\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(\n this.signalingState,\n )\n ) {\n throw new Error(\"createAnswer failed\");\n }\n if (!this._remoteDescription) {\n throw new Error(\"wrong state\");\n }\n\n const description = new SessionDescription();\n addSDPHeader(\"answer\", description);\n\n this._remoteDescription.media.forEach((remoteMedia) => {\n let dtlsTransport!: RTCDtlsTransport;\n let media: MediaDescription;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n const transceiver = this.getTransceiverByMid(remoteMedia.rtp.muxId!)!;\n media = createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n andDirection(transceiver.direction, transceiver.offerDirection),\n );\n dtlsTransport = transceiver.dtlsTransport;\n } else if (remoteMedia.kind === \"application\") {\n if (!this.sctpTransport || !this.sctpTransport.mid) {\n throw new Error(\"sctpTransport not found\");\n }\n media = createMediaDescriptionForSctp(this.sctpTransport);\n\n dtlsTransport = this.sctpTransport.dtlsTransport;\n } else {\n throw new Error(\"invalid kind\");\n }\n\n // # determine DTLS role, or preserve the currently configured role\n if (media.dtlsParams) {\n if (dtlsTransport.role === \"auto\") {\n media.dtlsParams.role = \"client\";\n } else {\n media.dtlsParams.role = dtlsTransport.role;\n }\n }\n\n media.simulcastParameters = remoteMedia.simulcastParameters.map((v) => ({\n ...v,\n direction: reverseSimulcastDirection(v.direction),\n }));\n\n description.media.push(media);\n });\n\n if (this.config.bundlePolicy !== \"disable\") {\n const bundle = new GroupDescription(\"BUNDLE\", []);\n description.media.forEach((media) => {\n if (media.direction !== \"inactive\") {\n bundle.items.push(media.rtp.muxId!);\n }\n });\n description.group.push(bundle);\n }\n\n return description;\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.setSignalingState(\"closed\");\n this.setConnectionState(\"closed\");\n\n this.transceivers.forEach((transceiver) => {\n transceiver.receiver.stop();\n transceiver.sender.stop();\n });\n\n if (this.sctpTransport) {\n await this.sctpTransport.stop();\n }\n for (const dtlsTransport of this.dtlsTransports) {\n await dtlsTransport.stop();\n await dtlsTransport.iceTransport.stop();\n }\n\n this.dispose();\n log(\"peerConnection closed\");\n }\n\n private assertNotClosed() {\n if (this.isClosed) {\n throw new Error(\"RTCPeerConnection is closed\");\n }\n }\n\n // https://w3c.github.io/webrtc-pc/#dom-rtcicegatheringstate\n private updateIceGatheringState() {\n const all = this.iceTransports;\n\n function allMatch(...state: IceGathererState[]) {\n return (\n all.filter((check) => state.includes(check.iceGather.gatheringState))\n .length === all.length\n );\n }\n\n let newState: IceGathererState;\n\n if (all.length && allMatch(\"complete\")) {\n newState = \"complete\";\n } else if (!all.length || allMatch(\"new\", \"complete\")) {\n newState = \"new\";\n } else if (\n all.map((check) => check.iceGather.gatheringState).includes(\"gathering\")\n ) {\n newState = \"gathering\";\n } else {\n newState = \"new\";\n }\n\n if (this.iceGatheringState === newState) {\n return;\n }\n\n log(\"iceGatheringStateChange\", newState);\n this.iceGatheringState = newState;\n this.iceGatheringStateChange.execute(newState);\n this.emit(\"icegatheringstatechange\", newState);\n }\n\n // https://w3c.github.io/webrtc-pc/#dom-rtciceconnectionstate\n private updateIceConnectionState() {\n const all = this.iceTransports;\n let newState: RTCIceConnectionState;\n\n function allMatch(...state: RTCIceConnectionState[]) {\n return (\n all.filter((check) => state.includes(check.state)).length === all.length\n );\n }\n\n if (this.connectionState === \"closed\") {\n newState = \"closed\";\n } else if (allMatch(\"failed\")) {\n newState = \"failed\";\n } else if (allMatch(\"disconnected\")) {\n newState = \"disconnected\";\n } else if (allMatch(\"new\", \"closed\")) {\n newState = \"new\";\n } else if (allMatch(\"new\", \"checking\")) {\n newState = \"checking\";\n } else if (allMatch(\"completed\", \"closed\")) {\n newState = \"completed\";\n } else if (allMatch(\"connected\", \"completed\", \"closed\")) {\n newState = \"connected\";\n } else {\n // unreachable?\n newState = \"new\";\n }\n\n if (this.iceConnectionState === newState) {\n return;\n }\n\n log(\"iceConnectionStateChange\", newState);\n this.iceConnectionState = newState;\n this.iceConnectionStateChange.execute(newState);\n this.emit(\"iceconnectionstatechange\", newState);\n }\n\n private setSignalingState(state: RTCSignalingState) {\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) this.onsignalingstatechange({});\n }\n\n private setConnectionState(state: ConnectionState) {\n log(\"connectionStateChange\", state);\n this.connectionState = state;\n this.connectionStateChange.execute(state);\n if (this.onconnectionstatechange) this.onconnectionstatechange();\n this.emit(\"connectionstatechange\");\n }\n\n private dispose() {\n this.onDataChannel.allUnsubscribe();\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.signalingStateChange.allUnsubscribe();\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n }\n}\n\nexport function createMediaDescriptionForTransceiver(\n transceiver: RTCRtpTransceiver,\n cname: string,\n direction: Direction,\n) {\n const media = new MediaDescription(\n transceiver.kind,\n 9,\n \"UDP/TLS/RTP/SAVPF\",\n transceiver.codecs.map((c) => c.payloadType),\n );\n media.direction = direction;\n media.msid = transceiver.msid;\n media.rtp = {\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n muxId: transceiver.mid,\n };\n media.rtcpHost = \"0.0.0.0\";\n media.rtcpPort = 9;\n media.rtcpMux = true;\n media.ssrc = [new SsrcDescription({ ssrc: transceiver.sender.ssrc, cname })];\n\n if (transceiver.options.simulcast) {\n media.simulcastParameters = transceiver.options.simulcast.map(\n (o) => new RTCRtpSimulcastParameters(o),\n );\n }\n\n if (media.rtp.codecs.find((c) => c.name.toLowerCase() === \"rtx\")) {\n media.ssrc.push(\n new SsrcDescription({ ssrc: transceiver.sender.rtxSsrc, cname }),\n );\n media.ssrcGroup = [\n new GroupDescription(\"FID\", [\n transceiver.sender.ssrc.toString(),\n transceiver.sender.rtxSsrc.toString(),\n ]),\n ];\n }\n\n addTransportDescription(media, transceiver.dtlsTransport);\n return media;\n}\n\nexport function createMediaDescriptionForSctp(sctp: RTCSctpTransport) {\n const media = new MediaDescription(\n \"application\",\n DISCARD_PORT,\n \"UDP/DTLS/SCTP\",\n [\"webrtc-datachannel\"],\n );\n media.sctpPort = sctp.port;\n media.rtp.muxId = sctp.mid;\n media.sctpCapabilities = RTCSctpTransport.getCapabilities();\n\n addTransportDescription(media, sctp.dtlsTransport);\n return media;\n}\n\nexport function addTransportDescription(\n media: MediaDescription,\n dtlsTransport: RTCDtlsTransport,\n) {\n const iceTransport = dtlsTransport.iceTransport;\n const iceGatherer = iceTransport.iceGather;\n\n media.iceCandidates = iceGatherer.localCandidates;\n media.iceCandidatesComplete = iceGatherer.gatheringState === \"complete\";\n media.iceParams = iceGatherer.localParameters;\n media.iceOptions = \"trickle\";\n\n media.host = DISCARD_HOST;\n media.port = DISCARD_PORT;\n\n if (media.direction === \"inactive\") {\n media.port = 0;\n media.msid = undefined;\n }\n\n if (!media.dtlsParams) {\n media.dtlsParams = dtlsTransport.localParameters;\n if (!media.dtlsParams.fingerprints) {\n media.dtlsParams.fingerprints =\n dtlsTransport.localParameters.fingerprints;\n }\n }\n}\n\nexport function allocateMid(mids: Set<string>, type: \"dc\" | \"av\" | \"\") {\n let mid = \"\";\n for (let i = 0; ; ) {\n // rfc9143.html#name-security-considerations\n // SHOULD be 3 bytes or fewer to allow them to efficiently fit into the MID RTP header extension\n mid = (i++).toString() + type;\n if (!mids.has(mid)) break;\n }\n mids.add(mid);\n return mid;\n}\n\nexport type BundlePolicy = \"max-compat\" | \"max-bundle\" | \"disable\";\n\nexport interface PeerConfig {\n codecs: Partial<{\n /**\n * When specifying a codec with a fixed payloadType such as PCMU,\n * it is necessary to set the correct PayloadType in RTCRtpCodecParameters in advance.\n */\n audio: RTCRtpCodecParameters[];\n video: RTCRtpCodecParameters[];\n }>;\n headerExtensions: Partial<{\n audio: RTCRtpHeaderExtensionParameters[];\n video: RTCRtpHeaderExtensionParameters[];\n }>;\n iceTransportPolicy: \"all\" | \"relay\";\n iceServers: RTCIceServer[];\n /**Minimum port and Maximum port must not be the same value */\n icePortRange: [number, number] | undefined;\n iceInterfaceAddresses: InterfaceAddresses | undefined;\n /** Add additional host (local) addresses to use for candidate gathering.\n * Notably, you can include hosts that are normally excluded, such as loopback, tun interfaces, etc.\n */\n iceAdditionalHostAddresses: string[] | undefined;\n iceUseIpv4: boolean;\n iceUseIpv6: boolean;\n /** If provided, is called on each STUN request.\n * Return `true` if a STUN response should be sent, false if it should be skipped. */\n iceFilterStunResponse:\n | ((message: Message, addr: Address, protocol: Protocol) => boolean)\n | undefined;\n iceFilterCandidatePair: ((pair: CandidatePair) => boolean) | undefined;\n dtls: Partial<{\n keys: DtlsKeys;\n }>;\n bundlePolicy: BundlePolicy;\n debug: Partial<{\n /**% */\n inboundPacketLoss: number;\n /**% */\n outboundPacketLoss: number;\n /**ms */\n receiverReportDelay: number;\n disableSendNack: boolean;\n disableRecvRetransmit: boolean;\n }>;\n midSuffix: boolean;\n}\n\nexport const findCodecByMimeType = (\n codecs: RTCRtpCodecParameters[],\n target: RTCRtpCodecParameters,\n) =>\n codecs.find(\n (localCodec) =>\n localCodec.mimeType.toLowerCase() === target.mimeType.toLowerCase(),\n )\n ? target\n : undefined;\n\nexport type RTCIceServer = {\n urls: string;\n username?: string;\n credential?: string;\n};\n\nexport const defaultPeerConfig: PeerConfig = {\n codecs: {\n audio: [\n new RTCRtpCodecParameters({\n mimeType: \"audio/opus\",\n clockRate: 48000,\n channels: 2,\n }),\n new RTCRtpCodecParameters({\n mimeType: \"audio/PCMU\",\n clockRate: 8000,\n channels: 1,\n payloadType: 0,\n }),\n ],\n video: [\n new RTCRtpCodecParameters({\n mimeType: \"video/VP8\",\n clockRate: 90000,\n rtcpFeedback: [useNACK(), usePLI(), useREMB()],\n }),\n ],\n },\n headerExtensions: {\n audio: [],\n video: [],\n },\n iceTransportPolicy: \"all\",\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n icePortRange: undefined,\n iceInterfaceAddresses: undefined,\n iceAdditionalHostAddresses: undefined,\n iceUseIpv4: true,\n iceUseIpv6: true,\n iceFilterStunResponse: undefined,\n iceFilterCandidatePair: undefined,\n dtls: {},\n bundlePolicy: \"max-compat\",\n debug: {},\n midSuffix: false,\n};\n\nexport interface RTCTrackEvent {\n track: MediaStreamTrack;\n streams: MediaStream[];\n transceiver: RTCRtpTransceiver;\n receiver: RTCRtpReceiver;\n}\n\nexport interface RTCDataChannelEvent {\n channel: RTCDataChannel;\n}\n\nexport interface RTCPeerConnectionIceEvent {\n candidate?: RTCIceCandidate;\n}\n\ntype Media = \"audio\" | \"video\";\n\nexport interface RTCSessionDescriptionInit {\n sdp?: string;\n type: RTCSdpType;\n}\nexport type RTCSdpType = \"answer\" | \"offer\" | \"pranswer\" | \"rollback\";\n"]}
|
|
@@ -22,7 +22,7 @@ export declare const IceGathererStates: readonly ["new", "gathering", "complete"
|
|
|
22
22
|
export type IceGathererState = (typeof IceGathererStates)[number];
|
|
23
23
|
export declare class RTCIceGatherer {
|
|
24
24
|
private options;
|
|
25
|
-
onIceCandidate: (candidate: IceCandidate) => void;
|
|
25
|
+
onIceCandidate: (candidate: IceCandidate | undefined) => void;
|
|
26
26
|
gatheringState: IceGathererState;
|
|
27
27
|
readonly onGatheringStateChange: Event<["new" | "complete" | "gathering"]>;
|
|
28
28
|
readonly connection: Connection;
|
|
@@ -176,7 +176,10 @@ class RTCIceGatherer {
|
|
|
176
176
|
async gather() {
|
|
177
177
|
if (this.gatheringState === "new") {
|
|
178
178
|
this.setState("gathering");
|
|
179
|
-
await this.connection.gatherCandidates((candidate) =>
|
|
179
|
+
await this.connection.gatherCandidates((candidate) => {
|
|
180
|
+
this.onIceCandidate(candidateFromIce(candidate));
|
|
181
|
+
});
|
|
182
|
+
this.onIceCandidate(undefined);
|
|
180
183
|
this.setState("complete");
|
|
181
184
|
}
|
|
182
185
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../src/transport/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport Event from \"rx.mini\";\nimport { v4 } from \"uuid\";\n\nimport { Candidate, Connection, type IceOptions } from \"../../../ice/src\";\nimport { candidateFromSdp, candidateToSdp } from \"../sdp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/ice.ts\");\n\nexport class RTCIceTransport {\n readonly id = v4();\n connection: Connection;\n state: RTCIceConnectionState = \"new\";\n\n readonly onStateChange = new Event<[RTCIceConnectionState]>();\n\n private waitStart?: Event<[]>;\n\n constructor(private gather: RTCIceGatherer) {\n this.connection = this.gather.connection;\n this.connection.stateChanged.subscribe((state) => {\n this.setState(state);\n });\n }\n\n get iceGather() {\n return this.gather;\n }\n\n get role() {\n if (this.connection.iceControlling) return \"controlling\";\n else return \"controlled\";\n }\n\n private setState(state: RTCIceConnectionState) {\n if (state !== this.state) {\n this.state = state;\n\n if (this.onStateChange.ended) return;\n\n if (state === \"closed\") {\n this.onStateChange.execute(state);\n this.onStateChange.complete();\n } else {\n this.onStateChange.execute(state);\n }\n }\n }\n\n addRemoteCandidate = (candidate?: IceCandidate) => {\n if (!this.connection.remoteCandidatesEnd) {\n if (!candidate) {\n return this.connection.addRemoteCandidate(undefined);\n } else {\n return this.connection.addRemoteCandidate(candidateToIce(candidate));\n }\n }\n };\n\n setRemoteParams(remoteParameters: RTCIceParameters) {\n if (\n this.connection.remoteUsername &&\n this.connection.remotePassword &&\n (this.connection.remoteUsername !== remoteParameters.usernameFragment ||\n this.connection.remotePassword !== remoteParameters.password)\n ) {\n log(\"restartIce\", remoteParameters);\n this.connection.resetNominatedPair();\n }\n this.connection.setRemoteParams(remoteParameters);\n }\n\n async start() {\n if (this.state === \"closed\") throw new Error(\"RTCIceTransport is closed\");\n if (!this.connection.remotePassword || !this.connection.remoteUsername)\n throw new Error(\"remoteParams missing\");\n\n if (this.waitStart) await this.waitStart.asPromise();\n this.waitStart = new Event();\n\n this.setState(\"checking\");\n\n try {\n await this.connection.connect();\n } catch (error) {\n this.setState(\"failed\");\n throw error;\n }\n\n this.waitStart.complete();\n }\n\n async stop() {\n if (this.state !== \"closed\") {\n this.setState(\"closed\");\n await this.connection.close();\n }\n }\n}\n\nexport const IceTransportStates = [\n \"new\",\n \"checking\",\n \"connected\",\n \"completed\",\n \"disconnected\",\n \"failed\",\n \"closed\",\n] as const;\nexport type RTCIceConnectionState = (typeof IceTransportStates)[number];\n\nexport const IceGathererStates = [\"new\", \"gathering\", \"complete\"] as const;\nexport type IceGathererState = (typeof IceGathererStates)[number];\n\nexport class RTCIceGatherer {\n onIceCandidate: (candidate: IceCandidate) => void = () => {};\n gatheringState: IceGathererState = \"new\";\n\n readonly onGatheringStateChange = new Event<[IceGathererState]>();\n readonly connection: Connection;\n\n constructor(private options: Partial<IceOptions> = {}) {\n this.connection = new Connection(false, this.options);\n }\n\n async gather() {\n if (this.gatheringState === \"new\") {\n this.setState(\"gathering\");\n await this.connection.gatherCandidates((candidate) =>\n this.onIceCandidate(candidateFromIce(candidate)),\n );\n this.setState(\"complete\");\n }\n }\n\n get localCandidates() {\n return this.connection.localCandidates.map(candidateFromIce);\n }\n\n get localParameters() {\n const params = new RTCIceParameters({\n usernameFragment: this.connection.localUserName,\n password: this.connection.localPassword,\n });\n\n return params;\n }\n\n private setState(state: IceGathererState) {\n if (state !== this.gatheringState) {\n this.gatheringState = state;\n this.onGatheringStateChange.execute(state);\n }\n }\n}\n\nexport function candidateFromIce(c: Candidate) {\n const candidate = new IceCandidate(\n c.component,\n c.foundation,\n c.host,\n c.port,\n c.priority,\n c.transport,\n c.type,\n );\n candidate.relatedAddress = c.relatedAddress;\n candidate.relatedPort = c.relatedPort;\n candidate.tcpType = c.tcptype;\n return candidate;\n}\n\nexport function candidateToIce(x: IceCandidate) {\n return new Candidate(\n x.foundation,\n x.component,\n x.protocol,\n x.priority,\n x.ip,\n x.port,\n x.type,\n x.relatedAddress,\n x.relatedPort,\n x.tcpType,\n );\n}\n\nexport class RTCIceCandidate {\n candidate!: string;\n sdpMid?: string;\n sdpMLineIndex?: number;\n\n constructor(props: Partial<RTCIceCandidate>) {\n Object.assign(this, props);\n }\n\n static isThis(o: any) {\n if (typeof o?.candidate === \"string\") return true;\n }\n\n toJSON() {\n return {\n candidate: this.candidate,\n sdpMid: this.sdpMid,\n sdpMLineIndex: this.sdpMLineIndex,\n };\n }\n}\n\nexport class IceCandidate {\n // \"\"\"\n // The :class:`RTCIceCandidate` interface represents a candidate Interactive\n // Connectivity Establishment (ICE) configuration which may be used to\n // establish an RTCPeerConnection.\n // \"\"\"\n public relatedAddress?: string;\n public relatedPort?: number;\n public sdpMid?: string;\n public sdpMLineIndex?: number;\n public tcpType?: string;\n\n constructor(\n public component: number,\n public foundation: string,\n public ip: string,\n public port: number,\n public priority: number,\n public protocol: string,\n public type: string,\n ) {}\n\n toJSON(): RTCIceCandidate {\n return new RTCIceCandidate({\n candidate: candidateToSdp(this),\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n });\n }\n\n static fromJSON(data: RTCIceCandidate) {\n try {\n const candidate = candidateFromSdp(data.candidate);\n candidate.sdpMLineIndex = data.sdpMLineIndex;\n candidate.sdpMid = data.sdpMid;\n return candidate;\n } catch (error) {}\n }\n}\n\nexport class RTCIceParameters {\n iceLite = false;\n usernameFragment!: string;\n password!: string;\n\n constructor(props: Partial<RTCIceParameters> = {}) {\n Object.assign(this, props);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../src/transport/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport Event from \"rx.mini\";\nimport { v4 } from \"uuid\";\n\nimport { Candidate, Connection, type IceOptions } from \"../../../ice/src\";\nimport { candidateFromSdp, candidateToSdp } from \"../sdp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/ice.ts\");\n\nexport class RTCIceTransport {\n readonly id = v4();\n connection: Connection;\n state: RTCIceConnectionState = \"new\";\n\n readonly onStateChange = new Event<[RTCIceConnectionState]>();\n\n private waitStart?: Event<[]>;\n\n constructor(private gather: RTCIceGatherer) {\n this.connection = this.gather.connection;\n this.connection.stateChanged.subscribe((state) => {\n this.setState(state);\n });\n }\n\n get iceGather() {\n return this.gather;\n }\n\n get role() {\n if (this.connection.iceControlling) return \"controlling\";\n else return \"controlled\";\n }\n\n private setState(state: RTCIceConnectionState) {\n if (state !== this.state) {\n this.state = state;\n\n if (this.onStateChange.ended) return;\n\n if (state === \"closed\") {\n this.onStateChange.execute(state);\n this.onStateChange.complete();\n } else {\n this.onStateChange.execute(state);\n }\n }\n }\n\n addRemoteCandidate = (candidate?: IceCandidate) => {\n if (!this.connection.remoteCandidatesEnd) {\n if (!candidate) {\n return this.connection.addRemoteCandidate(undefined);\n } else {\n return this.connection.addRemoteCandidate(candidateToIce(candidate));\n }\n }\n };\n\n setRemoteParams(remoteParameters: RTCIceParameters) {\n if (\n this.connection.remoteUsername &&\n this.connection.remotePassword &&\n (this.connection.remoteUsername !== remoteParameters.usernameFragment ||\n this.connection.remotePassword !== remoteParameters.password)\n ) {\n log(\"restartIce\", remoteParameters);\n this.connection.resetNominatedPair();\n }\n this.connection.setRemoteParams(remoteParameters);\n }\n\n async start() {\n if (this.state === \"closed\") throw new Error(\"RTCIceTransport is closed\");\n if (!this.connection.remotePassword || !this.connection.remoteUsername)\n throw new Error(\"remoteParams missing\");\n\n if (this.waitStart) await this.waitStart.asPromise();\n this.waitStart = new Event();\n\n this.setState(\"checking\");\n\n try {\n await this.connection.connect();\n } catch (error) {\n this.setState(\"failed\");\n throw error;\n }\n\n this.waitStart.complete();\n }\n\n async stop() {\n if (this.state !== \"closed\") {\n this.setState(\"closed\");\n await this.connection.close();\n }\n }\n}\n\nexport const IceTransportStates = [\n \"new\",\n \"checking\",\n \"connected\",\n \"completed\",\n \"disconnected\",\n \"failed\",\n \"closed\",\n] as const;\nexport type RTCIceConnectionState = (typeof IceTransportStates)[number];\n\nexport const IceGathererStates = [\"new\", \"gathering\", \"complete\"] as const;\nexport type IceGathererState = (typeof IceGathererStates)[number];\n\nexport class RTCIceGatherer {\n onIceCandidate: (candidate: IceCandidate | undefined) => void = () => {};\n gatheringState: IceGathererState = \"new\";\n\n readonly onGatheringStateChange = new Event<[IceGathererState]>();\n readonly connection: Connection;\n\n constructor(private options: Partial<IceOptions> = {}) {\n this.connection = new Connection(false, this.options);\n }\n\n async gather() {\n if (this.gatheringState === \"new\") {\n this.setState(\"gathering\");\n await this.connection.gatherCandidates((candidate) => {\n this.onIceCandidate(candidateFromIce(candidate));\n });\n this.onIceCandidate(undefined);\n this.setState(\"complete\");\n }\n }\n\n get localCandidates() {\n return this.connection.localCandidates.map(candidateFromIce);\n }\n\n get localParameters() {\n const params = new RTCIceParameters({\n usernameFragment: this.connection.localUserName,\n password: this.connection.localPassword,\n });\n\n return params;\n }\n\n private setState(state: IceGathererState) {\n if (state !== this.gatheringState) {\n this.gatheringState = state;\n this.onGatheringStateChange.execute(state);\n }\n }\n}\n\nexport function candidateFromIce(c: Candidate) {\n const candidate = new IceCandidate(\n c.component,\n c.foundation,\n c.host,\n c.port,\n c.priority,\n c.transport,\n c.type,\n );\n candidate.relatedAddress = c.relatedAddress;\n candidate.relatedPort = c.relatedPort;\n candidate.tcpType = c.tcptype;\n return candidate;\n}\n\nexport function candidateToIce(x: IceCandidate) {\n return new Candidate(\n x.foundation,\n x.component,\n x.protocol,\n x.priority,\n x.ip,\n x.port,\n x.type,\n x.relatedAddress,\n x.relatedPort,\n x.tcpType,\n );\n}\n\nexport class RTCIceCandidate {\n candidate!: string;\n sdpMid?: string;\n sdpMLineIndex?: number;\n\n constructor(props: Partial<RTCIceCandidate>) {\n Object.assign(this, props);\n }\n\n static isThis(o: any) {\n if (typeof o?.candidate === \"string\") return true;\n }\n\n toJSON() {\n return {\n candidate: this.candidate,\n sdpMid: this.sdpMid,\n sdpMLineIndex: this.sdpMLineIndex,\n };\n }\n}\n\nexport class IceCandidate {\n // \"\"\"\n // The :class:`RTCIceCandidate` interface represents a candidate Interactive\n // Connectivity Establishment (ICE) configuration which may be used to\n // establish an RTCPeerConnection.\n // \"\"\"\n public relatedAddress?: string;\n public relatedPort?: number;\n public sdpMid?: string;\n public sdpMLineIndex?: number;\n public tcpType?: string;\n\n constructor(\n public component: number,\n public foundation: string,\n public ip: string,\n public port: number,\n public priority: number,\n public protocol: string,\n public type: string,\n ) {}\n\n toJSON(): RTCIceCandidate {\n return new RTCIceCandidate({\n candidate: candidateToSdp(this),\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n });\n }\n\n static fromJSON(data: RTCIceCandidate) {\n try {\n const candidate = candidateFromSdp(data.candidate);\n candidate.sdpMLineIndex = data.sdpMLineIndex;\n candidate.sdpMid = data.sdpMid;\n return candidate;\n } catch (error) {}\n }\n}\n\nexport class RTCIceParameters {\n iceLite = false;\n usernameFragment!: string;\n password!: string;\n\n constructor(props: Partial<RTCIceParameters> = {}) {\n Object.assign(this, props);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { randomBytes } from "crypto";
|
|
2
|
+
import { createSocket } from "dgram";
|
|
2
3
|
import { jspack } from "@shinyoshiaki/jspack";
|
|
4
|
+
import { RTCRtpCodecParameters } from "..";
|
|
3
5
|
import { MediaStream, MediaStreamTrack } from "../media/track";
|
|
4
6
|
|
|
5
7
|
export class Navigator {
|
|
@@ -58,6 +60,31 @@ export class MediaDevices extends EventTarget {
|
|
|
58
60
|
};
|
|
59
61
|
|
|
60
62
|
readonly getDisplayMedia = this.getUserMedia;
|
|
63
|
+
|
|
64
|
+
readonly getUdpMedia = ({
|
|
65
|
+
port,
|
|
66
|
+
codec,
|
|
67
|
+
}: {
|
|
68
|
+
port: number;
|
|
69
|
+
codec: ConstructorParameters<typeof RTCRtpCodecParameters>[0];
|
|
70
|
+
}) => {
|
|
71
|
+
const track = new MediaStreamTrack({
|
|
72
|
+
kind: "audio",
|
|
73
|
+
codec: new RTCRtpCodecParameters(codec),
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const udp = createSocket("udp4");
|
|
77
|
+
udp.bind(port);
|
|
78
|
+
udp.on("message", (data) => {
|
|
79
|
+
track.writeRtp(data);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
const disposer = () => {
|
|
83
|
+
udp.close();
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
return { track, disposer };
|
|
87
|
+
};
|
|
61
88
|
}
|
|
62
89
|
|
|
63
90
|
interface MediaStreamConstraints {
|
|
@@ -77,6 +77,10 @@ export class WebmFactory extends MediaWriter {
|
|
|
77
77
|
});
|
|
78
78
|
const lipsync = new LipsyncCallback();
|
|
79
79
|
|
|
80
|
+
if (inputTracks.length === 1 || this.props.disableNtp) {
|
|
81
|
+
this.props.disableLipSync = true;
|
|
82
|
+
}
|
|
83
|
+
|
|
80
84
|
this.rtpSources = inputTracks.map(({ track, clockRate, codec }) => {
|
|
81
85
|
const rtpSource = new RtpSourceCallback();
|
|
82
86
|
const rtcpSource = new RtcpSourceCallback();
|
package/src/peerConnection.ts
CHANGED
|
@@ -105,7 +105,7 @@ export class RTCPeerConnection extends EventTarget {
|
|
|
105
105
|
readonly onDataChannel = new Event<[RTCDataChannel]>();
|
|
106
106
|
readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();
|
|
107
107
|
readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();
|
|
108
|
-
readonly onIceCandidate = new Event<[RTCIceCandidate]>();
|
|
108
|
+
readonly onIceCandidate = new Event<[RTCIceCandidate | undefined]>();
|
|
109
109
|
readonly onNegotiationneeded = new Event<[]>();
|
|
110
110
|
readonly onTrack = new Event<[MediaStreamTrack]>();
|
|
111
111
|
|
|
@@ -227,11 +227,13 @@ export class RTCPeerConnection extends EventTarget {
|
|
|
227
227
|
return this._remoteDescription.toJSON();
|
|
228
228
|
}
|
|
229
229
|
|
|
230
|
-
private
|
|
230
|
+
/**@private */
|
|
231
|
+
get _localDescription() {
|
|
231
232
|
return this.pendingLocalDescription || this.currentLocalDescription;
|
|
232
233
|
}
|
|
233
234
|
|
|
234
|
-
private
|
|
235
|
+
/**@private */
|
|
236
|
+
get _remoteDescription() {
|
|
235
237
|
return this.pendingRemoteDescription || this.currentRemoteDescription;
|
|
236
238
|
}
|
|
237
239
|
|
|
@@ -512,6 +514,16 @@ export class RTCPeerConnection extends EventTarget {
|
|
|
512
514
|
log("localDescription not found when ice candidate was gathered");
|
|
513
515
|
return;
|
|
514
516
|
}
|
|
517
|
+
if (!candidate) {
|
|
518
|
+
this.setLocal(this._localDescription!);
|
|
519
|
+
this.onIceCandidate.execute(undefined);
|
|
520
|
+
if (this.onicecandidate) {
|
|
521
|
+
this.onicecandidate({ candidate: undefined });
|
|
522
|
+
}
|
|
523
|
+
this.emit("icecandidate", { candidate: undefined });
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
|
|
515
527
|
if (this.config.bundlePolicy === "max-bundle" || this.remoteIsBundled) {
|
|
516
528
|
candidate.sdpMLineIndex = 0;
|
|
517
529
|
const media = this._localDescription?.media[0];
|
|
@@ -678,16 +690,6 @@ export class RTCPeerConnection extends EventTarget {
|
|
|
678
690
|
});
|
|
679
691
|
}
|
|
680
692
|
|
|
681
|
-
description.media
|
|
682
|
-
.filter((m) => ["audio", "video"].includes(m.kind))
|
|
683
|
-
.forEach((m, i) => {
|
|
684
|
-
addTransportDescription(m, this.transceivers[i].dtlsTransport);
|
|
685
|
-
});
|
|
686
|
-
const sctpMedia = description.media.find((m) => m.kind === "application");
|
|
687
|
-
if (this.sctpTransport && sctpMedia) {
|
|
688
|
-
addTransportDescription(sctpMedia, this.sctpTransport.dtlsTransport);
|
|
689
|
-
}
|
|
690
|
-
|
|
691
693
|
this.setLocal(description);
|
|
692
694
|
|
|
693
695
|
if (this.shouldNegotiationneeded) {
|
|
@@ -698,6 +700,16 @@ export class RTCPeerConnection extends EventTarget {
|
|
|
698
700
|
}
|
|
699
701
|
|
|
700
702
|
private setLocal(description: SessionDescription) {
|
|
703
|
+
description.media
|
|
704
|
+
.filter((m) => ["audio", "video"].includes(m.kind))
|
|
705
|
+
.forEach((m, i) => {
|
|
706
|
+
addTransportDescription(m, this.transceivers[i].dtlsTransport);
|
|
707
|
+
});
|
|
708
|
+
const sctpMedia = description.media.find((m) => m.kind === "application");
|
|
709
|
+
if (this.sctpTransport && sctpMedia) {
|
|
710
|
+
addTransportDescription(sctpMedia, this.sctpTransport.dtlsTransport);
|
|
711
|
+
}
|
|
712
|
+
|
|
701
713
|
if (description.type === "answer") {
|
|
702
714
|
this.currentLocalDescription = description;
|
|
703
715
|
this.pendingLocalDescription = undefined;
|
|
@@ -1743,7 +1755,7 @@ export interface RTCDataChannelEvent {
|
|
|
1743
1755
|
}
|
|
1744
1756
|
|
|
1745
1757
|
export interface RTCPeerConnectionIceEvent {
|
|
1746
|
-
candidate
|
|
1758
|
+
candidate?: RTCIceCandidate;
|
|
1747
1759
|
}
|
|
1748
1760
|
|
|
1749
1761
|
type Media = "audio" | "video";
|
package/src/transport/ice.ts
CHANGED
|
@@ -113,7 +113,7 @@ export const IceGathererStates = ["new", "gathering", "complete"] as const;
|
|
|
113
113
|
export type IceGathererState = (typeof IceGathererStates)[number];
|
|
114
114
|
|
|
115
115
|
export class RTCIceGatherer {
|
|
116
|
-
onIceCandidate: (candidate: IceCandidate) => void = () => {};
|
|
116
|
+
onIceCandidate: (candidate: IceCandidate | undefined) => void = () => {};
|
|
117
117
|
gatheringState: IceGathererState = "new";
|
|
118
118
|
|
|
119
119
|
readonly onGatheringStateChange = new Event<[IceGathererState]>();
|
|
@@ -126,9 +126,10 @@ export class RTCIceGatherer {
|
|
|
126
126
|
async gather() {
|
|
127
127
|
if (this.gatheringState === "new") {
|
|
128
128
|
this.setState("gathering");
|
|
129
|
-
await this.connection.gatherCandidates((candidate) =>
|
|
130
|
-
this.onIceCandidate(candidateFromIce(candidate))
|
|
131
|
-
);
|
|
129
|
+
await this.connection.gatherCandidates((candidate) => {
|
|
130
|
+
this.onIceCandidate(candidateFromIce(candidate));
|
|
131
|
+
});
|
|
132
|
+
this.onIceCandidate(undefined);
|
|
132
133
|
this.setState("complete");
|
|
133
134
|
}
|
|
134
135
|
}
|