werift 0.22.0 → 0.22.2
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/common/src/binary.d.ts +6 -6
- package/lib/common/src/event.d.ts +1 -0
- package/lib/common/src/event.js +5 -0
- package/lib/common/src/event.js.map +1 -1
- package/lib/common/src/log.d.ts +1 -2
- package/lib/common/src/transport.d.ts +2 -1
- package/lib/common/src/transport.js +28 -14
- package/lib/common/src/transport.js.map +1 -1
- package/lib/dtls/src/cipher/prf.d.ts +12 -12
- package/lib/dtls/src/cipher/suites/aead.d.ts +3 -2
- package/lib/dtls/src/cipher/suites/aead.js +31 -38
- package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
- package/lib/dtls/src/context/cipher.d.ts +4 -4
- package/lib/dtls/src/context/cipher.js +21 -10
- package/lib/dtls/src/context/cipher.js.map +1 -1
- package/lib/dtls/src/context/srtp.d.ts +3 -3
- package/lib/dtls/src/context/srtp.js.map +1 -1
- package/lib/dtls/src/flight/client/flight5.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/ellipticCurves.d.ts +1 -1
- package/lib/dtls/src/handshake/extensions/renegotiationIndication.d.ts +2 -2
- package/lib/dtls/src/handshake/extensions/signature.d.ts +2 -2
- package/lib/dtls/src/handshake/extensions/useSrtp.d.ts +1 -1
- package/lib/dtls/src/handshake/message/alert.d.ts +1 -1
- package/lib/dtls/src/handshake/message/certificate.d.ts +1 -1
- package/lib/dtls/src/handshake/message/changeCipherSpec.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/certificateVerify.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/hello.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/keyExchange.d.ts +1 -1
- package/lib/dtls/src/handshake/message/finished.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/certificateRequest.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/hello.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/helloDone.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/helloVerifyRequest.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/keyExchange.d.ts +1 -1
- package/lib/dtls/src/handshake/random.d.ts +3 -3
- package/lib/dtls/src/record/message/fragment.d.ts +1 -1
- package/lib/dtls/src/record/message/header.d.ts +2 -19
- package/lib/dtls/src/record/message/header.js +1 -60
- package/lib/dtls/src/record/message/header.js.map +1 -1
- package/lib/dtls/src/record/message/plaintext.d.ts +6 -27
- package/lib/dtls/src/record/message/plaintext.js +34 -16
- package/lib/dtls/src/record/message/plaintext.js.map +1 -1
- package/lib/dtls/src/socket.d.ts +4 -4
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/dtls/src/util/binary.d.ts +1 -1
- package/lib/ice/src/helper.d.ts +1 -1
- package/lib/ice/src/ice.d.ts +4 -3
- package/lib/ice/src/ice.js +89 -68
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +20 -1
- package/lib/ice/src/iceBase.js +46 -0
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/stun/attributes.d.ts +2 -2
- package/lib/ice/src/stun/attributes.js +47 -27
- package/lib/ice/src/stun/attributes.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +2 -2
- package/lib/ice/src/stun/message.js +21 -23
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +2 -2
- package/lib/ice/src/turn/protocol.d.ts +2 -2
- package/lib/index.mjs +2252 -1474
- package/lib/nonstandard/index.mjs +333 -370
- package/lib/rtp/src/codec/av1.d.ts +2 -2
- package/lib/rtp/src/codec/opus.d.ts +1 -1
- package/lib/rtp/src/extra/container/mp4/container.js +18 -8
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.d.ts +2 -2
- package/lib/rtp/src/extra/container/mp4/sps-parser.d.ts +1 -1
- package/lib/rtp/src/extra/container/ogg/parser.d.ts +1 -1
- package/lib/rtp/src/extra/container/webm/container.d.ts +7 -7
- package/lib/rtp/src/extra/container/webm/container.js +17 -7
- package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/ebml.d.ts +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/id.d.ts +222 -222
- package/lib/rtp/src/extra/processor/depacketizerCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/depacketizerTransformer.d.ts +6 -1
- package/lib/rtp/src/extra/processor/dtxCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/interface.d.ts +1 -1
- package/lib/rtp/src/extra/processor/jitterBufferCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/mp4.js +3 -0
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/nackHandlerCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/ntpTimeCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/rtpTimeCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/webm.d.ts +1 -1
- package/lib/rtp/src/extra/processor/webmCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/webmCallback.js +23 -17
- package/lib/rtp/src/extra/processor/webmCallback.js.map +1 -1
- package/lib/rtp/src/helper.d.ts +1 -1
- package/lib/rtp/src/rtcp/header.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/fullIntraRequest.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/index.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/pictureLossIndication.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/remb.d.ts +1 -1
- package/lib/rtp/src/rtcp/rr.d.ts +2 -2
- package/lib/rtp/src/rtcp/rtcp.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/nack.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/twcc.d.ts +4 -4
- package/lib/rtp/src/rtcp/sdes.d.ts +3 -3
- package/lib/rtp/src/rtcp/sr.d.ts +2 -2
- package/lib/rtp/src/rtp/headerExtension.d.ts +6 -6
- package/lib/rtp/src/rtp/red/packet.d.ts +2 -2
- package/lib/rtp/src/rtp/rtp.d.ts +2 -2
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +4 -4
- package/lib/rtp/src/srtp/cipher/gcm.d.ts +4 -4
- package/lib/rtp/src/srtp/const.d.ts +3 -3
- package/lib/rtp/src/srtp/const.js.map +1 -1
- package/lib/rtp/src/srtp/context/context.d.ts +7 -7
- package/lib/rtp/src/srtp/context/context.js +10 -4
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtcp.d.ts +3 -3
- package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtp.d.ts +3 -3
- package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
- package/lib/rtp/src/srtp/srtcp.d.ts +2 -2
- package/lib/rtp/src/srtp/srtp.d.ts +2 -2
- package/lib/sctp/src/chunk.d.ts +12 -12
- package/lib/sctp/src/chunk.js +87 -66
- package/lib/sctp/src/chunk.js.map +1 -1
- package/lib/sctp/src/param.d.ts +3 -3
- package/lib/sctp/src/sctp.d.ts +3 -1
- package/lib/sctp/src/sctp.js +36 -1
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/dataChannel.d.ts +15 -4
- package/lib/webrtc/src/dataChannel.js +42 -7
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/index.d.ts +1 -0
- package/lib/webrtc/src/index.js +1 -0
- package/lib/webrtc/src/index.js.map +1 -1
- package/lib/webrtc/src/media/index.d.ts +1 -0
- package/lib/webrtc/src/media/index.js +1 -0
- package/lib/webrtc/src/media/index.js.map +1 -1
- package/lib/webrtc/src/media/parameters.d.ts +2 -2
- package/lib/webrtc/src/media/parameters.js.map +1 -1
- package/lib/webrtc/src/media/router.js +2 -1
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +2 -2
- package/lib/webrtc/src/media/rtpReceiver.js +51 -2
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +6 -0
- package/lib/webrtc/src/media/rtpSender.js +78 -7
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +12 -9
- package/lib/webrtc/src/media/rtpTransceiver.js +45 -8
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/stats.d.ts +279 -0
- package/lib/webrtc/src/media/stats.js +35 -1
- package/lib/webrtc/src/media/stats.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +34 -64
- package/lib/webrtc/src/peerConnection.js +319 -986
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sctpManager.d.ts +27 -0
- package/lib/webrtc/src/sctpManager.js +147 -0
- package/lib/webrtc/src/sctpManager.js.map +1 -0
- package/lib/webrtc/src/sdp.d.ts +3 -2
- package/lib/webrtc/src/sdp.js +17 -7
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +78 -0
- package/lib/webrtc/src/sdpManager.js +391 -0
- package/lib/webrtc/src/sdpManager.js.map +1 -0
- package/lib/webrtc/src/secureTransportManager.d.ts +56 -0
- package/lib/webrtc/src/secureTransportManager.js +345 -0
- package/lib/webrtc/src/secureTransportManager.js.map +1 -0
- package/lib/webrtc/src/transceiverManager.d.ts +40 -0
- package/lib/webrtc/src/transceiverManager.js +355 -0
- package/lib/webrtc/src/transceiverManager.js.map +1 -0
- package/lib/webrtc/src/transport/dtls.d.ts +18 -6
- package/lib/webrtc/src/transport/dtls.js +119 -11
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +24 -0
- package/lib/webrtc/src/transport/ice.js +86 -0
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.js +22 -7
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +3 -3
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +15 -21
|
@@ -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 { setTimeout } from \"timers/promises\";\nimport { v4 } from \"uuid\";\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 Profile,\n type RtcpPacket,\n RtcpPacketConverter,\n type RtpHeader,\n RtpPacket,\n SrtcpSession,\n SrtpSession,\n debug,\n isMedia,\n isRtcp,\n keyLength,\n saltLength,\n} from \"../imports/rtp\";\nimport type { RtpRouter } from \"../media/router\";\nimport type { PeerConfig } from \"../peerConnection\";\nimport { fingerprint, isDtls } from \"../utils\";\nimport type { RTCIceTransport } from \"./ice\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/dtls.ts\");\n\nexport class RTCDtlsTransport {\n id = v4();\n state: DtlsState = \"new\";\n role: DtlsRole = \"auto\";\n srtpStarted = false;\n transportSequenceNumber = 0;\n\n dataReceiver: (buf: Buffer) => void = () => {};\n dtls?: DtlsSocket;\n srtp!: SrtpSession;\n srtcp!: SrtcpSession;\n\n readonly onStateChange = new Event<[DtlsState]>();\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 readonly router: RtpRouter,\n public localCertificate?: RTCCertificate,\n private readonly srtpProfiles: Profile[] = [],\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 this.remoteParameters = remoteParameters;\n }\n\n async start() {\n if (this.state !== \"new\") {\n throw new Error(\"state must be new\");\n }\n if (this.remoteParameters?.fingerprints.length === 0) {\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 this.setState(\"closed\");\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 if (this.srtpProfiles.length > 0) {\n this.startSrtp();\n }\n this.dtls!.onConnect.subscribe(() => {\n this.updateSrtpSession();\n this.setState(\"connected\");\n });\n this.setState(\"connected\");\n\n log(\"dtls connected\");\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 if (isRtcp(data)) {\n const dec = this.srtcp.decrypt(data);\n const rtcps = RtcpPacketConverter.deSerialize(dec);\n rtcps.forEach((rtcp) => this.router.routeRtcp(rtcp));\n } else {\n const dec = this.srtp.decrypt(data);\n const rtp = RtpPacket.deSerialize(dec);\n try {\n this.router.routeRtp(rtp);\n } catch (error) {\n log(\"router 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 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 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 }\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\nclass IceTransport implements Transport {\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.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 { setTimeout } from \"timers/promises\";\nimport { v4 } from \"uuid\";\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 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 { fingerprint, isDtls } 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 = v4();\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 this.remoteParameters = remoteParameters;\n }\n\n async start() {\n if (this.state !== \"new\") {\n throw new Error(\"state must be new\");\n }\n if (this.remoteParameters?.fingerprints.length === 0) {\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 this.setState(\"closed\");\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 if (this.srtpProfiles.length > 0) {\n this.startSrtp();\n }\n this.dtls!.onConnect.subscribe(() => {\n this.updateSrtpSession();\n this.setState(\"connected\");\n });\n this.setState(\"connected\");\n\n log(\"dtls connected\");\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 const dec = this.srtcp.decrypt(data);\n const rtcpPackets = RtcpPacketConverter.deSerialize(dec);\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 const dec = this.srtp.decrypt(data);\n const rtp = RtpPacket.deSerialize(dec);\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\nclass IceTransport implements Transport {\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.ice.close();\n }\n}\n\nconst createIceTransport = (ice: IceConnection) => new IceTransport(ice);\n"]}
|
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
import { Event } from "../imports/common";
|
|
2
2
|
import { Candidate, type IceConnection, type IceOptions } from "../../../ice/src";
|
|
3
|
+
import { type RTCStats } from "../media/stats";
|
|
4
|
+
/**
|
|
5
|
+
* +------------+
|
|
6
|
+
| |
|
|
7
|
+
|disconnected|
|
|
8
|
+
| |
|
|
9
|
+
+------------+
|
|
10
|
+
^ ^
|
|
11
|
+
| |
|
|
12
|
+
+------+ +----------+ +-----------+ +----------+
|
|
13
|
+
| | | | | | | |
|
|
14
|
+
| new | ---> | checking | ---> | connected | ---> | completed|
|
|
15
|
+
| | | | | | | |
|
|
16
|
+
+------+ +----+-----+ +-----------+ +----------+
|
|
17
|
+
|
|
|
18
|
+
|
|
|
19
|
+
v
|
|
20
|
+
+-------+
|
|
21
|
+
| |
|
|
22
|
+
| failed|
|
|
23
|
+
| |
|
|
24
|
+
+-------+
|
|
25
|
+
*/
|
|
3
26
|
export declare class RTCIceTransport {
|
|
4
27
|
private iceGather;
|
|
5
28
|
readonly id: string;
|
|
@@ -22,6 +45,7 @@ export declare class RTCIceTransport {
|
|
|
22
45
|
restart(): void;
|
|
23
46
|
start(): Promise<void>;
|
|
24
47
|
stop(): Promise<void>;
|
|
48
|
+
getStats(): Promise<RTCStats[]>;
|
|
25
49
|
}
|
|
26
50
|
export declare const IceTransportStates: readonly ["new", "checking", "connected", "completed", "disconnected", "failed", "closed"];
|
|
27
51
|
export type RTCIceConnectionState = (typeof IceTransportStates)[number];
|
|
@@ -6,8 +6,31 @@ exports.candidateToIce = candidateToIce;
|
|
|
6
6
|
const uuid_1 = require("uuid");
|
|
7
7
|
const common_1 = require("../imports/common");
|
|
8
8
|
const src_1 = require("../../../ice/src");
|
|
9
|
+
const stats_1 = require("../media/stats");
|
|
9
10
|
const sdp_1 = require("../sdp");
|
|
10
11
|
const log = (0, common_1.debug)("werift:packages/webrtc/src/transport/ice.ts");
|
|
12
|
+
/**
|
|
13
|
+
* +------------+
|
|
14
|
+
| |
|
|
15
|
+
|disconnected|
|
|
16
|
+
| |
|
|
17
|
+
+------------+
|
|
18
|
+
^ ^
|
|
19
|
+
| |
|
|
20
|
+
+------+ +----------+ +-----------+ +----------+
|
|
21
|
+
| | | | | | | |
|
|
22
|
+
| new | ---> | checking | ---> | connected | ---> | completed|
|
|
23
|
+
| | | | | | | |
|
|
24
|
+
+------+ +----+-----+ +-----------+ +----------+
|
|
25
|
+
|
|
|
26
|
+
|
|
|
27
|
+
v
|
|
28
|
+
+-------+
|
|
29
|
+
| |
|
|
30
|
+
| failed|
|
|
31
|
+
| |
|
|
32
|
+
+-------+
|
|
33
|
+
*/
|
|
11
34
|
class RTCIceTransport {
|
|
12
35
|
constructor(iceGather) {
|
|
13
36
|
Object.defineProperty(this, "iceGather", {
|
|
@@ -170,6 +193,69 @@ class RTCIceTransport {
|
|
|
170
193
|
this.onIceCandidate.complete();
|
|
171
194
|
this.onNegotiationNeeded.complete();
|
|
172
195
|
}
|
|
196
|
+
async getStats() {
|
|
197
|
+
const timestamp = (0, stats_1.getStatsTimestamp)();
|
|
198
|
+
const stats = [];
|
|
199
|
+
// Local candidates
|
|
200
|
+
for (const candidate of this.localCandidates) {
|
|
201
|
+
const candidateStats = {
|
|
202
|
+
type: "local-candidate",
|
|
203
|
+
id: (0, stats_1.generateStatsId)("local-candidate", candidate.foundation),
|
|
204
|
+
timestamp,
|
|
205
|
+
transportId: (0, stats_1.generateStatsId)("transport", this.id),
|
|
206
|
+
address: candidate.ip,
|
|
207
|
+
port: candidate.port,
|
|
208
|
+
protocol: candidate.protocol,
|
|
209
|
+
candidateType: candidate.type,
|
|
210
|
+
priority: candidate.priority,
|
|
211
|
+
foundation: candidate.foundation,
|
|
212
|
+
};
|
|
213
|
+
stats.push(candidateStats);
|
|
214
|
+
}
|
|
215
|
+
// Remote candidates
|
|
216
|
+
for (const candidate of this.connection.remoteCandidates) {
|
|
217
|
+
const ice = candidateFromIce(candidate);
|
|
218
|
+
const candidateStats = {
|
|
219
|
+
type: "remote-candidate",
|
|
220
|
+
id: (0, stats_1.generateStatsId)("remote-candidate", ice.foundation),
|
|
221
|
+
timestamp,
|
|
222
|
+
transportId: (0, stats_1.generateStatsId)("transport", this.id),
|
|
223
|
+
address: ice.ip,
|
|
224
|
+
port: ice.port,
|
|
225
|
+
protocol: ice.protocol,
|
|
226
|
+
candidateType: ice.type,
|
|
227
|
+
priority: ice.priority,
|
|
228
|
+
foundation: ice.foundation,
|
|
229
|
+
};
|
|
230
|
+
stats.push(candidateStats);
|
|
231
|
+
}
|
|
232
|
+
// Candidate pairs
|
|
233
|
+
const pairs = this.connection?.candidatePairs
|
|
234
|
+
? [
|
|
235
|
+
...this.connection.candidatePairs.filter((p) => p.nominated),
|
|
236
|
+
...this.connection.candidatePairs.filter((p) => !p.nominated),
|
|
237
|
+
]
|
|
238
|
+
: [];
|
|
239
|
+
for (const pair of pairs) {
|
|
240
|
+
const pairStats = {
|
|
241
|
+
type: "candidate-pair",
|
|
242
|
+
id: (0, stats_1.generateStatsId)("candidate-pair", pair.foundation),
|
|
243
|
+
timestamp,
|
|
244
|
+
transportId: (0, stats_1.generateStatsId)("transport", this.id),
|
|
245
|
+
localCandidateId: (0, stats_1.generateStatsId)("local-candidate", pair.localCandidate.foundation),
|
|
246
|
+
remoteCandidateId: (0, stats_1.generateStatsId)("remote-candidate", pair.remoteCandidate.foundation),
|
|
247
|
+
state: pair.state,
|
|
248
|
+
nominated: pair.nominated,
|
|
249
|
+
packetsSent: pair.packetsSent,
|
|
250
|
+
packetsReceived: pair.packetsReceived,
|
|
251
|
+
bytesSent: pair.bytesSent,
|
|
252
|
+
bytesReceived: pair.bytesReceived,
|
|
253
|
+
currentRoundTripTime: pair.rtt,
|
|
254
|
+
};
|
|
255
|
+
stats.push(pairStats);
|
|
256
|
+
}
|
|
257
|
+
return stats;
|
|
258
|
+
}
|
|
173
259
|
}
|
|
174
260
|
exports.RTCIceTransport = RTCIceTransport;
|
|
175
261
|
exports.IceTransportStates = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../src/transport/ice.ts"],"names":[],"mappings":";;;AAuMA,4CAgBC;AAED,wCAeC;AAxOD,+BAA0B;AAC1B,8CAAiD;AAEjD,0CAK0B;AAC1B,gCAA0D;AAE1D,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,6CAA6C,CAAC,CAAC;AAEjE,MAAa,eAAe;IAW1B,YAAoB,SAAyB;QAAjC;;;;mBAAQ,SAAS;WAAgB;QAVpC;;;;mBAAK,IAAA,SAAE,GAAE;WAAC;QACnB;;;;;WAA0B;QAC1B;;;;mBAA+B,KAAK;WAAC;QAC7B;;;;;WAAsB;QACtB;;;;mBAAe,KAAK;WAAC;QAEpB;;;;mBAAgB,IAAI,cAAK,EAA2B;WAAC;QACrD;;;;mBAAiB,IAAI,cAAK,EAA8B;WAAC;QACzD;;;;mBAAsB,IAAI,cAAK,EAAM;WAAC;QAyC/C;;;;mBAAqB,CAAC,SAAwB,EAAE,EAAE;gBAChD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;oBACzC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;oBACvD,CAAC;yBAAM,CAAC;wBACN,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;oBACvE,CAAC;gBACH,CAAC;YACH,CAAC;WAAC;QA9CA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QAC5C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,cAAc,GAAG,CAAC,SAAS,EAAE,EAAE;YAC5C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,IAAI;QACN,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc;YAAE,OAAO,aAAa,CAAC;;YACpD,OAAO,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;IACvC,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;IACxC,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;IACxC,CAAC;IAEO,QAAQ,CAAC,KAA4B;QAC3C,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YAEnB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IAYD,eAAe,CAAC,gBAAkC,EAAE,YAAY,GAAG,KAAK;QACtE,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QACD,IACE,IAAI,CAAC,UAAU,CAAC,cAAc;YAC9B,IAAI,CAAC,UAAU,CAAC,cAAc;YAC9B,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,gBAAgB,CAAC,gBAAgB;gBACnE,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,gBAAgB,CAAC,QAAQ,CAAC,EAC/D,CAAC;YACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;gBACtC,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC;gBACrC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;gBACjC,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;IACpD,CAAC;IAED,OAAO;QACL,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,cAAc,GAAG,KAAK,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,cAAK,EAAE,CAAC;QAE7B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC;IACtC,CAAC;CACF;AA9HD,0CA8HC;AAEY,QAAA,kBAAkB,GAAG;IAChC,KAAK;IACL,UAAU;IACV,WAAW;IACX,WAAW;IACX,cAAc;IACd,QAAQ;IACR,QAAQ;CACA,CAAC;AAGE,QAAA,iBAAiB,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAU,CAAC;AAG3E,MAAa,cAAc;IAOzB,YAAoB,UAA+B,EAAE;QAAzC;;;;mBAAQ,OAAO;WAA0B;QANrD;;;;mBAAgE,GAAG,EAAE,GAAE,CAAC;WAAC;QACzE;;;;mBAAmC,KAAK;WAAC;QAChC;;;;;WAA0B;QAE1B;;;;mBAAyB,IAAI,cAAK,EAAsB;WAAC;QAGhE,IAAI,CAAC,UAAU,GAAG,IAAI,gBAAU,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YACrD,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC3B,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;YACzC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,eAAe;QACjB,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC;YAClC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa;YAC/C,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa;SACxC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,QAAQ,CAAC,KAAuB;QACtC,IAAI,KAAK,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;CACF;AA1CD,wCA0CC;AAED,SAAgB,gBAAgB,CAAC,CAAY;IAC3C,MAAM,SAAS,GAAG,IAAI,YAAY,CAChC,CAAC,CAAC,SAAS,EACX,CAAC,CAAC,UAAU,EACZ,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,QAAQ,EACV,CAAC,CAAC,SAAS,EACX,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,UAAU,EACZ,CAAC,CAAC,KAAK,CACR,CAAC;IACF,SAAS,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;IAC5C,SAAS,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;IACtC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;IAC9B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,cAAc,CAAC,CAAe;IAC5C,OAAO,IAAI,eAAS,CAClB,CAAC,CAAC,UAAU,EACZ,CAAC,CAAC,SAAS,EACX,CAAC,CAAC,QAAQ,EACV,CAAC,CAAC,QAAQ,EACV,CAAC,CAAC,EAAE,EACJ,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,cAAc,EAChB,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,UAAU,EACZ,CAAC,CAAC,KAAK,CACR,CAAC;AACJ,CAAC;AASD,MAAa,eAAe;IAM1B,YAAY,KAA+B;QAL3C;;;;;WAAmB;QACnB;;;;;WAAgB;QAChB;;;;;WAAuB;QACvB;;;;;WAA0B;QAGxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,GAAW;QACxB,MAAM,GAAG,GAAG,eAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,SAAS,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,CAAM;QAClB,IAAI,OAAO,CAAC,EAAE,SAAS,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;IACpD,CAAC;IAED,MAAM;QACJ,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SACxC,CAAC;IACJ,CAAC;CACF;AA5BD,0CA4BC;AAED,MAAa,YAAY;IAYvB,YACS,SAAiB,EACjB,UAAkB,EAClB,EAAU,EACV,IAAY,EACZ,QAAgB,EAChB,QAAgB,EAChB,IAAY,EACZ,UAAmB,EACnB,KAAc;QARrB;;;;mBAAO,SAAS;WAAQ;QACxB;;;;mBAAO,UAAU;WAAQ;QACzB;;;;mBAAO,EAAE;WAAQ;QACjB;;;;mBAAO,IAAI;WAAQ;QACnB;;;;mBAAO,QAAQ;WAAQ;QACvB;;;;mBAAO,QAAQ;WAAQ;QACvB;;;;mBAAO,IAAI;WAAQ;QACnB;;;;mBAAO,UAAU;WAAS;QAC1B;;;;mBAAO,KAAK;WAAS;QApBvB,MAAM;QACN,4EAA4E;QAC5E,sEAAsE;QACtE,kCAAkC;QAClC,MAAM;QACC;;;;;WAAwB;QACxB;;;;;WAAqB;QACrB;;;;;WAAgB;QAChB;;;;;WAAuB;QACvB;;;;;WAAiB;IAYrB,CAAC;IAEJ,MAAM;QACJ,OAAO,IAAI,eAAe,CAAC;YACzB,SAAS,EAAE,IAAA,oBAAc,EAAC,IAAI,CAAC;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,gBAAgB,EAAE,IAAI,CAAC,KAAK;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAA2C;QACzD,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YACD,MAAM,SAAS,GAAG,IAAA,sBAAgB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,SAAS,CAAC;YAC1D,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;YAC5C,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC,CAAA,CAAC;IACpB,CAAC;CACF;AA5CD,oCA4CC;AAED,MAAa,gBAAgB;IAK3B,YAAY,QAAmC,EAAE;QAJjD;;;;mBAAU,KAAK;WAAC;QAChB;;;;;WAA0B;QAC1B;;;;;WAAkB;QAGhB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AARD,4CAQC","sourcesContent":["import { v4 } from \"uuid\";\nimport { Event, debug } from \"../imports/common\";\n\nimport {\n Candidate,\n Connection,\n type IceConnection,\n type IceOptions,\n} from \"../../../ice/src\";\nimport { candidateFromSdp, candidateToSdp } from \"../sdp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/ice.ts\");\n\nexport class RTCIceTransport {\n readonly id = v4();\n connection: IceConnection;\n state: RTCIceConnectionState = \"new\";\n private waitStart?: Event<[]>;\n private renominating = false;\n\n readonly onStateChange = new Event<[RTCIceConnectionState]>();\n readonly onIceCandidate = new Event<[IceCandidate | undefined]>();\n readonly onNegotiationNeeded = new Event<[]>();\n\n constructor(private iceGather: RTCIceGatherer) {\n this.connection = this.iceGather.connection;\n this.connection.stateChanged.subscribe((state) => {\n this.setState(state);\n });\n this.iceGather.onIceCandidate = (candidate) => {\n this.onIceCandidate.execute(candidate);\n };\n }\n\n get role() {\n if (this.connection.iceControlling) return \"controlling\";\n else return \"controlled\";\n }\n\n get gatheringState() {\n return this.iceGather.gatheringState;\n }\n\n get localCandidates() {\n return this.iceGather.localCandidates;\n }\n\n get localParameters() {\n return this.iceGather.localParameters;\n }\n\n private setState(state: RTCIceConnectionState) {\n if (state !== this.state) {\n this.state = state;\n\n this.onStateChange.execute(state);\n }\n }\n\n gather() {\n return this.iceGather.gather();\n }\n\n addRemoteCandidate = (candidate?: IceCandidate) => {\n if (!this.connection.remoteCandidatesEnd) {\n if (!candidate) {\n return this.connection.addRemoteCandidate(undefined);\n } else {\n return this.connection.addRemoteCandidate(candidateToIce(candidate));\n }\n }\n };\n\n setRemoteParams(remoteParameters: RTCIceParameters, renomination = false) {\n if (renomination) {\n this.renominating = true;\n }\n if (\n this.connection.remoteUsername &&\n this.connection.remotePassword &&\n (this.connection.remoteUsername !== remoteParameters.usernameFragment ||\n this.connection.remotePassword !== remoteParameters.password)\n ) {\n if (this.renominating) {\n log(\"renomination\", remoteParameters);\n this.connection.resetNominatedPair();\n this.renominating = false;\n } else {\n log(\"restart\", remoteParameters);\n this.restart();\n }\n }\n this.connection.setRemoteParams(remoteParameters);\n }\n\n restart() {\n this.connection.restart();\n this.setState(\"new\");\n this.iceGather.gatheringState = \"new\";\n this.waitStart = undefined;\n this.onNegotiationNeeded.execute();\n }\n\n async start() {\n if (this.state === \"closed\") {\n throw new Error(\"RTCIceTransport is closed\");\n }\n if (!this.connection.remotePassword || !this.connection.remoteUsername) {\n throw new Error(\"remoteParams missing\");\n }\n\n if (this.waitStart) {\n await this.waitStart.asPromise();\n }\n this.waitStart = new Event();\n\n this.setState(\"checking\");\n\n try {\n await this.connection.connect();\n } catch (error) {\n this.setState(\"failed\");\n throw error;\n }\n\n this.waitStart.execute();\n this.waitStart.complete();\n this.waitStart = undefined;\n }\n\n async stop() {\n if (this.state !== \"closed\") {\n this.setState(\"closed\");\n await this.connection.close();\n }\n this.onStateChange.complete();\n this.onIceCandidate.complete();\n this.onNegotiationNeeded.complete();\n }\n}\n\nexport const IceTransportStates = [\n \"new\",\n \"checking\",\n \"connected\",\n \"completed\",\n \"disconnected\",\n \"failed\",\n \"closed\",\n] as const;\nexport type RTCIceConnectionState = (typeof IceTransportStates)[number];\n\nexport const IceGathererStates = [\"new\", \"gathering\", \"complete\"] as const;\nexport type IceGathererState = (typeof IceGathererStates)[number];\n\nexport class RTCIceGatherer {\n onIceCandidate: (candidate: IceCandidate | undefined) => void = () => {};\n gatheringState: IceGathererState = \"new\";\n readonly connection: IceConnection;\n\n readonly onGatheringStateChange = new Event<[IceGathererState]>();\n\n constructor(private options: Partial<IceOptions> = {}) {\n this.connection = new Connection(false, this.options);\n this.connection.onIceCandidate.subscribe((candidate) => {\n this.onIceCandidate(candidateFromIce(candidate));\n });\n }\n\n async gather() {\n if (this.gatheringState === \"new\") {\n this.setState(\"gathering\");\n await this.connection.gatherCandidates();\n this.onIceCandidate(undefined);\n this.setState(\"complete\");\n }\n }\n\n get localCandidates() {\n return this.connection.localCandidates.map(candidateFromIce);\n }\n\n get localParameters() {\n const params = new RTCIceParameters({\n usernameFragment: this.connection.localUsername,\n password: this.connection.localPassword,\n });\n\n return params;\n }\n\n private setState(state: IceGathererState) {\n if (state !== this.gatheringState) {\n this.gatheringState = state;\n this.onGatheringStateChange.execute(state);\n }\n }\n}\n\nexport function candidateFromIce(c: Candidate) {\n const candidate = new IceCandidate(\n c.component,\n c.foundation,\n c.host,\n c.port,\n c.priority,\n c.transport,\n c.type,\n c.generation,\n c.ufrag,\n );\n candidate.relatedAddress = c.relatedAddress;\n candidate.relatedPort = c.relatedPort;\n candidate.tcpType = c.tcptype;\n return candidate;\n}\n\nexport function candidateToIce(x: IceCandidate) {\n return new Candidate(\n x.foundation,\n x.component,\n x.protocol,\n x.priority,\n x.ip,\n x.port,\n x.type,\n x.relatedAddress,\n x.relatedPort,\n x.tcpType,\n x.generation,\n x.ufrag,\n );\n}\n\nexport interface RTCIceCandidateInit {\n candidate?: string;\n sdpMLineIndex?: number | null;\n sdpMid?: string | null;\n usernameFragment?: string | null;\n}\n\nexport class RTCIceCandidate {\n candidate!: string;\n sdpMid?: string;\n sdpMLineIndex?: number;\n usernameFragment?: string;\n\n constructor(props: Partial<RTCIceCandidate>) {\n Object.assign(this, props);\n }\n\n static fromSdp(sdp: string): RTCIceCandidate {\n const ice = Candidate.fromSdp(sdp);\n const candidate = candidateFromIce(ice);\n return candidate.toJSON();\n }\n\n static isThis(o: any) {\n if (typeof o?.candidate === \"string\") return true;\n }\n\n toJSON() {\n return {\n candidate: this.candidate,\n sdpMid: this.sdpMid,\n sdpMLineIndex: this.sdpMLineIndex,\n usernameFragment: this.usernameFragment,\n };\n }\n}\n\nexport class IceCandidate {\n // \"\"\"\n // The :class:`RTCIceCandidate` interface represents a candidate Interactive\n // Connectivity Establishment (ICE) configuration which may be used to\n // establish an RTCPeerConnection.\n // \"\"\"\n public relatedAddress?: string;\n public relatedPort?: number;\n public sdpMid?: string;\n public sdpMLineIndex?: number;\n public tcpType?: string;\n\n constructor(\n public component: number,\n public foundation: string,\n public ip: string,\n public port: number,\n public priority: number,\n public protocol: string,\n public type: string,\n public generation?: number,\n public ufrag?: string,\n ) {}\n\n toJSON(): RTCIceCandidate {\n return new RTCIceCandidate({\n candidate: candidateToSdp(this),\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n usernameFragment: this.ufrag,\n });\n }\n\n static fromJSON(data: RTCIceCandidate | RTCIceCandidateInit) {\n try {\n if (!data.candidate) {\n throw new Error(\"candidate is required\");\n }\n const candidate = candidateFromSdp(data.candidate);\n candidate.sdpMLineIndex = data.sdpMLineIndex ?? undefined;\n candidate.sdpMid = data.sdpMid ?? undefined;\n return candidate;\n } catch (error) {}\n }\n}\n\nexport class RTCIceParameters {\n iceLite = false;\n usernameFragment!: string;\n password!: string;\n\n constructor(props: Partial<RTCIceParameters> = {}) {\n Object.assign(this, props);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../src/transport/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 } from \"uuid\";\nimport { Event, debug } from \"../imports/common\";\n\nimport {\n Candidate,\n Connection,\n type IceConnection,\n type IceOptions,\n} from \"../../../ice/src\";\nimport {\n type RTCIceCandidatePairStats,\n type RTCIceCandidateStats,\n type RTCStats,\n generateStatsId,\n getStatsTimestamp,\n} from \"../media/stats\";\nimport { candidateFromSdp, candidateToSdp } from \"../sdp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/ice.ts\");\n\n/**\n * +------------+\n | |\n |disconnected|\n | |\n +------------+\n ^ ^\n | |\n+------+ +----------+ +-----------+ +----------+\n| | | | | | | |\n| new | ---> | checking | ---> | connected | ---> | completed|\n| | | | | | | |\n+------+ +----+-----+ +-----------+ +----------+\n | \n | \n v \n +-------+ \n | | \n | failed| \n | | \n +-------+ \n */\n\nexport class RTCIceTransport {\n readonly id = v4();\n connection: IceConnection;\n state: RTCIceConnectionState = \"new\";\n private waitStart?: Event<[]>;\n private renominating = false;\n\n readonly onStateChange = new Event<[RTCIceConnectionState]>();\n readonly onIceCandidate = new Event<[IceCandidate | undefined]>();\n readonly onNegotiationNeeded = new Event<[]>();\n\n constructor(private iceGather: RTCIceGatherer) {\n this.connection = this.iceGather.connection;\n this.connection.stateChanged.subscribe((state) => {\n this.setState(state);\n });\n this.iceGather.onIceCandidate = (candidate) => {\n this.onIceCandidate.execute(candidate);\n };\n }\n\n get role() {\n if (this.connection.iceControlling) return \"controlling\";\n else return \"controlled\";\n }\n\n get gatheringState() {\n return this.iceGather.gatheringState;\n }\n\n get localCandidates() {\n return this.iceGather.localCandidates;\n }\n\n get localParameters() {\n return this.iceGather.localParameters;\n }\n\n private setState(state: RTCIceConnectionState) {\n if (state !== this.state) {\n this.state = state;\n\n this.onStateChange.execute(state);\n }\n }\n\n gather() {\n return this.iceGather.gather();\n }\n\n addRemoteCandidate = (candidate?: IceCandidate) => {\n if (!this.connection.remoteCandidatesEnd) {\n if (!candidate) {\n return this.connection.addRemoteCandidate(undefined);\n } else {\n return this.connection.addRemoteCandidate(candidateToIce(candidate));\n }\n }\n };\n\n setRemoteParams(remoteParameters: RTCIceParameters, renomination = false) {\n if (renomination) {\n this.renominating = true;\n }\n if (\n this.connection.remoteUsername &&\n this.connection.remotePassword &&\n (this.connection.remoteUsername !== remoteParameters.usernameFragment ||\n this.connection.remotePassword !== remoteParameters.password)\n ) {\n if (this.renominating) {\n log(\"renomination\", remoteParameters);\n this.connection.resetNominatedPair();\n this.renominating = false;\n } else {\n log(\"restart\", remoteParameters);\n this.restart();\n }\n }\n this.connection.setRemoteParams(remoteParameters);\n }\n\n restart() {\n this.connection.restart();\n this.setState(\"new\");\n this.iceGather.gatheringState = \"new\";\n this.waitStart = undefined;\n this.onNegotiationNeeded.execute();\n }\n\n async start() {\n if (this.state === \"closed\") {\n throw new Error(\"RTCIceTransport is closed\");\n }\n if (!this.connection.remotePassword || !this.connection.remoteUsername) {\n throw new Error(\"remoteParams missing\");\n }\n\n if (this.waitStart) {\n await this.waitStart.asPromise();\n }\n this.waitStart = new Event();\n\n this.setState(\"checking\");\n\n try {\n await this.connection.connect();\n } catch (error) {\n this.setState(\"failed\");\n throw error;\n }\n\n this.waitStart.execute();\n this.waitStart.complete();\n this.waitStart = undefined;\n }\n\n async stop() {\n if (this.state !== \"closed\") {\n this.setState(\"closed\");\n await this.connection.close();\n }\n this.onStateChange.complete();\n this.onIceCandidate.complete();\n this.onNegotiationNeeded.complete();\n }\n\n async getStats(): Promise<RTCStats[]> {\n const timestamp = getStatsTimestamp();\n const stats: RTCStats[] = [];\n\n // Local candidates\n for (const candidate of this.localCandidates) {\n const candidateStats: RTCIceCandidateStats = {\n type: \"local-candidate\",\n id: generateStatsId(\"local-candidate\", candidate.foundation),\n timestamp,\n transportId: generateStatsId(\"transport\", this.id),\n address: candidate.ip,\n port: candidate.port,\n protocol: candidate.protocol,\n candidateType: candidate.type as any,\n priority: candidate.priority,\n foundation: candidate.foundation,\n };\n stats.push(candidateStats);\n }\n\n // Remote candidates\n for (const candidate of this.connection.remoteCandidates) {\n const ice = candidateFromIce(candidate);\n const candidateStats: RTCIceCandidateStats = {\n type: \"remote-candidate\",\n id: generateStatsId(\"remote-candidate\", ice.foundation),\n timestamp,\n transportId: generateStatsId(\"transport\", this.id),\n address: ice.ip,\n port: ice.port,\n protocol: ice.protocol,\n candidateType: ice.type as any,\n priority: ice.priority,\n foundation: ice.foundation,\n };\n stats.push(candidateStats);\n }\n\n // Candidate pairs\n const pairs = this.connection?.candidatePairs\n ? [\n ...this.connection.candidatePairs.filter((p) => p.nominated),\n ...this.connection.candidatePairs.filter((p) => !p.nominated),\n ]\n : [];\n for (const pair of pairs) {\n const pairStats: RTCIceCandidatePairStats = {\n type: \"candidate-pair\",\n id: generateStatsId(\"candidate-pair\", pair.foundation),\n timestamp,\n transportId: generateStatsId(\"transport\", this.id),\n localCandidateId: generateStatsId(\n \"local-candidate\",\n pair.localCandidate.foundation,\n ),\n remoteCandidateId: generateStatsId(\n \"remote-candidate\",\n pair.remoteCandidate.foundation,\n ),\n state: pair.state as any,\n nominated: pair.nominated,\n packetsSent: pair.packetsSent,\n packetsReceived: pair.packetsReceived,\n bytesSent: pair.bytesSent,\n bytesReceived: pair.bytesReceived,\n currentRoundTripTime: pair.rtt,\n };\n stats.push(pairStats);\n }\n\n return stats;\n }\n}\n\nexport const IceTransportStates = [\n \"new\",\n \"checking\",\n \"connected\",\n \"completed\",\n \"disconnected\",\n \"failed\",\n \"closed\",\n] as const;\nexport type RTCIceConnectionState = (typeof IceTransportStates)[number];\n\nexport const IceGathererStates = [\"new\", \"gathering\", \"complete\"] as const;\nexport type IceGathererState = (typeof IceGathererStates)[number];\n\nexport class RTCIceGatherer {\n onIceCandidate: (candidate: IceCandidate | undefined) => void = () => {};\n gatheringState: IceGathererState = \"new\";\n readonly connection: IceConnection;\n\n readonly onGatheringStateChange = new Event<[IceGathererState]>();\n\n constructor(private options: Partial<IceOptions> = {}) {\n this.connection = new Connection(false, this.options);\n this.connection.onIceCandidate.subscribe((candidate) => {\n this.onIceCandidate(candidateFromIce(candidate));\n });\n }\n\n async gather() {\n if (this.gatheringState === \"new\") {\n this.setState(\"gathering\");\n await this.connection.gatherCandidates();\n this.onIceCandidate(undefined);\n this.setState(\"complete\");\n }\n }\n\n get localCandidates() {\n return this.connection.localCandidates.map(candidateFromIce);\n }\n\n get localParameters() {\n const params = new RTCIceParameters({\n usernameFragment: this.connection.localUsername,\n password: this.connection.localPassword,\n });\n\n return params;\n }\n\n private setState(state: IceGathererState) {\n if (state !== this.gatheringState) {\n this.gatheringState = state;\n this.onGatheringStateChange.execute(state);\n }\n }\n}\n\nexport function candidateFromIce(c: Candidate) {\n const candidate = new IceCandidate(\n c.component,\n c.foundation,\n c.host,\n c.port,\n c.priority,\n c.transport,\n c.type,\n c.generation,\n c.ufrag,\n );\n candidate.relatedAddress = c.relatedAddress;\n candidate.relatedPort = c.relatedPort;\n candidate.tcpType = c.tcptype;\n return candidate;\n}\n\nexport function candidateToIce(x: IceCandidate) {\n return new Candidate(\n x.foundation,\n x.component,\n x.protocol,\n x.priority,\n x.ip,\n x.port,\n x.type,\n x.relatedAddress,\n x.relatedPort,\n x.tcpType,\n x.generation,\n x.ufrag,\n );\n}\n\nexport interface RTCIceCandidateInit {\n candidate?: string;\n sdpMLineIndex?: number | null;\n sdpMid?: string | null;\n usernameFragment?: string | null;\n}\n\nexport class RTCIceCandidate {\n candidate!: string;\n sdpMid?: string;\n sdpMLineIndex?: number;\n usernameFragment?: string;\n\n constructor(props: Partial<RTCIceCandidate>) {\n Object.assign(this, props);\n }\n\n static fromSdp(sdp: string): RTCIceCandidate {\n const ice = Candidate.fromSdp(sdp);\n const candidate = candidateFromIce(ice);\n return candidate.toJSON();\n }\n\n static isThis(o: any) {\n if (typeof o?.candidate === \"string\") return true;\n }\n\n toJSON() {\n return {\n candidate: this.candidate,\n sdpMid: this.sdpMid,\n sdpMLineIndex: this.sdpMLineIndex,\n usernameFragment: this.usernameFragment,\n };\n }\n}\n\nexport class IceCandidate {\n // \"\"\"\n // The :class:`RTCIceCandidate` interface represents a candidate Interactive\n // Connectivity Establishment (ICE) configuration which may be used to\n // establish an RTCPeerConnection.\n // \"\"\"\n public relatedAddress?: string;\n public relatedPort?: number;\n public sdpMid?: string;\n public sdpMLineIndex?: number;\n public tcpType?: string;\n\n constructor(\n public component: number,\n public foundation: string,\n public ip: string,\n public port: number,\n public priority: number,\n public protocol: string,\n public type: string,\n public generation?: number,\n public ufrag?: string,\n ) {}\n\n toJSON(): RTCIceCandidate {\n return new RTCIceCandidate({\n candidate: candidateToSdp(this),\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n usernameFragment: this.ufrag,\n });\n }\n\n static fromJSON(data: RTCIceCandidate | RTCIceCandidateInit) {\n try {\n if (!data.candidate) {\n throw new Error(\"candidate is required\");\n }\n const candidate = candidateFromSdp(data.candidate);\n candidate.sdpMLineIndex = data.sdpMLineIndex ?? undefined;\n candidate.sdpMid = data.sdpMid ?? undefined;\n return candidate;\n } catch (error) {}\n }\n}\n\nexport class RTCIceParameters {\n iceLite = false;\n usernameFragment!: string;\n password!: string;\n\n constructor(props: Partial<RTCIceParameters> = {}) {\n Object.assign(this, props);\n }\n}\n"]}
|
|
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
36
|
exports.RTCSctpCapabilities = exports.RTCSctpTransport = void 0;
|
|
27
37
|
const jspack_1 = require("@shinyoshiaki/jspack");
|
|
@@ -192,6 +202,9 @@ class RTCSctpTransport {
|
|
|
192
202
|
throw new Error();
|
|
193
203
|
}
|
|
194
204
|
})();
|
|
205
|
+
// Update reception statistics
|
|
206
|
+
channel.messagesReceived++;
|
|
207
|
+
channel.bytesReceived += data.length;
|
|
195
208
|
channel.onMessage.execute(msg);
|
|
196
209
|
channel.emit("message", { data: msg });
|
|
197
210
|
if (channel.onmessage) {
|
|
@@ -358,6 +371,8 @@ class RTCSctpTransport {
|
|
|
358
371
|
channel.addBufferedAmount(-userData.length);
|
|
359
372
|
}
|
|
360
373
|
}
|
|
374
|
+
// Resetting the queue to empty array mitigates this.
|
|
375
|
+
this.dataChannelQueue = [];
|
|
361
376
|
}
|
|
362
377
|
static getCapabilities() {
|
|
363
378
|
return new RTCSctpCapabilities(65536);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../src/transport/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import { jspack } from \"@shinyoshiaki/jspack\";\n\nimport * as uuid from \"uuid\";\nimport { Event, debug } from \"../imports/common\";\n\nimport { SCTP, SCTP_STATE, type Transport } from \"../../../sctp/src\";\nimport {\n DATA_CHANNEL_ACK,\n DATA_CHANNEL_OPEN,\n DATA_CHANNEL_RELIABLE,\n WEBRTC_BINARY,\n WEBRTC_BINARY_EMPTY,\n WEBRTC_DCEP,\n WEBRTC_STRING,\n WEBRTC_STRING_EMPTY,\n} from \"../const\";\nimport {\n type DCState,\n RTCDataChannel,\n RTCDataChannelParameters,\n} from \"../dataChannel\";\nimport type { RTCDtlsTransport } from \"./dtls\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/sctp.ts\");\n\nexport class RTCSctpTransport {\n dtlsTransport!: RTCDtlsTransport;\n sctp!: SCTP;\n\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly id = uuid.v4();\n\n mid?: string;\n mLineIndex?: number;\n bundled = false;\n dataChannels: { [key: number]: RTCDataChannel } = {};\n\n private dataChannelQueue: [RTCDataChannel, number, Buffer][] = [];\n private dataChannelId?: number;\n private eventDisposer: (() => void)[] = [];\n\n constructor(public port = 5000) {}\n\n setDtlsTransport(dtlsTransport: RTCDtlsTransport) {\n if (this.dtlsTransport && this.dtlsTransport.id === dtlsTransport.id) {\n return;\n }\n\n this.eventDisposer.forEach((dispose) => dispose());\n\n this.dtlsTransport = dtlsTransport;\n this.sctp = new SCTP(new BridgeDtls(this.dtlsTransport), this.port);\n\n this.eventDisposer = [\n ...[\n this.sctp.onReceive.subscribe(this.datachannelReceive),\n this.sctp.onReconfigStreams.subscribe((ids: number[]) => {\n ids.forEach((id) => {\n const dc = this.dataChannels[id];\n if (!dc) return;\n // todo fix\n dc.setReadyState(\"closing\");\n dc.setReadyState(\"closed\");\n delete this.dataChannels[id];\n });\n }),\n this.sctp.stateChanged.connected.subscribe(() => {\n Object.values(this.dataChannels).forEach((channel) => {\n if (channel.negotiated && channel.readyState !== \"open\") {\n channel.setReadyState(\"open\");\n }\n });\n this.dataChannelFlush();\n }),\n this.sctp.stateChanged.closed.subscribe(() => {\n Object.values(this.dataChannels).forEach((dc) => {\n dc.setReadyState(\"closed\");\n });\n this.dataChannels = {};\n }),\n this.dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.sctp.setState(SCTP_STATE.CLOSED);\n }\n }),\n ].map((e) => e.unSubscribe),\n () => (this.sctp.onSackReceived = async () => {}),\n ];\n\n this.sctp.onSackReceived = async () => {\n await this.dataChannelFlush();\n };\n }\n\n private get isServer() {\n return this.dtlsTransport.iceTransport.role !== \"controlling\";\n }\n\n channelByLabel(label: string) {\n return Object.values(this.dataChannels).find((d) => d.label === label);\n }\n\n private datachannelReceive = async (\n streamId: number,\n ppId: number,\n data: Buffer,\n ) => {\n if (ppId === WEBRTC_DCEP && data.length > 0) {\n log(\"DCEP\", streamId, ppId, data);\n switch (data[0]) {\n case DATA_CHANNEL_OPEN:\n {\n if (data.length < 12) {\n log(\"DATA_CHANNEL_OPEN data.length not enough\");\n return;\n }\n\n if (!Object.keys(this.dataChannels).includes(streamId.toString())) {\n const [\n ,\n channelType,\n ,\n reliability,\n labelLength,\n protocolLength,\n ] = jspack.Unpack(\"!BBHLHH\", data);\n\n let pos = 12;\n const label = data.slice(pos, pos + labelLength).toString(\"utf8\");\n pos += labelLength;\n const protocol = data\n .slice(pos, pos + protocolLength)\n .toString(\"utf8\");\n\n log(\"DATA_CHANNEL_OPEN\", {\n channelType,\n reliability,\n streamId,\n label,\n protocol,\n });\n\n const maxRetransmits =\n (channelType & 0x03) === 1 ? reliability : undefined;\n const maxPacketLifeTime =\n (channelType & 0x03) === 2 ? reliability : undefined;\n\n // # register channel\n const parameters = new RTCDataChannelParameters({\n label,\n ordered: (channelType & 0x80) === 0,\n maxPacketLifeTime,\n maxRetransmits,\n protocol,\n id: streamId,\n });\n const channel = new RTCDataChannel(this, parameters, false);\n channel.isCreatedByRemote = true;\n this.dataChannels[streamId] = channel;\n\n this.onDataChannel.execute(channel);\n channel.setReadyState(\"open\");\n } else {\n log(\"datachannel already opened\", \"retransmit ack\");\n }\n\n const channel = this.dataChannels[streamId];\n this.dataChannelQueue.push([\n channel,\n WEBRTC_DCEP,\n Buffer.from(jspack.Pack(\"!B\", [DATA_CHANNEL_ACK])),\n ]);\n await this.dataChannelFlush();\n }\n break;\n case DATA_CHANNEL_ACK:\n {\n log(\"DATA_CHANNEL_ACK\", streamId, ppId);\n const channel = this.dataChannels[streamId];\n if (!channel) {\n throw new Error(\"channel not found\");\n }\n channel.setReadyState(\"open\");\n }\n break;\n }\n } else {\n const channel = this.dataChannels[streamId];\n if (channel) {\n const msg = (() => {\n switch (ppId) {\n case WEBRTC_STRING:\n return data.toString(\"utf8\");\n case WEBRTC_STRING_EMPTY:\n return \"\";\n case WEBRTC_BINARY:\n return data;\n case WEBRTC_BINARY_EMPTY:\n return Buffer.from([]);\n default:\n throw new Error();\n }\n })();\n\n channel.onMessage.execute(msg);\n channel.emit(\"message\", { data: msg });\n if (channel.onmessage) {\n channel.onmessage({ data: msg });\n }\n }\n }\n };\n\n dataChannelAddNegotiated(channel: RTCDataChannel) {\n if (channel.id == undefined) {\n throw new Error();\n }\n if (this.dataChannels[channel.id]) {\n throw new Error();\n }\n\n this.dataChannels[channel.id] = channel;\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n channel.setReadyState(\"open\");\n }\n }\n\n dataChannelOpen(channel: RTCDataChannel) {\n if (channel.id) {\n if (this.dataChannels[channel.id])\n throw new Error(\n `Data channel with ID ${channel.id} already registered`,\n );\n this.dataChannels[channel.id] = channel;\n }\n\n let channelType = DATA_CHANNEL_RELIABLE;\n const priority = 0;\n let reliability = 0;\n\n if (!channel.ordered) {\n channelType = 0x80;\n }\n if (channel.maxRetransmits) {\n channelType = 1;\n reliability = channel.maxRetransmits;\n } else if (channel.maxPacketLifeTime) {\n channelType = 2;\n reliability = channel.maxPacketLifeTime;\n }\n\n // 5.1. DATA_CHANNEL_OPEN Message\n const data = jspack.Pack(\"!BBHLHH\", [\n DATA_CHANNEL_OPEN,\n channelType,\n priority,\n reliability,\n channel.label.length,\n channel.protocol.length,\n ]);\n const send = Buffer.concat([\n Buffer.from(data),\n Buffer.from(channel.label, \"utf8\"),\n Buffer.from(channel.protocol, \"utf8\"),\n ]);\n this.dataChannelQueue.push([channel, WEBRTC_DCEP, send]);\n this.dataChannelFlush();\n }\n\n private async dataChannelFlush() {\n // \"\"\"\n // Try to flush buffered data to the SCTP layer.\n\n // We wait until the association is established, as we need to know\n // whether we are a client or a server to correctly assign an odd/even ID\n // to the data channels.\n // \"\"\"\n\n if (this.sctp.associationState != SCTP_STATE.ESTABLISHED) return;\n if (this.sctp.outboundQueue.length > 0) return;\n\n while (this.dataChannelQueue.length > 0) {\n const [channel, protocol, userData] = this.dataChannelQueue.shift()!;\n\n let streamId = channel.id;\n if (streamId === undefined) {\n streamId = this.dataChannelId!;\n while (Object.keys(this.dataChannels).includes(streamId.toString())) {\n streamId += 2;\n }\n this.dataChannels[streamId] = channel;\n channel.setId(streamId);\n }\n\n if (protocol === WEBRTC_DCEP) {\n await this.sctp.send(streamId, protocol, userData, {\n ordered: true,\n });\n } else {\n const expiry = channel.maxPacketLifeTime\n ? Date.now() + channel.maxPacketLifeTime / 1000\n : undefined;\n\n await this.sctp.send(streamId, protocol, userData, {\n expiry,\n maxRetransmits: channel.maxRetransmits,\n ordered: channel.ordered,\n });\n channel.addBufferedAmount(-userData.length);\n }\n }\n }\n\n datachannelSend = (channel: RTCDataChannel, data: Buffer | string) => {\n channel.addBufferedAmount(data.length);\n\n this.dataChannelQueue.push(\n typeof data === \"string\"\n ? [channel, WEBRTC_STRING, Buffer.from(data)]\n : [channel, WEBRTC_BINARY, data],\n );\n\n if (this.sctp.associationState !== SCTP_STATE.ESTABLISHED) {\n log(\"sctp not established\", this.sctp.associationState);\n }\n\n this.dataChannelFlush();\n };\n\n static getCapabilities() {\n return new RTCSctpCapabilities(65536);\n }\n\n setRemotePort(port: number) {\n this.sctp.setRemotePort(port);\n }\n\n async start(remotePort: number) {\n if (this.isServer) {\n this.dataChannelId = 0;\n } else {\n this.dataChannelId = 1;\n }\n this.sctp.isServer = this.isServer;\n\n await this.sctp.start(remotePort);\n }\n\n async stop() {\n this.dtlsTransport.dataReceiver = () => {};\n await this.sctp.stop();\n }\n\n dataChannelClose(channel: RTCDataChannel) {\n if (!([\"closing\", \"closed\"] as DCState[]).includes(channel.readyState)) {\n channel.setReadyState(\"closing\");\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n this.sctp.reconfigQueue.push(channel.id);\n if (this.sctp.reconfigQueue.length === 1) {\n this.sctp.transmitReconfigRequest();\n }\n } else {\n this.dataChannelQueue = this.dataChannelQueue.filter(\n (queueItem) => queueItem[0].id !== channel.id,\n );\n if (channel.id) {\n delete this.dataChannels[channel.id];\n }\n channel.setReadyState(\"closed\");\n }\n }\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nclass BridgeDtls implements Transport {\n constructor(private dtls: RTCDtlsTransport) {}\n set onData(onData: (buf: Buffer) => void) {\n this.dtls.dataReceiver = onData;\n }\n readonly send = (data: Buffer) => {\n return this.dtls.sendData(data);\n };\n close() {}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../src/transport/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import { jspack } from \"@shinyoshiaki/jspack\";\n\nimport * as uuid from \"uuid\";\nimport { Event, debug } from \"../imports/common\";\n\nimport { SCTP, SCTP_STATE, type Transport } from \"../../../sctp/src\";\nimport {\n DATA_CHANNEL_ACK,\n DATA_CHANNEL_OPEN,\n DATA_CHANNEL_RELIABLE,\n WEBRTC_BINARY,\n WEBRTC_BINARY_EMPTY,\n WEBRTC_DCEP,\n WEBRTC_STRING,\n WEBRTC_STRING_EMPTY,\n} from \"../const\";\nimport {\n type DCState,\n RTCDataChannel,\n RTCDataChannelParameters,\n} from \"../dataChannel\";\nimport type { RTCDtlsTransport } from \"./dtls\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/sctp.ts\");\n\nexport class RTCSctpTransport {\n dtlsTransport!: RTCDtlsTransport;\n sctp!: SCTP;\n\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly id = uuid.v4();\n\n mid?: string;\n mLineIndex?: number;\n bundled = false;\n dataChannels: { [key: number]: RTCDataChannel } = {};\n\n private dataChannelQueue: [RTCDataChannel, number, Buffer][] = [];\n private dataChannelId?: number;\n private eventDisposer: (() => void)[] = [];\n\n constructor(public port = 5000) {}\n\n setDtlsTransport(dtlsTransport: RTCDtlsTransport) {\n if (this.dtlsTransport && this.dtlsTransport.id === dtlsTransport.id) {\n return;\n }\n\n this.eventDisposer.forEach((dispose) => dispose());\n\n this.dtlsTransport = dtlsTransport;\n this.sctp = new SCTP(new BridgeDtls(this.dtlsTransport), this.port);\n\n this.eventDisposer = [\n ...[\n this.sctp.onReceive.subscribe(this.datachannelReceive),\n this.sctp.onReconfigStreams.subscribe((ids: number[]) => {\n ids.forEach((id) => {\n const dc = this.dataChannels[id];\n if (!dc) return;\n // todo fix\n dc.setReadyState(\"closing\");\n dc.setReadyState(\"closed\");\n delete this.dataChannels[id];\n });\n }),\n this.sctp.stateChanged.connected.subscribe(() => {\n Object.values(this.dataChannels).forEach((channel) => {\n if (channel.negotiated && channel.readyState !== \"open\") {\n channel.setReadyState(\"open\");\n }\n });\n this.dataChannelFlush();\n }),\n this.sctp.stateChanged.closed.subscribe(() => {\n Object.values(this.dataChannels).forEach((dc) => {\n dc.setReadyState(\"closed\");\n });\n this.dataChannels = {};\n }),\n this.dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.sctp.setState(SCTP_STATE.CLOSED);\n }\n }),\n ].map((e) => e.unSubscribe),\n () => (this.sctp.onSackReceived = async () => {}),\n ];\n\n this.sctp.onSackReceived = async () => {\n await this.dataChannelFlush();\n };\n }\n\n private get isServer() {\n return this.dtlsTransport.iceTransport.role !== \"controlling\";\n }\n\n channelByLabel(label: string) {\n return Object.values(this.dataChannels).find((d) => d.label === label);\n }\n\n private datachannelReceive = async (\n streamId: number,\n ppId: number,\n data: Buffer,\n ) => {\n if (ppId === WEBRTC_DCEP && data.length > 0) {\n log(\"DCEP\", streamId, ppId, data);\n switch (data[0]) {\n case DATA_CHANNEL_OPEN:\n {\n if (data.length < 12) {\n log(\"DATA_CHANNEL_OPEN data.length not enough\");\n return;\n }\n\n if (!Object.keys(this.dataChannels).includes(streamId.toString())) {\n const [\n ,\n channelType,\n ,\n reliability,\n labelLength,\n protocolLength,\n ] = jspack.Unpack(\"!BBHLHH\", data);\n\n let pos = 12;\n const label = data.slice(pos, pos + labelLength).toString(\"utf8\");\n pos += labelLength;\n const protocol = data\n .slice(pos, pos + protocolLength)\n .toString(\"utf8\");\n\n log(\"DATA_CHANNEL_OPEN\", {\n channelType,\n reliability,\n streamId,\n label,\n protocol,\n });\n\n const maxRetransmits =\n (channelType & 0x03) === 1 ? reliability : undefined;\n const maxPacketLifeTime =\n (channelType & 0x03) === 2 ? reliability : undefined;\n\n // # register channel\n const parameters = new RTCDataChannelParameters({\n label,\n ordered: (channelType & 0x80) === 0,\n maxPacketLifeTime,\n maxRetransmits,\n protocol,\n id: streamId,\n });\n const channel = new RTCDataChannel(this, parameters, false);\n channel.isCreatedByRemote = true;\n this.dataChannels[streamId] = channel;\n\n this.onDataChannel.execute(channel);\n channel.setReadyState(\"open\");\n } else {\n log(\"datachannel already opened\", \"retransmit ack\");\n }\n\n const channel = this.dataChannels[streamId];\n this.dataChannelQueue.push([\n channel,\n WEBRTC_DCEP,\n Buffer.from(jspack.Pack(\"!B\", [DATA_CHANNEL_ACK])),\n ]);\n await this.dataChannelFlush();\n }\n break;\n case DATA_CHANNEL_ACK:\n {\n log(\"DATA_CHANNEL_ACK\", streamId, ppId);\n const channel = this.dataChannels[streamId];\n if (!channel) {\n throw new Error(\"channel not found\");\n }\n channel.setReadyState(\"open\");\n }\n break;\n }\n } else {\n const channel = this.dataChannels[streamId];\n if (channel) {\n const msg = (() => {\n switch (ppId) {\n case WEBRTC_STRING:\n return data.toString(\"utf8\");\n case WEBRTC_STRING_EMPTY:\n return \"\";\n case WEBRTC_BINARY:\n return data;\n case WEBRTC_BINARY_EMPTY:\n return Buffer.from([]);\n default:\n throw new Error();\n }\n })();\n\n // Update reception statistics\n channel.messagesReceived++;\n channel.bytesReceived += data.length;\n\n channel.onMessage.execute(msg);\n channel.emit(\"message\", { data: msg });\n if (channel.onmessage) {\n channel.onmessage({ data: msg });\n }\n }\n }\n };\n\n dataChannelAddNegotiated(channel: RTCDataChannel) {\n if (channel.id == undefined) {\n throw new Error();\n }\n if (this.dataChannels[channel.id]) {\n throw new Error();\n }\n\n this.dataChannels[channel.id] = channel;\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n channel.setReadyState(\"open\");\n }\n }\n\n dataChannelOpen(channel: RTCDataChannel) {\n if (channel.id) {\n if (this.dataChannels[channel.id])\n throw new Error(\n `Data channel with ID ${channel.id} already registered`,\n );\n this.dataChannels[channel.id] = channel;\n }\n\n let channelType = DATA_CHANNEL_RELIABLE;\n const priority = 0;\n let reliability = 0;\n\n if (!channel.ordered) {\n channelType = 0x80;\n }\n if (channel.maxRetransmits) {\n channelType = 1;\n reliability = channel.maxRetransmits;\n } else if (channel.maxPacketLifeTime) {\n channelType = 2;\n reliability = channel.maxPacketLifeTime;\n }\n\n // 5.1. DATA_CHANNEL_OPEN Message\n const data = jspack.Pack(\"!BBHLHH\", [\n DATA_CHANNEL_OPEN,\n channelType,\n priority,\n reliability,\n channel.label.length,\n channel.protocol.length,\n ]);\n const send = Buffer.concat([\n Buffer.from(data),\n Buffer.from(channel.label, \"utf8\"),\n Buffer.from(channel.protocol, \"utf8\"),\n ]);\n this.dataChannelQueue.push([channel, WEBRTC_DCEP, send]);\n this.dataChannelFlush();\n }\n\n private async dataChannelFlush() {\n // \"\"\"\n // Try to flush buffered data to the SCTP layer.\n\n // We wait until the association is established, as we need to know\n // whether we are a client or a server to correctly assign an odd/even ID\n // to the data channels.\n // \"\"\"\n\n if (this.sctp.associationState != SCTP_STATE.ESTABLISHED) return;\n if (this.sctp.outboundQueue.length > 0) return;\n\n while (this.dataChannelQueue.length > 0) {\n const [channel, protocol, userData] = this.dataChannelQueue.shift()!;\n\n let streamId = channel.id;\n if (streamId === undefined) {\n streamId = this.dataChannelId!;\n while (Object.keys(this.dataChannels).includes(streamId.toString())) {\n streamId += 2;\n }\n this.dataChannels[streamId] = channel;\n channel.setId(streamId);\n }\n\n if (protocol === WEBRTC_DCEP) {\n await this.sctp.send(streamId, protocol, userData, {\n ordered: true,\n });\n } else {\n const expiry = channel.maxPacketLifeTime\n ? Date.now() + channel.maxPacketLifeTime / 1000\n : undefined;\n\n await this.sctp.send(streamId, protocol, userData, {\n expiry,\n maxRetransmits: channel.maxRetransmits,\n ordered: channel.ordered,\n });\n channel.addBufferedAmount(-userData.length);\n }\n }\n // Resetting the queue to empty array mitigates this.\n this.dataChannelQueue = [];\n }\n\n datachannelSend = (channel: RTCDataChannel, data: Buffer | string) => {\n channel.addBufferedAmount(data.length);\n\n this.dataChannelQueue.push(\n typeof data === \"string\"\n ? [channel, WEBRTC_STRING, Buffer.from(data)]\n : [channel, WEBRTC_BINARY, data],\n );\n\n if (this.sctp.associationState !== SCTP_STATE.ESTABLISHED) {\n log(\"sctp not established\", this.sctp.associationState);\n }\n\n this.dataChannelFlush();\n };\n\n static getCapabilities() {\n return new RTCSctpCapabilities(65536);\n }\n\n setRemotePort(port: number) {\n this.sctp.setRemotePort(port);\n }\n\n async start(remotePort: number) {\n if (this.isServer) {\n this.dataChannelId = 0;\n } else {\n this.dataChannelId = 1;\n }\n this.sctp.isServer = this.isServer;\n\n await this.sctp.start(remotePort);\n }\n\n async stop() {\n this.dtlsTransport.dataReceiver = () => {};\n await this.sctp.stop();\n }\n\n dataChannelClose(channel: RTCDataChannel) {\n if (!([\"closing\", \"closed\"] as DCState[]).includes(channel.readyState)) {\n channel.setReadyState(\"closing\");\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n this.sctp.reconfigQueue.push(channel.id);\n if (this.sctp.reconfigQueue.length === 1) {\n this.sctp.transmitReconfigRequest();\n }\n } else {\n this.dataChannelQueue = this.dataChannelQueue.filter(\n (queueItem) => queueItem[0].id !== channel.id,\n );\n if (channel.id) {\n delete this.dataChannels[channel.id];\n }\n channel.setReadyState(\"closed\");\n }\n }\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nclass BridgeDtls implements Transport {\n constructor(private dtls: RTCDtlsTransport) {}\n set onData(onData: (buf: Buffer) => void) {\n this.dtls.dataReceiver = onData;\n }\n readonly send = (data: Buffer) => {\n return this.dtls.sendData(data);\n };\n close() {}\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type MediaDirection } from "./media/rtpTransceiver";
|
|
2
2
|
import { MediaStreamTrack } from "./media/track";
|
|
3
3
|
import type { RTCIceServer } from "./peerConnection";
|
|
4
4
|
export declare function fingerprint(file: Buffer, hashName: string): any;
|
|
5
5
|
export declare function isDtls(buf: Buffer): boolean;
|
|
6
6
|
export declare function reverseSimulcastDirection(dir: "recv" | "send"): "send" | "recv";
|
|
7
|
-
export declare const andDirection: (a:
|
|
8
|
-
export declare function reverseDirection(dir:
|
|
7
|
+
export declare const andDirection: (a: MediaDirection, b: MediaDirection) => "inactive" | "sendonly" | "recvonly" | "sendrecv";
|
|
8
|
+
export declare function reverseDirection(dir: MediaDirection): MediaDirection;
|
|
9
9
|
export declare const microTime: () => number;
|
|
10
10
|
export declare const milliTime: () => number;
|
|
11
11
|
export declare const timestampSeconds: () => number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":";;;;;;AAuBA,kCAOC;AAED,wBAGC;AAED,8DAGC;AAKD,4CAIC;AA+BD,0CAwBC;AAxGD,iCAAiC;AACjC,mCAAoC;AACpC,iCAAqC;AAErC,uEAA4C;AAC5C,2CAAyC;AAEzC,6CAM0B;AAC1B,yCAA+C;AAE/C,0DAA4B;AAC5B,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-const */\nimport { createHash } from \"crypto\";\nimport { createSocket } from \"dgram\";\n\nimport mergeWith from \"lodash/mergeWith.js\";\nimport { performance } from \"perf_hooks\";\n\nimport {\n type Address,\n bufferReader,\n bufferWriter,\n debug,\n randomPort,\n} from \"./imports/common\";\nimport { CipherContext } from \"./imports/dtls\";\n\nimport now from \"nano-time\";\nimport { Directions, type MediaDirection } from \"./media/rtpTransceiver\";\nimport { MediaStreamTrack } from \"./media/track\";\nimport type { RTCIceServer } from \"./peerConnection\";\n\nconst log = debug(\"werift:packages/webrtc/src/utils.ts\");\n\nexport function fingerprint(file: Buffer, hashName: string) {\n const upper = (s: string) => s.toUpperCase();\n const colon = (s: any) => s.match(/(.{2})/g).join(\":\");\n\n const hash = createHash(hashName).update(file).digest(\"hex\");\n\n return colon(upper(hash));\n}\n\nexport function isDtls(buf: Buffer) {\n const firstByte = buf[0];\n return firstByte > 19 && firstByte < 64;\n}\n\nexport function reverseSimulcastDirection(dir: \"recv\" | \"send\") {\n if (dir === \"recv\") return \"send\";\n return \"recv\";\n}\n\nexport const andDirection = (a: MediaDirection, b: MediaDirection) =>\n Directions[Directions.indexOf(a) & Directions.indexOf(b)];\n\nexport function reverseDirection(dir: MediaDirection): MediaDirection {\n if (dir === \"sendonly\") return \"recvonly\";\n if (dir === \"recvonly\") return \"sendonly\";\n return dir;\n}\n\nexport const microTime = () => now.micro() as number;\n\nexport const milliTime = () => new Date().getTime();\n\nexport const timestampSeconds = () => Date.now() / 1000;\n\n/**https://datatracker.ietf.org/doc/html/rfc3550#section-4 */\nexport const ntpTime = () => {\n const now = performance.timeOrigin + performance.now() - Date.UTC(1900, 0, 1);\n\n const seconds = now / 1000;\n const [sec, msec] = seconds.toString().split(\".\").map(Number);\n\n const buf = bufferWriter([4, 4], [sec, msec]);\n\n return buf.readBigUInt64BE();\n};\n\n/**\n * https://datatracker.ietf.org/doc/html/rfc3550#section-4\n * @param ntp\n * @returns 32bit\n */\nexport const compactNtp = (ntp: bigint) => {\n const buf = bufferWriter([8], [ntp]);\n const [, sec, msec] = bufferReader(buf, [2, 2, 2, 2]);\n return bufferWriter([2, 2], [sec, msec]).readUInt32BE();\n};\n\nexport function parseIceServers(iceServers: RTCIceServer[]) {\n const url2Address = (url?: string) => {\n if (!url) return;\n const [address, port] = url.split(\":\");\n return [address, Number.parseInt(port)] as Address;\n };\n\n const stunServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"stun:\"))?.urls.slice(5),\n );\n const turnServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"turn:\"))?.urls.slice(5),\n );\n const { credential, username } =\n iceServers.find(({ urls }) => urls.includes(\"turn:\")) || {};\n\n const options = {\n stunServer,\n turnServer,\n turnUsername: username,\n turnPassword: credential,\n };\n log(\"iceOptions\", options);\n return options;\n}\n\n/**\n *\n * @param signatureHash\n * @param namedCurveAlgorithm necessary when use ecdsa\n */\nexport const createSelfSignedCertificate =\n CipherContext.createSelfSignedCertificateWithKey;\n\nexport class MediaStreamTrackFactory {\n static async rtpSource({\n port,\n kind,\n cb,\n }: {\n port?: number;\n kind: \"audio\" | \"video\";\n cb?: (buf: Buffer) => Buffer;\n }) {\n port ??= await randomPort();\n const track = new MediaStreamTrack({ kind });\n\n const udp = createSocket(\"udp4\");\n udp.bind(port);\n const onMessage = (msg: Buffer) => {\n if (cb) {\n msg = cb(msg);\n }\n track.writeRtp(msg);\n };\n udp.addListener(\"message\", onMessage);\n\n const dispose = () => {\n udp.removeListener(\"message\", onMessage);\n try {\n udp.close();\n } catch (error) {}\n };\n\n return [track, port, dispose] as const;\n }\n}\n\nexport const deepMerge = <T>(dst: T, src: T) =>\n mergeWith(dst, src, (obj, src) => {\n if (!(src == undefined)) {\n return src;\n }\n return obj;\n });\n"]}
|