Skip to content

Commit 127abe2

Browse files
authored
fix: unhandled promise rejection when finding gateway (#2884)
Defer creating the last public ip promise until it's guaranteed to have a a listener for promise rejections. Fixes ipfs/helia#702
1 parent e7133ee commit 127abe2

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

packages/upnp-nat/src/check-external-address.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class ExternalAddressChecker implements ExternalAddress, Startable {
3333
private readonly addressManager: AddressManager
3434
private started: boolean
3535
private lastPublicIp?: string
36-
private readonly lastPublicIpPromise: DeferredPromise<string>
36+
private lastPublicIpPromise?: DeferredPromise<string>
3737
private readonly check: RepeatingTask
3838
private readonly onExternalAddressChange?: (newExternalAddress: string) => void
3939

@@ -46,8 +46,6 @@ class ExternalAddressChecker implements ExternalAddress, Startable {
4646

4747
this.checkExternalAddress = this.checkExternalAddress.bind(this)
4848

49-
this.lastPublicIpPromise = pDefer()
50-
5149
this.check = repeatingTask(this.checkExternalAddress, init.interval ?? 30000, {
5250
timeout: init.timeout ?? 10000,
5351
runImmediately: true
@@ -76,7 +74,13 @@ class ExternalAddressChecker implements ExternalAddress, Startable {
7674
throw new NotStartedError('Not started yet')
7775
}
7876

79-
return this.lastPublicIp ?? raceSignal(this.lastPublicIpPromise.promise, options?.signal, {
77+
if (this.lastPublicIp != null) {
78+
return this.lastPublicIp
79+
}
80+
81+
this.lastPublicIpPromise = pDefer()
82+
83+
return raceSignal(this.lastPublicIpPromise.promise, options?.signal, {
8084
errorMessage: 'Requesting the public IP from the network gateway timed out - UPnP may not be enabled'
8185
})
8286
}
@@ -94,7 +98,7 @@ class ExternalAddressChecker implements ExternalAddress, Startable {
9498
}
9599

96100
this.lastPublicIp = externalAddress
97-
this.lastPublicIpPromise.resolve(externalAddress)
101+
this.lastPublicIpPromise?.resolve(externalAddress)
98102
} catch (err: any) {
99103
this.log.error('could not resolve external address - %e', err)
100104

@@ -103,7 +107,7 @@ class ExternalAddressChecker implements ExternalAddress, Startable {
103107
return
104108
}
105109

106-
this.lastPublicIpPromise.reject(err)
110+
this.lastPublicIpPromise?.reject(err)
107111
}
108112
}
109113
}

0 commit comments

Comments
 (0)