werift 0.24.3 → 0.25.0-alpha.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 (168) hide show
  1. package/README.md +116 -113
  2. package/lib/common/src/event.js +2 -1
  3. package/lib/common/src/event.js.map +1 -1
  4. package/lib/common/src/transport.d.ts +22 -2
  5. package/lib/common/src/transport.js +84 -26
  6. package/lib/common/src/transport.js.map +1 -1
  7. package/lib/ice/src/exceptions.d.ts +9 -0
  8. package/lib/ice/src/exceptions.js +23 -1
  9. package/lib/ice/src/exceptions.js.map +1 -1
  10. package/lib/ice/src/ice.d.ts +40 -0
  11. package/lib/ice/src/ice.js +194 -28
  12. package/lib/ice/src/ice.js.map +1 -1
  13. package/lib/ice/src/iceBase.d.ts +26 -0
  14. package/lib/ice/src/iceBase.js.map +1 -1
  15. package/lib/ice/src/stun/const.d.ts +7 -0
  16. package/lib/ice/src/stun/const.js +8 -0
  17. package/lib/ice/src/stun/const.js.map +1 -1
  18. package/lib/ice/src/stun/protocol.js +1 -4
  19. package/lib/ice/src/stun/protocol.js.map +1 -1
  20. package/lib/ice/src/stun/tcpProtocol.d.ts +7 -1
  21. package/lib/ice/src/stun/tcpProtocol.js +65 -14
  22. package/lib/ice/src/stun/tcpProtocol.js.map +1 -1
  23. package/lib/ice/src/stun/transaction.d.ts +12 -1
  24. package/lib/ice/src/stun/transaction.js +37 -4
  25. package/lib/ice/src/stun/transaction.js.map +1 -1
  26. package/lib/ice/src/turn/protocol.d.ts +79 -22
  27. package/lib/ice/src/turn/protocol.js +282 -78
  28. package/lib/ice/src/turn/protocol.js.map +1 -1
  29. package/lib/ice/src/types/model.d.ts +8 -0
  30. package/lib/ice/src/types/model.js.map +1 -1
  31. package/lib/index.mjs +5646 -3451
  32. package/lib/nonstandard/index.mjs +287 -1004
  33. package/lib/polyfill/dom.mjs +23794 -0
  34. package/lib/polyfill/index.mjs +23794 -0
  35. package/lib/rtp/src/extra/container/mp4/container.js +12 -4
  36. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  37. package/lib/rtp/src/extra/processor/mp4.js +8 -3
  38. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  39. package/lib/rtp/src/extra/processor/mp4Callback.js +3 -1
  40. package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
  41. package/lib/sctp/src/chunk.d.ts +5 -0
  42. package/lib/sctp/src/chunk.js +16 -11
  43. package/lib/sctp/src/chunk.js.map +1 -1
  44. package/lib/sctp/src/index.d.ts +3 -1
  45. package/lib/sctp/src/index.js +10 -1
  46. package/lib/sctp/src/index.js.map +1 -1
  47. package/lib/sctp/src/sctp.d.ts +12 -3
  48. package/lib/sctp/src/sctp.js +51 -18
  49. package/lib/sctp/src/sctp.js.map +1 -1
  50. package/lib/webrtc/src/const.js +2 -0
  51. package/lib/webrtc/src/const.js.map +1 -1
  52. package/lib/webrtc/src/errors.d.ts +9 -1
  53. package/lib/webrtc/src/errors.js +19 -0
  54. package/lib/webrtc/src/errors.js.map +1 -1
  55. package/lib/webrtc/src/media/codec.d.ts +5 -0
  56. package/lib/webrtc/src/media/codec.js +21 -0
  57. package/lib/webrtc/src/media/codec.js.map +1 -1
  58. package/lib/webrtc/src/media/codecCompatibility.d.ts +23 -0
  59. package/lib/webrtc/src/media/codecCompatibility.js +138 -0
  60. package/lib/webrtc/src/media/codecCompatibility.js.map +1 -0
  61. package/lib/webrtc/src/media/index.d.ts +1 -0
  62. package/lib/webrtc/src/media/index.js +1 -0
  63. package/lib/webrtc/src/media/index.js.map +1 -1
  64. package/lib/webrtc/src/media/router.d.ts +2 -0
  65. package/lib/webrtc/src/media/router.js +23 -3
  66. package/lib/webrtc/src/media/router.js.map +1 -1
  67. package/lib/webrtc/src/media/rtpReceiver.d.ts +12 -0
  68. package/lib/webrtc/src/media/rtpReceiver.js +35 -0
  69. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  70. package/lib/webrtc/src/media/rtpSender.d.ts +65 -4
  71. package/lib/webrtc/src/media/rtpSender.js +264 -35
  72. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  73. package/lib/webrtc/src/media/rtpTransceiver.d.ts +42 -0
  74. package/lib/webrtc/src/media/rtpTransceiver.js +157 -4
  75. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  76. package/lib/webrtc/src/media/track.d.ts +29 -1
  77. package/lib/webrtc/src/media/track.js +164 -5
  78. package/lib/webrtc/src/media/track.js.map +1 -1
  79. package/lib/webrtc/src/nonstandard/index.d.ts +0 -1
  80. package/lib/webrtc/src/nonstandard/index.js +0 -1
  81. package/lib/webrtc/src/nonstandard/index.js.map +1 -1
  82. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -1
  83. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  84. package/lib/webrtc/src/nonstandard/userMedia.d.ts +1 -2
  85. package/lib/webrtc/src/nonstandard/userMedia.js +30 -14
  86. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  87. package/lib/webrtc/src/peerConnection.d.ts +127 -5
  88. package/lib/webrtc/src/peerConnection.js +629 -143
  89. package/lib/webrtc/src/peerConnection.js.map +1 -1
  90. package/lib/webrtc/src/polyfill/api.d.ts +14 -0
  91. package/lib/webrtc/src/polyfill/api.js +23 -0
  92. package/lib/webrtc/src/polyfill/api.js.map +1 -0
  93. package/lib/webrtc/src/polyfill/browserIdentity.d.ts +11 -0
  94. package/lib/webrtc/src/polyfill/browserIdentity.js +59 -0
  95. package/lib/webrtc/src/polyfill/browserIdentity.js.map +1 -0
  96. package/lib/webrtc/src/polyfill/dom.d.ts +11 -0
  97. package/lib/webrtc/src/polyfill/dom.js +18 -0
  98. package/lib/webrtc/src/polyfill/dom.js.map +1 -0
  99. package/lib/webrtc/src/polyfill/existingMediaDevices.d.ts +2 -0
  100. package/lib/webrtc/src/polyfill/existingMediaDevices.js +22 -0
  101. package/lib/webrtc/src/polyfill/existingMediaDevices.js.map +1 -0
  102. package/lib/webrtc/src/polyfill/globals.d.ts +28 -0
  103. package/lib/webrtc/src/polyfill/globals.js +3 -0
  104. package/lib/webrtc/src/polyfill/globals.js.map +1 -0
  105. package/lib/webrtc/src/polyfill/index.d.ts +2 -0
  106. package/lib/webrtc/src/polyfill/index.js +19 -0
  107. package/lib/webrtc/src/polyfill/index.js.map +1 -0
  108. package/lib/webrtc/src/polyfill/install.d.ts +13 -0
  109. package/lib/webrtc/src/polyfill/install.js +266 -0
  110. package/lib/webrtc/src/polyfill/install.js.map +1 -0
  111. package/lib/webrtc/src/polyfill/mediaDevices.d.ts +38 -0
  112. package/lib/webrtc/src/polyfill/mediaDevices.js +228 -0
  113. package/lib/webrtc/src/polyfill/mediaDevices.js.map +1 -0
  114. package/lib/webrtc/src/polyfill/mediaRegister.d.ts +51 -0
  115. package/lib/webrtc/src/polyfill/mediaRegister.js +14 -0
  116. package/lib/webrtc/src/polyfill/mediaRegister.js.map +1 -0
  117. package/lib/webrtc/src/polyfill/peerConnectionConfig.d.ts +3 -0
  118. package/lib/webrtc/src/polyfill/peerConnectionConfig.js +52 -0
  119. package/lib/webrtc/src/polyfill/peerConnectionConfig.js.map +1 -0
  120. package/lib/webrtc/src/polyfill/registers/callback.d.ts +16 -0
  121. package/lib/webrtc/src/polyfill/registers/callback.js +57 -0
  122. package/lib/webrtc/src/polyfill/registers/callback.js.map +1 -0
  123. package/lib/webrtc/src/polyfill/registers/empty.d.ts +2 -0
  124. package/lib/webrtc/src/polyfill/registers/empty.js +28 -0
  125. package/lib/webrtc/src/polyfill/registers/empty.js.map +1 -0
  126. package/lib/webrtc/src/polyfill/registers/mp4Webm.d.ts +36 -0
  127. package/lib/webrtc/src/polyfill/registers/mp4Webm.js +242 -0
  128. package/lib/webrtc/src/polyfill/registers/mp4Webm.js.map +1 -0
  129. package/lib/webrtc/src/polyfill/registers/rtpRtcp.d.ts +17 -0
  130. package/lib/webrtc/src/polyfill/registers/rtpRtcp.js +143 -0
  131. package/lib/webrtc/src/polyfill/registers/rtpRtcp.js.map +1 -0
  132. package/lib/webrtc/src/polyfill/rtcSessionDescription.d.ts +18 -0
  133. package/lib/webrtc/src/polyfill/rtcSessionDescription.js +36 -0
  134. package/lib/webrtc/src/polyfill/rtcSessionDescription.js.map +1 -0
  135. package/lib/webrtc/src/polyfill/rtpCodec.d.ts +17 -0
  136. package/lib/webrtc/src/polyfill/rtpCodec.js +93 -0
  137. package/lib/webrtc/src/polyfill/rtpCodec.js.map +1 -0
  138. package/lib/webrtc/src/polyfill/selectSettings.d.ts +31 -0
  139. package/lib/webrtc/src/polyfill/selectSettings.js +156 -0
  140. package/lib/webrtc/src/polyfill/selectSettings.js.map +1 -0
  141. package/lib/webrtc/src/polyfill/sourceIo.d.ts +21 -0
  142. package/lib/webrtc/src/polyfill/sourceIo.js +298 -0
  143. package/lib/webrtc/src/polyfill/sourceIo.js.map +1 -0
  144. package/lib/webrtc/src/polyfill/trackStop.d.ts +4 -0
  145. package/lib/webrtc/src/polyfill/trackStop.js +16 -0
  146. package/lib/webrtc/src/polyfill/trackStop.js.map +1 -0
  147. package/lib/webrtc/src/sctpManager.d.ts +2 -1
  148. package/lib/webrtc/src/sctpManager.js +5 -2
  149. package/lib/webrtc/src/sctpManager.js.map +1 -1
  150. package/lib/webrtc/src/sdp.d.ts +1 -1
  151. package/lib/webrtc/src/sdp.js +5 -6
  152. package/lib/webrtc/src/sdp.js.map +1 -1
  153. package/lib/webrtc/src/sdpManager.d.ts +38 -1
  154. package/lib/webrtc/src/sdpManager.js +236 -30
  155. package/lib/webrtc/src/sdpManager.js.map +1 -1
  156. package/lib/webrtc/src/secureTransportManager.d.ts +43 -12
  157. package/lib/webrtc/src/secureTransportManager.js +123 -47
  158. package/lib/webrtc/src/secureTransportManager.js.map +1 -1
  159. package/lib/webrtc/src/transceiverManager.d.ts +91 -6
  160. package/lib/webrtc/src/transceiverManager.js +477 -62
  161. package/lib/webrtc/src/transceiverManager.js.map +1 -1
  162. package/lib/webrtc/src/transport/ice.d.ts +8 -0
  163. package/lib/webrtc/src/transport/ice.js +17 -1
  164. package/lib/webrtc/src/transport/ice.js.map +1 -1
  165. package/lib/webrtc/src/transport/sctp.d.ts +3 -2
  166. package/lib/webrtc/src/transport/sctp.js +8 -2
  167. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  168. package/package.json +14 -3
@@ -1 +1 @@
1
- {"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../ice/src/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { isIPv4 } from \"net\";\n\nimport * as timers from \"node:timers/promises\";\nimport { type Address, Event, debug } from \"./imports/common\";\n\nimport {\n Candidate,\n candidateFoundation,\n candidatePriority,\n remoteTcpTypeForIncoming,\n} from \"./candidate\";\nimport { MdnsLookup } from \"./dns/lookup\";\nimport type { TransactionError } from \"./exceptions\";\nimport { type Cancelable, PQueue, cancelable, randomString } from \"./helper\";\nimport {\n CONSENT_INTERVAL,\n CONSENT_TIMEOUT,\n CandidatePair,\n CandidatePairState,\n ICE_COMPLETED,\n ICE_FAILED,\n type IceConnection,\n type IceOptions,\n type IceState,\n consentResponseTimeoutMs,\n defaultOptions,\n serverReflexiveCandidate,\n sortCandidatePairs,\n validateAddress,\n validateRemoteCandidate,\n} from \"./iceBase\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { TcpActiveProtocol, TcpPassiveProtocol } from \"./stun/tcpProtocol\";\nimport { createStunOverTurnClient } from \"./turn/protocol\";\nimport type { Protocol } from \"./types/model\";\nimport { getHostAddresses } from \"./utils\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport class Connection implements IceConnection {\n localUsername = randomString(4);\n localPassword = randomString(22);\n remoteIsLite = false;\n remotePassword: string = \"\";\n remoteUsername: string = \"\";\n checkList: CandidatePair[] = [];\n localCandidates: Candidate[] = [];\n stunServer?: Address;\n turnServer?: Address;\n options: IceOptions;\n remoteCandidatesEnd = false;\n localCandidatesEnd = false;\n generation = -1;\n userHistory: { [username: string]: string } = {};\n private readonly tieBreaker: bigint = randomBytes(8).readBigUInt64BE(0);\n state: IceState = \"new\";\n lookup?: MdnsLookup;\n\n private _remoteCandidates: Candidate[] = [];\n // P2P接続完了したソケット\n nominated?: CandidatePair;\n private nominating = false;\n private checkListDone = false;\n private checkListState = new PQueue<number>();\n private earlyChecks: [Message, Address, Protocol][] = [];\n private earlyChecksDone = false;\n private localCandidatesStart = false;\n private protocols: Protocol[] = [];\n private queryConsentHandle?: Cancelable<void>;\n /** RFC 7675 consent-to-send: application data may use the selected pair. */\n private consentFresh = false;\n /** Invalidates in-flight consent callbacks on restart / close / replace / expire. */\n private consentSessionId = 0;\n private consentExpiryTimer?: ReturnType<typeof setTimeout>;\n private consentRequestAbort?: AbortController;\n\n readonly onData = new Event<[Buffer]>();\n readonly stateChanged = new Event<[IceState]>();\n readonly onIceCandidate: Event<[Candidate]> = new Event();\n\n constructor(\n private _iceControlling: boolean,\n options?: Partial<IceOptions>,\n ) {\n this.options = {\n ...defaultOptions,\n ...options,\n };\n if (this.iceLite) {\n this._iceControlling = false;\n }\n const { stunServer, turnServer } = this.options;\n this.stunServer = validateAddress(stunServer) ?? [\n \"stun.l.google.com\",\n 19302,\n ];\n this.turnServer = validateAddress(turnServer);\n this.restart();\n log(\"new Connection\", this.options);\n }\n\n get iceControlling() {\n return this._iceControlling;\n }\n\n set iceControlling(value: boolean) {\n if (this.iceLite) {\n value = false;\n }\n // While a pair is selected, keep the negotiated role. ICE restart clears\n // `nominated`, so offer/answer role and RFC 8445 role-conflict repair can\n // reassign controlling/controlled for the new generation.\n if (this.nominated) {\n return;\n }\n this.applyIceControlling(value);\n }\n\n get iceLite() {\n return this.options.iceLite;\n }\n\n async restart() {\n this.generation++;\n\n this.localUsername = randomString(4);\n this.localPassword = randomString(22);\n if (this.options.localPasswordPrefix) {\n this.localPassword =\n this.options.localPasswordPrefix +\n this.localPassword.slice(this.options.localPasswordPrefix.length);\n }\n this.userHistory[this.localUsername] = this.localPassword;\n\n this.remoteUsername = \"\";\n this.remotePassword = \"\";\n this.localCandidates = [];\n this._remoteCandidates = [];\n this.remoteCandidatesEnd = false;\n this.localCandidatesEnd = false;\n this.state = \"new\";\n this.lookup?.close?.();\n this.lookup = undefined;\n this.nominated = undefined;\n this.nominating = false;\n this.checkList = [];\n this.checkListDone = false;\n this.checkListState = new PQueue<number>();\n this.earlyChecks = [];\n this.earlyChecksDone = false;\n this.localCandidatesStart = false;\n\n // protocolsはincomingのearlyCheckに使うかもしれないので残す\n for (const protocol of this.protocols) {\n if (protocol.localCandidate) {\n protocol.localCandidate.refreshId();\n protocol.localCandidate.generation = this.generation;\n protocol.localCandidate.ufrag = this.localUsername;\n }\n }\n\n // Tear down consent timers/transactions; new credentials require a new session.\n this.stopConsentLifecycle();\n }\n\n resetNominatedPair() {\n log(\"resetNominatedPair\");\n this.nominated = undefined;\n this.nominating = false;\n // Drop old pair's consent timers/transactions; restarted when a new pair is nominated.\n this.stopConsentLifecycle();\n }\n\n setRemoteParams({\n iceLite,\n usernameFragment,\n password,\n }: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }) {\n log(\"setRemoteParams\", { iceLite, usernameFragment, password });\n this.remoteIsLite = iceLite;\n this.remoteUsername = usernameFragment;\n this.remotePassword = password;\n }\n\n // 4.1.1 Gathering Candidates\n async gatherCandidates() {\n if (!this.localCandidatesStart) {\n this.localCandidatesStart = true;\n\n // ICE restart keeps transport protocols; re-advertise their host candidates\n // with the new generation / ufrag before gathering additional addresses.\n for (const protocol of this.protocols) {\n if (protocol.localCandidate) {\n protocol.localCandidate.generation = this.generation;\n protocol.localCandidate.ufrag = this.localUsername;\n this.appendLocalCandidate(protocol.localCandidate);\n }\n }\n\n let address = getHostAddresses(\n this.options.useIpv4,\n this.options.useIpv6,\n {\n useLinkLocalAddress: this.options.useLinkLocalAddress,\n },\n );\n const { interfaceAddresses } = this.options;\n if (interfaceAddresses) {\n const filteredAddresses = address.filter((check) =>\n Object.values(interfaceAddresses).includes(check),\n );\n if (filteredAddresses.length) {\n address = filteredAddresses;\n }\n }\n if (this.options.additionalHostAddresses) {\n address = Array.from(\n new Set([...this.options.additionalHostAddresses, ...address]),\n );\n }\n\n const candidatePromises = this.getCandidatePromises(address, 5);\n await Promise.allSettled(candidatePromises);\n\n this.localCandidatesEnd = true;\n }\n this.setState(\"completed\");\n }\n\n private appendLocalCandidate(candidate: Candidate) {\n this.localCandidates.push(candidate);\n this.onIceCandidate.execute(candidate);\n }\n\n private ensureProtocol(protocol: Protocol) {\n protocol.onRequestReceived.subscribe((msg, addr, data) => {\n if (msg.messageMethod !== methods.BINDING) {\n this.respondError(msg, addr, protocol, [400, \"Bad Request\"]);\n return;\n }\n\n const txUsername = msg.getAttributeValue(\"USERNAME\");\n // 相手にとってのremoteは自分にとってのlocal\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n const localPassword =\n this.userHistory[localUsername] ?? this.localPassword;\n\n const { iceControlling } = this;\n\n // 7.2.1.1. Detecting and Repairing Role Conflicts\n if (iceControlling && msg.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n if (this.tieBreaker >= msg.getAttributeValue(\"ICE-CONTROLLING\")) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(false);\n }\n } else if (\n !iceControlling &&\n msg.attributesKeys.includes(\"ICE-CONTROLLED\")\n ) {\n if (\n this.iceLite ||\n this.tieBreaker < msg.getAttributeValue(\"ICE-CONTROLLED\")\n ) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(true);\n return;\n }\n }\n\n if (\n this.options.filterStunResponse &&\n !this.options.filterStunResponse(msg, addr, protocol)\n ) {\n return;\n }\n\n // # send binding response\n const response = new Message(\n methods.BINDING,\n classes.RESPONSE,\n msg.transactionId,\n );\n\n response\n .setAttribute(\"XOR-MAPPED-ADDRESS\", addr)\n .addMessageIntegrity(Buffer.from(localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n\n if (this.checkList.length === 0 && !this.earlyChecksDone) {\n this.earlyChecks.push([msg, addr, protocol]);\n } else {\n this.checkIncoming(msg, addr, protocol);\n }\n });\n protocol.onDataReceived.subscribe((data) => {\n try {\n // Update statistics for the nominated pair\n const activePair = this.nominated;\n if (activePair && activePair.protocol === protocol) {\n activePair.packetsReceived++;\n activePair.bytesReceived += data.length;\n }\n\n this.onData.execute(data);\n } catch (error) {\n log(\"dataReceived\", error);\n }\n });\n }\n\n private getCandidatePromises(addresses: string[], timeout = 5) {\n const candidatePromises: Promise<unknown>[] = [];\n const { stunServer, turnServer } = this;\n const { turnUsername, turnPassword } = this.options;\n const gatherIceLite = this.iceLite;\n const gatherRelayOnly =\n !gatherIceLite &&\n this.options.forceTurn &&\n turnServer &&\n turnUsername &&\n turnPassword;\n\n addresses = addresses.filter((address) => {\n // ice restartで同じアドレスが追加されるのを防ぐ\n if (this.protocols.find((protocol) => protocol.localIp === address)) {\n return false;\n }\n return true;\n });\n\n const localStunPromises = gatherRelayOnly\n ? []\n : addresses.map(async (address) => {\n // # create transport\n const protocol = new StunProtocol();\n this.ensureProtocol(protocol);\n try {\n await protocol.connectionMade(\n isIPv4(address),\n this.options.portRange,\n this.options.interfaceAddresses,\n );\n\n protocol.localIp = address;\n this.protocols.push(protocol);\n\n log(\"protocol\", protocol.localIp);\n\n // # add host candidate\n const candidateAddress: Address = [\n address,\n protocol.getExtraInfo()[1],\n ];\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"host\", { transport: \"udp\" }),\n candidateAddress[0],\n candidateAddress[1],\n \"host\",\n undefined,\n undefined,\n undefined,\n this.generation,\n this.localUsername,\n );\n\n this.pairLocalProtocol(protocol);\n this.appendLocalCandidate(protocol.localCandidate);\n\n return protocol;\n } catch (error) {\n log(\"error protocol STUN\", error);\n }\n });\n\n if (!gatherRelayOnly) {\n candidatePromises.push(\n ...localStunPromises.map((localPromise) =>\n localPromise.then((protocol) => protocol?.localCandidate),\n ),\n );\n }\n\n if (!gatherRelayOnly && this.options.useTcp) {\n const tcpCandidatePromises = addresses.map(async (address) => {\n const passiveProtocol = new TcpPassiveProtocol();\n this.ensureProtocol(passiveProtocol);\n await passiveProtocol.connectionMade(address, this.options.portRange);\n passiveProtocol.localIp = address;\n passiveProtocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"tcp\", address),\n 1,\n \"tcp\",\n candidatePriority(\"host\", {\n transport: \"tcp\",\n tcptype: \"passive\",\n }),\n address,\n passiveProtocol.listeningPort,\n \"host\",\n undefined,\n undefined,\n \"passive\",\n this.generation,\n this.localUsername,\n );\n this.protocols.push(passiveProtocol);\n this.appendLocalCandidate(passiveProtocol.localCandidate);\n\n if (!gatherIceLite) {\n const activeProtocol = new TcpActiveProtocol();\n this.ensureProtocol(activeProtocol);\n await activeProtocol.connectionMade(address);\n activeProtocol.localIp = address;\n activeProtocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"tcp\", address),\n 1,\n \"tcp\",\n candidatePriority(\"host\", {\n transport: \"tcp\",\n tcptype: \"active\",\n }),\n address,\n 9,\n \"host\",\n undefined,\n undefined,\n \"active\",\n this.generation,\n this.localUsername,\n );\n this.protocols.push(activeProtocol);\n this.pairLocalProtocol(activeProtocol);\n this.appendLocalCandidate(activeProtocol.localCandidate);\n }\n });\n\n candidatePromises.push(...tcpCandidatePromises);\n }\n\n if (!gatherIceLite && !gatherRelayOnly && stunServer) {\n const stunCandidatePromises = localStunPromises.map(\n async (protocolPromise) => {\n const protocol = await protocolPromise;\n if (!protocol) return;\n\n const stunCandidatePromise = new Promise<Candidate | void>(\n async (r, f) => {\n const timer = setTimeout(f, timeout * 1000);\n if (\n protocol.localCandidate?.host &&\n isIPv4(protocol.localCandidate?.host)\n ) {\n const candidate = await serverReflexiveCandidate(\n protocol,\n stunServer,\n ).catch((error) => {\n log(\"error\", error);\n });\n if (candidate) {\n this.appendLocalCandidate(candidate);\n }\n\n clearTimeout(timer);\n r(candidate);\n } else {\n clearTimeout(timer);\n r();\n }\n },\n ).catch((error) => {\n log(\"query STUN server\", error);\n });\n\n return stunCandidatePromise;\n },\n );\n\n candidatePromises.push(...stunCandidatePromises);\n }\n\n if (!gatherIceLite && turnServer && turnUsername && turnPassword) {\n const turnCandidatePromise = (async () => {\n const turnTransport = this.options.turnTransport ?? \"udp\";\n const protocol = await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: turnTransport,\n tlsOptions: this.options.turnTlsOptions,\n },\n ).catch(async (e) => {\n if (turnTransport === \"udp\") {\n return await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: \"tcp\",\n },\n );\n } else {\n throw e;\n }\n });\n this.ensureProtocol(protocol);\n this.protocols.push(protocol);\n\n const candidateAddress = protocol.turn.relayedAddress;\n const relatedAddress = protocol.turn.mappedAddress;\n\n log(\"turn candidateAddress\", candidateAddress);\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"relay\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"relay\"),\n candidateAddress[0],\n candidateAddress[1],\n \"relay\",\n relatedAddress[0],\n relatedAddress[1],\n undefined,\n this.generation,\n this.localUsername,\n );\n this.appendLocalCandidate(protocol.localCandidate);\n\n return protocol.localCandidate;\n })().catch((error) => {\n log(\"query TURN server\", error);\n });\n\n candidatePromises.push(turnCandidatePromise);\n }\n\n return candidatePromises;\n }\n\n async connect() {\n // \"\"\"\n // Perform ICE handshake.\n //\n // This coroutine returns if a candidate pair was successfully nominated\n // and raises an exception otherwise.\n // \"\"\"\n log(\"start connect ice\");\n if (!this.localCandidatesEnd) {\n if (!this.localCandidatesStart) {\n throw new Error(\"Local candidates gathering was not performed\");\n }\n }\n if (!this.remoteUsername || !this.remotePassword) {\n throw new Error(\"Remote username or password is missing\");\n }\n\n // # 5.7.1. Forming Candidate Pairs\n for (const c of this.remoteCandidates) {\n this.pairRemoteCandidate(c);\n }\n this.sortCheckList();\n\n if (!this.iceLite) {\n this.unfreezeInitial();\n }\n\n log(\"earlyChecks\", this.localPassword, this.earlyChecks.length);\n // # handle early checks\n for (const earlyCheck of this.earlyChecks) {\n this.checkIncoming(...earlyCheck);\n }\n this.earlyChecks = [];\n this.earlyChecksDone = true;\n\n if (this.iceLite) {\n if (!this.nominated) {\n let res: number = ICE_FAILED;\n while (!this.checkListDone && this.state !== \"closed\") {\n res = await this.checkListState.get();\n log(\"checkListState\", res);\n if (res === ICE_COMPLETED) {\n break;\n }\n }\n\n if (res !== ICE_COMPLETED && !this.nominated) {\n throw new Error(\"ICE negotiation failed\");\n }\n }\n\n this.setState(\"connected\");\n return;\n }\n\n // # perform checks\n // 5.8. Scheduling Checks\n for (;;) {\n if (this.state === \"closed\") break;\n if (!this.schedulingChecks()) break;\n await timers.setTimeout(20);\n }\n\n // # wait for completion\n let res: number = ICE_FAILED;\n while (this.checkList.length > 0 && res === ICE_FAILED) {\n res = await this.checkListState.get();\n log(\"checkListState\", res);\n }\n\n // # cancel remaining checks\n for (const check of this.checkList) {\n check.handle?.resolve?.();\n }\n\n if (res !== ICE_COMPLETED) {\n throw new Error(\"ICE negotiation failed\");\n }\n\n // # start consent freshness tests\n this.queryConsent();\n\n this.setState(\"connected\");\n }\n\n private unfreezeInitial() {\n // # unfreeze first pair for the first component\n const [firstPair] = this.checkList;\n if (!firstPair) return;\n if (firstPair.state === CandidatePairState.FROZEN) {\n firstPair.updateState(CandidatePairState.WAITING);\n }\n\n // # unfreeze pairs with same component but different foundations\n const seenFoundations = new Set(firstPair.localCandidate.foundation);\n for (const pair of this.checkList) {\n if (\n pair.component === firstPair.component &&\n !seenFoundations.has(pair.localCandidate.foundation) &&\n pair.state === CandidatePairState.FROZEN\n ) {\n pair.updateState(CandidatePairState.WAITING);\n seenFoundations.add(pair.localCandidate.foundation);\n }\n }\n }\n\n // 5.8 Scheduling Checks\n private schedulingChecks() {\n // Ordinary Check\n {\n // # find the highest-priority pair that is in the waiting state\n const pair = this.checkList\n .filter((pair) => {\n if (\n this.options.forceTurn &&\n pair.protocol.type === StunProtocol.type\n )\n return false;\n return true;\n })\n .find((pair) => pair.state === CandidatePairState.WAITING);\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n {\n // # find the highest-priority pair that is in the frozen state\n const pair = this.checkList.find(\n (pair) => pair.state === CandidatePairState.FROZEN,\n );\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n // # if we expect more candidates, keep going\n if (!this.remoteCandidatesEnd) {\n return !this.checkListDone;\n }\n\n return false;\n }\n\n /**\n * Stop consent request cadence, expiry timer, and outstanding transactions.\n * Does not change ICE state by itself.\n */\n private stopConsentLifecycle() {\n this.consentSessionId++;\n this.consentFresh = false;\n if (this.consentExpiryTimer !== undefined) {\n clearTimeout(this.consentExpiryTimer);\n this.consentExpiryTimer = undefined;\n }\n this.consentRequestAbort?.abort();\n this.consentRequestAbort = undefined;\n const handle = this.queryConsentHandle;\n this.queryConsentHandle = undefined;\n // Resolve after clearing the field so a stale onCancel cannot wipe a replacement.\n handle?.resolve?.();\n }\n\n /**\n * ICE-lite interop only (not required by RFC 7675): mirror libwebrtc\n * semi-aggressive nomination — attach USE-CANDIDATE when we are controlling,\n * the remote is ICE-lite, and the target is the current selected pair.\n */\n private shouldNominateConsentRequest(pair: CandidatePair): boolean {\n return (\n this.iceControlling && this.remoteIsLite && this.nominated?.id === pair.id\n );\n }\n\n private canSendApplicationData(): boolean {\n if (!this.nominated) {\n return false;\n }\n if (this.state === \"closed\" || this.state === \"failed\") {\n return false;\n }\n // Local ICE-lite does not run consent checks; full agents need fresh consent.\n if (this.iceLite) {\n return true;\n }\n return this.consentFresh;\n }\n\n private abortableDelay(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n return;\n }\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n // RFC 7675 consent freshness\n private queryConsent = () => {\n if (this.iceLite) {\n return;\n }\n\n // Invalidate any previous consent session before starting a new one.\n this.stopConsentLifecycle();\n const sessionId = this.consentSessionId;\n this.consentFresh = true;\n\n const handle = cancelable<void>(async (_, __, onCancel) => {\n let canceled = false;\n const cancelEvent = new AbortController();\n\n const clearConsentExpiry = () => {\n if (this.consentExpiryTimer === undefined) {\n return;\n }\n clearTimeout(this.consentExpiryTimer);\n this.consentExpiryTimer = undefined;\n };\n\n const refreshConsentExpiry = () => {\n // Only the active session may refresh the shared expiry timer.\n if (canceled || sessionId !== this.consentSessionId) {\n return;\n }\n clearConsentExpiry();\n this.consentExpiryTimer = setTimeout(() => {\n this.consentExpiryTimer = undefined;\n if (canceled || sessionId !== this.consentSessionId) {\n return;\n }\n if (this.state === \"closed\" || this.state === \"failed\") {\n return;\n }\n log(\"Consent to send expired\");\n // Expire independently of request cadence / failure count (RFC 7675).\n this.consentFresh = false;\n this.consentSessionId++;\n this.consentRequestAbort?.abort();\n this.consentRequestAbort = undefined;\n if (this.queryConsentHandle === handle) {\n this.queryConsentHandle = undefined;\n }\n canceled = true;\n cancelEvent.abort();\n // Transport stays available for ICE restart; explicit close() uses \"closed\".\n this.setState(\"failed\");\n }, CONSENT_TIMEOUT * 1000);\n };\n\n onCancel.once(() => {\n canceled = true;\n // Avoid clearing a replacement session's timer/handle.\n if (sessionId === this.consentSessionId) {\n clearConsentExpiry();\n this.consentRequestAbort?.abort();\n this.consentRequestAbort = undefined;\n }\n cancelEvent.abort();\n if (this.queryConsentHandle === handle) {\n this.queryConsentHandle = undefined;\n }\n });\n\n // Initial ICE check success is the first valid consent response.\n refreshConsentExpiry();\n\n const randomizedConsentInterval = () =>\n CONSENT_INTERVAL * (0.8 + 0.4 * Math.random()) * 1000;\n\n // Cadence is measured between request *starts*, not response completions.\n let nextConsentAt = Date.now() + randomizedConsentInterval();\n const isTerminalState = () =>\n this.state === \"closed\" || this.state === \"failed\";\n\n try {\n while (\n !isTerminalState() &&\n !canceled &&\n sessionId === this.consentSessionId\n ) {\n await this.abortableDelay(\n Math.max(0, nextConsentAt - Date.now()),\n cancelEvent.signal,\n );\n\n if (\n canceled ||\n isTerminalState() ||\n sessionId !== this.consentSessionId\n ) {\n break;\n }\n\n // Fix next start time before awaiting any response (independent timers).\n nextConsentAt = Date.now() + randomizedConsentInterval();\n\n const nominated = this.nominated;\n if (!nominated) {\n break;\n }\n\n const pairId = nominated.id;\n const generation = this.generation;\n const remotePassword = this.remotePassword;\n const { localUsername, remoteUsername, iceControlling } = this;\n\n const request = this.buildRequest({\n nominate: this.shouldNominateConsentRequest(nominated),\n localUsername,\n remoteUsername,\n iceControlling,\n localCandidate: nominated.localCandidate,\n });\n\n this.consentRequestAbort?.abort();\n const requestAbort = new AbortController();\n this.consentRequestAbort = requestAbort;\n\n nominated.consentRequestsSent++;\n nominated.requestsSent++;\n\n // RTT-aware wait (floor 500ms); independent of retransmissions: 0.\n const responseTimeout = consentResponseTimeoutMs(nominated.rtt);\n const requestStartedAt = performance.now();\n\n // Do not await here: response wait must not stretch the 4–6s cadence.\n nominated.protocol\n .request(\n request,\n nominated.remoteAddr,\n Buffer.from(remotePassword, \"utf8\"),\n {\n retransmissions: 0,\n responseTimeout,\n signal: requestAbort.signal,\n onRequestSent: (attempt) => {\n if (attempt > 0) {\n nominated.retransmissionsSent++;\n }\n },\n },\n )\n .then(() => {\n // Accept only responses for the current pair / generation / session.\n // Address / MESSAGE-INTEGRITY / response class are enforced in Transaction + protocol.\n if (sessionId !== this.consentSessionId || canceled) {\n return;\n }\n const state = this.state;\n if (state === \"closed\" || state === \"failed\") {\n return;\n }\n if (this.nominated?.id !== pairId) {\n return;\n }\n if (this.generation !== generation) {\n return;\n }\n if (this.remotePassword !== remotePassword) {\n return;\n }\n\n const rtt = (performance.now() - requestStartedAt) / 1000; // seconds\n nominated.rtt = rtt;\n nominated.totalRoundTripTime += rtt;\n nominated.roundTripTimeMeasurements++;\n\n nominated.responsesReceived++;\n this.consentFresh = true;\n refreshConsentExpiry();\n if (state === \"disconnected\") {\n this.setState(\"connected\");\n }\n })\n .catch((error) => {\n // Individual request loss is expected; keep monitoring (RFC 7675).\n if (\n sessionId === this.consentSessionId &&\n this.nominated?.id === pairId\n ) {\n log(\"no stun response\", error);\n }\n });\n }\n } catch (error) {\n // Abort during delay is normal on cancel / expire.\n } finally {\n if (sessionId === this.consentSessionId) {\n clearConsentExpiry();\n }\n }\n });\n this.queryConsentHandle = handle;\n };\n\n async close() {\n // \"\"\"\n // Close the connection.\n // \"\"\"\n\n this.setState(\"closed\");\n\n // # stop consent freshness tests\n this.stopConsentLifecycle();\n\n // # stop check list\n if (this.checkList && !this.checkListDone) {\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n\n this.nominated = undefined;\n for (const protocol of this.protocols) {\n if (protocol.close) {\n await protocol.close();\n }\n }\n\n this.protocols = [];\n this.localCandidates = [];\n\n this.lookup?.close?.();\n this.lookup = undefined;\n }\n\n private setState(state: IceState) {\n this.state = state;\n this.stateChanged.execute(state);\n }\n\n async addRemoteCandidate(remoteCandidate: Candidate | undefined) {\n // \"\"\"\n // Add a remote candidate or signal end-of-candidates.\n\n // To signal end-of-candidates, pass `None`.\n\n // :param remote_candidate: A :class:`Candidate` instance or `None`.\n // \"\"\"\n\n if (!remoteCandidate) {\n this.remoteCandidatesEnd = true;\n return;\n }\n\n if (remoteCandidate.host.includes(\".local\")) {\n try {\n if (!this.lookup) {\n this.lookup = new MdnsLookup();\n }\n const host = await this.lookup.lookup(remoteCandidate.host);\n remoteCandidate.host = host;\n } catch (error) {\n return;\n }\n }\n\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n return;\n }\n\n log(\"addRemoteCandidate\", remoteCandidate);\n this._remoteCandidates.push(remoteCandidate);\n\n this.pairRemoteCandidate(remoteCandidate);\n this.sortCheckList();\n }\n\n send = async (data: Buffer) => {\n // RFC 7675: after consent expiry, do not send application data on the 5-tuple.\n if (!this.canSendApplicationData()) {\n return;\n }\n const activePair = this.nominated!;\n await activePair.protocol.sendData(data, activePair.remoteAddr);\n\n // Update statistics\n activePair.packetsSent++;\n activePair.bytesSent += data.length;\n };\n\n getDefaultCandidate() {\n const candidates = this.localCandidates.sort(\n (a, b) => a.priority - b.priority,\n );\n const [candidate] = candidates;\n return candidate;\n }\n\n // for test only\n set remoteCandidates(value: Candidate[]) {\n if (this.remoteCandidatesEnd)\n throw new Error(\"Cannot set remote candidates after end-of-candidates.\");\n this._remoteCandidates = [];\n for (const remoteCandidate of value) {\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n continue;\n }\n this._remoteCandidates.push(remoteCandidate);\n }\n\n this.remoteCandidatesEnd = true;\n }\n get remoteCandidates() {\n return this._remoteCandidates;\n }\n\n get candidatePairs() {\n return this.checkList;\n }\n\n private sortCheckList() {\n sortCandidatePairs(this.checkList, this.iceControlling);\n }\n\n private findPair(protocol: Protocol, remoteCandidate: Candidate) {\n const pair = this.checkList.find(\n (pair) =>\n pair.protocol === protocol && pair.remoteCandidate === remoteCandidate,\n );\n return pair;\n }\n\n private applyIceControlling(iceControlling: boolean) {\n this._iceControlling = iceControlling;\n for (const pair of this.checkList) {\n pair.iceControlling = iceControlling;\n }\n }\n\n private switchRole(iceControlling: boolean) {\n log(\"switch role\", iceControlling);\n // Role conflicts must be repaired even after a prior generation or while\n // connectivity checks are in flight (RFC 8445 §7.2.5.1 / §7.3.1.1).\n if (this.iceLite) {\n iceControlling = false;\n }\n this.applyIceControlling(iceControlling);\n this.sortCheckList();\n }\n\n private checkComplete(pair: CandidatePair) {\n pair.handle = undefined;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n // Updating the Nominated Flag\n\n // https://www.rfc-editor.org/rfc/rfc8445#section-7.3.1.5,\n // Once the nominated flag is set for a component of a data stream, it\n // concludes the ICE processing for that component. See Section 8.\n // So disallow overwriting of the pair nominated for that component\n if (\n pair.nominated &&\n // remoteのgenerationをチェックする.localのgenerationは更新が間に合わないかもしれないのでチェックしない\n (pair.remoteCandidate.generation != undefined\n ? pair.remoteCandidate.generation === this.generation\n : true) &&\n this.nominated == undefined\n ) {\n log(\"nominated\", pair.toJSON());\n this.nominated = pair;\n this.nominating = false;\n this.pruneTcpConnections(pair);\n\n // After resetNominatedPair / renomination while already connected,\n // restart consent freshness on the new selected pair.\n if (\n !this.iceLite &&\n (this.state === \"connected\" || this.state === \"completed\")\n ) {\n this.queryConsent();\n }\n\n // 8.1.2. Updating States\n\n // The agent MUST remove all Waiting and Frozen pairs in the check\n // list and triggered check queue for the same component as the\n // nominated pairs for that media stream.\n for (const p of this.checkList) {\n if (\n p.component === pair.component &&\n [CandidatePairState.WAITING, CandidatePairState.FROZEN].includes(\n p.state,\n )\n ) {\n p.updateState(CandidatePairState.FAILED);\n }\n }\n }\n\n // Once there is at least one nominated pair in the valid list for\n // every component of at least one media stream and the state of the\n // check list is Running:\n if (this.nominated) {\n if (!this.checkListDone) {\n log(\"ICE completed\");\n this.checkListState.put(new Promise((r) => r(ICE_COMPLETED)));\n this.checkListDone = true;\n }\n return;\n }\n\n log(\"not completed\", pair.toJSON());\n\n // 7.1.3.2.3. Updating Pair States\n for (const p of this.checkList) {\n if (\n p.localCandidate.foundation === pair.localCandidate.foundation &&\n p.state === CandidatePairState.FROZEN\n ) {\n p.updateState(CandidatePairState.WAITING);\n }\n }\n }\n\n {\n const list = [CandidatePairState.SUCCEEDED, CandidatePairState.FAILED];\n if (this.checkList.find(({ state }) => !list.includes(state))) {\n return;\n }\n }\n\n if (!this.iceControlling) {\n const target = CandidatePairState.SUCCEEDED;\n if (this.checkList.find(({ state }) => state === target)) {\n return;\n }\n }\n\n if (!this.checkListDone) {\n log(\"ICE failed\");\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n }\n\n // 3. Terminology : Check\n checkStart = (pair: CandidatePair) =>\n cancelable<void>(async (r) => {\n // \"\"\"\n // Starts a check.\n // \"\"\"\n\n log(\"check start\", pair.toJSON());\n\n pair.updateState(CandidatePairState.IN_PROGRESS);\n const result: { response?: Message; addr?: Address } = {};\n const { remotePassword, remoteUsername, generation } = this;\n const localUsername = pair.localCandidate.ufrag ?? this.localUsername;\n\n const nominate = this.iceControlling && !this.remoteIsLite;\n const request = this.buildRequest({\n nominate,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n localCandidate: pair.localCandidate,\n });\n\n // Record start time for RTT calculation\n const startTime = performance.now();\n\n try {\n pair.requestsSent++;\n const [response, addr] = await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(remotePassword, \"utf8\"),\n pair.localCandidate.transport.toLowerCase() === \"tcp\" ? 0 : 4,\n (attempt) => {\n if (attempt > 0) {\n pair.retransmissionsSent++;\n }\n },\n );\n pair.responsesReceived++;\n\n // Calculate RTT\n const endTime = performance.now();\n const rtt = (endTime - startTime) / 1000; // Convert to seconds\n\n // Update RTT statistics\n pair.rtt = rtt;\n pair.totalRoundTripTime += rtt;\n pair.roundTripTimeMeasurements++;\n\n log(\"response received\", request.toJSON(), response.toJSON(), addr, {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n rtt,\n });\n result.response = response;\n result.addr = addr;\n } catch (error: any) {\n const exc: TransactionError = error;\n // 7.1.3.1. Failure Cases\n log(\n \"failure case\",\n request.toJSON(),\n exc.response ? JSON.stringify(exc.response.toJSON(), null, 2) : error,\n {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n },\n pair.remoteAddr,\n );\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 487) {\n if (request.attributesKeys.includes(\"ICE-CONTROLLED\")) {\n this.switchRole(true);\n } else if (request.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n this.switchRole(false);\n }\n await this.checkStart(pair).awaitable;\n r();\n return;\n }\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 401) {\n log(\"retry 401\", pair.toJSON());\n await this.checkStart(pair).awaitable;\n r();\n return;\n } else {\n // timeout\n log(\"checkStart CandidatePairState.FAILED\", pair.toJSON());\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n }\n\n // # check remote address matches\n if (\n result.addr[0] !== pair.remoteAddr[0] ||\n result.addr[1] !== pair.remoteAddr[1]\n ) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n\n // # success\n if (nominate || pair.remoteNominated) {\n // # nominated by agressive nomination or the remote party\n pair.nominated = true;\n } else if (this.iceControlling && !this.nominating) {\n // # perform regular nomination\n this.nominating = true;\n const request = this.buildRequest({\n nominate: true,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n localCandidate: pair.localCandidate,\n });\n try {\n pair.requestsSent++;\n await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n pair.localCandidate.transport.toLowerCase() === \"tcp\" ? 0 : 4,\n (attempt) => {\n if (attempt > 0) {\n pair.retransmissionsSent++;\n }\n },\n );\n pair.responsesReceived++;\n } catch (error) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n return;\n }\n pair.nominated = true;\n }\n\n pair.updateState(CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n r();\n });\n\n private addPair(pair: CandidatePair) {\n this.checkList.push(pair);\n this.sortCheckList();\n }\n\n // 7.2. STUN Server Procedures\n // 7.2.1.3、7.2.1.4、および7.2.1.5\n checkIncoming(message: Message, addr: Address, protocol: Protocol) {\n // \"\"\"\n // Handle a successful incoming check.\n // \"\"\"\n\n const txUsername = message.getAttributeValue(\"USERNAME\");\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n\n // find remote candidate\n let remoteCandidate: Candidate | undefined;\n const [host, port] = addr;\n for (const c of this.remoteCandidates) {\n if (c.host === host && c.port === port) {\n remoteCandidate = c;\n break;\n }\n }\n if (!remoteCandidate) {\n // 7.2.1.3. Learning Peer Reflexive Candidates\n remoteCandidate = new Candidate(\n randomString(10),\n 1,\n protocol.localCandidate?.transport ?? \"udp\",\n message.getAttributeValue(\"PRIORITY\"),\n host,\n port,\n \"prflx\",\n undefined,\n undefined,\n protocol.localCandidate?.transport === \"tcp\"\n ? remoteTcpTypeForIncoming(protocol.localCandidate.tcptype)\n : undefined,\n undefined,\n undefined,\n );\n this._remoteCandidates.push(remoteCandidate);\n }\n\n // find pair\n let pair = this.findPair(protocol, remoteCandidate);\n if (!pair) {\n pair = new CandidatePair(protocol, remoteCandidate, this.iceControlling);\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n pair.noteIncomingRequest(message.transactionIdHex);\n pair.requestsReceived++;\n pair.responsesSent++;\n pair.localCandidate.ufrag = localUsername;\n\n log(\"Triggered Checks\", message.toJSON(), pair.toJSON(), {\n localUsername: this.localUsername,\n remoteUsername: this.remoteUsername,\n localPassword: this.localPassword,\n remotePassword: this.remotePassword,\n generation: this.generation,\n });\n\n if (this.iceLite) {\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n pair.nominated = true;\n pair.updateState(CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n }\n return;\n }\n\n // 7.2.1.4. Triggered Checks\n if (\n [CandidatePairState.WAITING, CandidatePairState.FAILED].includes(\n pair.state,\n )\n ) {\n pair.handle = this.checkStart(pair);\n }\n\n // 7.2.1.5. Updating the Nominated Flag\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n pair.nominated = true;\n this.checkComplete(pair);\n }\n }\n }\n\n private tryPair(protocol: Protocol, remoteCandidate: Candidate) {\n if (\n protocol.localCandidate?.canPairWith(remoteCandidate) &&\n !(\n protocol.localCandidate.transport.toLowerCase() === \"tcp\" &&\n protocol.localCandidate.tcptype === \"passive\" &&\n remoteCandidate.type !== \"prflx\"\n ) &&\n !this.findPair(protocol, remoteCandidate)\n ) {\n const pair = new CandidatePair(\n protocol,\n remoteCandidate,\n this.iceControlling,\n );\n if (\n this.options.filterCandidatePair &&\n !this.options.filterCandidatePair(pair)\n ) {\n return;\n }\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n }\n\n private pairLocalProtocol(protocol: Protocol) {\n for (const remoteCandidate of this.remoteCandidates) {\n this.tryPair(protocol, remoteCandidate);\n }\n }\n\n private pairRemoteCandidate = (remoteCandidate: Candidate) => {\n for (const protocol of this.protocols) {\n this.tryPair(protocol, remoteCandidate);\n }\n };\n\n private buildRequest({\n nominate,\n remoteUsername,\n localUsername,\n iceControlling,\n localCandidate,\n }: {\n nominate: boolean;\n remoteUsername: string;\n localUsername: string;\n iceControlling: boolean;\n localCandidate?: Candidate;\n }) {\n const txUsername = encodeTxUsername({ remoteUsername, localUsername });\n const request = new Message(methods.BINDING, classes.REQUEST);\n request.setAttribute(\"USERNAME\", txUsername).setAttribute(\n \"PRIORITY\",\n candidatePriority(\"prflx\", {\n transport: localCandidate?.transport,\n tcptype: localCandidate?.tcptype,\n }),\n );\n if (iceControlling) {\n request.setAttribute(\"ICE-CONTROLLING\", this.tieBreaker);\n if (nominate) {\n request.setAttribute(\"USE-CANDIDATE\", null);\n }\n } else {\n request.setAttribute(\"ICE-CONTROLLED\", this.tieBreaker);\n }\n return request;\n }\n\n private pruneTcpConnections(selectedPair: CandidatePair) {\n for (const protocol of this.protocols) {\n if (protocol.localCandidate?.transport.toLowerCase() !== \"tcp\") {\n continue;\n }\n\n if (\n \"pruneForSelection\" in protocol &&\n typeof protocol.pruneForSelection === \"function\"\n ) {\n void protocol.pruneForSelection(\n protocol === selectedPair.protocol\n ? selectedPair.remoteAddr\n : undefined,\n );\n }\n }\n }\n\n private respondError(\n request: Message,\n addr: Address,\n protocol: Protocol,\n errorCode: [number, string],\n ) {\n const response = new Message(\n request.messageMethod,\n classes.ERROR,\n request.transactionId,\n );\n response\n .setAttribute(\"ERROR-CODE\", errorCode)\n .addMessageIntegrity(Buffer.from(this.localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n }\n}\n\nconst encodeTxUsername = ({\n remoteUsername,\n localUsername,\n}: {\n remoteUsername: string;\n localUsername: string;\n}) => {\n return `${remoteUsername}:${localUsername}`;\n};\n\nconst decodeTxUsername = (txUsername: string) => {\n const [remoteUsername, localUsername] = txUsername.split(\":\");\n return { remoteUsername, localUsername };\n};\n"]}
1
+ {"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../ice/src/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { isIPv4 } from \"net\";\n\nimport * as timers from \"node:timers/promises\";\nimport { type Address, Event, debug } from \"./imports/common\";\n\nimport {\n Candidate,\n candidateFoundation,\n candidatePriority,\n remoteTcpTypeForIncoming,\n} from \"./candidate\";\nimport { MdnsLookup } from \"./dns/lookup\";\nimport type { TransactionError } from \"./exceptions\";\nimport { type Cancelable, PQueue, cancelable, randomString } from \"./helper\";\nimport {\n CONSENT_INTERVAL,\n CONSENT_TIMEOUT,\n CandidatePair,\n CandidatePairState,\n ICE_COMPLETED,\n ICE_FAILED,\n type IceConnection,\n type IceOptions,\n type IceState,\n consentResponseTimeoutMs,\n defaultOptions,\n serverReflexiveCandidate,\n sortCandidatePairs,\n validateAddress,\n validateRemoteCandidate,\n} from \"./iceBase\";\nimport { TCP_CHECK_RESPONSE_TIMEOUT_MS, classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { TcpActiveProtocol, TcpPassiveProtocol } from \"./stun/tcpProtocol\";\nimport { createStunOverTurnClient } from \"./turn/protocol\";\nimport type { Protocol, TransactionRequestOptions } from \"./types/model\";\nimport { getHostAddresses } from \"./utils\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\n/** Fallback STUN server when none is configured (constructor / setIceServers). */\nconst DEFAULT_STUN_SERVER: Address = [\"stun.l.google.com\", 19302];\n\nexport class Connection implements IceConnection {\n localUsername = randomString(4);\n localPassword = randomString(22);\n remoteIsLite = false;\n remotePassword: string = \"\";\n remoteUsername: string = \"\";\n checkList: CandidatePair[] = [];\n localCandidates: Candidate[] = [];\n stunServer?: Address;\n turnServer?: Address;\n options: IceOptions;\n remoteCandidatesEnd = false;\n localCandidatesEnd = false;\n generation = -1;\n userHistory: { [username: string]: string } = {};\n private readonly tieBreaker: bigint = randomBytes(8).readBigUInt64BE(0);\n state: IceState = \"new\";\n lookup?: MdnsLookup;\n\n private _remoteCandidates: Candidate[] = [];\n // P2P接続完了したソケット\n nominated?: CandidatePair;\n private nominating = false;\n private checkListDone = false;\n private checkListState = new PQueue<number>();\n private earlyChecks: [Message, Address, Protocol][] = [];\n private earlyChecksDone = false;\n private localCandidatesStart = false;\n private protocols: Protocol[] = [];\n private queryConsentHandle?: Cancelable<void>;\n /** RFC 7675 consent-to-send: application data may use the selected pair. */\n private consentFresh = false;\n /** Invalidates in-flight consent callbacks on restart / close / replace / expire. */\n private consentSessionId = 0;\n private consentExpiryTimer?: ReturnType<typeof setTimeout>;\n private consentRequestAbort?: AbortController;\n\n readonly onData = new Event<[Buffer]>();\n readonly stateChanged = new Event<[IceState]>();\n readonly onIceCandidate: Event<[Candidate]> = new Event();\n\n constructor(\n private _iceControlling: boolean,\n options?: Partial<IceOptions>,\n ) {\n this.options = {\n ...defaultOptions,\n ...options,\n };\n if (this.iceLite) {\n this._iceControlling = false;\n }\n this.applyStunTurnServersFromOptions();\n this.restart();\n log(\"new Connection\", this.options);\n }\n\n /**\n * Replace STUN/TURN servers after construction.\n * Server-related fields are replaced (not partial-merged) so that removing\n * TURN clears residual credentials. W3C setConfiguration replaces the ICE\n * server list rather than merging additively.\n *\n * Used when servers are learned after the gatherer was built (e.g. WHIP\n * Link headers) and must take effect before the next gather pass.\n */\n setIceServers(options: Partial<IceOptions>) {\n // Explicitly assign server fields even when undefined so a STUN-only\n // update cannot leave a previous TURN host/credential in options.\n this.options = {\n ...this.options,\n stunServer: options.stunServer,\n turnServer: options.turnServer,\n turnUsername: options.turnUsername,\n turnPassword: options.turnPassword,\n turnTransport: options.turnTransport,\n };\n if (options.forceTurn !== undefined) {\n this.options.forceTurn = options.forceTurn;\n }\n if (options.useTcp !== undefined) {\n this.options.useTcp = options.useTcp;\n }\n if (options.turnTlsOptions !== undefined) {\n this.options.turnTlsOptions = options.turnTlsOptions;\n }\n if (options.turnUdpFamily !== undefined) {\n this.options.turnUdpFamily = options.turnUdpFamily;\n }\n\n this.applyStunTurnServersFromOptions();\n log(\"Connection ice servers updated\", this.options);\n }\n\n /**\n * Derive Connection.stunServer / turnServer from this.options.\n * Shared by the constructor and setIceServers so both paths validate and\n * default identically.\n */\n private applyStunTurnServersFromOptions() {\n this.stunServer =\n validateAddress(this.options.stunServer) ?? DEFAULT_STUN_SERVER;\n this.turnServer = validateAddress(this.options.turnServer);\n }\n\n get iceControlling() {\n return this._iceControlling;\n }\n\n set iceControlling(value: boolean) {\n if (this.iceLite) {\n value = false;\n }\n // While a pair is selected, keep the negotiated role. ICE restart clears\n // `nominated`, so offer/answer role and RFC 8445 role-conflict repair can\n // reassign controlling/controlled for the new generation.\n if (this.nominated) {\n return;\n }\n this.applyIceControlling(value);\n }\n\n get iceLite() {\n return this.options.iceLite;\n }\n\n async restart() {\n this.generation++;\n\n this.localUsername = randomString(4);\n this.localPassword = randomString(22);\n if (this.options.localPasswordPrefix) {\n this.localPassword =\n this.options.localPasswordPrefix +\n this.localPassword.slice(this.options.localPasswordPrefix.length);\n }\n this.userHistory[this.localUsername] = this.localPassword;\n\n this.remoteUsername = \"\";\n this.remotePassword = \"\";\n this.localCandidates = [];\n this._remoteCandidates = [];\n this.remoteCandidatesEnd = false;\n this.localCandidatesEnd = false;\n this.state = \"new\";\n this.lookup?.close?.();\n this.lookup = undefined;\n this.nominated = undefined;\n this.nominating = false;\n this.checkList = [];\n this.checkListDone = false;\n this.checkListState = new PQueue<number>();\n this.earlyChecks = [];\n this.earlyChecksDone = false;\n this.localCandidatesStart = false;\n\n // protocolsはincomingのearlyCheckに使うかもしれないので残す\n for (const protocol of this.protocols) {\n if (protocol.localCandidate) {\n protocol.localCandidate.refreshId();\n protocol.localCandidate.generation = this.generation;\n protocol.localCandidate.ufrag = this.localUsername;\n }\n }\n\n // Tear down consent timers/transactions; new credentials require a new session.\n this.stopConsentLifecycle();\n }\n\n resetNominatedPair() {\n log(\"resetNominatedPair\");\n this.nominated = undefined;\n this.nominating = false;\n // Drop old pair's consent timers/transactions; restarted when a new pair is nominated.\n this.stopConsentLifecycle();\n }\n\n setRemoteParams({\n iceLite,\n usernameFragment,\n password,\n }: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }) {\n log(\"setRemoteParams\", { iceLite, usernameFragment, password });\n this.remoteIsLite = iceLite;\n this.remoteUsername = usernameFragment;\n this.remotePassword = password;\n }\n\n // 4.1.1 Gathering Candidates\n async gatherCandidates() {\n if (!this.localCandidatesStart) {\n this.localCandidatesStart = true;\n\n // ICE restart keeps transport protocols; re-advertise their host candidates\n // with the new generation / ufrag before gathering additional addresses.\n for (const protocol of this.protocols) {\n if (protocol.localCandidate) {\n protocol.localCandidate.generation = this.generation;\n protocol.localCandidate.ufrag = this.localUsername;\n this.appendLocalCandidate(protocol.localCandidate);\n }\n }\n\n let address = getHostAddresses(\n this.options.useIpv4,\n this.options.useIpv6,\n {\n useLinkLocalAddress: this.options.useLinkLocalAddress,\n },\n );\n const { interfaceAddresses } = this.options;\n if (interfaceAddresses) {\n const filteredAddresses = address.filter((check) =>\n Object.values(interfaceAddresses).includes(check),\n );\n if (filteredAddresses.length) {\n address = filteredAddresses;\n }\n }\n if (this.options.additionalHostAddresses) {\n address = Array.from(\n new Set([...this.options.additionalHostAddresses, ...address]),\n );\n }\n\n const candidatePromises = this.getCandidatePromises(\n address,\n this.options.stunGatherTimeout,\n );\n await Promise.allSettled(candidatePromises);\n\n this.localCandidatesEnd = true;\n }\n this.setState(\"completed\");\n }\n\n private appendLocalCandidate(candidate: Candidate) {\n this.localCandidates.push(candidate);\n this.onIceCandidate.execute(candidate);\n }\n\n private ensureProtocol(protocol: Protocol) {\n protocol.onRequestReceived.subscribe((msg, addr, data) => {\n if (msg.messageMethod !== methods.BINDING) {\n this.respondError(msg, addr, protocol, [400, \"Bad Request\"]);\n return;\n }\n\n const txUsername = msg.getAttributeValue(\"USERNAME\");\n // 相手にとってのremoteは自分にとってのlocal\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n const localPassword =\n this.userHistory[localUsername] ?? this.localPassword;\n\n const { iceControlling } = this;\n\n // 7.2.1.1. Detecting and Repairing Role Conflicts\n if (iceControlling && msg.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n if (this.tieBreaker >= msg.getAttributeValue(\"ICE-CONTROLLING\")) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(false);\n }\n } else if (\n !iceControlling &&\n msg.attributesKeys.includes(\"ICE-CONTROLLED\")\n ) {\n if (\n this.iceLite ||\n this.tieBreaker < msg.getAttributeValue(\"ICE-CONTROLLED\")\n ) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(true);\n return;\n }\n }\n\n if (\n this.options.filterStunResponse &&\n !this.options.filterStunResponse(msg, addr, protocol)\n ) {\n return;\n }\n\n // # send binding response\n const response = new Message(\n methods.BINDING,\n classes.RESPONSE,\n msg.transactionId,\n );\n\n response\n .setAttribute(\"XOR-MAPPED-ADDRESS\", addr)\n .addMessageIntegrity(Buffer.from(localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n\n if (this.checkList.length === 0 && !this.earlyChecksDone) {\n this.earlyChecks.push([msg, addr, protocol]);\n } else {\n this.checkIncoming(msg, addr, protocol);\n }\n });\n protocol.onDataReceived.subscribe((data) => {\n try {\n // Update statistics for the nominated pair\n const activePair = this.nominated;\n if (activePair && activePair.protocol === protocol) {\n activePair.packetsReceived++;\n activePair.bytesReceived += data.length;\n }\n\n this.onData.execute(data);\n } catch (error) {\n log(\"dataReceived\", error);\n }\n });\n protocol.onConnectionClosed?.subscribe((remoteAddr) => {\n this.handleConnectionClosed(protocol, remoteAddr);\n });\n }\n\n /**\n * RFC 6544: the selected TCP connection is the only path for this component;\n * once it is closed no application data or consent check can reach the peer,\n * so fail the same way as a consent expiry instead of waiting for it.\n */\n private handleConnectionClosed(protocol: Protocol, remoteAddr: Address) {\n const nominated = this.nominated;\n if (\n !nominated ||\n nominated.protocol !== protocol ||\n nominated.remoteAddr[0] !== remoteAddr[0] ||\n nominated.remoteAddr[1] !== remoteAddr[1]\n ) {\n return;\n }\n if (this.state === \"closed\" || this.state === \"failed\") {\n return;\n }\n log(\"selected tcp connection closed\", nominated.toJSON());\n this.stopConsentLifecycle();\n this.setState(\"failed\");\n }\n\n private getCandidatePromises(addresses: string[], timeout = 5) {\n const candidatePromises: Promise<unknown>[] = [];\n const { stunServer, turnServer } = this;\n const { turnUsername, turnPassword } = this.options;\n const gatherIceLite = this.iceLite;\n const gatherRelayOnly =\n !gatherIceLite &&\n this.options.forceTurn &&\n turnServer &&\n turnUsername &&\n turnPassword;\n\n addresses = addresses.filter((address) => {\n // ice restartで同じアドレスが追加されるのを防ぐ\n if (this.protocols.find((protocol) => protocol.localIp === address)) {\n return false;\n }\n return true;\n });\n\n const localStunPromises = gatherRelayOnly\n ? []\n : addresses.map(async (address) => {\n // # create transport\n const protocol = new StunProtocol();\n this.ensureProtocol(protocol);\n try {\n await protocol.connectionMade(\n isIPv4(address),\n this.options.portRange,\n this.options.interfaceAddresses,\n );\n\n protocol.localIp = address;\n this.protocols.push(protocol);\n\n log(\"protocol\", protocol.localIp);\n\n // # add host candidate\n const candidateAddress: Address = [\n address,\n protocol.getExtraInfo()[1],\n ];\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"host\", { transport: \"udp\" }),\n candidateAddress[0],\n candidateAddress[1],\n \"host\",\n undefined,\n undefined,\n undefined,\n this.generation,\n this.localUsername,\n );\n\n this.pairLocalProtocol(protocol);\n this.appendLocalCandidate(protocol.localCandidate);\n\n return protocol;\n } catch (error) {\n log(\"error protocol STUN\", error);\n }\n });\n\n if (!gatherRelayOnly) {\n candidatePromises.push(\n ...localStunPromises.map((localPromise) =>\n localPromise.then((protocol) => protocol?.localCandidate),\n ),\n );\n }\n\n if (!gatherRelayOnly && this.options.useTcp) {\n const tcpCandidatePromises = addresses.map(async (address) => {\n // Passive candidates open a listening TCP server; skip them when the\n // agent only makes outbound connections (tcpPassive === false). Active\n // candidates below still dial out, so direct TCP egress is unaffected.\n if (this.options.tcpPassive !== false) {\n const passiveProtocol = new TcpPassiveProtocol();\n this.ensureProtocol(passiveProtocol);\n await passiveProtocol.connectionMade(address, this.options.portRange);\n passiveProtocol.localIp = address;\n passiveProtocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"tcp\", address),\n 1,\n \"tcp\",\n candidatePriority(\"host\", {\n transport: \"tcp\",\n tcptype: \"passive\",\n }),\n address,\n passiveProtocol.listeningPort,\n \"host\",\n undefined,\n undefined,\n \"passive\",\n this.generation,\n this.localUsername,\n );\n this.protocols.push(passiveProtocol);\n this.appendLocalCandidate(passiveProtocol.localCandidate);\n }\n\n if (!gatherIceLite) {\n const activeProtocol = new TcpActiveProtocol();\n this.ensureProtocol(activeProtocol);\n await activeProtocol.connectionMade(address);\n activeProtocol.localIp = address;\n activeProtocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"tcp\", address),\n 1,\n \"tcp\",\n candidatePriority(\"host\", {\n transport: \"tcp\",\n tcptype: \"active\",\n }),\n address,\n 9,\n \"host\",\n undefined,\n undefined,\n \"active\",\n this.generation,\n this.localUsername,\n );\n this.protocols.push(activeProtocol);\n this.pairLocalProtocol(activeProtocol);\n this.appendLocalCandidate(activeProtocol.localCandidate);\n }\n });\n\n candidatePromises.push(...tcpCandidatePromises);\n }\n\n if (!gatherIceLite && !gatherRelayOnly && stunServer) {\n const stunCandidatePromises = localStunPromises.map(\n async (protocolPromise) => {\n const protocol = await protocolPromise;\n if (!protocol) return;\n\n const stunCandidatePromise = new Promise<Candidate | void>(\n async (r, f) => {\n const timer = setTimeout(f, timeout * 1000);\n if (\n protocol.localCandidate?.host &&\n isIPv4(protocol.localCandidate?.host)\n ) {\n const candidate = await serverReflexiveCandidate(\n protocol,\n stunServer,\n ).catch((error) => {\n log(\"error\", error);\n });\n if (candidate) {\n this.appendLocalCandidate(candidate);\n }\n\n clearTimeout(timer);\n r(candidate);\n } else {\n clearTimeout(timer);\n r();\n }\n },\n ).catch((error) => {\n log(\"query STUN server\", error);\n });\n\n return stunCandidatePromise;\n },\n );\n\n candidatePromises.push(...stunCandidatePromises);\n }\n\n if (!gatherIceLite && turnServer && turnUsername && turnPassword) {\n const turnCandidatePromise = (async () => {\n const turnTransport = this.options.turnTransport ?? \"udp\";\n const protocol = await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: turnTransport,\n tlsOptions: this.options.turnTlsOptions,\n connectTimeoutMs: (this.options.turnConnectTimeout ?? 8) * 1000,\n udpFamily: this.options.turnUdpFamily,\n },\n ).catch(async (e) => {\n if (turnTransport === \"udp\") {\n return await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: \"tcp\",\n connectTimeoutMs: (this.options.turnConnectTimeout ?? 8) * 1000,\n },\n );\n } else {\n throw e;\n }\n });\n this.ensureProtocol(protocol);\n this.protocols.push(protocol);\n\n const candidateAddress = protocol.turn.relayedAddress;\n const relatedAddress = protocol.turn.mappedAddress;\n\n log(\"turn candidateAddress\", candidateAddress);\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"relay\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"relay\"),\n candidateAddress[0],\n candidateAddress[1],\n \"relay\",\n relatedAddress[0],\n relatedAddress[1],\n undefined,\n this.generation,\n this.localUsername,\n );\n this.appendLocalCandidate(protocol.localCandidate);\n\n return protocol.localCandidate;\n })().catch((error) => {\n log(\"query TURN server\", error);\n });\n\n candidatePromises.push(turnCandidatePromise);\n }\n\n return candidatePromises;\n }\n\n async connect() {\n // \"\"\"\n // Perform ICE handshake.\n //\n // This coroutine returns if a candidate pair was successfully nominated\n // and raises an exception otherwise.\n // \"\"\"\n log(\"start connect ice\");\n if (!this.localCandidatesEnd) {\n if (!this.localCandidatesStart) {\n throw new Error(\"Local candidates gathering was not performed\");\n }\n }\n if (!this.remoteUsername || !this.remotePassword) {\n throw new Error(\"Remote username or password is missing\");\n }\n\n // # 5.7.1. Forming Candidate Pairs\n for (const c of this.remoteCandidates) {\n this.pairRemoteCandidate(c);\n }\n this.sortCheckList();\n\n if (!this.iceLite) {\n this.unfreezeInitial();\n }\n\n log(\"earlyChecks\", this.localPassword, this.earlyChecks.length);\n // # handle early checks\n for (const earlyCheck of this.earlyChecks) {\n this.checkIncoming(...earlyCheck);\n }\n this.earlyChecks = [];\n this.earlyChecksDone = true;\n\n if (this.iceLite) {\n if (!this.nominated) {\n let res: number = ICE_FAILED;\n while (!this.checkListDone && this.state !== \"closed\") {\n res = await this.checkListState.get();\n log(\"checkListState\", res);\n if (res === ICE_COMPLETED) {\n break;\n }\n }\n\n if (res !== ICE_COMPLETED && !this.nominated) {\n throw new Error(\"ICE negotiation failed\");\n }\n }\n\n this.setState(\"connected\");\n return;\n }\n\n // # perform checks\n // 5.8. Scheduling Checks\n for (;;) {\n if (this.state === \"closed\") break;\n if (!this.schedulingChecks()) break;\n await timers.setTimeout(20);\n }\n\n // # wait for completion\n let res: number = ICE_FAILED;\n while (this.checkList.length > 0 && res === ICE_FAILED) {\n res = await this.checkListState.get();\n log(\"checkListState\", res);\n }\n\n // # cancel remaining checks\n for (const check of this.checkList) {\n check.handle?.resolve?.();\n }\n\n if (res !== ICE_COMPLETED) {\n throw new Error(\"ICE negotiation failed\");\n }\n\n // # start consent freshness tests\n this.queryConsent();\n\n this.setState(\"connected\");\n }\n\n private unfreezeInitial() {\n // # unfreeze first pair for the first component\n const [firstPair] = this.checkList;\n if (!firstPair) return;\n if (firstPair.state === CandidatePairState.FROZEN) {\n firstPair.updateState(CandidatePairState.WAITING);\n }\n\n // # unfreeze pairs with same component but different foundations\n const seenFoundations = new Set(firstPair.localCandidate.foundation);\n for (const pair of this.checkList) {\n if (\n pair.component === firstPair.component &&\n !seenFoundations.has(pair.localCandidate.foundation) &&\n pair.state === CandidatePairState.FROZEN\n ) {\n pair.updateState(CandidatePairState.WAITING);\n seenFoundations.add(pair.localCandidate.foundation);\n }\n }\n }\n\n // 5.8 Scheduling Checks\n private schedulingChecks() {\n // Ordinary Check\n {\n // # find the highest-priority pair that is in the waiting state\n const pair = this.checkList\n .filter((pair) => {\n if (\n this.options.forceTurn &&\n pair.protocol.type === StunProtocol.type\n )\n return false;\n return true;\n })\n .find((pair) => pair.state === CandidatePairState.WAITING);\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n {\n // # find the highest-priority pair that is in the frozen state\n const pair = this.checkList.find(\n (pair) => pair.state === CandidatePairState.FROZEN,\n );\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n // # if we expect more candidates, keep going\n if (!this.remoteCandidatesEnd) {\n return !this.checkListDone;\n }\n\n return false;\n }\n\n /**\n * Stop consent request cadence, expiry timer, and outstanding transactions.\n * Does not change ICE state by itself.\n */\n private stopConsentLifecycle() {\n this.consentSessionId++;\n this.consentFresh = false;\n if (this.consentExpiryTimer !== undefined) {\n clearTimeout(this.consentExpiryTimer);\n this.consentExpiryTimer = undefined;\n }\n this.consentRequestAbort?.abort();\n this.consentRequestAbort = undefined;\n const handle = this.queryConsentHandle;\n this.queryConsentHandle = undefined;\n // Resolve after clearing the field so a stale onCancel cannot wipe a replacement.\n handle?.resolve?.();\n }\n\n /**\n * ICE-lite interop only (not required by RFC 7675): mirror libwebrtc\n * semi-aggressive nomination — attach USE-CANDIDATE when we are controlling,\n * the remote is ICE-lite, and the target is the current selected pair.\n */\n private shouldNominateConsentRequest(pair: CandidatePair): boolean {\n return (\n this.iceControlling && this.remoteIsLite && this.nominated?.id === pair.id\n );\n }\n\n private canSendApplicationData(): boolean {\n if (!this.nominated) {\n return false;\n }\n if (this.state === \"closed\" || this.state === \"failed\") {\n return false;\n }\n // Local ICE-lite does not run consent checks; full agents need fresh consent.\n if (this.iceLite) {\n return true;\n }\n return this.consentFresh;\n }\n\n private abortableDelay(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n return;\n }\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n // RFC 7675 consent freshness\n private queryConsent = () => {\n if (this.iceLite) {\n return;\n }\n\n // Invalidate any previous consent session before starting a new one.\n this.stopConsentLifecycle();\n const sessionId = this.consentSessionId;\n this.consentFresh = true;\n\n const handle = cancelable<void>(async (_, __, onCancel) => {\n let canceled = false;\n const cancelEvent = new AbortController();\n\n const clearConsentExpiry = () => {\n if (this.consentExpiryTimer === undefined) {\n return;\n }\n clearTimeout(this.consentExpiryTimer);\n this.consentExpiryTimer = undefined;\n };\n\n const refreshConsentExpiry = () => {\n // Only the active session may refresh the shared expiry timer.\n if (canceled || sessionId !== this.consentSessionId) {\n return;\n }\n clearConsentExpiry();\n this.consentExpiryTimer = setTimeout(() => {\n this.consentExpiryTimer = undefined;\n if (canceled || sessionId !== this.consentSessionId) {\n return;\n }\n if (this.state === \"closed\" || this.state === \"failed\") {\n return;\n }\n log(\"Consent to send expired\");\n // Expire independently of request cadence / failure count (RFC 7675).\n this.consentFresh = false;\n this.consentSessionId++;\n this.consentRequestAbort?.abort();\n this.consentRequestAbort = undefined;\n if (this.queryConsentHandle === handle) {\n this.queryConsentHandle = undefined;\n }\n canceled = true;\n cancelEvent.abort();\n // Transport stays available for ICE restart; explicit close() uses \"closed\".\n this.setState(\"failed\");\n }, CONSENT_TIMEOUT * 1000);\n };\n\n onCancel.once(() => {\n canceled = true;\n // Avoid clearing a replacement session's timer/handle.\n if (sessionId === this.consentSessionId) {\n clearConsentExpiry();\n this.consentRequestAbort?.abort();\n this.consentRequestAbort = undefined;\n }\n cancelEvent.abort();\n if (this.queryConsentHandle === handle) {\n this.queryConsentHandle = undefined;\n }\n });\n\n // Initial ICE check success is the first valid consent response.\n refreshConsentExpiry();\n\n const randomizedConsentInterval = () =>\n CONSENT_INTERVAL * (0.8 + 0.4 * Math.random()) * 1000;\n\n // Cadence is measured between request *starts*, not response completions.\n let nextConsentAt = Date.now() + randomizedConsentInterval();\n const isTerminalState = () =>\n this.state === \"closed\" || this.state === \"failed\";\n\n try {\n while (\n !isTerminalState() &&\n !canceled &&\n sessionId === this.consentSessionId\n ) {\n await this.abortableDelay(\n Math.max(0, nextConsentAt - Date.now()),\n cancelEvent.signal,\n );\n\n if (\n canceled ||\n isTerminalState() ||\n sessionId !== this.consentSessionId\n ) {\n break;\n }\n\n // Fix next start time before awaiting any response (independent timers).\n nextConsentAt = Date.now() + randomizedConsentInterval();\n\n const nominated = this.nominated;\n if (!nominated) {\n break;\n }\n\n const pairId = nominated.id;\n const generation = this.generation;\n const remotePassword = this.remotePassword;\n const { localUsername, remoteUsername, iceControlling } = this;\n\n const request = this.buildRequest({\n nominate: this.shouldNominateConsentRequest(nominated),\n localUsername,\n remoteUsername,\n iceControlling,\n localCandidate: nominated.localCandidate,\n });\n\n this.consentRequestAbort?.abort();\n const requestAbort = new AbortController();\n this.consentRequestAbort = requestAbort;\n\n nominated.consentRequestsSent++;\n nominated.requestsSent++;\n\n // RTT-aware wait (floor 500ms); independent of retransmissions: 0.\n const responseTimeout = consentResponseTimeoutMs(nominated.rtt);\n const requestStartedAt = performance.now();\n\n // Do not await here: response wait must not stretch the 4–6s cadence.\n nominated.protocol\n .request(\n request,\n nominated.remoteAddr,\n Buffer.from(remotePassword, \"utf8\"),\n {\n retransmissions: 0,\n responseTimeout,\n signal: requestAbort.signal,\n onRequestSent: (attempt) => {\n if (attempt > 0) {\n nominated.retransmissionsSent++;\n }\n },\n },\n )\n .then(() => {\n // Accept only responses for the current pair / generation / session.\n // Address / MESSAGE-INTEGRITY / response class are enforced in Transaction + protocol.\n if (sessionId !== this.consentSessionId || canceled) {\n return;\n }\n const state = this.state;\n if (state === \"closed\" || state === \"failed\") {\n return;\n }\n if (this.nominated?.id !== pairId) {\n return;\n }\n if (this.generation !== generation) {\n return;\n }\n if (this.remotePassword !== remotePassword) {\n return;\n }\n\n const rtt = (performance.now() - requestStartedAt) / 1000; // seconds\n nominated.rtt = rtt;\n nominated.totalRoundTripTime += rtt;\n nominated.roundTripTimeMeasurements++;\n\n nominated.responsesReceived++;\n this.consentFresh = true;\n refreshConsentExpiry();\n if (state === \"disconnected\") {\n this.setState(\"connected\");\n }\n })\n .catch((error) => {\n // Individual request loss is expected; keep monitoring (RFC 7675).\n if (\n sessionId === this.consentSessionId &&\n this.nominated?.id === pairId\n ) {\n log(\"no stun response\", error);\n }\n });\n }\n } catch (error) {\n // Abort during delay is normal on cancel / expire.\n } finally {\n if (sessionId === this.consentSessionId) {\n clearConsentExpiry();\n }\n }\n });\n this.queryConsentHandle = handle;\n };\n\n async close() {\n // \"\"\"\n // Close the connection.\n // \"\"\"\n\n this.setState(\"closed\");\n\n // # stop consent freshness tests\n this.stopConsentLifecycle();\n\n // # stop check list\n if (this.checkList && !this.checkListDone) {\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n\n this.nominated = undefined;\n for (const protocol of this.protocols) {\n if (protocol.close) {\n await protocol.close();\n }\n }\n\n this.protocols = [];\n this.localCandidates = [];\n\n this.lookup?.close?.();\n this.lookup = undefined;\n }\n\n private setState(state: IceState) {\n this.state = state;\n this.stateChanged.execute(state);\n }\n\n async addRemoteCandidate(remoteCandidate: Candidate | undefined) {\n // \"\"\"\n // Add a remote candidate or signal end-of-candidates.\n\n // To signal end-of-candidates, pass `None`.\n\n // :param remote_candidate: A :class:`Candidate` instance or `None`.\n // \"\"\"\n\n if (!remoteCandidate) {\n this.remoteCandidatesEnd = true;\n return;\n }\n\n if (remoteCandidate.host.includes(\".local\")) {\n try {\n if (!this.lookup) {\n this.lookup = new MdnsLookup();\n }\n const host = await this.lookup.lookup(remoteCandidate.host);\n remoteCandidate.host = host;\n } catch (error) {\n return;\n }\n }\n\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n return;\n }\n\n log(\"addRemoteCandidate\", remoteCandidate);\n this._remoteCandidates.push(remoteCandidate);\n\n this.pairRemoteCandidate(remoteCandidate);\n this.sortCheckList();\n }\n\n send = async (data: Buffer) => {\n // RFC 7675: after consent expiry, do not send application data on the 5-tuple.\n if (!this.canSendApplicationData()) {\n return;\n }\n const activePair = this.nominated!;\n await activePair.protocol.sendData(data, activePair.remoteAddr);\n\n // Update statistics\n activePair.packetsSent++;\n activePair.bytesSent += data.length;\n };\n\n getDefaultCandidate() {\n const candidates = this.localCandidates.sort(\n (a, b) => a.priority - b.priority,\n );\n const [candidate] = candidates;\n return candidate;\n }\n\n // for test only\n set remoteCandidates(value: Candidate[]) {\n if (this.remoteCandidatesEnd)\n throw new Error(\"Cannot set remote candidates after end-of-candidates.\");\n this._remoteCandidates = [];\n for (const remoteCandidate of value) {\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n continue;\n }\n this._remoteCandidates.push(remoteCandidate);\n }\n\n this.remoteCandidatesEnd = true;\n }\n get remoteCandidates() {\n return this._remoteCandidates;\n }\n\n get candidatePairs() {\n return this.checkList;\n }\n\n private sortCheckList() {\n sortCandidatePairs(this.checkList, this.iceControlling);\n }\n\n private findPair(protocol: Protocol, remoteCandidate: Candidate) {\n const pair = this.checkList.find(\n (pair) =>\n pair.protocol === protocol && pair.remoteCandidate === remoteCandidate,\n );\n return pair;\n }\n\n private applyIceControlling(iceControlling: boolean) {\n this._iceControlling = iceControlling;\n for (const pair of this.checkList) {\n pair.iceControlling = iceControlling;\n }\n }\n\n private switchRole(iceControlling: boolean) {\n log(\"switch role\", iceControlling);\n // Role conflicts must be repaired even after a prior generation or while\n // connectivity checks are in flight (RFC 8445 §7.2.5.1 / §7.3.1.1).\n if (this.iceLite) {\n iceControlling = false;\n }\n this.applyIceControlling(iceControlling);\n this.sortCheckList();\n }\n\n private checkComplete(pair: CandidatePair) {\n pair.handle = undefined;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n // Updating the Nominated Flag\n\n // https://www.rfc-editor.org/rfc/rfc8445#section-7.3.1.5,\n // Once the nominated flag is set for a component of a data stream, it\n // concludes the ICE processing for that component. See Section 8.\n // So disallow overwriting of the pair nominated for that component\n if (\n pair.nominated &&\n // remoteのgenerationをチェックする.localのgenerationは更新が間に合わないかもしれないのでチェックしない\n (pair.remoteCandidate.generation != undefined\n ? pair.remoteCandidate.generation === this.generation\n : true) &&\n this.nominated == undefined\n ) {\n log(\"nominated\", pair.toJSON());\n this.nominated = pair;\n this.nominating = false;\n this.pruneTcpConnections(pair);\n\n // After resetNominatedPair / renomination while already connected,\n // restart consent freshness on the new selected pair.\n if (\n !this.iceLite &&\n (this.state === \"connected\" || this.state === \"completed\")\n ) {\n this.queryConsent();\n }\n\n // 8.1.2. Updating States\n\n // The agent MUST remove all Waiting and Frozen pairs in the check\n // list and triggered check queue for the same component as the\n // nominated pairs for that media stream.\n for (const p of this.checkList) {\n if (\n p.component === pair.component &&\n [CandidatePairState.WAITING, CandidatePairState.FROZEN].includes(\n p.state,\n )\n ) {\n p.updateState(CandidatePairState.FAILED);\n }\n }\n }\n\n // Once there is at least one nominated pair in the valid list for\n // every component of at least one media stream and the state of the\n // check list is Running:\n if (this.nominated) {\n if (!this.checkListDone) {\n log(\"ICE completed\");\n this.checkListState.put(new Promise((r) => r(ICE_COMPLETED)));\n this.checkListDone = true;\n }\n return;\n }\n\n log(\"not completed\", pair.toJSON());\n\n // 7.1.3.2.3. Updating Pair States\n for (const p of this.checkList) {\n if (\n p.localCandidate.foundation === pair.localCandidate.foundation &&\n p.state === CandidatePairState.FROZEN\n ) {\n p.updateState(CandidatePairState.WAITING);\n }\n }\n }\n\n this.nominateTcpPairIfReady();\n\n // A nomination request is still in flight; its result decides the outcome.\n if (this.nominating) {\n return;\n }\n\n {\n const list = [CandidatePairState.SUCCEEDED, CandidatePairState.FAILED];\n if (this.checkList.find(({ state }) => !list.includes(state))) {\n return;\n }\n }\n\n if (!this.iceControlling) {\n const target = CandidatePairState.SUCCEEDED;\n if (this.checkList.find(({ state }) => state === target)) {\n return;\n }\n }\n\n if (!this.checkListDone) {\n log(\"ICE failed\");\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n }\n\n // 3. Terminology : Check\n checkStart = (pair: CandidatePair) =>\n cancelable<void>(async (r) => {\n // \"\"\"\n // Starts a check.\n // \"\"\"\n\n log(\"check start\", pair.toJSON());\n\n pair.updateState(CandidatePairState.IN_PROGRESS);\n const result: { response?: Message; addr?: Address } = {};\n const { remotePassword, remoteUsername, generation } = this;\n const localUsername = pair.localCandidate.ufrag ?? this.localUsername;\n\n // TCP pairs use regular nomination (see nominateTcpPairIfReady).\n const nominate =\n this.iceControlling && !this.remoteIsLite && !this.isTcpPair(pair);\n const request = this.buildRequest({\n nominate,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n localCandidate: pair.localCandidate,\n });\n\n // Record start time for RTT calculation\n const startTime = performance.now();\n\n try {\n pair.requestsSent++;\n const [response, addr] = await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(remotePassword, \"utf8\"),\n this.checkRequestOptions(pair),\n );\n pair.responsesReceived++;\n\n // Calculate RTT\n const endTime = performance.now();\n const rtt = (endTime - startTime) / 1000; // Convert to seconds\n\n // Update RTT statistics\n pair.rtt = rtt;\n pair.totalRoundTripTime += rtt;\n pair.roundTripTimeMeasurements++;\n\n log(\"response received\", request.toJSON(), response.toJSON(), addr, {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n rtt,\n });\n result.response = response;\n result.addr = addr;\n } catch (error: any) {\n const exc: TransactionError = error;\n // 7.1.3.1. Failure Cases\n log(\n \"failure case\",\n request.toJSON(),\n exc.response ? JSON.stringify(exc.response.toJSON(), null, 2) : error,\n {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n },\n pair.remoteAddr,\n );\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 487) {\n if (request.attributesKeys.includes(\"ICE-CONTROLLED\")) {\n this.switchRole(true);\n } else if (request.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n this.switchRole(false);\n }\n await this.checkStart(pair).awaitable;\n r();\n return;\n }\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 401) {\n log(\"retry 401\", pair.toJSON());\n await this.checkStart(pair).awaitable;\n r();\n return;\n } else {\n // timeout\n log(\"checkStart CandidatePairState.FAILED\", pair.toJSON());\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n }\n\n // # check remote address matches\n if (\n result.addr[0] !== pair.remoteAddr[0] ||\n result.addr[1] !== pair.remoteAddr[1]\n ) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n\n // # success\n if (nominate || pair.remoteNominated) {\n // # nominated by agressive nomination or the remote party\n pair.nominated = true;\n } else if (this.usesTcpRegularNomination(pair)) {\n // # nominated later by nominateTcpPairIfReady (from checkComplete)\n } else if (this.iceControlling && !this.nominating) {\n // # perform regular nomination\n this.nominating = true;\n const request = this.buildRequest({\n nominate: true,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n localCandidate: pair.localCandidate,\n });\n try {\n pair.requestsSent++;\n await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n this.checkRequestOptions(pair),\n );\n pair.responsesReceived++;\n } catch (error) {\n this.nominating = false;\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n return;\n }\n pair.nominated = true;\n }\n\n pair.updateState(CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n r();\n });\n\n private isTcpPair(pair: CandidatePair) {\n return pair.localCandidate.transport.toLowerCase() === \"tcp\";\n }\n\n /**\n * Aggressive nomination lets each side settle on whichever TCP connection\n * finished first; the two sides can then pick different connections and\n * pruning destroys the peer's choice. For TCP the controlling agent instead\n * nominates exactly one valid pair (RFC 8445 §8.1.1 regular nomination).\n */\n private usesTcpRegularNomination(pair: CandidatePair) {\n return this.iceControlling && !this.remoteIsLite && this.isTcpPair(pair);\n }\n\n private checkRequestOptions(pair: CandidatePair): TransactionRequestOptions {\n const onRequestSent = (attempt: number) => {\n if (attempt > 0) {\n pair.retransmissionsSent++;\n }\n };\n if (this.isTcpPair(pair)) {\n // RFC 5389 §7.2.2: no retransmissions over a reliable transport.\n return {\n retransmissions: 0,\n responseTimeout: TCP_CHECK_RESPONSE_TIMEOUT_MS,\n onRequestSent,\n };\n }\n return { retransmissions: 4, onRequestSent };\n }\n\n /**\n * Controlling side: nominate the highest-priority TCP pair once every\n * higher-priority TCP pair has finished its check, so the choice does not\n * depend on which connection happened to complete first.\n */\n private nominateTcpPairIfReady() {\n if (\n !this.iceControlling ||\n this.remoteIsLite ||\n this.nominated ||\n this.nominating\n ) {\n return;\n }\n\n for (const pair of this.checkList) {\n if (!this.isTcpPair(pair)) {\n continue;\n }\n if (pair.state === CandidatePairState.SUCCEEDED) {\n this.nominateTcpPair(pair);\n return;\n }\n if (pair.state !== CandidatePairState.FAILED) {\n // A higher-priority pair may still succeed.\n return;\n }\n }\n }\n\n private nominateTcpPair(pair: CandidatePair) {\n this.nominating = true;\n const { generation } = this;\n const request = this.buildRequest({\n nominate: true,\n localUsername: pair.localCandidate.ufrag ?? this.localUsername,\n remoteUsername: this.remoteUsername,\n iceControlling: this.iceControlling,\n localCandidate: pair.localCandidate,\n });\n pair.requestsSent++;\n\n pair.protocol\n .request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n this.checkRequestOptions(pair),\n )\n .then(\n () => {\n if (this.isStaleNomination(pair, generation)) {\n return;\n }\n pair.responsesReceived++;\n pair.nominated = true;\n this.nominating = false;\n this.checkComplete(pair);\n },\n (error) => {\n if (this.isStaleNomination(pair, generation)) {\n return;\n }\n log(\"tcp nomination failed\", pair.toJSON(), error);\n this.nominating = false;\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n },\n );\n }\n\n /** The agent was closed or restarted while the nomination was in flight. */\n private isStaleNomination(pair: CandidatePair, generation: number) {\n return (\n this.state === \"closed\" ||\n this.generation !== generation ||\n !this.checkList.includes(pair)\n );\n }\n\n private addPair(pair: CandidatePair) {\n this.checkList.push(pair);\n this.sortCheckList();\n }\n\n // 7.2. STUN Server Procedures\n // 7.2.1.3、7.2.1.4、および7.2.1.5\n checkIncoming(message: Message, addr: Address, protocol: Protocol) {\n // \"\"\"\n // Handle a successful incoming check.\n // \"\"\"\n\n const txUsername = message.getAttributeValue(\"USERNAME\");\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n\n // find remote candidate\n let remoteCandidate: Candidate | undefined;\n const [host, port] = addr;\n for (const c of this.remoteCandidates) {\n if (c.host === host && c.port === port) {\n remoteCandidate = c;\n break;\n }\n }\n if (!remoteCandidate) {\n // 7.2.1.3. Learning Peer Reflexive Candidates\n remoteCandidate = new Candidate(\n randomString(10),\n 1,\n protocol.localCandidate?.transport ?? \"udp\",\n message.getAttributeValue(\"PRIORITY\"),\n host,\n port,\n \"prflx\",\n undefined,\n undefined,\n protocol.localCandidate?.transport === \"tcp\"\n ? remoteTcpTypeForIncoming(protocol.localCandidate.tcptype)\n : undefined,\n undefined,\n undefined,\n );\n this._remoteCandidates.push(remoteCandidate);\n }\n\n // find pair\n let pair = this.findPair(protocol, remoteCandidate);\n if (!pair) {\n pair = new CandidatePair(protocol, remoteCandidate, this.iceControlling);\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n pair.noteIncomingRequest(message.transactionIdHex);\n pair.requestsReceived++;\n pair.responsesSent++;\n pair.localCandidate.ufrag = localUsername;\n\n log(\"Triggered Checks\", message.toJSON(), pair.toJSON(), {\n localUsername: this.localUsername,\n remoteUsername: this.remoteUsername,\n localPassword: this.localPassword,\n remotePassword: this.remotePassword,\n generation: this.generation,\n });\n\n if (this.iceLite) {\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n pair.nominated = true;\n pair.updateState(CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n }\n return;\n }\n\n // 7.2.1.4. Triggered Checks\n if (\n [CandidatePairState.WAITING, CandidatePairState.FAILED].includes(\n pair.state,\n )\n ) {\n pair.handle = this.checkStart(pair);\n }\n\n // 7.2.1.5. Updating the Nominated Flag\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n pair.nominated = true;\n this.checkComplete(pair);\n }\n }\n }\n\n private tryPair(protocol: Protocol, remoteCandidate: Candidate) {\n if (\n protocol.localCandidate?.canPairWith(remoteCandidate) &&\n !(\n protocol.localCandidate.transport.toLowerCase() === \"tcp\" &&\n protocol.localCandidate.tcptype === \"passive\" &&\n remoteCandidate.type !== \"prflx\"\n ) &&\n !this.findPair(protocol, remoteCandidate)\n ) {\n const pair = new CandidatePair(\n protocol,\n remoteCandidate,\n this.iceControlling,\n );\n if (\n this.options.filterCandidatePair &&\n !this.options.filterCandidatePair(pair)\n ) {\n return;\n }\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n }\n\n private pairLocalProtocol(protocol: Protocol) {\n for (const remoteCandidate of this.remoteCandidates) {\n this.tryPair(protocol, remoteCandidate);\n }\n }\n\n private pairRemoteCandidate = (remoteCandidate: Candidate) => {\n for (const protocol of this.protocols) {\n this.tryPair(protocol, remoteCandidate);\n }\n };\n\n private buildRequest({\n nominate,\n remoteUsername,\n localUsername,\n iceControlling,\n localCandidate,\n }: {\n nominate: boolean;\n remoteUsername: string;\n localUsername: string;\n iceControlling: boolean;\n localCandidate?: Candidate;\n }) {\n const txUsername = encodeTxUsername({ remoteUsername, localUsername });\n const request = new Message(methods.BINDING, classes.REQUEST);\n request.setAttribute(\"USERNAME\", txUsername).setAttribute(\n \"PRIORITY\",\n candidatePriority(\"prflx\", {\n transport: localCandidate?.transport,\n tcptype: localCandidate?.tcptype,\n }),\n );\n if (iceControlling) {\n request.setAttribute(\"ICE-CONTROLLING\", this.tieBreaker);\n if (nominate) {\n request.setAttribute(\"USE-CANDIDATE\", null);\n }\n } else {\n request.setAttribute(\"ICE-CONTROLLED\", this.tieBreaker);\n }\n return request;\n }\n\n private pruneTcpConnections(selectedPair: CandidatePair) {\n for (const protocol of this.protocols) {\n if (protocol.localCandidate?.transport.toLowerCase() !== \"tcp\") {\n continue;\n }\n\n if (\n \"pruneForSelection\" in protocol &&\n typeof protocol.pruneForSelection === \"function\"\n ) {\n void protocol.pruneForSelection(\n protocol === selectedPair.protocol\n ? selectedPair.remoteAddr\n : undefined,\n );\n }\n }\n }\n\n private respondError(\n request: Message,\n addr: Address,\n protocol: Protocol,\n errorCode: [number, string],\n ) {\n const response = new Message(\n request.messageMethod,\n classes.ERROR,\n request.transactionId,\n );\n response\n .setAttribute(\"ERROR-CODE\", errorCode)\n .addMessageIntegrity(Buffer.from(this.localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n }\n}\n\nconst encodeTxUsername = ({\n remoteUsername,\n localUsername,\n}: {\n remoteUsername: string;\n localUsername: string;\n}) => {\n return `${remoteUsername}:${localUsername}`;\n};\n\nconst decodeTxUsername = (txUsername: string) => {\n const [remoteUsername, localUsername] = txUsername.split(\":\");\n return { remoteUsername, localUsername };\n};\n"]}
@@ -29,6 +29,7 @@ export interface IceConnection {
29
29
  readonly stateChanged: Event<[IceState]>;
30
30
  readonly onIceCandidate: Event<[Candidate]>;
31
31
  restart(): void;
32
+ setIceServers(options: Partial<IceOptions>): void;
32
33
  setRemoteParams(params: {
33
34
  iceLite: boolean;
34
35
  usernameFragment: string;
@@ -139,12 +140,37 @@ export interface IceOptions {
139
140
  /** Advertise and operate as an ICE lite agent. */
140
141
  iceLite: boolean;
141
142
  useTcp: boolean;
143
+ /**
144
+ * Gather passive TCP host candidates (opens a listening TCP server per
145
+ * interface). Defaults to true. Send-only agents that never accept inbound
146
+ * connections can set this false to avoid the listener while still gathering
147
+ * active TCP candidates.
148
+ */
149
+ tcpPassive?: boolean;
150
+ /**
151
+ * Seconds to wait for server-reflexive candidates while gathering.
152
+ * Defaults to 5. Where UDP is blocked these STUN queries are never answered,
153
+ * so the wait always runs to the timeout; agents that must not stall on such
154
+ * networks can lower it.
155
+ */
156
+ stunGatherTimeout?: number;
157
+ /**
158
+ * Seconds to wait for a TURN TCP/TLS connection to be established.
159
+ * Defaults to 8.
160
+ */
161
+ turnConnectTimeout?: number;
142
162
  stunServer?: Address;
143
163
  turnServer?: Address;
144
164
  turnUsername?: string;
145
165
  turnPassword?: string;
146
166
  turnTransport?: "udp" | "tcp" | "tls";
147
167
  turnTlsOptions?: TlsConnectionOptions;
168
+ /**
169
+ * Preferred IP family of the TURN/UDP socket, applied only when turnServer
170
+ * is a hostname. Ignored for an IP literal turnServer, whose own family
171
+ * always selects the socket. Defaults to 4.
172
+ */
173
+ turnUdpFamily?: 4 | 6;
148
174
  forceTurn?: boolean;
149
175
  localPasswordPrefix?: string;
150
176
  useIpv4: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"iceBase.js","sourceRoot":"","sources":["../../../../ice/src/iceBase.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { Candidate, candidateFoundation, candidatePriority } from \"./candidate\";\nimport type { MdnsLookup } from \"./dns/lookup\";\nimport type { Cancelable } from \"./helper\";\nimport {\n type Address,\n type Event,\n type InterfaceAddresses,\n type TlsConnectionOptions,\n debug,\n} from \"./imports/common\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport type { Protocol } from \"./types/model\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport interface IceConnection {\n iceLite: boolean;\n iceControlling: boolean;\n localUsername: string;\n localPassword: string;\n remotePassword: string;\n remoteUsername: string;\n remoteIsLite: boolean;\n checkList: CandidatePair[];\n localCandidates: Candidate[];\n remoteCandidates: Candidate[];\n candidatePairs: CandidatePair[];\n stunServer?: Address;\n turnServer?: Address;\n generation: number;\n options: IceOptions;\n remoteCandidatesEnd: boolean;\n localCandidatesEnd: boolean;\n state: IceState;\n lookup?: MdnsLookup;\n nominated?: CandidatePair;\n\n readonly onData: Event<[Buffer]>;\n readonly stateChanged: Event<[IceState]>;\n readonly onIceCandidate: Event<[Candidate]>;\n\n restart(): void;\n\n setRemoteParams(params: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }): void;\n\n gatherCandidates(): Promise<void>;\n\n connect(): Promise<void>;\n\n close(): Promise<void>;\n\n addRemoteCandidate(remoteCandidate: Candidate | undefined): Promise<void>;\n\n send(data: Buffer): Promise<void>;\n\n getDefaultCandidate(): Candidate | undefined;\n resetNominatedPair(): void;\n}\n\nexport interface CandidatePairStats {\n packetsSent: number;\n packetsReceived: number;\n bytesSent: number;\n bytesReceived: number;\n rtt?: number;\n totalRoundTripTime: number;\n roundTripTimeMeasurements: number;\n requestsReceived: number;\n requestsSent: number;\n responsesReceived: number;\n responsesSent: number;\n retransmissionsReceived: number;\n retransmissionsSent: number;\n consentRequestsSent: number;\n}\n\nexport class CandidatePair implements CandidatePairStats {\n readonly id = randomUUID().toString();\n handle?: Cancelable<void>;\n nominated = false;\n remoteNominated = false;\n // 5.7.4. Computing States\n private _state = CandidatePairState.FROZEN;\n get state() {\n return this._state;\n }\n\n // Statistics tracking\n packetsSent = 0;\n packetsReceived = 0;\n bytesSent = 0;\n bytesReceived = 0;\n rtt?: number;\n totalRoundTripTime = 0;\n roundTripTimeMeasurements = 0;\n requestsReceived = 0;\n requestsSent = 0;\n responsesReceived = 0;\n responsesSent = 0;\n retransmissionsReceived = 0;\n retransmissionsSent = 0;\n consentRequestsSent = 0;\n private readonly requestTransactionIds = new Set<string>();\n\n toJSON() {\n return this.json;\n }\n\n get json() {\n return {\n protocol: this.protocol.type,\n localCandidate: this.localCandidate.toSdp(),\n remoteCandidate: this.remoteCandidate.toSdp(),\n };\n }\n\n constructor(\n public protocol: Protocol,\n public remoteCandidate: Candidate,\n public iceControlling: boolean,\n ) {}\n\n updateState(state: CandidatePairState) {\n this._state = state;\n }\n\n get localCandidate() {\n if (!this.protocol.localCandidate) {\n throw new Error(\"localCandidate not exist\");\n }\n return this.protocol.localCandidate;\n }\n\n get remoteAddr(): Address {\n return [this.remoteCandidate.host, this.remoteCandidate.port];\n }\n\n get component() {\n return this.localCandidate.component;\n }\n\n get priority() {\n return candidatePairPriority(\n this.localCandidate,\n this.remoteCandidate,\n this.iceControlling,\n );\n }\n\n get foundation() {\n return this.localCandidate.foundation;\n }\n\n noteIncomingRequest(transactionId: string) {\n const isRetransmission = this.requestTransactionIds.has(transactionId);\n if (!isRetransmission) {\n this.requestTransactionIds.add(transactionId);\n return false;\n }\n this.retransmissionsReceived++;\n return true;\n }\n}\n\nexport const ICE_COMPLETED = 1 as const;\nexport const ICE_FAILED = 2 as const;\n\n/** Basic consent check period in seconds (RFC 7675). Actual interval is 0.8–1.2× this. */\nexport const CONSENT_INTERVAL = 5;\n\n/**\n * @deprecated Consent expiry is based on {@link CONSENT_TIMEOUT} (30s after the\n * last valid response), not a consecutive failure count. Kept for API compatibility.\n */\nexport const CONSENT_FAILURES = 6;\n\n/** RFC 7675: consent expires this many seconds after the last valid response. */\nexport const CONSENT_TIMEOUT = 30;\n\n/**\n * Default single-shot response wait for consent requests (ms) when RTT is unknown.\n * Independent of retransmission count. Downstream ICE-lite peers typically\n * answer in 150–300ms; 1s is a conservative default used by interop patches.\n */\nexport const CONSENT_RESPONSE_TIMEOUT = 1000;\n\n/** RFC 8445 §14.3: ICE RTO must not be less than 500ms. */\nexport const CONSENT_RESPONSE_TIMEOUT_MIN = 500;\n\n/**\n * Compute consent response wait from pair RTT (seconds).\n * Uses 2×RTT + 200ms jitter margin, floored at {@link CONSENT_RESPONSE_TIMEOUT_MIN}.\n * Falls back to {@link CONSENT_RESPONSE_TIMEOUT} when RTT is unavailable.\n */\nexport function consentResponseTimeoutMs(rttSeconds?: number): number {\n if (\n rttSeconds === undefined ||\n !Number.isFinite(rttSeconds) ||\n rttSeconds <= 0\n ) {\n return CONSENT_RESPONSE_TIMEOUT;\n }\n return Math.max(\n CONSENT_RESPONSE_TIMEOUT_MIN,\n Math.round(rttSeconds * 1000 * 2 + 200),\n );\n}\n\nexport enum CandidatePairState {\n FROZEN = 0,\n WAITING = 1,\n IN_PROGRESS = 2,\n SUCCEEDED = 3,\n FAILED = 4,\n}\n\nexport type IceState =\n | \"disconnected\"\n | \"closed\"\n | \"completed\"\n | \"new\"\n | \"connected\"\n | \"failed\";\n\nexport interface IceOptions {\n /** Advertise and operate as an ICE lite agent. */\n iceLite: boolean;\n useTcp: boolean;\n stunServer?: Address;\n turnServer?: Address;\n turnUsername?: string;\n turnPassword?: string;\n turnTransport?: \"udp\" | \"tcp\" | \"tls\";\n turnTlsOptions?: TlsConnectionOptions;\n forceTurn?: boolean;\n localPasswordPrefix?: string;\n useIpv4: boolean;\n useIpv6: boolean;\n useLinkLocalAddress?: boolean;\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n additionalHostAddresses?: string[];\n filterStunResponse?: (\n message: Message,\n addr: Address,\n protocol: Protocol,\n ) => boolean;\n filterCandidatePair?: (pair: CandidatePair) => boolean;\n}\n\nexport const defaultOptions: IceOptions = {\n iceLite: false,\n useTcp: false,\n useIpv4: true,\n useIpv6: true,\n};\n\nexport function validateRemoteCandidate(candidate: Candidate) {\n // \"\"\"\n // Check the remote candidate is supported.\n // \"\"\"\n if (![\"host\", \"relay\", \"srflx\"].includes(candidate.type))\n throw new Error(`Unexpected candidate type \"${candidate.type}\"`);\n\n // ipaddress.ip_address(candidate.host)\n return candidate;\n}\n\nexport function sortCandidatePairs(\n pairs: {\n localCandidate: Pick<Candidate, \"priority\">;\n remoteCandidate: Pick<Candidate, \"priority\">;\n }[],\n iceControlling: boolean,\n) {\n return pairs\n .sort(\n (a, b) =>\n candidatePairPriority(\n a.localCandidate,\n a.remoteCandidate,\n iceControlling,\n ) -\n candidatePairPriority(\n b.localCandidate,\n b.remoteCandidate,\n iceControlling,\n ),\n )\n .reverse();\n}\n\n// 5.7.2. Computing Pair Priority and Ordering Pairs\nexport function candidatePairPriority(\n local: Pick<Candidate, \"priority\">,\n remote: Pick<Candidate, \"priority\">,\n iceControlling: boolean,\n) {\n const G = (iceControlling && local.priority) || remote.priority;\n const D = (iceControlling && remote.priority) || local.priority;\n return (1 << 32) * Math.min(G, D) + 2 * Math.max(G, D) + (G > D ? 1 : 0);\n}\n\nexport async function serverReflexiveCandidate(\n protocol: Protocol,\n stunServer: Address,\n) {\n // \"\"\"\n // Query STUN server to obtain a server-reflexive candidate.\n // \"\"\"\n\n // # perform STUN query\n const request = new Message(methods.BINDING, classes.REQUEST);\n try {\n const [response] = await protocol.request(request, stunServer);\n\n const localCandidate = protocol.localCandidate;\n if (!localCandidate) {\n throw new Error(\"not exist\");\n }\n\n const candidate = new Candidate(\n candidateFoundation(\n \"srflx\",\n localCandidate.transport,\n localCandidate.host,\n ),\n localCandidate.component,\n localCandidate.transport,\n candidatePriority(\"srflx\", {\n transport: localCandidate.transport,\n tcptype: localCandidate.tcptype,\n }),\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[0],\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[1],\n \"srflx\",\n localCandidate.host,\n localCandidate.port,\n localCandidate.tcptype,\n );\n return candidate;\n } catch (error) {\n // todo fix\n log(\"error serverReflexiveCandidate\", error);\n }\n}\n\nexport function validateAddress(addr?: Address): Address | undefined {\n if (addr && Number.isNaN(addr[1])) {\n return [addr[0], 443];\n }\n return addr;\n}\n"]}
1
+ {"version":3,"file":"iceBase.js","sourceRoot":"","sources":["../../../../ice/src/iceBase.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { Candidate, candidateFoundation, candidatePriority } from \"./candidate\";\nimport type { MdnsLookup } from \"./dns/lookup\";\nimport type { Cancelable } from \"./helper\";\nimport {\n type Address,\n type Event,\n type InterfaceAddresses,\n type TlsConnectionOptions,\n debug,\n} from \"./imports/common\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport type { Protocol } from \"./types/model\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport interface IceConnection {\n iceLite: boolean;\n iceControlling: boolean;\n localUsername: string;\n localPassword: string;\n remotePassword: string;\n remoteUsername: string;\n remoteIsLite: boolean;\n checkList: CandidatePair[];\n localCandidates: Candidate[];\n remoteCandidates: Candidate[];\n candidatePairs: CandidatePair[];\n stunServer?: Address;\n turnServer?: Address;\n generation: number;\n options: IceOptions;\n remoteCandidatesEnd: boolean;\n localCandidatesEnd: boolean;\n state: IceState;\n lookup?: MdnsLookup;\n nominated?: CandidatePair;\n\n readonly onData: Event<[Buffer]>;\n readonly stateChanged: Event<[IceState]>;\n readonly onIceCandidate: Event<[Candidate]>;\n\n restart(): void;\n\n setIceServers(options: Partial<IceOptions>): void;\n\n setRemoteParams(params: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }): void;\n\n gatherCandidates(): Promise<void>;\n\n connect(): Promise<void>;\n\n close(): Promise<void>;\n\n addRemoteCandidate(remoteCandidate: Candidate | undefined): Promise<void>;\n\n send(data: Buffer): Promise<void>;\n\n getDefaultCandidate(): Candidate | undefined;\n resetNominatedPair(): void;\n}\n\nexport interface CandidatePairStats {\n packetsSent: number;\n packetsReceived: number;\n bytesSent: number;\n bytesReceived: number;\n rtt?: number;\n totalRoundTripTime: number;\n roundTripTimeMeasurements: number;\n requestsReceived: number;\n requestsSent: number;\n responsesReceived: number;\n responsesSent: number;\n retransmissionsReceived: number;\n retransmissionsSent: number;\n consentRequestsSent: number;\n}\n\nexport class CandidatePair implements CandidatePairStats {\n readonly id = randomUUID().toString();\n handle?: Cancelable<void>;\n nominated = false;\n remoteNominated = false;\n // 5.7.4. Computing States\n private _state = CandidatePairState.FROZEN;\n get state() {\n return this._state;\n }\n\n // Statistics tracking\n packetsSent = 0;\n packetsReceived = 0;\n bytesSent = 0;\n bytesReceived = 0;\n rtt?: number;\n totalRoundTripTime = 0;\n roundTripTimeMeasurements = 0;\n requestsReceived = 0;\n requestsSent = 0;\n responsesReceived = 0;\n responsesSent = 0;\n retransmissionsReceived = 0;\n retransmissionsSent = 0;\n consentRequestsSent = 0;\n private readonly requestTransactionIds = new Set<string>();\n\n toJSON() {\n return this.json;\n }\n\n get json() {\n return {\n protocol: this.protocol.type,\n localCandidate: this.localCandidate.toSdp(),\n remoteCandidate: this.remoteCandidate.toSdp(),\n };\n }\n\n constructor(\n public protocol: Protocol,\n public remoteCandidate: Candidate,\n public iceControlling: boolean,\n ) {}\n\n updateState(state: CandidatePairState) {\n this._state = state;\n }\n\n get localCandidate() {\n if (!this.protocol.localCandidate) {\n throw new Error(\"localCandidate not exist\");\n }\n return this.protocol.localCandidate;\n }\n\n get remoteAddr(): Address {\n return [this.remoteCandidate.host, this.remoteCandidate.port];\n }\n\n get component() {\n return this.localCandidate.component;\n }\n\n get priority() {\n return candidatePairPriority(\n this.localCandidate,\n this.remoteCandidate,\n this.iceControlling,\n );\n }\n\n get foundation() {\n return this.localCandidate.foundation;\n }\n\n noteIncomingRequest(transactionId: string) {\n const isRetransmission = this.requestTransactionIds.has(transactionId);\n if (!isRetransmission) {\n this.requestTransactionIds.add(transactionId);\n return false;\n }\n this.retransmissionsReceived++;\n return true;\n }\n}\n\nexport const ICE_COMPLETED = 1 as const;\nexport const ICE_FAILED = 2 as const;\n\n/** Basic consent check period in seconds (RFC 7675). Actual interval is 0.8–1.2× this. */\nexport const CONSENT_INTERVAL = 5;\n\n/**\n * @deprecated Consent expiry is based on {@link CONSENT_TIMEOUT} (30s after the\n * last valid response), not a consecutive failure count. Kept for API compatibility.\n */\nexport const CONSENT_FAILURES = 6;\n\n/** RFC 7675: consent expires this many seconds after the last valid response. */\nexport const CONSENT_TIMEOUT = 30;\n\n/**\n * Default single-shot response wait for consent requests (ms) when RTT is unknown.\n * Independent of retransmission count. Downstream ICE-lite peers typically\n * answer in 150–300ms; 1s is a conservative default used by interop patches.\n */\nexport const CONSENT_RESPONSE_TIMEOUT = 1000;\n\n/** RFC 8445 §14.3: ICE RTO must not be less than 500ms. */\nexport const CONSENT_RESPONSE_TIMEOUT_MIN = 500;\n\n/**\n * Compute consent response wait from pair RTT (seconds).\n * Uses 2×RTT + 200ms jitter margin, floored at {@link CONSENT_RESPONSE_TIMEOUT_MIN}.\n * Falls back to {@link CONSENT_RESPONSE_TIMEOUT} when RTT is unavailable.\n */\nexport function consentResponseTimeoutMs(rttSeconds?: number): number {\n if (\n rttSeconds === undefined ||\n !Number.isFinite(rttSeconds) ||\n rttSeconds <= 0\n ) {\n return CONSENT_RESPONSE_TIMEOUT;\n }\n return Math.max(\n CONSENT_RESPONSE_TIMEOUT_MIN,\n Math.round(rttSeconds * 1000 * 2 + 200),\n );\n}\n\nexport enum CandidatePairState {\n FROZEN = 0,\n WAITING = 1,\n IN_PROGRESS = 2,\n SUCCEEDED = 3,\n FAILED = 4,\n}\n\nexport type IceState =\n | \"disconnected\"\n | \"closed\"\n | \"completed\"\n | \"new\"\n | \"connected\"\n | \"failed\";\n\nexport interface IceOptions {\n /** Advertise and operate as an ICE lite agent. */\n iceLite: boolean;\n useTcp: boolean;\n /**\n * Gather passive TCP host candidates (opens a listening TCP server per\n * interface). Defaults to true. Send-only agents that never accept inbound\n * connections can set this false to avoid the listener while still gathering\n * active TCP candidates.\n */\n tcpPassive?: boolean;\n /**\n * Seconds to wait for server-reflexive candidates while gathering.\n * Defaults to 5. Where UDP is blocked these STUN queries are never answered,\n * so the wait always runs to the timeout; agents that must not stall on such\n * networks can lower it.\n */\n stunGatherTimeout?: number;\n /**\n * Seconds to wait for a TURN TCP/TLS connection to be established.\n * Defaults to 8.\n */\n turnConnectTimeout?: number;\n stunServer?: Address;\n turnServer?: Address;\n turnUsername?: string;\n turnPassword?: string;\n turnTransport?: \"udp\" | \"tcp\" | \"tls\";\n turnTlsOptions?: TlsConnectionOptions;\n /**\n * Preferred IP family of the TURN/UDP socket, applied only when turnServer\n * is a hostname. Ignored for an IP literal turnServer, whose own family\n * always selects the socket. Defaults to 4.\n */\n turnUdpFamily?: 4 | 6;\n forceTurn?: boolean;\n localPasswordPrefix?: string;\n useIpv4: boolean;\n useIpv6: boolean;\n useLinkLocalAddress?: boolean;\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n additionalHostAddresses?: string[];\n filterStunResponse?: (\n message: Message,\n addr: Address,\n protocol: Protocol,\n ) => boolean;\n filterCandidatePair?: (pair: CandidatePair) => boolean;\n}\n\nexport const defaultOptions: IceOptions = {\n iceLite: false,\n useTcp: false,\n useIpv4: true,\n useIpv6: true,\n};\n\nexport function validateRemoteCandidate(candidate: Candidate) {\n // \"\"\"\n // Check the remote candidate is supported.\n // \"\"\"\n if (![\"host\", \"relay\", \"srflx\"].includes(candidate.type))\n throw new Error(`Unexpected candidate type \"${candidate.type}\"`);\n\n // ipaddress.ip_address(candidate.host)\n return candidate;\n}\n\nexport function sortCandidatePairs(\n pairs: {\n localCandidate: Pick<Candidate, \"priority\">;\n remoteCandidate: Pick<Candidate, \"priority\">;\n }[],\n iceControlling: boolean,\n) {\n return pairs\n .sort(\n (a, b) =>\n candidatePairPriority(\n a.localCandidate,\n a.remoteCandidate,\n iceControlling,\n ) -\n candidatePairPriority(\n b.localCandidate,\n b.remoteCandidate,\n iceControlling,\n ),\n )\n .reverse();\n}\n\n// 5.7.2. Computing Pair Priority and Ordering Pairs\nexport function candidatePairPriority(\n local: Pick<Candidate, \"priority\">,\n remote: Pick<Candidate, \"priority\">,\n iceControlling: boolean,\n) {\n const G = (iceControlling && local.priority) || remote.priority;\n const D = (iceControlling && remote.priority) || local.priority;\n return (1 << 32) * Math.min(G, D) + 2 * Math.max(G, D) + (G > D ? 1 : 0);\n}\n\nexport async function serverReflexiveCandidate(\n protocol: Protocol,\n stunServer: Address,\n) {\n // \"\"\"\n // Query STUN server to obtain a server-reflexive candidate.\n // \"\"\"\n\n // # perform STUN query\n const request = new Message(methods.BINDING, classes.REQUEST);\n try {\n const [response] = await protocol.request(request, stunServer);\n\n const localCandidate = protocol.localCandidate;\n if (!localCandidate) {\n throw new Error(\"not exist\");\n }\n\n const candidate = new Candidate(\n candidateFoundation(\n \"srflx\",\n localCandidate.transport,\n localCandidate.host,\n ),\n localCandidate.component,\n localCandidate.transport,\n candidatePriority(\"srflx\", {\n transport: localCandidate.transport,\n tcptype: localCandidate.tcptype,\n }),\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[0],\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[1],\n \"srflx\",\n localCandidate.host,\n localCandidate.port,\n localCandidate.tcptype,\n );\n return candidate;\n } catch (error) {\n // todo fix\n log(\"error serverReflexiveCandidate\", error);\n }\n}\n\nexport function validateAddress(addr?: Address): Address | undefined {\n if (addr && Number.isNaN(addr[1])) {\n return [addr[0], 443];\n }\n return addr;\n}\n"]}
@@ -1 +1,8 @@
1
1
  export * from "../../../ice-server/src/stun/const";
2
+ /**
3
+ * Response deadline for ICE connectivity checks over TCP (RFC 6544).
4
+ * Reliable transports send each STUN request once (RFC 5389 §7.2.2), so this
5
+ * single wait has to cover the TCP connect of an active candidate as well as
6
+ * the request/response round trip on a loaded host.
7
+ */
8
+ export declare const TCP_CHECK_RESPONSE_TIMEOUT_MS = 3000;