werift 0.23.0 → 0.24.1
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/README.md +46 -0
- package/lib/common/src/binary.js +2 -3
- package/lib/common/src/binary.js.map +1 -1
- package/lib/common/src/transport.d.ts +22 -9
- package/lib/common/src/transport.js +152 -25
- package/lib/common/src/transport.js.map +1 -1
- package/lib/ice/src/candidate.d.ts +16 -1
- package/lib/ice/src/candidate.js +99 -15
- package/lib/ice/src/candidate.js.map +1 -1
- package/lib/ice/src/ice.d.ts +2 -0
- package/lib/ice/src/ice.js +175 -50
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +23 -2
- package/lib/ice/src/iceBase.js +63 -1
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/index.d.ts +2 -0
- package/lib/ice/src/index.js +2 -0
- package/lib/ice/src/index.js.map +1 -1
- package/lib/ice/src/internal/selectAddresses.d.ts +9 -0
- package/lib/ice/src/internal/selectAddresses.js +40 -0
- package/lib/ice/src/internal/selectAddresses.js.map +1 -0
- package/lib/ice/src/stun/const.d.ts +1 -26
- package/lib/ice/src/stun/const.js +15 -54
- package/lib/ice/src/stun/const.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +1 -25
- package/lib/ice/src/stun/message.js +15 -149
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +1 -1
- package/lib/ice/src/stun/protocol.js +2 -2
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/tcpFrame.d.ts +5 -0
- package/lib/ice/src/stun/tcpFrame.js +26 -0
- package/lib/ice/src/stun/tcpFrame.js.map +1 -0
- package/lib/ice/src/stun/tcpProtocol.d.ts +51 -0
- package/lib/ice/src/stun/tcpProtocol.js +326 -0
- package/lib/ice/src/stun/tcpProtocol.js.map +1 -0
- package/lib/ice/src/stun/transaction.d.ts +2 -1
- package/lib/ice/src/stun/transaction.js +9 -3
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/frame.d.ts +1 -0
- package/lib/ice/src/turn/frame.js +18 -0
- package/lib/ice/src/turn/frame.js.map +1 -0
- package/lib/ice/src/turn/protocol.d.ts +9 -7
- package/lib/ice/src/turn/protocol.js +32 -44
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +1 -1
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/ice/src/utils.js +2 -31
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/{ice → ice-server}/src/stun/attributes.d.ts +12 -5
- package/lib/{ice → ice-server}/src/stun/attributes.js +69 -66
- package/lib/ice-server/src/stun/attributes.js.map +1 -0
- package/lib/ice-server/src/stun/const.d.ts +28 -0
- package/lib/ice-server/src/stun/const.js +88 -0
- package/lib/ice-server/src/stun/const.js.map +1 -0
- package/lib/ice-server/src/stun/ip.d.ts +12 -0
- package/lib/ice-server/src/stun/ip.js +88 -0
- package/lib/ice-server/src/stun/ip.js.map +1 -0
- package/lib/ice-server/src/stun/message.d.ts +37 -0
- package/lib/ice-server/src/stun/message.js +190 -0
- package/lib/ice-server/src/stun/message.js.map +1 -0
- package/lib/ice-server/src/turn/auth.d.ts +1 -0
- package/lib/ice-server/src/turn/auth.js +10 -0
- package/lib/ice-server/src/turn/auth.js.map +1 -0
- package/lib/ice-server/src/turn/frame.d.ts +13 -0
- package/lib/ice-server/src/turn/frame.js +69 -0
- package/lib/ice-server/src/turn/frame.js.map +1 -0
- package/lib/index.mjs +2866 -946
- package/lib/nonstandard/index.mjs +1872 -455
- package/lib/rtp/src/codec/av1.js +11 -5
- package/lib/rtp/src/codec/av1.js.map +1 -1
- package/lib/rtp/src/codec/leb128.d.ts +5 -0
- package/lib/rtp/src/codec/leb128.js +24 -0
- package/lib/rtp/src/codec/leb128.js.map +1 -0
- package/lib/rtp/src/extra/container/mp4/container.d.ts +9 -6
- package/lib/rtp/src/extra/container/mp4/container.js +258 -173
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.d.ts +1 -0
- package/lib/rtp/src/extra/container/mp4/h264.js +13 -0
- package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.d.ts +11 -7
- package/lib/rtp/src/extra/processor/mp4.js +115 -60
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.d.ts +2 -3
- package/lib/rtp/src/extra/processor/mp4Callback.js +5 -3
- package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
- package/lib/rtp/src/rtp/rtx.js +4 -6
- package/lib/rtp/src/rtp/rtx.js.map +1 -1
- package/lib/rtp/src/srtp/context/context.d.ts +2 -0
- package/lib/rtp/src/srtp/context/context.js +12 -12
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/sctp/src/param.js +31 -15
- package/lib/sctp/src/param.js.map +1 -1
- package/lib/sctp/src/sctp.js +10 -9
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/dataChannel.d.ts +3 -2
- package/lib/webrtc/src/dataChannel.js +9 -2
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/errors.d.ts +3 -0
- package/lib/webrtc/src/errors.js +11 -0
- package/lib/webrtc/src/errors.js.map +1 -0
- package/lib/webrtc/src/helper.d.ts +5 -1
- package/lib/webrtc/src/helper.js +33 -1
- package/lib/webrtc/src/helper.js.map +1 -1
- package/lib/webrtc/src/media/receiver/statistics.d.ts +4 -1
- package/lib/webrtc/src/media/receiver/statistics.js +22 -0
- package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +15 -2
- package/lib/webrtc/src/media/rtpReceiver.js +135 -20
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +32 -7
- package/lib/webrtc/src/media/rtpSender.js +179 -31
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +13 -4
- package/lib/webrtc/src/media/rtpTransceiver.js +26 -5
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/stats.d.ts +15 -1
- package/lib/webrtc/src/media/stats.js +55 -1
- package/lib/webrtc/src/media/stats.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +2 -1
- package/lib/webrtc/src/media/track.js +7 -1
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/dummyMedia.d.ts +19 -0
- package/lib/webrtc/src/nonstandard/dummyMedia.js +157 -0
- package/lib/webrtc/src/nonstandard/dummyMedia.js.map +1 -0
- package/lib/webrtc/src/nonstandard/navigator.d.ts +18 -8
- package/lib/webrtc/src/nonstandard/navigator.js +96 -32
- package/lib/webrtc/src/nonstandard/navigator.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.d.ts +16 -0
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.js +360 -0
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.js.map +1 -0
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +71 -31
- package/lib/webrtc/src/nonstandard/userMedia.js +454 -108
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +183 -50
- package/lib/webrtc/src/peerConnection.js +458 -109
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sctpManager.d.ts +1 -1
- package/lib/webrtc/src/sctpManager.js +27 -7
- package/lib/webrtc/src/sctpManager.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +10 -7
- package/lib/webrtc/src/sdp.js +40 -44
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +4 -3
- package/lib/webrtc/src/sdpManager.js +50 -27
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.d.ts +13 -4
- package/lib/webrtc/src/secureTransportManager.js +100 -22
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/lib/webrtc/src/transceiverManager.d.ts +5 -4
- package/lib/webrtc/src/transceiverManager.js +61 -62
- package/lib/webrtc/src/transceiverManager.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.d.ts +15 -4
- package/lib/webrtc/src/transport/dtls.js +91 -23
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +21 -3
- package/lib/webrtc/src/transport/ice.js +159 -30
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +1 -0
- package/lib/webrtc/src/transport/sctp.js +26 -22
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +12 -4
- package/lib/webrtc/src/utils.js +118 -16
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +7 -10
- package/lib/ice/src/stun/attributes.js.map +0 -1
- package/lib/rtp/src/extra/container/mp4/mp4box.d.ts +0 -5
- package/lib/rtp/src/extra/container/mp4/mp4box.js +0 -32
- package/lib/rtp/src/extra/container/mp4/mp4box.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dtls.js","sourceRoot":"","sources":["../../../../src/transport/dtls.ts"],"names":[],"mappings":"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","sourcesContent":["import { Certificate, PrivateKey } from \"@fidm/x509\";\n\nimport { randomUUID } from \"crypto\";\nimport { setTimeout } from \"timers/promises\";\nimport { Event, type Transport } from \"../imports/common\";\n\nimport type { AddressInfo } from \"net\";\nimport {\n CipherContext,\n DtlsClient,\n DtlsServer,\n type DtlsSocket,\n HashAlgorithm,\n NamedCurveAlgorithm,\n SignatureAlgorithm,\n type SignatureHash,\n} from \"../imports/dtls\";\nimport type { IceConnection } from \"../imports/ice\";\nimport {\n type RtcpPacket,\n RtcpPacketConverter,\n type RtpHeader,\n RtpPacket,\n SrtcpSession,\n SrtpAuthenticationError,\n type SrtpProfile,\n SrtpSession,\n debug,\n isMedia,\n isRtcp,\n keyLength,\n saltLength,\n} from \"../imports/rtp\";\nimport {\n type RTCCertificateStats,\n type RTCIceCandidatePairStats,\n type RTCIceCandidateStats,\n type RTCStats,\n type RTCTransportStats,\n generateStatsId,\n getStatsTimestamp,\n} from \"../media/stats\";\nimport type { PeerConfig } from \"../peerConnection\";\nimport {\n fingerprint,\n isDtls,\n normalizeFingerprintAlgorithm,\n normalizeFingerprintValue,\n} from \"../utils\";\nimport type { RTCIceTransport } from \"./ice\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/dtls.ts\");\n\nexport interface DtlsTransportStats {\n bytesSent: number;\n bytesReceived: number;\n packetsSent: number;\n packetsReceived: number;\n}\n\nexport class RTCDtlsTransport implements DtlsTransportStats {\n id = randomUUID().toString();\n state: DtlsState = \"new\";\n role: DtlsRole = \"auto\";\n srtpStarted = false;\n transportSequenceNumber = 0;\n\n // Statistics tracking\n public bytesSent = 0;\n public bytesReceived = 0;\n public packetsSent = 0;\n public packetsReceived = 0;\n\n dataReceiver: (buf: Buffer) => void = () => {};\n dtls?: DtlsSocket;\n srtp!: SrtpSession;\n srtcp!: SrtcpSession;\n\n readonly onStateChange = new Event<[DtlsState]>();\n readonly onRtcp = new Event<[RtcpPacket]>();\n readonly onRtp = new Event<[RtpPacket]>();\n\n static localCertificate?: RTCCertificate;\n static localCertificatePromise?: Promise<RTCCertificate>;\n private remoteParameters?: RTCDtlsParameters;\n\n constructor(\n readonly config: PeerConfig,\n readonly iceTransport: RTCIceTransport,\n public localCertificate?: RTCCertificate,\n private readonly srtpProfiles: SrtpProfile[] = [],\n ) {\n this.localCertificate ??= RTCDtlsTransport.localCertificate;\n }\n\n get localParameters() {\n return new RTCDtlsParameters(\n this.localCertificate ? this.localCertificate.getFingerprints() : [],\n this.role,\n );\n }\n\n static async SetupCertificate() {\n if (this.localCertificate) {\n return this.localCertificate;\n }\n\n if (this.localCertificatePromise) {\n return this.localCertificatePromise;\n }\n\n this.localCertificatePromise = (async () => {\n const { certPem, keyPem, signatureHash } =\n await CipherContext.createSelfSignedCertificateWithKey(\n {\n signature: SignatureAlgorithm.ecdsa_3,\n hash: HashAlgorithm.sha256_4,\n },\n NamedCurveAlgorithm.secp256r1_23,\n );\n this.localCertificate = new RTCCertificate(\n keyPem,\n certPem,\n signatureHash,\n );\n return this.localCertificate;\n })();\n\n return this.localCertificatePromise;\n }\n\n setRemoteParams(remoteParameters: RTCDtlsParameters) {\n const fingerprints = deduplicateFingerprints([\n ...(this.remoteParameters?.fingerprints ?? []),\n ...remoteParameters.fingerprints,\n ]);\n const role =\n remoteParameters.role === \"auto\" && this.remoteParameters?.role\n ? this.remoteParameters.role\n : remoteParameters.role;\n this.remoteParameters = new RTCDtlsParameters(fingerprints, role);\n }\n\n async start() {\n if (this.state !== \"new\") {\n throw new Error(\"state must be new\");\n }\n if (\n !this.remoteParameters ||\n this.remoteParameters.fingerprints.length === 0\n ) {\n throw new Error(\"remote fingerprint not exist\");\n }\n\n if (this.role === \"auto\") {\n if (this.iceTransport.role === \"controlling\") {\n this.role = \"server\";\n } else {\n this.role = \"client\";\n }\n }\n\n this.setState(\"connecting\");\n\n await new Promise<void>(async (r, f) => {\n if (this.role === \"server\") {\n this.dtls = new DtlsServer({\n cert: this.localCertificate?.certPem,\n key: this.localCertificate?.privateKey,\n signatureHash: this.localCertificate?.signatureHash,\n transport: createIceTransport(this.iceTransport.connection),\n srtpProfiles: this.srtpProfiles,\n extendedMasterSecret: true,\n certificateRequest: true,\n });\n } else {\n this.dtls = new DtlsClient({\n cert: this.localCertificate?.certPem,\n key: this.localCertificate?.privateKey,\n signatureHash: this.localCertificate?.signatureHash,\n transport: createIceTransport(this.iceTransport.connection),\n srtpProfiles: this.srtpProfiles,\n extendedMasterSecret: true,\n });\n }\n this.dtls.onData.subscribe((buf) => {\n if (\n this.config.debug.inboundPacketLoss &&\n this.config.debug.inboundPacketLoss / 100 < Math.random()\n ) {\n return;\n }\n this.dataReceiver(buf);\n });\n this.dtls.onClose.subscribe(() => {\n if (this.state !== \"failed\") {\n this.setState(\"closed\");\n }\n });\n this.dtls.onConnect.once(r);\n this.dtls.onError.once((error) => {\n this.setState(\"failed\");\n log(\"dtls failed\", error);\n f(error);\n });\n\n if (this.dtls instanceof DtlsClient) {\n await setTimeout(100);\n this.dtls.connect().catch((error) => {\n this.setState(\"failed\");\n log(\"dtls connect failed\", error);\n f(error);\n });\n }\n });\n\n try {\n this.verifyRemoteCertificateFingerprint();\n } catch (error) {\n this.setState(\"failed\");\n this.dtls?.close();\n throw error;\n }\n\n if (this.srtpProfiles.length > 0) {\n this.startSrtp();\n }\n this.setState(\"connected\");\n\n log(\"dtls connected\");\n }\n\n private verifyRemoteCertificateFingerprint() {\n if (\n !this.remoteParameters ||\n this.remoteParameters.fingerprints.length === 0\n ) {\n throw new Error(\"remote fingerprint not exist\");\n }\n\n const remoteCertificate = this.dtls?.remoteCertificate;\n if (!remoteCertificate) {\n throw new Error(\"remote certificate not available\");\n }\n\n const supportedFingerprints = this.remoteParameters.fingerprints.flatMap(\n ({ algorithm, value }) => {\n const normalizedAlgorithm = normalizeFingerprintAlgorithm(algorithm);\n if (!normalizedAlgorithm) {\n return [];\n }\n\n const normalizedValue = normalizeFingerprintValue(value);\n if (!normalizedValue) {\n throw new Error(\"remote fingerprint value is empty\");\n }\n\n return [{ normalizedAlgorithm, normalizedValue }];\n },\n );\n if (supportedFingerprints.length === 0) {\n throw new Error(\"no supported remote fingerprint algorithms\");\n }\n\n const preferredAlgorithm = selectPreferredFingerprintAlgorithm(\n supportedFingerprints,\n );\n const expectedFingerprints = supportedFingerprints.filter(\n ({ normalizedAlgorithm }) => normalizedAlgorithm === preferredAlgorithm,\n );\n\n const actualFingerprints = expectedFingerprints.reduce(\n (acc, { normalizedAlgorithm }) => {\n if (!acc.has(normalizedAlgorithm)) {\n acc.set(\n normalizedAlgorithm,\n normalizeFingerprintValue(\n fingerprint(remoteCertificate, normalizedAlgorithm),\n ),\n );\n }\n return acc;\n },\n new Map<string, string>(),\n );\n\n const matched = expectedFingerprints.some(\n ({ normalizedAlgorithm, normalizedValue }) =>\n actualFingerprints.get(normalizedAlgorithm) === normalizedValue,\n );\n\n if (!matched) {\n throw new Error(\"remote certificate fingerprint mismatch\");\n }\n }\n\n updateSrtpSession() {\n if (!this.dtls) throw new Error();\n\n const profile = this.dtls.srtp.srtpProfile;\n if (!profile) {\n throw new Error(\"need srtpProfile\");\n }\n log(\"selected SRTP Profile\", profile);\n\n const { localKey, localSalt, remoteKey, remoteSalt } =\n this.dtls.extractSessionKeys(keyLength(profile), saltLength(profile));\n\n const config = {\n keys: {\n localMasterKey: localKey,\n localMasterSalt: localSalt,\n remoteMasterKey: remoteKey,\n remoteMasterSalt: remoteSalt,\n },\n profile,\n };\n this.srtp = new SrtpSession(config);\n this.srtcp = new SrtcpSession(config);\n }\n\n startSrtp() {\n if (this.srtpStarted) return;\n this.srtpStarted = true;\n\n this.updateSrtpSession();\n\n this.iceTransport.connection.onData.subscribe((data) => {\n if (\n this.config.debug.inboundPacketLoss &&\n this.config.debug.inboundPacketLoss / 100 < Math.random()\n ) {\n return;\n }\n\n if (!isMedia(data)) return;\n\n // Track received data statistics\n this.bytesReceived += data.length;\n this.packetsReceived++;\n\n if (isRtcp(data)) {\n let dec: Buffer;\n try {\n dec = this.srtcp.decrypt(data);\n } catch (error) {\n if (error instanceof SrtpAuthenticationError) {\n log(\"dropping invalid SRTCP packet\", error);\n return;\n }\n throw error;\n }\n let rtcpPackets;\n try {\n rtcpPackets = RtcpPacketConverter.deSerialize(dec);\n } catch (error) {\n log(\"dropping malformed SRTCP packet\", error);\n return;\n }\n for (const rtcp of rtcpPackets) {\n try {\n this.onRtcp.execute(rtcp);\n } catch (error) {\n log(\"RTCP error\", error);\n }\n }\n } else {\n let dec: Buffer;\n try {\n dec = this.srtp.decrypt(data);\n } catch (error) {\n if (error instanceof SrtpAuthenticationError) {\n log(\"dropping invalid SRTP packet\", error);\n return;\n }\n throw error;\n }\n let rtp;\n try {\n rtp = RtpPacket.deSerialize(dec);\n } catch (error) {\n log(\"dropping malformed SRTP packet\", error);\n return;\n }\n try {\n this.onRtp.execute(rtp);\n } catch (error) {\n log(\"RTP error\", error);\n }\n }\n });\n }\n\n readonly sendData = async (data: Buffer) => {\n if (\n this.config.debug.outboundPacketLoss &&\n this.config.debug.outboundPacketLoss / 100 < Math.random()\n ) {\n return;\n }\n\n if (!this.dtls) {\n throw new Error(\"dtls not established\");\n }\n await this.dtls.send(data);\n };\n\n async sendRtp(payload: Buffer, header: RtpHeader): Promise<number> {\n try {\n const enc = this.srtp.encrypt(payload, header);\n\n if (\n this.config.debug.outboundPacketLoss &&\n this.config.debug.outboundPacketLoss / 100 < Math.random()\n ) {\n return enc.length;\n }\n\n // Track statistics\n this.bytesSent += enc.length;\n this.packetsSent++;\n\n await this.iceTransport.connection.send(enc).catch(() => {});\n return enc.length;\n } catch (error) {\n log(\"failed to send\", error);\n return 0;\n }\n }\n\n async sendRtcp(packets: RtcpPacket[]) {\n const payload = Buffer.concat(packets.map((packet) => packet.serialize()));\n const enc = this.srtcp.encrypt(payload);\n\n if (\n this.config.debug.outboundPacketLoss &&\n this.config.debug.outboundPacketLoss / 100 < Math.random()\n ) {\n return enc.length;\n }\n\n // Track statistics\n this.bytesSent += enc.length;\n this.packetsSent++;\n\n await this.iceTransport.connection.send(enc).catch(() => {});\n }\n\n private setState(state: DtlsState) {\n if (state != this.state) {\n this.state = state;\n this.onStateChange.execute(state);\n }\n }\n\n async stop() {\n this.setState(\"closed\");\n // todo impl send alert\n await this.iceTransport.stop();\n }\n\n async getStats(): Promise<RTCStats[]> {\n const timestamp = getStatsTimestamp();\n const stats: RTCStats[] = [];\n\n const transportId = generateStatsId(\"transport\", this.id);\n\n // Transport stats\n const transportStats: RTCTransportStats = {\n type: \"transport\",\n id: transportId,\n timestamp,\n bytesSent: this.bytesSent,\n bytesReceived: this.bytesReceived,\n packetsSent: this.packetsSent,\n packetsReceived: this.packetsReceived,\n dtlsState: this.state,\n iceState: this.iceTransport.state,\n selectedCandidatePairId: this.iceTransport.connection.nominated\n ? generateStatsId(\n \"candidate-pair\",\n this.iceTransport.connection.nominated.localCandidate.foundation,\n this.iceTransport.connection.nominated.remoteCandidate.foundation,\n )\n : undefined,\n localCertificateId: this.localCertificate\n ? generateStatsId(\"certificate\", \"local\")\n : undefined,\n remoteCertificateId: this.remoteParameters\n ? generateStatsId(\"certificate\", \"remote\")\n : undefined,\n dtlsRole: this.role === \"auto\" ? undefined : this.role,\n };\n stats.push(transportStats);\n\n // Certificate stats\n if (this.localCertificate) {\n const fingerprints = this.localCertificate.getFingerprints();\n if (fingerprints.length > 0) {\n const certStats: RTCCertificateStats = {\n type: \"certificate\",\n id: generateStatsId(\"certificate\", \"local\"),\n timestamp,\n fingerprint: fingerprints[0].value,\n fingerprintAlgorithm: fingerprints[0].algorithm,\n base64Certificate: Buffer.from(\n this.localCertificate.certPem,\n ).toString(\"base64\"),\n };\n stats.push(certStats);\n }\n }\n\n if (\n this.remoteParameters &&\n this.remoteParameters.fingerprints.length > 0\n ) {\n const certStats: RTCCertificateStats = {\n type: \"certificate\",\n id: generateStatsId(\"certificate\", \"remote\"),\n timestamp,\n fingerprint: this.remoteParameters.fingerprints[0].value,\n fingerprintAlgorithm: this.remoteParameters.fingerprints[0].algorithm,\n base64Certificate: \"\", // Remote certificate content not available\n };\n stats.push(certStats);\n }\n\n // Get ICE stats\n const iceStats = await this.iceTransport.getStats();\n stats.push(...iceStats);\n\n return stats;\n }\n}\n\nexport const DtlsStates = [\n \"new\",\n \"connecting\",\n \"connected\",\n \"closed\",\n \"failed\",\n] as const;\nexport type DtlsState = (typeof DtlsStates)[number];\n\nexport type DtlsRole = \"auto\" | \"server\" | \"client\";\n\nexport class RTCCertificate {\n publicKey: string;\n privateKey: string;\n\n constructor(\n privateKeyPem: string,\n public certPem: string,\n public signatureHash: SignatureHash,\n ) {\n const cert = Certificate.fromPEM(Buffer.from(certPem));\n this.publicKey = cert.publicKey.toPEM();\n this.privateKey = PrivateKey.fromPEM(Buffer.from(privateKeyPem)).toPEM();\n }\n\n getFingerprints(): RTCDtlsFingerprint[] {\n return [\n new RTCDtlsFingerprint(\n \"sha-256\",\n fingerprint(\n Certificate.fromPEM(Buffer.from(this.certPem)).raw,\n \"sha256\",\n ),\n ),\n ];\n }\n}\n\nexport type DtlsKeys = {\n certPem: string;\n keyPem: string;\n signatureHash: SignatureHash;\n};\n\nexport class RTCDtlsFingerprint {\n constructor(\n public algorithm: string,\n public value: string,\n ) {}\n}\n\nexport class RTCDtlsParameters {\n constructor(\n public fingerprints: RTCDtlsFingerprint[] = [],\n public role: \"auto\" | \"client\" | \"server\",\n ) {}\n}\n\nconst deduplicateFingerprints = (fingerprints: RTCDtlsFingerprint[]) => {\n const seen = new Set<string>();\n return fingerprints.filter(({ algorithm, value }) => {\n const key = `${\n normalizeFingerprintAlgorithm(algorithm) ?? algorithm.trim().toLowerCase()\n }:${normalizeFingerprintValue(value)}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n};\n\nconst preferredFingerprintAlgorithms = [\n \"sha512\",\n \"sha384\",\n \"sha256\",\n \"sha224\",\n \"sha1\",\n] as const;\n\nconst selectPreferredFingerprintAlgorithm = (\n fingerprints: { normalizedAlgorithm: string }[],\n) => {\n return (\n preferredFingerprintAlgorithms.find((algorithm) =>\n fingerprints.some(\n ({ normalizedAlgorithm }) => normalizedAlgorithm === algorithm,\n ),\n ) ?? fingerprints[0].normalizedAlgorithm\n );\n};\n\nclass IceTransport implements Transport {\n closed: boolean = false;\n constructor(private ice: IceConnection) {\n ice.onData.subscribe((buf) => {\n if (isDtls(buf)) {\n if (this.onData) {\n this.onData(buf);\n }\n }\n });\n }\n onData: (buf: Buffer) => void = () => {};\n\n get address() {\n return {} as AddressInfo;\n }\n\n type: string = \"ice\";\n\n readonly send = (data: Buffer) => {\n return this.ice.send(data);\n };\n\n async close() {\n this.closed = true;\n this.ice.close();\n }\n}\n\nconst createIceTransport = (ice: IceConnection) => new IceTransport(ice);\n"]}
|
|
1
|
+
{"version":3,"file":"dtls.js","sourceRoot":"","sources":["../../../../src/transport/dtls.ts"],"names":[],"mappings":"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","sourcesContent":["import { Certificate, PrivateKey } from \"@fidm/x509\";\n\nimport { randomUUID } from \"crypto\";\nimport { setTimeout } from \"timers/promises\";\nimport { Event, type Transport } from \"../imports/common\";\n\nimport type { AddressInfo } from \"net\";\nimport { EventTarget as DomEventTarget } from \"../helper\";\nimport {\n CipherContext,\n DtlsClient,\n DtlsServer,\n type DtlsSocket,\n HashAlgorithm,\n NamedCurveAlgorithm,\n SignatureAlgorithm,\n type SignatureHash,\n} from \"../imports/dtls\";\nimport type { IceConnection } from \"../imports/ice\";\nimport {\n type RtcpPacket,\n RtcpPacketConverter,\n type RtpHeader,\n RtpPacket,\n SrtcpSession,\n SrtpAuthenticationError,\n type SrtpProfile,\n SrtpSession,\n debug,\n isMedia,\n isRtcp,\n keyLength,\n saltLength,\n} from \"../imports/rtp\";\nimport {\n type RTCCertificateStats,\n type RTCIceCandidatePairStats,\n type RTCIceCandidateStats,\n type RTCStats,\n type RTCTransportStats,\n generateStatsId,\n getStatsTimestamp,\n} from \"../media/stats\";\nimport type { DebugConfig } from \"../peerConnection\";\nimport {\n fingerprint,\n isDtls,\n normalizeFingerprintAlgorithm,\n normalizeFingerprintValue,\n} from \"../utils\";\nimport type { RTCIceTransport } from \"./ice\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/dtls.ts\");\n\nfunction formatDtlsVersion(version?: {\n major: number;\n minor: number;\n}) {\n if (!version) {\n return;\n }\n\n if (version.major === 0xfe && version.minor === 0xfd) {\n return \"DTLS 1.2\";\n }\n if (version.major === 0xfe && version.minor === 0xff) {\n return \"DTLS 1.0\";\n }\n}\n\nfunction formatSrtpCipher(profile?: number) {\n switch (profile) {\n case 0x0001:\n return \"AES_CM_128_HMAC_SHA1_80\";\n case 0x0007:\n return \"AEAD_AES_128_GCM\";\n default:\n return;\n }\n}\n\nexport interface DtlsTransportStats {\n bytesSent: number;\n bytesReceived: number;\n packetsSent: number;\n packetsReceived: number;\n}\n\nexport class RTCDtlsTransport implements DtlsTransportStats {\n id = randomUUID().toString();\n state: DtlsState = \"new\";\n role: DtlsRole = \"auto\";\n srtpStarted = false;\n transportSequenceNumber = 0;\n\n // Statistics tracking\n public bytesSent = 0;\n public bytesReceived = 0;\n public packetsSent = 0;\n public packetsReceived = 0;\n\n dataReceiver: (buf: Buffer) => void = () => {};\n dtls?: DtlsSocket;\n srtp!: SrtpSession;\n srtcp!: SrtcpSession;\n\n readonly onStateChange = new Event<[DtlsState]>();\n readonly onRtcp = new Event<[RtcpPacket]>();\n readonly onRtp = new Event<[RtpPacket]>();\n private readonly events = new DomEventTarget();\n onstatechange?: () => void;\n\n static localCertificate?: RTCCertificate;\n static localCertificatePromise?: Promise<RTCCertificate>;\n private remoteParameters?: RTCDtlsParameters;\n\n constructor(\n readonly config: { debug?: DebugConfig },\n readonly iceTransport: RTCIceTransport,\n public localCertificate?: RTCCertificate,\n private readonly srtpProfiles: SrtpProfile[] = [],\n ) {\n this.localCertificate ??= RTCDtlsTransport.localCertificate;\n }\n\n addEventListener = (\n type: string,\n listener: (...args: any[]) => void,\n options?: boolean | { once?: boolean },\n ) => {\n this.events.addEventListener(type, listener, options);\n };\n\n removeEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.events.removeEventListener(type, listener);\n };\n\n dispatchEvent = (event: globalThis.Event) => this.events.dispatchEvent(event);\n\n get localParameters() {\n return new RTCDtlsParameters(\n this.localCertificate ? this.localCertificate.getFingerprints() : [],\n this.role,\n );\n }\n\n static async SetupCertificate() {\n if (this.localCertificate) {\n return this.localCertificate;\n }\n\n if (this.localCertificatePromise) {\n return this.localCertificatePromise;\n }\n\n this.localCertificatePromise = (async () => {\n const { certPem, keyPem, signatureHash } =\n await CipherContext.createSelfSignedCertificateWithKey(\n {\n signature: SignatureAlgorithm.ecdsa_3,\n hash: HashAlgorithm.sha256_4,\n },\n NamedCurveAlgorithm.secp256r1_23,\n );\n this.localCertificate = new RTCCertificate(\n keyPem,\n certPem,\n signatureHash,\n );\n return this.localCertificate;\n })();\n\n return this.localCertificatePromise;\n }\n\n setRemoteParams(remoteParameters: RTCDtlsParameters) {\n const fingerprints = deduplicateFingerprints([\n ...(this.remoteParameters?.fingerprints ?? []),\n ...remoteParameters.fingerprints,\n ]);\n const role =\n remoteParameters.role === \"auto\" && this.remoteParameters?.role\n ? this.remoteParameters.role\n : remoteParameters.role;\n this.remoteParameters = new RTCDtlsParameters(fingerprints, role);\n }\n\n async start() {\n if (this.state !== \"new\") {\n throw new Error(\"state must be new\");\n }\n if (\n !this.remoteParameters ||\n this.remoteParameters.fingerprints.length === 0\n ) {\n throw new Error(\"remote fingerprint not exist\");\n }\n\n if (this.role === \"auto\") {\n if (this.iceTransport.role === \"controlling\") {\n this.role = \"server\";\n } else {\n this.role = \"client\";\n }\n }\n\n this.setState(\"connecting\");\n\n await new Promise<void>(async (r, f) => {\n if (this.role === \"server\") {\n this.dtls = new DtlsServer({\n cert: this.localCertificate?.certPem,\n key: this.localCertificate?.privateKey,\n signatureHash: this.localCertificate?.signatureHash,\n transport: createIceTransport(this.iceTransport.connection),\n srtpProfiles: this.srtpProfiles,\n extendedMasterSecret: true,\n certificateRequest: true,\n });\n } else {\n this.dtls = new DtlsClient({\n cert: this.localCertificate?.certPem,\n key: this.localCertificate?.privateKey,\n signatureHash: this.localCertificate?.signatureHash,\n transport: createIceTransport(this.iceTransport.connection),\n srtpProfiles: this.srtpProfiles,\n extendedMasterSecret: true,\n });\n }\n this.dtls.onData.subscribe((buf) => {\n if (\n this.config.debug?.inboundPacketLoss &&\n this.config.debug?.inboundPacketLoss / 100 < Math.random()\n ) {\n return;\n }\n this.dataReceiver(buf);\n });\n this.dtls.onClose.subscribe(() => {\n if (this.state !== \"failed\") {\n this.setState(\"closed\");\n }\n });\n this.dtls.onConnect.once(r);\n this.dtls.onError.once((error) => {\n this.setState(\"failed\");\n log(\"dtls failed\", error);\n f(error);\n });\n\n if (this.dtls instanceof DtlsClient) {\n await setTimeout(100);\n this.dtls.connect().catch((error) => {\n this.setState(\"failed\");\n log(\"dtls connect failed\", error);\n f(error);\n });\n }\n });\n\n try {\n this.verifyRemoteCertificateFingerprint();\n } catch (error) {\n this.setState(\"failed\");\n this.dtls?.close();\n throw error;\n }\n\n if (this.srtpProfiles.length > 0) {\n this.startSrtp();\n }\n this.setState(\"connected\");\n\n log(\"dtls connected\");\n }\n\n private verifyRemoteCertificateFingerprint() {\n if (\n !this.remoteParameters ||\n this.remoteParameters.fingerprints.length === 0\n ) {\n throw new Error(\"remote fingerprint not exist\");\n }\n\n const remoteCertificate = this.dtls?.remoteCertificate;\n if (!remoteCertificate) {\n throw new Error(\"remote certificate not available\");\n }\n\n const supportedFingerprints = this.remoteParameters.fingerprints.flatMap(\n ({ algorithm, value }) => {\n const normalizedAlgorithm = normalizeFingerprintAlgorithm(algorithm);\n if (!normalizedAlgorithm) {\n return [];\n }\n\n const normalizedValue = normalizeFingerprintValue(value);\n if (!normalizedValue) {\n throw new Error(\"remote fingerprint value is empty\");\n }\n\n return [{ normalizedAlgorithm, normalizedValue }];\n },\n );\n if (supportedFingerprints.length === 0) {\n throw new Error(\"no supported remote fingerprint algorithms\");\n }\n\n const preferredAlgorithm = selectPreferredFingerprintAlgorithm(\n supportedFingerprints,\n );\n const expectedFingerprints = supportedFingerprints.filter(\n ({ normalizedAlgorithm }) => normalizedAlgorithm === preferredAlgorithm,\n );\n\n const actualFingerprints = expectedFingerprints.reduce(\n (acc, { normalizedAlgorithm }) => {\n if (!acc.has(normalizedAlgorithm)) {\n acc.set(\n normalizedAlgorithm,\n normalizeFingerprintValue(\n fingerprint(remoteCertificate, normalizedAlgorithm),\n ),\n );\n }\n return acc;\n },\n new Map<string, string>(),\n );\n\n const matched = expectedFingerprints.some(\n ({ normalizedAlgorithm, normalizedValue }) =>\n actualFingerprints.get(normalizedAlgorithm) === normalizedValue,\n );\n\n if (!matched) {\n throw new Error(\"remote certificate fingerprint mismatch\");\n }\n }\n\n updateSrtpSession() {\n if (!this.dtls) throw new Error();\n\n const profile = this.dtls.srtp.srtpProfile;\n if (!profile) {\n throw new Error(\"need srtpProfile\");\n }\n log(\"selected SRTP Profile\", profile);\n\n const { localKey, localSalt, remoteKey, remoteSalt } =\n this.dtls.extractSessionKeys(keyLength(profile), saltLength(profile));\n\n const config = {\n keys: {\n localMasterKey: localKey,\n localMasterSalt: localSalt,\n remoteMasterKey: remoteKey,\n remoteMasterSalt: remoteSalt,\n },\n profile,\n };\n this.srtp = new SrtpSession(config);\n this.srtcp = new SrtcpSession(config);\n }\n\n startSrtp() {\n if (this.srtpStarted) return;\n this.srtpStarted = true;\n\n this.updateSrtpSession();\n\n this.iceTransport.connection.onData.subscribe((data) => {\n if (\n this.config.debug?.inboundPacketLoss &&\n this.config.debug?.inboundPacketLoss / 100 < Math.random()\n ) {\n return;\n }\n\n if (!isMedia(data)) return;\n\n // Track received data statistics\n this.bytesReceived += data.length;\n this.packetsReceived++;\n\n if (isRtcp(data)) {\n let dec: Buffer;\n try {\n dec = this.srtcp.decrypt(data);\n } catch (error) {\n if (error instanceof SrtpAuthenticationError) {\n log(\"dropping invalid SRTCP packet\", error);\n return;\n }\n throw error;\n }\n let rtcpPackets;\n try {\n rtcpPackets = RtcpPacketConverter.deSerialize(dec);\n } catch (error) {\n log(\"dropping malformed SRTCP packet\", error);\n return;\n }\n for (const rtcp of rtcpPackets) {\n try {\n this.onRtcp.execute(rtcp);\n } catch (error) {\n log(\"RTCP error\", error);\n }\n }\n } else {\n let dec: Buffer;\n try {\n dec = this.srtp.decrypt(data);\n } catch (error) {\n if (error instanceof SrtpAuthenticationError) {\n log(\"dropping invalid SRTP packet\", error);\n return;\n }\n throw error;\n }\n let rtp;\n try {\n rtp = RtpPacket.deSerialize(dec);\n } catch (error) {\n log(\"dropping malformed SRTP packet\", error);\n return;\n }\n try {\n this.onRtp.execute(rtp);\n } catch (error) {\n log(\"RTP error\", error);\n }\n }\n });\n }\n\n readonly sendData = async (data: Buffer) => {\n if (\n this.config.debug?.outboundPacketLoss &&\n this.config.debug?.outboundPacketLoss / 100 < Math.random()\n ) {\n return;\n }\n\n if (!this.dtls) {\n throw new Error(\"dtls not established\");\n }\n await this.dtls.send(data);\n };\n\n async sendRtp(payload: Buffer, header: RtpHeader): Promise<number> {\n try {\n const enc = this.srtp.encrypt(payload, header);\n\n if (\n this.config.debug?.outboundPacketLoss &&\n this.config.debug?.outboundPacketLoss / 100 < Math.random()\n ) {\n return enc.length;\n }\n\n // Track statistics\n this.bytesSent += enc.length;\n this.packetsSent++;\n\n await this.iceTransport.connection.send(enc).catch(() => {});\n return enc.length;\n } catch (error) {\n log(\"failed to send\", error);\n return 0;\n }\n }\n\n async sendRtcp(packets: RtcpPacket[]) {\n const payload = Buffer.concat(packets.map((packet) => packet.serialize()));\n const enc = this.srtcp.encrypt(payload);\n\n if (\n this.config.debug?.outboundPacketLoss &&\n this.config.debug?.outboundPacketLoss / 100 < Math.random()\n ) {\n return enc.length;\n }\n\n // Track statistics\n this.bytesSent += enc.length;\n this.packetsSent++;\n\n await this.iceTransport.connection.send(enc).catch(() => {});\n }\n\n private setState(state: DtlsState, emitEvent = true) {\n if (state != this.state) {\n this.state = state;\n this.onStateChange.execute(state);\n if (emitEvent) {\n this.onstatechange?.();\n this.events.emit(\"statechange\");\n }\n }\n }\n\n async stop() {\n this.setState(\"closed\", false);\n // todo impl send alert\n await this.iceTransport.stop();\n }\n\n async getStats(timestamp = getStatsTimestamp()): Promise<RTCStats[]> {\n const stats: RTCStats[] = [];\n\n const transportId = generateStatsId(\"transport\", this.id);\n\n // Transport stats\n const transportStats: RTCTransportStats = {\n type: \"transport\",\n id: transportId,\n timestamp,\n bytesSent: this.bytesSent,\n bytesReceived: this.bytesReceived,\n packetsSent: this.packetsSent,\n packetsReceived: this.packetsReceived,\n dtlsState: this.state,\n iceState: this.iceTransport.state,\n iceRole:\n this.iceTransport.role === \"unknown\"\n ? undefined\n : this.iceTransport.role,\n iceLocalUsernameFragment:\n this.iceTransport.localParameters.usernameFragment,\n selectedCandidatePairId: this.iceTransport.connection.nominated\n ? generateStatsId(\n \"candidate-pair\",\n this.iceTransport.connection.nominated.id,\n )\n : undefined,\n localCertificateId: this.localCertificate\n ? generateStatsId(\"certificate\", this.id, \"local\")\n : undefined,\n remoteCertificateId: this.dtls?.remoteCertificate\n ? generateStatsId(\"certificate\", this.id, \"remote\")\n : undefined,\n dtlsRole: this.role === \"auto\" ? undefined : this.role,\n tlsVersion: formatDtlsVersion(this.dtls?.dtls.version),\n dtlsCipher: this.dtls?.cipher.cipher?.name,\n srtpCipher: formatSrtpCipher(this.dtls?.srtp.srtpProfile),\n iceRestarts: this.iceTransport.iceRestarts,\n };\n stats.push(transportStats);\n\n // Certificate stats\n if (this.localCertificate) {\n const fingerprints = this.localCertificate.getFingerprints();\n if (fingerprints.length > 0) {\n const certStats: RTCCertificateStats = {\n type: \"certificate\",\n id: generateStatsId(\"certificate\", this.id, \"local\"),\n timestamp,\n fingerprint: fingerprints[0].value,\n fingerprintAlgorithm: fingerprints[0].algorithm,\n base64Certificate: Buffer.from(\n this.localCertificate.certPem,\n ).toString(\"base64\"),\n };\n stats.push(certStats);\n }\n }\n\n if (\n this.remoteParameters &&\n this.remoteParameters.fingerprints.length > 0 &&\n this.dtls?.remoteCertificate\n ) {\n const certStats: RTCCertificateStats = {\n type: \"certificate\",\n id: generateStatsId(\"certificate\", this.id, \"remote\"),\n timestamp,\n fingerprint: this.remoteParameters.fingerprints[0].value,\n fingerprintAlgorithm: this.remoteParameters.fingerprints[0].algorithm,\n base64Certificate: Buffer.from(this.dtls.remoteCertificate).toString(\n \"base64\",\n ),\n };\n stats.push(certStats);\n }\n\n // Get ICE stats\n const iceStats = await this.iceTransport.getStats(timestamp, transportId);\n stats.push(...iceStats);\n\n return stats;\n }\n}\n\nexport const DtlsStates = [\n \"new\",\n \"connecting\",\n \"connected\",\n \"closed\",\n \"failed\",\n] as const;\nexport type DtlsState = (typeof DtlsStates)[number];\n\nexport type DtlsRole = \"auto\" | \"server\" | \"client\";\n\nexport class RTCCertificate {\n publicKey: string;\n privateKey: string;\n\n constructor(\n privateKeyPem: string,\n public certPem: string,\n public signatureHash: SignatureHash,\n ) {\n const cert = Certificate.fromPEM(Buffer.from(certPem));\n this.publicKey = cert.publicKey.toPEM();\n this.privateKey = PrivateKey.fromPEM(Buffer.from(privateKeyPem)).toPEM();\n }\n\n getFingerprints(): RTCDtlsFingerprint[] {\n return [\n new RTCDtlsFingerprint(\n \"sha-256\",\n fingerprint(\n Certificate.fromPEM(Buffer.from(this.certPem)).raw,\n \"sha256\",\n ),\n ),\n ];\n }\n}\n\nexport type DtlsKeys = {\n certPem: string;\n keyPem: string;\n signatureHash: SignatureHash;\n};\n\nexport class RTCDtlsFingerprint {\n constructor(\n public algorithm: string,\n public value: string,\n ) {}\n}\n\nexport class RTCDtlsParameters {\n constructor(\n public fingerprints: RTCDtlsFingerprint[] = [],\n public role: \"auto\" | \"client\" | \"server\",\n ) {}\n}\n\nconst deduplicateFingerprints = (fingerprints: RTCDtlsFingerprint[]) => {\n const seen = new Set<string>();\n return fingerprints.filter(({ algorithm, value }) => {\n const key = `${\n normalizeFingerprintAlgorithm(algorithm) ?? algorithm.trim().toLowerCase()\n }:${normalizeFingerprintValue(value)}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n};\n\nconst preferredFingerprintAlgorithms = [\n \"sha512\",\n \"sha384\",\n \"sha256\",\n \"sha224\",\n \"sha1\",\n] as const;\n\nconst selectPreferredFingerprintAlgorithm = (\n fingerprints: { normalizedAlgorithm: string }[],\n) => {\n return (\n preferredFingerprintAlgorithms.find((algorithm) =>\n fingerprints.some(\n ({ normalizedAlgorithm }) => normalizedAlgorithm === algorithm,\n ),\n ) ?? fingerprints[0].normalizedAlgorithm\n );\n};\n\nclass IceTransport implements Transport {\n closed: boolean = false;\n constructor(private ice: IceConnection) {\n ice.onData.subscribe((buf) => {\n if (isDtls(buf)) {\n if (this.onData) {\n this.onData(buf);\n }\n }\n });\n }\n onData: (buf: Buffer) => void = () => {};\n\n get address() {\n return {} as AddressInfo;\n }\n\n type: string = \"ice\";\n\n readonly send = (data: Buffer) => {\n return this.ice.send(data);\n };\n\n async close() {\n this.closed = true;\n this.ice.close();\n }\n}\n\nconst createIceTransport = (ice: IceConnection) => new IceTransport(ice);\n"]}
|
|
@@ -28,16 +28,34 @@ export declare class RTCIceTransport {
|
|
|
28
28
|
readonly id: string;
|
|
29
29
|
connection: IceConnection;
|
|
30
30
|
state: RTCIceConnectionState;
|
|
31
|
+
readonly component = "rtp";
|
|
32
|
+
iceRestarts: number;
|
|
31
33
|
private waitStart?;
|
|
32
34
|
private renominating;
|
|
33
|
-
readonly
|
|
35
|
+
private readonly events;
|
|
36
|
+
onstatechange?: () => void;
|
|
37
|
+
ongatheringstatechange?: () => void;
|
|
38
|
+
readonly onStateChange: Event<["closed" | "disconnected" | "completed" | "new" | "connected" | "failed" | "checking"]>;
|
|
34
39
|
readonly onIceCandidate: Event<[IceCandidate | undefined]>;
|
|
35
40
|
readonly onNegotiationNeeded: Event<[]>;
|
|
36
41
|
constructor(iceGather: RTCIceGatherer);
|
|
37
|
-
|
|
42
|
+
addEventListener: (type: string, listener: (...args: any[]) => void, options?: boolean | {
|
|
43
|
+
once?: boolean;
|
|
44
|
+
}) => void;
|
|
45
|
+
removeEventListener: (type: string, listener: (...args: any[]) => void) => void;
|
|
46
|
+
dispatchEvent: (event: globalThis.Event) => boolean;
|
|
47
|
+
get role(): "unknown" | "controlling" | "controlled";
|
|
38
48
|
get gatheringState(): "complete" | "new" | "gathering";
|
|
39
49
|
get localCandidates(): IceCandidate[];
|
|
40
50
|
get localParameters(): RTCIceParameters;
|
|
51
|
+
getRemoteCandidates(): RTCIceCandidate[];
|
|
52
|
+
getLocalCandidates(): RTCIceCandidate[];
|
|
53
|
+
getSelectedCandidatePair(): {
|
|
54
|
+
local: RTCIceCandidate;
|
|
55
|
+
remote: RTCIceCandidate;
|
|
56
|
+
} | null;
|
|
57
|
+
getLocalParameters(): RTCIceParameters;
|
|
58
|
+
getRemoteParameters(): RTCIceParameters | null;
|
|
41
59
|
private setState;
|
|
42
60
|
gather(): Promise<void>;
|
|
43
61
|
addRemoteCandidate: (candidate?: IceCandidate) => Promise<void> | undefined;
|
|
@@ -45,7 +63,7 @@ export declare class RTCIceTransport {
|
|
|
45
63
|
restart(): void;
|
|
46
64
|
start(): Promise<void>;
|
|
47
65
|
stop(): Promise<void>;
|
|
48
|
-
getStats(): Promise<RTCStats[]>;
|
|
66
|
+
getStats(timestamp?: number, transportId?: string): Promise<RTCStats[]>;
|
|
49
67
|
}
|
|
50
68
|
export declare const IceTransportStates: readonly ["new", "checking", "connected", "completed", "disconnected", "failed", "closed"];
|
|
51
69
|
export type RTCIceConnectionState = (typeof IceTransportStates)[number];
|
|
@@ -6,9 +6,26 @@ exports.candidateToIce = candidateToIce;
|
|
|
6
6
|
const crypto_1 = require("crypto");
|
|
7
7
|
const common_1 = require("../imports/common");
|
|
8
8
|
const src_1 = require("../../../ice/src");
|
|
9
|
+
const helper_1 = require("../helper");
|
|
9
10
|
const stats_1 = require("../media/stats");
|
|
10
11
|
const sdp_1 = require("../sdp");
|
|
11
12
|
const log = (0, common_1.debug)("werift:packages/webrtc/src/transport/ice.ts");
|
|
13
|
+
function mapCandidatePairState(state) {
|
|
14
|
+
switch (state) {
|
|
15
|
+
case 0:
|
|
16
|
+
return "frozen";
|
|
17
|
+
case 1:
|
|
18
|
+
return "waiting";
|
|
19
|
+
case 2:
|
|
20
|
+
return "in-progress";
|
|
21
|
+
case 3:
|
|
22
|
+
return "succeeded";
|
|
23
|
+
case 4:
|
|
24
|
+
return "failed";
|
|
25
|
+
default:
|
|
26
|
+
return "failed";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
12
29
|
/**
|
|
13
30
|
* +------------+
|
|
14
31
|
| |
|
|
@@ -57,6 +74,18 @@ class RTCIceTransport {
|
|
|
57
74
|
writable: true,
|
|
58
75
|
value: "new"
|
|
59
76
|
});
|
|
77
|
+
Object.defineProperty(this, "component", {
|
|
78
|
+
enumerable: true,
|
|
79
|
+
configurable: true,
|
|
80
|
+
writable: true,
|
|
81
|
+
value: "rtp"
|
|
82
|
+
});
|
|
83
|
+
Object.defineProperty(this, "iceRestarts", {
|
|
84
|
+
enumerable: true,
|
|
85
|
+
configurable: true,
|
|
86
|
+
writable: true,
|
|
87
|
+
value: 0
|
|
88
|
+
});
|
|
60
89
|
Object.defineProperty(this, "waitStart", {
|
|
61
90
|
enumerable: true,
|
|
62
91
|
configurable: true,
|
|
@@ -69,6 +98,24 @@ class RTCIceTransport {
|
|
|
69
98
|
writable: true,
|
|
70
99
|
value: false
|
|
71
100
|
});
|
|
101
|
+
Object.defineProperty(this, "events", {
|
|
102
|
+
enumerable: true,
|
|
103
|
+
configurable: true,
|
|
104
|
+
writable: true,
|
|
105
|
+
value: new helper_1.EventTarget()
|
|
106
|
+
});
|
|
107
|
+
Object.defineProperty(this, "onstatechange", {
|
|
108
|
+
enumerable: true,
|
|
109
|
+
configurable: true,
|
|
110
|
+
writable: true,
|
|
111
|
+
value: void 0
|
|
112
|
+
});
|
|
113
|
+
Object.defineProperty(this, "ongatheringstatechange", {
|
|
114
|
+
enumerable: true,
|
|
115
|
+
configurable: true,
|
|
116
|
+
writable: true,
|
|
117
|
+
value: void 0
|
|
118
|
+
});
|
|
72
119
|
Object.defineProperty(this, "onStateChange", {
|
|
73
120
|
enumerable: true,
|
|
74
121
|
configurable: true,
|
|
@@ -87,18 +134,37 @@ class RTCIceTransport {
|
|
|
87
134
|
writable: true,
|
|
88
135
|
value: new common_1.Event()
|
|
89
136
|
});
|
|
137
|
+
Object.defineProperty(this, "addEventListener", {
|
|
138
|
+
enumerable: true,
|
|
139
|
+
configurable: true,
|
|
140
|
+
writable: true,
|
|
141
|
+
value: (type, listener, options) => {
|
|
142
|
+
this.events.addEventListener(type, listener, options);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
Object.defineProperty(this, "removeEventListener", {
|
|
146
|
+
enumerable: true,
|
|
147
|
+
configurable: true,
|
|
148
|
+
writable: true,
|
|
149
|
+
value: (type, listener) => {
|
|
150
|
+
this.events.removeEventListener(type, listener);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
Object.defineProperty(this, "dispatchEvent", {
|
|
154
|
+
enumerable: true,
|
|
155
|
+
configurable: true,
|
|
156
|
+
writable: true,
|
|
157
|
+
value: (event) => this.events.dispatchEvent(event)
|
|
158
|
+
});
|
|
90
159
|
Object.defineProperty(this, "addRemoteCandidate", {
|
|
91
160
|
enumerable: true,
|
|
92
161
|
configurable: true,
|
|
93
162
|
writable: true,
|
|
94
163
|
value: (candidate) => {
|
|
95
164
|
if (!this.connection.remoteCandidatesEnd) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
else {
|
|
100
|
-
return this.connection.addRemoteCandidate(candidateToIce(candidate));
|
|
101
|
-
}
|
|
165
|
+
return !candidate
|
|
166
|
+
? this.connection.addRemoteCandidate(undefined)
|
|
167
|
+
: this.connection.addRemoteCandidate(candidateToIce(candidate));
|
|
102
168
|
}
|
|
103
169
|
}
|
|
104
170
|
});
|
|
@@ -109,8 +175,15 @@ class RTCIceTransport {
|
|
|
109
175
|
this.iceGather.onIceCandidate = (candidate) => {
|
|
110
176
|
this.onIceCandidate.execute(candidate);
|
|
111
177
|
};
|
|
178
|
+
this.iceGather.onGatheringStateChange.subscribe(() => {
|
|
179
|
+
this.ongatheringstatechange?.();
|
|
180
|
+
this.events.emit("gatheringstatechange");
|
|
181
|
+
});
|
|
112
182
|
}
|
|
113
183
|
get role() {
|
|
184
|
+
if (!this.connection.remoteUsername || !this.connection.remotePassword) {
|
|
185
|
+
return "unknown";
|
|
186
|
+
}
|
|
114
187
|
if (this.connection.iceControlling)
|
|
115
188
|
return "controlling";
|
|
116
189
|
else
|
|
@@ -125,10 +198,46 @@ class RTCIceTransport {
|
|
|
125
198
|
get localParameters() {
|
|
126
199
|
return this.iceGather.localParameters;
|
|
127
200
|
}
|
|
128
|
-
|
|
201
|
+
getRemoteCandidates() {
|
|
202
|
+
return this.connection.remoteCandidates
|
|
203
|
+
.filter((candidate) => candidate.type !== "prflx")
|
|
204
|
+
.map((candidate) => candidateFromIce(candidate).toJSON());
|
|
205
|
+
}
|
|
206
|
+
getLocalCandidates() {
|
|
207
|
+
return this.connection.localCandidates.map((candidate) => candidateFromIce(candidate).toJSON());
|
|
208
|
+
}
|
|
209
|
+
getSelectedCandidatePair() {
|
|
210
|
+
const pair = this.connection.candidatePairs.find((candidate) => candidate.nominated) ??
|
|
211
|
+
this.connection.candidatePairs.find((candidate) => candidate.state === 3);
|
|
212
|
+
if (!pair) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
local: candidateFromIce(pair.localCandidate).toJSON(),
|
|
217
|
+
remote: candidateFromIce(pair.remoteCandidate).toJSON(),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
getLocalParameters() {
|
|
221
|
+
return this.localParameters ?? null;
|
|
222
|
+
}
|
|
223
|
+
getRemoteParameters() {
|
|
224
|
+
if (!this.connection.remoteUsername || !this.connection.remotePassword) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
return new RTCIceParameters({
|
|
228
|
+
iceLite: this.connection.remoteIsLite,
|
|
229
|
+
password: this.connection.remotePassword,
|
|
230
|
+
usernameFragment: this.connection.remoteUsername,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
setState(state, emitEvent = true) {
|
|
129
234
|
if (state !== this.state) {
|
|
130
235
|
this.state = state;
|
|
131
236
|
this.onStateChange.execute(state);
|
|
237
|
+
if (emitEvent) {
|
|
238
|
+
this.onstatechange?.();
|
|
239
|
+
this.events.emit("statechange");
|
|
240
|
+
}
|
|
132
241
|
}
|
|
133
242
|
}
|
|
134
243
|
gather() {
|
|
@@ -155,6 +264,7 @@ class RTCIceTransport {
|
|
|
155
264
|
this.connection.setRemoteParams(remoteParameters);
|
|
156
265
|
}
|
|
157
266
|
restart() {
|
|
267
|
+
this.iceRestarts++;
|
|
158
268
|
this.connection.restart();
|
|
159
269
|
this.setState("new");
|
|
160
270
|
this.iceGather.gatheringState = "new";
|
|
@@ -186,46 +296,52 @@ class RTCIceTransport {
|
|
|
186
296
|
}
|
|
187
297
|
async stop() {
|
|
188
298
|
if (this.state !== "closed") {
|
|
189
|
-
this.setState("closed");
|
|
299
|
+
this.setState("closed", false);
|
|
190
300
|
await this.connection.close();
|
|
191
301
|
}
|
|
192
302
|
this.onStateChange.complete();
|
|
193
303
|
this.onIceCandidate.complete();
|
|
194
304
|
this.onNegotiationNeeded.complete();
|
|
195
305
|
}
|
|
196
|
-
async getStats() {
|
|
197
|
-
const timestamp = (0, stats_1.getStatsTimestamp)();
|
|
306
|
+
async getStats(timestamp = (0, stats_1.getStatsTimestamp)(), transportId = (0, stats_1.generateStatsId)("transport", this.id)) {
|
|
198
307
|
const stats = [];
|
|
199
308
|
// Local candidates
|
|
200
|
-
for (const candidate of this.localCandidates) {
|
|
309
|
+
for (const candidate of this.connection.localCandidates) {
|
|
201
310
|
const candidateStats = {
|
|
202
311
|
type: "local-candidate",
|
|
203
|
-
id: (0, stats_1.generateStatsId)("local-candidate", candidate.
|
|
312
|
+
id: (0, stats_1.generateStatsId)("local-candidate", candidate.id),
|
|
204
313
|
timestamp,
|
|
205
|
-
transportId
|
|
206
|
-
address: candidate.
|
|
314
|
+
transportId,
|
|
315
|
+
address: candidate.host,
|
|
207
316
|
port: candidate.port,
|
|
208
|
-
protocol: candidate.
|
|
317
|
+
protocol: candidate.transport,
|
|
209
318
|
candidateType: candidate.type,
|
|
210
319
|
priority: candidate.priority,
|
|
211
320
|
foundation: candidate.foundation,
|
|
321
|
+
relatedAddress: candidate.relatedAddress,
|
|
322
|
+
relatedPort: candidate.relatedPort,
|
|
323
|
+
usernameFragment: candidate.ufrag,
|
|
324
|
+
tcpType: candidate.tcptype,
|
|
212
325
|
};
|
|
213
326
|
stats.push(candidateStats);
|
|
214
327
|
}
|
|
215
328
|
// Remote candidates
|
|
216
329
|
for (const candidate of this.connection.remoteCandidates) {
|
|
217
|
-
const ice = candidateFromIce(candidate);
|
|
218
330
|
const candidateStats = {
|
|
219
331
|
type: "remote-candidate",
|
|
220
|
-
id: (0, stats_1.generateStatsId)("remote-candidate",
|
|
332
|
+
id: (0, stats_1.generateStatsId)("remote-candidate", candidate.id),
|
|
221
333
|
timestamp,
|
|
222
|
-
transportId
|
|
223
|
-
address:
|
|
224
|
-
port:
|
|
225
|
-
protocol:
|
|
226
|
-
candidateType:
|
|
227
|
-
priority:
|
|
228
|
-
foundation:
|
|
334
|
+
transportId,
|
|
335
|
+
address: candidate.host,
|
|
336
|
+
port: candidate.port,
|
|
337
|
+
protocol: candidate.transport,
|
|
338
|
+
candidateType: candidate.type,
|
|
339
|
+
priority: candidate.priority,
|
|
340
|
+
foundation: candidate.foundation,
|
|
341
|
+
relatedAddress: candidate.relatedAddress,
|
|
342
|
+
relatedPort: candidate.relatedPort,
|
|
343
|
+
usernameFragment: candidate.ufrag,
|
|
344
|
+
tcpType: candidate.tcptype,
|
|
229
345
|
};
|
|
230
346
|
stats.push(candidateStats);
|
|
231
347
|
}
|
|
@@ -239,18 +355,27 @@ class RTCIceTransport {
|
|
|
239
355
|
for (const pair of pairs) {
|
|
240
356
|
const pairStats = {
|
|
241
357
|
type: "candidate-pair",
|
|
242
|
-
id: (0, stats_1.generateStatsId)("candidate-pair", pair.
|
|
358
|
+
id: (0, stats_1.generateStatsId)("candidate-pair", pair.id),
|
|
243
359
|
timestamp,
|
|
244
|
-
transportId
|
|
245
|
-
localCandidateId: (0, stats_1.generateStatsId)("local-candidate", pair.localCandidate.
|
|
246
|
-
remoteCandidateId: (0, stats_1.generateStatsId)("remote-candidate", pair.remoteCandidate.
|
|
247
|
-
state: pair.state,
|
|
360
|
+
transportId,
|
|
361
|
+
localCandidateId: (0, stats_1.generateStatsId)("local-candidate", pair.localCandidate.id),
|
|
362
|
+
remoteCandidateId: (0, stats_1.generateStatsId)("remote-candidate", pair.remoteCandidate.id),
|
|
363
|
+
state: mapCandidatePairState(pair.state),
|
|
248
364
|
nominated: pair.nominated,
|
|
249
365
|
packetsSent: pair.packetsSent,
|
|
250
366
|
packetsReceived: pair.packetsReceived,
|
|
251
367
|
bytesSent: pair.bytesSent,
|
|
252
368
|
bytesReceived: pair.bytesReceived,
|
|
253
369
|
currentRoundTripTime: pair.rtt,
|
|
370
|
+
totalRoundTripTime: pair.totalRoundTripTime,
|
|
371
|
+
roundTripTimeMeasurements: pair.roundTripTimeMeasurements,
|
|
372
|
+
requestsReceived: pair.requestsReceived,
|
|
373
|
+
requestsSent: pair.requestsSent,
|
|
374
|
+
responsesReceived: pair.responsesReceived,
|
|
375
|
+
responsesSent: pair.responsesSent,
|
|
376
|
+
retransmissionsReceived: pair.retransmissionsReceived,
|
|
377
|
+
retransmissionsSent: pair.retransmissionsSent,
|
|
378
|
+
consentRequestsSent: pair.consentRequestsSent,
|
|
254
379
|
};
|
|
255
380
|
stats.push(pairStats);
|
|
256
381
|
}
|
|
@@ -318,6 +443,7 @@ class RTCIceGatherer {
|
|
|
318
443
|
}
|
|
319
444
|
get localParameters() {
|
|
320
445
|
const params = new RTCIceParameters({
|
|
446
|
+
iceLite: this.connection.iceLite,
|
|
321
447
|
usernameFragment: this.connection.localUsername,
|
|
322
448
|
password: this.connection.localPassword,
|
|
323
449
|
});
|
|
@@ -493,7 +619,10 @@ class IceCandidate {
|
|
|
493
619
|
if (!data.candidate) {
|
|
494
620
|
throw new Error("candidate is required");
|
|
495
621
|
}
|
|
496
|
-
const
|
|
622
|
+
const normalizedCandidate = data.candidate.startsWith("candidate:")
|
|
623
|
+
? data.candidate.slice("candidate:".length)
|
|
624
|
+
: data.candidate;
|
|
625
|
+
const candidate = (0, sdp_1.candidateFromSdp)(normalizedCandidate);
|
|
497
626
|
candidate.sdpMLineIndex = data.sdpMLineIndex ?? undefined;
|
|
498
627
|
candidate.sdpMid = data.sdpMid ?? undefined;
|
|
499
628
|
return candidate;
|