werift 0.20.1 → 0.21.0

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.
Files changed (90) hide show
  1. package/lib/common/src/event.js +0 -3
  2. package/lib/common/src/event.js.map +1 -1
  3. package/lib/dtls/src/flight/server/flight2.js +5 -3
  4. package/lib/dtls/src/flight/server/flight2.js.map +1 -1
  5. package/lib/dtls/src/index.d.ts +1 -1
  6. package/lib/dtls/src/index.js.map +1 -1
  7. package/lib/dtls/src/record/receive.js +1 -1
  8. package/lib/dtls/src/record/receive.js.map +1 -1
  9. package/lib/ice/src/candidate.d.ts +2 -1
  10. package/lib/ice/src/candidate.js +17 -4
  11. package/lib/ice/src/candidate.js.map +1 -1
  12. package/lib/ice/src/helper.d.ts +6 -6
  13. package/lib/ice/src/helper.js +18 -15
  14. package/lib/ice/src/helper.js.map +1 -1
  15. package/lib/ice/src/ice.d.ts +28 -75
  16. package/lib/ice/src/ice.js +388 -418
  17. package/lib/ice/src/ice.js.map +1 -1
  18. package/lib/ice/src/iceBase.d.ts +109 -0
  19. package/lib/ice/src/iceBase.js +166 -0
  20. package/lib/ice/src/iceBase.js.map +1 -0
  21. package/lib/ice/src/index.d.ts +1 -0
  22. package/lib/ice/src/index.js +1 -0
  23. package/lib/ice/src/index.js.map +1 -1
  24. package/lib/ice/src/stun/message.d.ts +6 -0
  25. package/lib/ice/src/stun/message.js +4 -0
  26. package/lib/ice/src/stun/message.js.map +1 -1
  27. package/lib/ice/src/stun/protocol.d.ts +5 -6
  28. package/lib/ice/src/stun/protocol.js +18 -18
  29. package/lib/ice/src/stun/protocol.js.map +1 -1
  30. package/lib/ice/src/stun/transaction.js +6 -1
  31. package/lib/ice/src/stun/transaction.js.map +1 -1
  32. package/lib/ice/src/turn/protocol.d.ts +6 -5
  33. package/lib/ice/src/turn/protocol.js +54 -36
  34. package/lib/ice/src/turn/protocol.js.map +1 -1
  35. package/lib/ice/src/types/model.d.ts +4 -0
  36. package/lib/ice/src/types/model.js.map +1 -1
  37. package/lib/rtp/src/extra/container/webm/container.d.ts +3 -1
  38. package/lib/rtp/src/extra/container/webm/container.js +8 -2
  39. package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
  40. package/lib/rtp/src/extra/container/webm/ebml/id.d.ts +6 -0
  41. package/lib/rtp/src/extra/container/webm/ebml/id.js +6 -0
  42. package/lib/rtp/src/extra/container/webm/ebml/id.js.map +1 -1
  43. package/lib/rtp/src/extra/processor/webm.d.ts +11 -16
  44. package/lib/rtp/src/extra/processor/webm.js.map +1 -1
  45. package/lib/rtp/src/extra/processor/webmCallback.d.ts +1 -10
  46. package/lib/rtp/src/extra/processor/webmCallback.js.map +1 -1
  47. package/lib/rtp/src/rtp/headerExtension.d.ts +45 -3
  48. package/lib/rtp/src/rtp/headerExtension.js +15 -0
  49. package/lib/rtp/src/rtp/headerExtension.js.map +1 -1
  50. package/lib/sctp/src/index.d.ts +1 -1
  51. package/lib/sctp/src/index.js.map +1 -1
  52. package/lib/webrtc/src/const.d.ts +2 -2
  53. package/lib/webrtc/src/const.js.map +1 -1
  54. package/lib/webrtc/src/media/extension/rtpExtension.d.ts +1 -0
  55. package/lib/webrtc/src/media/extension/rtpExtension.js +6 -0
  56. package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -1
  57. package/lib/webrtc/src/media/router.d.ts +0 -3
  58. package/lib/webrtc/src/media/router.js.map +1 -1
  59. package/lib/webrtc/src/media/rtpReceiver.d.ts +1 -2
  60. package/lib/webrtc/src/media/rtpReceiver.js +2 -2
  61. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  62. package/lib/webrtc/src/media/track.d.ts +2 -2
  63. package/lib/webrtc/src/media/track.js.map +1 -1
  64. package/lib/webrtc/src/nonstandard/recorder/index.d.ts +1 -0
  65. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  66. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +1 -0
  67. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  68. package/lib/webrtc/src/peerConnection.d.ts +12 -6
  69. package/lib/webrtc/src/peerConnection.js +94 -82
  70. package/lib/webrtc/src/peerConnection.js.map +1 -1
  71. package/lib/webrtc/src/sdp.js +15 -3
  72. package/lib/webrtc/src/sdp.js.map +1 -1
  73. package/lib/webrtc/src/transport/dtls.d.ts +5 -5
  74. package/lib/webrtc/src/transport/dtls.js +7 -18
  75. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  76. package/lib/webrtc/src/transport/ice.d.ts +20 -9
  77. package/lib/webrtc/src/transport/ice.js +97 -32
  78. package/lib/webrtc/src/transport/ice.js.map +1 -1
  79. package/package.json +1 -1
  80. package/src/const.ts +2 -2
  81. package/src/media/extension/rtpExtension.ts +6 -0
  82. package/src/media/router.ts +2 -3
  83. package/src/media/rtpReceiver.ts +4 -3
  84. package/src/media/track.ts +7 -2
  85. package/src/nonstandard/recorder/index.ts +1 -0
  86. package/src/nonstandard/recorder/writer/webm.ts +47 -43
  87. package/src/peerConnection.ts +118 -88
  88. package/src/sdp.ts +16 -3
  89. package/src/transport/dtls.ts +11 -9
  90. package/src/transport/ice.ts +73 -26
@@ -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 { isIPv4 } from \"net\";\nimport { Uint64BE } from \"int64-buffer\";\nimport range from \"lodash/range\";\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 type RTCRtpParameters,\n RTCRtpSimulcastParameters,\n} from \"./media/parameters\";\nimport type { Direction } from \"./media/rtpTransceiver\";\nimport {\n type DtlsRole,\n RTCDtlsFingerprint,\n RTCDtlsParameters,\n} from \"./transport/dtls\";\nimport { IceCandidate, RTCIceParameters } from \"./transport/ice\";\nimport { RTCSctpCapabilities } from \"./transport/sctp\";\nimport type { 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 = Number.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 {\n const [algorithm, fingerprint] = value?.split(\" \") || [];\n session.dtlsFingerprints.push(\n new RTCDtlsFingerprint(algorithm, fingerprint),\n );\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 Number.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 {\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: Number.parseInt(extId),\n uri: extUri,\n }),\n );\n }\n break;\n case \"fingerprint\":\n {\n if (!value) throw new Error();\n const [algorithm, fingerprint] = value.split(\" \");\n currentMedia.dtlsParams?.fingerprints.push(\n new RTCDtlsFingerprint(algorithm, fingerprint),\n );\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 Number.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 {\n const [port, rest] = divide(value, \" \");\n currentMedia.rtcpPort = Number.parseInt(port);\n currentMedia.rtcpHost = ipAddressFromSdp(rest);\n }\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 ? Number.parseInt(channel) : 1;\n }\n const codec = new RTCRtpCodecParameters({\n mimeType: currentMedia.kind + \"/\" + type,\n channels,\n clockRate: Number.parseInt(clock),\n payloadType: Number.parseInt(formatId),\n });\n currentMedia.rtp.codecs.push(codec);\n }\n break;\n case \"sctpmap\":\n {\n if (!value) throw new Error();\n const [formatId, formatDesc] = divide(value, \" \");\n currentMedia.sctpMap[Number.parseInt(formatId)] = formatDesc;\n currentMedia.sctpPort = Number.parseInt(formatId);\n }\n break;\n case \"sctp-port\":\n if (!value) throw new Error();\n currentMedia.sctpPort = Number.parseInt(value);\n break;\n case \"ssrc\":\n {\n const [ssrcStr, ssrcDesc] = divide(value, \" \");\n const ssrc = Number.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 }\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 (check.iceParams?.usernameFragment && check.iceParams.password) {\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?.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(\n public semantic: string,\n public items: string[],\n ) {}\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 Number.parseInt(bits[1], 10),\n bits[0],\n bits[4],\n Number.parseInt(bits[5], 10),\n Number.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 = Number.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(\n public sdp: string,\n public type: \"offer\" | \"answer\",\n ) {}\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: any = {};\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 if (param.includes(\":\")) {\n const [k, v] = param.split(\":\");\n parameters[k] = Number.isNaN(Number(v)) ? v : Number(v);\n } else {\n parameters[param] = undefined;\n }\n });\n return parameters;\n}\n\nexport function codecParametersToString(\n parameters: {\n [key: string]: string | number;\n },\n joint: string = \"=\",\n) {\n const params = Object.entries(parameters).map(([k, v]) => {\n if (v) return `${k}${joint}${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 { isIPv4 } from \"net\";\nimport { Uint64BE } from \"int64-buffer\";\nimport range from \"lodash/range\";\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 type RTCRtpParameters,\n RTCRtpSimulcastParameters,\n} from \"./media/parameters\";\nimport type { Direction } from \"./media/rtpTransceiver\";\nimport {\n type DtlsRole,\n RTCDtlsFingerprint,\n RTCDtlsParameters,\n} from \"./transport/dtls\";\nimport { IceCandidate, RTCIceParameters } from \"./transport/ice\";\nimport { RTCSctpCapabilities } from \"./transport/sctp\";\nimport type { 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 = Number.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 {\n const [algorithm, fingerprint] = value?.split(\" \") || [];\n session.dtlsFingerprints.push(\n new RTCDtlsFingerprint(algorithm, fingerprint),\n );\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 Number.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 {\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: Number.parseInt(extId),\n uri: extUri,\n }),\n );\n }\n break;\n case \"fingerprint\":\n {\n if (!value) throw new Error();\n const [algorithm, fingerprint] = value.split(\" \");\n currentMedia.dtlsParams?.fingerprints.push(\n new RTCDtlsFingerprint(algorithm, fingerprint),\n );\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 Number.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 {\n const [port, rest] = divide(value, \" \");\n currentMedia.rtcpPort = Number.parseInt(port);\n currentMedia.rtcpHost = ipAddressFromSdp(rest);\n }\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 ? Number.parseInt(channel) : 1;\n }\n const codec = new RTCRtpCodecParameters({\n mimeType: currentMedia.kind + \"/\" + type,\n channels,\n clockRate: Number.parseInt(clock),\n payloadType: Number.parseInt(formatId),\n });\n currentMedia.rtp.codecs.push(codec);\n }\n break;\n case \"sctpmap\":\n {\n if (!value) throw new Error();\n const [formatId, formatDesc] = divide(value, \" \");\n currentMedia.sctpMap[Number.parseInt(formatId)] = formatDesc;\n currentMedia.sctpPort = Number.parseInt(formatId);\n }\n break;\n case \"sctp-port\":\n if (!value) throw new Error();\n currentMedia.sctpPort = Number.parseInt(value);\n break;\n case \"ssrc\":\n {\n const [ssrcStr, ssrcDesc] = divide(value, \" \");\n const ssrc = Number.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 }\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 (check.iceParams?.usernameFragment && check.iceParams.password) {\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?.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(\n public semantic: string,\n public items: string[],\n ) {}\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 != undefined) {\n sdp += ` raddr ${c.relatedAddress}`;\n }\n if (c.relatedPort != undefined) {\n sdp += ` rport ${c.relatedPort}`;\n }\n if (c.tcpType != undefined) {\n sdp += ` tcptype ${c.tcpType}`;\n }\n if (c.generation != undefined) {\n sdp += ` generation ${c.generation}`;\n }\n if (c.ufrag != undefined) {\n sdp += ` ufrag ${c.ufrag}`;\n }\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 Number.parseInt(bits[1], 10),\n bits[0],\n bits[4],\n Number.parseInt(bits[5], 10),\n Number.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 = Number.parseInt(bits[i + 1]);\n break;\n case \"tcptype\":\n candidate.tcpType = bits[i + 1];\n break;\n case \"generation\":\n candidate.generation = Number.parseInt(bits[i + 1]);\n break;\n case \"ufrag\":\n candidate.ufrag = bits[i + 1];\n break;\n }\n });\n\n return candidate;\n}\n\nexport class RTCSessionDescription {\n constructor(\n public sdp: string,\n public type: \"offer\" | \"answer\",\n ) {}\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: any = {};\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 if (param.includes(\":\")) {\n const [k, v] = param.split(\":\");\n parameters[k] = Number.isNaN(Number(v)) ? v : Number(v);\n } else {\n parameters[param] = undefined;\n }\n });\n return parameters;\n}\n\nexport function codecParametersToString(\n parameters: {\n [key: string]: string | number;\n },\n joint: string = \"=\",\n) {\n const params = Object.entries(parameters).map(([k, v]) => {\n if (v) return `${k}${joint}${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"]}
@@ -10,7 +10,7 @@ export declare class RTCDtlsTransport {
10
10
  readonly config: PeerConfig;
11
11
  readonly iceTransport: RTCIceTransport;
12
12
  readonly router: RtpRouter;
13
- readonly certificates: RTCCertificate[];
13
+ localCertificate?: RTCCertificate | undefined;
14
14
  private readonly srtpProfiles;
15
15
  id: string;
16
16
  state: DtlsState;
@@ -22,12 +22,12 @@ export declare class RTCDtlsTransport {
22
22
  srtp: SrtpSession;
23
23
  srtcp: SrtcpSession;
24
24
  readonly onStateChange: Event<["closed" | "new" | "connected" | "connecting" | "failed"]>;
25
- localCertificate?: RTCCertificate;
26
- localCertificatePromise?: Promise<RTCCertificate>;
25
+ static localCertificate?: RTCCertificate;
26
+ static localCertificatePromise?: Promise<RTCCertificate>;
27
27
  private remoteParameters?;
28
- constructor(config: PeerConfig, iceTransport: RTCIceTransport, router: RtpRouter, certificates: RTCCertificate[], srtpProfiles?: Profile[]);
28
+ constructor(config: PeerConfig, iceTransport: RTCIceTransport, router: RtpRouter, localCertificate?: RTCCertificate | undefined, srtpProfiles?: Profile[]);
29
29
  get localParameters(): RTCDtlsParameters;
30
- setupCertificate(): Promise<RTCCertificate>;
30
+ static SetupCertificate(): Promise<RTCCertificate>;
31
31
  setRemoteParams(remoteParameters: RTCDtlsParameters): void;
32
32
  start(): Promise<void>;
33
33
  updateSrtpSession(): void;
@@ -17,7 +17,7 @@ const const_2 = require("../../../rtp/src/srtp/const");
17
17
  const utils_1 = require("../utils");
18
18
  const log = (0, debug_1.default)("werift:packages/webrtc/src/transport/dtls.ts");
19
19
  class RTCDtlsTransport {
20
- constructor(config, iceTransport, router, certificates, srtpProfiles = []) {
20
+ constructor(config, iceTransport, router, localCertificate, srtpProfiles = []) {
21
21
  Object.defineProperty(this, "config", {
22
22
  enumerable: true,
23
23
  configurable: true,
@@ -36,11 +36,11 @@ class RTCDtlsTransport {
36
36
  writable: true,
37
37
  value: router
38
38
  });
39
- Object.defineProperty(this, "certificates", {
39
+ Object.defineProperty(this, "localCertificate", {
40
40
  enumerable: true,
41
41
  configurable: true,
42
42
  writable: true,
43
- value: certificates
43
+ value: localCertificate
44
44
  });
45
45
  Object.defineProperty(this, "srtpProfiles", {
46
46
  enumerable: true,
@@ -108,18 +108,6 @@ class RTCDtlsTransport {
108
108
  writable: true,
109
109
  value: new common_1.Event()
110
110
  });
111
- Object.defineProperty(this, "localCertificate", {
112
- enumerable: true,
113
- configurable: true,
114
- writable: true,
115
- value: void 0
116
- });
117
- Object.defineProperty(this, "localCertificatePromise", {
118
- enumerable: true,
119
- configurable: true,
120
- writable: true,
121
- value: void 0
122
- });
123
111
  Object.defineProperty(this, "remoteParameters", {
124
112
  enumerable: true,
125
113
  configurable: true,
@@ -141,12 +129,12 @@ class RTCDtlsTransport {
141
129
  await this.dtls.send(data);
142
130
  }
143
131
  });
144
- this.localCertificate = this.certificates[0];
132
+ this.localCertificate ?? (this.localCertificate = RTCDtlsTransport.localCertificate);
145
133
  }
146
134
  get localParameters() {
147
135
  return new RTCDtlsParameters(this.localCertificate ? this.localCertificate.getFingerprints() : [], this.role);
148
136
  }
149
- async setupCertificate() {
137
+ static async SetupCertificate() {
150
138
  if (this.localCertificate) {
151
139
  return this.localCertificate;
152
140
  }
@@ -427,8 +415,9 @@ class IceTransport {
427
415
  });
428
416
  ice.onData.subscribe((buf) => {
429
417
  if ((0, utils_1.isDtls)(buf)) {
430
- if (this.onData)
418
+ if (this.onData) {
431
419
  this.onData(buf);
420
+ }
432
421
  }
433
422
  });
434
423
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dtls.js","sourceRoot":"","sources":["../../../../src/transport/dtls.ts"],"names":[],"mappings":"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","sourcesContent":["import { Certificate, PrivateKey } from \"@fidm/x509\";\nimport debug from \"debug\";\nimport { setTimeout } from \"timers/promises\";\nimport { v4 } from \"uuid\";\nimport { Event } from \"../imports/common\";\n\nimport {\n DtlsClient,\n DtlsServer,\n type DtlsSocket,\n type Transport,\n} from \"../../../dtls/src\";\nimport {\n HashAlgorithm,\n NamedCurveAlgorithm,\n SignatureAlgorithm,\n type SignatureHash,\n} from \"../../../dtls/src/cipher/const\";\nimport { CipherContext } from \"../../../dtls/src/context/cipher\";\nimport type { Profile } from \"../../../dtls/src/context/srtp\";\nimport type { Connection } from \"../../../ice/src\";\nimport {\n type RtcpPacket,\n RtcpPacketConverter,\n type RtpHeader,\n RtpPacket,\n SrtcpSession,\n SrtpSession,\n isMedia,\n isRtcp,\n} from \"../../../rtp/src\";\nimport { keyLength, saltLength } from \"../../../rtp/src/srtp/const\";\nimport type { RtpRouter } from \"../media/router\";\nimport type { PeerConfig } from \"../peerConnection\";\nimport { fingerprint, isDtls } from \"../utils\";\nimport type { RTCIceTransport } from \"./ice\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/dtls.ts\");\n\nexport class RTCDtlsTransport {\n id = v4();\n state: DtlsState = \"new\";\n role: DtlsRole = \"auto\";\n srtpStarted = false;\n transportSequenceNumber = 0;\n\n dataReceiver: (buf: Buffer) => void = () => {};\n dtls?: DtlsSocket;\n srtp!: SrtpSession;\n srtcp!: SrtcpSession;\n\n readonly onStateChange = new Event<[DtlsState]>();\n\n localCertificate?: RTCCertificate;\n localCertificatePromise?: Promise<RTCCertificate>;\n private remoteParameters?: RTCDtlsParameters;\n\n constructor(\n readonly config: PeerConfig,\n readonly iceTransport: RTCIceTransport,\n readonly router: RtpRouter,\n readonly certificates: RTCCertificate[],\n private readonly srtpProfiles: Profile[] = [],\n ) {\n this.localCertificate = this.certificates[0];\n }\n\n get localParameters() {\n return new RTCDtlsParameters(\n this.localCertificate ? this.localCertificate.getFingerprints() : [],\n this.role,\n );\n }\n\n async setupCertificate() {\n if (this.localCertificate) {\n return this.localCertificate;\n }\n\n if (this.localCertificatePromise) {\n return this.localCertificatePromise;\n }\n\n this.localCertificatePromise = (async () => {\n const { certPem, keyPem, signatureHash } =\n await CipherContext.createSelfSignedCertificateWithKey(\n {\n signature: SignatureAlgorithm.ecdsa_3,\n hash: HashAlgorithm.sha256_4,\n },\n NamedCurveAlgorithm.secp256r1_23,\n );\n this.localCertificate = new RTCCertificate(\n keyPem,\n certPem,\n signatureHash,\n );\n return this.localCertificate;\n })();\n\n return this.localCertificatePromise;\n }\n\n setRemoteParams(remoteParameters: RTCDtlsParameters) {\n this.remoteParameters = remoteParameters;\n }\n\n async start() {\n if (this.state !== \"new\") {\n throw new Error(\"state must be new\");\n }\n if (this.remoteParameters?.fingerprints.length === 0) {\n throw new Error(\"remote fingerprint not exist\");\n }\n\n if (this.role === \"auto\") {\n if (this.iceTransport.role === \"controlling\") {\n this.role = \"server\";\n } else {\n this.role = \"client\";\n }\n }\n\n this.setState(\"connecting\");\n\n await new Promise<void>(async (r, f) => {\n if (this.role === \"server\") {\n this.dtls = new DtlsServer({\n cert: this.localCertificate?.certPem,\n key: this.localCertificate?.privateKey,\n signatureHash: this.localCertificate?.signatureHash,\n transport: createIceTransport(this.iceTransport.connection),\n srtpProfiles: this.srtpProfiles,\n extendedMasterSecret: true,\n // certificateRequest: true,\n });\n } else {\n this.dtls = new DtlsClient({\n cert: this.localCertificate?.certPem,\n key: this.localCertificate?.privateKey,\n signatureHash: this.localCertificate?.signatureHash,\n transport: createIceTransport(this.iceTransport.connection),\n srtpProfiles: this.srtpProfiles,\n extendedMasterSecret: true,\n });\n }\n this.dtls.onData.subscribe((buf) => {\n if (\n this.config.debug.inboundPacketLoss &&\n this.config.debug.inboundPacketLoss / 100 < Math.random()\n ) {\n return;\n }\n this.dataReceiver(buf);\n });\n this.dtls.onClose.subscribe(() => {\n this.setState(\"closed\");\n });\n this.dtls.onConnect.once(r);\n this.dtls.onError.once((error) => {\n this.setState(\"failed\");\n log(\"dtls failed\", error);\n f(error);\n });\n\n if (this.dtls instanceof DtlsClient) {\n await setTimeout(100);\n this.dtls.connect().catch((error) => {\n this.setState(\"failed\");\n log(\"dtls connect failed\", error);\n f(error);\n });\n }\n });\n\n if (this.srtpProfiles.length > 0) {\n this.startSrtp();\n }\n this.dtls!.onConnect.subscribe(() => {\n this.updateSrtpSession();\n this.setState(\"connected\");\n });\n this.setState(\"connected\");\n\n log(\"dtls connected\");\n }\n\n updateSrtpSession() {\n if (!this.dtls) throw new Error();\n\n const profile = this.dtls.srtp.srtpProfile;\n if (!profile) {\n throw new Error(\"need srtpProfile\");\n }\n log(\"selected SRTP Profile\", profile);\n\n const { localKey, localSalt, remoteKey, remoteSalt } =\n this.dtls.extractSessionKeys(keyLength(profile), saltLength(profile));\n\n const config = {\n keys: {\n localMasterKey: localKey,\n localMasterSalt: localSalt,\n remoteMasterKey: remoteKey,\n remoteMasterSalt: remoteSalt,\n },\n profile,\n };\n this.srtp = new SrtpSession(config);\n this.srtcp = new SrtcpSession(config);\n }\n\n startSrtp() {\n if (this.srtpStarted) return;\n this.srtpStarted = true;\n\n this.updateSrtpSession();\n\n this.iceTransport.connection.onData.subscribe((data) => {\n if (\n this.config.debug.inboundPacketLoss &&\n this.config.debug.inboundPacketLoss / 100 < Math.random()\n ) {\n return;\n }\n\n if (!isMedia(data)) return;\n if (isRtcp(data)) {\n const dec = this.srtcp.decrypt(data);\n const rtcps = RtcpPacketConverter.deSerialize(dec);\n rtcps.forEach((rtcp) => this.router.routeRtcp(rtcp));\n } else {\n const dec = this.srtp.decrypt(data);\n const rtp = RtpPacket.deSerialize(dec);\n try {\n this.router.routeRtp(rtp);\n } catch (error) {\n log(\"router error\", error);\n }\n }\n });\n }\n\n readonly sendData = async (data: Buffer) => {\n if (\n this.config.debug.outboundPacketLoss &&\n this.config.debug.outboundPacketLoss / 100 < Math.random()\n ) {\n return;\n }\n\n if (!this.dtls) {\n throw new Error(\"dtls not established\");\n }\n await this.dtls.send(data);\n };\n\n async sendRtp(payload: Buffer, header: RtpHeader): Promise<number> {\n try {\n const enc = this.srtp.encrypt(payload, header);\n\n if (\n this.config.debug.outboundPacketLoss &&\n this.config.debug.outboundPacketLoss / 100 < Math.random()\n ) {\n return enc.length;\n }\n\n await this.iceTransport.connection.send(enc).catch(() => {});\n return enc.length;\n } catch (error) {\n log(\"failed to send\", error);\n return 0;\n }\n }\n\n async sendRtcp(packets: RtcpPacket[]) {\n const payload = Buffer.concat(packets.map((packet) => packet.serialize()));\n const enc = this.srtcp.encrypt(payload);\n\n if (\n this.config.debug.outboundPacketLoss &&\n this.config.debug.outboundPacketLoss / 100 < Math.random()\n ) {\n return enc.length;\n }\n\n await this.iceTransport.connection.send(enc).catch(() => {});\n }\n\n private setState(state: DtlsState) {\n if (state != this.state) {\n this.state = state;\n this.onStateChange.execute(state);\n }\n }\n\n async stop() {\n this.setState(\"closed\");\n // todo impl send alert\n }\n}\n\nexport const DtlsStates = [\n \"new\",\n \"connecting\",\n \"connected\",\n \"closed\",\n \"failed\",\n] as const;\nexport type DtlsState = (typeof DtlsStates)[number];\n\nexport type DtlsRole = \"auto\" | \"server\" | \"client\";\n\nexport class RTCCertificate {\n publicKey: string;\n privateKey: string;\n\n constructor(\n privateKeyPem: string,\n public certPem: string,\n public signatureHash: SignatureHash,\n ) {\n const cert = Certificate.fromPEM(Buffer.from(certPem));\n this.publicKey = cert.publicKey.toPEM();\n this.privateKey = PrivateKey.fromPEM(Buffer.from(privateKeyPem)).toPEM();\n }\n\n getFingerprints(): RTCDtlsFingerprint[] {\n return [\n new RTCDtlsFingerprint(\n \"sha-256\",\n fingerprint(\n Certificate.fromPEM(Buffer.from(this.certPem)).raw,\n \"sha256\",\n ),\n ),\n ];\n }\n}\n\nexport type DtlsKeys = {\n certPem: string;\n keyPem: string;\n signatureHash: SignatureHash;\n};\n\nexport class RTCDtlsFingerprint {\n constructor(\n public algorithm: string,\n public value: string,\n ) {}\n}\n\nexport class RTCDtlsParameters {\n constructor(\n public fingerprints: RTCDtlsFingerprint[] = [],\n public role: \"auto\" | \"client\" | \"server\",\n ) {}\n}\n\nclass IceTransport implements Transport {\n constructor(private ice: Connection) {\n ice.onData.subscribe((buf) => {\n if (isDtls(buf)) {\n if (this.onData) this.onData(buf);\n }\n });\n }\n onData?: (buf: Buffer) => void;\n\n readonly send = (data: Buffer) => {\n return this.ice.send(data);\n };\n\n close() {\n this.ice.close();\n }\n}\n\nconst createIceTransport = (ice: Connection) => new IceTransport(ice);\n"]}
1
+ {"version":3,"file":"dtls.js","sourceRoot":"","sources":["../../../../src/transport/dtls.ts"],"names":[],"mappings":"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","sourcesContent":["import { Certificate, PrivateKey } from \"@fidm/x509\";\nimport debug from \"debug\";\nimport { setTimeout } from \"timers/promises\";\nimport { v4 } from \"uuid\";\nimport { Event } from \"../imports/common\";\n\nimport {\n DtlsClient,\n DtlsServer,\n type DtlsSocket,\n type Transport,\n} from \"../../../dtls/src\";\nimport {\n HashAlgorithm,\n NamedCurveAlgorithm,\n SignatureAlgorithm,\n type SignatureHash,\n} from \"../../../dtls/src/cipher/const\";\nimport { CipherContext } from \"../../../dtls/src/context/cipher\";\nimport type { Profile } from \"../../../dtls/src/context/srtp\";\nimport type { IceConnection } from \"../../../ice/src\";\nimport {\n type RtcpPacket,\n RtcpPacketConverter,\n type RtpHeader,\n RtpPacket,\n SrtcpSession,\n SrtpSession,\n isMedia,\n isRtcp,\n} from \"../../../rtp/src\";\nimport { keyLength, saltLength } from \"../../../rtp/src/srtp/const\";\nimport type { RtpRouter } from \"../media/router\";\nimport type { PeerConfig } from \"../peerConnection\";\nimport { fingerprint, isDtls } from \"../utils\";\nimport type { RTCIceTransport } from \"./ice\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/dtls.ts\");\n\nexport class RTCDtlsTransport {\n id = v4();\n state: DtlsState = \"new\";\n role: DtlsRole = \"auto\";\n srtpStarted = false;\n transportSequenceNumber = 0;\n\n dataReceiver: (buf: Buffer) => void = () => {};\n dtls?: DtlsSocket;\n srtp!: SrtpSession;\n srtcp!: SrtcpSession;\n\n readonly onStateChange = new Event<[DtlsState]>();\n\n static localCertificate?: RTCCertificate;\n static localCertificatePromise?: Promise<RTCCertificate>;\n private remoteParameters?: RTCDtlsParameters;\n\n constructor(\n readonly config: PeerConfig,\n readonly iceTransport: RTCIceTransport,\n readonly router: RtpRouter,\n public localCertificate?: RTCCertificate,\n private readonly srtpProfiles: Profile[] = [],\n ) {\n this.localCertificate ??= RTCDtlsTransport.localCertificate;\n }\n\n get localParameters() {\n return new RTCDtlsParameters(\n this.localCertificate ? this.localCertificate.getFingerprints() : [],\n this.role,\n );\n }\n\n static async SetupCertificate() {\n if (this.localCertificate) {\n return this.localCertificate;\n }\n\n if (this.localCertificatePromise) {\n return this.localCertificatePromise;\n }\n\n this.localCertificatePromise = (async () => {\n const { certPem, keyPem, signatureHash } =\n await CipherContext.createSelfSignedCertificateWithKey(\n {\n signature: SignatureAlgorithm.ecdsa_3,\n hash: HashAlgorithm.sha256_4,\n },\n NamedCurveAlgorithm.secp256r1_23,\n );\n this.localCertificate = new RTCCertificate(\n keyPem,\n certPem,\n signatureHash,\n );\n return this.localCertificate;\n })();\n\n return this.localCertificatePromise;\n }\n\n setRemoteParams(remoteParameters: RTCDtlsParameters) {\n this.remoteParameters = remoteParameters;\n }\n\n async start() {\n if (this.state !== \"new\") {\n throw new Error(\"state must be new\");\n }\n if (this.remoteParameters?.fingerprints.length === 0) {\n throw new Error(\"remote fingerprint not exist\");\n }\n\n if (this.role === \"auto\") {\n if (this.iceTransport.role === \"controlling\") {\n this.role = \"server\";\n } else {\n this.role = \"client\";\n }\n }\n\n this.setState(\"connecting\");\n\n await new Promise<void>(async (r, f) => {\n if (this.role === \"server\") {\n this.dtls = new DtlsServer({\n cert: this.localCertificate?.certPem,\n key: this.localCertificate?.privateKey,\n signatureHash: this.localCertificate?.signatureHash,\n transport: createIceTransport(this.iceTransport.connection),\n srtpProfiles: this.srtpProfiles,\n extendedMasterSecret: true,\n // certificateRequest: true,\n });\n } else {\n this.dtls = new DtlsClient({\n cert: this.localCertificate?.certPem,\n key: this.localCertificate?.privateKey,\n signatureHash: this.localCertificate?.signatureHash,\n transport: createIceTransport(this.iceTransport.connection),\n srtpProfiles: this.srtpProfiles,\n extendedMasterSecret: true,\n });\n }\n this.dtls.onData.subscribe((buf) => {\n if (\n this.config.debug.inboundPacketLoss &&\n this.config.debug.inboundPacketLoss / 100 < Math.random()\n ) {\n return;\n }\n this.dataReceiver(buf);\n });\n this.dtls.onClose.subscribe(() => {\n this.setState(\"closed\");\n });\n this.dtls.onConnect.once(r);\n this.dtls.onError.once((error) => {\n this.setState(\"failed\");\n log(\"dtls failed\", error);\n f(error);\n });\n\n if (this.dtls instanceof DtlsClient) {\n await setTimeout(100);\n this.dtls.connect().catch((error) => {\n this.setState(\"failed\");\n log(\"dtls connect failed\", error);\n f(error);\n });\n }\n });\n\n if (this.srtpProfiles.length > 0) {\n this.startSrtp();\n }\n this.dtls!.onConnect.subscribe(() => {\n this.updateSrtpSession();\n this.setState(\"connected\");\n });\n this.setState(\"connected\");\n\n log(\"dtls connected\");\n }\n\n updateSrtpSession() {\n if (!this.dtls) throw new Error();\n\n const profile = this.dtls.srtp.srtpProfile;\n if (!profile) {\n throw new Error(\"need srtpProfile\");\n }\n log(\"selected SRTP Profile\", profile);\n\n const { localKey, localSalt, remoteKey, remoteSalt } =\n this.dtls.extractSessionKeys(keyLength(profile), saltLength(profile));\n\n const config = {\n keys: {\n localMasterKey: localKey,\n localMasterSalt: localSalt,\n remoteMasterKey: remoteKey,\n remoteMasterSalt: remoteSalt,\n },\n profile,\n };\n this.srtp = new SrtpSession(config);\n this.srtcp = new SrtcpSession(config);\n }\n\n startSrtp() {\n if (this.srtpStarted) return;\n this.srtpStarted = true;\n\n this.updateSrtpSession();\n\n this.iceTransport.connection.onData.subscribe((data) => {\n if (\n this.config.debug.inboundPacketLoss &&\n this.config.debug.inboundPacketLoss / 100 < Math.random()\n ) {\n return;\n }\n\n if (!isMedia(data)) return;\n if (isRtcp(data)) {\n const dec = this.srtcp.decrypt(data);\n const rtcps = RtcpPacketConverter.deSerialize(dec);\n rtcps.forEach((rtcp) => this.router.routeRtcp(rtcp));\n } else {\n const dec = this.srtp.decrypt(data);\n const rtp = RtpPacket.deSerialize(dec);\n try {\n this.router.routeRtp(rtp);\n } catch (error) {\n log(\"router error\", error);\n }\n }\n });\n }\n\n readonly sendData = async (data: Buffer) => {\n if (\n this.config.debug.outboundPacketLoss &&\n this.config.debug.outboundPacketLoss / 100 < Math.random()\n ) {\n return;\n }\n\n if (!this.dtls) {\n throw new Error(\"dtls not established\");\n }\n await this.dtls.send(data);\n };\n\n async sendRtp(payload: Buffer, header: RtpHeader): Promise<number> {\n try {\n const enc = this.srtp.encrypt(payload, header);\n\n if (\n this.config.debug.outboundPacketLoss &&\n this.config.debug.outboundPacketLoss / 100 < Math.random()\n ) {\n return enc.length;\n }\n\n await this.iceTransport.connection.send(enc).catch(() => {});\n return enc.length;\n } catch (error) {\n log(\"failed to send\", error);\n return 0;\n }\n }\n\n async sendRtcp(packets: RtcpPacket[]) {\n const payload = Buffer.concat(packets.map((packet) => packet.serialize()));\n const enc = this.srtcp.encrypt(payload);\n\n if (\n this.config.debug.outboundPacketLoss &&\n this.config.debug.outboundPacketLoss / 100 < Math.random()\n ) {\n return enc.length;\n }\n\n await this.iceTransport.connection.send(enc).catch(() => {});\n }\n\n private setState(state: DtlsState) {\n if (state != this.state) {\n this.state = state;\n this.onStateChange.execute(state);\n }\n }\n\n async stop() {\n this.setState(\"closed\");\n // todo impl send alert\n }\n}\n\nexport const DtlsStates = [\n \"new\",\n \"connecting\",\n \"connected\",\n \"closed\",\n \"failed\",\n] as const;\nexport type DtlsState = (typeof DtlsStates)[number];\n\nexport type DtlsRole = \"auto\" | \"server\" | \"client\";\n\nexport class RTCCertificate {\n publicKey: string;\n privateKey: string;\n\n constructor(\n privateKeyPem: string,\n public certPem: string,\n public signatureHash: SignatureHash,\n ) {\n const cert = Certificate.fromPEM(Buffer.from(certPem));\n this.publicKey = cert.publicKey.toPEM();\n this.privateKey = PrivateKey.fromPEM(Buffer.from(privateKeyPem)).toPEM();\n }\n\n getFingerprints(): RTCDtlsFingerprint[] {\n return [\n new RTCDtlsFingerprint(\n \"sha-256\",\n fingerprint(\n Certificate.fromPEM(Buffer.from(this.certPem)).raw,\n \"sha256\",\n ),\n ),\n ];\n }\n}\n\nexport type DtlsKeys = {\n certPem: string;\n keyPem: string;\n signatureHash: SignatureHash;\n};\n\nexport class RTCDtlsFingerprint {\n constructor(\n public algorithm: string,\n public value: string,\n ) {}\n}\n\nexport class RTCDtlsParameters {\n constructor(\n public fingerprints: RTCDtlsFingerprint[] = [],\n public role: \"auto\" | \"client\" | \"server\",\n ) {}\n}\n\nclass IceTransport implements Transport {\n constructor(private ice: IceConnection) {\n ice.onData.subscribe((buf) => {\n if (isDtls(buf)) {\n if (this.onData) {\n this.onData(buf);\n }\n }\n });\n }\n onData?: (buf: Buffer) => void;\n\n readonly send = (data: Buffer) => {\n return this.ice.send(data);\n };\n\n close() {\n this.ice.close();\n }\n}\n\nconst createIceTransport = (ice: IceConnection) => new IceTransport(ice);\n"]}
@@ -1,18 +1,25 @@
1
1
  import { Event } from "../imports/common";
2
- import { Candidate, Connection, type IceOptions } from "../../../ice/src";
2
+ import { Candidate, type IceConnection, type IceOptions } from "../../../ice/src";
3
3
  export declare class RTCIceTransport {
4
- private gather;
4
+ private iceGather;
5
5
  readonly id: string;
6
- connection: Connection;
6
+ connection: IceConnection;
7
7
  state: RTCIceConnectionState;
8
- readonly onStateChange: Event<["disconnected" | "closed" | "completed" | "new" | "connected" | "failed" | "checking"]>;
9
8
  private waitStart?;
10
- constructor(gather: RTCIceGatherer);
11
- get iceGather(): RTCIceGatherer;
9
+ private renominating;
10
+ readonly onStateChange: Event<["disconnected" | "closed" | "completed" | "new" | "connected" | "failed" | "checking"]>;
11
+ readonly onIceCandidate: Event<[IceCandidate | undefined]>;
12
+ readonly onNegotiationNeeded: Event<[]>;
13
+ constructor(iceGather: RTCIceGatherer);
12
14
  get role(): "controlling" | "controlled";
15
+ get gatheringState(): "complete" | "new" | "gathering";
16
+ get localCandidates(): IceCandidate[];
17
+ get localParameters(): RTCIceParameters;
13
18
  private setState;
19
+ gather(): Promise<void>;
14
20
  addRemoteCandidate: (candidate?: IceCandidate) => Promise<void> | undefined;
15
- setRemoteParams(remoteParameters: RTCIceParameters): void;
21
+ setRemoteParams(remoteParameters: RTCIceParameters, renomination?: boolean): void;
22
+ restart(): void;
16
23
  start(): Promise<void>;
17
24
  stop(): Promise<void>;
18
25
  }
@@ -24,8 +31,8 @@ export declare class RTCIceGatherer {
24
31
  private options;
25
32
  onIceCandidate: (candidate: IceCandidate | undefined) => void;
26
33
  gatheringState: IceGathererState;
34
+ readonly connection: IceConnection;
27
35
  readonly onGatheringStateChange: Event<["complete" | "new" | "gathering"]>;
28
- readonly connection: Connection;
29
36
  constructor(options?: Partial<IceOptions>);
30
37
  gather(): Promise<void>;
31
38
  get localCandidates(): IceCandidate[];
@@ -38,12 +45,14 @@ export declare class RTCIceCandidate {
38
45
  candidate: string;
39
46
  sdpMid?: string;
40
47
  sdpMLineIndex?: number;
48
+ usernameFragment?: string;
41
49
  constructor(props: Partial<RTCIceCandidate>);
42
50
  static isThis(o: any): true | undefined;
43
51
  toJSON(): {
44
52
  candidate: string;
45
53
  sdpMid: string | undefined;
46
54
  sdpMLineIndex: number | undefined;
55
+ usernameFragment: string | undefined;
47
56
  };
48
57
  }
49
58
  export declare class IceCandidate {
@@ -54,12 +63,14 @@ export declare class IceCandidate {
54
63
  priority: number;
55
64
  protocol: string;
56
65
  type: string;
66
+ generation?: number | undefined;
67
+ ufrag?: string | undefined;
57
68
  relatedAddress?: string;
58
69
  relatedPort?: number;
59
70
  sdpMid?: string;
60
71
  sdpMLineIndex?: number;
61
72
  tcpType?: string;
62
- constructor(component: number, foundation: string, ip: string, port: number, priority: number, protocol: string, type: string);
73
+ constructor(component: number, foundation: string, ip: string, port: number, priority: number, protocol: string, type: string, generation?: number | undefined, ufrag?: string | undefined);
63
74
  toJSON(): RTCIceCandidate;
64
75
  static fromJSON(data: RTCIceCandidate): IceCandidate | undefined;
65
76
  }