diggy
Version:
Multi-backend DNS resolver for Node.js/Browser — supports dig, DNS over HTTPS, and native Node.js DNS.
55 lines (54 loc) • 1.82 kB
JavaScript
import { toDnsRecord } from "../utils/to-dns-record";
/**
* Returns a DNS resolver that uses the `dig` command to resolve DNS records.
*
* ```ts
* import { digResolver } from "diggy";
* const resolver = digResolver();
* const records = await resolver("example.com", "A");
* console.log(records);
* ```
*
* You can also specify the DNS server to use by passing it as an argument:
*
* ```ts
* import { digResolver } from "diggy";
* const resolver = digResolver("1.1.1.1");
* const records = await resolver("example.com", "A");
* console.log(records);
*```
*
* @param server - The DNS server to use (optional). If not provided, the default system resolver will be used.
* @group Resolvers
*/
export function digResolver(server) {
return async (host, type) => {
const args = [];
if (server) {
if (!server.startsWith("@")) {
server = `@${server}`;
}
args.push(server);
}
args.push(host, type);
const { spawnSync } = await import("node:child_process");
// Use spawnSync to run the dig command synchronously and capture the output
const dig = spawnSync("dig", [...args, "+noall", "+answer", "+cdflag"]);
const results = dig.stdout.toString();
const records = [];
// split lines & ignore comments or empty lines
results
.split("\n")
.filter((line) => line.length && !line.startsWith(";"))
.forEach((line) => {
const parts = line.replace(/\t+/g, " ").split(" ");
records.push(toDnsRecord({
name: parts[0] ?? "",
ttl: Number(parts[1]),
type: parts[3],
data: parts.slice(4).join(" "),
}));
});
return records;
};
}