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
JavaScript
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"],
]);