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
@@ -108,9 +108,6 @@ class Event {
108
108
  configurable: true,
109
109
  writable: true,
110
110
  value: (execute, complete, error) => {
111
- if (this.ended) {
112
- throw new Error("event completed");
113
- }
114
111
  const id = this.event.eventId;
115
112
  this.event.stack.push({ execute, id, complete, error });
116
113
  this.event.eventId++;
@@ -1 +1 @@
1
- {"version":3,"file":"event.js","sourceRoot":"","sources":["../../../../common/src/event.ts"],"names":[],"mappings":"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","sourcesContent":["type EventExecute<T extends any[]> = (...args: T) => void;\ntype PromiseEventExecute<T extends any[]> = (...args: T) => Promise<void>;\ntype EventComplete = () => void;\ntype EventError = (e: any) => void;\ntype IEvent<T extends any[]> = {\n stack: {\n execute: EventExecute<T>;\n complete?: EventComplete;\n error?: EventError;\n id: number;\n }[];\n promiseStack: {\n execute: PromiseEventExecute<T>;\n complete?: EventComplete;\n error?: EventError;\n id: number;\n }[];\n eventId: number;\n};\n\nexport class Event<T extends any[]> {\n private event: IEvent<T> = {\n stack: [],\n promiseStack: [],\n eventId: 0,\n };\n ended = false;\n onended?: () => void;\n onerror = (e: any) => {};\n\n execute = (...args: T) => {\n if (this.ended) {\n return;\n }\n\n for (const item of this.event.stack) {\n item.execute(...args);\n }\n\n (async () => {\n for (const item of this.event.promiseStack) {\n await item.execute(...args);\n }\n })().catch((e) => {\n this.onerror(e);\n });\n };\n\n complete = () => {\n if (this.ended) {\n return;\n }\n\n for (const item of this.event.stack) {\n if (item.complete) {\n item.complete();\n }\n }\n this.allUnsubscribe();\n this.ended = true;\n if (this.onended) {\n this.onended();\n this.onended = undefined;\n }\n };\n\n error = (e: any) => {\n if (this.ended) {\n return;\n }\n\n for (const item of this.event.stack) {\n if (item.error) {\n item.error(e);\n }\n }\n this.allUnsubscribe();\n };\n\n allUnsubscribe = () => {\n if (this.ended) {\n throw new Error(\"event completed\");\n }\n\n this.event = {\n stack: [],\n promiseStack: [],\n eventId: 0,\n };\n };\n\n subscribe = (\n execute: EventExecute<T>,\n complete?: EventComplete,\n error?: EventError,\n ) => {\n if (this.ended) {\n throw new Error(\"event completed\");\n }\n\n const id = this.event.eventId;\n this.event.stack.push({ execute, id, complete, error });\n this.event.eventId++;\n\n const unSubscribe = () => {\n this.event.stack = this.event.stack.filter(\n (item) => item.id !== id && item,\n );\n };\n\n const disposer = (disposer: EventDisposer) => {\n disposer.push(unSubscribe);\n };\n\n return { unSubscribe, disposer };\n };\n\n queuingSubscribe = (\n execute: PromiseEventExecute<T>,\n complete?: EventComplete,\n error?: EventError,\n ) => {\n if (this.ended) throw new Error(\"event completed\");\n\n const id = this.event.eventId;\n this.event.promiseStack.push({ execute, id, complete, error });\n this.event.eventId++;\n\n const unSubscribe = () => {\n this.event.stack = this.event.stack.filter(\n (item) => item.id !== id && item,\n );\n };\n\n const disposer = (disposer: EventDisposer) => {\n disposer.push(unSubscribe);\n };\n\n return { unSubscribe, disposer };\n };\n\n once = (\n execute: EventExecute<T>,\n complete?: EventComplete,\n error?: EventError,\n ) => {\n const off = this.subscribe(\n (...args) => {\n off.unSubscribe();\n execute(...args);\n },\n complete,\n error,\n );\n };\n\n watch = (cb: (...args: T) => boolean, timeLimit?: number) =>\n new Promise<T>((resolve, reject) => {\n const timeout =\n timeLimit &&\n setTimeout(() => {\n reject(\"Event watch timeout\");\n }, timeLimit);\n\n const { unSubscribe } = this.subscribe((...args) => {\n const done = cb(...args);\n if (done) {\n if (timeout) clearTimeout(timeout);\n unSubscribe();\n resolve(args);\n }\n });\n });\n\n asPromise = (timeLimit?: number) =>\n new Promise<T>((resolve, reject) => {\n const timeout =\n timeLimit &&\n setTimeout(() => {\n reject(\"Event asPromise timeout\");\n }, timeLimit);\n\n this.once(\n (...args) => {\n if (timeout) clearTimeout(timeout);\n resolve(args);\n },\n () => {\n if (timeout) clearTimeout(timeout);\n resolve([] as any);\n },\n (err) => {\n if (timeout) clearTimeout(timeout);\n reject(err);\n },\n );\n });\n\n get returnTrigger() {\n const { execute, error, complete } = this;\n return { execute, error, complete };\n }\n\n get returnListener() {\n const { subscribe, once, asPromise } = this;\n return { subscribe, once, asPromise };\n }\n\n get length() {\n return this.event.stack.length;\n }\n}\n\nexport class EventDisposer {\n private _disposer: (() => void)[] = [];\n\n push(disposer: () => void) {\n this._disposer.push(disposer);\n }\n\n dispose() {\n this._disposer.forEach((d) => d());\n this._disposer = [];\n }\n}\n"]}
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../../../common/src/event.ts"],"names":[],"mappings":"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","sourcesContent":["type EventExecute<T extends any[]> = (...args: T) => void;\ntype PromiseEventExecute<T extends any[]> = (...args: T) => Promise<void>;\ntype EventComplete = () => void;\ntype EventError = (e: any) => void;\ntype IEvent<T extends any[]> = {\n stack: {\n execute: EventExecute<T>;\n complete?: EventComplete;\n error?: EventError;\n id: number;\n }[];\n promiseStack: {\n execute: PromiseEventExecute<T>;\n complete?: EventComplete;\n error?: EventError;\n id: number;\n }[];\n eventId: number;\n};\n\nexport class Event<T extends any[]> {\n private event: IEvent<T> = {\n stack: [],\n promiseStack: [],\n eventId: 0,\n };\n ended = false;\n onended?: () => void;\n onerror = (e: any) => {};\n\n execute = (...args: T) => {\n if (this.ended) {\n return;\n }\n\n for (const item of this.event.stack) {\n item.execute(...args);\n }\n\n (async () => {\n for (const item of this.event.promiseStack) {\n await item.execute(...args);\n }\n })().catch((e) => {\n this.onerror(e);\n });\n };\n\n complete = () => {\n if (this.ended) {\n return;\n }\n\n for (const item of this.event.stack) {\n if (item.complete) {\n item.complete();\n }\n }\n this.allUnsubscribe();\n this.ended = true;\n if (this.onended) {\n this.onended();\n this.onended = undefined;\n }\n };\n\n error = (e: any) => {\n if (this.ended) {\n return;\n }\n\n for (const item of this.event.stack) {\n if (item.error) {\n item.error(e);\n }\n }\n this.allUnsubscribe();\n };\n\n allUnsubscribe = () => {\n if (this.ended) {\n throw new Error(\"event completed\");\n }\n\n this.event = {\n stack: [],\n promiseStack: [],\n eventId: 0,\n };\n };\n\n subscribe = (\n execute: EventExecute<T>,\n complete?: EventComplete,\n error?: EventError,\n ) => {\n const id = this.event.eventId;\n this.event.stack.push({ execute, id, complete, error });\n this.event.eventId++;\n\n const unSubscribe = () => {\n this.event.stack = this.event.stack.filter(\n (item) => item.id !== id && item,\n );\n };\n\n const disposer = (disposer: EventDisposer) => {\n disposer.push(unSubscribe);\n };\n\n return { unSubscribe, disposer };\n };\n\n queuingSubscribe = (\n execute: PromiseEventExecute<T>,\n complete?: EventComplete,\n error?: EventError,\n ) => {\n if (this.ended) throw new Error(\"event completed\");\n\n const id = this.event.eventId;\n this.event.promiseStack.push({ execute, id, complete, error });\n this.event.eventId++;\n\n const unSubscribe = () => {\n this.event.stack = this.event.stack.filter(\n (item) => item.id !== id && item,\n );\n };\n\n const disposer = (disposer: EventDisposer) => {\n disposer.push(unSubscribe);\n };\n\n return { unSubscribe, disposer };\n };\n\n once = (\n execute: EventExecute<T>,\n complete?: EventComplete,\n error?: EventError,\n ) => {\n const off = this.subscribe(\n (...args) => {\n off.unSubscribe();\n execute(...args);\n },\n complete,\n error,\n );\n };\n\n watch = (cb: (...args: T) => boolean, timeLimit?: number) =>\n new Promise<T>((resolve, reject) => {\n const timeout =\n timeLimit &&\n setTimeout(() => {\n reject(\"Event watch timeout\");\n }, timeLimit);\n\n const { unSubscribe } = this.subscribe((...args) => {\n const done = cb(...args);\n if (done) {\n if (timeout) clearTimeout(timeout);\n unSubscribe();\n resolve(args);\n }\n });\n });\n\n asPromise = (timeLimit?: number) =>\n new Promise<T>((resolve, reject) => {\n const timeout =\n timeLimit &&\n setTimeout(() => {\n reject(\"Event asPromise timeout\");\n }, timeLimit);\n\n this.once(\n (...args) => {\n if (timeout) clearTimeout(timeout);\n resolve(args);\n },\n () => {\n if (timeout) clearTimeout(timeout);\n resolve([] as any);\n },\n (err) => {\n if (timeout) clearTimeout(timeout);\n reject(err);\n },\n );\n });\n\n get returnTrigger() {\n const { execute, error, complete } = this;\n return { execute, error, complete };\n }\n\n get returnListener() {\n const { subscribe, once, asPromise } = this;\n return { subscribe, once, asPromise };\n }\n\n get length() {\n return this.event.stack.length;\n }\n}\n\nexport class EventDisposer {\n private _disposer: (() => void)[] = [];\n\n push(disposer: () => void) {\n this._disposer.push(disposer);\n }\n\n dispose() {\n this._disposer.forEach((d) => d());\n this._disposer = [];\n }\n}\n"]}
@@ -78,9 +78,11 @@ const flight2 = (udp, dtls, cipher, srtp) => (clientHello) => {
78
78
  dtls.remoteExtendedMasterSecret = true;
79
79
  }
80
80
  break;
81
- case renegotiationIndication_1.RenegotiationIndication.type: {
82
- log(dtls.sessionId, "RenegotiationIndication", extension.data);
83
- }
81
+ case renegotiationIndication_1.RenegotiationIndication.type:
82
+ {
83
+ log(dtls.sessionId, "RenegotiationIndication", extension.data);
84
+ }
85
+ break;
84
86
  case 43:
85
87
  {
86
88
  // todo dtls1.3
@@ -1 +1 @@
1
- {"version":3,"file":"flight2.js","sourceRoot":"","sources":["../../../../../../dtls/src/flight/server/flight2.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport debug from \"debug\";\n\nimport {\n CipherSuite,\n NamedCurveAlgorithmList,\n type NamedCurveAlgorithms,\n SignatureAlgorithm,\n} from \"../../cipher/const\";\nimport { generateKeyPair } from \"../../cipher/namedCurve\";\nimport type { CipherContext } from \"../../context/cipher\";\nimport type { DtlsContext } from \"../../context/dtls\";\nimport { type Profile, SrtpContext } from \"../../context/srtp\";\nimport type { TransportContext } from \"../../context/transport\";\nimport { EllipticCurves } from \"../../handshake/extensions/ellipticCurves\";\nimport { ExtendedMasterSecret } from \"../../handshake/extensions/extendedMasterSecret\";\nimport { RenegotiationIndication } from \"../../handshake/extensions/renegotiationIndication\";\nimport { Signature } from \"../../handshake/extensions/signature\";\nimport { UseSRTP } from \"../../handshake/extensions/useSrtp\";\nimport type { ClientHello } from \"../../handshake/message/client/hello\";\nimport { ServerHelloVerifyRequest } from \"../../handshake/message/server/helloVerifyRequest\";\nimport { DtlsRandom } from \"../../handshake/random\";\nimport { createFragments, createPlaintext } from \"../../record/builder\";\nimport { ContentType } from \"../../record/const\";\n\nconst log = debug(\"werift-dtls : packages/dtls/flight/server/flight2.ts : log\");\n\n// HelloVerifyRequest do not retransmit\n\nexport const flight2 =\n (\n udp: TransportContext,\n dtls: DtlsContext,\n cipher: CipherContext,\n srtp: SrtpContext,\n ) =>\n (clientHello: ClientHello) => {\n log(\"dtls version\", clientHello.clientVersion);\n\n dtls.flight = 2;\n\n // if flight 2 restarts due to packet loss, sequence numbers are reused from the top:\n // https://datatracker.ietf.org/doc/html/rfc6347#section-4.2.2\n // The first message each side transmits in each handshake always has\n // message_seq = 0. Whenever each new message is generated, the\n // message_seq value is incremented by one. Note that in the case of a\n // rehandshake, this implies that the HelloRequest will have message_seq = 0\n // and the ServerHello will have message_seq = 1. When a message is\n // retransmitted, the same message_seq value is used.\n dtls.recordSequenceNumber = 0;\n dtls.sequenceNumber = 0;\n\n clientHello.extensions.forEach((extension) => {\n switch (extension.type) {\n case EllipticCurves.type:\n {\n const curves = EllipticCurves.fromData(extension.data).data;\n log(dtls.sessionId, \"curves\", curves);\n const curve = curves.filter((curve) =>\n NamedCurveAlgorithmList.includes(curve as any),\n )[0] as NamedCurveAlgorithms;\n cipher.namedCurve = curve;\n log(dtls.sessionId, \"curve selected\", cipher.namedCurve);\n }\n break;\n case Signature.type:\n {\n if (!cipher.signatureHashAlgorithm)\n throw new Error(\"need to set certificate\");\n\n const signatureHash = Signature.fromData(extension.data).data;\n log(dtls.sessionId, \"hash,signature\", signatureHash);\n const signature = signatureHash.find(\n (v) => v.signature === cipher.signatureHashAlgorithm?.signature,\n )?.signature;\n const hash = signatureHash.find(\n (v) => v.hash === cipher.signatureHashAlgorithm?.hash,\n )?.hash;\n if (signature == undefined || hash == undefined) {\n throw new Error(\"invalid signatureHash\");\n }\n }\n break;\n case UseSRTP.type:\n {\n if (!dtls.options?.srtpProfiles) return;\n if (dtls.options.srtpProfiles.length === 0) return;\n\n const useSrtp = UseSRTP.fromData(extension.data);\n log(dtls.sessionId, \"srtp profiles\", useSrtp.profiles);\n const profile = SrtpContext.findMatchingSRTPProfile(\n useSrtp.profiles as Profile[],\n dtls.options?.srtpProfiles,\n );\n if (!profile) {\n throw new Error();\n }\n srtp.srtpProfile = profile;\n log(dtls.sessionId, \"srtp profile selected\", srtp.srtpProfile);\n }\n break;\n case ExtendedMasterSecret.type:\n {\n dtls.remoteExtendedMasterSecret = true;\n }\n break;\n case RenegotiationIndication.type: {\n log(dtls.sessionId, \"RenegotiationIndication\", extension.data);\n }\n case 43:\n {\n // todo dtls1.3\n const data = extension.data.subarray(1);\n const versions = [...data].map((v) => v.toString(10));\n log(\"dtls supported version\", versions);\n }\n break;\n }\n });\n\n cipher.localRandom = new DtlsRandom();\n cipher.remoteRandom = DtlsRandom.from(clientHello.random);\n\n const suites = clientHello.cipherSuites;\n log(dtls.sessionId, \"cipher suites\", suites);\n const suite = (() => {\n switch (cipher.signatureHashAlgorithm?.signature) {\n case SignatureAlgorithm.ecdsa_3:\n return CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_49195;\n case SignatureAlgorithm.rsa_1:\n return CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_49199;\n }\n })();\n if (suite === undefined || !suites.includes(suite)) {\n throw new Error(\"dtls cipher suite negotiation failed\");\n }\n cipher.cipherSuite = suite;\n log(dtls.sessionId, \"selected cipherSuite\", cipher.cipherSuite);\n\n cipher.localKeyPair = generateKeyPair(cipher.namedCurve);\n\n dtls.cookie ||= randomBytes(20);\n const helloVerifyReq = new ServerHelloVerifyRequest(\n {\n major: 255 - 1,\n minor: 255 - 2,\n },\n dtls.cookie,\n );\n const fragments = createFragments(dtls)([helloVerifyReq]);\n const packets = createPlaintext(dtls)(\n fragments.map((fragment) => ({\n type: ContentType.handshake,\n fragment: fragment.serialize(),\n })),\n ++dtls.recordSequenceNumber,\n );\n\n const chunk = packets.map((v) => v.serialize());\n for (const buf of chunk) {\n udp.send(buf);\n }\n };\n"]}
1
+ {"version":3,"file":"flight2.js","sourceRoot":"","sources":["../../../../../../dtls/src/flight/server/flight2.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport debug from \"debug\";\n\nimport {\n CipherSuite,\n NamedCurveAlgorithmList,\n type NamedCurveAlgorithms,\n SignatureAlgorithm,\n} from \"../../cipher/const\";\nimport { generateKeyPair } from \"../../cipher/namedCurve\";\nimport type { CipherContext } from \"../../context/cipher\";\nimport type { DtlsContext } from \"../../context/dtls\";\nimport { type Profile, SrtpContext } from \"../../context/srtp\";\nimport type { TransportContext } from \"../../context/transport\";\nimport { EllipticCurves } from \"../../handshake/extensions/ellipticCurves\";\nimport { ExtendedMasterSecret } from \"../../handshake/extensions/extendedMasterSecret\";\nimport { RenegotiationIndication } from \"../../handshake/extensions/renegotiationIndication\";\nimport { Signature } from \"../../handshake/extensions/signature\";\nimport { UseSRTP } from \"../../handshake/extensions/useSrtp\";\nimport type { ClientHello } from \"../../handshake/message/client/hello\";\nimport { ServerHelloVerifyRequest } from \"../../handshake/message/server/helloVerifyRequest\";\nimport { DtlsRandom } from \"../../handshake/random\";\nimport { createFragments, createPlaintext } from \"../../record/builder\";\nimport { ContentType } from \"../../record/const\";\n\nconst log = debug(\"werift-dtls : packages/dtls/flight/server/flight2.ts : log\");\n\n// HelloVerifyRequest do not retransmit\n\nexport const flight2 =\n (\n udp: TransportContext,\n dtls: DtlsContext,\n cipher: CipherContext,\n srtp: SrtpContext,\n ) =>\n (clientHello: ClientHello) => {\n log(\"dtls version\", clientHello.clientVersion);\n\n dtls.flight = 2;\n\n // if flight 2 restarts due to packet loss, sequence numbers are reused from the top:\n // https://datatracker.ietf.org/doc/html/rfc6347#section-4.2.2\n // The first message each side transmits in each handshake always has\n // message_seq = 0. Whenever each new message is generated, the\n // message_seq value is incremented by one. Note that in the case of a\n // rehandshake, this implies that the HelloRequest will have message_seq = 0\n // and the ServerHello will have message_seq = 1. When a message is\n // retransmitted, the same message_seq value is used.\n dtls.recordSequenceNumber = 0;\n dtls.sequenceNumber = 0;\n\n clientHello.extensions.forEach((extension) => {\n switch (extension.type) {\n case EllipticCurves.type:\n {\n const curves = EllipticCurves.fromData(extension.data).data;\n log(dtls.sessionId, \"curves\", curves);\n const curve = curves.filter((curve) =>\n NamedCurveAlgorithmList.includes(curve as any),\n )[0] as NamedCurveAlgorithms;\n cipher.namedCurve = curve;\n log(dtls.sessionId, \"curve selected\", cipher.namedCurve);\n }\n break;\n case Signature.type:\n {\n if (!cipher.signatureHashAlgorithm)\n throw new Error(\"need to set certificate\");\n\n const signatureHash = Signature.fromData(extension.data).data;\n log(dtls.sessionId, \"hash,signature\", signatureHash);\n const signature = signatureHash.find(\n (v) => v.signature === cipher.signatureHashAlgorithm?.signature,\n )?.signature;\n const hash = signatureHash.find(\n (v) => v.hash === cipher.signatureHashAlgorithm?.hash,\n )?.hash;\n if (signature == undefined || hash == undefined) {\n throw new Error(\"invalid signatureHash\");\n }\n }\n break;\n case UseSRTP.type:\n {\n if (!dtls.options?.srtpProfiles) return;\n if (dtls.options.srtpProfiles.length === 0) return;\n\n const useSrtp = UseSRTP.fromData(extension.data);\n log(dtls.sessionId, \"srtp profiles\", useSrtp.profiles);\n const profile = SrtpContext.findMatchingSRTPProfile(\n useSrtp.profiles as Profile[],\n dtls.options?.srtpProfiles,\n );\n if (!profile) {\n throw new Error();\n }\n srtp.srtpProfile = profile;\n log(dtls.sessionId, \"srtp profile selected\", srtp.srtpProfile);\n }\n break;\n case ExtendedMasterSecret.type:\n {\n dtls.remoteExtendedMasterSecret = true;\n }\n break;\n case RenegotiationIndication.type:\n {\n log(dtls.sessionId, \"RenegotiationIndication\", extension.data);\n }\n break;\n case 43:\n {\n // todo dtls1.3\n const data = extension.data.subarray(1);\n const versions = [...data].map((v) => v.toString(10));\n log(\"dtls supported version\", versions);\n }\n break;\n }\n });\n\n cipher.localRandom = new DtlsRandom();\n cipher.remoteRandom = DtlsRandom.from(clientHello.random);\n\n const suites = clientHello.cipherSuites;\n log(dtls.sessionId, \"cipher suites\", suites);\n const suite = (() => {\n switch (cipher.signatureHashAlgorithm?.signature) {\n case SignatureAlgorithm.ecdsa_3:\n return CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_49195;\n case SignatureAlgorithm.rsa_1:\n return CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_49199;\n }\n })();\n if (suite === undefined || !suites.includes(suite)) {\n throw new Error(\"dtls cipher suite negotiation failed\");\n }\n cipher.cipherSuite = suite;\n log(dtls.sessionId, \"selected cipherSuite\", cipher.cipherSuite);\n\n cipher.localKeyPair = generateKeyPair(cipher.namedCurve);\n\n dtls.cookie ||= randomBytes(20);\n const helloVerifyReq = new ServerHelloVerifyRequest(\n {\n major: 255 - 1,\n minor: 255 - 2,\n },\n dtls.cookie,\n );\n const fragments = createFragments(dtls)([helloVerifyReq]);\n const packets = createPlaintext(dtls)(\n fragments.map((fragment) => ({\n type: ContentType.handshake,\n fragment: fragment.serialize(),\n })),\n ++dtls.recordSequenceNumber,\n );\n\n const chunk = packets.map((v) => v.serialize());\n for (const buf of chunk) {\n udp.send(buf);\n }\n };\n"]}
@@ -1,4 +1,4 @@
1
1
  export { DtlsClient } from "./client";
2
2
  export { DtlsServer } from "./server";
3
3
  export { DtlsSocket } from "./socket";
4
- export { createUdpTransport, Transport, UdpTransport } from "./transport";
4
+ export { createUdpTransport, type Transport, UdpTransport } from "./transport";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dtls/src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,yCAA0E;AAAjE,+GAAA,kBAAkB,OAAA;AAAa,yGAAA,YAAY,OAAA;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CE;AAEF,uBAAuB;AACvB,uBAAuB;AACvB,sBAAsB;AACtB,sBAAsB;AACtB,8BAA8B;AAC9B,sBAAsB;AACtB,8BAA8B;AAC9B,8BAA8B;AAC9B,4BAA4B;AAC5B,6BAA6B;AAC7B,8BAA8B;AAC9B,mBAAmB;AACnB,IAAI;AAEJ,qBAAqB;AACrB,2BAA2B;AAC3B,gBAAgB;AAChB,oBAAoB;AACpB,0BAA0B;AAC1B,IAAI;AAEJ,SAAS;AACT,qBAAqB;AACrB,4BAA4B;AAC5B,wBAAwB;AACxB,oCAAoC;AACpC,yBAAyB;AACzB,+BAA+B;AAC/B,2BAA2B;AAC3B,iCAAiC;AACjC,yBAAyB;AACzB,iCAAiC;AACjC,6BAA6B;AAC7B,6BAA6B;AAC7B,6BAA6B;AAC7B,2BAA2B;AAC3B,oBAAoB;AACpB,uBAAuB;AACvB,sBAAsB;AACtB,uBAAuB;AACvB,qCAAqC;AACrC,0BAA0B;AAC1B,+BAA+B;AAC/B,wBAAwB;AACxB,uBAAuB;AACvB,2BAA2B;AAC3B,gCAAgC;AAChC,UAAU;AACV,sBAAsB","sourcesContent":["export { DtlsClient } from \"./client\";\nexport { DtlsServer } from \"./server\";\nexport { DtlsSocket } from \"./socket\";\nexport { createUdpTransport, Transport, UdpTransport } from \"./transport\";\n\n/* Client Server\n ------ ------\n\n ClientHello --------> Flight 1\n\n\t\t\t\t\t\t <------- HelloVerifyRequest Flight 2\n\n ClientHello --------> Flight 3\n\n\t\t\t\t\t\t\t\t\t\t\t ServerHello \\\n\t\t\t\t\t\t\t\t\t\t\t Certificate* \\\n\t\t\t\t\t\t\t\t\t ServerKeyExchange* Flight 4\n\t\t\t\t\t\t\t\t\t CertificateRequest* /\n\t\t\t\t\t\t <-------- ServerHelloDone /\n\n Certificate* \\\n ClientKeyExchange \\\n CertificateVerify* Flight 5\n [ChangeCipherSpec] /\n Finished --------> /\n\n\t\t\t\t\t\t\t\t\t [ChangeCipherSpec] \\ Flight 6\n\t\t\t\t\t\t <-------- Finished /\n\n\t\t\t Figure 1. Message Flights for Full Handshake\n\n=======================================================================\n\n Client Server\n ------ ------\n\n ClientHello --------> Flight 1\n\n\t\t\t\t\t\t\t\t\t\t\t ServerHello \\\n\t\t\t\t\t\t\t\t\t [ChangeCipherSpec] Flight 2\n\t\t\t\t\t\t\t<-------- Finished /\n\n [ChangeCipherSpec] \\Flight 3\n Finished --------> /\n\n\t\t Figure 2. Message Flights for Session-Resuming Handshake\n\t\t\t\t\t\t (No Cookie Exchange)\n*/\n\n// enum HandshakeType {\n// hello_request = 0,\n// client_hello = 1,\n// server_hello = 2,\n// hello_verify_request = 3,\n// certificate = 11,\n// server_key_exchange = 12,\n// certificate_request = 13,\n// server_hello_done = 14,\n// certificate_verify = 15,\n// client_key_exchange = 16,\n// finished = 20,\n// }\n\n// enum ContentType {\n// changeCipherSpec = 20,\n// alert = 21,\n// handshake = 22,\n// applicationData = 23,\n// }\n\n// enum {\n// close_notify(0),\n// unexpected_message(10),\n// bad_record_mac(20),\n// decryption_failed_RESERVED(21),\n// record_overflow(22),\n// decompression_failure(30),\n// handshake_failure(40),\n// no_certificate_RESERVED(41),\n// bad_certificate(42),\n// unsupported_certificate(43),\n// certificate_revoked(44),\n// certificate_expired(45),\n// certificate_unknown(46),\n// illegal_parameter(47),\n// unknown_ca(48),\n// access_denied(49),\n// decode_error(50),\n// decrypt_error(51),\n// export_restriction_RESERVED(60),\n// protocol_version(70),\n// insufficient_security(71),\n// internal_error(80),\n// user_canceled(90),\n// no_renegotiation(100),\n// unsupported_extension(110),\n// (255)\n// } AlertDescription;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dtls/src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,yCAA+E;AAAtE,+GAAA,kBAAkB,OAAA;AAAkB,yGAAA,YAAY,OAAA;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CE;AAEF,uBAAuB;AACvB,uBAAuB;AACvB,sBAAsB;AACtB,sBAAsB;AACtB,8BAA8B;AAC9B,sBAAsB;AACtB,8BAA8B;AAC9B,8BAA8B;AAC9B,4BAA4B;AAC5B,6BAA6B;AAC7B,8BAA8B;AAC9B,mBAAmB;AACnB,IAAI;AAEJ,qBAAqB;AACrB,2BAA2B;AAC3B,gBAAgB;AAChB,oBAAoB;AACpB,0BAA0B;AAC1B,IAAI;AAEJ,SAAS;AACT,qBAAqB;AACrB,4BAA4B;AAC5B,wBAAwB;AACxB,oCAAoC;AACpC,yBAAyB;AACzB,+BAA+B;AAC/B,2BAA2B;AAC3B,iCAAiC;AACjC,yBAAyB;AACzB,iCAAiC;AACjC,6BAA6B;AAC7B,6BAA6B;AAC7B,6BAA6B;AAC7B,2BAA2B;AAC3B,oBAAoB;AACpB,uBAAuB;AACvB,sBAAsB;AACtB,uBAAuB;AACvB,qCAAqC;AACrC,0BAA0B;AAC1B,+BAA+B;AAC/B,wBAAwB;AACxB,uBAAuB;AACvB,2BAA2B;AAC3B,gCAAgC;AAChC,UAAU;AACV,sBAAsB","sourcesContent":["export { DtlsClient } from \"./client\";\nexport { DtlsServer } from \"./server\";\nexport { DtlsSocket } from \"./socket\";\nexport { createUdpTransport, type Transport, UdpTransport } from \"./transport\";\n\n/* Client Server\n ------ ------\n\n ClientHello --------> Flight 1\n\n\t\t\t\t\t\t <------- HelloVerifyRequest Flight 2\n\n ClientHello --------> Flight 3\n\n\t\t\t\t\t\t\t\t\t\t\t ServerHello \\\n\t\t\t\t\t\t\t\t\t\t\t Certificate* \\\n\t\t\t\t\t\t\t\t\t ServerKeyExchange* Flight 4\n\t\t\t\t\t\t\t\t\t CertificateRequest* /\n\t\t\t\t\t\t <-------- ServerHelloDone /\n\n Certificate* \\\n ClientKeyExchange \\\n CertificateVerify* Flight 5\n [ChangeCipherSpec] /\n Finished --------> /\n\n\t\t\t\t\t\t\t\t\t [ChangeCipherSpec] \\ Flight 6\n\t\t\t\t\t\t <-------- Finished /\n\n\t\t\t Figure 1. Message Flights for Full Handshake\n\n=======================================================================\n\n Client Server\n ------ ------\n\n ClientHello --------> Flight 1\n\n\t\t\t\t\t\t\t\t\t\t\t ServerHello \\\n\t\t\t\t\t\t\t\t\t [ChangeCipherSpec] Flight 2\n\t\t\t\t\t\t\t<-------- Finished /\n\n [ChangeCipherSpec] \\Flight 3\n Finished --------> /\n\n\t\t Figure 2. Message Flights for Session-Resuming Handshake\n\t\t\t\t\t\t (No Cookie Exchange)\n*/\n\n// enum HandshakeType {\n// hello_request = 0,\n// client_hello = 1,\n// server_hello = 2,\n// hello_verify_request = 3,\n// certificate = 11,\n// server_key_exchange = 12,\n// certificate_request = 13,\n// server_hello_done = 14,\n// certificate_verify = 15,\n// client_key_exchange = 16,\n// finished = 20,\n// }\n\n// enum ContentType {\n// changeCipherSpec = 20,\n// alert = 21,\n// handshake = 22,\n// applicationData = 23,\n// }\n\n// enum {\n// close_notify(0),\n// unexpected_message(10),\n// bad_record_mac(20),\n// decryption_failed_RESERVED(21),\n// record_overflow(22),\n// decompression_failure(30),\n// handshake_failure(40),\n// no_certificate_RESERVED(41),\n// bad_certificate(42),\n// unsupported_certificate(43),\n// certificate_revoked(44),\n// certificate_expired(45),\n// certificate_unknown(46),\n// illegal_parameter(47),\n// unknown_ca(48),\n// access_denied(49),\n// decode_error(50),\n// decrypt_error(51),\n// export_restriction_RESERVED(60),\n// protocol_version(70),\n// insufficient_security(71),\n// internal_error(80),\n// user_canceled(90),\n// no_renegotiation(100),\n// unsupported_extension(110),\n// (255)\n// } AlertDescription;\n"]}
@@ -75,8 +75,8 @@ const parsePlainText = (dtls, cipher) => (plain) => {
75
75
  if (alert.level > 1) {
76
76
  throw new Error("alert fatal error");
77
77
  }
78
+ return { type: const_1.ContentType.alert, data: undefined };
78
79
  }
79
- // eslint-disable-next-line no-fallthrough
80
80
  default: {
81
81
  return { type: const_1.ContentType.alert, data: undefined };
82
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"receive.js","sourceRoot":"","sources":["../../../../../dtls/src/record/receive.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\n\nimport type { CipherContext } from \"../context/cipher\";\nimport type { DtlsContext } from \"../context/dtls\";\nimport { Alert } from \"../handshake/message/alert\";\nimport { AlertDesc, ContentType } from \"./const\";\nimport { FragmentedHandshake } from \"./message/fragment\";\nimport { DtlsPlaintext } from \"./message/plaintext\";\n\nconst log = debug(\"werift-dtls : packages/dtls/record/receive.ts : log\");\nconst err = debug(\"werift-dtls : packages/dtls/record/receive.ts : err\");\n\nexport const parsePacket = (data: Buffer) => {\n let start = 0;\n const packets: DtlsPlaintext[] = [];\n while (data.length > start) {\n const fragmentLength = data.readUInt16BE(start + 11);\n if (data.length < start + (12 + fragmentLength)) break;\n const packet = DtlsPlaintext.deSerialize(data.slice(start));\n packets.push(packet);\n\n start += 13 + fragmentLength;\n }\n\n return packets;\n};\n\nexport const parsePlainText =\n (dtls: DtlsContext, cipher: CipherContext) => (plain: DtlsPlaintext) => {\n const contentType = plain.recordLayerHeader.contentType;\n\n switch (contentType) {\n case ContentType.changeCipherSpec: {\n log(dtls.sessionId, \"change cipher spec\");\n return {\n type: ContentType.changeCipherSpec,\n data: undefined,\n };\n }\n case ContentType.handshake: {\n let raw = plain.fragment;\n try {\n if (plain.recordLayerHeader.epoch > 0) {\n log(dtls.sessionId, \"decrypt handshake\");\n raw = cipher.decryptPacket(plain);\n }\n } catch (error) {\n err(dtls.sessionId, \"decrypt failed\", error);\n throw error;\n }\n try {\n return {\n type: ContentType.handshake,\n data: FragmentedHandshake.deSerialize(raw),\n };\n } catch (error) {\n err(dtls.sessionId, \"decSerialize failed\", error, raw);\n throw error;\n }\n }\n case ContentType.applicationData: {\n return {\n type: ContentType.applicationData,\n data: cipher.decryptPacket(plain),\n };\n }\n case ContentType.alert: {\n let alert = Alert.deSerialize(plain.fragment);\n\n // TODO impl more better about handle encrypted alert\n if (AlertDesc[alert.description] == undefined) {\n const dec = cipher.decryptPacket(plain);\n alert = Alert.deSerialize(dec);\n }\n err(\n dtls.sessionId,\n \"ContentType.alert\",\n alert,\n AlertDesc[alert.description],\n \"flight\",\n dtls.flight,\n \"lastFlight\",\n dtls.lastFlight,\n );\n if (alert.level > 1) {\n throw new Error(\"alert fatal error\");\n }\n }\n // eslint-disable-next-line no-fallthrough\n default: {\n return { type: ContentType.alert, data: undefined };\n }\n }\n };\n"]}
1
+ {"version":3,"file":"receive.js","sourceRoot":"","sources":["../../../../../dtls/src/record/receive.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\n\nimport type { CipherContext } from \"../context/cipher\";\nimport type { DtlsContext } from \"../context/dtls\";\nimport { Alert } from \"../handshake/message/alert\";\nimport { AlertDesc, ContentType } from \"./const\";\nimport { FragmentedHandshake } from \"./message/fragment\";\nimport { DtlsPlaintext } from \"./message/plaintext\";\n\nconst log = debug(\"werift-dtls : packages/dtls/record/receive.ts : log\");\nconst err = debug(\"werift-dtls : packages/dtls/record/receive.ts : err\");\n\nexport const parsePacket = (data: Buffer) => {\n let start = 0;\n const packets: DtlsPlaintext[] = [];\n while (data.length > start) {\n const fragmentLength = data.readUInt16BE(start + 11);\n if (data.length < start + (12 + fragmentLength)) break;\n const packet = DtlsPlaintext.deSerialize(data.slice(start));\n packets.push(packet);\n\n start += 13 + fragmentLength;\n }\n\n return packets;\n};\n\nexport const parsePlainText =\n (dtls: DtlsContext, cipher: CipherContext) => (plain: DtlsPlaintext) => {\n const contentType = plain.recordLayerHeader.contentType;\n\n switch (contentType) {\n case ContentType.changeCipherSpec: {\n log(dtls.sessionId, \"change cipher spec\");\n return {\n type: ContentType.changeCipherSpec,\n data: undefined,\n };\n }\n case ContentType.handshake: {\n let raw = plain.fragment;\n try {\n if (plain.recordLayerHeader.epoch > 0) {\n log(dtls.sessionId, \"decrypt handshake\");\n raw = cipher.decryptPacket(plain);\n }\n } catch (error) {\n err(dtls.sessionId, \"decrypt failed\", error);\n throw error;\n }\n try {\n return {\n type: ContentType.handshake,\n data: FragmentedHandshake.deSerialize(raw),\n };\n } catch (error) {\n err(dtls.sessionId, \"decSerialize failed\", error, raw);\n throw error;\n }\n }\n case ContentType.applicationData: {\n return {\n type: ContentType.applicationData,\n data: cipher.decryptPacket(plain),\n };\n }\n case ContentType.alert: {\n let alert = Alert.deSerialize(plain.fragment);\n\n // TODO impl more better about handle encrypted alert\n if (AlertDesc[alert.description] == undefined) {\n const dec = cipher.decryptPacket(plain);\n alert = Alert.deSerialize(dec);\n }\n err(\n dtls.sessionId,\n \"ContentType.alert\",\n alert,\n AlertDesc[alert.description],\n \"flight\",\n dtls.flight,\n \"lastFlight\",\n dtls.lastFlight,\n );\n if (alert.level > 1) {\n throw new Error(\"alert fatal error\");\n }\n return { type: ContentType.alert, data: undefined };\n }\n default: {\n return { type: ContentType.alert, data: undefined };\n }\n }\n };\n"]}
@@ -10,7 +10,8 @@ export declare class Candidate {
10
10
  relatedPort?: number | undefined;
11
11
  tcptype?: string | undefined;
12
12
  generation?: number | undefined;
13
- constructor(foundation: string, component: number, transport: string, priority: number, host: string, port: number, type: string, relatedAddress?: string | undefined, relatedPort?: number | undefined, tcptype?: string | undefined, generation?: number | undefined);
13
+ ufrag?: string | undefined;
14
+ constructor(foundation: string, component: number, transport: string, priority: number, host: string, port: number, type: string, relatedAddress?: string | undefined, relatedPort?: number | undefined, tcptype?: string | undefined, generation?: number | undefined, ufrag?: string | undefined);
14
15
  static fromSdp(sdp: string): Candidate;
15
16
  canPairWith(other: Candidate): boolean;
16
17
  toSdp(): string;
@@ -11,7 +11,7 @@ const net_1 = require("net");
11
11
  const range_1 = __importDefault(require("lodash/range"));
12
12
  class Candidate {
13
13
  // An ICE candidate.
14
- constructor(foundation, component, transport, priority, host, port, type, relatedAddress, relatedPort, tcptype, generation) {
14
+ constructor(foundation, component, transport, priority, host, port, type, relatedAddress, relatedPort, tcptype, generation, ufrag) {
15
15
  Object.defineProperty(this, "foundation", {
16
16
  enumerable: true,
17
17
  configurable: true,
@@ -78,15 +78,23 @@ class Candidate {
78
78
  writable: true,
79
79
  value: generation
80
80
  });
81
+ Object.defineProperty(this, "ufrag", {
82
+ enumerable: true,
83
+ configurable: true,
84
+ writable: true,
85
+ value: ufrag
86
+ });
81
87
  }
82
88
  static fromSdp(sdp) {
83
89
  // Parse a :class:`Candidate` from SDP.
84
90
  // .. code-block:: python
85
91
  // Candidate.from_sdp(
86
- // '6815297761 1 udp 659136 1.2.3.4 31102 typ host generation 0')
92
+ // '6815297761 1 udp 659136 1.2.3.4 31102 typ host generation 0 ufrag b7l3')
87
93
  const bits = sdp.split(" ");
88
- if (bits.length < 8)
94
+ if (bits.length < 8) {
89
95
  throw new Error("SDP does not have enough properties");
96
+ }
97
+ // 固定ワード
90
98
  const kwargs = {
91
99
  foundation: bits[0],
92
100
  component: Number(bits[1]),
@@ -109,9 +117,12 @@ class Candidate {
109
117
  else if (bits[i] === "generation") {
110
118
  kwargs["generation"] = Number(bits[i + 1]);
111
119
  }
120
+ else if (bits[i] === "ufrag") {
121
+ kwargs["ufrag"] = bits[i + 1];
122
+ }
112
123
  }
113
124
  const { foundation, component, transport, priority, host, port, type } = kwargs;
114
- return new Candidate(foundation, component, transport, priority, host, port, type, kwargs["related_address"], kwargs["related_port"], kwargs["tcptype"], kwargs["generation"]);
125
+ return new Candidate(foundation, component, transport, priority, host, port, type, kwargs["related_address"], kwargs["related_port"], kwargs["tcptype"], kwargs["generation"], kwargs["ufrag"]);
115
126
  }
116
127
  canPairWith(other) {
117
128
  // """
@@ -135,6 +146,8 @@ class Candidate {
135
146
  sdp += ` tcptype ${this.tcptype}`;
136
147
  if (this.generation != undefined)
137
148
  sdp += ` generation ${this.generation}`;
149
+ if (this.ufrag != undefined)
150
+ sdp += ` ufrag ${this.ufrag}`;
138
151
  return sdp;
139
152
  }
140
153
  }
@@ -1 +1 @@
1
- {"version":3,"file":"candidate.js","sourceRoot":"","sources":["../../../../ice/src/candidate.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"crypto\";\nimport { isIPv4 } from \"net\";\nimport range from \"lodash/range\";\n\nexport class Candidate {\n // An ICE candidate.\n\n constructor(\n public foundation: string,\n public component: number,\n public transport: string,\n public priority: number,\n public host: string,\n public port: number,\n public type: string,\n public relatedAddress?: string,\n public relatedPort?: number,\n public tcptype?: string,\n public generation?: number,\n ) {}\n\n static fromSdp(sdp: string) {\n // Parse a :class:`Candidate` from SDP.\n // .. code-block:: python\n // Candidate.from_sdp(\n // '6815297761 1 udp 659136 1.2.3.4 31102 typ host generation 0')\n\n const bits = sdp.split(\" \");\n if (bits.length < 8) throw new Error(\"SDP does not have enough properties\");\n\n const kwargs = {\n foundation: bits[0],\n component: Number(bits[1]),\n transport: bits[2],\n priority: Number(bits[3]),\n host: bits[4],\n port: Number(bits[5]),\n type: bits[7],\n };\n\n for (const i of range(8, bits.length - 1, 2)) {\n if (bits[i] === \"raddr\") {\n (kwargs as any)[\"related_address\"] = bits[i + 1];\n } else if (bits[i] === \"rport\") {\n (kwargs as any)[\"related_port\"] = Number(bits[i + 1]);\n } else if (bits[i] === \"tcptype\") {\n (kwargs as any)[\"tcptype\"] = bits[i + 1];\n } else if (bits[i] === \"generation\") {\n (kwargs as any)[\"generation\"] = Number(bits[i + 1]);\n }\n }\n const { foundation, component, transport, priority, host, port, type } =\n kwargs;\n\n return new Candidate(\n foundation,\n component,\n transport,\n priority,\n host,\n port,\n type,\n (kwargs as any)[\"related_address\"],\n (kwargs as any)[\"related_port\"],\n (kwargs as any)[\"tcptype\"],\n (kwargs as any)[\"generation\"],\n );\n }\n\n canPairWith(other: Candidate) {\n // \"\"\"\n // A local candidate is paired with a remote candidate if and only if\n // the two candidates have the same component ID and have the same IP\n // address version.\n // \"\"\"\n const a = isIPv4(this.host);\n const b = isIPv4(other.host);\n return (\n this.component === other.component &&\n this.transport.toLowerCase() === other.transport.toLowerCase() &&\n a === b\n );\n }\n\n toSdp() {\n let sdp = `${this.foundation} ${this.component} ${this.transport} ${this.priority} ${this.host} ${this.port} typ ${this.type}`;\n\n if (this.relatedAddress) sdp += ` raddr ${this.relatedAddress}`;\n if (this.relatedPort != undefined) sdp += ` rport ${this.relatedPort}`;\n if (this.tcptype) sdp += ` tcptype ${this.tcptype}`;\n if (this.generation != undefined) sdp += ` generation ${this.generation}`;\n\n return sdp;\n }\n}\n\nexport function candidateFoundation(\n candidateType: string,\n candidateTransport: string,\n baseAddress: string,\n) {\n // \"\"\"\n // See RFC 5245 - 4.1.1.3. Computing Foundations\n // \"\"\"\n const key = `${candidateType}|${candidateTransport}|${baseAddress}`;\n\n return createHash(\"md5\").update(key, \"ascii\").digest(\"hex\").slice(7);\n}\n\n// priorityを決める\nexport function candidatePriority(candidateType: string, localPref = 65535) {\n const candidateComponent: number = 1;\n // See RFC 5245 - 4.1.2.1. Recommended Formula\n let typePref = 0;\n if (candidateType === \"host\") {\n typePref = 126;\n } else if (candidateType === \"prflx\") {\n typePref = 110;\n } else if (candidateType === \"srflx\") {\n typePref = 100;\n } else {\n typePref = 0;\n }\n return (\n (1 << 24) * typePref + (1 << 8) * localPref + (256 - candidateComponent)\n );\n}\n"]}
1
+ {"version":3,"file":"candidate.js","sourceRoot":"","sources":["../../../../ice/src/candidate.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"crypto\";\nimport { isIPv4 } from \"net\";\nimport range from \"lodash/range\";\n\nexport class Candidate {\n // An ICE candidate.\n\n constructor(\n public foundation: string,\n public component: number,\n public transport: string,\n public priority: number,\n public host: string,\n public port: number,\n public type: string,\n public relatedAddress?: string,\n public relatedPort?: number,\n public tcptype?: string,\n public generation?: number,\n public ufrag?: string,\n ) {}\n\n static fromSdp(sdp: string) {\n // Parse a :class:`Candidate` from SDP.\n // .. code-block:: python\n // Candidate.from_sdp(\n // '6815297761 1 udp 659136 1.2.3.4 31102 typ host generation 0 ufrag b7l3')\n\n const bits = sdp.split(\" \");\n if (bits.length < 8) {\n throw new Error(\"SDP does not have enough properties\");\n }\n\n // 固定ワード\n const kwargs = {\n foundation: bits[0],\n component: Number(bits[1]),\n transport: bits[2],\n priority: Number(bits[3]),\n host: bits[4],\n port: Number(bits[5]),\n type: bits[7],\n };\n\n for (const i of range(8, bits.length - 1, 2)) {\n if (bits[i] === \"raddr\") {\n (kwargs as any)[\"related_address\"] = bits[i + 1];\n } else if (bits[i] === \"rport\") {\n (kwargs as any)[\"related_port\"] = Number(bits[i + 1]);\n } else if (bits[i] === \"tcptype\") {\n (kwargs as any)[\"tcptype\"] = bits[i + 1];\n } else if (bits[i] === \"generation\") {\n (kwargs as any)[\"generation\"] = Number(bits[i + 1]);\n } else if (bits[i] === \"ufrag\") {\n (kwargs as any)[\"ufrag\"] = bits[i + 1];\n }\n }\n const { foundation, component, transport, priority, host, port, type } =\n kwargs;\n\n return new Candidate(\n foundation,\n component,\n transport,\n priority,\n host,\n port,\n type,\n (kwargs as any)[\"related_address\"],\n (kwargs as any)[\"related_port\"],\n (kwargs as any)[\"tcptype\"],\n (kwargs as any)[\"generation\"],\n (kwargs as any)[\"ufrag\"],\n );\n }\n\n canPairWith(other: Candidate) {\n // \"\"\"\n // A local candidate is paired with a remote candidate if and only if\n // the two candidates have the same component ID and have the same IP\n // address version.\n // \"\"\"\n const a = isIPv4(this.host);\n const b = isIPv4(other.host);\n return (\n this.component === other.component &&\n this.transport.toLowerCase() === other.transport.toLowerCase() &&\n a === b\n );\n }\n\n toSdp() {\n let sdp = `${this.foundation} ${this.component} ${this.transport} ${this.priority} ${this.host} ${this.port} typ ${this.type}`;\n\n if (this.relatedAddress) sdp += ` raddr ${this.relatedAddress}`;\n if (this.relatedPort != undefined) sdp += ` rport ${this.relatedPort}`;\n if (this.tcptype) sdp += ` tcptype ${this.tcptype}`;\n if (this.generation != undefined) sdp += ` generation ${this.generation}`;\n if (this.ufrag != undefined) sdp += ` ufrag ${this.ufrag}`;\n\n return sdp;\n }\n}\n\nexport function candidateFoundation(\n candidateType: string,\n candidateTransport: string,\n baseAddress: string,\n) {\n // \"\"\"\n // See RFC 5245 - 4.1.1.3. Computing Foundations\n // \"\"\"\n const key = `${candidateType}|${candidateTransport}|${baseAddress}`;\n\n return createHash(\"md5\").update(key, \"ascii\").digest(\"hex\").slice(7);\n}\n\n// priorityを決める\nexport function candidatePriority(candidateType: string, localPref = 65535) {\n const candidateComponent: number = 1;\n // See RFC 5245 - 4.1.2.1. Recommended Formula\n let typePref = 0;\n if (candidateType === \"host\") {\n typePref = 126;\n } else if (candidateType === \"prflx\") {\n typePref = 110;\n } else if (candidateType === \"srflx\") {\n typePref = 100;\n } else {\n typePref = 0;\n }\n return (\n (1 << 24) * typePref + (1 << 8) * localPref + (256 - candidateComponent)\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type PCancelable from "p-cancelable";
1
+ import { Event } from "./imports/common";
2
2
  export declare function randomString(length: number): string;
3
3
  export declare function randomTransactionId(): Buffer;
4
4
  export declare function bufferXor(a: Buffer, b: Buffer): Buffer;
@@ -9,9 +9,9 @@ export declare class PQueue<T> {
9
9
  put(v: Promise<T>): void;
10
10
  get(): Promise<T>;
11
11
  }
12
- export declare const future: (pCancel: PCancelable<any>) => {
13
- cancel: () => void;
14
- promise: PCancelable<any>;
15
- done: () => boolean;
12
+ export declare const cancelable: <T>(ex: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void, onCancel: Event<[any]>) => Promise<void>) => {
13
+ awaitable: Promise<T>;
14
+ resolve: (value: T | PromiseLike<T>) => void;
15
+ reject: (reason?: any) => void;
16
16
  };
17
- export type Future = ReturnType<typeof future>;
17
+ export type Cancelable<T> = ReturnType<typeof cancelable<T>>;
@@ -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.future = exports.PQueue = void 0;
6
+ exports.cancelable = exports.PQueue = void 0;
7
7
  exports.randomString = randomString;
8
8
  exports.randomTransactionId = randomTransactionId;
9
9
  exports.bufferXor = bufferXor;
@@ -68,20 +68,23 @@ class PQueue {
68
68
  }
69
69
  }
70
70
  exports.PQueue = PQueue;
71
- const future = (pCancel) => {
72
- const state = { done: false };
73
- const cancel = () => pCancel.cancel();
74
- const done = () => state.done;
75
- pCancel
76
- .then(() => {
77
- state.done = true;
78
- })
79
- .catch((error) => {
80
- if (error !== "cancel") {
81
- log("future", error);
82
- }
71
+ const cancelable = (ex) => {
72
+ let resolve;
73
+ let reject;
74
+ const p = new Promise((r, f) => {
75
+ resolve = r;
76
+ reject = f;
77
+ });
78
+ p.then(() => {
79
+ onCancel.execute(undefined);
80
+ onCancel.complete();
81
+ }).catch((e) => {
82
+ onCancel.execute(e ?? new Error());
83
+ onCancel.complete();
83
84
  });
84
- return { cancel, promise: pCancel, done };
85
+ const onCancel = new common_1.Event();
86
+ ex(resolve, reject, onCancel).catch(() => { });
87
+ return { awaitable: p, resolve, reject };
85
88
  };
86
- exports.future = future;
89
+ exports.cancelable = cancelable;
87
90
  //# sourceMappingURL=helper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../../ice/src/helper.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport debug from \"debug\";\nimport type PCancelable from \"p-cancelable\";\nimport { Event } from \"./imports/common\";\n\nconst log = debug(\"werift-ice:packages/ice/src/helper.ts\");\n\nexport function randomString(length: number) {\n return randomBytes(length).toString(\"hex\").substring(0, length);\n}\n\nexport function randomTransactionId() {\n return randomBytes(12);\n}\n\nexport function bufferXor(a: Buffer, b: Buffer): Buffer {\n if (a.length !== b.length) {\n throw new TypeError(\n \"[webrtc-stun] You can not XOR buffers which length are different\",\n );\n }\n\n const length = a.length;\n const buffer = Buffer.allocUnsafe(length);\n\n for (let i = 0; i < length; i++) {\n buffer[i] = a[i] ^ b[i];\n }\n\n return buffer;\n}\n\nexport function difference<T>(x: Set<T>, y: Set<T>) {\n return new Set([...x].filter((e) => !y.has(e)));\n}\n\n// infinite size queue\nexport class PQueue<T> {\n private queue: Promise<T>[] = [];\n private wait = new Event<[Promise<T>]>();\n\n put(v: Promise<T>) {\n this.queue.push(v);\n if (this.queue.length === 1) {\n this.wait.execute(v);\n }\n }\n\n get(): Promise<T> {\n const v = this.queue.shift();\n if (!v) {\n return new Promise((r) => {\n this.wait.subscribe((v) => {\n this.queue.shift();\n r(v);\n });\n });\n }\n return v!;\n }\n}\n\nexport const future = (pCancel: PCancelable<any>) => {\n const state = { done: false };\n\n const cancel = () => pCancel.cancel();\n\n const done = () => state.done;\n\n pCancel\n .then(() => {\n state.done = true;\n })\n .catch((error) => {\n if (error !== \"cancel\") {\n log(\"future\", error);\n }\n });\n\n return { cancel, promise: pCancel, done };\n};\n\nexport type Future = ReturnType<typeof future>;\n"]}
1
+ {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../../ice/src/helper.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport debug from \"debug\";\nimport { Event } from \"./imports/common\";\n\nconst log = debug(\"werift-ice:packages/ice/src/helper.ts\");\n\nexport function randomString(length: number) {\n return randomBytes(length).toString(\"hex\").substring(0, length);\n}\n\nexport function randomTransactionId() {\n return randomBytes(12);\n}\n\nexport function bufferXor(a: Buffer, b: Buffer): Buffer {\n if (a.length !== b.length) {\n throw new TypeError(\n \"[webrtc-stun] You can not XOR buffers which length are different\",\n );\n }\n\n const length = a.length;\n const buffer = Buffer.allocUnsafe(length);\n\n for (let i = 0; i < length; i++) {\n buffer[i] = a[i] ^ b[i];\n }\n\n return buffer;\n}\n\nexport function difference<T>(x: Set<T>, y: Set<T>) {\n return new Set([...x].filter((e) => !y.has(e)));\n}\n\n// infinite size queue\nexport class PQueue<T> {\n private queue: Promise<T>[] = [];\n private wait = new Event<[Promise<T>]>();\n\n put(v: Promise<T>) {\n this.queue.push(v);\n if (this.queue.length === 1) {\n this.wait.execute(v);\n }\n }\n\n get(): Promise<T> {\n const v = this.queue.shift();\n if (!v) {\n return new Promise((r) => {\n this.wait.subscribe((v) => {\n this.queue.shift();\n r(v);\n });\n });\n }\n return v!;\n }\n}\n\nexport const cancelable = <T>(\n ex: (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: any) => void,\n onCancel: Event<[any]>,\n ) => Promise<void>,\n) => {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: any) => void;\n\n const p = new Promise<T>((r, f) => {\n resolve = r;\n reject = f;\n });\n p.then(() => {\n onCancel.execute(undefined);\n onCancel.complete();\n }).catch((e) => {\n onCancel.execute(e ?? new Error());\n onCancel.complete();\n });\n\n const onCancel = new Event<[any]>();\n\n ex(resolve, reject, onCancel).catch(() => {});\n\n return { awaitable: p, resolve, reject };\n};\n\nexport type Cancelable<T> = ReturnType<typeof cancelable<T>>;\n"]}
@@ -1,50 +1,56 @@
1
- import PCancelable from "p-cancelable";
2
1
  import { Event } from "./imports/common";
3
- import type { InterfaceAddresses } from "../../common/src/network";
4
2
  import { Candidate } from "./candidate";
5
3
  import { MdnsLookup } from "./dns/lookup";
6
- import { type Future } from "./helper";
4
+ import { CandidatePair, type IceConnection, type IceOptions, type IceState } from "./iceBase";
7
5
  import { Message } from "./stun/message";
8
6
  import type { Address, Protocol } from "./types/model";
9
- export declare class Connection {
10
- iceControlling: boolean;
11
- localUserName: string;
7
+ export declare class Connection implements IceConnection {
8
+ private _iceControlling;
9
+ localUsername: string;
12
10
  localPassword: string;
11
+ remoteIsLite: boolean;
13
12
  remotePassword: string;
14
13
  remoteUsername: string;
15
- remoteIsLite: boolean;
16
14
  checkList: CandidatePair[];
17
15
  localCandidates: Candidate[];
18
16
  stunServer?: Address;
19
17
  turnServer?: Address;
20
- useIpv4: boolean;
21
- useIpv6: boolean;
22
18
  options: IceOptions;
23
19
  remoteCandidatesEnd: boolean;
24
- _localCandidatesEnd: boolean;
25
- _tieBreaker: bigint;
20
+ localCandidatesEnd: boolean;
21
+ generation: number;
22
+ userHistory: {
23
+ [username: string]: string;
24
+ };
25
+ private readonly tieBreaker;
26
26
  state: IceState;
27
27
  lookup?: MdnsLookup;
28
- restarted: boolean;
29
- readonly onData: Event<[Buffer, number]>;
30
- readonly stateChanged: Event<[IceState]>;
31
28
  private _remoteCandidates;
32
29
  nominated?: CandidatePair;
33
30
  private nominating;
34
31
  private checkListDone;
35
32
  private checkListState;
36
33
  private earlyChecks;
34
+ private earlyChecksDone;
37
35
  private localCandidatesStart;
38
36
  private protocols;
39
37
  private queryConsentHandle?;
40
38
  private promiseGatherCandidates?;
41
- constructor(iceControlling: boolean, options?: Partial<IceOptions>);
39
+ readonly onData: Event<[Buffer]>;
40
+ readonly stateChanged: Event<[IceState]>;
41
+ readonly onIceCandidate: Event<[Candidate]>;
42
+ constructor(_iceControlling: boolean, options?: Partial<IceOptions>);
43
+ get iceControlling(): boolean;
44
+ set iceControlling(value: boolean);
45
+ restart(): Promise<void>;
46
+ resetNominatedPair(): void;
42
47
  setRemoteParams({ iceLite, usernameFragment, password, }: {
43
48
  iceLite: boolean;
44
49
  usernameFragment: string;
45
50
  password: string;
46
51
  }): void;
47
- gatherCandidates(cb?: (candidate: Candidate) => void): Promise<void>;
52
+ gatherCandidates(): Promise<void>;
53
+ private ensureProtocol;
48
54
  private getCandidates;
49
55
  connect(): Promise<void>;
50
56
  private unfreezeInitial;
@@ -54,19 +60,19 @@ export declare class Connection {
54
60
  private setState;
55
61
  addRemoteCandidate(remoteCandidate: Candidate | undefined): Promise<void>;
56
62
  send: (data: Buffer) => Promise<void>;
57
- private sendTo;
58
63
  getDefaultCandidate(): Candidate;
59
- requestReceived(message: Message, addr: Address, protocol: Protocol, rawData: Buffer): void;
60
- dataReceived(data: Buffer, component: number): void;
61
64
  set remoteCandidates(value: Candidate[]);
62
65
  get remoteCandidates(): Candidate[];
63
66
  private sortCheckList;
64
67
  private findPair;
65
- private setPairState;
66
68
  private switchRole;
67
- resetNominatedPair(): void;
68
69
  private checkComplete;
69
- checkStart: (pair: CandidatePair) => PCancelable<unknown>;
70
+ checkStart: (pair: CandidatePair) => {
71
+ awaitable: Promise<void>;
72
+ resolve: (value: void | PromiseLike<void>) => void;
73
+ reject: (reason?: any) => void;
74
+ };
75
+ private addPair;
70
76
  checkIncoming(message: Message, addr: Address, protocol: Protocol): void;
71
77
  private tryPair;
72
78
  private pairLocalProtocol;
@@ -74,56 +80,3 @@ export declare class Connection {
74
80
  private buildRequest;
75
81
  private respondError;
76
82
  }
77
- export declare class CandidatePair {
78
- protocol: Protocol;
79
- remoteCandidate: Candidate;
80
- handle?: Future;
81
- nominated: boolean;
82
- remoteNominated: boolean;
83
- private _state;
84
- get state(): CandidatePairState;
85
- toJSON(): {
86
- protocol: string;
87
- remoteAddr: readonly [string, number];
88
- };
89
- constructor(protocol: Protocol, remoteCandidate: Candidate);
90
- updateState(state: CandidatePairState): void;
91
- get localCandidate(): Candidate;
92
- get remoteAddr(): Address;
93
- get component(): number;
94
- }
95
- export declare enum CandidatePairState {
96
- FROZEN = 0,
97
- WAITING = 1,
98
- IN_PROGRESS = 2,
99
- SUCCEEDED = 3,
100
- FAILED = 4
101
- }
102
- type IceState = "disconnected" | "closed" | "completed" | "new" | "connected";
103
- export interface IceOptions {
104
- stunServer?: Address;
105
- turnServer?: Address;
106
- turnUsername?: string;
107
- turnPassword?: string;
108
- turnTransport?: "udp" | "tcp";
109
- forceTurn?: boolean;
110
- useIpv4: boolean;
111
- useIpv6: boolean;
112
- portRange?: [number, number];
113
- interfaceAddresses?: InterfaceAddresses;
114
- additionalHostAddresses?: string[];
115
- filterStunResponse?: (message: Message, addr: Address, protocol: Protocol) => boolean;
116
- filterCandidatePair?: (pair: CandidatePair) => boolean;
117
- }
118
- export declare function validateRemoteCandidate(candidate: Candidate): Candidate;
119
- export declare function sortCandidatePairs(pairs: {
120
- localCandidate: Pick<Candidate, "priority">;
121
- remoteCandidate: Pick<Candidate, "priority">;
122
- }[], iceControlling: boolean): {
123
- localCandidate: Pick<Candidate, "priority">;
124
- remoteCandidate: Pick<Candidate, "priority">;
125
- }[];
126
- export declare function candidatePairPriority(local: Pick<Candidate, "priority">, remote: Pick<Candidate, "priority">, iceControlling: boolean): number;
127
- export declare function serverReflexiveCandidate(protocol: Protocol, stunServer: Address): Promise<Candidate | undefined>;
128
- export declare function validateAddress(addr?: Address): Address | undefined;
129
- export {};