werift 0.17.0 → 0.17.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 +10 -1
- package/lib/ice/src/ice.js +15 -3
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/rtp/src/container/ebml/ebml.d.ts +32 -0
- package/lib/rtp/src/container/ebml/ebml.js +115 -0
- package/lib/rtp/src/container/ebml/ebml.js.map +1 -0
- package/lib/rtp/src/container/ebml/id.d.ts +221 -0
- package/lib/rtp/src/container/ebml/id.js +225 -0
- package/lib/rtp/src/container/ebml/id.js.map +1 -0
- package/lib/rtp/src/container/ebml/index.d.ts +3 -0
- package/lib/rtp/src/container/ebml/index.js +20 -0
- package/lib/rtp/src/container/ebml/index.js.map +1 -0
- package/lib/rtp/src/container/ebml/typedArrayUtils.d.ts +7 -0
- package/lib/rtp/src/container/ebml/typedArrayUtils.js +109 -0
- package/lib/rtp/src/container/ebml/typedArrayUtils.js.map +1 -0
- package/lib/rtp/src/container/webm.d.ts +10 -4
- package/lib/rtp/src/container/webm.js +56 -7
- package/lib/rtp/src/container/webm.js.map +1 -1
- package/lib/rtp/src/index.d.ts +1 -0
- package/lib/rtp/src/index.js +1 -0
- package/lib/rtp/src/index.js.map +1 -1
- package/lib/rtp/src/processor/avBuffer.d.ts +28 -0
- package/lib/rtp/src/processor/avBuffer.js +91 -0
- package/lib/rtp/src/processor/avBuffer.js.map +1 -0
- package/lib/rtp/src/processor/avBufferCallback.d.ts +10 -0
- package/lib/rtp/src/processor/avBufferCallback.js +27 -0
- package/lib/rtp/src/processor/avBufferCallback.js.map +1 -0
- package/lib/rtp/src/processor/depacketizer.d.ts +1 -1
- package/lib/rtp/src/processor/depacketizer.js.map +1 -1
- package/lib/rtp/src/processor/depacketizerCallback.d.ts +1 -3
- package/lib/rtp/src/processor/depacketizerCallback.js +2 -2
- package/lib/rtp/src/processor/depacketizerCallback.js.map +1 -1
- package/lib/rtp/src/processor/depacketizerTransformer.d.ts +1 -1
- package/lib/rtp/src/processor/index.d.ts +3 -0
- package/lib/rtp/src/processor/index.js +3 -0
- package/lib/rtp/src/processor/index.js.map +1 -1
- package/lib/rtp/src/processor/jitterBuffer.d.ts +1 -1
- package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
- package/lib/rtp/src/processor/jitterBufferCallback.d.ts +1 -3
- package/lib/rtp/src/processor/jitterBufferCallback.js +2 -2
- package/lib/rtp/src/processor/jitterBufferCallback.js.map +1 -1
- package/lib/rtp/src/processor/jitterBufferTransformer.d.ts +1 -1
- package/lib/rtp/src/processor/source/index.d.ts +2 -2
- package/lib/rtp/src/processor/source/index.js +16 -3
- package/lib/rtp/src/processor/source/index.js.map +1 -1
- package/lib/rtp/src/processor/source/rtpCallback.d.ts +17 -0
- package/lib/rtp/src/processor/source/rtpCallback.js +33 -0
- package/lib/rtp/src/processor/source/rtpCallback.js.map +1 -0
- package/lib/rtp/src/processor/source/{rtp.d.ts → rtpStream.d.ts} +2 -5
- package/lib/rtp/src/processor/source/{rtp.js → rtpStream.js} +12 -12
- package/lib/rtp/src/processor/source/rtpStream.js.map +1 -0
- package/lib/rtp/src/processor/webm.d.ts +17 -2
- package/lib/rtp/src/processor/webm.js +83 -33
- package/lib/rtp/src/processor/webm.js.map +1 -1
- package/lib/rtp/src/processor/webmCallback.d.ts +16 -0
- package/lib/rtp/src/processor/webmCallback.js +21 -0
- package/lib/rtp/src/processor/webmCallback.js.map +1 -0
- package/lib/rtp/src/processor/webmStream.d.ts +5 -16
- package/lib/rtp/src/processor/webmStream.js.map +1 -1
- package/lib/{webrtc/src/media/receiver/red.d.ts → rtp/src/rtp/red/handler.d.ts} +2 -2
- package/lib/{webrtc/src/media/receiver/red.js → rtp/src/rtp/red/handler.js} +10 -10
- package/lib/rtp/src/rtp/red/handler.js.map +1 -0
- package/lib/webrtc/src/const.d.ts +1 -1
- package/lib/webrtc/src/const.js +2 -2
- package/lib/webrtc/src/const.js.map +1 -1
- package/lib/webrtc/src/media/receiver/nack.d.ts +1 -0
- package/lib/webrtc/src/media/receiver/nack.js +29 -16
- package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
- package/lib/webrtc/src/media/router.js +17 -13
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +1 -1
- package/lib/webrtc/src/media/rtpReceiver.js +14 -9
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +10 -6
- package/lib/webrtc/src/media/rtpTransceiver.js +23 -14
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/track.js +3 -2
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +20 -3
- package/lib/webrtc/src/nonstandard/userMedia.js +79 -8
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +5 -2
- package/lib/webrtc/src/peerConnection.js +72 -46
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sdp.js +2 -2
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/transport/ice.js +10 -3
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +0 -1
- package/lib/webrtc/src/utils.js +1 -3
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/const.ts +1 -1
- package/src/media/receiver/nack.ts +33 -17
- package/src/media/router.ts +16 -13
- package/src/media/rtpReceiver.ts +21 -9
- package/src/media/rtpTransceiver.ts +28 -15
- package/src/media/track.ts +3 -2
- package/src/nonstandard/recorder/writer/webm.ts +2 -2
- package/src/nonstandard/userMedia.ts +89 -7
- package/src/peerConnection.ts +88 -51
- package/src/sdp.ts +2 -2
- package/src/transport/ice.ts +13 -3
- package/src/utils.ts +0 -3
- package/lib/rtp/src/processor/source/rtp.js.map +0 -1
- package/lib/webrtc/src/media/receiver/red.js.map +0 -1
- package/src/media/receiver/red.ts +0 -70
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdp.js","sourceRoot":"","sources":["../../../src/sdp.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { Uint64BE } from \"int64-buffer\";\nimport range from \"lodash/range\";\nimport { isIPv4 } from \"net\";\n\nimport {\n DTLS_ROLE_SETUP,\n DTLS_SETUP_ROLE,\n FMTP_INT_PARAMETERS,\n SSRC_INFO_ATTRS,\n} from \"./const\";\nimport { divide } from \"./helper\";\nimport {\n RTCRtcpFeedback,\n RTCRtpCodecParameters,\n RTCRtpHeaderExtensionParameters,\n RTCRtpParameters,\n RTCRtpSimulcastParameters,\n} from \"./media/parameters\";\nimport { Direction } from \"./media/rtpTransceiver\";\nimport {\n DtlsRole,\n RTCDtlsFingerprint,\n RTCDtlsParameters,\n} from \"./transport/dtls\";\nimport { IceCandidate, RTCIceParameters } from \"./transport/ice\";\nimport { RTCSctpCapabilities } from \"./transport/sctp\";\nimport { Kind } from \"./types/domain\";\n\nexport class SessionDescription {\n version = 0;\n origin?: string;\n name = \"-\";\n time = \"0 0\";\n host?: string;\n group: GroupDescription[] = [];\n extMapAllowMixed = true;\n msidSemantic: GroupDescription[] = [];\n media: MediaDescription[] = [];\n type!: \"offer\" | \"answer\";\n dtlsRole!: DtlsRole;\n iceOptions!: string;\n iceLite!: boolean;\n icePassword!: string;\n iceUsernameFragment!: string;\n dtlsFingerprints: RTCDtlsFingerprint[] = [];\n\n static parse(sdp: string) {\n const [sessionLines, mediaGroups] = groupLines(sdp);\n\n const session = new SessionDescription();\n sessionLines.forEach((line) => {\n if (line.startsWith(\"v=\")) {\n session.version = parseInt(line.slice(2), 10);\n } else if (line.startsWith(\"o=\")) {\n session.origin = line.slice(2);\n } else if (line.startsWith(\"s=\")) {\n session.name = line.slice(2);\n } else if (line.startsWith(\"c=\")) {\n session.host = ipAddressFromSdp(line.slice(2));\n } else if (line.startsWith(\"t=\")) {\n session.time = line.slice(2);\n } else if (line.startsWith(\"a=\")) {\n const [attr, value] = parseAttr(line);\n switch (attr) {\n case \"fingerprint\":\n const [algorithm, fingerprint] = value?.split(\" \") || [];\n session.dtlsFingerprints.push(\n new RTCDtlsFingerprint(algorithm, fingerprint)\n );\n break;\n case \"ice-lite\":\n session.iceLite = true;\n break;\n case \"ice-options\":\n session.iceOptions = value;\n break;\n case \"ice-pwd\":\n session.icePassword = value;\n break;\n case \"ice-ufrag\":\n session.iceUsernameFragment = value;\n break;\n case \"group\":\n parseGroup(session.group, value);\n break;\n case \"msid-semantic\":\n parseGroup(session.msidSemantic, value);\n break;\n case \"setup\":\n session.dtlsRole = DTLS_SETUP_ROLE[value];\n break;\n case \"extmap-allow-mixed\":\n session.extMapAllowMixed = true;\n break;\n }\n }\n });\n\n const bundle = session.group.find((g) => g.semantic === \"BUNDLE\");\n\n mediaGroups.forEach((mediaLines) => {\n const target = mediaLines[0];\n const m = target.match(/^m=([^ ]+) ([0-9]+) ([A-Z/]+) (.+)/);\n if (!m) {\n throw new Error(\"m line not found\");\n }\n\n const kind = m[1] as Kind;\n const fmt = m[4].split(\" \");\n // todo fix\n const fmtInt = [\"audio\", \"video\"].includes(kind)\n ? fmt.map((v) => Number(v))\n : undefined;\n\n const currentMedia = new MediaDescription(\n kind,\n parseInt(m[2]),\n m[3],\n fmtInt || fmt\n );\n currentMedia.dtlsParams = new RTCDtlsParameters(\n [...session.dtlsFingerprints],\n session.dtlsRole\n );\n\n currentMedia.iceParams = new RTCIceParameters({\n iceLite: session.iceLite,\n usernameFragment: session.iceUsernameFragment,\n password: session.icePassword,\n });\n\n currentMedia.iceOptions = session.iceOptions;\n session.media.push(currentMedia);\n\n mediaLines.slice(1).forEach((line) => {\n if (line.startsWith(\"c=\")) {\n currentMedia.host = ipAddressFromSdp(line.slice(2));\n } else if (line.startsWith(\"a=\")) {\n const [attr, value] = parseAttr(line);\n\n switch (attr) {\n case \"candidate\":\n if (!value) throw new Error();\n currentMedia.iceCandidates.push(candidateFromSdp(value));\n break;\n case \"end-of-candidates\":\n currentMedia.iceCandidatesComplete = true;\n break;\n case \"extmap\":\n // eslint-disable-next-line prefer-const\n let [extId, extUri] = value.split(\" \");\n if (extId.includes(\"/\")) {\n [extId] = extId.split(\"/\");\n }\n currentMedia.rtp.headerExtensions.push(\n new RTCRtpHeaderExtensionParameters({\n id: parseInt(extId),\n uri: extUri,\n })\n );\n break;\n case \"fingerprint\":\n if (!value) throw new Error();\n const [algorithm, fingerprint] = value.split(\" \");\n currentMedia.dtlsParams?.fingerprints.push(\n new RTCDtlsFingerprint(algorithm, fingerprint)\n );\n break;\n case \"ice-options\":\n currentMedia.iceOptions = value;\n break;\n case \"ice-pwd\":\n currentMedia.iceParams!.password = value;\n break;\n case \"ice-ufrag\":\n currentMedia.iceParams!.usernameFragment = value;\n break;\n case \"ice-lite\":\n currentMedia.iceParams!.iceLite = true;\n break;\n case \"max-message-size\":\n currentMedia.sctpCapabilities = new RTCSctpCapabilities(\n parseInt(value, 10)\n );\n break;\n case \"mid\":\n currentMedia.rtp.muxId = value;\n break;\n case \"msid\":\n currentMedia.msid = value;\n break;\n case \"rtcp\":\n const [port, rest] = divide(value, \" \");\n currentMedia.rtcpPort = parseInt(port);\n currentMedia.rtcpHost = ipAddressFromSdp(rest);\n break;\n case \"rtcp-mux\":\n currentMedia.rtcpMux = true;\n break;\n case \"setup\":\n currentMedia.dtlsParams!.role = DTLS_SETUP_ROLE[value];\n break;\n case \"recvonly\":\n case \"sendonly\":\n case \"sendrecv\":\n case \"inactive\":\n currentMedia.direction = attr;\n break;\n case \"rtpmap\":\n {\n const [formatId, formatDesc] = divide(value, \" \");\n const [type, clock, channel] = formatDesc.split(\"/\");\n let channels: number | undefined;\n if (currentMedia.kind === \"audio\") {\n channels = channel ? parseInt(channel) : 1;\n }\n const codec = new RTCRtpCodecParameters({\n mimeType: currentMedia.kind + \"/\" + type,\n channels,\n clockRate: parseInt(clock),\n payloadType: parseInt(formatId),\n });\n currentMedia.rtp.codecs.push(codec);\n }\n break;\n case \"sctpmap\":\n if (!value) throw new Error();\n const [formatId, formatDesc] = divide(value, \" \");\n currentMedia.sctpMap[parseInt(formatId)] = formatDesc;\n currentMedia.sctpPort = parseInt(formatId);\n break;\n case \"sctp-port\":\n if (!value) throw new Error();\n currentMedia.sctpPort = parseInt(value);\n break;\n case \"ssrc\":\n const [ssrcStr, ssrcDesc] = divide(value, \" \");\n const ssrc = parseInt(ssrcStr);\n const [ssrcAttr, ssrcValue] = divide(ssrcDesc, \":\");\n let ssrcInfo = currentMedia.ssrc.find((v) => v.ssrc === ssrc);\n if (!ssrcInfo) {\n ssrcInfo = new SsrcDescription({ ssrc });\n currentMedia.ssrc.push(ssrcInfo);\n }\n if (SSRC_INFO_ATTRS.includes(ssrcAttr)) {\n ssrcInfo[ssrcAttr] = ssrcValue;\n }\n break;\n case \"ssrc-group\":\n parseGroup(currentMedia.ssrcGroup, value);\n break;\n case \"rid\":\n {\n const [rid, direction] = divide(value, \" \");\n\n currentMedia.simulcastParameters.push(\n new RTCRtpSimulcastParameters({\n rid,\n direction: direction as any,\n })\n );\n }\n break;\n }\n }\n });\n\n if (\n !currentMedia.iceParams.usernameFragment ||\n !currentMedia.iceParams.password\n ) {\n if (\n currentMedia.rtp.muxId &&\n bundle &&\n bundle.items.includes(currentMedia.rtp.muxId)\n ) {\n for (let i = 0; i < bundle.items.length; i++) {\n if (!bundle.items.includes(i.toString())) continue;\n const check = session.media[i];\n if (\n check.iceParams &&\n check.iceParams.usernameFragment &&\n check.iceParams.password\n ) {\n currentMedia.iceParams = {\n ...check.iceParams,\n };\n break;\n }\n }\n }\n }\n\n if (!currentMedia.dtlsParams.role) {\n currentMedia.dtlsParams = undefined;\n }\n\n const findCodec = (pt: number) =>\n currentMedia.rtp.codecs.find((v) => v.payloadType === pt);\n\n mediaLines.slice(1).forEach((line) => {\n if (line.startsWith(\"a=\")) {\n const [attr, value] = parseAttr(line);\n if (attr === \"fmtp\") {\n const [formatId, formatDesc] = divide(value, \" \");\n const codec = findCodec(Number(formatId))!;\n codec.parameters = formatDesc;\n } else if (attr === \"rtcp-fb\") {\n const [payloadType, feedbackType, feedbackParam] = value.split(\" \");\n currentMedia.rtp.codecs.forEach((codec) => {\n if ([\"*\", codec.payloadType!.toString()].includes(payloadType)) {\n codec.rtcpFeedback.push(\n new RTCRtcpFeedback({\n type: feedbackType,\n parameter: feedbackParam,\n })\n );\n }\n });\n }\n }\n });\n });\n\n return session;\n }\n\n webrtcTrackId(media: MediaDescription) {\n if (media.msid && media.msid.includes(\" \")) {\n const bits = media.msid.split(\" \");\n for (const group of this.msidSemantic) {\n if (\n group.semantic === \"WMS\" &&\n (group.items.includes(bits[0]) || group.items.includes(\"*\"))\n ) {\n return bits[1];\n }\n }\n }\n return;\n }\n\n get string() {\n const lines = [`v=${this.version}`, `o=${this.origin}`, `s=${this.name}`];\n if (this.host) {\n lines.push(`c=${ipAddressFromSdp(this.host)}`);\n }\n lines.push(`t=${this.time}`);\n this.group.forEach((group) => lines.push(`a=group:${group.str}`));\n if (this.extMapAllowMixed) {\n lines.push(`a=extmap-allow-mixed`);\n }\n this.msidSemantic.forEach((group) =>\n lines.push(`a=msid-semantic:${group.str}`)\n );\n const media = this.media.map((m) => m.toString()).join(\"\");\n const sdp = lines.join(\"\\r\\n\") + \"\\r\\n\" + media;\n return sdp;\n }\n\n toJSON() {\n return new RTCSessionDescription(this.string, this.type);\n }\n}\n\nexport class MediaDescription {\n // rtp\n host?: string;\n direction?: Direction;\n msid?: string;\n\n // rtcp\n rtcpPort?: number;\n rtcpHost?: string;\n rtcpMux = false;\n\n // ssrc\n ssrc: SsrcDescription[] = [];\n ssrcGroup: GroupDescription[] = [];\n\n // formats\n rtp: RTCRtpParameters = { codecs: [], headerExtensions: [] };\n\n // sctp\n sctpCapabilities?: RTCSctpCapabilities;\n sctpMap: { [key: number]: string } = {};\n sctpPort?: number;\n\n // DTLS\n dtlsParams?: RTCDtlsParameters;\n\n // ICE\n iceParams?: RTCIceParameters;\n iceCandidates: IceCandidate[] = [];\n iceCandidatesComplete = false;\n iceOptions?: string;\n\n // Simulcast\n simulcastParameters: RTCRtpSimulcastParameters[] = [];\n\n constructor(\n public kind: Kind,\n public port: number,\n public profile: string,\n public fmt: string[] | number[]\n ) {}\n\n toString() {\n const lines: string[] = [];\n lines.push(\n `m=${this.kind} ${this.port} ${this.profile} ${(this.fmt as number[])\n .map((v) => v.toString())\n .join(\" \")}`\n );\n if (this.host) {\n lines.push(`c=${ipAddressToSdp(this.host)}`);\n }\n // ice\n this.iceCandidates.forEach((candidate) => {\n lines.push(`a=candidate:${candidateToSdp(candidate)}`);\n });\n if (this.iceCandidatesComplete) {\n lines.push(\"a=end-of-candidates\");\n }\n if (this.iceParams?.usernameFragment) {\n lines.push(`a=ice-ufrag:${this.iceParams.usernameFragment}`);\n }\n if (this.iceParams?.password) {\n lines.push(`a=ice-pwd:${this.iceParams.password}`);\n }\n if (this.iceParams?.iceLite) {\n lines.push(`a=ice-lite`);\n }\n if (this.iceOptions) {\n lines.push(`a=ice-options:${this.iceOptions}`);\n }\n\n // dtls\n if (this.dtlsParams) {\n this.dtlsParams.fingerprints.forEach((fingerprint) => {\n lines.push(\n `a=fingerprint:${fingerprint.algorithm} ${fingerprint.value}`\n );\n });\n lines.push(`a=setup:${DTLS_ROLE_SETUP[this.dtlsParams.role]}`);\n }\n\n if (this.direction) {\n lines.push(`a=${this.direction}`);\n }\n if (this.rtp.muxId) {\n lines.push(`a=mid:${this.rtp.muxId}`);\n }\n if (this.msid) {\n lines.push(`a=msid:${this.msid}`);\n }\n\n if (this.rtcpPort && this.rtcpHost) {\n lines.push(`a=rtcp:${this.rtcpPort} ${ipAddressToSdp(this.rtcpHost)}`);\n if (this.rtcpMux) {\n lines.push(\"a=rtcp-mux\");\n }\n }\n\n this.ssrcGroup.forEach((group) => {\n lines.push(`a=ssrc-group:${group.str}`);\n });\n this.ssrc.forEach((ssrcInfo) => {\n SSRC_INFO_ATTRS.forEach((ssrcAttr) => {\n const ssrcValue = ssrcInfo[ssrcAttr];\n if (ssrcValue !== undefined) {\n lines.push(`a=ssrc:${ssrcInfo.ssrc} ${ssrcAttr}:${ssrcValue}`);\n }\n });\n });\n\n this.rtp.codecs.forEach((codec) => {\n lines.push(`a=rtpmap:${codec.payloadType} ${codec.str}`);\n\n codec.rtcpFeedback.forEach((feedback) => {\n let value = feedback.type;\n if (feedback.parameter) value += ` ${feedback.parameter}`;\n lines.push(`a=rtcp-fb:${codec.payloadType} ${value}`);\n });\n\n if (codec.parameters) {\n lines.push(`a=fmtp:${codec.payloadType} ${codec.parameters}`);\n }\n });\n\n Object.keys(this.sctpMap).forEach((k) => {\n const v = this.sctpMap[Number(k)];\n lines.push(`a=sctpmap:${k} ${v}`);\n });\n if (this.sctpPort) {\n lines.push(`a=sctp-port:${this.sctpPort}`);\n }\n if (this.sctpCapabilities) {\n lines.push(`a=max-message-size:${this.sctpCapabilities.maxMessageSize}`);\n }\n\n // rtp extension\n this.rtp.headerExtensions.forEach((extension) =>\n lines.push(`a=extmap:${extension.id} ${extension.uri}`)\n );\n\n // simulcast\n if (this.simulcastParameters.length) {\n this.simulcastParameters.forEach((param) => {\n lines.push(`a=rid:${param.rid} ${param.direction}`);\n });\n let line = `a=simulcast:`;\n const recv = this.simulcastParameters.filter(\n (v) => v.direction === \"recv\"\n );\n if (recv.length) {\n line += `recv ${recv.map((v) => v.rid).join(\";\")} `;\n }\n const send = this.simulcastParameters.filter(\n (v) => v.direction === \"send\"\n );\n if (send.length) {\n line += `send ${send.map((v) => v.rid).join(\";\")}`;\n }\n\n lines.push(line);\n }\n\n return lines.join(\"\\r\\n\") + \"\\r\\n\";\n }\n}\n\nexport class GroupDescription {\n constructor(public semantic: string, public items: string[]) {}\n\n get str() {\n return `${this.semantic} ${this.items.join(\" \")}`;\n }\n}\n\nfunction ipAddressFromSdp(sdp: string) {\n const m = sdp.match(/^IN (IP4|IP6) ([^ ]+)$/);\n if (!m) throw new Error(\"exception\");\n return m[2];\n}\n\nfunction ipAddressToSdp(addr: string) {\n const version = isIPv4(addr) ? 4 : 6;\n return `IN IP${version} ${addr}`;\n}\n\nexport function candidateToSdp(c: IceCandidate) {\n let sdp = `${c.foundation} ${c.component} ${c.protocol} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`;\n if (c.relatedAddress) {\n sdp += ` raddr ${c.relatedAddress}`;\n }\n if (c.relatedPort) {\n sdp += ` rport ${c.relatedPort}`;\n }\n if (c.tcpType) {\n sdp += ` tcptype ${c.tcpType}`;\n }\n return sdp;\n}\n\nfunction groupLines(sdp: string): [string[], string[][]] {\n const session: string[] = [];\n const media: string[][] = [];\n\n let lines = sdp.split(\"\\r\\n\");\n if (lines.length === 1) {\n lines = sdp.split(\"\\n\");\n }\n\n lines.forEach((line) => {\n if (line.startsWith(\"m=\")) {\n media.push([line]);\n } else if (media.length > 0) {\n media[media.length - 1].push(line);\n } else {\n session.push(line);\n }\n });\n\n return [session, media];\n}\n\nfunction parseAttr(line: string): [string, string] {\n if (line.includes(\":\")) {\n const bits = divide(line.slice(2), \":\");\n return [bits[0], bits[1]];\n } else {\n return [line.slice(2), undefined as any];\n }\n}\n\nexport function parseGroup(\n dest: GroupDescription[],\n value: string,\n type: (v: string) => any = (v) => v.toString()\n) {\n const bits = value.split(\" \");\n if (bits.length > 0) {\n dest.push(new GroupDescription(bits[0], bits.slice(1).map(type)));\n }\n}\n\nexport function candidateFromSdp(sdp: string) {\n const bits = sdp.split(\" \");\n if (bits.length < 8) {\n throw new Error();\n }\n\n const candidate = new IceCandidate(\n parseInt(bits[1], 10),\n bits[0],\n bits[4],\n parseInt(bits[5], 10),\n parseInt(bits[3], 10),\n bits[2],\n bits[7]\n );\n\n range(8, bits.length - 1, 2).forEach((i) => {\n switch (bits[i]) {\n case \"raddr\":\n candidate.relatedAddress = bits[i + 1];\n break;\n case \"rport\":\n candidate.relatedPort = parseInt(bits[i + 1]);\n break;\n case \"tcptype\":\n candidate.tcpType = bits[i + 1];\n break;\n }\n });\n\n return candidate;\n}\n\nexport class RTCSessionDescription {\n constructor(public sdp: string, public type: \"offer\" | \"answer\") {}\n static isThis(o: any) {\n if (typeof o?.sdp === \"string\") return true;\n }\n}\n\nexport function addSDPHeader(\n type: \"offer\" | \"answer\",\n description: SessionDescription\n) {\n const username = \"-\";\n const sessionId = new Uint64BE(randomBytes(64)).toString().slice(0, 8);\n const sessionVersion = 0;\n\n description.origin = `${username} ${sessionId} ${sessionVersion} IN IP4 0.0.0.0`;\n description.msidSemantic.push(new GroupDescription(\"WMS\", [\"*\"]));\n description.type = type;\n}\n\nexport function codecParametersFromString(str: string) {\n const parameters = {};\n str.split(\";\").forEach((param) => {\n if (param.includes(\"=\")) {\n const [k, v] = divide(param, \"=\");\n if (FMTP_INT_PARAMETERS.includes(k)) {\n parameters[k] = Number(v);\n } else {\n parameters[k] = v;\n }\n } else {\n parameters[param] = undefined;\n }\n });\n return parameters;\n}\n\nexport function codecParametersToString(parameters: {\n [key: string]: string | number;\n}) {\n const params = Object.entries(parameters).map(([k, v]) => {\n if (v) return `${k}=${v}`;\n else return k;\n });\n if (params.length > 0) {\n return params.join(\";\");\n }\n return undefined;\n}\n\nexport class SsrcDescription {\n ssrc!: number;\n cname?: string;\n msid?: string;\n msLabel?: string;\n label?: string;\n\n constructor(props: Partial<SsrcDescription>) {\n Object.assign(this, props);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdp.js","sourceRoot":"","sources":["../../../src/sdp.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { Uint64BE } from \"int64-buffer\";\nimport range from \"lodash/range\";\nimport { isIPv4 } from \"net\";\n\nimport {\n DTLS_ROLE_SETUP,\n DTLS_SETUP_ROLE,\n FMTP_INT_PARAMETERS,\n SSRC_INFO_ATTRS,\n} from \"./const\";\nimport { divide } from \"./helper\";\nimport {\n RTCRtcpFeedback,\n RTCRtpCodecParameters,\n RTCRtpHeaderExtensionParameters,\n RTCRtpParameters,\n RTCRtpSimulcastParameters,\n} from \"./media/parameters\";\nimport { Direction } from \"./media/rtpTransceiver\";\nimport {\n DtlsRole,\n RTCDtlsFingerprint,\n RTCDtlsParameters,\n} from \"./transport/dtls\";\nimport { IceCandidate, RTCIceParameters } from \"./transport/ice\";\nimport { RTCSctpCapabilities } from \"./transport/sctp\";\nimport { Kind } from \"./types/domain\";\n\nexport class SessionDescription {\n version = 0;\n origin?: string;\n name = \"-\";\n time = \"0 0\";\n host?: string;\n group: GroupDescription[] = [];\n extMapAllowMixed = true;\n msidSemantic: GroupDescription[] = [];\n media: MediaDescription[] = [];\n type!: \"offer\" | \"answer\";\n dtlsRole!: DtlsRole;\n iceOptions!: string;\n iceLite!: boolean;\n icePassword!: string;\n iceUsernameFragment!: string;\n dtlsFingerprints: RTCDtlsFingerprint[] = [];\n\n static parse(sdp: string) {\n const [sessionLines, mediaGroups] = groupLines(sdp);\n\n const session = new SessionDescription();\n sessionLines.forEach((line) => {\n if (line.startsWith(\"v=\")) {\n session.version = parseInt(line.slice(2), 10);\n } else if (line.startsWith(\"o=\")) {\n session.origin = line.slice(2);\n } else if (line.startsWith(\"s=\")) {\n session.name = line.slice(2);\n } else if (line.startsWith(\"c=\")) {\n session.host = ipAddressFromSdp(line.slice(2));\n } else if (line.startsWith(\"t=\")) {\n session.time = line.slice(2);\n } else if (line.startsWith(\"a=\")) {\n const [attr, value] = parseAttr(line);\n switch (attr) {\n case \"fingerprint\":\n const [algorithm, fingerprint] = value?.split(\" \") || [];\n session.dtlsFingerprints.push(\n new RTCDtlsFingerprint(algorithm, fingerprint)\n );\n break;\n case \"ice-lite\":\n session.iceLite = true;\n break;\n case \"ice-options\":\n session.iceOptions = value;\n break;\n case \"ice-pwd\":\n session.icePassword = value;\n break;\n case \"ice-ufrag\":\n session.iceUsernameFragment = value;\n break;\n case \"group\":\n parseGroup(session.group, value);\n break;\n case \"msid-semantic\":\n parseGroup(session.msidSemantic, value);\n break;\n case \"setup\":\n session.dtlsRole = DTLS_SETUP_ROLE[value];\n break;\n case \"extmap-allow-mixed\":\n session.extMapAllowMixed = true;\n break;\n }\n }\n });\n\n const bundle = session.group.find((g) => g.semantic === \"BUNDLE\");\n\n mediaGroups.forEach((mediaLines) => {\n const target = mediaLines[0];\n const m = target.match(/^m=([^ ]+) ([0-9]+) ([A-Z/]+) (.+)/);\n if (!m) {\n throw new Error(\"m line not found\");\n }\n\n const kind = m[1] as Kind;\n const fmt = m[4].split(\" \");\n // todo fix\n const fmtInt = [\"audio\", \"video\"].includes(kind)\n ? fmt.map((v) => Number(v))\n : undefined;\n\n const currentMedia = new MediaDescription(\n kind,\n parseInt(m[2]),\n m[3],\n fmtInt || fmt\n );\n currentMedia.dtlsParams = new RTCDtlsParameters(\n [...session.dtlsFingerprints],\n session.dtlsRole\n );\n\n currentMedia.iceParams = new RTCIceParameters({\n iceLite: session.iceLite,\n usernameFragment: session.iceUsernameFragment,\n password: session.icePassword,\n });\n\n currentMedia.iceOptions = session.iceOptions;\n session.media.push(currentMedia);\n\n mediaLines.slice(1).forEach((line) => {\n if (line.startsWith(\"c=\")) {\n currentMedia.host = ipAddressFromSdp(line.slice(2));\n } else if (line.startsWith(\"a=\")) {\n const [attr, value] = parseAttr(line);\n\n switch (attr) {\n case \"candidate\":\n if (!value) throw new Error();\n currentMedia.iceCandidates.push(candidateFromSdp(value));\n break;\n case \"end-of-candidates\":\n currentMedia.iceCandidatesComplete = true;\n break;\n case \"extmap\":\n // eslint-disable-next-line prefer-const\n let [extId, extUri] = value.split(\" \");\n if (extId.includes(\"/\")) {\n [extId] = extId.split(\"/\");\n }\n currentMedia.rtp.headerExtensions.push(\n new RTCRtpHeaderExtensionParameters({\n id: parseInt(extId),\n uri: extUri,\n })\n );\n break;\n case \"fingerprint\":\n if (!value) throw new Error();\n const [algorithm, fingerprint] = value.split(\" \");\n currentMedia.dtlsParams?.fingerprints.push(\n new RTCDtlsFingerprint(algorithm, fingerprint)\n );\n break;\n case \"ice-options\":\n currentMedia.iceOptions = value;\n break;\n case \"ice-pwd\":\n currentMedia.iceParams!.password = value;\n break;\n case \"ice-ufrag\":\n currentMedia.iceParams!.usernameFragment = value;\n break;\n case \"ice-lite\":\n currentMedia.iceParams!.iceLite = true;\n break;\n case \"max-message-size\":\n currentMedia.sctpCapabilities = new RTCSctpCapabilities(\n parseInt(value, 10)\n );\n break;\n case \"mid\":\n currentMedia.rtp.muxId = value;\n break;\n case \"msid\":\n currentMedia.msid = value;\n break;\n case \"rtcp\":\n const [port, rest] = divide(value, \" \");\n currentMedia.rtcpPort = parseInt(port);\n currentMedia.rtcpHost = ipAddressFromSdp(rest);\n break;\n case \"rtcp-mux\":\n currentMedia.rtcpMux = true;\n break;\n case \"setup\":\n currentMedia.dtlsParams!.role = DTLS_SETUP_ROLE[value];\n break;\n case \"recvonly\":\n case \"sendonly\":\n case \"sendrecv\":\n case \"inactive\":\n currentMedia.direction = attr;\n break;\n case \"rtpmap\":\n {\n const [formatId, formatDesc] = divide(value, \" \");\n const [type, clock, channel] = formatDesc.split(\"/\");\n let channels: number | undefined;\n if (currentMedia.kind === \"audio\") {\n channels = channel ? parseInt(channel) : 1;\n }\n const codec = new RTCRtpCodecParameters({\n mimeType: currentMedia.kind + \"/\" + type,\n channels,\n clockRate: parseInt(clock),\n payloadType: parseInt(formatId),\n });\n currentMedia.rtp.codecs.push(codec);\n }\n break;\n case \"sctpmap\":\n if (!value) throw new Error();\n const [formatId, formatDesc] = divide(value, \" \");\n currentMedia.sctpMap[parseInt(formatId)] = formatDesc;\n currentMedia.sctpPort = parseInt(formatId);\n break;\n case \"sctp-port\":\n if (!value) throw new Error();\n currentMedia.sctpPort = parseInt(value);\n break;\n case \"ssrc\":\n const [ssrcStr, ssrcDesc] = divide(value, \" \");\n const ssrc = parseInt(ssrcStr);\n const [ssrcAttr, ssrcValue] = divide(ssrcDesc, \":\");\n let ssrcInfo = currentMedia.ssrc.find((v) => v.ssrc === ssrc);\n if (!ssrcInfo) {\n ssrcInfo = new SsrcDescription({ ssrc });\n currentMedia.ssrc.push(ssrcInfo);\n }\n if (SSRC_INFO_ATTRS.includes(ssrcAttr)) {\n ssrcInfo[ssrcAttr] = ssrcValue;\n }\n break;\n case \"ssrc-group\":\n parseGroup(currentMedia.ssrcGroup, value);\n break;\n case \"rid\":\n {\n const [rid, direction] = divide(value, \" \");\n\n currentMedia.simulcastParameters.push(\n new RTCRtpSimulcastParameters({\n rid,\n direction: direction as any,\n })\n );\n }\n break;\n }\n }\n });\n\n if (\n !currentMedia.iceParams.usernameFragment ||\n !currentMedia.iceParams.password\n ) {\n if (\n currentMedia.rtp.muxId &&\n bundle &&\n bundle.items.includes(currentMedia.rtp.muxId)\n ) {\n for (let i = 0; i < bundle.items.length; i++) {\n if (!bundle.items.includes(i.toString())) continue;\n const check = session.media[i];\n if (\n check?.iceParams &&\n check.iceParams.usernameFragment &&\n check.iceParams.password\n ) {\n currentMedia.iceParams = {\n ...check.iceParams,\n };\n break;\n }\n }\n }\n }\n\n if (!currentMedia.dtlsParams.role) {\n currentMedia.dtlsParams = undefined;\n }\n\n const findCodec = (pt: number) =>\n currentMedia.rtp.codecs.find((v) => v.payloadType === pt);\n\n mediaLines.slice(1).forEach((line) => {\n if (line.startsWith(\"a=\")) {\n const [attr, value] = parseAttr(line);\n if (attr === \"fmtp\") {\n const [formatId, formatDesc] = divide(value, \" \");\n const codec = findCodec(Number(formatId))!;\n codec.parameters = formatDesc;\n } else if (attr === \"rtcp-fb\") {\n const [payloadType, feedbackType, feedbackParam] = value.split(\" \");\n currentMedia.rtp.codecs.forEach((codec) => {\n if ([\"*\", codec.payloadType!.toString()].includes(payloadType)) {\n codec.rtcpFeedback.push(\n new RTCRtcpFeedback({\n type: feedbackType,\n parameter: feedbackParam,\n })\n );\n }\n });\n }\n }\n });\n });\n\n return session;\n }\n\n webrtcTrackId(media: MediaDescription) {\n if (media.msid && media.msid.includes(\" \")) {\n const bits = media.msid.split(\" \");\n for (const group of this.msidSemantic) {\n if (\n group.semantic === \"WMS\" &&\n (group.items.includes(bits[0]) || group.items.includes(\"*\"))\n ) {\n return bits[1];\n }\n }\n }\n return;\n }\n\n get string() {\n const lines = [`v=${this.version}`, `o=${this.origin}`, `s=${this.name}`];\n if (this.host) {\n lines.push(`c=${ipAddressToSdp(this.host)}`);\n }\n lines.push(`t=${this.time}`);\n this.group.forEach((group) => lines.push(`a=group:${group.str}`));\n if (this.extMapAllowMixed) {\n lines.push(`a=extmap-allow-mixed`);\n }\n this.msidSemantic.forEach((group) =>\n lines.push(`a=msid-semantic:${group.str}`)\n );\n const media = this.media.map((m) => m.toString()).join(\"\");\n const sdp = lines.join(\"\\r\\n\") + \"\\r\\n\" + media;\n return sdp;\n }\n\n toJSON() {\n return new RTCSessionDescription(this.string, this.type);\n }\n}\n\nexport class MediaDescription {\n // rtp\n host?: string;\n direction?: Direction;\n msid?: string;\n\n // rtcp\n rtcpPort?: number;\n rtcpHost?: string;\n rtcpMux = false;\n\n // ssrc\n ssrc: SsrcDescription[] = [];\n ssrcGroup: GroupDescription[] = [];\n\n // formats\n rtp: RTCRtpParameters = { codecs: [], headerExtensions: [] };\n\n // sctp\n sctpCapabilities?: RTCSctpCapabilities;\n sctpMap: { [key: number]: string } = {};\n sctpPort?: number;\n\n // DTLS\n dtlsParams?: RTCDtlsParameters;\n\n // ICE\n iceParams?: RTCIceParameters;\n iceCandidates: IceCandidate[] = [];\n iceCandidatesComplete = false;\n iceOptions?: string;\n\n // Simulcast\n simulcastParameters: RTCRtpSimulcastParameters[] = [];\n\n constructor(\n public kind: Kind,\n public port: number,\n public profile: string,\n public fmt: string[] | number[]\n ) {}\n\n toString() {\n const lines: string[] = [];\n lines.push(\n `m=${this.kind} ${this.port} ${this.profile} ${(this.fmt as number[])\n .map((v) => v.toString())\n .join(\" \")}`\n );\n if (this.host) {\n lines.push(`c=${ipAddressToSdp(this.host)}`);\n }\n // ice\n this.iceCandidates.forEach((candidate) => {\n lines.push(`a=candidate:${candidateToSdp(candidate)}`);\n });\n if (this.iceCandidatesComplete) {\n lines.push(\"a=end-of-candidates\");\n }\n if (this.iceParams?.usernameFragment) {\n lines.push(`a=ice-ufrag:${this.iceParams.usernameFragment}`);\n }\n if (this.iceParams?.password) {\n lines.push(`a=ice-pwd:${this.iceParams.password}`);\n }\n if (this.iceParams?.iceLite) {\n lines.push(`a=ice-lite`);\n }\n if (this.iceOptions) {\n lines.push(`a=ice-options:${this.iceOptions}`);\n }\n\n // dtls\n if (this.dtlsParams) {\n this.dtlsParams.fingerprints.forEach((fingerprint) => {\n lines.push(\n `a=fingerprint:${fingerprint.algorithm} ${fingerprint.value}`\n );\n });\n lines.push(`a=setup:${DTLS_ROLE_SETUP[this.dtlsParams.role]}`);\n }\n\n if (this.direction) {\n lines.push(`a=${this.direction}`);\n }\n if (this.rtp.muxId) {\n lines.push(`a=mid:${this.rtp.muxId}`);\n }\n if (this.msid) {\n lines.push(`a=msid:${this.msid}`);\n }\n\n if (this.rtcpPort && this.rtcpHost) {\n lines.push(`a=rtcp:${this.rtcpPort} ${ipAddressToSdp(this.rtcpHost)}`);\n if (this.rtcpMux) {\n lines.push(\"a=rtcp-mux\");\n }\n }\n\n this.ssrcGroup.forEach((group) => {\n lines.push(`a=ssrc-group:${group.str}`);\n });\n this.ssrc.forEach((ssrcInfo) => {\n SSRC_INFO_ATTRS.forEach((ssrcAttr) => {\n const ssrcValue = ssrcInfo[ssrcAttr];\n if (ssrcValue !== undefined) {\n lines.push(`a=ssrc:${ssrcInfo.ssrc} ${ssrcAttr}:${ssrcValue}`);\n }\n });\n });\n\n this.rtp.codecs.forEach((codec) => {\n lines.push(`a=rtpmap:${codec.payloadType} ${codec.str}`);\n\n codec.rtcpFeedback.forEach((feedback) => {\n let value = feedback.type;\n if (feedback.parameter) value += ` ${feedback.parameter}`;\n lines.push(`a=rtcp-fb:${codec.payloadType} ${value}`);\n });\n\n if (codec.parameters) {\n lines.push(`a=fmtp:${codec.payloadType} ${codec.parameters}`);\n }\n });\n\n Object.keys(this.sctpMap).forEach((k) => {\n const v = this.sctpMap[Number(k)];\n lines.push(`a=sctpmap:${k} ${v}`);\n });\n if (this.sctpPort) {\n lines.push(`a=sctp-port:${this.sctpPort}`);\n }\n if (this.sctpCapabilities) {\n lines.push(`a=max-message-size:${this.sctpCapabilities.maxMessageSize}`);\n }\n\n // rtp extension\n this.rtp.headerExtensions.forEach((extension) =>\n lines.push(`a=extmap:${extension.id} ${extension.uri}`)\n );\n\n // simulcast\n if (this.simulcastParameters.length) {\n this.simulcastParameters.forEach((param) => {\n lines.push(`a=rid:${param.rid} ${param.direction}`);\n });\n let line = `a=simulcast:`;\n const recv = this.simulcastParameters.filter(\n (v) => v.direction === \"recv\"\n );\n if (recv.length) {\n line += `recv ${recv.map((v) => v.rid).join(\";\")} `;\n }\n const send = this.simulcastParameters.filter(\n (v) => v.direction === \"send\"\n );\n if (send.length) {\n line += `send ${send.map((v) => v.rid).join(\";\")}`;\n }\n\n lines.push(line);\n }\n\n return lines.join(\"\\r\\n\") + \"\\r\\n\";\n }\n}\n\nexport class GroupDescription {\n constructor(public semantic: string, public items: string[]) {}\n\n get str() {\n return `${this.semantic} ${this.items.join(\" \")}`;\n }\n}\n\nfunction ipAddressFromSdp(sdp: string) {\n const m = sdp.match(/^IN (IP4|IP6) ([^ ]+)$/);\n if (!m) throw new Error(\"exception\");\n return m[2];\n}\n\nfunction ipAddressToSdp(addr: string) {\n const version = isIPv4(addr) ? 4 : 6;\n return `IN IP${version} ${addr}`;\n}\n\nexport function candidateToSdp(c: IceCandidate) {\n let sdp = `${c.foundation} ${c.component} ${c.protocol} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`;\n if (c.relatedAddress) {\n sdp += ` raddr ${c.relatedAddress}`;\n }\n if (c.relatedPort) {\n sdp += ` rport ${c.relatedPort}`;\n }\n if (c.tcpType) {\n sdp += ` tcptype ${c.tcpType}`;\n }\n return sdp;\n}\n\nfunction groupLines(sdp: string): [string[], string[][]] {\n const session: string[] = [];\n const media: string[][] = [];\n\n let lines = sdp.split(\"\\r\\n\");\n if (lines.length === 1) {\n lines = sdp.split(\"\\n\");\n }\n\n lines.forEach((line) => {\n if (line.startsWith(\"m=\")) {\n media.push([line]);\n } else if (media.length > 0) {\n media[media.length - 1].push(line);\n } else {\n session.push(line);\n }\n });\n\n return [session, media];\n}\n\nfunction parseAttr(line: string): [string, string] {\n if (line.includes(\":\")) {\n const bits = divide(line.slice(2), \":\");\n return [bits[0], bits[1]];\n } else {\n return [line.slice(2), undefined as any];\n }\n}\n\nexport function parseGroup(\n dest: GroupDescription[],\n value: string,\n type: (v: string) => any = (v) => v.toString()\n) {\n const bits = value.split(\" \");\n if (bits.length > 0) {\n dest.push(new GroupDescription(bits[0], bits.slice(1).map(type)));\n }\n}\n\nexport function candidateFromSdp(sdp: string) {\n const bits = sdp.split(\" \");\n if (bits.length < 8) {\n throw new Error();\n }\n\n const candidate = new IceCandidate(\n parseInt(bits[1], 10),\n bits[0],\n bits[4],\n parseInt(bits[5], 10),\n parseInt(bits[3], 10),\n bits[2],\n bits[7]\n );\n\n range(8, bits.length - 1, 2).forEach((i) => {\n switch (bits[i]) {\n case \"raddr\":\n candidate.relatedAddress = bits[i + 1];\n break;\n case \"rport\":\n candidate.relatedPort = parseInt(bits[i + 1]);\n break;\n case \"tcptype\":\n candidate.tcpType = bits[i + 1];\n break;\n }\n });\n\n return candidate;\n}\n\nexport class RTCSessionDescription {\n constructor(public sdp: string, public type: \"offer\" | \"answer\") {}\n static isThis(o: any) {\n if (typeof o?.sdp === \"string\") return true;\n }\n}\n\nexport function addSDPHeader(\n type: \"offer\" | \"answer\",\n description: SessionDescription\n) {\n const username = \"-\";\n const sessionId = new Uint64BE(randomBytes(64)).toString().slice(0, 8);\n const sessionVersion = 0;\n\n description.origin = `${username} ${sessionId} ${sessionVersion} IN IP4 0.0.0.0`;\n description.msidSemantic.push(new GroupDescription(\"WMS\", [\"*\"]));\n description.type = type;\n}\n\nexport function codecParametersFromString(str: string) {\n const parameters = {};\n str.split(\";\").forEach((param) => {\n if (param.includes(\"=\")) {\n const [k, v] = divide(param, \"=\");\n if (FMTP_INT_PARAMETERS.includes(k)) {\n parameters[k] = Number(v);\n } else {\n parameters[k] = v;\n }\n } else {\n parameters[param] = undefined;\n }\n });\n return parameters;\n}\n\nexport function codecParametersToString(parameters: {\n [key: string]: string | number;\n}) {\n const params = Object.entries(parameters).map(([k, v]) => {\n if (v) return `${k}=${v}`;\n else return k;\n });\n if (params.length > 0) {\n return params.join(\";\");\n }\n return undefined;\n}\n\nexport class SsrcDescription {\n ssrc!: number;\n cname?: string;\n msid?: string;\n msLabel?: string;\n label?: string;\n\n constructor(props: Partial<SsrcDescription>) {\n Object.assign(this, props);\n }\n}\n"]}
|
|
@@ -4,10 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.RTCIceParameters = exports.IceCandidate = exports.RTCIceCandidate = exports.candidateToIce = exports.candidateFromIce = exports.RTCIceGatherer = exports.IceGathererStates = exports.IceTransportStates = exports.RTCIceTransport = void 0;
|
|
7
|
+
const debug_1 = __importDefault(require("debug"));
|
|
7
8
|
const rx_mini_1 = __importDefault(require("rx.mini"));
|
|
8
9
|
const uuid_1 = require("uuid");
|
|
9
10
|
const src_1 = require("../../../ice/src");
|
|
10
11
|
const sdp_1 = require("../sdp");
|
|
12
|
+
const log = (0, debug_1.default)("werift:packages/webrtc/src/transport/ice.ts");
|
|
11
13
|
class RTCIceTransport {
|
|
12
14
|
constructor(gather) {
|
|
13
15
|
this.gather = gather;
|
|
@@ -53,9 +55,14 @@ class RTCIceTransport {
|
|
|
53
55
|
}
|
|
54
56
|
}
|
|
55
57
|
setRemoteParams(remoteParameters) {
|
|
56
|
-
this.connection.
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
if (this.connection.remoteUsername &&
|
|
59
|
+
this.connection.remotePassword &&
|
|
60
|
+
(this.connection.remoteUsername !== remoteParameters.usernameFragment ||
|
|
61
|
+
this.connection.remotePassword !== remoteParameters.password)) {
|
|
62
|
+
log("restartIce", remoteParameters);
|
|
63
|
+
this.connection.resetNominatedPair();
|
|
64
|
+
}
|
|
65
|
+
this.connection.setRemoteParams(remoteParameters);
|
|
59
66
|
}
|
|
60
67
|
async start() {
|
|
61
68
|
if (this.state === "closed")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../src/transport/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import Event from \"rx.mini\";\nimport { v4 } from \"uuid\";\n\nimport { Candidate, Connection, IceOptions } from \"../../../ice/src\";\nimport { candidateFromSdp, candidateToSdp } from \"../sdp\";\n\nexport class RTCIceTransport {\n readonly id = v4();\n connection = this.gather.connection;\n state: RTCIceConnectionState = \"new\";\n\n readonly onStateChange = new Event<[RTCIceConnectionState]>();\n\n private waitStart?: Event<[]>;\n\n constructor(private gather: RTCIceGatherer) {\n this.connection.stateChanged.subscribe((state) => {\n this.setState(state);\n });\n }\n\n get iceGather() {\n return this.gather;\n }\n\n get role() {\n if (this.connection.iceControlling) return \"controlling\";\n else return \"controlled\";\n }\n\n private setState(state: RTCIceConnectionState) {\n if (state !== this.state) {\n this.state = state;\n\n if (this.onStateChange.ended) return;\n\n if (state === \"closed\") {\n this.onStateChange.execute(state);\n this.onStateChange.complete();\n } else {\n this.onStateChange.execute(state);\n }\n }\n }\n\n addRemoteCandidate = (candidate?: IceCandidate) => {\n if (!this.connection.remoteCandidatesEnd) {\n if (!candidate) {\n return this.connection.addRemoteCandidate(undefined);\n } else {\n return this.connection.addRemoteCandidate(candidateToIce(candidate));\n }\n }\n };\n\n setRemoteParams(remoteParameters: RTCIceParameters) {\n this.connection.remoteIsLite = remoteParameters.iceLite;\n this.connection.remoteUsername = remoteParameters.usernameFragment;\n this.connection.remotePassword = remoteParameters.password;\n }\n\n async start() {\n if (this.state === \"closed\") throw new Error(\"RTCIceTransport is closed\");\n if (!this.connection.remotePassword || !this.connection.remoteUsername)\n throw new Error(\"remoteParams missing\");\n\n if (this.waitStart) await this.waitStart.asPromise();\n this.waitStart = new Event();\n\n this.setState(\"checking\");\n\n try {\n await this.connection.connect();\n } catch (error) {\n this.setState(\"failed\");\n throw error;\n }\n\n this.waitStart.complete();\n }\n\n async stop() {\n if (this.state !== \"closed\") {\n this.setState(\"closed\");\n await this.connection.close();\n }\n }\n}\n\nexport const IceTransportStates = [\n \"new\",\n \"checking\",\n \"connected\",\n \"completed\",\n \"disconnected\",\n \"failed\",\n \"closed\",\n] as const;\nexport type RTCIceConnectionState = typeof IceTransportStates[number];\n\nexport const IceGathererStates = [\"new\", \"gathering\", \"complete\"] as const;\nexport type IceGathererState = typeof IceGathererStates[number];\n\nexport class RTCIceGatherer {\n onIceCandidate: (candidate: IceCandidate) => void = () => {};\n gatheringState: IceGathererState = \"new\";\n\n readonly onGatheringStateChange = new Event<[IceGathererState]>();\n readonly connection = new Connection(false, this.options);\n\n constructor(private options: Partial<IceOptions> = {}) {}\n\n async gather() {\n if (this.gatheringState === \"new\") {\n this.setState(\"gathering\");\n await this.connection.gatherCandidates((candidate) =>\n this.onIceCandidate(candidateFromIce(candidate))\n );\n this.setState(\"complete\");\n }\n }\n\n get localCandidates() {\n return this.connection.localCandidates.map(candidateFromIce);\n }\n\n get localParameters() {\n const params = new RTCIceParameters({\n usernameFragment: this.connection.localUserName,\n password: this.connection.localPassword,\n });\n\n return params;\n }\n\n private setState(state: IceGathererState) {\n if (state !== this.gatheringState) {\n this.gatheringState = state;\n this.onGatheringStateChange.execute(state);\n }\n }\n}\n\nexport function candidateFromIce(c: Candidate) {\n const candidate = new IceCandidate(\n c.component,\n c.foundation,\n c.host,\n c.port,\n c.priority,\n c.transport,\n c.type\n );\n candidate.relatedAddress = c.relatedAddress;\n candidate.relatedPort = c.relatedPort;\n candidate.tcpType = c.tcptype;\n return candidate;\n}\n\nexport function candidateToIce(x: IceCandidate) {\n return new Candidate(\n x.foundation,\n x.component,\n x.protocol,\n x.priority,\n x.ip,\n x.port,\n x.type,\n x.relatedAddress,\n x.relatedPort,\n x.tcpType\n );\n}\n\nexport class RTCIceCandidate {\n candidate!: string;\n sdpMid?: string;\n sdpMLineIndex?: number;\n\n constructor(props: Partial<RTCIceCandidate>) {\n Object.assign(this, props);\n }\n\n static isThis(o: any) {\n if (typeof o?.candidate === \"string\") return true;\n }\n\n toJSON() {\n return {\n candidate: this.candidate,\n sdpMid: this.sdpMid,\n sdpMLineIndex: this.sdpMLineIndex,\n };\n }\n}\n\nexport class IceCandidate {\n // \"\"\"\n // The :class:`RTCIceCandidate` interface represents a candidate Interactive\n // Connectivity Establishment (ICE) configuration which may be used to\n // establish an RTCPeerConnection.\n // \"\"\"\n public relatedAddress?: string;\n public relatedPort?: number;\n public sdpMid?: string;\n public sdpMLineIndex?: number;\n public tcpType?: string;\n\n constructor(\n public component: number,\n public foundation: string,\n public ip: string,\n public port: number,\n public priority: number,\n public protocol: string,\n public type: string\n ) {}\n\n toJSON(): RTCIceCandidate {\n return new RTCIceCandidate({\n candidate: candidateToSdp(this),\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n });\n }\n\n static fromJSON(data: RTCIceCandidate) {\n try {\n const candidate = candidateFromSdp(data.candidate);\n candidate.sdpMLineIndex = data.sdpMLineIndex;\n candidate.sdpMid = data.sdpMid;\n return candidate;\n } catch (error) {}\n }\n}\n\nexport class RTCIceParameters {\n iceLite: boolean = false;\n usernameFragment!: string;\n password!: string;\n\n constructor(props: Partial<RTCIceParameters> = {}) {\n Object.assign(this, props);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../src/transport/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport Event from \"rx.mini\";\nimport { v4 } from \"uuid\";\n\nimport { Candidate, Connection, IceOptions } from \"../../../ice/src\";\nimport { candidateFromSdp, candidateToSdp } from \"../sdp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/ice.ts\");\n\nexport class RTCIceTransport {\n readonly id = v4();\n connection = this.gather.connection;\n state: RTCIceConnectionState = \"new\";\n\n readonly onStateChange = new Event<[RTCIceConnectionState]>();\n\n private waitStart?: Event<[]>;\n\n constructor(private gather: RTCIceGatherer) {\n this.connection.stateChanged.subscribe((state) => {\n this.setState(state);\n });\n }\n\n get iceGather() {\n return this.gather;\n }\n\n get role() {\n if (this.connection.iceControlling) return \"controlling\";\n else return \"controlled\";\n }\n\n private setState(state: RTCIceConnectionState) {\n if (state !== this.state) {\n this.state = state;\n\n if (this.onStateChange.ended) return;\n\n if (state === \"closed\") {\n this.onStateChange.execute(state);\n this.onStateChange.complete();\n } else {\n this.onStateChange.execute(state);\n }\n }\n }\n\n addRemoteCandidate = (candidate?: IceCandidate) => {\n if (!this.connection.remoteCandidatesEnd) {\n if (!candidate) {\n return this.connection.addRemoteCandidate(undefined);\n } else {\n return this.connection.addRemoteCandidate(candidateToIce(candidate));\n }\n }\n };\n\n setRemoteParams(remoteParameters: RTCIceParameters) {\n if (\n this.connection.remoteUsername &&\n this.connection.remotePassword &&\n (this.connection.remoteUsername !== remoteParameters.usernameFragment ||\n this.connection.remotePassword !== remoteParameters.password)\n ) {\n log(\"restartIce\", remoteParameters);\n this.connection.resetNominatedPair();\n }\n this.connection.setRemoteParams(remoteParameters);\n }\n\n async start() {\n if (this.state === \"closed\") throw new Error(\"RTCIceTransport is closed\");\n if (!this.connection.remotePassword || !this.connection.remoteUsername)\n throw new Error(\"remoteParams missing\");\n\n if (this.waitStart) await this.waitStart.asPromise();\n this.waitStart = new Event();\n\n this.setState(\"checking\");\n\n try {\n await this.connection.connect();\n } catch (error) {\n this.setState(\"failed\");\n throw error;\n }\n\n this.waitStart.complete();\n }\n\n async stop() {\n if (this.state !== \"closed\") {\n this.setState(\"closed\");\n await this.connection.close();\n }\n }\n}\n\nexport const IceTransportStates = [\n \"new\",\n \"checking\",\n \"connected\",\n \"completed\",\n \"disconnected\",\n \"failed\",\n \"closed\",\n] as const;\nexport type RTCIceConnectionState = typeof IceTransportStates[number];\n\nexport const IceGathererStates = [\"new\", \"gathering\", \"complete\"] as const;\nexport type IceGathererState = typeof IceGathererStates[number];\n\nexport class RTCIceGatherer {\n onIceCandidate: (candidate: IceCandidate) => void = () => {};\n gatheringState: IceGathererState = \"new\";\n\n readonly onGatheringStateChange = new Event<[IceGathererState]>();\n readonly connection = new Connection(false, this.options);\n\n constructor(private options: Partial<IceOptions> = {}) {}\n\n async gather() {\n if (this.gatheringState === \"new\") {\n this.setState(\"gathering\");\n await this.connection.gatherCandidates((candidate) =>\n this.onIceCandidate(candidateFromIce(candidate))\n );\n this.setState(\"complete\");\n }\n }\n\n get localCandidates() {\n return this.connection.localCandidates.map(candidateFromIce);\n }\n\n get localParameters() {\n const params = new RTCIceParameters({\n usernameFragment: this.connection.localUserName,\n password: this.connection.localPassword,\n });\n\n return params;\n }\n\n private setState(state: IceGathererState) {\n if (state !== this.gatheringState) {\n this.gatheringState = state;\n this.onGatheringStateChange.execute(state);\n }\n }\n}\n\nexport function candidateFromIce(c: Candidate) {\n const candidate = new IceCandidate(\n c.component,\n c.foundation,\n c.host,\n c.port,\n c.priority,\n c.transport,\n c.type\n );\n candidate.relatedAddress = c.relatedAddress;\n candidate.relatedPort = c.relatedPort;\n candidate.tcpType = c.tcptype;\n return candidate;\n}\n\nexport function candidateToIce(x: IceCandidate) {\n return new Candidate(\n x.foundation,\n x.component,\n x.protocol,\n x.priority,\n x.ip,\n x.port,\n x.type,\n x.relatedAddress,\n x.relatedPort,\n x.tcpType\n );\n}\n\nexport class RTCIceCandidate {\n candidate!: string;\n sdpMid?: string;\n sdpMLineIndex?: number;\n\n constructor(props: Partial<RTCIceCandidate>) {\n Object.assign(this, props);\n }\n\n static isThis(o: any) {\n if (typeof o?.candidate === \"string\") return true;\n }\n\n toJSON() {\n return {\n candidate: this.candidate,\n sdpMid: this.sdpMid,\n sdpMLineIndex: this.sdpMLineIndex,\n };\n }\n}\n\nexport class IceCandidate {\n // \"\"\"\n // The :class:`RTCIceCandidate` interface represents a candidate Interactive\n // Connectivity Establishment (ICE) configuration which may be used to\n // establish an RTCPeerConnection.\n // \"\"\"\n public relatedAddress?: string;\n public relatedPort?: number;\n public sdpMid?: string;\n public sdpMLineIndex?: number;\n public tcpType?: string;\n\n constructor(\n public component: number,\n public foundation: string,\n public ip: string,\n public port: number,\n public priority: number,\n public protocol: string,\n public type: string\n ) {}\n\n toJSON(): RTCIceCandidate {\n return new RTCIceCandidate({\n candidate: candidateToSdp(this),\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n });\n }\n\n static fromJSON(data: RTCIceCandidate) {\n try {\n const candidate = candidateFromSdp(data.candidate);\n candidate.sdpMLineIndex = data.sdpMLineIndex;\n candidate.sdpMid = data.sdpMid;\n return candidate;\n } catch (error) {}\n }\n}\n\nexport class RTCIceParameters {\n iceLite: boolean = false;\n usernameFragment!: string;\n password!: string;\n\n constructor(props: Partial<RTCIceParameters> = {}) {\n Object.assign(this, props);\n }\n}\n"]}
|
|
@@ -8,7 +8,6 @@ export declare function isMedia(buf: Buffer): boolean;
|
|
|
8
8
|
export declare function isRtcp(buf: Buffer): boolean;
|
|
9
9
|
export declare function reverseSimulcastDirection(dir: "recv" | "send"): "recv" | "send";
|
|
10
10
|
export declare const andDirection: (a: Direction, b: Direction) => "inactive" | "sendonly" | "recvonly" | "sendrecv";
|
|
11
|
-
export declare const orDirection: (a: Direction, b: Direction) => "inactive" | "sendonly" | "recvonly" | "sendrecv";
|
|
12
11
|
export declare function reverseDirection(dir: Direction): Direction;
|
|
13
12
|
export declare const microTime: () => number;
|
|
14
13
|
export declare const milliTime: () => number;
|
package/lib/webrtc/src/utils.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createSelfSignedCertificate = exports.RtpBuilder = exports.parseIceServers = exports.compactNtp = exports.ntpTime = exports.timestampSeconds = exports.milliTime = exports.microTime = exports.reverseDirection = exports.
|
|
6
|
+
exports.createSelfSignedCertificate = exports.RtpBuilder = exports.parseIceServers = exports.compactNtp = exports.ntpTime = exports.timestampSeconds = exports.milliTime = exports.microTime = exports.reverseDirection = exports.andDirection = exports.reverseSimulcastDirection = exports.isRtcp = exports.isMedia = exports.isDtls = exports.fingerprint = void 0;
|
|
7
7
|
/* eslint-disable prefer-const */
|
|
8
8
|
const crypto_1 = require("crypto");
|
|
9
9
|
const debug_1 = __importDefault(require("debug"));
|
|
@@ -43,8 +43,6 @@ function reverseSimulcastDirection(dir) {
|
|
|
43
43
|
exports.reverseSimulcastDirection = reverseSimulcastDirection;
|
|
44
44
|
const andDirection = (a, b) => rtpTransceiver_1.Directions[rtpTransceiver_1.Directions.indexOf(a) & rtpTransceiver_1.Directions.indexOf(b)];
|
|
45
45
|
exports.andDirection = andDirection;
|
|
46
|
-
const orDirection = (a, b) => rtpTransceiver_1.Directions[rtpTransceiver_1.Directions.indexOf(a) & rtpTransceiver_1.Directions.indexOf(b)];
|
|
47
|
-
exports.orDirection = orDirection;
|
|
48
46
|
function reverseDirection(dir) {
|
|
49
47
|
if (dir === "sendonly")
|
|
50
48
|
return "recvonly";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":";;;;;;AAAA,iCAAiC;AACjC,mCAAoC;AACpC,kDAA0B;AAC1B,2CAAyC;AAEzC,0CAO0B;AAC1B,0DAA8D;AAE9D,uCAAqD;AACrD,2DAA+D;AAE/D,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAEjC,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,qCAAqC,CAAC,CAAC;AAEzD,SAAgB,WAAW,CAAC,IAAY,EAAE,QAAgB;IACxD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEvD,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE7D,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAPD,kCAOC;AAED,SAAgB,MAAM,CAAC,GAAW;IAChC,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,SAAS,GAAG,EAAE,IAAI,SAAS,GAAG,EAAE,CAAC;AAC1C,CAAC;AAHD,wBAGC;AAED,SAAgB,OAAO,CAAC,GAAW;IACjC,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,SAAS,GAAG,GAAG,IAAI,SAAS,GAAG,GAAG,CAAC;AAC5C,CAAC;AAHD,0BAGC;AAED,SAAgB,MAAM,CAAC,GAAW;IAChC,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AAC3D,CAAC;AAFD,wBAEC;AAED,SAAgB,yBAAyB,CAAC,GAAoB;IAC5D,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAHD,8DAGC;AAEM,MAAM,YAAY,GAAG,CAAC,CAAY,EAAE,CAAY,EAAE,EAAE,CACzD,2BAAU,CAAC,2BAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,2BAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAD/C,QAAA,YAAY,gBACmC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-const */\nimport { createHash } from \"crypto\";\nimport debug from \"debug\";\nimport { performance } from \"perf_hooks\";\n\nimport {\n bufferReader,\n bufferWriter,\n random16,\n random32,\n uint16Add,\n uint32Add,\n} from \"../../common/src\";\nimport { CipherContext } from \"../../dtls/src/context/cipher\";\nimport { Address } from \"../../ice/src\";\nimport { RtpHeader, RtpPacket } from \"../../rtp/src\";\nimport { Direction, Directions } from \"./media/rtpTransceiver\";\nimport { RTCIceServer } from \"./peerConnection\";\nconst now = require(\"nano-time\");\n\nconst log = debug(\"werift:packages/webrtc/src/utils.ts\");\n\nexport function fingerprint(file: Buffer, hashName: string) {\n const upper = (s: string) => s.toUpperCase();\n const colon = (s: any) => s.match(/(.{2})/g).join(\":\");\n\n const hash = createHash(hashName).update(file).digest(\"hex\");\n\n return colon(upper(hash));\n}\n\nexport function isDtls(buf: Buffer) {\n const firstByte = buf[0];\n return firstByte > 19 && firstByte < 64;\n}\n\nexport function isMedia(buf: Buffer) {\n const firstByte = buf[0];\n return firstByte > 127 && firstByte < 192;\n}\n\nexport function isRtcp(buf: Buffer) {\n return buf.length >= 2 && buf[1] >= 192 && buf[1] <= 208;\n}\n\nexport function reverseSimulcastDirection(dir: \"recv\" | \"send\") {\n if (dir === \"recv\") return \"send\";\n return \"recv\";\n}\n\nexport const andDirection = (a: Direction, b: Direction) =>\n Directions[Directions.indexOf(a) & Directions.indexOf(b)];\n\nexport function reverseDirection(dir: Direction): Direction {\n if (dir === \"sendonly\") return \"recvonly\";\n if (dir === \"recvonly\") return \"sendonly\";\n return dir;\n}\n\nexport const microTime = () => now.micro() as number;\n\nexport const milliTime = () => new Date().getTime();\n\nexport const timestampSeconds = () => Date.now() / 1000;\n\n/**https://datatracker.ietf.org/doc/html/rfc3550#section-4 */\nexport const ntpTime = () => {\n const now = performance.timeOrigin + performance.now() - Date.UTC(1900, 0, 1);\n\n const seconds = now / 1000;\n const [sec, msec] = seconds.toString().split(\".\").map(Number);\n\n const buf = bufferWriter([4, 4], [sec, msec]);\n\n return buf.readBigUInt64BE();\n};\n\n/**\n * https://datatracker.ietf.org/doc/html/rfc3550#section-4\n * @param ntp\n * @returns 32bit\n */\nexport const compactNtp = (ntp: bigint) => {\n const buf = bufferWriter([8], [ntp]);\n const [, sec, msec] = bufferReader(buf, [2, 2, 2, 2]);\n return bufferWriter([2, 2], [sec, msec]).readUInt32BE();\n};\n\nexport function parseIceServers(iceServers: RTCIceServer[]) {\n const url2Address = (url?: string) => {\n if (!url) return;\n const [address, port] = url.split(\":\");\n return [address, parseInt(port)] as Address;\n };\n\n const stunServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"stun:\"))?.urls.slice(5)\n );\n const turnServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"turn:\"))?.urls.slice(5)\n );\n const { credential, username } =\n iceServers.find(({ urls }) => urls.includes(\"turn:\")) || {};\n\n const options = {\n stunServer,\n turnServer,\n turnUsername: username,\n turnPassword: credential,\n };\n log(\"iceOptions\", options);\n return options;\n}\n\nexport class RtpBuilder {\n sequenceNumber = random16();\n timestamp = random32();\n\n create(payload: Buffer) {\n this.sequenceNumber = uint16Add(this.sequenceNumber, 1);\n this.timestamp = uint32Add(this.timestamp, 960);\n\n const header = new RtpHeader({\n sequenceNumber: this.sequenceNumber,\n timestamp: Number(this.timestamp),\n payloadType: 96,\n extension: true,\n marker: false,\n padding: false,\n });\n const rtp = new RtpPacket(header, payload);\n return rtp;\n }\n}\n\n/**\n *\n * @param signatureHash\n * @param namedCurveAlgorithm necessary when use ecdsa\n */\nexport const createSelfSignedCertificate =\n CipherContext.createSelfSignedCertificateWithKey;\n"]}
|
package/package.json
CHANGED
package/src/const.ts
CHANGED
|
@@ -61,6 +61,6 @@ export const SRTP_PROFILE = {
|
|
|
61
61
|
} as const;
|
|
62
62
|
|
|
63
63
|
export const SenderDirections = ["sendonly", "sendrecv"];
|
|
64
|
-
export const
|
|
64
|
+
export const ReceiverDirection = ["sendrecv", "recvonly"];
|
|
65
65
|
|
|
66
66
|
export { HashAlgorithms, SignatureAlgorithm };
|
|
@@ -17,7 +17,7 @@ const LOST_SIZE = 30 * 5;
|
|
|
17
17
|
export class NackHandler {
|
|
18
18
|
private newEstSeqNum = 0;
|
|
19
19
|
private _lost: { [seqNum: number]: number } = {};
|
|
20
|
-
private nackLoop
|
|
20
|
+
private nackLoop: any;
|
|
21
21
|
|
|
22
22
|
readonly onPacketLost = new Event<[GenericNack]>();
|
|
23
23
|
mediaSourceSsrc?: number;
|
|
@@ -25,6 +25,19 @@ export class NackHandler {
|
|
|
25
25
|
|
|
26
26
|
constructor(private receiver: RTCRtpReceiver) {}
|
|
27
27
|
|
|
28
|
+
private start() {
|
|
29
|
+
if (this.nackLoop) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
this.nackLoop = setInterval(async () => {
|
|
33
|
+
try {
|
|
34
|
+
await this.sendNack();
|
|
35
|
+
} catch (error) {
|
|
36
|
+
log("failed to send nack", error);
|
|
37
|
+
}
|
|
38
|
+
}, 20);
|
|
39
|
+
}
|
|
40
|
+
|
|
28
41
|
get lostSeqNumbers() {
|
|
29
42
|
return Object.keys(this._lost).map(Number).sort();
|
|
30
43
|
}
|
|
@@ -42,6 +55,8 @@ export class NackHandler {
|
|
|
42
55
|
}
|
|
43
56
|
|
|
44
57
|
addPacket(packet: RtpPacket) {
|
|
58
|
+
this.start();
|
|
59
|
+
|
|
45
60
|
const { sequenceNumber, ssrc } = packet.header;
|
|
46
61
|
this.mediaSourceSsrc = ssrc;
|
|
47
62
|
|
|
@@ -95,20 +110,21 @@ export class NackHandler {
|
|
|
95
110
|
});
|
|
96
111
|
}
|
|
97
112
|
|
|
98
|
-
private sendNack()
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
113
|
+
private sendNack = () =>
|
|
114
|
+
new Promise((r, f) => {
|
|
115
|
+
if (this.lostSeqNumbers.length > 0 && this.mediaSourceSsrc) {
|
|
116
|
+
const nack = new GenericNack({
|
|
117
|
+
senderSsrc: this.receiver.rtcpSsrc,
|
|
118
|
+
mediaSourceSsrc: this.mediaSourceSsrc,
|
|
119
|
+
lost: this.lostSeqNumbers,
|
|
120
|
+
});
|
|
121
|
+
const rtcp = new RtcpTransportLayerFeedback({
|
|
122
|
+
feedback: nack,
|
|
123
|
+
});
|
|
124
|
+
this.receiver.dtlsTransport.sendRtcp([rtcp]).then(r).catch(f);
|
|
125
|
+
|
|
126
|
+
this.updateRetryCount();
|
|
127
|
+
this.onPacketLost.execute(nack);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
114
130
|
}
|
package/src/media/router.ts
CHANGED
|
@@ -38,6 +38,7 @@ export class RtpRouter {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
private registerRtpReceiver(receiver: RTCRtpReceiver, ssrc: number) {
|
|
41
|
+
log("registerRtpReceiver", ssrc);
|
|
41
42
|
this.ssrcTable[ssrc] = receiver;
|
|
42
43
|
}
|
|
43
44
|
|
|
@@ -126,44 +127,46 @@ export class RtpRouter {
|
|
|
126
127
|
this.extIdUriMap
|
|
127
128
|
);
|
|
128
129
|
|
|
129
|
-
let
|
|
130
|
+
let rtpReceiver: RTCRtpReceiver | undefined = this.ssrcTable[
|
|
130
131
|
packet.header.ssrc
|
|
131
132
|
] as RTCRtpReceiver;
|
|
132
133
|
|
|
133
134
|
const rid = extensions[RTP_EXTENSION_URI.sdesRTPStreamID];
|
|
134
135
|
if (typeof rid === "string") {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
} else if (
|
|
139
|
-
|
|
136
|
+
rtpReceiver = this.ridTable[rid] as RTCRtpReceiver;
|
|
137
|
+
rtpReceiver.latestRid = rid;
|
|
138
|
+
rtpReceiver.handleRtpByRid(packet, rid, extensions);
|
|
139
|
+
} else if (rtpReceiver) {
|
|
140
|
+
rtpReceiver.handleRtpBySsrc(packet, extensions);
|
|
140
141
|
} else {
|
|
141
142
|
// simulcast after send receiver report
|
|
142
|
-
|
|
143
|
+
rtpReceiver = Object.values(this.ridTable)
|
|
143
144
|
.filter((r): r is RTCRtpReceiver => r instanceof RTCRtpReceiver)
|
|
144
145
|
.find((r) => r.trackBySSRC[packet.header.ssrc]);
|
|
145
|
-
if (
|
|
146
|
+
if (rtpReceiver) {
|
|
146
147
|
log("simulcast register receiver by ssrc", packet.header.ssrc);
|
|
147
|
-
this.registerRtpReceiver(
|
|
148
|
-
|
|
148
|
+
this.registerRtpReceiver(rtpReceiver, packet.header.ssrc);
|
|
149
|
+
rtpReceiver.handleRtpBySsrc(packet, extensions);
|
|
150
|
+
} else {
|
|
151
|
+
// bug
|
|
149
152
|
}
|
|
150
153
|
}
|
|
151
154
|
|
|
152
|
-
if (!
|
|
155
|
+
if (!rtpReceiver) {
|
|
153
156
|
log("ssrcReceiver not found");
|
|
154
157
|
return;
|
|
155
158
|
}
|
|
156
159
|
|
|
157
160
|
const sdesMid = extensions[RTP_EXTENSION_URI.sdesMid];
|
|
158
161
|
if (typeof sdesMid === "string") {
|
|
159
|
-
|
|
162
|
+
rtpReceiver.sdesMid = sdesMid;
|
|
160
163
|
}
|
|
161
164
|
|
|
162
165
|
const repairedRid = extensions[
|
|
163
166
|
RTP_EXTENSION_URI.repairedRtpStreamId
|
|
164
167
|
] as string;
|
|
165
168
|
if (typeof repairedRid === "string") {
|
|
166
|
-
|
|
169
|
+
rtpReceiver.latestRepairedRid = repairedRid;
|
|
167
170
|
}
|
|
168
171
|
};
|
|
169
172
|
|
package/src/media/rtpReceiver.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { int } from "../../../common/src";
|
|
|
8
8
|
import {
|
|
9
9
|
PictureLossIndication,
|
|
10
10
|
Red,
|
|
11
|
+
RedHandler,
|
|
11
12
|
RtcpPacket,
|
|
12
13
|
RtcpPayloadSpecificFeedback,
|
|
13
14
|
RtcpReceiverInfo,
|
|
@@ -24,7 +25,6 @@ import { RTP_EXTENSION_URI } from "./extension/rtpExtension";
|
|
|
24
25
|
import { RTCRtpCodecParameters, RTCRtpReceiveParameters } from "./parameters";
|
|
25
26
|
import { NackHandler } from "./receiver/nack";
|
|
26
27
|
import { ReceiverTWCC } from "./receiver/receiverTwcc";
|
|
27
|
-
import { AudioRedHandler } from "./receiver/red";
|
|
28
28
|
import { StreamStatistics } from "./receiver/statistics";
|
|
29
29
|
import { Extensions } from "./router";
|
|
30
30
|
import { MediaStreamTrack } from "./track";
|
|
@@ -40,7 +40,7 @@ export class RTCRtpReceiver {
|
|
|
40
40
|
}
|
|
41
41
|
private readonly ssrcByRtx: { [rtxSsrc: number]: number } = {};
|
|
42
42
|
private readonly nack = new NackHandler(this);
|
|
43
|
-
private readonly
|
|
43
|
+
private readonly audioRedHandler = new RedHandler();
|
|
44
44
|
|
|
45
45
|
readonly type = "receiver";
|
|
46
46
|
readonly uuid = uuid();
|
|
@@ -127,13 +127,23 @@ export class RTCRtpReceiver {
|
|
|
127
127
|
|
|
128
128
|
addTrack(track: MediaStreamTrack) {
|
|
129
129
|
const exist = this.tracks.find((t) => {
|
|
130
|
-
if (t.rid)
|
|
131
|
-
|
|
130
|
+
if (t.rid) {
|
|
131
|
+
return t.rid === track.rid;
|
|
132
|
+
}
|
|
133
|
+
if (t.ssrc) {
|
|
134
|
+
return t.ssrc === track.ssrc;
|
|
135
|
+
}
|
|
132
136
|
});
|
|
133
|
-
if (exist)
|
|
137
|
+
if (exist) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
134
140
|
this.tracks.push(track);
|
|
135
|
-
if (track.ssrc)
|
|
136
|
-
|
|
141
|
+
if (track.ssrc) {
|
|
142
|
+
this.trackBySSRC[track.ssrc] = track;
|
|
143
|
+
}
|
|
144
|
+
if (track.rid) {
|
|
145
|
+
this.trackByRID[track.rid] = track;
|
|
146
|
+
}
|
|
137
147
|
return true;
|
|
138
148
|
}
|
|
139
149
|
|
|
@@ -259,7 +269,9 @@ export class RTCRtpReceiver {
|
|
|
259
269
|
extensions: Extensions,
|
|
260
270
|
track?: MediaStreamTrack
|
|
261
271
|
) {
|
|
262
|
-
if (this.stopped)
|
|
272
|
+
if (this.stopped) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
263
275
|
|
|
264
276
|
const codec = this.codecs[packet.header.payloadType];
|
|
265
277
|
if (!codec) {
|
|
@@ -314,7 +326,7 @@ export class RTCRtpReceiver {
|
|
|
314
326
|
if (track) {
|
|
315
327
|
if (red) {
|
|
316
328
|
if (track.kind === "audio") {
|
|
317
|
-
const payloads = this.
|
|
329
|
+
const payloads = this.audioRedHandler.push(red, packet);
|
|
318
330
|
for (const packet of payloads) {
|
|
319
331
|
track.onReceiveRtp.execute(packet.clone());
|
|
320
332
|
}
|