werift 0.16.0 → 0.16.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/ice/src/ice.d.ts +1 -0
- package/lib/ice/src/ice.js +4 -1
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/rtp/src/codec/index.d.ts +0 -4
- package/lib/rtp/src/codec/index.js +2 -6
- package/lib/rtp/src/codec/index.js.map +1 -1
- package/lib/rtp/src/index.d.ts +1 -6
- package/lib/rtp/src/index.js +1 -6
- package/lib/rtp/src/index.js.map +1 -1
- package/lib/rtp/src/processor/depacketizer.d.ts +26 -0
- package/lib/rtp/src/processor/depacketizer.js +114 -0
- package/lib/rtp/src/processor/depacketizer.js.map +1 -0
- package/lib/rtp/src/processor/depacketizerCallback.d.ts +13 -0
- package/lib/rtp/src/processor/depacketizerCallback.js +20 -0
- package/lib/rtp/src/processor/depacketizerCallback.js.map +1 -0
- package/lib/rtp/src/processor/depacketizerTransformer.d.ts +8 -0
- package/lib/rtp/src/processor/depacketizerTransformer.js +20 -0
- package/lib/rtp/src/processor/depacketizerTransformer.js.map +1 -0
- package/lib/rtp/src/processor/index.d.ts +9 -0
- package/lib/rtp/src/{processor_v2 → processor}/index.js +6 -1
- package/lib/rtp/src/processor/index.js.map +1 -0
- package/lib/rtp/src/processor/jitterBuffer.d.ts +26 -11
- package/lib/rtp/src/processor/jitterBuffer.js +150 -42
- package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
- package/lib/rtp/src/processor/jitterBufferCallback.d.ts +10 -0
- package/lib/rtp/src/processor/jitterBufferCallback.js +21 -0
- package/lib/rtp/src/processor/jitterBufferCallback.js.map +1 -0
- package/lib/rtp/src/processor/jitterBufferTransformer.d.ts +9 -0
- package/lib/rtp/src/processor/jitterBufferTransformer.js +22 -0
- package/lib/rtp/src/processor/jitterBufferTransformer.js.map +1 -0
- package/lib/rtp/src/{processor_v2 → processor}/source/index.d.ts +0 -0
- package/lib/rtp/src/{processor_v2 → processor}/source/index.js +0 -0
- package/lib/rtp/src/processor/source/index.js.map +1 -0
- package/lib/rtp/src/processor/source/rtp.d.ts +20 -0
- package/lib/rtp/src/processor/source/rtp.js +33 -0
- package/lib/rtp/src/processor/source/rtp.js.map +1 -0
- package/lib/rtp/src/processor/webm.d.ts +24 -24
- package/lib/rtp/src/processor/webm.js +78 -89
- package/lib/rtp/src/processor/webm.js.map +1 -1
- package/lib/rtp/src/processor/webmStream.d.ts +31 -0
- package/lib/rtp/src/processor/webmStream.js +36 -0
- package/lib/rtp/src/processor/webmStream.js.map +1 -0
- package/lib/rtp/src/rtp/rtp.d.ts +1 -0
- package/lib/rtp/src/rtp/rtp.js +3 -0
- package/lib/rtp/src/rtp/rtp.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +3 -2
- package/lib/webrtc/src/media/rtpReceiver.js +14 -6
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +8 -6
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +4 -0
- package/lib/webrtc/src/peerConnection.js +5 -1
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/package.json +1 -1
- package/src/media/rtpReceiver.ts +23 -11
- package/src/nonstandard/recorder/writer/webm.ts +9 -7
- package/src/peerConnection.ts +9 -1
- package/lib/rtp/src/processor/base.d.ts +0 -18
- package/lib/rtp/src/processor/base.js +0 -39
- package/lib/rtp/src/processor/base.js.map +0 -1
- package/lib/rtp/src/processor/lipsync.d.ts +0 -30
- package/lib/rtp/src/processor/lipsync.js +0 -92
- package/lib/rtp/src/processor/lipsync.js.map +0 -1
- package/lib/rtp/src/processor/sampleBuilder.d.ts +0 -13
- package/lib/rtp/src/processor/sampleBuilder.js +0 -33
- package/lib/rtp/src/processor/sampleBuilder.js.map +0 -1
- package/lib/rtp/src/processor_v2/depacketizer.d.ts +0 -17
- package/lib/rtp/src/processor_v2/depacketizer.js +0 -84
- package/lib/rtp/src/processor_v2/depacketizer.js.map +0 -1
- package/lib/rtp/src/processor_v2/index.d.ts +0 -4
- package/lib/rtp/src/processor_v2/index.js.map +0 -1
- package/lib/rtp/src/processor_v2/jitterBuffer.d.ts +0 -33
- package/lib/rtp/src/processor_v2/jitterBuffer.js +0 -154
- package/lib/rtp/src/processor_v2/jitterBuffer.js.map +0 -1
- package/lib/rtp/src/processor_v2/source/base.d.ts +0 -8
- package/lib/rtp/src/processor_v2/source/base.js +0 -16
- package/lib/rtp/src/processor_v2/source/base.js.map +0 -1
- package/lib/rtp/src/processor_v2/source/index.js.map +0 -1
- package/lib/rtp/src/processor_v2/source/rtp.d.ts +0 -14
- package/lib/rtp/src/processor_v2/source/rtp.js +0 -24
- package/lib/rtp/src/processor_v2/source/rtp.js.map +0 -1
- package/lib/rtp/src/processor_v2/webmLive.d.ts +0 -51
- package/lib/rtp/src/processor_v2/webmLive.js +0 -154
- package/lib/rtp/src/processor_v2/webmLive.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport cloneDeep from \"lodash/cloneDeep\";\nimport isEqual from \"lodash/isEqual\";\nimport Event from \"rx.mini\";\nimport * as uuid from \"uuid\";\n\nimport { Profile } from \"../../dtls/src/context/srtp\";\nimport { Message } from \"../../ice/src/stun/message\";\nimport { Protocol } from \"../../ice/src/types/model\";\nimport {\n Address,\n deepMerge,\n InterfaceAddresses,\n Recvonly,\n Sendonly,\n Sendrecv,\n} from \".\";\nimport {\n codecParametersFromString,\n DtlsKeys,\n useNACK,\n usePLI,\n useREMB,\n} from \".\";\nimport {\n DISCARD_HOST,\n DISCARD_PORT,\n SenderDirections,\n SRTP_PROFILE,\n} from \"./const\";\nimport { RTCDataChannel, RTCDataChannelParameters } from \"./dataChannel\";\nimport { enumerate, EventTarget } from \"./helper\";\nimport {\n RTCRtpCodecParameters,\n RTCRtpCodingParameters,\n RTCRtpHeaderExtensionParameters,\n RTCRtpParameters,\n RTCRtpReceiveParameters,\n RTCRtpRtxParameters,\n RTCRtpSimulcastParameters,\n} from \"./media/parameters\";\nimport { RtpRouter } from \"./media/router\";\nimport { RTCRtpReceiver } from \"./media/rtpReceiver\";\nimport { RTCRtpSender } from \"./media/rtpSender\";\nimport {\n Direction,\n RTCRtpTransceiver,\n TransceiverOptions,\n} from \"./media/rtpTransceiver\";\nimport { MediaStream, MediaStreamTrack } from \"./media/track\";\nimport {\n addSDPHeader,\n GroupDescription,\n MediaDescription,\n SessionDescription,\n SsrcDescription,\n} from \"./sdp\";\nimport { RTCCertificate, RTCDtlsTransport } from \"./transport/dtls\";\nimport {\n IceCandidate,\n IceGathererState,\n RTCIceCandidate,\n RTCIceConnectionState,\n RTCIceGatherer,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport { ConnectionState, Kind, RTCSignalingState } from \"./types/domain\";\nimport { Callback, CallbackWithValue } from \"./types/util\";\nimport {\n andDirection,\n parseIceServers,\n reverseDirection,\n reverseSimulcastDirection,\n} from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/peerConnection.ts\");\n\nexport class RTCPeerConnection extends EventTarget {\n readonly cname = uuid.v4();\n sctpTransport?: RTCSctpTransport;\n masterTransportEstablished = false;\n config: Required<PeerConfig> = cloneDeep<PeerConfig>(defaultPeerConfig);\n connectionState: ConnectionState = \"new\";\n iceConnectionState: RTCIceConnectionState = \"new\";\n iceGatheringState: IceGathererState = \"new\";\n signalingState: RTCSignalingState = \"stable\";\n negotiationneeded = false;\n readonly transceivers: RTCRtpTransceiver[] = [];\n\n readonly iceGatheringStateChange = new Event<[IceGathererState]>();\n readonly iceConnectionStateChange = new Event<[RTCIceConnectionState]>();\n readonly signalingStateChange = new Event<[RTCSignalingState]>();\n readonly connectionStateChange = new Event<[ConnectionState]>();\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onIceCandidate = new Event<[RTCIceCandidate]>();\n readonly onNegotiationneeded = new Event<[]>();\n readonly onTrack = new Event<[MediaStreamTrack]>();\n\n ondatachannel?: CallbackWithValue<RTCDataChannelEvent>;\n onicecandidate?: CallbackWithValue<RTCPeerConnectionIceEvent>;\n onnegotiationneeded?: CallbackWithValue<any>;\n onsignalingstatechange?: CallbackWithValue<any>;\n ontrack?: CallbackWithValue<RTCTrackEvent>;\n onconnectionstatechange?: Callback;\n\n private readonly router = new RtpRouter();\n private readonly certificates: RTCCertificate[] = [];\n sctpRemotePort?: number;\n private seenMid = new Set<string>();\n private currentLocalDescription?: SessionDescription;\n private currentRemoteDescription?: SessionDescription;\n private pendingLocalDescription?: SessionDescription;\n private pendingRemoteDescription?: SessionDescription;\n private isClosed = false;\n private shouldNegotiationneeded = false;\n\n get dtlsTransports() {\n const transports = this.transceivers.map((t) => t.dtlsTransport);\n if (this.sctpTransport) {\n transports.push(this.sctpTransport.dtlsTransport);\n }\n return transports.reduce((acc: RTCDtlsTransport[], cur) => {\n if (!acc.map((d) => d.id).includes(cur.id)) {\n acc.push(cur);\n }\n return acc;\n }, []);\n }\n get iceTransports() {\n return this.dtlsTransports.map((d) => d.iceTransport);\n }\n\n constructor(config: Partial<PeerConfig> = {}) {\n super();\n\n deepMerge(this.config, config);\n\n if (this.config.icePortRange) {\n const [min, max] = this.config.icePortRange;\n if (min === max) throw new Error(\"should not be same value\");\n if (min >= max) throw new Error(\"The min must be less than max\");\n }\n\n for (const [i, codecParams] of enumerate([\n ...(this.config.codecs.audio || []),\n ...(this.config.codecs.video || []),\n ])) {\n if (codecParams.payloadType != undefined) {\n continue;\n }\n\n codecParams.payloadType = 96 + i;\n switch (codecParams.name.toLowerCase()) {\n case \"rtx\":\n {\n codecParams.parameters = `apt=${codecParams.payloadType - 1}`;\n }\n break;\n case \"red\":\n {\n if (codecParams.contentType === \"audio\") {\n const redundant = codecParams.payloadType + 1;\n codecParams.parameters = `${redundant}/${redundant}`;\n codecParams.payloadType = 63;\n }\n }\n break;\n }\n }\n\n [\n ...(this.config.headerExtensions.audio || []),\n ...(this.config.headerExtensions.video || []),\n ].forEach((v, i) => {\n v.id = 1 + i;\n });\n\n if (this.config.dtls) {\n const { keys } = this.config.dtls;\n if (keys) {\n this.certificates.push(\n new RTCCertificate(keys.keyPem, keys.certPem, keys.signatureHash)\n );\n }\n }\n\n this.iceConnectionStateChange.subscribe((state) => {\n switch (state) {\n case \"disconnected\":\n this.setConnectionState(\"disconnected\");\n break;\n case \"closed\":\n this.close();\n break;\n }\n });\n }\n\n get localDescription() {\n if (!this._localDescription) return;\n return this._localDescription.toJSON();\n }\n\n get remoteDescription() {\n if (!this._remoteDescription) return;\n return this._remoteDescription.toJSON();\n }\n\n private get _localDescription() {\n return this.pendingLocalDescription || this.currentLocalDescription;\n }\n\n private get _remoteDescription() {\n return this.pendingRemoteDescription || this.currentRemoteDescription;\n }\n\n private getTransceiverByMid(mid: string) {\n return this.transceivers.find((transceiver) => transceiver.mid === mid);\n }\n\n private getTransceiverByMLineIndex(index: number) {\n return this.transceivers.find(\n (transceiver) => transceiver.mLineIndex === index\n );\n }\n\n async createOffer() {\n await this.ensureCerts();\n const description = this.buildOfferSdp();\n return description.toJSON();\n }\n\n private assignTransceiverCodecs(transceiver: RTCRtpTransceiver) {\n const codecs = (\n this.config.codecs[transceiver.kind] as RTCRtpCodecParameters[]\n ).filter((codecCandidate) => {\n switch (codecCandidate.direction) {\n case \"recvonly\": {\n if ([Recvonly, Sendrecv].includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendonly\": {\n if ([Sendonly, Sendrecv].includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendrecv\": {\n if ([Sendrecv, Recvonly, Sendonly].includes(transceiver.direction))\n return true;\n return false;\n }\n case \"all\": {\n return true;\n }\n default:\n return false;\n }\n });\n transceiver.codecs = codecs;\n }\n\n buildOfferSdp() {\n this.transceivers.forEach((transceiver) => {\n if (transceiver.codecs.length === 0) {\n this.assignTransceiverCodecs(transceiver);\n }\n if (transceiver.headerExtensions.length === 0) {\n transceiver.headerExtensions =\n this.config.headerExtensions[transceiver.kind] ?? [];\n }\n });\n\n const description = new SessionDescription();\n addSDPHeader(\"offer\", description);\n\n // # handle existing transceivers / sctp\n\n const currentMedia = this._localDescription\n ? this._localDescription.media\n : [];\n\n currentMedia.forEach((m, i) => {\n const mid = m.rtp.muxId;\n if (!mid) {\n log(\"mid missing\", m);\n return;\n }\n if (m.kind === \"application\") {\n if (!this.sctpTransport) {\n throw new Error(\"sctpTransport not found\");\n }\n this.sctpTransport.mLineIndex = i;\n description.media.push(\n createMediaDescriptionForSctp(this.sctpTransport)\n );\n } else {\n const transceiver = this.getTransceiverByMid(mid);\n if (!transceiver) {\n throw new Error(\"transceiver not found\");\n }\n transceiver.mLineIndex = i;\n description.media.push(\n createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n transceiver.direction\n )\n );\n }\n });\n\n // # handle new transceivers / sctp\n this.transceivers\n .filter((t) => !description.media.find((m) => m.rtp.muxId === t.mid))\n .forEach((transceiver) => {\n transceiver.mLineIndex = description.media.length;\n if (transceiver.mid == undefined) {\n transceiver.mid = allocateMid(this.seenMid, \"av\");\n }\n description.media.push(\n createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n transceiver.direction\n )\n );\n });\n\n if (\n this.sctpTransport &&\n !description.media.find((m) => m.kind === \"application\")\n ) {\n this.sctpTransport.mLineIndex = description.media.length;\n if (this.sctpTransport.mid == undefined) {\n this.sctpTransport.mid = allocateMid(this.seenMid, \"dc\");\n }\n description.media.push(createMediaDescriptionForSctp(this.sctpTransport));\n }\n\n if (this.config.bundlePolicy !== \"disable\") {\n const mids = description.media\n .map((m) => m.rtp.muxId)\n .filter((v) => v) as string[];\n const bundle = new GroupDescription(\"BUNDLE\", mids);\n description.group.push(bundle);\n }\n\n return description;\n }\n\n createDataChannel(\n label: string,\n options: Partial<{\n maxPacketLifeTime?: number;\n protocol: string;\n maxRetransmits?: number;\n ordered: boolean;\n negotiated: boolean;\n id?: number;\n }> = {}\n ): RTCDataChannel {\n const base: typeof options = {\n protocol: \"\",\n ordered: true,\n negotiated: false,\n };\n const settings: Required<typeof base> = { ...base, ...options } as any;\n\n if (settings.maxPacketLifeTime && settings.maxRetransmits) {\n throw new Error(\"can not select both\");\n }\n\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n this.needNegotiation();\n }\n\n const parameters = new RTCDataChannelParameters({\n id: settings.id,\n label,\n maxPacketLifeTime: settings.maxPacketLifeTime,\n maxRetransmits: settings.maxRetransmits,\n negotiated: settings.negotiated,\n ordered: settings.ordered,\n protocol: settings.protocol,\n });\n\n const channel = new RTCDataChannel(this.sctpTransport, parameters);\n return channel;\n }\n\n removeTrack(sender: RTCRtpSender) {\n if (this.isClosed) throw new Error(\"peer closed\");\n if (!this.getSenders().find(({ ssrc }) => sender.ssrc === ssrc))\n throw new Error(\"unExist\");\n\n const transceiver = this.transceivers.find(\n ({ sender: { ssrc } }) => sender.ssrc === ssrc\n );\n if (!transceiver) throw new Error(\"unExist\");\n\n sender.stop();\n\n if (transceiver.currentDirection === \"recvonly\") {\n this.needNegotiation();\n return;\n }\n\n if (transceiver.direction === \"sendrecv\") {\n transceiver.direction = \"recvonly\";\n } else if (\n transceiver.direction === \"sendonly\" ||\n transceiver.direction === \"recvonly\"\n ) {\n transceiver.direction = \"inactive\";\n }\n this.needNegotiation();\n }\n\n private needNegotiation = async () => {\n this.shouldNegotiationneeded = true;\n if (this.negotiationneeded || this.signalingState !== \"stable\") return;\n this.shouldNegotiationneeded = false;\n setImmediate(() => {\n this.negotiationneeded = true;\n this.onNegotiationneeded.execute();\n if (this.onnegotiationneeded) this.onnegotiationneeded({});\n });\n };\n\n private createTransport(srtpProfiles: Profile[] = []) {\n const [existing] = this.iceTransports;\n\n // Gather ICE candidates for only one track. If the remote endpoint is not bundle-aware, negotiate only one media track.\n // https://w3c.github.io/webrtc-pc/#rtcbundlepolicy-enum\n if (this.config.bundlePolicy === \"max-bundle\") {\n if (existing) {\n return this.dtlsTransports[0];\n }\n }\n\n const iceGatherer = new RTCIceGatherer({\n ...parseIceServers(this.config.iceServers),\n forceTurn: this.config.iceTransportPolicy === \"relay\",\n portRange: this.config.icePortRange,\n interfaceAddresses: this.config.iceInterfaceAddresses,\n filterStunResponse: this.config.iceFilterStunResponse,\n useIpv4: this.config.iceUseIpv4,\n useIpv6: this.config.iceUseIpv6,\n });\n if (existing) {\n iceGatherer.connection.localUserName = existing.connection.localUserName;\n iceGatherer.connection.localPassword = existing.connection.localPassword;\n }\n iceGatherer.onGatheringStateChange.subscribe(() => {\n this.updateIceGatheringState();\n });\n this.updateIceGatheringState();\n const iceTransport = new RTCIceTransport(iceGatherer);\n iceTransport.onStateChange.subscribe(() => {\n this.updateIceConnectionState();\n });\n\n iceTransport.iceGather.onIceCandidate = (candidate) => {\n if (!this.localDescription) return;\n\n if (this.config.bundlePolicy === \"max-bundle\" || this.remoteIsBundled) {\n candidate.sdpMLineIndex = 0;\n const media = this._localDescription?.media[0];\n if (media) {\n candidate.sdpMid = media.rtp.muxId;\n }\n } else {\n const transceiver = this.transceivers.find(\n (t) => t.dtlsTransport.iceTransport.id === iceTransport.id\n );\n if (transceiver) {\n candidate.sdpMLineIndex = transceiver.mLineIndex;\n candidate.sdpMid = transceiver.mid;\n }\n if (\n this.sctpTransport?.dtlsTransport.iceTransport.id === iceTransport.id\n ) {\n candidate.sdpMLineIndex = this.sctpTransport.mLineIndex;\n candidate.sdpMid = this.sctpTransport.mid;\n }\n }\n\n candidate.foundation = \"candidate:\" + candidate.foundation;\n\n this.onIceCandidate.execute(candidate.toJSON());\n if (this.onicecandidate) {\n this.onicecandidate({ candidate: candidate.toJSON() });\n }\n this.emit(\"icecandidate\", { candidate });\n };\n\n const dtlsTransport = new RTCDtlsTransport(\n this.config,\n iceTransport,\n this.router,\n this.certificates,\n srtpProfiles\n );\n\n return dtlsTransport;\n }\n\n private createSctpTransport() {\n const dtlsTransport = this.createTransport([\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n ]);\n const sctp = new RTCSctpTransport();\n sctp.setDtlsTransport(dtlsTransport);\n sctp.mid = undefined;\n\n sctp.onDataChannel.subscribe((channel) => {\n this.onDataChannel.execute(channel);\n\n const event: RTCDataChannelEvent = { channel };\n if (this.ondatachannel) this.ondatachannel(event);\n this.emit(\"datachannel\", event);\n });\n\n this.sctpTransport = sctp;\n this.updateIceConnectionState();\n\n return sctp;\n }\n\n async setLocalDescription(sessionDescription: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }): Promise<SessionDescription> {\n // # parse and validate description\n const description = SessionDescription.parse(sessionDescription.sdp);\n description.type = sessionDescription.type;\n this.validateDescription(description, true);\n\n // # update signaling state\n if (description.type === \"offer\") {\n this.setSignalingState(\"have-local-offer\");\n } else if (description.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // # assign MID\n description.media.forEach((media, i) => {\n const mid = media.rtp.muxId!;\n this.seenMid.add(mid);\n if ([\"audio\", \"video\"].includes(media.kind)) {\n const transceiver = this.getTransceiverByMLineIndex(i);\n if (transceiver) {\n transceiver.mid = mid;\n }\n }\n if (media.kind === \"application\" && this.sctpTransport) {\n this.sctpTransport.mid = mid;\n }\n });\n\n const setupRole = (dtlsTransport: RTCDtlsTransport) => {\n const iceTransport = dtlsTransport.iceTransport;\n\n // # set ICE role\n if (description.type === \"offer\") {\n iceTransport.connection.iceControlling = true;\n } else {\n iceTransport.connection.iceControlling = false;\n }\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (iceTransport.connection.remoteIsLite) {\n iceTransport.connection.iceControlling = true;\n }\n\n // # set DTLS role for mediasoup\n if (description.type === \"answer\") {\n const role = description.media.find((media) => media.dtlsParams)\n ?.dtlsParams?.role;\n if (role) {\n dtlsTransport.role = role;\n }\n }\n };\n this.dtlsTransports.forEach((d) => setupRole(d));\n\n // # configure direction\n this.transceivers.forEach((t) => {\n if ([\"answer\", \"pranswer\"].includes(description.type)) {\n const direction = andDirection(t.direction, t.offerDirection);\n t.currentDirection = direction;\n }\n });\n\n // for trickle ice\n this.setLocal(description);\n\n // connect transports\n if (description.type === \"answer\") {\n log(\"callee start connect\");\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.setConnectionState(\"failed\");\n });\n }\n\n // # gather candidates\n await Promise.all(\n this.iceTransports.map((iceTransport) => iceTransport.iceGather.gather())\n );\n\n description.media\n .filter((m) => [\"audio\", \"video\"].includes(m.kind))\n .forEach((m, i) => {\n addTransportDescription(m, this.transceivers[i].dtlsTransport);\n });\n const sctpMedia = description.media.find((m) => m.kind === \"application\");\n if (this.sctpTransport && sctpMedia) {\n addTransportDescription(sctpMedia, this.sctpTransport.dtlsTransport);\n }\n\n this.setLocal(description);\n\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n\n return description;\n }\n\n private setLocal(description: SessionDescription) {\n if (description.type === \"answer\") {\n this.currentLocalDescription = description;\n this.pendingLocalDescription = undefined;\n } else {\n this.pendingLocalDescription = description;\n }\n }\n\n private getTransportByMid(mid: string) {\n let iceTransport: RTCIceTransport | undefined;\n\n const transceiver = this.transceivers.find((t) => t.mid === mid);\n if (transceiver) {\n iceTransport = transceiver.dtlsTransport.iceTransport;\n } else if (!iceTransport && this.sctpTransport?.mid === mid) {\n iceTransport = this.sctpTransport?.dtlsTransport.iceTransport;\n }\n\n return iceTransport;\n }\n\n private getTransportByMLineIndex(index: number) {\n const sdp = this.buildOfferSdp();\n const media = sdp.media[index];\n if (!media) {\n return;\n }\n const transport = this.getTransportByMid(media.rtp.muxId!);\n\n return transport;\n }\n\n async addIceCandidate(candidateMessage: RTCIceCandidate) {\n const candidate = IceCandidate.fromJSON(candidateMessage);\n if (!candidate) {\n return;\n }\n\n let iceTransport: RTCIceTransport | undefined;\n\n if (typeof candidate.sdpMid === \"number\") {\n iceTransport = this.getTransportByMid(candidate.sdpMid);\n }\n\n if (!iceTransport && typeof candidate.sdpMLineIndex === \"number\") {\n iceTransport = this.getTransportByMLineIndex(candidate.sdpMLineIndex);\n }\n\n if (!iceTransport) {\n iceTransport = this.iceTransports[0];\n }\n\n if (iceTransport) {\n await iceTransport.addRemoteCandidate(candidate);\n } else {\n log(\"iceTransport not found\", candidate);\n }\n }\n\n private async connect() {\n if (this.masterTransportEstablished) return;\n\n this.setConnectionState(\"connecting\");\n\n await Promise.all(\n this.dtlsTransports.map(async (dtlsTransport) => {\n const { iceTransport } = dtlsTransport;\n await iceTransport.start().catch((err) => {\n log(\"iceTransport.start failed\", err);\n throw err;\n });\n await dtlsTransport.start().catch((err) => {\n log(\"dtlsTransport.start failed\", err);\n throw err;\n });\n if (\n this.sctpTransport &&\n this.sctpRemotePort &&\n this.sctpTransport.dtlsTransport.id === dtlsTransport.id\n ) {\n await this.sctpTransport.start(this.sctpRemotePort);\n await this.sctpTransport.sctp.stateChanged.connected.asPromise();\n log(\"sctp connected\");\n }\n })\n );\n\n this.masterTransportEstablished = true;\n this.setConnectionState(\"connected\");\n }\n\n private getLocalRtpParams(transceiver: RTCRtpTransceiver): RTCRtpParameters {\n if (transceiver.mid == undefined) throw new Error(\"mid not assigned\");\n\n const rtp: RTCRtpParameters = {\n codecs: transceiver.codecs,\n muxId: transceiver.mid,\n headerExtensions: transceiver.headerExtensions,\n rtcp: { cname: this.cname, ssrc: transceiver.sender.ssrc, mux: true },\n };\n return rtp;\n }\n\n private getRemoteRtpParams(\n media: MediaDescription,\n transceiver: RTCRtpTransceiver\n ): RTCRtpReceiveParameters {\n const receiveParameters: RTCRtpReceiveParameters = {\n muxId: media.rtp.muxId,\n rtcp: media.rtp.rtcp,\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n encodings: Object.values(\n transceiver.codecs.reduce(\n (acc: { [pt: number]: RTCRtpCodingParameters }, codec) => {\n if (codec.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(codec.parameters ?? \"\");\n const apt = acc[params[\"apt\"]];\n if (apt && media.ssrc.length === 2) {\n apt.rtx = new RTCRtpRtxParameters({ ssrc: media.ssrc[1].ssrc });\n }\n return acc;\n }\n acc[codec.payloadType] = new RTCRtpCodingParameters({\n ssrc: media.ssrc[0]?.ssrc,\n payloadType: codec.payloadType,\n });\n return acc;\n },\n {}\n )\n ),\n };\n\n return receiveParameters;\n }\n\n get remoteIsBundled() {\n const remoteSdp = this._remoteDescription;\n if (!remoteSdp) return;\n const bundle = remoteSdp.group.find(\n (g) => g.semantic === \"BUNDLE\" && this.config.bundlePolicy !== \"disable\"\n );\n return bundle;\n }\n\n async setRemoteDescription(sessionDescription: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }) {\n // # parse and validate description\n const remoteSdp = SessionDescription.parse(sessionDescription.sdp);\n remoteSdp.type = sessionDescription.type;\n this.validateDescription(remoteSdp, false);\n\n if (remoteSdp.type === \"answer\") {\n this.currentRemoteDescription = remoteSdp;\n this.pendingRemoteDescription = undefined;\n } else {\n this.pendingRemoteDescription = remoteSdp;\n }\n\n let bundleTransport: RTCDtlsTransport | undefined;\n\n // # apply description\n\n const transports = enumerate(remoteSdp.media).map(([i, remoteMedia]) => {\n let dtlsTransport: RTCDtlsTransport | undefined;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n let transceiver = this.transceivers.find(\n (t) =>\n t.kind === remoteMedia.kind &&\n [undefined, remoteMedia.rtp.muxId].includes(t.mid)\n );\n if (!transceiver) {\n // create remote transceiver\n transceiver = this.addTransceiver(remoteMedia.kind, {\n direction: \"recvonly\",\n });\n transceiver.mid = remoteMedia.rtp.muxId;\n this.onRemoteTransceiverAdded.execute(transceiver);\n }\n\n if (this.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = transceiver.dtlsTransport;\n } else {\n transceiver.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = transceiver.dtlsTransport;\n\n this.setRemoteRTP(transceiver, remoteMedia, remoteSdp.type, i);\n } else if (remoteMedia.kind === \"application\") {\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n this.sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n\n if (this.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = this.sctpTransport.dtlsTransport;\n } else {\n this.sctpTransport.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = this.sctpTransport.dtlsTransport;\n\n this.setRemoteSCTP(remoteMedia, this.sctpTransport, i);\n } else {\n throw new Error(\"invalid media kind\");\n }\n\n const iceTransport = dtlsTransport.iceTransport;\n\n if (remoteMedia.iceParams && remoteMedia.dtlsParams) {\n iceTransport.setRemoteParams(remoteMedia.iceParams);\n dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);\n\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (remoteMedia.iceParams?.iceLite) {\n iceTransport.connection.iceControlling = true;\n }\n }\n\n // # add ICE candidates\n remoteMedia.iceCandidates.forEach(iceTransport.addRemoteCandidate);\n\n if (remoteMedia.iceCandidatesComplete) {\n iceTransport.addRemoteCandidate(undefined);\n }\n\n // # set DTLS role\n if (remoteSdp.type === \"answer\" && remoteMedia.dtlsParams?.role) {\n dtlsTransport.role =\n remoteMedia.dtlsParams.role === \"client\" ? \"server\" : \"client\";\n }\n return iceTransport;\n });\n\n if (remoteSdp.type === \"offer\") {\n this.setSignalingState(\"have-remote-offer\");\n } else if (remoteSdp.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // connect transports\n if (remoteSdp.type === \"answer\") {\n log(\"caller start connect\");\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.setConnectionState(\"failed\");\n });\n }\n\n await Promise.all(\n transports.map(async (iceTransport) => {\n await iceTransport.iceGather.gather();\n })\n );\n\n this.negotiationneeded = false;\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n }\n\n private setRemoteRTP(\n transceiver: RTCRtpTransceiver,\n remoteMedia: MediaDescription,\n type: \"offer\" | \"answer\",\n mLineIndex: number\n ) {\n if (!transceiver.mid) {\n transceiver.mid = remoteMedia.rtp.muxId;\n transceiver.mLineIndex = mLineIndex;\n }\n\n // # negotiate codecs\n transceiver.codecs = remoteMedia.rtp.codecs.filter((remoteCodec) => {\n const localCodecs = this.config.codecs[remoteMedia.kind] || [];\n\n const existCodec = findCodecByMimeType(localCodecs, remoteCodec);\n if (!existCodec) return false;\n\n if (existCodec?.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(existCodec.parameters ?? \"\");\n const pt = params[\"apt\"];\n const origin = remoteMedia.rtp.codecs.find((c) => c.payloadType === pt);\n if (!origin) return false;\n return !!findCodecByMimeType(localCodecs, origin);\n }\n\n return true;\n });\n\n log(\"negotiated codecs\", transceiver.codecs);\n if (transceiver.codecs.length === 0) {\n throw new Error(\"negotiate codecs failed.\");\n }\n transceiver.headerExtensions = remoteMedia.rtp.headerExtensions.filter(\n (extension) =>\n (this.config.headerExtensions[remoteMedia.kind as Media] || []).find(\n (v) => v.uri === extension.uri\n )\n );\n\n // # configure direction\n const mediaDirection = remoteMedia.direction || \"inactive\";\n const direction = reverseDirection(mediaDirection);\n if ([\"answer\", \"pranswer\"].includes(type)) {\n transceiver.currentDirection = direction;\n } else {\n transceiver.offerDirection = direction;\n }\n\n const localParams = this.getLocalRtpParams(transceiver);\n transceiver.sender.prepareSend(localParams);\n\n if ([\"recvonly\", \"sendrecv\"].includes(transceiver.direction)) {\n const remotePrams = this.getRemoteRtpParams(remoteMedia, transceiver);\n\n // register simulcast receiver\n remoteMedia.simulcastParameters.forEach((param) => {\n this.router.registerRtpReceiverByRid(transceiver, param, remotePrams);\n });\n\n transceiver.receiver.prepareReceive(remotePrams);\n // register ssrc receiver\n this.router.registerRtpReceiverBySsrc(transceiver, remotePrams);\n }\n if ([\"sendonly\", \"sendrecv\"].includes(mediaDirection)) {\n // assign msid\n if (remoteMedia.msid != undefined) {\n const [streamId, trackId] = remoteMedia.msid.split(\" \");\n transceiver.receiver.remoteStreamId = streamId;\n transceiver.receiver.remoteTrackId = trackId;\n\n this.fireOnTrack(\n transceiver.receiver.track,\n transceiver,\n new MediaStream({\n id: streamId,\n tracks: [transceiver.receiver.track],\n })\n );\n }\n }\n\n transceiver.receiver.setupTWCC(remoteMedia.ssrc[0]?.ssrc);\n }\n\n private setRemoteSCTP(\n remoteMedia: MediaDescription,\n sctpTransport: RTCSctpTransport,\n mLineIndex: number\n ) {\n // # configure sctp\n this.sctpRemotePort = remoteMedia.sctpPort;\n if (!this.sctpRemotePort) {\n throw new Error(\"sctpRemotePort not exist\");\n }\n\n sctpTransport.setRemotePort(this.sctpRemotePort);\n sctpTransport.mLineIndex = mLineIndex;\n if (!sctpTransport.mid) {\n sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n }\n\n private validateDescription(\n description: SessionDescription,\n isLocal: boolean\n ) {\n if (isLocal) {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-local-offer\"].includes(this.signalingState))\n throw new Error(\"Cannot handle offer in signaling state\");\n } else if (description.type === \"answer\") {\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(\n this.signalingState\n )\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n } else {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-remote-offer\"].includes(this.signalingState)) {\n throw new Error(\"Cannot handle offer in signaling state\");\n }\n } else if (description.type === \"answer\") {\n if (\n ![\"have-local-offer\", \"have-remote-pranswer\"].includes(\n this.signalingState\n )\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n }\n\n description.media.forEach((media) => {\n if (media.direction === \"inactive\") return;\n if (\n !media.iceParams ||\n !media.iceParams.usernameFragment ||\n !media.iceParams.password\n )\n throw new Error(\"ICE username fragment or password is missing\");\n });\n\n if ([\"answer\", \"pranswer\"].includes(description.type || \"\")) {\n const offer = isLocal ? this._remoteDescription : this._localDescription;\n if (!offer) throw new Error();\n\n const answerMedia = description.media.map((v, i) => [v.kind, i]);\n const offerMedia = offer.media.map((v, i) => [v.kind, i]);\n if (!isEqual(offerMedia, answerMedia)) {\n throw new Error(\"Media sections in answer do not match offer\");\n }\n }\n }\n\n private fireOnTrack(\n track: MediaStreamTrack,\n transceiver: RTCRtpTransceiver,\n stream: MediaStream\n ) {\n const event: RTCTrackEvent = {\n track,\n streams: [stream],\n transceiver,\n receiver: transceiver.receiver,\n };\n this.onTrack.execute(track);\n this.emit(\"track\", event);\n if (this.ontrack) this.ontrack(event);\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {}\n ) {\n const kind =\n typeof trackOrKind === \"string\" ? trackOrKind : trackOrKind.kind;\n\n const direction = options.direction || \"sendrecv\";\n\n const dtlsTransport = this.createTransport([\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n ]);\n\n const sender = new RTCRtpSender(trackOrKind);\n const receiver = new RTCRtpReceiver(this.config, kind, sender.ssrc);\n const transceiver = new RTCRtpTransceiver(\n kind,\n dtlsTransport,\n receiver,\n sender,\n direction\n );\n transceiver.options = options;\n this.router.registerRtpSender(transceiver.sender);\n\n this.transceivers.push(transceiver);\n this.onTransceiverAdded.execute(transceiver);\n\n this.updateIceConnectionState();\n this.needNegotiation();\n\n return transceiver;\n }\n\n getTransceivers() {\n return this.transceivers;\n }\n\n getSenders(): RTCRtpSender[] {\n return this.getTransceivers().map((t) => t.sender);\n }\n\n getReceivers() {\n return this.getTransceivers().map((t) => t.receiver);\n }\n\n // todo fix\n addTrack(\n track: MediaStreamTrack,\n /**todo impl */\n ms?: MediaStream\n ) {\n if (this.isClosed) throw new Error(\"is closed\");\n if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {\n throw new Error(\"track exist\");\n }\n\n const emptyTrackSender = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === true\n );\n if (emptyTrackSender) {\n const sender = emptyTrackSender.sender;\n sender.registerTrack(track);\n this.needNegotiation();\n return sender;\n }\n\n const notSendTransceiver = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === false &&\n !t.usedForSender\n );\n if (notSendTransceiver) {\n const sender = notSendTransceiver.sender;\n sender.registerTrack(track);\n switch (notSendTransceiver.direction) {\n case \"recvonly\":\n notSendTransceiver.direction = \"sendrecv\";\n break;\n case \"inactive\":\n notSendTransceiver.direction = \"sendonly\";\n break;\n }\n this.needNegotiation();\n return sender;\n } else {\n const transceiver = this.addTransceiver(track, { direction: \"sendrecv\" });\n this.needNegotiation();\n return transceiver.sender;\n }\n }\n\n private async ensureCerts() {\n const ensureCert = async (dtlsTransport: RTCDtlsTransport) => {\n if (this.certificates.length === 0) {\n const localCertificate = await dtlsTransport.setupCertificate();\n this.certificates.push(localCertificate);\n } else {\n dtlsTransport.localCertificate = this.certificates[0];\n }\n };\n\n for (const dtlsTransport of this.dtlsTransports) {\n await ensureCert(dtlsTransport);\n }\n }\n\n async createAnswer() {\n await this.ensureCerts();\n const description = this.buildAnswer();\n return description.toJSON();\n }\n\n private buildAnswer() {\n this.assertNotClosed();\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(\n this.signalingState\n )\n ) {\n throw new Error(\"createAnswer failed\");\n }\n if (!this._remoteDescription) {\n throw new Error(\"wrong state\");\n }\n\n const description = new SessionDescription();\n addSDPHeader(\"answer\", description);\n\n this._remoteDescription.media.forEach((remoteMedia) => {\n let dtlsTransport!: RTCDtlsTransport;\n let media: MediaDescription;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n const transceiver = this.getTransceiverByMid(remoteMedia.rtp.muxId!)!;\n media = createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n andDirection(transceiver.direction, transceiver.offerDirection)\n );\n dtlsTransport = transceiver.dtlsTransport;\n } else if (remoteMedia.kind === \"application\") {\n if (!this.sctpTransport || !this.sctpTransport.mid) {\n throw new Error(\"sctpTransport not found\");\n }\n media = createMediaDescriptionForSctp(this.sctpTransport);\n\n dtlsTransport = this.sctpTransport.dtlsTransport;\n } else {\n throw new Error(\"invalid kind\");\n }\n\n // # determine DTLS role, or preserve the currently configured role\n if (!media.dtlsParams) {\n throw new Error(\"dtlsParams missing\");\n }\n if (dtlsTransport.role === \"auto\") {\n media.dtlsParams.role = \"client\";\n } else {\n media.dtlsParams.role = dtlsTransport.role;\n }\n\n media.simulcastParameters = remoteMedia.simulcastParameters.map((v) => ({\n ...v,\n direction: reverseSimulcastDirection(v.direction),\n }));\n\n description.media.push(media);\n });\n\n if (this.config.bundlePolicy !== \"disable\") {\n const bundle = new GroupDescription(\"BUNDLE\", []);\n description.media.forEach((media) => {\n bundle.items.push(media.rtp.muxId!);\n });\n description.group.push(bundle);\n }\n\n return description;\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.setSignalingState(\"closed\");\n this.setConnectionState(\"closed\");\n\n this.transceivers.forEach((transceiver) => {\n transceiver.receiver.stop();\n transceiver.sender.stop();\n });\n\n if (this.sctpTransport) {\n await this.sctpTransport.stop();\n }\n for (const dtlsTransport of this.dtlsTransports) {\n await dtlsTransport.stop();\n await dtlsTransport.iceTransport.stop();\n }\n\n this.dispose();\n log(\"peerConnection closed\");\n }\n\n private assertNotClosed() {\n if (this.isClosed) {\n throw new Error(\"RTCPeerConnection is closed\");\n }\n }\n\n // https://w3c.github.io/webrtc-pc/#dom-rtcicegatheringstate\n private updateIceGatheringState() {\n const all = this.iceTransports;\n\n function allMatch(...state: IceGathererState[]) {\n return (\n all.filter((check) => state.includes(check.iceGather.gatheringState))\n .length === all.length\n );\n }\n\n let newState: IceGathererState;\n\n if (all.length && allMatch(\"complete\")) {\n newState = \"complete\";\n } else if (!all.length || allMatch(\"new\", \"complete\")) {\n newState = \"new\";\n } else if (\n all.map((check) => check.iceGather.gatheringState).includes(\"gathering\")\n ) {\n newState = \"gathering\";\n } else {\n newState = \"new\";\n }\n\n if (this.iceGatheringState === newState) {\n return;\n }\n\n log(\"iceGatheringStateChange\", newState);\n this.iceGatheringState = newState;\n this.iceGatheringStateChange.execute(newState);\n this.emit(\"icegatheringstatechange\", newState);\n }\n\n // https://w3c.github.io/webrtc-pc/#dom-rtciceconnectionstate\n private updateIceConnectionState() {\n const all = this.iceTransports;\n let newState: RTCIceConnectionState;\n\n function allMatch(...state: RTCIceConnectionState[]) {\n return (\n all.filter((check) => state.includes(check.state)).length === all.length\n );\n }\n\n if (this.connectionState === \"closed\") {\n newState = \"closed\";\n } else if (allMatch(\"failed\")) {\n newState = \"failed\";\n } else if (allMatch(\"disconnected\")) {\n newState = \"disconnected\";\n } else if (allMatch(\"new\", \"closed\")) {\n newState = \"new\";\n } else if (allMatch(\"new\", \"checking\")) {\n newState = \"checking\";\n } else if (allMatch(\"completed\", \"closed\")) {\n newState = \"completed\";\n } else if (allMatch(\"connected\", \"completed\", \"closed\")) {\n newState = \"connected\";\n } else {\n // unreachable?\n newState = \"new\";\n }\n\n if (this.iceConnectionState === newState) {\n return;\n }\n\n log(\"iceConnectionStateChange\", newState);\n this.iceConnectionState = newState;\n this.iceConnectionStateChange.execute(newState);\n this.emit(\"iceconnectionstatechange\", newState);\n }\n\n private setSignalingState(state: RTCSignalingState) {\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) this.onsignalingstatechange({});\n }\n\n private setConnectionState(state: ConnectionState) {\n log(\"connectionStateChange\", state);\n this.connectionState = state;\n this.connectionStateChange.execute(state);\n if (this.onconnectionstatechange) this.onconnectionstatechange();\n this.emit(\"connectionstatechange\");\n }\n\n private dispose() {\n this.onDataChannel.allUnsubscribe();\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.signalingStateChange.allUnsubscribe();\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n }\n}\n\nexport function createMediaDescriptionForTransceiver(\n transceiver: RTCRtpTransceiver,\n cname: string,\n direction: Direction\n) {\n const media = new MediaDescription(\n transceiver.kind,\n 9,\n \"UDP/TLS/RTP/SAVPF\",\n transceiver.codecs.map((c) => c.payloadType)\n );\n media.direction = direction;\n media.msid = transceiver.msid;\n media.rtp = {\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n muxId: transceiver.mid,\n };\n media.rtcpHost = \"0.0.0.0\";\n media.rtcpPort = 9;\n media.rtcpMux = true;\n media.ssrc = [new SsrcDescription({ ssrc: transceiver.sender.ssrc, cname })];\n\n if (transceiver.options.simulcast) {\n media.simulcastParameters = transceiver.options.simulcast.map(\n (o) => new RTCRtpSimulcastParameters(o)\n );\n }\n\n if (media.rtp.codecs.find((c) => c.name.toLowerCase() === \"rtx\")) {\n media.ssrc.push(\n new SsrcDescription({ ssrc: transceiver.sender.rtxSsrc, cname })\n );\n media.ssrcGroup = [\n new GroupDescription(\"FID\", [\n transceiver.sender.ssrc.toString(),\n transceiver.sender.rtxSsrc.toString(),\n ]),\n ];\n }\n\n addTransportDescription(media, transceiver.dtlsTransport);\n return media;\n}\n\nexport function createMediaDescriptionForSctp(sctp: RTCSctpTransport) {\n const media = new MediaDescription(\n \"application\",\n DISCARD_PORT,\n \"UDP/DTLS/SCTP\",\n [\"webrtc-datachannel\"]\n );\n media.sctpPort = sctp.port;\n media.rtp.muxId = sctp.mid;\n media.sctpCapabilities = RTCSctpTransport.getCapabilities();\n\n addTransportDescription(media, sctp.dtlsTransport);\n return media;\n}\n\nexport function addTransportDescription(\n media: MediaDescription,\n dtlsTransport: RTCDtlsTransport\n) {\n const iceTransport = dtlsTransport.iceTransport;\n const iceGatherer = iceTransport.iceGather;\n\n media.iceCandidates = iceGatherer.localCandidates;\n media.iceCandidatesComplete = iceGatherer.gatheringState === \"complete\";\n media.iceParams = iceGatherer.localParameters;\n media.iceOptions = \"trickle\";\n\n if (media.iceCandidates.length > 0) {\n const candidate = media.iceCandidates[media.iceCandidates.length - 1];\n media.host = candidate.ip;\n media.port = candidate.port;\n } else {\n media.host = DISCARD_HOST;\n media.port = DISCARD_PORT;\n }\n\n if (media.direction === \"inactive\") {\n media.port = 0;\n }\n\n if (!media.dtlsParams) {\n media.dtlsParams = dtlsTransport.localParameters;\n if (!media.dtlsParams.fingerprints) {\n media.dtlsParams.fingerprints =\n dtlsTransport.localParameters.fingerprints;\n }\n }\n}\n\nexport function allocateMid(mids: Set<string>, type: \"dc\" | \"av\") {\n let mid = \"\";\n for (let i = 0; ; ) {\n // rfc9143.html#name-security-considerations\n // SHOULD be 3 bytes or fewer to allow them to efficiently fit into the MID RTP header extension\n mid = (i++).toString() + type;\n if (!mids.has(mid)) break;\n }\n mids.add(mid);\n return mid;\n}\n\nexport type BundlePolicy = \"max-compat\" | \"max-bundle\" | \"disable\";\n\nexport interface PeerConfig {\n codecs: Partial<{\n /**\n * When specifying a codec with a fixed payloadType such as PCMU,\n * it is necessary to set the correct PayloadType in RTCRtpCodecParameters in advance.\n */\n audio: RTCRtpCodecParameters[];\n video: RTCRtpCodecParameters[];\n }>;\n headerExtensions: Partial<{\n audio: RTCRtpHeaderExtensionParameters[];\n video: RTCRtpHeaderExtensionParameters[];\n }>;\n iceTransportPolicy: \"all\" | \"relay\";\n iceServers: RTCIceServer[];\n /**Minimum port and Maximum port must not be the same value */\n icePortRange: [number, number] | undefined;\n iceInterfaceAddresses: InterfaceAddresses | undefined;\n iceUseIpv4: boolean;\n iceUseIpv6: boolean;\n /** If provided, is called on each STUN request.\n * Return `true` if a STUN response should be sent, false if it should be skipped. */\n iceFilterStunResponse:\n | ((message: Message, addr: Address, protocol: Protocol) => boolean)\n | undefined;\n dtls: Partial<{\n keys: DtlsKeys;\n }>;\n bundlePolicy: BundlePolicy;\n debug: Partial<{\n /**% */\n inboundPacketLoss: number;\n /**% */\n outboundPacketLoss: number;\n /**ms */\n receiverReportDelay: number;\n disableSendNack: boolean;\n disableRecvRetransmit: boolean;\n }>;\n}\n\nexport const findCodecByMimeType = (\n codecs: RTCRtpCodecParameters[],\n target: RTCRtpCodecParameters\n) =>\n codecs.find(\n (localCodec) =>\n localCodec.mimeType.toLowerCase() === target.mimeType.toLowerCase()\n )\n ? target\n : undefined;\n\nexport type RTCIceServer = {\n urls: string;\n username?: string;\n credential?: string;\n};\n\nexport const defaultPeerConfig: PeerConfig = {\n codecs: {\n audio: [\n new RTCRtpCodecParameters({\n mimeType: \"audio/opus\",\n clockRate: 48000,\n channels: 2,\n }),\n new RTCRtpCodecParameters({\n mimeType: \"audio/PCMU\",\n clockRate: 8000,\n channels: 1,\n payloadType: 0,\n }),\n ],\n video: [\n new RTCRtpCodecParameters({\n mimeType: \"video/VP8\",\n clockRate: 90000,\n rtcpFeedback: [useNACK(), usePLI(), useREMB()],\n }),\n ],\n },\n headerExtensions: {\n audio: [],\n video: [],\n },\n iceTransportPolicy: \"all\",\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n icePortRange: undefined,\n iceInterfaceAddresses: undefined,\n iceUseIpv4: true,\n iceUseIpv6: true,\n iceFilterStunResponse: undefined,\n dtls: {},\n bundlePolicy: \"max-compat\",\n debug: {},\n};\n\nexport interface RTCTrackEvent {\n track: MediaStreamTrack;\n streams: MediaStream[];\n transceiver: RTCRtpTransceiver;\n receiver: RTCRtpReceiver;\n}\n\nexport interface RTCDataChannelEvent {\n channel: RTCDataChannel;\n}\n\nexport interface RTCPeerConnectionIceEvent {\n candidate: RTCIceCandidate;\n}\n\ntype Media = \"audio\" | \"video\";\n"]}
|
|
1
|
+
{"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport cloneDeep from \"lodash/cloneDeep\";\nimport isEqual from \"lodash/isEqual\";\nimport Event from \"rx.mini\";\nimport * as uuid from \"uuid\";\n\nimport { Profile } from \"../../dtls/src/context/srtp\";\nimport { Message } from \"../../ice/src/stun/message\";\nimport { Protocol } from \"../../ice/src/types/model\";\nimport {\n Address,\n deepMerge,\n InterfaceAddresses,\n Recvonly,\n Sendonly,\n Sendrecv,\n} from \".\";\nimport {\n codecParametersFromString,\n DtlsKeys,\n useNACK,\n usePLI,\n useREMB,\n} from \".\";\nimport {\n DISCARD_HOST,\n DISCARD_PORT,\n SenderDirections,\n SRTP_PROFILE,\n} from \"./const\";\nimport { RTCDataChannel, RTCDataChannelParameters } from \"./dataChannel\";\nimport { enumerate, EventTarget } from \"./helper\";\nimport {\n RTCRtpCodecParameters,\n RTCRtpCodingParameters,\n RTCRtpHeaderExtensionParameters,\n RTCRtpParameters,\n RTCRtpReceiveParameters,\n RTCRtpRtxParameters,\n RTCRtpSimulcastParameters,\n} from \"./media/parameters\";\nimport { RtpRouter } from \"./media/router\";\nimport { RTCRtpReceiver } from \"./media/rtpReceiver\";\nimport { RTCRtpSender } from \"./media/rtpSender\";\nimport {\n Direction,\n RTCRtpTransceiver,\n TransceiverOptions,\n} from \"./media/rtpTransceiver\";\nimport { MediaStream, MediaStreamTrack } from \"./media/track\";\nimport {\n addSDPHeader,\n GroupDescription,\n MediaDescription,\n SessionDescription,\n SsrcDescription,\n} from \"./sdp\";\nimport { RTCCertificate, RTCDtlsTransport } from \"./transport/dtls\";\nimport {\n IceCandidate,\n IceGathererState,\n RTCIceCandidate,\n RTCIceConnectionState,\n RTCIceGatherer,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport { ConnectionState, Kind, RTCSignalingState } from \"./types/domain\";\nimport { Callback, CallbackWithValue } from \"./types/util\";\nimport {\n andDirection,\n parseIceServers,\n reverseDirection,\n reverseSimulcastDirection,\n} from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/peerConnection.ts\");\n\nexport class RTCPeerConnection extends EventTarget {\n readonly cname = uuid.v4();\n sctpTransport?: RTCSctpTransport;\n masterTransportEstablished = false;\n config: Required<PeerConfig> = cloneDeep<PeerConfig>(defaultPeerConfig);\n connectionState: ConnectionState = \"new\";\n iceConnectionState: RTCIceConnectionState = \"new\";\n iceGatheringState: IceGathererState = \"new\";\n signalingState: RTCSignalingState = \"stable\";\n negotiationneeded = false;\n readonly transceivers: RTCRtpTransceiver[] = [];\n\n readonly iceGatheringStateChange = new Event<[IceGathererState]>();\n readonly iceConnectionStateChange = new Event<[RTCIceConnectionState]>();\n readonly signalingStateChange = new Event<[RTCSignalingState]>();\n readonly connectionStateChange = new Event<[ConnectionState]>();\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onIceCandidate = new Event<[RTCIceCandidate]>();\n readonly onNegotiationneeded = new Event<[]>();\n readonly onTrack = new Event<[MediaStreamTrack]>();\n\n ondatachannel?: CallbackWithValue<RTCDataChannelEvent>;\n onicecandidate?: CallbackWithValue<RTCPeerConnectionIceEvent>;\n onnegotiationneeded?: CallbackWithValue<any>;\n onsignalingstatechange?: CallbackWithValue<any>;\n ontrack?: CallbackWithValue<RTCTrackEvent>;\n onconnectionstatechange?: Callback;\n\n private readonly router = new RtpRouter();\n private readonly certificates: RTCCertificate[] = [];\n sctpRemotePort?: number;\n private seenMid = new Set<string>();\n private currentLocalDescription?: SessionDescription;\n private currentRemoteDescription?: SessionDescription;\n private pendingLocalDescription?: SessionDescription;\n private pendingRemoteDescription?: SessionDescription;\n private isClosed = false;\n private shouldNegotiationneeded = false;\n\n get dtlsTransports() {\n const transports = this.transceivers.map((t) => t.dtlsTransport);\n if (this.sctpTransport) {\n transports.push(this.sctpTransport.dtlsTransport);\n }\n return transports.reduce((acc: RTCDtlsTransport[], cur) => {\n if (!acc.map((d) => d.id).includes(cur.id)) {\n acc.push(cur);\n }\n return acc;\n }, []);\n }\n get iceTransports() {\n return this.dtlsTransports.map((d) => d.iceTransport);\n }\n\n constructor(config: Partial<PeerConfig> = {}) {\n super();\n\n deepMerge(this.config, config);\n\n if (this.config.icePortRange) {\n const [min, max] = this.config.icePortRange;\n if (min === max) throw new Error(\"should not be same value\");\n if (min >= max) throw new Error(\"The min must be less than max\");\n }\n\n for (const [i, codecParams] of enumerate([\n ...(this.config.codecs.audio || []),\n ...(this.config.codecs.video || []),\n ])) {\n if (codecParams.payloadType != undefined) {\n continue;\n }\n\n codecParams.payloadType = 96 + i;\n switch (codecParams.name.toLowerCase()) {\n case \"rtx\":\n {\n codecParams.parameters = `apt=${codecParams.payloadType - 1}`;\n }\n break;\n case \"red\":\n {\n if (codecParams.contentType === \"audio\") {\n const redundant = codecParams.payloadType + 1;\n codecParams.parameters = `${redundant}/${redundant}`;\n codecParams.payloadType = 63;\n }\n }\n break;\n }\n }\n\n [\n ...(this.config.headerExtensions.audio || []),\n ...(this.config.headerExtensions.video || []),\n ].forEach((v, i) => {\n v.id = 1 + i;\n });\n\n if (this.config.dtls) {\n const { keys } = this.config.dtls;\n if (keys) {\n this.certificates.push(\n new RTCCertificate(keys.keyPem, keys.certPem, keys.signatureHash)\n );\n }\n }\n\n this.iceConnectionStateChange.subscribe((state) => {\n switch (state) {\n case \"disconnected\":\n this.setConnectionState(\"disconnected\");\n break;\n case \"closed\":\n this.close();\n break;\n }\n });\n }\n\n get localDescription() {\n if (!this._localDescription) return;\n return this._localDescription.toJSON();\n }\n\n get remoteDescription() {\n if (!this._remoteDescription) return;\n return this._remoteDescription.toJSON();\n }\n\n private get _localDescription() {\n return this.pendingLocalDescription || this.currentLocalDescription;\n }\n\n private get _remoteDescription() {\n return this.pendingRemoteDescription || this.currentRemoteDescription;\n }\n\n private getTransceiverByMid(mid: string) {\n return this.transceivers.find((transceiver) => transceiver.mid === mid);\n }\n\n private getTransceiverByMLineIndex(index: number) {\n return this.transceivers.find(\n (transceiver) => transceiver.mLineIndex === index\n );\n }\n\n async createOffer() {\n await this.ensureCerts();\n const description = this.buildOfferSdp();\n return description.toJSON();\n }\n\n private assignTransceiverCodecs(transceiver: RTCRtpTransceiver) {\n const codecs = (\n this.config.codecs[transceiver.kind] as RTCRtpCodecParameters[]\n ).filter((codecCandidate) => {\n switch (codecCandidate.direction) {\n case \"recvonly\": {\n if ([Recvonly, Sendrecv].includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendonly\": {\n if ([Sendonly, Sendrecv].includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendrecv\": {\n if ([Sendrecv, Recvonly, Sendonly].includes(transceiver.direction))\n return true;\n return false;\n }\n case \"all\": {\n return true;\n }\n default:\n return false;\n }\n });\n transceiver.codecs = codecs;\n }\n\n buildOfferSdp() {\n this.transceivers.forEach((transceiver) => {\n if (transceiver.codecs.length === 0) {\n this.assignTransceiverCodecs(transceiver);\n }\n if (transceiver.headerExtensions.length === 0) {\n transceiver.headerExtensions =\n this.config.headerExtensions[transceiver.kind] ?? [];\n }\n });\n\n const description = new SessionDescription();\n addSDPHeader(\"offer\", description);\n\n // # handle existing transceivers / sctp\n\n const currentMedia = this._localDescription\n ? this._localDescription.media\n : [];\n\n currentMedia.forEach((m, i) => {\n const mid = m.rtp.muxId;\n if (!mid) {\n log(\"mid missing\", m);\n return;\n }\n if (m.kind === \"application\") {\n if (!this.sctpTransport) {\n throw new Error(\"sctpTransport not found\");\n }\n this.sctpTransport.mLineIndex = i;\n description.media.push(\n createMediaDescriptionForSctp(this.sctpTransport)\n );\n } else {\n const transceiver = this.getTransceiverByMid(mid);\n if (!transceiver) {\n throw new Error(\"transceiver not found\");\n }\n transceiver.mLineIndex = i;\n description.media.push(\n createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n transceiver.direction\n )\n );\n }\n });\n\n // # handle new transceivers / sctp\n this.transceivers\n .filter((t) => !description.media.find((m) => m.rtp.muxId === t.mid))\n .forEach((transceiver) => {\n transceiver.mLineIndex = description.media.length;\n if (transceiver.mid == undefined) {\n transceiver.mid = allocateMid(this.seenMid, \"av\");\n }\n description.media.push(\n createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n transceiver.direction\n )\n );\n });\n\n if (\n this.sctpTransport &&\n !description.media.find((m) => m.kind === \"application\")\n ) {\n this.sctpTransport.mLineIndex = description.media.length;\n if (this.sctpTransport.mid == undefined) {\n this.sctpTransport.mid = allocateMid(this.seenMid, \"dc\");\n }\n description.media.push(createMediaDescriptionForSctp(this.sctpTransport));\n }\n\n if (this.config.bundlePolicy !== \"disable\") {\n const mids = description.media\n .map((m) => m.rtp.muxId)\n .filter((v) => v) as string[];\n const bundle = new GroupDescription(\"BUNDLE\", mids);\n description.group.push(bundle);\n }\n\n return description;\n }\n\n createDataChannel(\n label: string,\n options: Partial<{\n maxPacketLifeTime?: number;\n protocol: string;\n maxRetransmits?: number;\n ordered: boolean;\n negotiated: boolean;\n id?: number;\n }> = {}\n ): RTCDataChannel {\n const base: typeof options = {\n protocol: \"\",\n ordered: true,\n negotiated: false,\n };\n const settings: Required<typeof base> = { ...base, ...options } as any;\n\n if (settings.maxPacketLifeTime && settings.maxRetransmits) {\n throw new Error(\"can not select both\");\n }\n\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n this.needNegotiation();\n }\n\n const parameters = new RTCDataChannelParameters({\n id: settings.id,\n label,\n maxPacketLifeTime: settings.maxPacketLifeTime,\n maxRetransmits: settings.maxRetransmits,\n negotiated: settings.negotiated,\n ordered: settings.ordered,\n protocol: settings.protocol,\n });\n\n const channel = new RTCDataChannel(this.sctpTransport, parameters);\n return channel;\n }\n\n removeTrack(sender: RTCRtpSender) {\n if (this.isClosed) throw new Error(\"peer closed\");\n if (!this.getSenders().find(({ ssrc }) => sender.ssrc === ssrc))\n throw new Error(\"unExist\");\n\n const transceiver = this.transceivers.find(\n ({ sender: { ssrc } }) => sender.ssrc === ssrc\n );\n if (!transceiver) throw new Error(\"unExist\");\n\n sender.stop();\n\n if (transceiver.currentDirection === \"recvonly\") {\n this.needNegotiation();\n return;\n }\n\n if (transceiver.direction === \"sendrecv\") {\n transceiver.direction = \"recvonly\";\n } else if (\n transceiver.direction === \"sendonly\" ||\n transceiver.direction === \"recvonly\"\n ) {\n transceiver.direction = \"inactive\";\n }\n this.needNegotiation();\n }\n\n private needNegotiation = async () => {\n this.shouldNegotiationneeded = true;\n if (this.negotiationneeded || this.signalingState !== \"stable\") return;\n this.shouldNegotiationneeded = false;\n setImmediate(() => {\n this.negotiationneeded = true;\n this.onNegotiationneeded.execute();\n if (this.onnegotiationneeded) this.onnegotiationneeded({});\n });\n };\n\n private createTransport(srtpProfiles: Profile[] = []) {\n const [existing] = this.iceTransports;\n\n // Gather ICE candidates for only one track. If the remote endpoint is not bundle-aware, negotiate only one media track.\n // https://w3c.github.io/webrtc-pc/#rtcbundlepolicy-enum\n if (this.config.bundlePolicy === \"max-bundle\") {\n if (existing) {\n return this.dtlsTransports[0];\n }\n }\n\n const iceGatherer = new RTCIceGatherer({\n ...parseIceServers(this.config.iceServers),\n forceTurn: this.config.iceTransportPolicy === \"relay\",\n portRange: this.config.icePortRange,\n interfaceAddresses: this.config.iceInterfaceAddresses,\n additionalHostAddresses: this.config.iceAdditionalHostAddresses,\n filterStunResponse: this.config.iceFilterStunResponse,\n useIpv4: this.config.iceUseIpv4,\n useIpv6: this.config.iceUseIpv6,\n });\n if (existing) {\n iceGatherer.connection.localUserName = existing.connection.localUserName;\n iceGatherer.connection.localPassword = existing.connection.localPassword;\n }\n iceGatherer.onGatheringStateChange.subscribe(() => {\n this.updateIceGatheringState();\n });\n this.updateIceGatheringState();\n const iceTransport = new RTCIceTransport(iceGatherer);\n iceTransport.onStateChange.subscribe(() => {\n this.updateIceConnectionState();\n });\n\n iceTransport.iceGather.onIceCandidate = (candidate) => {\n if (!this.localDescription) return;\n\n if (this.config.bundlePolicy === \"max-bundle\" || this.remoteIsBundled) {\n candidate.sdpMLineIndex = 0;\n const media = this._localDescription?.media[0];\n if (media) {\n candidate.sdpMid = media.rtp.muxId;\n }\n } else {\n const transceiver = this.transceivers.find(\n (t) => t.dtlsTransport.iceTransport.id === iceTransport.id\n );\n if (transceiver) {\n candidate.sdpMLineIndex = transceiver.mLineIndex;\n candidate.sdpMid = transceiver.mid;\n }\n if (\n this.sctpTransport?.dtlsTransport.iceTransport.id === iceTransport.id\n ) {\n candidate.sdpMLineIndex = this.sctpTransport.mLineIndex;\n candidate.sdpMid = this.sctpTransport.mid;\n }\n }\n\n candidate.foundation = \"candidate:\" + candidate.foundation;\n\n this.onIceCandidate.execute(candidate.toJSON());\n if (this.onicecandidate) {\n this.onicecandidate({ candidate: candidate.toJSON() });\n }\n this.emit(\"icecandidate\", { candidate });\n };\n\n const dtlsTransport = new RTCDtlsTransport(\n this.config,\n iceTransport,\n this.router,\n this.certificates,\n srtpProfiles\n );\n\n return dtlsTransport;\n }\n\n private createSctpTransport() {\n const dtlsTransport = this.createTransport([\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n ]);\n const sctp = new RTCSctpTransport();\n sctp.setDtlsTransport(dtlsTransport);\n sctp.mid = undefined;\n\n sctp.onDataChannel.subscribe((channel) => {\n this.onDataChannel.execute(channel);\n\n const event: RTCDataChannelEvent = { channel };\n if (this.ondatachannel) this.ondatachannel(event);\n this.emit(\"datachannel\", event);\n });\n\n this.sctpTransport = sctp;\n this.updateIceConnectionState();\n\n return sctp;\n }\n\n async setLocalDescription(sessionDescription: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }): Promise<SessionDescription> {\n // # parse and validate description\n const description = SessionDescription.parse(sessionDescription.sdp);\n description.type = sessionDescription.type;\n this.validateDescription(description, true);\n\n // # update signaling state\n if (description.type === \"offer\") {\n this.setSignalingState(\"have-local-offer\");\n } else if (description.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // # assign MID\n description.media.forEach((media, i) => {\n const mid = media.rtp.muxId!;\n this.seenMid.add(mid);\n if ([\"audio\", \"video\"].includes(media.kind)) {\n const transceiver = this.getTransceiverByMLineIndex(i);\n if (transceiver) {\n transceiver.mid = mid;\n }\n }\n if (media.kind === \"application\" && this.sctpTransport) {\n this.sctpTransport.mid = mid;\n }\n });\n\n const setupRole = (dtlsTransport: RTCDtlsTransport) => {\n const iceTransport = dtlsTransport.iceTransport;\n\n // # set ICE role\n if (description.type === \"offer\") {\n iceTransport.connection.iceControlling = true;\n } else {\n iceTransport.connection.iceControlling = false;\n }\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (iceTransport.connection.remoteIsLite) {\n iceTransport.connection.iceControlling = true;\n }\n\n // # set DTLS role for mediasoup\n if (description.type === \"answer\") {\n const role = description.media.find((media) => media.dtlsParams)\n ?.dtlsParams?.role;\n if (role) {\n dtlsTransport.role = role;\n }\n }\n };\n this.dtlsTransports.forEach((d) => setupRole(d));\n\n // # configure direction\n this.transceivers.forEach((t) => {\n if ([\"answer\", \"pranswer\"].includes(description.type)) {\n const direction = andDirection(t.direction, t.offerDirection);\n t.currentDirection = direction;\n }\n });\n\n // for trickle ice\n this.setLocal(description);\n\n // connect transports\n if (description.type === \"answer\") {\n log(\"callee start connect\");\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.setConnectionState(\"failed\");\n });\n }\n\n // # gather candidates\n await Promise.all(\n this.iceTransports.map((iceTransport) => iceTransport.iceGather.gather())\n );\n\n description.media\n .filter((m) => [\"audio\", \"video\"].includes(m.kind))\n .forEach((m, i) => {\n addTransportDescription(m, this.transceivers[i].dtlsTransport);\n });\n const sctpMedia = description.media.find((m) => m.kind === \"application\");\n if (this.sctpTransport && sctpMedia) {\n addTransportDescription(sctpMedia, this.sctpTransport.dtlsTransport);\n }\n\n this.setLocal(description);\n\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n\n return description;\n }\n\n private setLocal(description: SessionDescription) {\n if (description.type === \"answer\") {\n this.currentLocalDescription = description;\n this.pendingLocalDescription = undefined;\n } else {\n this.pendingLocalDescription = description;\n }\n }\n\n private getTransportByMid(mid: string) {\n let iceTransport: RTCIceTransport | undefined;\n\n const transceiver = this.transceivers.find((t) => t.mid === mid);\n if (transceiver) {\n iceTransport = transceiver.dtlsTransport.iceTransport;\n } else if (!iceTransport && this.sctpTransport?.mid === mid) {\n iceTransport = this.sctpTransport?.dtlsTransport.iceTransport;\n }\n\n return iceTransport;\n }\n\n private getTransportByMLineIndex(index: number) {\n const sdp = this.buildOfferSdp();\n const media = sdp.media[index];\n if (!media) {\n return;\n }\n const transport = this.getTransportByMid(media.rtp.muxId!);\n\n return transport;\n }\n\n async addIceCandidate(candidateMessage: RTCIceCandidate) {\n const candidate = IceCandidate.fromJSON(candidateMessage);\n if (!candidate) {\n return;\n }\n\n let iceTransport: RTCIceTransport | undefined;\n\n if (typeof candidate.sdpMid === \"number\") {\n iceTransport = this.getTransportByMid(candidate.sdpMid);\n }\n\n if (!iceTransport && typeof candidate.sdpMLineIndex === \"number\") {\n iceTransport = this.getTransportByMLineIndex(candidate.sdpMLineIndex);\n }\n\n if (!iceTransport) {\n iceTransport = this.iceTransports[0];\n }\n\n if (iceTransport) {\n await iceTransport.addRemoteCandidate(candidate);\n } else {\n log(\"iceTransport not found\", candidate);\n }\n }\n\n private async connect() {\n if (this.masterTransportEstablished) return;\n\n this.setConnectionState(\"connecting\");\n\n await Promise.all(\n this.dtlsTransports.map(async (dtlsTransport) => {\n const { iceTransport } = dtlsTransport;\n await iceTransport.start().catch((err) => {\n log(\"iceTransport.start failed\", err);\n throw err;\n });\n await dtlsTransport.start().catch((err) => {\n log(\"dtlsTransport.start failed\", err);\n throw err;\n });\n if (\n this.sctpTransport &&\n this.sctpRemotePort &&\n this.sctpTransport.dtlsTransport.id === dtlsTransport.id\n ) {\n await this.sctpTransport.start(this.sctpRemotePort);\n await this.sctpTransport.sctp.stateChanged.connected.asPromise();\n log(\"sctp connected\");\n }\n })\n );\n\n this.masterTransportEstablished = true;\n this.setConnectionState(\"connected\");\n }\n\n private getLocalRtpParams(transceiver: RTCRtpTransceiver): RTCRtpParameters {\n if (transceiver.mid == undefined) throw new Error(\"mid not assigned\");\n\n const rtp: RTCRtpParameters = {\n codecs: transceiver.codecs,\n muxId: transceiver.mid,\n headerExtensions: transceiver.headerExtensions,\n rtcp: { cname: this.cname, ssrc: transceiver.sender.ssrc, mux: true },\n };\n return rtp;\n }\n\n private getRemoteRtpParams(\n media: MediaDescription,\n transceiver: RTCRtpTransceiver\n ): RTCRtpReceiveParameters {\n const receiveParameters: RTCRtpReceiveParameters = {\n muxId: media.rtp.muxId,\n rtcp: media.rtp.rtcp,\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n encodings: Object.values(\n transceiver.codecs.reduce(\n (acc: { [pt: number]: RTCRtpCodingParameters }, codec) => {\n if (codec.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(codec.parameters ?? \"\");\n const apt = acc[params[\"apt\"]];\n if (apt && media.ssrc.length === 2) {\n apt.rtx = new RTCRtpRtxParameters({ ssrc: media.ssrc[1].ssrc });\n }\n return acc;\n }\n acc[codec.payloadType] = new RTCRtpCodingParameters({\n ssrc: media.ssrc[0]?.ssrc,\n payloadType: codec.payloadType,\n });\n return acc;\n },\n {}\n )\n ),\n };\n\n return receiveParameters;\n }\n\n get remoteIsBundled() {\n const remoteSdp = this._remoteDescription;\n if (!remoteSdp) return;\n const bundle = remoteSdp.group.find(\n (g) => g.semantic === \"BUNDLE\" && this.config.bundlePolicy !== \"disable\"\n );\n return bundle;\n }\n\n async setRemoteDescription(sessionDescription: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }) {\n // # parse and validate description\n const remoteSdp = SessionDescription.parse(sessionDescription.sdp);\n remoteSdp.type = sessionDescription.type;\n this.validateDescription(remoteSdp, false);\n\n if (remoteSdp.type === \"answer\") {\n this.currentRemoteDescription = remoteSdp;\n this.pendingRemoteDescription = undefined;\n } else {\n this.pendingRemoteDescription = remoteSdp;\n }\n\n let bundleTransport: RTCDtlsTransport | undefined;\n\n // # apply description\n\n const transports = enumerate(remoteSdp.media).map(([i, remoteMedia]) => {\n let dtlsTransport: RTCDtlsTransport | undefined;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n let transceiver = this.transceivers.find(\n (t) =>\n t.kind === remoteMedia.kind &&\n [undefined, remoteMedia.rtp.muxId].includes(t.mid)\n );\n if (!transceiver) {\n // create remote transceiver\n transceiver = this.addTransceiver(remoteMedia.kind, {\n direction: \"recvonly\",\n });\n transceiver.mid = remoteMedia.rtp.muxId;\n this.onRemoteTransceiverAdded.execute(transceiver);\n }\n\n if (this.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = transceiver.dtlsTransport;\n } else {\n transceiver.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = transceiver.dtlsTransport;\n\n this.setRemoteRTP(transceiver, remoteMedia, remoteSdp.type, i);\n } else if (remoteMedia.kind === \"application\") {\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n this.sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n\n if (this.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = this.sctpTransport.dtlsTransport;\n } else {\n this.sctpTransport.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = this.sctpTransport.dtlsTransport;\n\n this.setRemoteSCTP(remoteMedia, this.sctpTransport, i);\n } else {\n throw new Error(\"invalid media kind\");\n }\n\n const iceTransport = dtlsTransport.iceTransport;\n\n if (remoteMedia.iceParams && remoteMedia.dtlsParams) {\n iceTransport.setRemoteParams(remoteMedia.iceParams);\n dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);\n\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (remoteMedia.iceParams?.iceLite) {\n iceTransport.connection.iceControlling = true;\n }\n }\n\n // # add ICE candidates\n remoteMedia.iceCandidates.forEach(iceTransport.addRemoteCandidate);\n\n if (remoteMedia.iceCandidatesComplete) {\n iceTransport.addRemoteCandidate(undefined);\n }\n\n // # set DTLS role\n if (remoteSdp.type === \"answer\" && remoteMedia.dtlsParams?.role) {\n dtlsTransport.role =\n remoteMedia.dtlsParams.role === \"client\" ? \"server\" : \"client\";\n }\n return iceTransport;\n });\n\n if (remoteSdp.type === \"offer\") {\n this.setSignalingState(\"have-remote-offer\");\n } else if (remoteSdp.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // connect transports\n if (remoteSdp.type === \"answer\") {\n log(\"caller start connect\");\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.setConnectionState(\"failed\");\n });\n }\n\n await Promise.all(\n transports.map(async (iceTransport) => {\n await iceTransport.iceGather.gather();\n })\n );\n\n this.negotiationneeded = false;\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n }\n\n private setRemoteRTP(\n transceiver: RTCRtpTransceiver,\n remoteMedia: MediaDescription,\n type: \"offer\" | \"answer\",\n mLineIndex: number\n ) {\n if (!transceiver.mid) {\n transceiver.mid = remoteMedia.rtp.muxId;\n transceiver.mLineIndex = mLineIndex;\n }\n\n // # negotiate codecs\n transceiver.codecs = remoteMedia.rtp.codecs.filter((remoteCodec) => {\n const localCodecs = this.config.codecs[remoteMedia.kind] || [];\n\n const existCodec = findCodecByMimeType(localCodecs, remoteCodec);\n if (!existCodec) return false;\n\n if (existCodec?.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(existCodec.parameters ?? \"\");\n const pt = params[\"apt\"];\n const origin = remoteMedia.rtp.codecs.find((c) => c.payloadType === pt);\n if (!origin) return false;\n return !!findCodecByMimeType(localCodecs, origin);\n }\n\n return true;\n });\n\n log(\"negotiated codecs\", transceiver.codecs);\n if (transceiver.codecs.length === 0) {\n throw new Error(\"negotiate codecs failed.\");\n }\n transceiver.headerExtensions = remoteMedia.rtp.headerExtensions.filter(\n (extension) =>\n (this.config.headerExtensions[remoteMedia.kind as Media] || []).find(\n (v) => v.uri === extension.uri\n )\n );\n\n // # configure direction\n const mediaDirection = remoteMedia.direction || \"inactive\";\n const direction = reverseDirection(mediaDirection);\n if ([\"answer\", \"pranswer\"].includes(type)) {\n transceiver.currentDirection = direction;\n } else {\n transceiver.offerDirection = direction;\n }\n\n const localParams = this.getLocalRtpParams(transceiver);\n transceiver.sender.prepareSend(localParams);\n\n if ([\"recvonly\", \"sendrecv\"].includes(transceiver.direction)) {\n const remotePrams = this.getRemoteRtpParams(remoteMedia, transceiver);\n\n // register simulcast receiver\n remoteMedia.simulcastParameters.forEach((param) => {\n this.router.registerRtpReceiverByRid(transceiver, param, remotePrams);\n });\n\n transceiver.receiver.prepareReceive(remotePrams);\n // register ssrc receiver\n this.router.registerRtpReceiverBySsrc(transceiver, remotePrams);\n }\n if ([\"sendonly\", \"sendrecv\"].includes(mediaDirection)) {\n // assign msid\n if (remoteMedia.msid != undefined) {\n const [streamId, trackId] = remoteMedia.msid.split(\" \");\n transceiver.receiver.remoteStreamId = streamId;\n transceiver.receiver.remoteTrackId = trackId;\n\n this.fireOnTrack(\n transceiver.receiver.track,\n transceiver,\n new MediaStream({\n id: streamId,\n tracks: [transceiver.receiver.track],\n })\n );\n }\n }\n\n if (remoteMedia.ssrc[0]?.ssrc) {\n transceiver.receiver.setupTWCC(remoteMedia.ssrc[0].ssrc);\n }\n }\n\n private setRemoteSCTP(\n remoteMedia: MediaDescription,\n sctpTransport: RTCSctpTransport,\n mLineIndex: number\n ) {\n // # configure sctp\n this.sctpRemotePort = remoteMedia.sctpPort;\n if (!this.sctpRemotePort) {\n throw new Error(\"sctpRemotePort not exist\");\n }\n\n sctpTransport.setRemotePort(this.sctpRemotePort);\n sctpTransport.mLineIndex = mLineIndex;\n if (!sctpTransport.mid) {\n sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n }\n\n private validateDescription(\n description: SessionDescription,\n isLocal: boolean\n ) {\n if (isLocal) {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-local-offer\"].includes(this.signalingState))\n throw new Error(\"Cannot handle offer in signaling state\");\n } else if (description.type === \"answer\") {\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(\n this.signalingState\n )\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n } else {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-remote-offer\"].includes(this.signalingState)) {\n throw new Error(\"Cannot handle offer in signaling state\");\n }\n } else if (description.type === \"answer\") {\n if (\n ![\"have-local-offer\", \"have-remote-pranswer\"].includes(\n this.signalingState\n )\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n }\n\n description.media.forEach((media) => {\n if (media.direction === \"inactive\") return;\n if (\n !media.iceParams ||\n !media.iceParams.usernameFragment ||\n !media.iceParams.password\n )\n throw new Error(\"ICE username fragment or password is missing\");\n });\n\n if ([\"answer\", \"pranswer\"].includes(description.type || \"\")) {\n const offer = isLocal ? this._remoteDescription : this._localDescription;\n if (!offer) throw new Error();\n\n const answerMedia = description.media.map((v, i) => [v.kind, i]);\n const offerMedia = offer.media.map((v, i) => [v.kind, i]);\n if (!isEqual(offerMedia, answerMedia)) {\n throw new Error(\"Media sections in answer do not match offer\");\n }\n }\n }\n\n private fireOnTrack(\n track: MediaStreamTrack,\n transceiver: RTCRtpTransceiver,\n stream: MediaStream\n ) {\n const event: RTCTrackEvent = {\n track,\n streams: [stream],\n transceiver,\n receiver: transceiver.receiver,\n };\n this.onTrack.execute(track);\n this.emit(\"track\", event);\n if (this.ontrack) this.ontrack(event);\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {}\n ) {\n const kind =\n typeof trackOrKind === \"string\" ? trackOrKind : trackOrKind.kind;\n\n const direction = options.direction || \"sendrecv\";\n\n const dtlsTransport = this.createTransport([\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n ]);\n\n const sender = new RTCRtpSender(trackOrKind);\n const receiver = new RTCRtpReceiver(this.config, kind, sender.ssrc);\n const transceiver = new RTCRtpTransceiver(\n kind,\n dtlsTransport,\n receiver,\n sender,\n direction\n );\n transceiver.options = options;\n this.router.registerRtpSender(transceiver.sender);\n\n this.transceivers.push(transceiver);\n this.onTransceiverAdded.execute(transceiver);\n\n this.updateIceConnectionState();\n this.needNegotiation();\n\n return transceiver;\n }\n\n getTransceivers() {\n return this.transceivers;\n }\n\n getSenders(): RTCRtpSender[] {\n return this.getTransceivers().map((t) => t.sender);\n }\n\n getReceivers() {\n return this.getTransceivers().map((t) => t.receiver);\n }\n\n // todo fix\n addTrack(\n track: MediaStreamTrack,\n /**todo impl */\n ms?: MediaStream\n ) {\n if (this.isClosed) throw new Error(\"is closed\");\n if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {\n throw new Error(\"track exist\");\n }\n\n const emptyTrackSender = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === true\n );\n if (emptyTrackSender) {\n const sender = emptyTrackSender.sender;\n sender.registerTrack(track);\n this.needNegotiation();\n return sender;\n }\n\n const notSendTransceiver = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === false &&\n !t.usedForSender\n );\n if (notSendTransceiver) {\n const sender = notSendTransceiver.sender;\n sender.registerTrack(track);\n switch (notSendTransceiver.direction) {\n case \"recvonly\":\n notSendTransceiver.direction = \"sendrecv\";\n break;\n case \"inactive\":\n notSendTransceiver.direction = \"sendonly\";\n break;\n }\n this.needNegotiation();\n return sender;\n } else {\n const transceiver = this.addTransceiver(track, { direction: \"sendrecv\" });\n this.needNegotiation();\n return transceiver.sender;\n }\n }\n\n private async ensureCerts() {\n const ensureCert = async (dtlsTransport: RTCDtlsTransport) => {\n if (this.certificates.length === 0) {\n const localCertificate = await dtlsTransport.setupCertificate();\n this.certificates.push(localCertificate);\n } else {\n dtlsTransport.localCertificate = this.certificates[0];\n }\n };\n\n for (const dtlsTransport of this.dtlsTransports) {\n await ensureCert(dtlsTransport);\n }\n }\n\n async createAnswer() {\n await this.ensureCerts();\n const description = this.buildAnswer();\n return description.toJSON();\n }\n\n private buildAnswer() {\n this.assertNotClosed();\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(\n this.signalingState\n )\n ) {\n throw new Error(\"createAnswer failed\");\n }\n if (!this._remoteDescription) {\n throw new Error(\"wrong state\");\n }\n\n const description = new SessionDescription();\n addSDPHeader(\"answer\", description);\n\n this._remoteDescription.media.forEach((remoteMedia) => {\n let dtlsTransport!: RTCDtlsTransport;\n let media: MediaDescription;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n const transceiver = this.getTransceiverByMid(remoteMedia.rtp.muxId!)!;\n media = createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n andDirection(transceiver.direction, transceiver.offerDirection)\n );\n dtlsTransport = transceiver.dtlsTransport;\n } else if (remoteMedia.kind === \"application\") {\n if (!this.sctpTransport || !this.sctpTransport.mid) {\n throw new Error(\"sctpTransport not found\");\n }\n media = createMediaDescriptionForSctp(this.sctpTransport);\n\n dtlsTransport = this.sctpTransport.dtlsTransport;\n } else {\n throw new Error(\"invalid kind\");\n }\n\n // # determine DTLS role, or preserve the currently configured role\n if (!media.dtlsParams) {\n throw new Error(\"dtlsParams missing\");\n }\n if (dtlsTransport.role === \"auto\") {\n media.dtlsParams.role = \"client\";\n } else {\n media.dtlsParams.role = dtlsTransport.role;\n }\n\n media.simulcastParameters = remoteMedia.simulcastParameters.map((v) => ({\n ...v,\n direction: reverseSimulcastDirection(v.direction),\n }));\n\n description.media.push(media);\n });\n\n if (this.config.bundlePolicy !== \"disable\") {\n const bundle = new GroupDescription(\"BUNDLE\", []);\n description.media.forEach((media) => {\n bundle.items.push(media.rtp.muxId!);\n });\n description.group.push(bundle);\n }\n\n return description;\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.setSignalingState(\"closed\");\n this.setConnectionState(\"closed\");\n\n this.transceivers.forEach((transceiver) => {\n transceiver.receiver.stop();\n transceiver.sender.stop();\n });\n\n if (this.sctpTransport) {\n await this.sctpTransport.stop();\n }\n for (const dtlsTransport of this.dtlsTransports) {\n await dtlsTransport.stop();\n await dtlsTransport.iceTransport.stop();\n }\n\n this.dispose();\n log(\"peerConnection closed\");\n }\n\n private assertNotClosed() {\n if (this.isClosed) {\n throw new Error(\"RTCPeerConnection is closed\");\n }\n }\n\n // https://w3c.github.io/webrtc-pc/#dom-rtcicegatheringstate\n private updateIceGatheringState() {\n const all = this.iceTransports;\n\n function allMatch(...state: IceGathererState[]) {\n return (\n all.filter((check) => state.includes(check.iceGather.gatheringState))\n .length === all.length\n );\n }\n\n let newState: IceGathererState;\n\n if (all.length && allMatch(\"complete\")) {\n newState = \"complete\";\n } else if (!all.length || allMatch(\"new\", \"complete\")) {\n newState = \"new\";\n } else if (\n all.map((check) => check.iceGather.gatheringState).includes(\"gathering\")\n ) {\n newState = \"gathering\";\n } else {\n newState = \"new\";\n }\n\n if (this.iceGatheringState === newState) {\n return;\n }\n\n log(\"iceGatheringStateChange\", newState);\n this.iceGatheringState = newState;\n this.iceGatheringStateChange.execute(newState);\n this.emit(\"icegatheringstatechange\", newState);\n }\n\n // https://w3c.github.io/webrtc-pc/#dom-rtciceconnectionstate\n private updateIceConnectionState() {\n const all = this.iceTransports;\n let newState: RTCIceConnectionState;\n\n function allMatch(...state: RTCIceConnectionState[]) {\n return (\n all.filter((check) => state.includes(check.state)).length === all.length\n );\n }\n\n if (this.connectionState === \"closed\") {\n newState = \"closed\";\n } else if (allMatch(\"failed\")) {\n newState = \"failed\";\n } else if (allMatch(\"disconnected\")) {\n newState = \"disconnected\";\n } else if (allMatch(\"new\", \"closed\")) {\n newState = \"new\";\n } else if (allMatch(\"new\", \"checking\")) {\n newState = \"checking\";\n } else if (allMatch(\"completed\", \"closed\")) {\n newState = \"completed\";\n } else if (allMatch(\"connected\", \"completed\", \"closed\")) {\n newState = \"connected\";\n } else {\n // unreachable?\n newState = \"new\";\n }\n\n if (this.iceConnectionState === newState) {\n return;\n }\n\n log(\"iceConnectionStateChange\", newState);\n this.iceConnectionState = newState;\n this.iceConnectionStateChange.execute(newState);\n this.emit(\"iceconnectionstatechange\", newState);\n }\n\n private setSignalingState(state: RTCSignalingState) {\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) this.onsignalingstatechange({});\n }\n\n private setConnectionState(state: ConnectionState) {\n log(\"connectionStateChange\", state);\n this.connectionState = state;\n this.connectionStateChange.execute(state);\n if (this.onconnectionstatechange) this.onconnectionstatechange();\n this.emit(\"connectionstatechange\");\n }\n\n private dispose() {\n this.onDataChannel.allUnsubscribe();\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.signalingStateChange.allUnsubscribe();\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n }\n}\n\nexport function createMediaDescriptionForTransceiver(\n transceiver: RTCRtpTransceiver,\n cname: string,\n direction: Direction\n) {\n const media = new MediaDescription(\n transceiver.kind,\n 9,\n \"UDP/TLS/RTP/SAVPF\",\n transceiver.codecs.map((c) => c.payloadType)\n );\n media.direction = direction;\n media.msid = transceiver.msid;\n media.rtp = {\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n muxId: transceiver.mid,\n };\n media.rtcpHost = \"0.0.0.0\";\n media.rtcpPort = 9;\n media.rtcpMux = true;\n media.ssrc = [new SsrcDescription({ ssrc: transceiver.sender.ssrc, cname })];\n\n if (transceiver.options.simulcast) {\n media.simulcastParameters = transceiver.options.simulcast.map(\n (o) => new RTCRtpSimulcastParameters(o)\n );\n }\n\n if (media.rtp.codecs.find((c) => c.name.toLowerCase() === \"rtx\")) {\n media.ssrc.push(\n new SsrcDescription({ ssrc: transceiver.sender.rtxSsrc, cname })\n );\n media.ssrcGroup = [\n new GroupDescription(\"FID\", [\n transceiver.sender.ssrc.toString(),\n transceiver.sender.rtxSsrc.toString(),\n ]),\n ];\n }\n\n addTransportDescription(media, transceiver.dtlsTransport);\n return media;\n}\n\nexport function createMediaDescriptionForSctp(sctp: RTCSctpTransport) {\n const media = new MediaDescription(\n \"application\",\n DISCARD_PORT,\n \"UDP/DTLS/SCTP\",\n [\"webrtc-datachannel\"]\n );\n media.sctpPort = sctp.port;\n media.rtp.muxId = sctp.mid;\n media.sctpCapabilities = RTCSctpTransport.getCapabilities();\n\n addTransportDescription(media, sctp.dtlsTransport);\n return media;\n}\n\nexport function addTransportDescription(\n media: MediaDescription,\n dtlsTransport: RTCDtlsTransport\n) {\n const iceTransport = dtlsTransport.iceTransport;\n const iceGatherer = iceTransport.iceGather;\n\n media.iceCandidates = iceGatherer.localCandidates;\n media.iceCandidatesComplete = iceGatherer.gatheringState === \"complete\";\n media.iceParams = iceGatherer.localParameters;\n media.iceOptions = \"trickle\";\n\n if (media.iceCandidates.length > 0) {\n const candidate = media.iceCandidates[media.iceCandidates.length - 1];\n media.host = candidate.ip;\n media.port = candidate.port;\n } else {\n media.host = DISCARD_HOST;\n media.port = DISCARD_PORT;\n }\n\n if (media.direction === \"inactive\") {\n media.port = 0;\n }\n\n if (!media.dtlsParams) {\n media.dtlsParams = dtlsTransport.localParameters;\n if (!media.dtlsParams.fingerprints) {\n media.dtlsParams.fingerprints =\n dtlsTransport.localParameters.fingerprints;\n }\n }\n}\n\nexport function allocateMid(mids: Set<string>, type: \"dc\" | \"av\") {\n let mid = \"\";\n for (let i = 0; ; ) {\n // rfc9143.html#name-security-considerations\n // SHOULD be 3 bytes or fewer to allow them to efficiently fit into the MID RTP header extension\n mid = (i++).toString() + type;\n if (!mids.has(mid)) break;\n }\n mids.add(mid);\n return mid;\n}\n\nexport type BundlePolicy = \"max-compat\" | \"max-bundle\" | \"disable\";\n\nexport interface PeerConfig {\n codecs: Partial<{\n /**\n * When specifying a codec with a fixed payloadType such as PCMU,\n * it is necessary to set the correct PayloadType in RTCRtpCodecParameters in advance.\n */\n audio: RTCRtpCodecParameters[];\n video: RTCRtpCodecParameters[];\n }>;\n headerExtensions: Partial<{\n audio: RTCRtpHeaderExtensionParameters[];\n video: RTCRtpHeaderExtensionParameters[];\n }>;\n iceTransportPolicy: \"all\" | \"relay\";\n iceServers: RTCIceServer[];\n /**Minimum port and Maximum port must not be the same value */\n icePortRange: [number, number] | undefined;\n iceInterfaceAddresses: InterfaceAddresses | undefined;\n /** Add additional host (local) addresses to use for candidate gathering.\n * Notably, you can include hosts that are normally excluded, such as loopback, tun interfaces, etc.\n */\n iceAdditionalHostAddresses: string[] | undefined;\n iceUseIpv4: boolean;\n iceUseIpv6: boolean;\n /** If provided, is called on each STUN request.\n * Return `true` if a STUN response should be sent, false if it should be skipped. */\n iceFilterStunResponse:\n | ((message: Message, addr: Address, protocol: Protocol) => boolean)\n | undefined;\n dtls: Partial<{\n keys: DtlsKeys;\n }>;\n bundlePolicy: BundlePolicy;\n debug: Partial<{\n /**% */\n inboundPacketLoss: number;\n /**% */\n outboundPacketLoss: number;\n /**ms */\n receiverReportDelay: number;\n disableSendNack: boolean;\n disableRecvRetransmit: boolean;\n }>;\n}\n\nexport const findCodecByMimeType = (\n codecs: RTCRtpCodecParameters[],\n target: RTCRtpCodecParameters\n) =>\n codecs.find(\n (localCodec) =>\n localCodec.mimeType.toLowerCase() === target.mimeType.toLowerCase()\n )\n ? target\n : undefined;\n\nexport type RTCIceServer = {\n urls: string;\n username?: string;\n credential?: string;\n};\n\nexport const defaultPeerConfig: PeerConfig = {\n codecs: {\n audio: [\n new RTCRtpCodecParameters({\n mimeType: \"audio/opus\",\n clockRate: 48000,\n channels: 2,\n }),\n new RTCRtpCodecParameters({\n mimeType: \"audio/PCMU\",\n clockRate: 8000,\n channels: 1,\n payloadType: 0,\n }),\n ],\n video: [\n new RTCRtpCodecParameters({\n mimeType: \"video/VP8\",\n clockRate: 90000,\n rtcpFeedback: [useNACK(), usePLI(), useREMB()],\n }),\n ],\n },\n headerExtensions: {\n audio: [],\n video: [],\n },\n iceTransportPolicy: \"all\",\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n icePortRange: undefined,\n iceInterfaceAddresses: undefined,\n iceAdditionalHostAddresses: undefined,\n iceUseIpv4: true,\n iceUseIpv6: true,\n iceFilterStunResponse: undefined,\n dtls: {},\n bundlePolicy: \"max-compat\",\n debug: {},\n};\n\nexport interface RTCTrackEvent {\n track: MediaStreamTrack;\n streams: MediaStream[];\n transceiver: RTCRtpTransceiver;\n receiver: RTCRtpReceiver;\n}\n\nexport interface RTCDataChannelEvent {\n channel: RTCDataChannel;\n}\n\nexport interface RTCPeerConnectionIceEvent {\n candidate: RTCIceCandidate;\n}\n\ntype Media = \"audio\" | \"video\";\n"]}
|
package/package.json
CHANGED
package/src/media/rtpReceiver.ts
CHANGED
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
RtpHeader,
|
|
17
17
|
RtpPacket,
|
|
18
18
|
} from "../../../rtp/src";
|
|
19
|
-
import { codecParametersFromString, PeerConfig } from "..";
|
|
19
|
+
import { codecParametersFromString, PeerConfig, usePLI, useTWCC } from "..";
|
|
20
20
|
import { RTCDtlsTransport } from "../transport/dtls";
|
|
21
21
|
import { Kind } from "../types/domain";
|
|
22
22
|
import { compactNtp, timestampSeconds } from "../utils";
|
|
@@ -62,7 +62,6 @@ export class RTCRtpReceiver {
|
|
|
62
62
|
latestRepairedRid?: string;
|
|
63
63
|
|
|
64
64
|
receiverTWCC?: ReceiverTWCC;
|
|
65
|
-
supportTWCC = false;
|
|
66
65
|
stopped = false;
|
|
67
66
|
remoteStreamId?: string;
|
|
68
67
|
remoteTrackId?: string;
|
|
@@ -87,7 +86,19 @@ export class RTCRtpReceiver {
|
|
|
87
86
|
}
|
|
88
87
|
|
|
89
88
|
get nackEnabled() {
|
|
90
|
-
return this.codecArray[0]
|
|
89
|
+
return this.codecArray[0]?.rtcpFeedback.find((f) => f.type === "nack");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
get twccEnabled() {
|
|
93
|
+
return this.codecArray[0]?.rtcpFeedback.find(
|
|
94
|
+
(f) => f.type === useTWCC().type
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
get pliEnabled() {
|
|
99
|
+
return this.codecArray[0]?.rtcpFeedback.find(
|
|
100
|
+
(f) => f.type === usePLI().type
|
|
101
|
+
);
|
|
91
102
|
}
|
|
92
103
|
|
|
93
104
|
prepareReceive(params: RTCRtpReceiveParameters) {
|
|
@@ -104,13 +115,8 @@ export class RTCRtpReceiver {
|
|
|
104
115
|
/**
|
|
105
116
|
* setup TWCC if supported
|
|
106
117
|
*/
|
|
107
|
-
setupTWCC(mediaSourceSsrc
|
|
108
|
-
this.
|
|
109
|
-
codec.rtcpFeedback.find((v) => v.type === "transport-cc")
|
|
110
|
-
);
|
|
111
|
-
log("twcc support", this.supportTWCC);
|
|
112
|
-
|
|
113
|
-
if (this.supportTWCC && mediaSourceSsrc) {
|
|
118
|
+
setupTWCC(mediaSourceSsrc: number) {
|
|
119
|
+
if (this.twccEnabled && !this.receiverTWCC) {
|
|
114
120
|
this.receiverTWCC = new ReceiverTWCC(
|
|
115
121
|
this.dtlsTransport,
|
|
116
122
|
this.rtcpSsrc,
|
|
@@ -194,6 +200,12 @@ export class RTCRtpReceiver {
|
|
|
194
200
|
getStats() {}
|
|
195
201
|
|
|
196
202
|
async sendRtcpPLI(mediaSsrc: number) {
|
|
203
|
+
if (!this.pliEnabled) {
|
|
204
|
+
log("pli not supported", { mediaSsrc });
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
log("sendRtcpPLI", { mediaSsrc });
|
|
208
|
+
|
|
197
209
|
const packet = new RtcpPayloadSpecificFeedback({
|
|
198
210
|
feedback: new PictureLossIndication({
|
|
199
211
|
senderSsrc: this.rtcpSsrc,
|
|
@@ -269,7 +281,7 @@ export class RTCRtpReceiver {
|
|
|
269
281
|
}
|
|
270
282
|
|
|
271
283
|
this.receiverTWCC.handleTWCC(transportSequenceNumber);
|
|
272
|
-
} else if (this.
|
|
284
|
+
} else if (this.twccEnabled) {
|
|
273
285
|
this.setupTWCC(packet.header.ssrc);
|
|
274
286
|
}
|
|
275
287
|
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
MediaStreamTrack,
|
|
9
9
|
RtpSourceStream,
|
|
10
10
|
WebmLiveOutput,
|
|
11
|
-
|
|
11
|
+
WebmStream,
|
|
12
12
|
WeriftError,
|
|
13
13
|
} from "../../..";
|
|
14
14
|
import { MediaWriter } from ".";
|
|
@@ -65,12 +65,13 @@ export class WebmFactory extends MediaWriter {
|
|
|
65
65
|
}
|
|
66
66
|
});
|
|
67
67
|
|
|
68
|
-
const webm = new
|
|
68
|
+
const webm = new WebmStream(inputTracks, {
|
|
69
69
|
duration: this.options.defaultDuration ?? 1000 * 60 * 60 * 24,
|
|
70
70
|
});
|
|
71
71
|
|
|
72
72
|
this.rtpSources = inputTracks.map(({ track, clockRate, codec }) => {
|
|
73
|
-
const rtpSource = new RtpSourceStream(
|
|
73
|
+
const rtpSource = new RtpSourceStream();
|
|
74
|
+
track.onReceiveRtp.subscribe((r) => rtpSource.push(r));
|
|
74
75
|
|
|
75
76
|
const jitterBuffer = jitterBufferTransformer(clockRate, {
|
|
76
77
|
latency: this.options.jitterBufferLatency,
|
|
@@ -81,15 +82,16 @@ export class WebmFactory extends MediaWriter {
|
|
|
81
82
|
rtpSource.readable
|
|
82
83
|
.pipeThrough(jitterBuffer)
|
|
83
84
|
.pipeThrough(
|
|
84
|
-
depacketizeTransformer(
|
|
85
|
+
depacketizeTransformer(codec, {
|
|
85
86
|
waitForKeyframe: this.options.waitForKeyframe,
|
|
87
|
+
isFinalPacketInSequence: (h) => h.marker,
|
|
86
88
|
})
|
|
87
89
|
)
|
|
88
90
|
.pipeTo(webm.videoStream);
|
|
89
91
|
} else {
|
|
90
92
|
rtpSource.readable
|
|
91
93
|
.pipeThrough(jitterBuffer)
|
|
92
|
-
.pipeThrough(depacketizeTransformer(
|
|
94
|
+
.pipeThrough(depacketizeTransformer(codec))
|
|
93
95
|
.pipeTo(webm.audioStream);
|
|
94
96
|
}
|
|
95
97
|
|
|
@@ -103,8 +105,8 @@ export class WebmFactory extends MediaWriter {
|
|
|
103
105
|
}: ReadableStreamDefaultReadResult<WebmLiveOutput>) => {
|
|
104
106
|
if (done) return;
|
|
105
107
|
|
|
106
|
-
if (value.
|
|
107
|
-
await appendFile(this.path, value.
|
|
108
|
+
if (value.saveToFile) {
|
|
109
|
+
await appendFile(this.path, value.saveToFile);
|
|
108
110
|
} else if (value.eol) {
|
|
109
111
|
const { durationElement } = value.eol;
|
|
110
112
|
const handler = await open(this.path, "r+");
|
package/src/peerConnection.ts
CHANGED
|
@@ -446,6 +446,7 @@ export class RTCPeerConnection extends EventTarget {
|
|
|
446
446
|
forceTurn: this.config.iceTransportPolicy === "relay",
|
|
447
447
|
portRange: this.config.icePortRange,
|
|
448
448
|
interfaceAddresses: this.config.iceInterfaceAddresses,
|
|
449
|
+
additionalHostAddresses: this.config.iceAdditionalHostAddresses,
|
|
449
450
|
filterStunResponse: this.config.iceFilterStunResponse,
|
|
450
451
|
useIpv4: this.config.iceUseIpv4,
|
|
451
452
|
useIpv6: this.config.iceUseIpv6,
|
|
@@ -986,7 +987,9 @@ export class RTCPeerConnection extends EventTarget {
|
|
|
986
987
|
}
|
|
987
988
|
}
|
|
988
989
|
|
|
989
|
-
|
|
990
|
+
if (remoteMedia.ssrc[0]?.ssrc) {
|
|
991
|
+
transceiver.receiver.setupTWCC(remoteMedia.ssrc[0].ssrc);
|
|
992
|
+
}
|
|
990
993
|
}
|
|
991
994
|
|
|
992
995
|
private setRemoteSCTP(
|
|
@@ -1522,6 +1525,10 @@ export interface PeerConfig {
|
|
|
1522
1525
|
/**Minimum port and Maximum port must not be the same value */
|
|
1523
1526
|
icePortRange: [number, number] | undefined;
|
|
1524
1527
|
iceInterfaceAddresses: InterfaceAddresses | undefined;
|
|
1528
|
+
/** Add additional host (local) addresses to use for candidate gathering.
|
|
1529
|
+
* Notably, you can include hosts that are normally excluded, such as loopback, tun interfaces, etc.
|
|
1530
|
+
*/
|
|
1531
|
+
iceAdditionalHostAddresses: string[] | undefined;
|
|
1525
1532
|
iceUseIpv4: boolean;
|
|
1526
1533
|
iceUseIpv6: boolean;
|
|
1527
1534
|
/** If provided, is called on each STUN request.
|
|
@@ -1593,6 +1600,7 @@ export const defaultPeerConfig: PeerConfig = {
|
|
|
1593
1600
|
iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
|
|
1594
1601
|
icePortRange: undefined,
|
|
1595
1602
|
iceInterfaceAddresses: undefined,
|
|
1603
|
+
iceAdditionalHostAddresses: undefined,
|
|
1596
1604
|
iceUseIpv4: true,
|
|
1597
1605
|
iceUseIpv6: true,
|
|
1598
1606
|
iceFilterStunResponse: undefined,
|