Try a direct connection only if there isn't one already (#891)
This commit is contained in:
parent
6050cdef7e
commit
a677b06273
|
@ -65,6 +65,35 @@ proc tryStartingDirectConn(self: HPService, switch: Switch, peerId: PeerId): Fut
|
||||||
continue
|
continue
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
proc closeRelayConn(relayedConn: Connection) {.async.} =
|
||||||
|
await sleepAsync(2000.milliseconds) # grace period before closing relayed connection
|
||||||
|
await relayedConn.close()
|
||||||
|
|
||||||
|
proc newConnectedPeerHandler(self: HPService, switch: Switch, peerId: PeerId, event: PeerEvent) {.async.} =
|
||||||
|
try:
|
||||||
|
# Get all connections to the peer. If there is at least one non-relayed connection, return.
|
||||||
|
let connections = switch.connManager.getConnections()[peerId].mapIt(it.connection)
|
||||||
|
if connections.anyIt(not isRelayed(it)):
|
||||||
|
return
|
||||||
|
let incomingRelays = connections.filterIt(it.transportDir == Direction.In)
|
||||||
|
if incomingRelays.len == 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
let relayedConn = incomingRelays[0]
|
||||||
|
|
||||||
|
if await self.tryStartingDirectConn(switch, peerId):
|
||||||
|
await closeRelayConn(relayedConn)
|
||||||
|
return
|
||||||
|
|
||||||
|
let dcutrClient = DcutrClient.new()
|
||||||
|
var natAddrs = switch.peerStore.getMostObservedProtosAndPorts()
|
||||||
|
if natAddrs.len == 0:
|
||||||
|
natAddrs = switch.peerInfo.listenAddrs.mapIt(switch.peerStore.guessDialableAddr(it))
|
||||||
|
await dcutrClient.startSync(switch, peerId, natAddrs)
|
||||||
|
await closeRelayConn(relayedConn)
|
||||||
|
except CatchableError as err:
|
||||||
|
debug "Hole punching failed during dcutr", err = err.msg
|
||||||
|
|
||||||
method setup*(self: HPService, switch: Switch): Future[bool] {.async.} =
|
method setup*(self: HPService, switch: Switch): Future[bool] {.async.} =
|
||||||
var hasBeenSetup = await procCall Service(self).setup(switch)
|
var hasBeenSetup = await procCall Service(self).setup(switch)
|
||||||
hasBeenSetup = hasBeenSetup and await self.autonatService.setup(switch)
|
hasBeenSetup = hasBeenSetup and await self.autonatService.setup(switch)
|
||||||
|
@ -73,22 +102,8 @@ method setup*(self: HPService, switch: Switch): Future[bool] {.async.} =
|
||||||
let dcutrProto = Dcutr.new(switch)
|
let dcutrProto = Dcutr.new(switch)
|
||||||
switch.mount(dcutrProto)
|
switch.mount(dcutrProto)
|
||||||
|
|
||||||
self.newConnectedPeerHandler = proc (peerId: PeerId, event: PeerEvent): Future[void] {.async.} =
|
self.newConnectedPeerHandler = proc (peerId: PeerId, event: PeerEvent) {.async.} =
|
||||||
try:
|
await newConnectedPeerHandler(self, switch, peerId, event)
|
||||||
let conn = switch.connManager.selectMuxer(peerId).connection
|
|
||||||
if isRelayed(conn) and conn.transportDir == Direction.In:
|
|
||||||
if await self.tryStartingDirectConn(switch, peerId):
|
|
||||||
await conn.close()
|
|
||||||
return
|
|
||||||
let dcutrClient = DcutrClient.new()
|
|
||||||
var natAddrs = switch.peerStore.getMostObservedProtosAndPorts()
|
|
||||||
if natAddrs.len == 0:
|
|
||||||
natAddrs = switch.peerInfo.listenAddrs.mapIt(switch.peerStore.guessDialableAddr(it))
|
|
||||||
await dcutrClient.startSync(switch, peerId, natAddrs)
|
|
||||||
await sleepAsync(2000.milliseconds) # grace period before closing relayed connection
|
|
||||||
await conn.close()
|
|
||||||
except CatchableError as err:
|
|
||||||
debug "Hole punching failed during dcutr", err = err.msg
|
|
||||||
|
|
||||||
switch.connManager.addPeerEventHandler(self.newConnectedPeerHandler, PeerEventKind.Joined)
|
switch.connManager.addPeerEventHandler(self.newConnectedPeerHandler, PeerEventKind.Joined)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue