libp2p
Version:
JavaScript implementation of libp2p, a modular peer to peer network stack
52 lines • 1.57 kB
JavaScript
import { dns, RecordType } from '@multiformats/dns';
import { multiaddr } from '@multiformats/multiaddr';
class DNSAddrResolver {
dns;
canResolve(ma) {
return ma.getComponents().some(({ name }) => name === 'dnsaddr');
}
async resolve(ma, options) {
const hostname = ma.getComponents()
.find(component => component.name === 'dnsaddr')
?.value;
if (hostname == null) {
return [ma];
}
const resolver = this.getDNS(options);
const result = await resolver.query(`_dnsaddr.${hostname}`, {
signal: options?.signal,
types: [
RecordType.TXT
]
});
const peerId = ma.getComponents()
.find(component => component.name === 'p2p')
?.value;
const output = [];
for (const answer of result.Answer) {
const addr = answer.data
.replace(/["']/g, '')
.trim()
.split('=')[1];
if (addr == null) {
continue;
}
if (peerId != null && !addr.includes(peerId)) {
continue;
}
output.push(multiaddr(addr));
}
return output;
}
getDNS(options) {
if (options.dns != null) {
return options.dns;
}
if (this.dns == null) {
this.dns = dns();
}
return this.dns;
}
}
export const dnsaddrResolver = new DNSAddrResolver();
//# sourceMappingURL=dnsaddr.js.map