werift 0.22.4 → 0.22.6
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/index.mjs +12 -3
- package/lib/nonstandard/index.mjs +3 -0
- package/lib/sctp/src/index.d.ts +1 -0
- package/lib/sctp/src/index.js +4 -1
- package/lib/sctp/src/index.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.js +1 -1
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sdpManager.js +9 -1
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.js +1 -1
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/package.json +1 -1
package/lib/index.mjs
CHANGED
|
@@ -14233,8 +14233,17 @@ var SDPManager = class {
|
|
|
14233
14233
|
* ローカルセッション記述を設定し、トランスポート情報を追加する
|
|
14234
14234
|
*/
|
|
14235
14235
|
setLocal(description, transceivers, sctpTransport) {
|
|
14236
|
+
const transceiverByMLineIndex = new Map(
|
|
14237
|
+
transceivers.map((transceiver) => [transceiver?.mLineIndex, transceiver])
|
|
14238
|
+
);
|
|
14239
|
+
const fallbackDtlsTransport = transceivers.find((transceiver) => transceiver?.dtlsTransport)?.dtlsTransport ?? sctpTransport?.dtlsTransport;
|
|
14236
14240
|
description.media.filter((m) => ["audio", "video"].includes(m.kind)).forEach((m, i) => {
|
|
14237
|
-
|
|
14241
|
+
const transceiver = transceiverByMLineIndex.get(i) ?? transceivers[i];
|
|
14242
|
+
const dtlsTransport = transceiver?.dtlsTransport ?? fallbackDtlsTransport;
|
|
14243
|
+
if (!dtlsTransport) {
|
|
14244
|
+
throw new Error(`dtls transport not found for media index ${i}`);
|
|
14245
|
+
}
|
|
14246
|
+
this.addTransportDescription(m, dtlsTransport);
|
|
14238
14247
|
});
|
|
14239
14248
|
const sctpMedia = description.media.find((m) => m.kind === "application");
|
|
14240
14249
|
if (sctpTransport && sctpMedia) {
|
|
@@ -14277,7 +14286,7 @@ var SecureTransportManager = class {
|
|
|
14277
14286
|
}
|
|
14278
14287
|
get dtlsTransports() {
|
|
14279
14288
|
const transports = [
|
|
14280
|
-
...this.transceiverManager.getTransceivers().map((t) => t
|
|
14289
|
+
...this.transceiverManager.getTransceivers().map((t) => t?.dtlsTransport),
|
|
14281
14290
|
this.sctpManager.sctpTransport?.dtlsTransport
|
|
14282
14291
|
].filter((t) => t != void 0);
|
|
14283
14292
|
return transports.reduce((acc, cur) => {
|
|
@@ -14839,7 +14848,7 @@ var RTCPeerConnection = class extends EventTarget {
|
|
|
14839
14848
|
bundlePolicy: this.sdpManager.bundlePolicy,
|
|
14840
14849
|
remoteIsBundled: !!this.sdpManager.remoteIsBundled,
|
|
14841
14850
|
media: this._localDescription.media[0],
|
|
14842
|
-
transceiver: this.transceiverManager.getTransceivers().find((t) => t
|
|
14851
|
+
transceiver: this.transceiverManager.getTransceivers().find((t) => t?.dtlsTransport?.iceTransport.id === iceTransport.id),
|
|
14843
14852
|
sctpTransport: this.sctpTransport?.dtlsTransport.iceTransport.id === iceTransport.id ? this.sctpTransport : void 0
|
|
14844
14853
|
});
|
|
14845
14854
|
});
|
|
@@ -9449,6 +9449,9 @@ var WebmFactory = class extends MediaWriter {
|
|
|
9449
9449
|
if (this.props.path) {
|
|
9450
9450
|
webm.pipe(async (o) => {
|
|
9451
9451
|
const eol = await saveToFileSystem(this.props.path)(o);
|
|
9452
|
+
if (this.props.stream) {
|
|
9453
|
+
this.props.stream.execute(o);
|
|
9454
|
+
}
|
|
9452
9455
|
if (eol) {
|
|
9453
9456
|
this.onEol.execute();
|
|
9454
9457
|
this.ended = true;
|
package/lib/sctp/src/index.d.ts
CHANGED
package/lib/sctp/src/index.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SCTP = exports.WEBRTC_PPID = exports.SCTP_STATE = void 0;
|
|
3
|
+
exports.UdpTransport = exports.createUdpTransport = exports.SCTP = exports.WEBRTC_PPID = exports.SCTP_STATE = void 0;
|
|
4
4
|
var const_1 = require("./const");
|
|
5
5
|
Object.defineProperty(exports, "SCTP_STATE", { enumerable: true, get: function () { return const_1.SCTP_STATE; } });
|
|
6
6
|
Object.defineProperty(exports, "WEBRTC_PPID", { enumerable: true, get: function () { return const_1.WEBRTC_PPID; } });
|
|
7
7
|
var sctp_1 = require("./sctp");
|
|
8
8
|
Object.defineProperty(exports, "SCTP", { enumerable: true, get: function () { return sctp_1.SCTP; } });
|
|
9
|
+
var transport_1 = require("./transport");
|
|
10
|
+
Object.defineProperty(exports, "createUdpTransport", { enumerable: true, get: function () { return transport_1.createUdpTransport; } });
|
|
11
|
+
Object.defineProperty(exports, "UdpTransport", { enumerable: true, get: function () { return transport_1.UdpTransport; } });
|
|
9
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../sctp/src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAkD;AAAzC,mGAAA,UAAU,OAAA;AAAE,oGAAA,WAAW,OAAA;AAChC,+BAA8B;AAArB,4FAAA,IAAI,OAAA","sourcesContent":["export { SCTP_STATE, WEBRTC_PPID } from \"./const\";\nexport { SCTP } from \"./sctp\";\nexport type { Transport } from \"./transport\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../sctp/src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAkD;AAAzC,mGAAA,UAAU,OAAA;AAAE,oGAAA,WAAW,OAAA;AAChC,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AACb,yCAA+D;AAAtD,+GAAA,kBAAkB,OAAA;AAAE,yGAAA,YAAY,OAAA","sourcesContent":["export { SCTP_STATE, WEBRTC_PPID } from \"./const\";\nexport { SCTP } from \"./sctp\";\nexport { createUdpTransport, UdpTransport } from \"./transport\";\nexport type { Transport } from \"./transport\";\n"]}
|
|
@@ -138,6 +138,9 @@ class WebmFactory extends _1.MediaWriter {
|
|
|
138
138
|
if (this.props.path) {
|
|
139
139
|
webm.pipe(async (o) => {
|
|
140
140
|
const eol = await (0, rtpExtra_1.saveToFileSystem)(this.props.path)(o);
|
|
141
|
+
if (this.props.stream) {
|
|
142
|
+
this.props.stream.execute(o);
|
|
143
|
+
}
|
|
141
144
|
if (eol) {
|
|
142
145
|
this.onEol.execute();
|
|
143
146
|
this.ended = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/webm.ts"],"names":[],"mappings":";;;AAAA,0CAAqC;AACrC,oDAA+D;AAE/D,wBAAgC;AAChC,gCAA8D;AAC9D,wDAYmC;AAEnC,MAAM,UAAU,GAAG,yDAAyD,CAAC;AAE7E,MAAa,WAAY,SAAQ,cAAW;IAA5C;;QACE;;;;mBAAkC,EAAE;WAAC;QAC7B;;;;mBAAQ,IAAI,cAAK,EAAE;WAAC;QACpB;;;;mBAAQ,KAAK;WAAC;QACtB;;;;mBAAgB,IAAI,sBAAa,EAAE;WAAC;
|
|
1
|
+
{"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/webm.ts"],"names":[],"mappings":"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","sourcesContent":["import { unlink } from \"fs/promises\";\nimport { Event, EventDisposer } from \"../../../imports/common\";\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 WebmCallback,\n type WebmSupportedCodec,\n type WebmTrack,\n saveToFileSystem,\n} from \"../../../imports/rtpExtra\";\n\nconst sourcePath = \"packages/webrtc/src/nonstandard/recorder/writer/webm.ts\";\n\nexport class WebmFactory extends MediaWriter {\n rtpSources: RtpSourceCallback[] = [];\n private onEol = new Event();\n private ended = false;\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: (WebmTrack & { track: MediaStreamTrack })[] = tracks.map(\n (track, i) => {\n const trackNumber = i + 1;\n const payloadType = track.codec!.payloadType;\n\n if (track.kind === \"video\") {\n const codec = ((): WebmSupportedCodec => {\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 roll: this.props.roll,\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\n const webm = new WebmCallback(inputTracks, {\n duration: this.props.defaultDuration ?? 1000 * 60 * 60 * 24,\n });\n const lipsync = new LipsyncCallback(this.props.lipsync ?? {});\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(\n clockRate,\n this.props.jitterBuffer ?? {},\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(async (o) => {\n const eol = await saveToFileSystem(this.props.path)(o);\n if (this.props.stream) {\n this.props.stream.execute(o);\n }\n if (eol) {\n this.onEol.execute();\n this.ended = true;\n }\n });\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\n if (!this.ended) {\n await this.onEol.asPromise(5000).catch((e) => e);\n }\n this.unSubscribers.dispose();\n }\n}\n\nconst supportedVideoCodecs = [\"h264\", \"vp8\", \"vp9\", \"av1x\"] as const;\ntype SupportedVideoCodec = (typeof supportedVideoCodecs)[number];\n"]}
|
|
@@ -461,7 +461,7 @@ class RTCPeerConnection extends helper_1.EventTarget {
|
|
|
461
461
|
media: this._localDescription.media[0],
|
|
462
462
|
transceiver: this.transceiverManager
|
|
463
463
|
.getTransceivers()
|
|
464
|
-
.find((t) => t
|
|
464
|
+
.find((t) => t?.dtlsTransport?.iceTransport.id === iceTransport.id),
|
|
465
465
|
sctpTransport: this.sctpTransport?.dtlsTransport.iceTransport.id === iceTransport.id
|
|
466
466
|
? this.sctpTransport
|
|
467
467
|
: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\n\nimport type { RTCDataChannel } from \"./dataChannel\";\nimport { EventTarget, enumerate } from \"./helper\";\nimport {\n type Address,\n Event,\n type InterfaceAddresses,\n debug,\n} from \"./imports/common\";\nimport type { CandidatePair, Message, Protocol } from \"./imports/ice\";\nimport {\n type MediaStream,\n type MediaStreamTrack,\n type RTCRtpCodecParameters,\n type RTCRtpHeaderExtensionParameters,\n type RTCRtpReceiver,\n type RTCRtpSender,\n type RTCRtpTransceiver,\n RtpRouter,\n TransceiverManager,\n type TransceiverOptions,\n useOPUS,\n usePCMU,\n useVP8,\n} from \"./media\";\nimport {\n type RTCPeerConnectionStats,\n type RTCStats,\n RTCStatsReport,\n generateStatsId,\n getStatsTimestamp,\n} from \"./media/stats\";\nimport { SctpTransportManager } from \"./sctpManager\";\nimport {\n type BundlePolicy,\n type MediaDescription,\n SessionDescription,\n} from \"./sdp\";\nimport { type RTCSessionDescriptionInit, SDPManager } from \"./sdpManager\";\nimport { SecureTransportManager } from \"./secureTransportManager\";\nimport type { DtlsKeys, RTCDtlsTransport } from \"./transport/dtls\";\nimport type {\n IceGathererState,\n RTCIceCandidate,\n RTCIceCandidateInit,\n RTCIceConnectionState,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport type { ConnectionState, Kind, RTCSignalingState } from \"./types/domain\";\nimport type { Callback, CallbackWithValue } from \"./types/util\";\nimport { andDirection, deepMerge } from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/peerConnection.ts\");\n\nexport class RTCPeerConnection extends EventTarget {\n readonly cname = randomUUID().toString();\n\n config: Required<PeerConfig> = generateDefaultPeerConfig();\n signalingState: RTCSignalingState = \"stable\";\n negotiationneeded = false;\n needRestart = false;\n private readonly router = new RtpRouter();\n private readonly sdpManager: SDPManager;\n private readonly transceiverManager: TransceiverManager;\n private readonly sctpManager: SctpTransportManager;\n private readonly secureManager: SecureTransportManager;\n private isClosed = false;\n private shouldNegotiationneeded = false;\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 onicecandidateerror?: CallbackWithValue<any>;\n onicegatheringstatechange?: CallbackWithValue<any>;\n onnegotiationneeded?: CallbackWithValue<any>;\n onsignalingstatechange?: CallbackWithValue<any>;\n ontrack?: CallbackWithValue<RTCTrackEvent>;\n onconnectionstatechange?: Callback;\n oniceconnectionstatechange?: Callback;\n\n constructor(config: Partial<PeerConfig> = {}) {\n super();\n\n this.setConfiguration(config);\n\n this.sdpManager = new SDPManager({\n cname: this.cname,\n bundlePolicy: this.config.bundlePolicy,\n });\n this.transceiverManager = new TransceiverManager(\n this.cname,\n this.config,\n this.router,\n );\n this.transceiverManager.onTransceiverAdded.pipe(this.onTransceiverAdded);\n this.transceiverManager.onRemoteTransceiverAdded.pipe(\n this.onRemoteTransceiverAdded,\n );\n this.transceiverManager.onTrack.subscribe(\n ({ track, stream, transceiver }) => {\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) {\n this.ontrack(event);\n }\n },\n );\n this.transceiverManager.onNegotiationNeeded.subscribe(() =>\n this.needNegotiation(),\n );\n this.sctpManager = new SctpTransportManager();\n this.sctpManager.onDataChannel.subscribe((channel) => {\n this.onDataChannel.execute(channel);\n const event: RTCDataChannelEvent = { channel };\n this.ondatachannel?.(event);\n this.emit(\"datachannel\", event);\n });\n this.secureManager = new SecureTransportManager({\n config: this.config,\n sctpManager: this.sctpManager,\n transceiverManager: this.transceiverManager,\n });\n this.secureManager.iceGatheringStateChange.pipe(\n this.iceGatheringStateChange,\n );\n this.secureManager.iceConnectionStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.close();\n }\n this.iceConnectionStateChange.execute(state);\n });\n this.secureManager.connectionStateChange.subscribe((state) => {\n this.connectionStateChange.execute(state);\n this.onconnectionstatechange?.();\n this.emit(\"connectionstatechange\");\n });\n this.secureManager.onIceCandidate.subscribe((candidate) => {\n const iceCandidate = candidate ? candidate.toJSON() : undefined;\n this.onIceCandidate.execute(iceCandidate);\n this.onicecandidate?.({ candidate: iceCandidate });\n this.emit(\"icecandidate\", { candidate: iceCandidate });\n });\n }\n\n get connectionState() {\n return this.secureManager.connectionState;\n }\n get iceConnectionState() {\n return this.secureManager.iceConnectionState;\n }\n get iceGathererState() {\n return this.secureManager.iceGatheringState;\n }\n get iceGatheringState() {\n return this.secureManager.iceGatheringState;\n }\n get dtlsTransports() {\n return this.secureManager.dtlsTransports;\n }\n get sctpTransport() {\n return this.sctpManager.sctpTransport;\n }\n get sctpRemotePort() {\n return this.sctpManager.sctpRemotePort;\n }\n get iceTransports() {\n return this.secureManager.iceTransports;\n }\n get extIdUriMap() {\n return this.router.extIdUriMap;\n }\n get iceGeneration() {\n return this.iceTransports[0].connection.generation;\n }\n get localDescription() {\n return this.sdpManager.localDescription;\n }\n get remoteDescription() {\n return this.sdpManager.remoteDescription;\n }\n get remoteIsBundled() {\n return this.sdpManager.remoteIsBundled;\n }\n /**@private */\n get _localDescription() {\n return this.sdpManager._localDescription;\n }\n /**@private */\n get _remoteDescription() {\n return this.sdpManager._remoteDescription;\n }\n\n getTransceivers() {\n return this.transceiverManager.getTransceivers();\n }\n\n getSenders(): RTCRtpSender[] {\n return this.transceiverManager.getSenders();\n }\n\n getReceivers() {\n return this.transceiverManager.getReceivers();\n }\n\n setConfiguration(config: Partial<PeerConfig>) {\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\n getConfiguration() {\n return this.config;\n }\n\n async createOffer({ iceRestart }: { iceRestart?: boolean } = {}) {\n if (iceRestart || this.needRestart) {\n this.needRestart = false;\n this.secureManager.restartIce();\n }\n\n await this.secureManager.ensureCerts();\n\n for (const transceiver of this.transceiverManager.getTransceivers()) {\n if (transceiver.codecs.length === 0) {\n this.transceiverManager.assignTransceiverCodecs(transceiver);\n }\n if (transceiver.headerExtensions.length === 0) {\n transceiver.headerExtensions =\n this.config.headerExtensions[transceiver.kind] ?? [];\n }\n }\n\n const description = this.sdpManager.buildOfferSdp(\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n return description.toJSON();\n }\n\n private createSctpTransport() {\n const sctp = this.sctpManager.createSctpTransport();\n const dtlsTransport = this.findOrCreateTransport();\n sctp.setDtlsTransport(dtlsTransport);\n return sctp;\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 if (!this.sctpTransport) {\n this.createSctpTransport();\n this.needNegotiation();\n }\n\n const channel = this.sctpManager.createDataChannel(label, options);\n if (!channel.sctp.dtlsTransport) {\n const dtlsTransport = this.findOrCreateTransport();\n channel.sctp.setDtlsTransport(dtlsTransport);\n }\n return channel;\n }\n\n removeTrack(sender: RTCRtpSender) {\n if (this.isClosed) {\n throw new Error(\"peer closed\");\n }\n this.transceiverManager.removeTrack(sender);\n this.needNegotiation();\n }\n\n private needNegotiation = async () => {\n this.shouldNegotiationneeded = true;\n if (this.negotiationneeded || this.signalingState !== \"stable\") {\n return;\n }\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 findOrCreateTransport() {\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 (\n this.sdpManager.bundlePolicy === \"max-bundle\" ||\n (this.sdpManager.bundlePolicy !== \"disable\" && this.remoteIsBundled)\n ) {\n if (existing) {\n return this.dtlsTransports[0];\n }\n }\n\n const dtlsTransport = this.secureManager.createTransport();\n dtlsTransport.onRtp.subscribe((rtp) => {\n this.router.routeRtp(rtp);\n });\n dtlsTransport.onRtcp.subscribe((rtcp) => {\n this.router.routeRtcp(rtcp);\n });\n const iceTransport = dtlsTransport.iceTransport;\n\n iceTransport.onNegotiationNeeded.subscribe(() => {\n this.needNegotiation();\n });\n iceTransport.onIceCandidate.subscribe((candidate) => {\n if (!this.localDescription) {\n log(\"localDescription not found when ice candidate was gathered\");\n return;\n }\n if (!candidate) {\n this.sdpManager.setLocal(\n this._localDescription!,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\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._localDescription) {\n log(\"localDescription not found when ice candidate was gathered\");\n return;\n }\n\n this.secureManager.handleNewIceCandidate({\n candidate,\n bundlePolicy: this.sdpManager.bundlePolicy,\n remoteIsBundled: !!this.sdpManager.remoteIsBundled,\n media: this._localDescription.media[0],\n transceiver: this.transceiverManager\n .getTransceivers()\n .find((t) => t.dtlsTransport.iceTransport.id === iceTransport.id),\n sctpTransport:\n this.sctpTransport?.dtlsTransport.iceTransport.id === iceTransport.id\n ? this.sctpTransport\n : undefined,\n });\n });\n\n return dtlsTransport;\n }\n\n async setLocalDescription(sessionDescription?: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }): Promise<SessionDescription> {\n // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setLocalDescription#type\n const implicitOfferState: RTCSignalingState[] = [\n \"stable\",\n \"have-local-offer\",\n \"have-remote-pranswer\",\n ];\n sessionDescription =\n sessionDescription ??\n (implicitOfferState.includes(this.signalingState)\n ? await this.createOffer()\n : await this.createAnswer());\n\n // # parse and validate description\n const description = this.sdpManager.parseSdp({\n sdp: sessionDescription.sdp,\n isLocal: true,\n signalingState: this.signalingState,\n type: sessionDescription.type,\n });\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 for (const [i, media] of enumerate(description.media)) {\n const mid = media.rtp.muxId!;\n this.sdpManager.registerMid(mid);\n if ([\"audio\", \"video\"].includes(media.kind)) {\n const transceiver =\n this.transceiverManager.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 // setup ice,dtls role\n const role = description.media.find((media) => media.dtlsParams)?.dtlsParams\n ?.role;\n\n this.secureManager.setLocalRole({\n type: description.type,\n role,\n });\n\n // # configure direction\n if ([\"answer\", \"pranswer\"].includes(description.type)) {\n for (const t of this.transceiverManager.getTransceivers()) {\n const direction = andDirection(t.direction, t.offerDirection);\n t.setCurrentDirection(direction);\n }\n }\n\n // for trickle ice\n this.sdpManager.setLocal(\n description,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n\n await this.gatherCandidates().catch((e) => {\n log(\"gatherCandidates failed\", e);\n });\n\n // connect transports\n if (description.type === \"answer\") {\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.secureManager.setConnectionState(\"failed\");\n });\n }\n\n this.sdpManager.setLocal(\n description,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n\n return description;\n }\n\n private async gatherCandidates() {\n await this.secureManager.gatherCandidates(\n !!this.sdpManager.remoteIsBundled,\n );\n }\n\n async addIceCandidate(\n candidateMessage: RTCIceCandidate | RTCIceCandidateInit,\n ) {\n const sdp = this.sdpManager.buildOfferSdp(\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n await this.secureManager.addIceCandidate(sdp, candidateMessage);\n }\n\n private async connect() {\n log(\"start connect\");\n\n const res = await Promise.allSettled(\n this.dtlsTransports.map(async (dtlsTransport) => {\n const { iceTransport } = dtlsTransport;\n if (iceTransport.state === \"connected\") {\n return;\n }\n const checkDtlsConnected = () => dtlsTransport.state === \"connected\";\n\n if (checkDtlsConnected()) {\n return;\n }\n\n this.secureManager.setConnectionState(\"connecting\");\n\n await iceTransport.start().catch((err) => {\n log(\"iceTransport.start failed\", err);\n throw err;\n });\n\n if (checkDtlsConnected()) {\n return;\n }\n\n await dtlsTransport.start().catch((err) => {\n log(\"dtlsTransport.start failed\", err);\n throw err;\n });\n\n if (\n this.sctpTransport &&\n this.sctpTransport.dtlsTransport.id === dtlsTransport.id\n ) {\n await this.sctpManager.connectSctp();\n }\n }),\n );\n\n if (res.find((r) => r.status === \"rejected\")) {\n this.secureManager.setConnectionState(\"failed\");\n } else {\n this.secureManager.setConnectionState(\"connected\");\n }\n }\n\n restartIce() {\n this.needRestart = true;\n this.needNegotiation();\n }\n\n async setRemoteDescription(sessionDescription: RTCSessionDescriptionInit) {\n if (sessionDescription instanceof SessionDescription) {\n sessionDescription = sessionDescription.toSdp();\n }\n\n // # parse and validate description\n const remoteSdp = this.sdpManager.setRemoteDescription(\n sessionDescription,\n this.signalingState,\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.transceiverManager\n .getTransceivers()\n .find((t) => matchTransceiverWithMedia(t, remoteMedia));\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.sdpManager.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = transceiver.dtlsTransport;\n } else {\n transceiver.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = transceiver.dtlsTransport;\n\n this.transceiverManager.setRemoteRTP(\n transceiver,\n remoteMedia,\n remoteSdp.type,\n i,\n );\n } else if (remoteMedia.kind === \"application\") {\n let sctpTransport = this.sctpTransport;\n if (!sctpTransport) {\n sctpTransport = this.createSctpTransport();\n sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n\n if (this.sdpManager.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = sctpTransport.dtlsTransport;\n } else {\n sctpTransport.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = sctpTransport.dtlsTransport;\n\n this.sctpManager.setRemoteSCTP(remoteMedia, i);\n } else {\n throw new Error(\"invalid media kind\");\n }\n\n const iceTransport = dtlsTransport.iceTransport;\n\n if (remoteMedia.iceParams) {\n const renomination = !!this.sdpManager.inactiveRemoteMedia;\n iceTransport.setRemoteParams(remoteMedia.iceParams, renomination);\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 if (remoteMedia.dtlsParams) {\n dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);\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.transceiverManager\n .getTransceivers()\n .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.secureManager.setConnectionState(\"failed\");\n });\n }\n\n this.negotiationneeded = false;\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {},\n ) {\n const dtlsTransport = this.findOrCreateTransport();\n const transceiver = this.transceiverManager.addTransceiver(\n trackOrKind,\n dtlsTransport,\n options,\n );\n\n this.secureManager.updateIceConnectionState();\n this.needNegotiation();\n\n return transceiver;\n }\n\n // todo fix\n addTrack(\n track: MediaStreamTrack,\n /**todo impl */\n ms?: MediaStream,\n ): RTCRtpSender {\n if (this.isClosed) {\n throw new Error(\"is closed\");\n }\n const transceiver = this.transceiverManager.addTrack(track, ms);\n if (!transceiver.dtlsTransport) {\n const dtlsTransport = this.findOrCreateTransport();\n transceiver.setDtlsTransport(dtlsTransport);\n }\n this.needNegotiation();\n return transceiver.sender;\n }\n\n async createAnswer() {\n this.assertNotClosed();\n\n await this.secureManager.ensureCerts();\n\n const description = this.sdpManager.buildAnswerSdp({\n transceivers: this.transceiverManager.getTransceivers(),\n sctpTransport: this.sctpTransport,\n signalingState: this.signalingState,\n });\n return description.toJSON();\n }\n\n private assertNotClosed() {\n if (this.isClosed) {\n throw new Error(\"RTCPeerConnection is closed\");\n }\n }\n\n private setSignalingState(state: RTCSignalingState) {\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) {\n this.onsignalingstatechange({});\n }\n }\n\n private createPeerConnectionStats(): RTCPeerConnectionStats {\n const timestamp = getStatsTimestamp();\n return {\n type: \"peer-connection\",\n id: generateStatsId(\"peer-connection\"),\n timestamp,\n dataChannelsOpened: this.sctpManager.dataChannelsOpened,\n dataChannelsClosed: this.sctpManager.dataChannelsClosed,\n };\n }\n\n async getStats(selector?: MediaStreamTrack | null): Promise<RTCStatsReport> {\n const stats: RTCStats[] = [];\n\n // Peer connection stats - always included regardless of selector\n stats.push(this.createPeerConnectionStats());\n\n // Get stats from transceivers\n const transceiverStats = await this.transceiverManager.getStats(selector);\n stats.push(...transceiverStats);\n\n // Get transport stats - always included regardless of selector\n const transportStats = await this.secureManager.getStats();\n stats.push(...transportStats);\n\n // Get data channel stats - always included regardless of selector\n if (this.sctpTransport) {\n const dataChannelStats = await this.sctpManager.getStats();\n if (dataChannelStats) {\n stats.push(...dataChannelStats);\n }\n }\n\n return new RTCStatsReport(stats);\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.setSignalingState(\"closed\");\n\n this.transceiverManager.close();\n\n await this.secureManager.close();\n await this.sctpManager.close();\n\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 log(\"peerConnection closed\");\n }\n}\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 forceTurnTCP: boolean;\n /** such as google cloud run */\n iceUseLinkLocalAddress: boolean | undefined;\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 icePasswordPrefix: string | undefined;\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\nfunction generateDefaultPeerConfig(): PeerConfig {\n return {\n codecs: {\n audio: [useOPUS(), usePCMU()],\n video: [useVP8()],\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 icePasswordPrefix: undefined,\n iceUseLinkLocalAddress: undefined,\n dtls: {},\n bundlePolicy: \"max-compat\",\n debug: {},\n midSuffix: false,\n forceTurnTCP: false,\n };\n}\nexport const defaultPeerConfig: PeerConfig = generateDefaultPeerConfig();\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"]}
|
|
1
|
+
{"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAGpC,qCAAkD;AAClD,6CAK0B;AAE1B,mCAciB;AACjB,yCAMuB;AACvB,+CAAqD;AACrD,+BAIe;AACf,6CAA0E;AAC1E,qEAAkE;AAWlE,mCAAkD;AAElD,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,8CAA8C,CAAC,CAAC;AAElE,MAAa,iBAAkB,SAAQ,oBAAW;IAoChD,YAAY,SAA8B,EAAE;QAC1C,KAAK,EAAE,CAAC;QApCD;;;;mBAAQ,IAAA,mBAAU,GAAE,CAAC,QAAQ,EAAE;WAAC;QAEzC;;;;mBAA+B,yBAAyB,EAAE;WAAC;QAC3D;;;;mBAAoC,QAAQ;WAAC;QAC7C;;;;mBAAoB,KAAK;WAAC;QAC1B;;;;mBAAc,KAAK;WAAC;QACH;;;;mBAAS,IAAI,iBAAS,EAAE;WAAC;QACzB;;;;;WAAuB;QACvB;;;;;WAAuC;QACvC;;;;;WAAkC;QAClC;;;;;WAAsC;QAC/C;;;;mBAAW,KAAK;WAAC;QACjB;;;;mBAA0B,KAAK;WAAC;QAE/B;;;;mBAA0B,IAAI,cAAK,EAAsB;WAAC;QAC1D;;;;mBAA2B,IAAI,cAAK,EAA2B;WAAC;QAChE;;;;mBAAuB,IAAI,cAAK,EAAuB;WAAC;QACxD;;;;mBAAwB,IAAI,cAAK,EAAqB;WAAC;QACvD;;;;mBAAgB,IAAI,cAAK,EAAoB;WAAC;QAC9C;;;;mBAA2B,IAAI,cAAK,EAAuB;WAAC;QAC5D;;;;mBAAqB,IAAI,cAAK,EAAuB;WAAC;QACtD;;;;mBAAiB,IAAI,cAAK,EAAiC;WAAC;QAC5D;;;;mBAAsB,IAAI,cAAK,EAAM;WAAC;QACtC;;;;mBAAU,IAAI,cAAK,EAAsB;WAAC;QAEnD;;;;;WAAuD;QACvD;;;;;WAA8D;QAC9D;;;;;WAA6C;QAC7C;;;;;WAAmD;QACnD;;;;;WAA6C;QAC7C;;;;;WAAgD;QAChD;;;;;WAA2C;QAC3C;;;;;WAAmC;QACnC;;;;;WAAsC;QAoP9B;;;;mBAAkB,KAAK,IAAI,EAAE;gBACnC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;gBACpC,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;oBAC/D,OAAO;gBACT,CAAC;gBACD,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;QA1PA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAE9B,IAAI,CAAC,UAAU,GAAG,IAAI,uBAAU,CAAC;YAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;SACvC,CAAC,CAAC;QACH,IAAI,CAAC,kBAAkB,GAAG,IAAI,0BAAkB,CAC9C,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,CACZ,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzE,IAAI,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,IAAI,CACnD,IAAI,CAAC,wBAAwB,CAC9B,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,SAAS,CACvC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;YACjC,MAAM,KAAK,GAAkB;gBAC3B,KAAK;gBACL,OAAO,EAAE,CAAC,MAAM,CAAC;gBACjB,WAAW;gBACX,QAAQ,EAAE,WAAW,CAAC,QAAQ;aAC/B,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CACF,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,EAAE,CACzD,IAAI,CAAC,eAAe,EAAE,CACvB,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,IAAI,kCAAoB,EAAE,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;YACnD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,KAAK,GAAwB,EAAE,OAAO,EAAE,CAAC;YAC/C,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,+CAAsB,CAAC;YAC9C,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC5C,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC,IAAI,CAC7C,IAAI,CAAC,uBAAuB,CAC7B,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9D,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;YACD,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3D,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YACxD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAChE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC1C,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC;IAC5C,CAAC;IACD,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC;IAC/C,CAAC;IACD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC;IAC9C,CAAC;IACD,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC;IAC9C,CAAC;IACD,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;IAC3C,CAAC;IACD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;IACxC,CAAC;IACD,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;IACzC,CAAC;IACD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;IAC1C,CAAC;IACD,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;IACjC,CAAC;IACD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACrD,CAAC;IACD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;IAC1C,CAAC;IACD,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;IAC3C,CAAC;IACD,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;IACzC,CAAC;IACD,cAAc;IACd,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;IAC3C,CAAC;IACD,cAAc;IACd,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC;IAC5C,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC;IACnD,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC;IAC9C,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,CAAC;IAChD,CAAC;IAED,gBAAgB,CAAC,MAA2B;QAC1C,IAAA,iBAAS,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;IACL,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAE,UAAU,KAA+B,EAAE;QAC7D,IAAI,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAClC,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAEvC,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EAAE,CAAC;YACpE,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;YAC/D,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;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAC/C,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EACzC,IAAI,CAAC,aAAa,CACnB,CAAC;QACF,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAEO,mBAAmB;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACnD,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iBAAiB,CACf,KAAa,EACb,UAOK,EAAE;QAEP,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,MAAoB;QAC9B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAeO,qBAAqB;QAC3B,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAEtC,wHAAwH;QACxH,wDAAwD;QACxD,IACE,IAAI,CAAC,UAAU,CAAC,YAAY,KAAK,YAAY;YAC7C,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC,EACpE,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;QAC3D,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;YACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;QAEhD,YAAY,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,EAAE;YAC9C,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YAClD,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,UAAU,CAAC,QAAQ,CACtB,IAAI,CAAC,iBAAkB,EACvB,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EACzC,IAAI,CAAC,aAAa,CACnB,CAAC;gBACF,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,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC5B,GAAG,CAAC,4DAA4D,CAAC,CAAC;gBAClE,OAAO;YACT,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC;gBACvC,SAAS;gBACT,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY;gBAC1C,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe;gBAClD,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtC,WAAW,EAAE,IAAI,CAAC,kBAAkB;qBACjC,eAAe,EAAE;qBACjB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrE,aAAa,EACX,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE;oBACnE,CAAC,CAAC,IAAI,CAAC,aAAa;oBACpB,CAAC,CAAC,SAAS;aAChB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,kBAGzB;QACC,8FAA8F;QAC9F,MAAM,kBAAkB,GAAwB;YAC9C,QAAQ;YACR,kBAAkB;YAClB,sBAAsB;SACvB,CAAC;QACF,kBAAkB;YAChB,kBAAkB;gBAClB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;oBAC/C,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE;oBAC1B,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAEjC,mCAAmC;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC3C,GAAG,EAAE,kBAAkB,CAAC,GAAG;YAC3B,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,IAAI,EAAE,kBAAkB,CAAC,IAAI;SAC9B,CAAC,CAAC;QAEH,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,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,IAAA,kBAAS,EAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAM,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,MAAM,WAAW,GACf,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;gBACxD,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;QAED,sBAAsB;QACtB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,UAAU;YAC1E,EAAE,IAAI,CAAC;QAET,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;YAC9B,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI;SACL,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EAAE,CAAC;gBAC1D,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;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC,UAAU,CAAC,QAAQ,CACtB,WAAW,EACX,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EACzC,IAAI,CAAC,aAAa,CACnB,CAAC;QAEF,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACxC,GAAG,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,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,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,QAAQ,CACtB,WAAW,EACX,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EACzC,IAAI,CAAC,aAAa,CACnB,CAAC;QAEF,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,MAAM,IAAI,CAAC,aAAa,CAAC,gBAAgB,CACvC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAClC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,gBAAuD;QAEvD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CACvC,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EACzC,IAAI,CAAC,aAAa,CACnB,CAAC;QACF,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAClE,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,GAAG,CAAC,eAAe,CAAC,CAAC;QAErB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;YAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC;YACvC,IAAI,YAAY,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YACD,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,KAAK,WAAW,CAAC;YAErE,IAAI,kBAAkB,EAAE,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;YAEpD,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;YAEH,IAAI,kBAAkB,EAAE,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,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;YAEH,IACE,IAAI,CAAC,aAAa;gBAClB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,EACxD,CAAC;gBACD,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,UAAU;QACR,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,kBAA6C;QACtE,IAAI,kBAAkB,YAAY,wBAAkB,EAAE,CAAC;YACrD,kBAAkB,GAAG,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAClD,CAAC;QAED,mCAAmC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,CACpD,kBAAkB,EAClB,IAAI,CAAC,cAAc,CACpB,CAAC;QAEF,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,kBAAkB;qBACtC,eAAe,EAAE;qBACjB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,4BAA4B;oBAC5B,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE;wBAClD,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,UAAU,CAAC,eAAe,EAAE,CAAC;oBACpC,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,kBAAkB,CAAC,YAAY,CAClC,WAAW,EACX,WAAW,EACX,SAAS,CAAC,IAAI,EACd,CAAC,CACF,CAAC;YACJ,CAAC;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC9C,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;gBACvC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC3C,aAAa,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC5C,CAAC;gBAED,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;oBACpC,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC;oBAChD,CAAC;yBAAM,CAAC;wBACN,aAAa,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;oBAClD,CAAC;gBACH,CAAC;gBAED,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC;gBAE5C,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACjD,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,EAAE,CAAC;gBAC1B,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;gBAC3D,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;gBAElE,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;YACD,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;gBAC3B,aAAa,CAAC,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YACxD,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,kBAAkB;aAChD,eAAe,EAAE;aACjB,MAAM,CACL,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;QAEJ,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,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAClD,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;IAED,cAAc,CACZ,WAAoC,EACpC,UAAuC,EAAE;QAEzC,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,CACxD,WAAW,EACX,aAAa,EACb,OAAO,CACR,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,wBAAwB,EAAE,CAAC;QAC9C,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,WAAW;IACX,QAAQ,CACN,KAAuB;IACvB,eAAe;IACf,EAAgB;QAEhB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACnD,WAAW,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,WAAW,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAEvC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;YACjD,YAAY,EAAE,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE;YACvD,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;IACH,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,EAAE,CAAC;YAChC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,yBAAyB;QAC/B,MAAM,SAAS,GAAG,IAAA,yBAAiB,GAAE,CAAC;QACtC,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,EAAE,EAAE,IAAA,uBAAe,EAAC,iBAAiB,CAAC;YACtC,SAAS;YACT,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,kBAAkB;YACvD,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,kBAAkB;SACxD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAkC;QAC/C,MAAM,KAAK,GAAe,EAAE,CAAC;QAE7B,iEAAiE;QACjE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAE7C,8BAA8B;QAC9B,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAEhC,+DAA+D;QAC/D,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;QAE9B,kEAAkE;QAClE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC3D,IAAI,gBAAgB,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,sBAAc,CAAC,KAAK,CAAC,CAAC;IACnC,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;QAEjC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAEhC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAE/B,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;QAErC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC/B,CAAC;CACF;AAhyBD,8CAgyBC;AAqDM,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;AAQhB,SAAS,yBAAyB;IAChC,OAAO;QACL,MAAM,EAAE;YACN,KAAK,EAAE,CAAC,IAAA,eAAO,GAAE,EAAE,IAAA,eAAO,GAAE,CAAC;YAC7B,KAAK,EAAE,CAAC,IAAA,cAAM,GAAE,CAAC;SAClB;QACD,gBAAgB,EAAE;YAChB,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;SACV;QACD,kBAAkB,EAAE,KAAK;QACzB,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC;QACtD,YAAY,EAAE,SAAS;QACvB,qBAAqB,EAAE,SAAS;QAChC,0BAA0B,EAAE,SAAS;QACrC,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;QAChB,qBAAqB,EAAE,SAAS;QAChC,sBAAsB,EAAE,SAAS;QACjC,iBAAiB,EAAE,SAAS;QAC5B,sBAAsB,EAAE,SAAS;QACjC,IAAI,EAAE,EAAE;QACR,YAAY,EAAE,YAAY;QAC1B,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,KAAK;KACpB,CAAC;AACJ,CAAC;AACY,QAAA,iBAAiB,GAAe,yBAAyB,EAAE,CAAC","sourcesContent":["import { randomUUID } from \"crypto\";\n\nimport type { RTCDataChannel } from \"./dataChannel\";\nimport { EventTarget, enumerate } from \"./helper\";\nimport {\n type Address,\n Event,\n type InterfaceAddresses,\n debug,\n} from \"./imports/common\";\nimport type { CandidatePair, Message, Protocol } from \"./imports/ice\";\nimport {\n type MediaStream,\n type MediaStreamTrack,\n type RTCRtpCodecParameters,\n type RTCRtpHeaderExtensionParameters,\n type RTCRtpReceiver,\n type RTCRtpSender,\n type RTCRtpTransceiver,\n RtpRouter,\n TransceiverManager,\n type TransceiverOptions,\n useOPUS,\n usePCMU,\n useVP8,\n} from \"./media\";\nimport {\n type RTCPeerConnectionStats,\n type RTCStats,\n RTCStatsReport,\n generateStatsId,\n getStatsTimestamp,\n} from \"./media/stats\";\nimport { SctpTransportManager } from \"./sctpManager\";\nimport {\n type BundlePolicy,\n type MediaDescription,\n SessionDescription,\n} from \"./sdp\";\nimport { type RTCSessionDescriptionInit, SDPManager } from \"./sdpManager\";\nimport { SecureTransportManager } from \"./secureTransportManager\";\nimport type { DtlsKeys, RTCDtlsTransport } from \"./transport/dtls\";\nimport type {\n IceGathererState,\n RTCIceCandidate,\n RTCIceCandidateInit,\n RTCIceConnectionState,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport type { ConnectionState, Kind, RTCSignalingState } from \"./types/domain\";\nimport type { Callback, CallbackWithValue } from \"./types/util\";\nimport { andDirection, deepMerge } from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/peerConnection.ts\");\n\nexport class RTCPeerConnection extends EventTarget {\n readonly cname = randomUUID().toString();\n\n config: Required<PeerConfig> = generateDefaultPeerConfig();\n signalingState: RTCSignalingState = \"stable\";\n negotiationneeded = false;\n needRestart = false;\n private readonly router = new RtpRouter();\n private readonly sdpManager: SDPManager;\n private readonly transceiverManager: TransceiverManager;\n private readonly sctpManager: SctpTransportManager;\n private readonly secureManager: SecureTransportManager;\n private isClosed = false;\n private shouldNegotiationneeded = false;\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 onicecandidateerror?: CallbackWithValue<any>;\n onicegatheringstatechange?: CallbackWithValue<any>;\n onnegotiationneeded?: CallbackWithValue<any>;\n onsignalingstatechange?: CallbackWithValue<any>;\n ontrack?: CallbackWithValue<RTCTrackEvent>;\n onconnectionstatechange?: Callback;\n oniceconnectionstatechange?: Callback;\n\n constructor(config: Partial<PeerConfig> = {}) {\n super();\n\n this.setConfiguration(config);\n\n this.sdpManager = new SDPManager({\n cname: this.cname,\n bundlePolicy: this.config.bundlePolicy,\n });\n this.transceiverManager = new TransceiverManager(\n this.cname,\n this.config,\n this.router,\n );\n this.transceiverManager.onTransceiverAdded.pipe(this.onTransceiverAdded);\n this.transceiverManager.onRemoteTransceiverAdded.pipe(\n this.onRemoteTransceiverAdded,\n );\n this.transceiverManager.onTrack.subscribe(\n ({ track, stream, transceiver }) => {\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) {\n this.ontrack(event);\n }\n },\n );\n this.transceiverManager.onNegotiationNeeded.subscribe(() =>\n this.needNegotiation(),\n );\n this.sctpManager = new SctpTransportManager();\n this.sctpManager.onDataChannel.subscribe((channel) => {\n this.onDataChannel.execute(channel);\n const event: RTCDataChannelEvent = { channel };\n this.ondatachannel?.(event);\n this.emit(\"datachannel\", event);\n });\n this.secureManager = new SecureTransportManager({\n config: this.config,\n sctpManager: this.sctpManager,\n transceiverManager: this.transceiverManager,\n });\n this.secureManager.iceGatheringStateChange.pipe(\n this.iceGatheringStateChange,\n );\n this.secureManager.iceConnectionStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.close();\n }\n this.iceConnectionStateChange.execute(state);\n });\n this.secureManager.connectionStateChange.subscribe((state) => {\n this.connectionStateChange.execute(state);\n this.onconnectionstatechange?.();\n this.emit(\"connectionstatechange\");\n });\n this.secureManager.onIceCandidate.subscribe((candidate) => {\n const iceCandidate = candidate ? candidate.toJSON() : undefined;\n this.onIceCandidate.execute(iceCandidate);\n this.onicecandidate?.({ candidate: iceCandidate });\n this.emit(\"icecandidate\", { candidate: iceCandidate });\n });\n }\n\n get connectionState() {\n return this.secureManager.connectionState;\n }\n get iceConnectionState() {\n return this.secureManager.iceConnectionState;\n }\n get iceGathererState() {\n return this.secureManager.iceGatheringState;\n }\n get iceGatheringState() {\n return this.secureManager.iceGatheringState;\n }\n get dtlsTransports() {\n return this.secureManager.dtlsTransports;\n }\n get sctpTransport() {\n return this.sctpManager.sctpTransport;\n }\n get sctpRemotePort() {\n return this.sctpManager.sctpRemotePort;\n }\n get iceTransports() {\n return this.secureManager.iceTransports;\n }\n get extIdUriMap() {\n return this.router.extIdUriMap;\n }\n get iceGeneration() {\n return this.iceTransports[0].connection.generation;\n }\n get localDescription() {\n return this.sdpManager.localDescription;\n }\n get remoteDescription() {\n return this.sdpManager.remoteDescription;\n }\n get remoteIsBundled() {\n return this.sdpManager.remoteIsBundled;\n }\n /**@private */\n get _localDescription() {\n return this.sdpManager._localDescription;\n }\n /**@private */\n get _remoteDescription() {\n return this.sdpManager._remoteDescription;\n }\n\n getTransceivers() {\n return this.transceiverManager.getTransceivers();\n }\n\n getSenders(): RTCRtpSender[] {\n return this.transceiverManager.getSenders();\n }\n\n getReceivers() {\n return this.transceiverManager.getReceivers();\n }\n\n setConfiguration(config: Partial<PeerConfig>) {\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\n getConfiguration() {\n return this.config;\n }\n\n async createOffer({ iceRestart }: { iceRestart?: boolean } = {}) {\n if (iceRestart || this.needRestart) {\n this.needRestart = false;\n this.secureManager.restartIce();\n }\n\n await this.secureManager.ensureCerts();\n\n for (const transceiver of this.transceiverManager.getTransceivers()) {\n if (transceiver.codecs.length === 0) {\n this.transceiverManager.assignTransceiverCodecs(transceiver);\n }\n if (transceiver.headerExtensions.length === 0) {\n transceiver.headerExtensions =\n this.config.headerExtensions[transceiver.kind] ?? [];\n }\n }\n\n const description = this.sdpManager.buildOfferSdp(\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n return description.toJSON();\n }\n\n private createSctpTransport() {\n const sctp = this.sctpManager.createSctpTransport();\n const dtlsTransport = this.findOrCreateTransport();\n sctp.setDtlsTransport(dtlsTransport);\n return sctp;\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 if (!this.sctpTransport) {\n this.createSctpTransport();\n this.needNegotiation();\n }\n\n const channel = this.sctpManager.createDataChannel(label, options);\n if (!channel.sctp.dtlsTransport) {\n const dtlsTransport = this.findOrCreateTransport();\n channel.sctp.setDtlsTransport(dtlsTransport);\n }\n return channel;\n }\n\n removeTrack(sender: RTCRtpSender) {\n if (this.isClosed) {\n throw new Error(\"peer closed\");\n }\n this.transceiverManager.removeTrack(sender);\n this.needNegotiation();\n }\n\n private needNegotiation = async () => {\n this.shouldNegotiationneeded = true;\n if (this.negotiationneeded || this.signalingState !== \"stable\") {\n return;\n }\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 findOrCreateTransport() {\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 (\n this.sdpManager.bundlePolicy === \"max-bundle\" ||\n (this.sdpManager.bundlePolicy !== \"disable\" && this.remoteIsBundled)\n ) {\n if (existing) {\n return this.dtlsTransports[0];\n }\n }\n\n const dtlsTransport = this.secureManager.createTransport();\n dtlsTransport.onRtp.subscribe((rtp) => {\n this.router.routeRtp(rtp);\n });\n dtlsTransport.onRtcp.subscribe((rtcp) => {\n this.router.routeRtcp(rtcp);\n });\n const iceTransport = dtlsTransport.iceTransport;\n\n iceTransport.onNegotiationNeeded.subscribe(() => {\n this.needNegotiation();\n });\n iceTransport.onIceCandidate.subscribe((candidate) => {\n if (!this.localDescription) {\n log(\"localDescription not found when ice candidate was gathered\");\n return;\n }\n if (!candidate) {\n this.sdpManager.setLocal(\n this._localDescription!,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\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._localDescription) {\n log(\"localDescription not found when ice candidate was gathered\");\n return;\n }\n\n this.secureManager.handleNewIceCandidate({\n candidate,\n bundlePolicy: this.sdpManager.bundlePolicy,\n remoteIsBundled: !!this.sdpManager.remoteIsBundled,\n media: this._localDescription.media[0],\n transceiver: this.transceiverManager\n .getTransceivers()\n .find((t) => t?.dtlsTransport?.iceTransport.id === iceTransport.id),\n sctpTransport:\n this.sctpTransport?.dtlsTransport.iceTransport.id === iceTransport.id\n ? this.sctpTransport\n : undefined,\n });\n });\n\n return dtlsTransport;\n }\n\n async setLocalDescription(sessionDescription?: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }): Promise<SessionDescription> {\n // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setLocalDescription#type\n const implicitOfferState: RTCSignalingState[] = [\n \"stable\",\n \"have-local-offer\",\n \"have-remote-pranswer\",\n ];\n sessionDescription =\n sessionDescription ??\n (implicitOfferState.includes(this.signalingState)\n ? await this.createOffer()\n : await this.createAnswer());\n\n // # parse and validate description\n const description = this.sdpManager.parseSdp({\n sdp: sessionDescription.sdp,\n isLocal: true,\n signalingState: this.signalingState,\n type: sessionDescription.type,\n });\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 for (const [i, media] of enumerate(description.media)) {\n const mid = media.rtp.muxId!;\n this.sdpManager.registerMid(mid);\n if ([\"audio\", \"video\"].includes(media.kind)) {\n const transceiver =\n this.transceiverManager.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 // setup ice,dtls role\n const role = description.media.find((media) => media.dtlsParams)?.dtlsParams\n ?.role;\n\n this.secureManager.setLocalRole({\n type: description.type,\n role,\n });\n\n // # configure direction\n if ([\"answer\", \"pranswer\"].includes(description.type)) {\n for (const t of this.transceiverManager.getTransceivers()) {\n const direction = andDirection(t.direction, t.offerDirection);\n t.setCurrentDirection(direction);\n }\n }\n\n // for trickle ice\n this.sdpManager.setLocal(\n description,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n\n await this.gatherCandidates().catch((e) => {\n log(\"gatherCandidates failed\", e);\n });\n\n // connect transports\n if (description.type === \"answer\") {\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.secureManager.setConnectionState(\"failed\");\n });\n }\n\n this.sdpManager.setLocal(\n description,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n\n return description;\n }\n\n private async gatherCandidates() {\n await this.secureManager.gatherCandidates(\n !!this.sdpManager.remoteIsBundled,\n );\n }\n\n async addIceCandidate(\n candidateMessage: RTCIceCandidate | RTCIceCandidateInit,\n ) {\n const sdp = this.sdpManager.buildOfferSdp(\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n await this.secureManager.addIceCandidate(sdp, candidateMessage);\n }\n\n private async connect() {\n log(\"start connect\");\n\n const res = await Promise.allSettled(\n this.dtlsTransports.map(async (dtlsTransport) => {\n const { iceTransport } = dtlsTransport;\n if (iceTransport.state === \"connected\") {\n return;\n }\n const checkDtlsConnected = () => dtlsTransport.state === \"connected\";\n\n if (checkDtlsConnected()) {\n return;\n }\n\n this.secureManager.setConnectionState(\"connecting\");\n\n await iceTransport.start().catch((err) => {\n log(\"iceTransport.start failed\", err);\n throw err;\n });\n\n if (checkDtlsConnected()) {\n return;\n }\n\n await dtlsTransport.start().catch((err) => {\n log(\"dtlsTransport.start failed\", err);\n throw err;\n });\n\n if (\n this.sctpTransport &&\n this.sctpTransport.dtlsTransport.id === dtlsTransport.id\n ) {\n await this.sctpManager.connectSctp();\n }\n }),\n );\n\n if (res.find((r) => r.status === \"rejected\")) {\n this.secureManager.setConnectionState(\"failed\");\n } else {\n this.secureManager.setConnectionState(\"connected\");\n }\n }\n\n restartIce() {\n this.needRestart = true;\n this.needNegotiation();\n }\n\n async setRemoteDescription(sessionDescription: RTCSessionDescriptionInit) {\n if (sessionDescription instanceof SessionDescription) {\n sessionDescription = sessionDescription.toSdp();\n }\n\n // # parse and validate description\n const remoteSdp = this.sdpManager.setRemoteDescription(\n sessionDescription,\n this.signalingState,\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.transceiverManager\n .getTransceivers()\n .find((t) => matchTransceiverWithMedia(t, remoteMedia));\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.sdpManager.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = transceiver.dtlsTransport;\n } else {\n transceiver.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = transceiver.dtlsTransport;\n\n this.transceiverManager.setRemoteRTP(\n transceiver,\n remoteMedia,\n remoteSdp.type,\n i,\n );\n } else if (remoteMedia.kind === \"application\") {\n let sctpTransport = this.sctpTransport;\n if (!sctpTransport) {\n sctpTransport = this.createSctpTransport();\n sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n\n if (this.sdpManager.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = sctpTransport.dtlsTransport;\n } else {\n sctpTransport.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = sctpTransport.dtlsTransport;\n\n this.sctpManager.setRemoteSCTP(remoteMedia, i);\n } else {\n throw new Error(\"invalid media kind\");\n }\n\n const iceTransport = dtlsTransport.iceTransport;\n\n if (remoteMedia.iceParams) {\n const renomination = !!this.sdpManager.inactiveRemoteMedia;\n iceTransport.setRemoteParams(remoteMedia.iceParams, renomination);\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 if (remoteMedia.dtlsParams) {\n dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);\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.transceiverManager\n .getTransceivers()\n .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.secureManager.setConnectionState(\"failed\");\n });\n }\n\n this.negotiationneeded = false;\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {},\n ) {\n const dtlsTransport = this.findOrCreateTransport();\n const transceiver = this.transceiverManager.addTransceiver(\n trackOrKind,\n dtlsTransport,\n options,\n );\n\n this.secureManager.updateIceConnectionState();\n this.needNegotiation();\n\n return transceiver;\n }\n\n // todo fix\n addTrack(\n track: MediaStreamTrack,\n /**todo impl */\n ms?: MediaStream,\n ): RTCRtpSender {\n if (this.isClosed) {\n throw new Error(\"is closed\");\n }\n const transceiver = this.transceiverManager.addTrack(track, ms);\n if (!transceiver.dtlsTransport) {\n const dtlsTransport = this.findOrCreateTransport();\n transceiver.setDtlsTransport(dtlsTransport);\n }\n this.needNegotiation();\n return transceiver.sender;\n }\n\n async createAnswer() {\n this.assertNotClosed();\n\n await this.secureManager.ensureCerts();\n\n const description = this.sdpManager.buildAnswerSdp({\n transceivers: this.transceiverManager.getTransceivers(),\n sctpTransport: this.sctpTransport,\n signalingState: this.signalingState,\n });\n return description.toJSON();\n }\n\n private assertNotClosed() {\n if (this.isClosed) {\n throw new Error(\"RTCPeerConnection is closed\");\n }\n }\n\n private setSignalingState(state: RTCSignalingState) {\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) {\n this.onsignalingstatechange({});\n }\n }\n\n private createPeerConnectionStats(): RTCPeerConnectionStats {\n const timestamp = getStatsTimestamp();\n return {\n type: \"peer-connection\",\n id: generateStatsId(\"peer-connection\"),\n timestamp,\n dataChannelsOpened: this.sctpManager.dataChannelsOpened,\n dataChannelsClosed: this.sctpManager.dataChannelsClosed,\n };\n }\n\n async getStats(selector?: MediaStreamTrack | null): Promise<RTCStatsReport> {\n const stats: RTCStats[] = [];\n\n // Peer connection stats - always included regardless of selector\n stats.push(this.createPeerConnectionStats());\n\n // Get stats from transceivers\n const transceiverStats = await this.transceiverManager.getStats(selector);\n stats.push(...transceiverStats);\n\n // Get transport stats - always included regardless of selector\n const transportStats = await this.secureManager.getStats();\n stats.push(...transportStats);\n\n // Get data channel stats - always included regardless of selector\n if (this.sctpTransport) {\n const dataChannelStats = await this.sctpManager.getStats();\n if (dataChannelStats) {\n stats.push(...dataChannelStats);\n }\n }\n\n return new RTCStatsReport(stats);\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.setSignalingState(\"closed\");\n\n this.transceiverManager.close();\n\n await this.secureManager.close();\n await this.sctpManager.close();\n\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 log(\"peerConnection closed\");\n }\n}\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 forceTurnTCP: boolean;\n /** such as google cloud run */\n iceUseLinkLocalAddress: boolean | undefined;\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 icePasswordPrefix: string | undefined;\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\nfunction generateDefaultPeerConfig(): PeerConfig {\n return {\n codecs: {\n audio: [useOPUS(), usePCMU()],\n video: [useVP8()],\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 icePasswordPrefix: undefined,\n iceUseLinkLocalAddress: undefined,\n dtls: {},\n bundlePolicy: \"max-compat\",\n debug: {},\n midSuffix: false,\n forceTurnTCP: false,\n };\n}\nexport const defaultPeerConfig: PeerConfig = generateDefaultPeerConfig();\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"]}
|
|
@@ -375,10 +375,18 @@ class SDPManager {
|
|
|
375
375
|
* ローカルセッション記述を設定し、トランスポート情報を追加する
|
|
376
376
|
*/
|
|
377
377
|
setLocal(description, transceivers, sctpTransport) {
|
|
378
|
+
const transceiverByMLineIndex = new Map(transceivers.map((transceiver) => [transceiver?.mLineIndex, transceiver]));
|
|
379
|
+
const fallbackDtlsTransport = transceivers.find((transceiver) => transceiver?.dtlsTransport)
|
|
380
|
+
?.dtlsTransport ?? sctpTransport?.dtlsTransport;
|
|
378
381
|
description.media
|
|
379
382
|
.filter((m) => ["audio", "video"].includes(m.kind))
|
|
380
383
|
.forEach((m, i) => {
|
|
381
|
-
|
|
384
|
+
const transceiver = transceiverByMLineIndex.get(i) ?? transceivers[i];
|
|
385
|
+
const dtlsTransport = transceiver?.dtlsTransport ?? fallbackDtlsTransport;
|
|
386
|
+
if (!dtlsTransport) {
|
|
387
|
+
throw new Error(`dtls transport not found for media index ${i}`);
|
|
388
|
+
}
|
|
389
|
+
this.addTransportDescription(m, dtlsTransport);
|
|
382
390
|
});
|
|
383
391
|
const sctpMedia = description.media.find((m) => m.kind === "application");
|
|
384
392
|
if (sctpTransport && sctpMedia) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdpManager.js","sourceRoot":"","sources":["../../../src/sdpManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { DISCARD_HOST, DISCARD_PORT } from \"./const\";\nimport type { RTCRtpTransceiver } from \"./media\";\nimport { RTCRtpSimulcastParameters } from \"./media/parameters\";\nimport type { MediaDirection } from \"./media/rtpTransceiver\";\nimport {\n type BundlePolicy,\n GroupDescription,\n MediaDescription,\n SessionDescription,\n SsrcDescription,\n addSDPHeader,\n} from \"./sdp\";\nimport type { RTCDtlsTransport } from \"./transport/dtls\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport { andDirection } from \"./utils\";\n\nexport class SDPManager {\n currentLocalDescription?: SessionDescription;\n currentRemoteDescription?: SessionDescription;\n pendingLocalDescription?: SessionDescription;\n pendingRemoteDescription?: SessionDescription;\n readonly cname: string;\n readonly midSuffix: boolean;\n readonly bundlePolicy?: BundlePolicy;\n\n private seenMid = new Set<string>();\n\n constructor({\n cname,\n midSuffix,\n bundlePolicy,\n }: { cname: string; midSuffix?: boolean; bundlePolicy?: BundlePolicy }) {\n this.cname = cname;\n this.midSuffix = midSuffix ?? false;\n this.bundlePolicy = bundlePolicy;\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 get inactiveRemoteMedia() {\n return this._remoteDescription?.media?.find?.(\n (m) => m.direction === \"inactive\",\n );\n }\n\n /**\n * MediaDescriptionをトランシーバー用に作成\n */\n createMediaDescriptionForTransceiver(\n transceiver: RTCRtpTransceiver,\n direction: MediaDirection,\n ): MediaDescription {\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 = [\n new SsrcDescription({ ssrc: transceiver.sender.ssrc, cname: this.cname }),\n ];\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({\n ssrc: transceiver.sender.rtxSsrc,\n cname: this.cname,\n }),\n );\n media.ssrcGroup = [\n new GroupDescription(\"FID\", [\n transceiver.sender.ssrc.toString(),\n transceiver.sender.rtxSsrc.toString(),\n ]),\n ];\n }\n\n this.addTransportDescription(media, transceiver.dtlsTransport);\n return media;\n }\n\n /**\n * MediaDescriptionをSCTP用に作成\n */\n createMediaDescriptionForSctp(sctp: RTCSctpTransport): MediaDescription {\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 this.addTransportDescription(media, sctp.dtlsTransport);\n return media;\n }\n\n /**\n * トランスポートの情報をMediaDescriptionに追加\n */\n addTransportDescription(\n media: MediaDescription,\n dtlsTransport: RTCDtlsTransport,\n ): void {\n const iceTransport = dtlsTransport.iceTransport;\n\n media.iceCandidates = iceTransport.localCandidates;\n media.iceCandidatesComplete = iceTransport.gatheringState === \"complete\";\n media.iceParams = iceTransport.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\n /**\n * 一意のMIDを割り当て\n */\n allocateMid(type: \"dc\" | \"av\" | \"\" = \"\"): string {\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 (!this.seenMid.has(mid)) break;\n }\n this.seenMid.add(mid);\n return mid;\n }\n\n parseSdp({\n sdp,\n isLocal,\n signalingState,\n type,\n }: {\n sdp: string;\n isLocal: boolean;\n signalingState: string;\n type: \"offer\" | \"answer\";\n }): SessionDescription {\n const description = SessionDescription.parse(sdp);\n this.validateDescription({ description, isLocal, signalingState });\n description.type = type;\n return description;\n }\n\n private validateDescription({\n description,\n isLocal,\n signalingState,\n }: {\n description: SessionDescription;\n isLocal: boolean;\n signalingState: string;\n }) {\n if (isLocal) {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-local-offer\"].includes(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(signalingState)\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(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(signalingState)\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n }\n }\n\n /**\n * オファーSDPを構築\n */\n buildOfferSdp(\n transceivers: RTCRtpTransceiver[],\n sctpTransport: RTCSctpTransport | undefined,\n ): SessionDescription {\n const description = new SessionDescription();\n addSDPHeader(\"offer\", description);\n\n // # handle existing transceivers / sctp\n const currentMedia = this.currentLocalDescription?.media ?? [];\n\n currentMedia.forEach((m, i) => {\n const mid = m.rtp.muxId;\n if (!mid) {\n return;\n }\n if (m.kind === \"application\") {\n if (!sctpTransport) {\n throw new Error(\"sctpTransport not found\");\n }\n sctpTransport.mLineIndex = i;\n description.media.push(\n this.createMediaDescriptionForSctp(sctpTransport),\n );\n } else {\n const transceiver = transceivers.find((t) => t.mid === 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 this.createMediaDescriptionForTransceiver(\n transceiver,\n transceiver.direction,\n ),\n );\n }\n });\n\n // # handle new transceivers / sctp\n for (const transceiver of transceivers.filter(\n (t) => !description.media.find((m) => m.rtp.muxId === t.mid),\n )) {\n if (transceiver.mid == undefined) {\n transceiver.mid = this.allocateMid(this.midSuffix ? \"av\" : \"\");\n }\n const mediaDescription = this.createMediaDescriptionForTransceiver(\n transceiver,\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 sctpTransport &&\n !description.media.find((m) => m.kind === \"application\")\n ) {\n sctpTransport.mLineIndex = description.media.length;\n if (sctpTransport.mid == undefined) {\n sctpTransport.mid = this.allocateMid(this.midSuffix ? \"dc\" : \"\");\n }\n description.media.push(this.createMediaDescriptionForSctp(sctpTransport));\n }\n\n if (this.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 /**\n * アンサーSDPを構築\n */\n buildAnswerSdp({\n transceivers,\n sctpTransport,\n signalingState,\n }: {\n transceivers: RTCRtpTransceiver[];\n sctpTransport: RTCSctpTransport | undefined;\n\n signalingState: string;\n }): SessionDescription {\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(signalingState)\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 for (const remoteMedia of this._remoteDescription.media) {\n let dtlsTransport!: RTCDtlsTransport;\n let media: MediaDescription;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n const transceiver = transceivers.find(\n (t) => t.mid === remoteMedia.rtp.muxId,\n );\n if (!transceiver) {\n throw new Error(\n `Transceiver with mid=${remoteMedia.rtp.muxId} not found`,\n );\n }\n media = this.createMediaDescriptionForTransceiver(\n transceiver,\n andDirection(transceiver.direction, transceiver.offerDirection),\n );\n dtlsTransport = transceiver.dtlsTransport;\n } else if (remoteMedia.kind === \"application\") {\n if (!sctpTransport || !sctpTransport.mid) {\n throw new Error(\"sctpTransport not found\");\n }\n media = this.createMediaDescriptionForSctp(sctpTransport);\n\n dtlsTransport = 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 // Simulcastに関する処理\n if (\n remoteMedia.simulcastParameters &&\n remoteMedia.simulcastParameters.length > 0\n ) {\n media.simulcastParameters = remoteMedia.simulcastParameters.map(\n (v) => ({\n ...v,\n direction: v.direction === \"send\" ? \"recv\" : \"send\",\n }),\n );\n }\n\n description.media.push(media);\n }\n\n if (this.bundlePolicy !== \"disable\") {\n const bundle = new GroupDescription(\"BUNDLE\", []);\n for (const media of description.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 setLocalDescription(description: SessionDescription) {\n this.currentLocalDescription = description;\n if (description.type === \"answer\") {\n this.pendingLocalDescription = undefined;\n } else {\n this.pendingLocalDescription = description;\n }\n }\n\n setRemoteDescription(\n sessionDescription: RTCSessionDescriptionInit,\n signalingState: string,\n ) {\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 = this.parseSdp({\n sdp: sessionDescription.sdp,\n isLocal: false,\n signalingState,\n type: sessionDescription.type,\n });\n\n if (remoteSdp.type === \"answer\") {\n this.currentRemoteDescription = remoteSdp;\n this.pendingRemoteDescription = undefined;\n } else {\n this.pendingRemoteDescription = remoteSdp;\n }\n\n return remoteSdp;\n }\n\n registerMid(mid: string): void {\n this.seenMid.add(mid);\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.bundlePolicy !== \"disable\",\n );\n return bundle;\n }\n\n /**\n * ローカルセッション記述を設定し、トランスポート情報を追加する\n */\n setLocal(\n description: SessionDescription,\n transceivers: RTCRtpTransceiver[],\n sctpTransport?: { dtlsTransport: RTCDtlsTransport; mid?: string },\n ) {\n description.media\n .filter((m) => [\"audio\", \"video\"].includes(m.kind))\n .forEach((m, i) => {\n this.addTransportDescription(m, transceivers[i].dtlsTransport);\n });\n const sctpMedia = description.media.find((m) => m.kind === \"application\");\n if (sctpTransport && sctpMedia) {\n this.addTransportDescription(sctpMedia, sctpTransport.dtlsTransport);\n }\n\n this.setLocalDescription(description);\n }\n}\n\nexport interface RTCSessionDescriptionInit {\n sdp?: string;\n type: RTCSdpType;\n}\nexport type RTCSdpType = \"answer\" | \"offer\" | \"pranswer\" | \"rollback\";\n"]}
|
|
1
|
+
{"version":3,"file":"sdpManager.js","sourceRoot":"","sources":["../../../src/sdpManager.ts"],"names":[],"mappings":";;;AAAA,mCAAqD;AAErD,mDAA+D;AAE/D,+BAOe;AAEf,2CAAoD;AACpD,mCAAuC;AAEvC,MAAa,UAAU;IAWrB,YAAY,EACV,KAAK,EACL,SAAS,EACT,YAAY,GACwD;QAdtE;;;;;WAA6C;QAC7C;;;;;WAA8C;QAC9C;;;;;WAA6C;QAC7C;;;;;WAA8C;QACrC;;;;;WAAc;QACd;;;;;WAAmB;QACnB;;;;;WAA4B;QAE7B;;;;mBAAU,IAAI,GAAG,EAAU;WAAC;QAOlC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,KAAK,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,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;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAClC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,oCAAoC,CAClC,WAA8B,EAC9B,SAAyB;QAEzB,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;QACF,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;QAC5B,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;QAC9B,KAAK,CAAC,GAAG,GAAG;YACV,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;YAC9C,KAAK,EAAE,WAAW,CAAC,GAAG;SACvB,CAAC;QACF,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC3B,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;QACnB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,IAAI,GAAG;YACX,IAAI,qBAAe,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;SAC1E,CAAC;QAEF,IAAI,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAClC,KAAK,CAAC,mBAAmB,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,sCAAyB,CAAC,CAAC,CAAC,CACxC,CAAC;QACJ,CAAC;QAED,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;YACjE,KAAK,CAAC,IAAI,CAAC,IAAI,CACb,IAAI,qBAAe,CAAC;gBAClB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO;gBAChC,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CACH,CAAC;YACF,KAAK,CAAC,SAAS,GAAG;gBAChB,IAAI,sBAAgB,CAAC,KAAK,EAAE;oBAC1B,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;oBAClC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;iBACtC,CAAC;aACH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,6BAA6B,CAAC,IAAsB;QAClD,MAAM,KAAK,GAAG,IAAI,sBAAgB,CAChC,aAAa,EACb,oBAAY,EACZ,eAAe,EACf,CAAC,oBAAoB,CAAC,CACvB,CAAC;QACF,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;QAC3B,KAAK,CAAC,gBAAgB,GAAG,uBAAgB,CAAC,eAAe,EAAE,CAAC;QAE5D,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,uBAAuB,CACrB,KAAuB,EACvB,aAA+B;QAE/B,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;QAEhD,KAAK,CAAC,aAAa,GAAG,YAAY,CAAC,eAAe,CAAC;QACnD,KAAK,CAAC,qBAAqB,GAAG,YAAY,CAAC,cAAc,KAAK,UAAU,CAAC;QACzE,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC,eAAe,CAAC;QAC/C,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;QAE7B,KAAK,CAAC,IAAI,GAAG,oBAAY,CAAC;QAC1B,KAAK,CAAC,IAAI,GAAG,oBAAY,CAAC;QAE1B,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACtB,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC,eAAe,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;gBACnC,KAAK,CAAC,UAAU,CAAC,YAAY;oBAC3B,aAAa,CAAC,eAAe,CAAC,YAAY,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAAyB,EAAE;QACrC,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,IAAM,CAAC;YACnB,4CAA4C;YAC5C,gGAAgG;YAChG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,MAAM;QACpC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,QAAQ,CAAC,EACP,GAAG,EACH,OAAO,EACP,cAAc,EACd,IAAI,GAML;QACC,MAAM,WAAW,GAAG,wBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,mBAAmB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QACnE,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;QACxB,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,mBAAmB,CAAC,EAC1B,WAAW,EACX,OAAO,EACP,cAAc,GAKf;QACC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACjC,IAAI,CAAC,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;oBAC1D,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,CAAC,cAAc,CAAC,EACtE,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,cAAc,CAAC,EAAE,CAAC;oBAC9D,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,CAAC,cAAc,CAAC,EACtE,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CACX,YAAiC,EACjC,aAA2C;QAE3C,MAAM,WAAW,GAAG,IAAI,wBAAkB,EAAE,CAAC;QAC7C,IAAA,kBAAY,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEnC,wCAAwC;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE,CAAC;QAE/D,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,OAAO;YACT,CAAC;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAC7C,CAAC;gBACD,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC;gBAC7B,WAAW,CAAC,KAAK,CAAC,IAAI,CACpB,IAAI,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAClD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;gBAC5D,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,IAAI,CAAC,oCAAoC,CACvC,WAAW,EACX,WAAW,CAAC,SAAS,CACtB,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,KAAK,MAAM,WAAW,IAAI,YAAY,CAAC,MAAM,CAC3C,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,CAC7D,EAAE,CAAC;YACF,IAAI,WAAW,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;gBACjC,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,oCAAoC,CAChE,WAAW,EACX,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;QAED,IACE,aAAa;YACb,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,EACxD,CAAC;YACD,aAAa,CAAC,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;YACpD,IAAI,aAAa,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;gBACnC,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnE,CAAC;YACD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,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;;OAEG;IACH,cAAc,CAAC,EACb,YAAY,EACZ,aAAa,EACb,cAAc,GAMf;QACC,IACE,CAAC,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EACtE,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,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;YACxD,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,YAAY,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,WAAW,CAAC,GAAG,CAAC,KAAK,CACvC,CAAC;gBACF,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CACb,wBAAwB,WAAW,CAAC,GAAG,CAAC,KAAK,YAAY,CAC1D,CAAC;gBACJ,CAAC;gBACD,KAAK,GAAG,IAAI,CAAC,oCAAoC,CAC/C,WAAW,EACX,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,aAAa,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;oBACzC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAC7C,CAAC;gBACD,KAAK,GAAG,IAAI,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC;gBAE1D,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC;YAC9C,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,kBAAkB;YAClB,IACE,WAAW,CAAC,mBAAmB;gBAC/B,WAAW,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAC1C,CAAC;gBACD,KAAK,CAAC,mBAAmB,GAAG,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAC7D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACN,GAAG,CAAC;oBACJ,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;iBACpD,CAAC,CACH,CAAC;YACJ,CAAC;YAED,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,IAAI,sBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClD,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;gBACtC,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;YACD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,mBAAmB,CAAC,WAA+B;QACjD,IAAI,CAAC,uBAAuB,GAAG,WAAW,CAAC;QAC3C,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,uBAAuB,GAAG,WAAW,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,oBAAoB,CAClB,kBAA6C,EAC7C,cAAsB;QAEtB,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,IAAI,CAAC,QAAQ,CAAC;YAC9B,GAAG,EAAE,kBAAkB,CAAC,GAAG;YAC3B,OAAO,EAAE,KAAK;YACd,cAAc;YACd,IAAI,EAAE,kBAAkB,CAAC,IAAI;SAC9B,CAAC,CAAC;QAEH,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,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,WAAW,CAAC,GAAW;QACrB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,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,YAAY,KAAK,SAAS,CAClE,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,QAAQ,CACN,WAA+B,EAC/B,YAAiC,EACjC,aAAiE;QAEjE,MAAM,uBAAuB,GAAG,IAAI,GAAG,CACrC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAC1E,CAAC;QACF,MAAM,qBAAqB,GACzB,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC;YAC5D,EAAE,aAAa,IAAI,aAAa,EAAE,aAAa,CAAC;QACpD,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,MAAM,WAAW,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;YACtE,MAAM,aAAa,GACjB,WAAW,EAAE,aAAa,IAAI,qBAAqB,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,EAAE,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,CAAC,uBAAuB,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QACjD,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,aAAa,IAAI,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;CACF;AAteD,gCAseC","sourcesContent":["import { DISCARD_HOST, DISCARD_PORT } from \"./const\";\nimport type { RTCRtpTransceiver } from \"./media\";\nimport { RTCRtpSimulcastParameters } from \"./media/parameters\";\nimport type { MediaDirection } from \"./media/rtpTransceiver\";\nimport {\n type BundlePolicy,\n GroupDescription,\n MediaDescription,\n SessionDescription,\n SsrcDescription,\n addSDPHeader,\n} from \"./sdp\";\nimport type { RTCDtlsTransport } from \"./transport/dtls\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport { andDirection } from \"./utils\";\n\nexport class SDPManager {\n currentLocalDescription?: SessionDescription;\n currentRemoteDescription?: SessionDescription;\n pendingLocalDescription?: SessionDescription;\n pendingRemoteDescription?: SessionDescription;\n readonly cname: string;\n readonly midSuffix: boolean;\n readonly bundlePolicy?: BundlePolicy;\n\n private seenMid = new Set<string>();\n\n constructor({\n cname,\n midSuffix,\n bundlePolicy,\n }: { cname: string; midSuffix?: boolean; bundlePolicy?: BundlePolicy }) {\n this.cname = cname;\n this.midSuffix = midSuffix ?? false;\n this.bundlePolicy = bundlePolicy;\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 get inactiveRemoteMedia() {\n return this._remoteDescription?.media?.find?.(\n (m) => m.direction === \"inactive\",\n );\n }\n\n /**\n * MediaDescriptionをトランシーバー用に作成\n */\n createMediaDescriptionForTransceiver(\n transceiver: RTCRtpTransceiver,\n direction: MediaDirection,\n ): MediaDescription {\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 = [\n new SsrcDescription({ ssrc: transceiver.sender.ssrc, cname: this.cname }),\n ];\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({\n ssrc: transceiver.sender.rtxSsrc,\n cname: this.cname,\n }),\n );\n media.ssrcGroup = [\n new GroupDescription(\"FID\", [\n transceiver.sender.ssrc.toString(),\n transceiver.sender.rtxSsrc.toString(),\n ]),\n ];\n }\n\n this.addTransportDescription(media, transceiver.dtlsTransport);\n return media;\n }\n\n /**\n * MediaDescriptionをSCTP用に作成\n */\n createMediaDescriptionForSctp(sctp: RTCSctpTransport): MediaDescription {\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 this.addTransportDescription(media, sctp.dtlsTransport);\n return media;\n }\n\n /**\n * トランスポートの情報をMediaDescriptionに追加\n */\n addTransportDescription(\n media: MediaDescription,\n dtlsTransport: RTCDtlsTransport,\n ): void {\n const iceTransport = dtlsTransport.iceTransport;\n\n media.iceCandidates = iceTransport.localCandidates;\n media.iceCandidatesComplete = iceTransport.gatheringState === \"complete\";\n media.iceParams = iceTransport.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\n /**\n * 一意のMIDを割り当て\n */\n allocateMid(type: \"dc\" | \"av\" | \"\" = \"\"): string {\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 (!this.seenMid.has(mid)) break;\n }\n this.seenMid.add(mid);\n return mid;\n }\n\n parseSdp({\n sdp,\n isLocal,\n signalingState,\n type,\n }: {\n sdp: string;\n isLocal: boolean;\n signalingState: string;\n type: \"offer\" | \"answer\";\n }): SessionDescription {\n const description = SessionDescription.parse(sdp);\n this.validateDescription({ description, isLocal, signalingState });\n description.type = type;\n return description;\n }\n\n private validateDescription({\n description,\n isLocal,\n signalingState,\n }: {\n description: SessionDescription;\n isLocal: boolean;\n signalingState: string;\n }) {\n if (isLocal) {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-local-offer\"].includes(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(signalingState)\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(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(signalingState)\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n }\n }\n\n /**\n * オファーSDPを構築\n */\n buildOfferSdp(\n transceivers: RTCRtpTransceiver[],\n sctpTransport: RTCSctpTransport | undefined,\n ): SessionDescription {\n const description = new SessionDescription();\n addSDPHeader(\"offer\", description);\n\n // # handle existing transceivers / sctp\n const currentMedia = this.currentLocalDescription?.media ?? [];\n\n currentMedia.forEach((m, i) => {\n const mid = m.rtp.muxId;\n if (!mid) {\n return;\n }\n if (m.kind === \"application\") {\n if (!sctpTransport) {\n throw new Error(\"sctpTransport not found\");\n }\n sctpTransport.mLineIndex = i;\n description.media.push(\n this.createMediaDescriptionForSctp(sctpTransport),\n );\n } else {\n const transceiver = transceivers.find((t) => t.mid === 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 this.createMediaDescriptionForTransceiver(\n transceiver,\n transceiver.direction,\n ),\n );\n }\n });\n\n // # handle new transceivers / sctp\n for (const transceiver of transceivers.filter(\n (t) => !description.media.find((m) => m.rtp.muxId === t.mid),\n )) {\n if (transceiver.mid == undefined) {\n transceiver.mid = this.allocateMid(this.midSuffix ? \"av\" : \"\");\n }\n const mediaDescription = this.createMediaDescriptionForTransceiver(\n transceiver,\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 sctpTransport &&\n !description.media.find((m) => m.kind === \"application\")\n ) {\n sctpTransport.mLineIndex = description.media.length;\n if (sctpTransport.mid == undefined) {\n sctpTransport.mid = this.allocateMid(this.midSuffix ? \"dc\" : \"\");\n }\n description.media.push(this.createMediaDescriptionForSctp(sctpTransport));\n }\n\n if (this.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 /**\n * アンサーSDPを構築\n */\n buildAnswerSdp({\n transceivers,\n sctpTransport,\n signalingState,\n }: {\n transceivers: RTCRtpTransceiver[];\n sctpTransport: RTCSctpTransport | undefined;\n\n signalingState: string;\n }): SessionDescription {\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(signalingState)\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 for (const remoteMedia of this._remoteDescription.media) {\n let dtlsTransport!: RTCDtlsTransport;\n let media: MediaDescription;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n const transceiver = transceivers.find(\n (t) => t.mid === remoteMedia.rtp.muxId,\n );\n if (!transceiver) {\n throw new Error(\n `Transceiver with mid=${remoteMedia.rtp.muxId} not found`,\n );\n }\n media = this.createMediaDescriptionForTransceiver(\n transceiver,\n andDirection(transceiver.direction, transceiver.offerDirection),\n );\n dtlsTransport = transceiver.dtlsTransport;\n } else if (remoteMedia.kind === \"application\") {\n if (!sctpTransport || !sctpTransport.mid) {\n throw new Error(\"sctpTransport not found\");\n }\n media = this.createMediaDescriptionForSctp(sctpTransport);\n\n dtlsTransport = 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 // Simulcastに関する処理\n if (\n remoteMedia.simulcastParameters &&\n remoteMedia.simulcastParameters.length > 0\n ) {\n media.simulcastParameters = remoteMedia.simulcastParameters.map(\n (v) => ({\n ...v,\n direction: v.direction === \"send\" ? \"recv\" : \"send\",\n }),\n );\n }\n\n description.media.push(media);\n }\n\n if (this.bundlePolicy !== \"disable\") {\n const bundle = new GroupDescription(\"BUNDLE\", []);\n for (const media of description.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 setLocalDescription(description: SessionDescription) {\n this.currentLocalDescription = description;\n if (description.type === \"answer\") {\n this.pendingLocalDescription = undefined;\n } else {\n this.pendingLocalDescription = description;\n }\n }\n\n setRemoteDescription(\n sessionDescription: RTCSessionDescriptionInit,\n signalingState: string,\n ) {\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 = this.parseSdp({\n sdp: sessionDescription.sdp,\n isLocal: false,\n signalingState,\n type: sessionDescription.type,\n });\n\n if (remoteSdp.type === \"answer\") {\n this.currentRemoteDescription = remoteSdp;\n this.pendingRemoteDescription = undefined;\n } else {\n this.pendingRemoteDescription = remoteSdp;\n }\n\n return remoteSdp;\n }\n\n registerMid(mid: string): void {\n this.seenMid.add(mid);\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.bundlePolicy !== \"disable\",\n );\n return bundle;\n }\n\n /**\n * ローカルセッション記述を設定し、トランスポート情報を追加する\n */\n setLocal(\n description: SessionDescription,\n transceivers: RTCRtpTransceiver[],\n sctpTransport?: { dtlsTransport: RTCDtlsTransport; mid?: string },\n ) {\n const transceiverByMLineIndex = new Map(\n transceivers.map((transceiver) => [transceiver?.mLineIndex, transceiver]),\n );\n const fallbackDtlsTransport =\n transceivers.find((transceiver) => transceiver?.dtlsTransport)\n ?.dtlsTransport ?? sctpTransport?.dtlsTransport;\n description.media\n .filter((m) => [\"audio\", \"video\"].includes(m.kind))\n .forEach((m, i) => {\n const transceiver = transceiverByMLineIndex.get(i) ?? transceivers[i];\n const dtlsTransport =\n transceiver?.dtlsTransport ?? fallbackDtlsTransport;\n if (!dtlsTransport) {\n throw new Error(`dtls transport not found for media index ${i}`);\n }\n this.addTransportDescription(m, dtlsTransport);\n });\n const sctpMedia = description.media.find((m) => m.kind === \"application\");\n if (sctpTransport && sctpMedia) {\n this.addTransportDescription(sctpMedia, sctpTransport.dtlsTransport);\n }\n\n this.setLocalDescription(description);\n }\n}\n\nexport interface RTCSessionDescriptionInit {\n sdp?: string;\n type: RTCSdpType;\n}\nexport type RTCSdpType = \"answer\" | \"offer\" | \"pranswer\" | \"rollback\";\n"]}
|
|
@@ -87,7 +87,7 @@ class SecureTransportManager {
|
|
|
87
87
|
}
|
|
88
88
|
get dtlsTransports() {
|
|
89
89
|
const transports = [
|
|
90
|
-
...this.transceiverManager.getTransceivers().map((t) => t
|
|
90
|
+
...this.transceiverManager.getTransceivers().map((t) => t?.dtlsTransport),
|
|
91
91
|
this.sctpManager.sctpTransport?.dtlsTransport,
|
|
92
92
|
].filter((t) => t != undefined);
|
|
93
93
|
return transports.reduce((acc, cur) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secureTransportManager.js","sourceRoot":"","sources":["../../../src/secureTransportManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { SRTP_PROFILE } from \"./const\";\nimport { Event, debug } from \"./imports/common\";\nimport type { RTCRtpTransceiver, TransceiverManager } from \"./media\";\nimport type { RTCStats } from \"./media/stats\";\nimport type { PeerConfig } from \"./peerConnection\";\nimport type { SctpTransportManager } from \"./sctpManager\";\nimport type { BundlePolicy, MediaDescription, SessionDescription } from \"./sdp\";\nimport {\n type DtlsKeys,\n RTCCertificate,\n RTCDtlsTransport,\n} from \"./transport/dtls\";\nimport { IceCandidate, RTCIceGatherer, RTCIceTransport } from \"./transport/ice\";\nimport type {\n IceGathererState,\n RTCIceCandidate,\n RTCIceCandidateInit,\n RTCIceConnectionState,\n} from \"./transport/ice\";\nimport type { RTCSctpTransport } from \"./transport/sctp\";\nimport type { ConnectionState } from \"./types/domain\";\nimport { parseIceServers } from \"./utils\";\n\nconst log = debug(\n \"werift:packages/webrtc/src/transport/secureTransportManager.ts\",\n);\nexport class SecureTransportManager {\n connectionState: ConnectionState = \"new\";\n iceConnectionState: RTCIceConnectionState = \"new\";\n iceGatheringState: IceGathererState = \"new\";\n certificate?: RTCCertificate;\n\n readonly iceGatheringStateChange = new Event<[IceGathererState]>();\n readonly iceConnectionStateChange = new Event<[RTCIceConnectionState]>();\n readonly onIceCandidate = new Event<[IceCandidate | undefined]>();\n readonly connectionStateChange = new Event<[ConnectionState]>();\n\n private config: PeerConfig;\n private transceiverManager: TransceiverManager;\n private sctpManager: SctpTransportManager;\n\n constructor({\n config,\n transceiverManager,\n sctpManager,\n }: {\n config: PeerConfig;\n transceiverManager: TransceiverManager;\n sctpManager: SctpTransportManager;\n }) {\n this.config = config;\n this.transceiverManager = transceiverManager;\n this.sctpManager = sctpManager;\n\n if (this.config.dtls) {\n const { keys } = this.config.dtls;\n\n if (keys) {\n this.setupCertificate(keys);\n }\n }\n }\n\n get dtlsTransports() {\n const transports = [\n ...this.transceiverManager.getTransceivers().map((t) => t.dtlsTransport),\n this.sctpManager.sctpTransport?.dtlsTransport,\n ].filter((t) => t != undefined);\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\n get iceTransports() {\n return this.dtlsTransports.map((d) => d.iceTransport);\n }\n\n setupCertificate(keys: DtlsKeys) {\n this.certificate = new RTCCertificate(\n keys.keyPem,\n keys.certPem,\n keys.signatureHash,\n );\n }\n\n createTransport() {\n const [existing] = this.iceTransports;\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 localPasswordPrefix: this.config.icePasswordPrefix,\n useIpv4: this.config.iceUseIpv4,\n useIpv6: this.config.iceUseIpv6,\n turnTransport: this.config.forceTurnTCP === true ? \"tcp\" : \"udp\",\n useLinkLocalAddress: this.config.iceUseLinkLocalAddress,\n });\n\n if (existing) {\n iceGatherer.connection.localUsername = existing.connection.localUsername;\n iceGatherer.connection.localPassword = existing.connection.localPassword;\n }\n\n iceGatherer.onGatheringStateChange.subscribe(() => {\n this.updateIceGatheringState();\n });\n this.updateIceGatheringState();\n\n const iceTransport = new RTCIceTransport(iceGatherer);\n iceTransport.onStateChange.subscribe(() => {\n this.updateIceConnectionState();\n });\n\n const dtlsTransport = new RTCDtlsTransport(\n this.config,\n iceTransport,\n this.certificate,\n srtpProfiles,\n );\n\n return dtlsTransport;\n }\n\n handleNewIceCandidate({\n candidate,\n media,\n remoteIsBundled,\n transceiver,\n sctpTransport,\n bundlePolicy,\n }: {\n candidate: IceCandidate;\n media?: MediaDescription;\n remoteIsBundled: boolean;\n transceiver?: RTCRtpTransceiver;\n sctpTransport?: RTCSctpTransport;\n bundlePolicy?: BundlePolicy;\n }) {\n // Assign sdpMid and sdpMLineIndex\n if (bundlePolicy === \"max-bundle\" || remoteIsBundled) {\n candidate.sdpMLineIndex = 0;\n if (media) {\n candidate.sdpMid = media.rtp.muxId;\n }\n } else {\n if (transceiver) {\n candidate.sdpMLineIndex = transceiver.mLineIndex;\n candidate.sdpMid = transceiver.mid;\n }\n if (sctpTransport) {\n candidate.sdpMLineIndex = sctpTransport.mLineIndex;\n candidate.sdpMid = sctpTransport.mid;\n }\n }\n\n if (\n candidate.foundation &&\n !candidate.foundation.startsWith(\"candidate:\")\n ) {\n candidate.foundation = \"candidate:\" + candidate.foundation;\n }\n\n this.onIceCandidate.execute(candidate);\n\n return candidate;\n }\n\n async addIceCandidate(\n sdp: SessionDescription,\n candidateMessage: RTCIceCandidate | RTCIceCandidateInit,\n ) {\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(\n sdp,\n candidate.sdpMLineIndex,\n );\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 for candidate\", candidate);\n }\n }\n\n private getTransportByMid(mid: string) {\n let iceTransport: RTCIceTransport | undefined;\n\n const transceiver = this.transceiverManager\n .getTransceivers()\n .find((t) => t.mid === mid);\n if (transceiver) {\n iceTransport = transceiver.dtlsTransport.iceTransport;\n } else if (!iceTransport && this.sctpManager.sctpTransport?.mid === mid) {\n iceTransport = this.sctpManager.sctpTransport.dtlsTransport.iceTransport;\n }\n\n return iceTransport;\n }\n\n private getTransportByMLineIndex(sdp: SessionDescription, index: number) {\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 restartIce() {\n for (const transport of this.iceTransports) {\n transport.restart();\n }\n }\n\n setLocalRole({\n type,\n role,\n }: {\n type: \"offer\" | \"answer\";\n role: \"auto\" | \"client\" | \"server\" | undefined;\n }) {\n for (const dtlsTransport of this.dtlsTransports) {\n const iceTransport = dtlsTransport.iceTransport;\n if (type === \"offer\") {\n iceTransport.connection.iceControlling = true;\n } else {\n iceTransport.connection.iceControlling = false;\n }\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 (type === \"answer\") {\n if (role) {\n dtlsTransport.role = role;\n }\n }\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.gatheringState)).length ===\n 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 (all.map((check) => check.gatheringState).includes(\"gathering\")) {\n newState = \"gathering\";\n } else {\n newState = \"new\";\n }\n\n if (this.iceGatheringState === newState) {\n return;\n }\n\n this.iceGatheringState = newState;\n this.iceGatheringStateChange.execute(newState);\n }\n\n // https://w3c.github.io/webrtc-pc/#dom-rtciceconnectionstate\n 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 function anyMatch(...state: RTCIceConnectionState[]) {\n return all.some((check) => state.includes(check.state));\n }\n\n if (this.connectionState === \"closed\") {\n newState = \"closed\";\n } else if (anyMatch(\"failed\")) {\n newState = \"failed\";\n } else if (anyMatch(\"disconnected\")) {\n newState = \"disconnected\";\n } else if (allMatch(\"new\", \"closed\")) {\n newState = \"new\";\n } else if (anyMatch(\"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 }\n\n async gatherCandidates(remoteIsBundled: boolean) {\n const connected = this.iceTransports.find(\n (transport) =>\n transport.state === \"connected\" || transport.state === \"completed\",\n );\n if (remoteIsBundled && connected) {\n // no need to gather ice candidates on an existing bundled connection\n log(\"skipping ICE gathering for bundled connection\");\n } else {\n await Promise.allSettled(\n this.iceTransports.map((iceTransport) => iceTransport.gather()),\n ).catch((e) => {\n // エラーハンドリングを追加 (例: ログ出力)\n log(\"gatherCandidates failed\", e);\n });\n }\n }\n\n setConnectionState(state: ConnectionState) {\n log(\"connectionStateChange\", state);\n this.connectionState = state;\n this.connectionStateChange.execute(state);\n }\n\n async getStats(): Promise<RTCStats[]> {\n const stats: RTCStats[] = [];\n\n for (const dtlsTransport of this.dtlsTransports) {\n const transportStats = await dtlsTransport.getStats();\n if (transportStats) {\n stats.push(...transportStats);\n }\n }\n\n return stats;\n }\n\n async ensureCerts() {\n if (!this.certificate) {\n this.certificate = await RTCDtlsTransport.SetupCertificate();\n }\n\n for (const dtlsTransport of this.dtlsTransports) {\n dtlsTransport.localCertificate = this.certificate;\n }\n }\n\n async close() {\n this.setConnectionState(\"closed\");\n\n await Promise.allSettled([...this.dtlsTransports.map((t) => t.stop())]);\n\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n this.connectionStateChange.allUnsubscribe();\n }\n}\n\nconst srtpProfiles = [\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n];\n"]}
|
|
1
|
+
{"version":3,"file":"secureTransportManager.js","sourceRoot":"","sources":["../../../src/secureTransportManager.ts"],"names":[],"mappings":";;;AAAA,mCAAuC;AACvC,6CAAgD;AAMhD,2CAI0B;AAC1B,yCAAgF;AAShF,mCAA0C;AAE1C,MAAM,GAAG,GAAG,IAAA,cAAK,EACf,gEAAgE,CACjE,CAAC;AACF,MAAa,sBAAsB;IAejC,YAAY,EACV,MAAM,EACN,kBAAkB,EAClB,WAAW,GAKZ;QAtBD;;;;mBAAmC,KAAK;WAAC;QACzC;;;;mBAA4C,KAAK;WAAC;QAClD;;;;mBAAsC,KAAK;WAAC;QAC5C;;;;;WAA6B;QAEpB;;;;mBAA0B,IAAI,cAAK,EAAsB;WAAC;QAC1D;;;;mBAA2B,IAAI,cAAK,EAA2B;WAAC;QAChE;;;;mBAAiB,IAAI,cAAK,EAA8B;WAAC;QACzD;;;;mBAAwB,IAAI,cAAK,EAAqB;WAAC;QAExD;;;;;WAAmB;QACnB;;;;;WAAuC;QACvC;;;;;WAAkC;QAWxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAE/B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAElC,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,cAAc;QAChB,MAAM,UAAU,GAAG;YACjB,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC;YACzE,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,aAAa;SAC9C,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC;QAEhC,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;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC;IAED,gBAAgB,CAAC,IAAc;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,qBAAc,CACnC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,aAAa,CACnB,CAAC;IACJ,CAAC;IAED,eAAe;QACb,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAEtC,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,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;YAClD,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAC/B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAC/B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;YAChE,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,sBAAsB;SACxD,CAAC,CAAC;QAEH,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;QAED,WAAW,CAAC,sBAAsB,CAAC,SAAS,CAAC,GAAG,EAAE;YAChD,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/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,MAAM,aAAa,GAAG,IAAI,uBAAgB,CACxC,IAAI,CAAC,MAAM,EACX,YAAY,EACZ,IAAI,CAAC,WAAW,EAChB,YAAY,CACb,CAAC;QAEF,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,qBAAqB,CAAC,EACpB,SAAS,EACT,KAAK,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,YAAY,GAQb;QACC,kCAAkC;QAClC,IAAI,YAAY,KAAK,YAAY,IAAI,eAAe,EAAE,CAAC;YACrD,SAAS,CAAC,aAAa,GAAG,CAAC,CAAC;YAC5B,IAAI,KAAK,EAAE,CAAC;gBACV,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;YACrC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,WAAW,EAAE,CAAC;gBAChB,SAAS,CAAC,aAAa,GAAG,WAAW,CAAC,UAAU,CAAC;gBACjD,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC;YACrC,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBAClB,SAAS,CAAC,aAAa,GAAG,aAAa,CAAC,UAAU,CAAC;gBACnD,SAAS,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC;YACvC,CAAC;QACH,CAAC;QAED,IACE,SAAS,CAAC,UAAU;YACpB,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,EAC9C,CAAC;YACD,SAAS,CAAC,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC,UAAU,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEvC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,GAAuB,EACvB,gBAAuD;QAEvD,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,CAC1C,GAAG,EACH,SAAS,CAAC,aAAa,CACxB,CAAC;QACJ,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,sCAAsC,EAAE,SAAS,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,GAAW;QACnC,IAAI,YAAyC,CAAC;QAE9C,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB;aACxC,eAAe,EAAE;aACjB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAC9B,IAAI,WAAW,EAAE,CAAC;YAChB,YAAY,GAAG,WAAW,CAAC,aAAa,CAAC,YAAY,CAAC;QACxD,CAAC;aAAM,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC;YACxE,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,YAAY,CAAC;QAC3E,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,wBAAwB,CAAC,GAAuB,EAAE,KAAa;QACrE,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,UAAU;QACR,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3C,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,YAAY,CAAC,EACX,IAAI,EACJ,IAAI,GAIL;QACC,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;YAChD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,YAAY,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,UAAU,CAAC,cAAc,GAAG,KAAK,CAAC;YACjD,CAAC;YACD,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,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,IAAI,IAAI,EAAE,CAAC;oBACT,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,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,cAAc,CAAC,CAAC,CAAC,MAAM;gBAClE,GAAG,CAAC,MAAM,CACX,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,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1E,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,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;QAClC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,6DAA6D;IAC7D,wBAAwB;QACtB,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,SAAS,QAAQ,CAAC,GAAG,KAA8B;YACjD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,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;IAClD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,eAAwB;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CACvC,CAAC,SAAS,EAAE,EAAE,CACZ,SAAS,CAAC,KAAK,KAAK,WAAW,IAAI,SAAS,CAAC,KAAK,KAAK,WAAW,CACrE,CAAC;QACF,IAAI,eAAe,IAAI,SAAS,EAAE,CAAC;YACjC,qEAAqE;YACrE,GAAG,CAAC,+CAA+C,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAChE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBACZ,yBAAyB;gBACzB,GAAG,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,KAAsB;QACvC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,KAAK,GAAe,EAAE,CAAC;QAE7B,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC;YACtD,IAAI,cAAc,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,MAAM,uBAAgB,CAAC,gBAAgB,EAAE,CAAC;QAC/D,CAAC;QAED,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,aAAa,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC;QACpD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAElC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAExE,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC;QAC9C,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QACrC,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,CAAC;IAC9C,CAAC;CACF;AArXD,wDAqXC;AAED,MAAM,YAAY,GAAG;IACnB,oBAAY,CAAC,qBAAqB,EAAE,SAAS;IAC7C,oBAAY,CAAC,2BAA2B;CACzC,CAAC","sourcesContent":["import { SRTP_PROFILE } from \"./const\";\nimport { Event, debug } from \"./imports/common\";\nimport type { RTCRtpTransceiver, TransceiverManager } from \"./media\";\nimport type { RTCStats } from \"./media/stats\";\nimport type { PeerConfig } from \"./peerConnection\";\nimport type { SctpTransportManager } from \"./sctpManager\";\nimport type { BundlePolicy, MediaDescription, SessionDescription } from \"./sdp\";\nimport {\n type DtlsKeys,\n RTCCertificate,\n RTCDtlsTransport,\n} from \"./transport/dtls\";\nimport { IceCandidate, RTCIceGatherer, RTCIceTransport } from \"./transport/ice\";\nimport type {\n IceGathererState,\n RTCIceCandidate,\n RTCIceCandidateInit,\n RTCIceConnectionState,\n} from \"./transport/ice\";\nimport type { RTCSctpTransport } from \"./transport/sctp\";\nimport type { ConnectionState } from \"./types/domain\";\nimport { parseIceServers } from \"./utils\";\n\nconst log = debug(\n \"werift:packages/webrtc/src/transport/secureTransportManager.ts\",\n);\nexport class SecureTransportManager {\n connectionState: ConnectionState = \"new\";\n iceConnectionState: RTCIceConnectionState = \"new\";\n iceGatheringState: IceGathererState = \"new\";\n certificate?: RTCCertificate;\n\n readonly iceGatheringStateChange = new Event<[IceGathererState]>();\n readonly iceConnectionStateChange = new Event<[RTCIceConnectionState]>();\n readonly onIceCandidate = new Event<[IceCandidate | undefined]>();\n readonly connectionStateChange = new Event<[ConnectionState]>();\n\n private config: PeerConfig;\n private transceiverManager: TransceiverManager;\n private sctpManager: SctpTransportManager;\n\n constructor({\n config,\n transceiverManager,\n sctpManager,\n }: {\n config: PeerConfig;\n transceiverManager: TransceiverManager;\n sctpManager: SctpTransportManager;\n }) {\n this.config = config;\n this.transceiverManager = transceiverManager;\n this.sctpManager = sctpManager;\n\n if (this.config.dtls) {\n const { keys } = this.config.dtls;\n\n if (keys) {\n this.setupCertificate(keys);\n }\n }\n }\n\n get dtlsTransports() {\n const transports = [\n ...this.transceiverManager.getTransceivers().map((t) => t?.dtlsTransport),\n this.sctpManager.sctpTransport?.dtlsTransport,\n ].filter((t) => t != undefined);\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\n get iceTransports() {\n return this.dtlsTransports.map((d) => d.iceTransport);\n }\n\n setupCertificate(keys: DtlsKeys) {\n this.certificate = new RTCCertificate(\n keys.keyPem,\n keys.certPem,\n keys.signatureHash,\n );\n }\n\n createTransport() {\n const [existing] = this.iceTransports;\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 localPasswordPrefix: this.config.icePasswordPrefix,\n useIpv4: this.config.iceUseIpv4,\n useIpv6: this.config.iceUseIpv6,\n turnTransport: this.config.forceTurnTCP === true ? \"tcp\" : \"udp\",\n useLinkLocalAddress: this.config.iceUseLinkLocalAddress,\n });\n\n if (existing) {\n iceGatherer.connection.localUsername = existing.connection.localUsername;\n iceGatherer.connection.localPassword = existing.connection.localPassword;\n }\n\n iceGatherer.onGatheringStateChange.subscribe(() => {\n this.updateIceGatheringState();\n });\n this.updateIceGatheringState();\n\n const iceTransport = new RTCIceTransport(iceGatherer);\n iceTransport.onStateChange.subscribe(() => {\n this.updateIceConnectionState();\n });\n\n const dtlsTransport = new RTCDtlsTransport(\n this.config,\n iceTransport,\n this.certificate,\n srtpProfiles,\n );\n\n return dtlsTransport;\n }\n\n handleNewIceCandidate({\n candidate,\n media,\n remoteIsBundled,\n transceiver,\n sctpTransport,\n bundlePolicy,\n }: {\n candidate: IceCandidate;\n media?: MediaDescription;\n remoteIsBundled: boolean;\n transceiver?: RTCRtpTransceiver;\n sctpTransport?: RTCSctpTransport;\n bundlePolicy?: BundlePolicy;\n }) {\n // Assign sdpMid and sdpMLineIndex\n if (bundlePolicy === \"max-bundle\" || remoteIsBundled) {\n candidate.sdpMLineIndex = 0;\n if (media) {\n candidate.sdpMid = media.rtp.muxId;\n }\n } else {\n if (transceiver) {\n candidate.sdpMLineIndex = transceiver.mLineIndex;\n candidate.sdpMid = transceiver.mid;\n }\n if (sctpTransport) {\n candidate.sdpMLineIndex = sctpTransport.mLineIndex;\n candidate.sdpMid = sctpTransport.mid;\n }\n }\n\n if (\n candidate.foundation &&\n !candidate.foundation.startsWith(\"candidate:\")\n ) {\n candidate.foundation = \"candidate:\" + candidate.foundation;\n }\n\n this.onIceCandidate.execute(candidate);\n\n return candidate;\n }\n\n async addIceCandidate(\n sdp: SessionDescription,\n candidateMessage: RTCIceCandidate | RTCIceCandidateInit,\n ) {\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(\n sdp,\n candidate.sdpMLineIndex,\n );\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 for candidate\", candidate);\n }\n }\n\n private getTransportByMid(mid: string) {\n let iceTransport: RTCIceTransport | undefined;\n\n const transceiver = this.transceiverManager\n .getTransceivers()\n .find((t) => t.mid === mid);\n if (transceiver) {\n iceTransport = transceiver.dtlsTransport.iceTransport;\n } else if (!iceTransport && this.sctpManager.sctpTransport?.mid === mid) {\n iceTransport = this.sctpManager.sctpTransport.dtlsTransport.iceTransport;\n }\n\n return iceTransport;\n }\n\n private getTransportByMLineIndex(sdp: SessionDescription, index: number) {\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 restartIce() {\n for (const transport of this.iceTransports) {\n transport.restart();\n }\n }\n\n setLocalRole({\n type,\n role,\n }: {\n type: \"offer\" | \"answer\";\n role: \"auto\" | \"client\" | \"server\" | undefined;\n }) {\n for (const dtlsTransport of this.dtlsTransports) {\n const iceTransport = dtlsTransport.iceTransport;\n if (type === \"offer\") {\n iceTransport.connection.iceControlling = true;\n } else {\n iceTransport.connection.iceControlling = false;\n }\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 (type === \"answer\") {\n if (role) {\n dtlsTransport.role = role;\n }\n }\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.gatheringState)).length ===\n 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 (all.map((check) => check.gatheringState).includes(\"gathering\")) {\n newState = \"gathering\";\n } else {\n newState = \"new\";\n }\n\n if (this.iceGatheringState === newState) {\n return;\n }\n\n this.iceGatheringState = newState;\n this.iceGatheringStateChange.execute(newState);\n }\n\n // https://w3c.github.io/webrtc-pc/#dom-rtciceconnectionstate\n 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 function anyMatch(...state: RTCIceConnectionState[]) {\n return all.some((check) => state.includes(check.state));\n }\n\n if (this.connectionState === \"closed\") {\n newState = \"closed\";\n } else if (anyMatch(\"failed\")) {\n newState = \"failed\";\n } else if (anyMatch(\"disconnected\")) {\n newState = \"disconnected\";\n } else if (allMatch(\"new\", \"closed\")) {\n newState = \"new\";\n } else if (anyMatch(\"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 }\n\n async gatherCandidates(remoteIsBundled: boolean) {\n const connected = this.iceTransports.find(\n (transport) =>\n transport.state === \"connected\" || transport.state === \"completed\",\n );\n if (remoteIsBundled && connected) {\n // no need to gather ice candidates on an existing bundled connection\n log(\"skipping ICE gathering for bundled connection\");\n } else {\n await Promise.allSettled(\n this.iceTransports.map((iceTransport) => iceTransport.gather()),\n ).catch((e) => {\n // エラーハンドリングを追加 (例: ログ出力)\n log(\"gatherCandidates failed\", e);\n });\n }\n }\n\n setConnectionState(state: ConnectionState) {\n log(\"connectionStateChange\", state);\n this.connectionState = state;\n this.connectionStateChange.execute(state);\n }\n\n async getStats(): Promise<RTCStats[]> {\n const stats: RTCStats[] = [];\n\n for (const dtlsTransport of this.dtlsTransports) {\n const transportStats = await dtlsTransport.getStats();\n if (transportStats) {\n stats.push(...transportStats);\n }\n }\n\n return stats;\n }\n\n async ensureCerts() {\n if (!this.certificate) {\n this.certificate = await RTCDtlsTransport.SetupCertificate();\n }\n\n for (const dtlsTransport of this.dtlsTransports) {\n dtlsTransport.localCertificate = this.certificate;\n }\n }\n\n async close() {\n this.setConnectionState(\"closed\");\n\n await Promise.allSettled([...this.dtlsTransports.map((t) => t.stop())]);\n\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n this.connectionStateChange.allUnsubscribe();\n }\n}\n\nconst srtpProfiles = [\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n];\n"]}
|