diggy
Version:
Multi-backend DNS resolver for Node.js/Browser — supports dig, DNS over HTTPS, and native Node.js DNS.
70 lines (69 loc) • 2.31 kB
JavaScript
import * as _dns from "node:dns/promises";
import { DNSRecordType } from "../types";
/**
* Returns a DNS resolver that uses Node.js's built-in DNS module.
*
* @example
* Without any additional configuration, it will use the system's default DNS servers.
*
* ```ts
* import { nodeResolver } from "diggy";
* const resolver = nodeResolver();
* const records = await resolver("example.com", "A");
* ```
*
* @example
* You can specify a list of DNS servers to use.
*
* ```ts
* import { nodeResolver } from "diggy";
* const resolver = nodeResolver(["8.8.8.8", "1.1.1.1"]);
* const records = await resolver("example.com", "A");
* ```
*
* @param servers - An array of DNS server addresses to use. If empty, the system's default DNS servers will be used.
* @group Resolvers
*/
export function nodeResolver(servers = []) {
const dns = new _dns.Resolver();
if (servers.length > 0) {
dns.setServers(servers);
}
return async (host, type) => {
try {
// Handle special cases for A and AAAA records to include TTL
if (type === DNSRecordType.A || type === DNSRecordType.AAAA) {
const records = type === DNSRecordType.A
? await dns.resolve4(host, { ttl: true })
: await dns.resolve6(host, { ttl: true });
return records.map(({ address, ttl }) => ({
name: host,
type: type,
ttl: ttl,
data: address,
}));
}
// Handle SOA (is not an array)
if (type === DNSRecordType.SOA) {
const record = await dns.resolveSoa(host);
return [
{
name: host,
type: type,
data: record,
},
];
}
// Handle CAA, MX, NAPTR, NS, PTR, SRV, TXT (all return arrays)
const records = (await dns.resolve(host, type));
return records.map((record) => ({
name: host,
type: type,
data: Array.isArray(record) ? record.join(" ") : record,
}));
}
catch {
return [];
}
};
}