Skip to content

Commit 3c8a559

Browse files
authored
fix: treat empty dnsaddr answer as no addresses (#3550)
* fix: treat empty dnsaddr answer as no addresses @multiformats/dns 1.0.15 throws on an empty answer instead of returning an empty result. Catch that in the dnsaddr resolver so a dnsaddr with no records fails with NoValidAddressesError, while real DNS failures still surface as DNSQueryFailedError.
1 parent f144def commit 3c8a559

1 file changed

Lines changed: 23 additions & 7 deletions

File tree

  • packages/libp2p/src/connection-manager/resolvers

packages/libp2p/src/connection-manager/resolvers/dnsaddr.ts

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { dns, RecordType } from '@multiformats/dns'
22
import { multiaddr } from '@multiformats/multiaddr'
33
import type { MultiaddrResolver, MultiaddrResolveOptions } from '@libp2p/interface'
4-
import type { DNS } from '@multiformats/dns'
4+
import type { DNS, DNSResponse } from '@multiformats/dns'
55
import type { Multiaddr } from '@multiformats/multiaddr'
66

77
class DNSAddrResolver implements MultiaddrResolver {
@@ -21,12 +21,28 @@ class DNSAddrResolver implements MultiaddrResolver {
2121
}
2222

2323
const resolver = this.getDNS(options)
24-
const result = await resolver.query(`_dnsaddr.${hostname}`, {
25-
signal: options?.signal,
26-
types: [
27-
RecordType.TXT
28-
]
29-
})
24+
25+
let result: DNSResponse
26+
27+
try {
28+
result = await resolver.query(`_dnsaddr.${hostname}`, {
29+
signal: options?.signal,
30+
types: [
31+
RecordType.TXT
32+
]
33+
})
34+
} catch (err: any) {
35+
const noAnswers = err.name === 'DNSQueryFailedError' &&
36+
Array.isArray(err.errors) &&
37+
err.errors.length > 0 &&
38+
err.errors.every((e: Error) => e.name === 'EmptyDNSAnswerError')
39+
40+
if (noAnswers) {
41+
return []
42+
}
43+
44+
throw err
45+
}
3046

3147
const peerId = ma.getComponents()
3248
.find(component => component.name === 'p2p')

0 commit comments

Comments
 (0)