UNPKG

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
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 []; } }; }