fix: do upnp hole punch after startup (#1217)

The transport manager configures it's addresses during the `start`
phase so access them during `afterStart` so they'll be ready for use.
This commit is contained in:
Alex Potsides
2022-05-18 13:19:31 +01:00
committed by GitHub
parent 1f5d5c2de1
commit d5386df684
3 changed files with 17 additions and 12 deletions

View File

@ -92,7 +92,7 @@
"test:interop": "aegir test -t node -f dist/test/interop.js" "test:interop": "aegir test -t node -f dist/test/interop.js"
}, },
"dependencies": { "dependencies": {
"@achingbrain/nat-port-mapper": "^1.0.0", "@achingbrain/nat-port-mapper": "^1.0.3",
"@libp2p/connection": "^1.1.5", "@libp2p/connection": "^1.1.5",
"@libp2p/crypto": "^0.22.11", "@libp2p/crypto": "^0.22.11",
"@libp2p/interfaces": "^1.3.31", "@libp2p/interfaces": "^1.3.31",

View File

@ -94,10 +94,14 @@ export class NatManager implements Startable {
return this.started return this.started
} }
start () {}
/** /**
* Starts the NAT manager * Attempt to use uPnP to configure port mapping using the current gateway.
*
* Run after start to ensure the transport manager has all addresses configured.
*/ */
start () { afterStart () {
if (isBrowser || !this.enabled || this.started) { if (isBrowser || !this.enabled || this.started) {
return return
} }
@ -105,7 +109,7 @@ export class NatManager implements Startable {
this.started = true this.started = true
// done async to not slow down startup // done async to not slow down startup
this._start().catch((err) => { void this._start().catch((err) => {
// hole punching errors are non-fatal // hole punching errors are non-fatal
log.error(err) log.error(err)
}) })

View File

@ -13,6 +13,7 @@ import { createFromJSON } from '@libp2p/peer-id-factory'
import { Components } from '@libp2p/interfaces/components' import { Components } from '@libp2p/interfaces/components'
import type { NatAPI } from '@achingbrain/nat-port-mapper' import type { NatAPI } from '@achingbrain/nat-port-mapper'
import { StubbedInstance, stubInterface } from 'ts-sinon' import { StubbedInstance, stubInterface } from 'ts-sinon'
import { start, stop } from '@libp2p/interfaces/startable'
const DEFAULT_ADDRESSES = [ const DEFAULT_ADDRESSES = [
'/ip4/127.0.0.1/tcp/0', '/ip4/127.0.0.1/tcp/0',
@ -49,7 +50,7 @@ describe('Nat Manager (TCP)', () => {
await components.getTransportManager().listen(components.getAddressManager().getListenAddrs()) await components.getTransportManager().listen(components.getAddressManager().getListenAddrs())
teardown.push(async () => { teardown.push(async () => {
await natManager.stop() await stop(natManager)
await components.getTransportManager().removeAll() await components.getTransportManager().removeAll()
}) })
@ -78,7 +79,7 @@ describe('Nat Manager (TCP)', () => {
let observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString()) let observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString())
expect(observed).to.be.empty() expect(observed).to.be.empty()
await natManager._start() await start(natManager)
observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString()) observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString())
expect(observed).to.not.be.empty() expect(observed).to.not.be.empty()
@ -127,7 +128,7 @@ describe('Nat Manager (TCP)', () => {
enabled: false enabled: false
}) })
natManager.start() await start(natManager)
await delay(100) await delay(100)
@ -146,7 +147,7 @@ describe('Nat Manager (TCP)', () => {
let observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString()) let observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString())
expect(observed).to.be.empty() expect(observed).to.be.empty()
await natManager._start() await start(natManager)
observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString()) observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString())
expect(observed).to.be.empty() expect(observed).to.be.empty()
@ -163,7 +164,7 @@ describe('Nat Manager (TCP)', () => {
let observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString()) let observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString())
expect(observed).to.be.empty() expect(observed).to.be.empty()
await natManager._start() await start(natManager)
observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString()) observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString())
expect(observed).to.be.empty() expect(observed).to.be.empty()
@ -180,7 +181,7 @@ describe('Nat Manager (TCP)', () => {
let observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString()) let observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString())
expect(observed).to.be.empty() expect(observed).to.be.empty()
await natManager._start() await start(natManager)
observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString()) observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString())
expect(observed).to.be.empty() expect(observed).to.be.empty()
@ -197,7 +198,7 @@ describe('Nat Manager (TCP)', () => {
let observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString()) let observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString())
expect(observed).to.be.empty() expect(observed).to.be.empty()
await natManager._start() await start(natManager)
observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString()) observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString())
expect(observed).to.be.empty() expect(observed).to.be.empty()
@ -214,7 +215,7 @@ describe('Nat Manager (TCP)', () => {
let observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString()) let observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString())
expect(observed).to.be.empty() expect(observed).to.be.empty()
await natManager._start() await start(natManager)
observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString()) observed = components.getAddressManager().getObservedAddrs().map(ma => ma.toString())
expect(observed).to.be.empty() expect(observed).to.be.empty()