UNPKG

diggy

Version:

Multi-backend DNS resolver for Node.js/Browser — supports dig, DNS over HTTPS, and native Node.js DNS.

58 lines (57 loc) 1.71 kB
import { toDnsRecord } from "../utils/to-dns-record.js"; /** * Returns a DNS resolver that uses DNS over HTTPS (DoH) to resolve DNS records. * * ```ts * import { dohResolver } from "diggy"; * const resolver = dohResolver("https://dns.google/resolve"); * const records = await resolver("example.com", "A"); * console.log(records); * ``` * * > 💡 **Tip:** Find more public [DoH endpoints here](https://github.com/curl/curl/wiki/DNS-over-HTTPS) * * @param url - The URL of the DoH server to use (e.g., `https://dns.google/resolve`). * @group Resolvers */ export function dohResolver(url) { const dnsUrl = new URL(url); return async (host, type) => { dnsUrl.searchParams.set("name", host); dnsUrl.searchParams.set("type", type); const re = await fetch(dnsUrl, { headers: { accept: "application/dns-json" }, }); if (!re.ok) { throw new Error(`Error fetching DNS records for ${host}: ${re.status} ${re.statusText}`); } const json = (await re.json()); if (!Array.isArray(json.Answer)) return []; // No records found return json.Answer.map((record) => { return toDnsRecord({ name: record.name, type: DNSTypeNumbers.get(record.type) ?? "UNKNOWN", ttl: record.TTL, data: record.data, }); }); }; } const DNSTypeNumbers = new Map([ [1, "A"], [2, "NS"], [5, "CNAME"], [6, "SOA"], [12, "PTR"], [15, "MX"], [16, "TXT"], [24, "SIG"], [25, "KEY"], [28, "AAAA"], [33, "SRV"], [35, "NAPTR"], [43, "DS"], [48, "DNSKEY"], [257, "CAA"], ]);