
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
Unified DNS library with multi-driver support, DoH server, and comprehensive record management
Unified DNS management library for multi-provider DNS operations
# Install with npm
$ npm install undns
# Install with yarn
$ yarn add undns
# Install with pnpm
$ pnpm add undns
import { createDNSManager } from "undns";
import nodeDriver from "undns/drivers/node";
// Create DNS manager with Node.js driver
const dns = createDNSManager({
driver: nodeDriver({
servers: ["8.8.8.8", "1.1.1.1"], // Use Google and Cloudflare DNS
}),
});
// Get all records for a domain
const records = await dns.getRecords("example.com");
// Get specific record type
const aRecords = await dns.getRecords("example.com", { type: "A" });
const mxRecords = await dns.getRecords("example.com", { type: "MX" });
// Get a single record
const firstARecord = await dns.getRecord("example.com", { type: "A" });
// Check if record exists
const hasMxRecord = await dns.hasRecord("example.com", { type: "MX" });
// Query subdomain records
const wwwRecords = await dns.getRecords("example.com", {
name: "www",
type: "A",
});
// Or specify full subdomain
const subRecords = await dns.getRecords("api.example.com");
// Set a new A record (only works with writable providers)
await dns.setRecord("example.com", {
name: "www",
type: "A",
address: "192.168.1.1",
});
// Set multiple records
await dns.setRecords("example.com", [
{ name: "www", type: "A", address: "192.168.1.1" },
{ name: "mail", type: "MX", priority: 10, exchange: "mail.example.com" },
]);
// Remove records
const recordToRemove = await dns.getRecord("example.com", { type: "A" });
if (recordToRemove) {
await dns.removeRecord("example.com", recordToRemove);
}
// Node.js DNS driver (read-only)
import nodeDriver from "undns/drivers/node";
// Cloudflare DNS driver (read-write)
import cloudflareDriver from "undns/drivers/cloudflare";
// DNS over HTTPS driver (read-only)
import dohDriver from "undns/drivers/doh";
// Null driver (for testing)
import nullDriver from "undns/drivers/null";
import { createDohServer, createDohHandler } from "undns/servers/doh";
// Create and start DoH server
const dohServer = createDohServer();
dohServer.serve(8080);
console.log("DoH Server running on http://localhost:8080/dns-query");
// Use handler with existing h3 app
import { createApp } from "h3";
const app = createApp();
const dohHandler = createDohHandler();
app.use("/dns-query", dohHandler);
import { resolvers, type DnsResolver } from "undns";
// Access all DNSCrypt public resolvers
console.log(`Total resolvers: ${resolvers.length}`);
// Find DoH resolvers
const dohResolvers = resolvers.filter((r) => r.proto === "DoH");
// Find privacy-focused resolvers (no log + no filter)
const privacyResolvers = resolvers.filter((r) => r.nolog && r.nofilter);
import { safeCall, unwrapResult } from "undns/utils";
const result = await safeCall(() => dns.getRecords("example.com"), []);
if (result.error) {
console.error("DNS query failed:", result.error);
} else {
console.log("Records:", unwrapResult(result));
}
createDNSManager(options)Creates a new DNS manager instance with the specified driver.
Parameters:
options.driver - DNS driver instance (Node.js, Cloudflare, etc.)Returns: DNS manager instance with methods below.
getRecords(domain, options?)Get all DNS records for a domain.
Parameters:
domain (string) - Domain name to queryoptions (object, optional) - Query options
name (string) - Subdomain name (e.g., 'www' for 'www.example.com')type (string) - Record type filter ('A', 'AAAA', 'CNAME', 'MX', 'TXT', 'NS', 'SOA', 'SRV', 'CAA')Returns: Promise<DNSRecord[]> - Array of DNS records
getRecord(domain, options?)Get a single DNS record (first match).
Parameters: Same as getRecords
Returns: Promise<DNSRecord | null> - First matching record or null
hasRecord(domain, options)Check if a DNS record exists.
Parameters: Same as getRecords (type is required)
Returns: Promise<boolean> - True if record exists
setRecord(domain, record)Create or update a DNS record (provider-dependent).
Parameters:
domain (string) - Domain namerecord (DNSRecordInput) - Record to create/update
name (string) - Record nametype (string) - Record typeReturns: Promise<DNSRecord> - Created/updated record
setRecords(domain, records)Create or update multiple DNS records.
Parameters:
domain (string) - Domain namerecords (DNSRecordInput[]) - Records to create/updateReturns: Promise<DNSRecord[]> - Created/updated records
removeRecord(domain, record)Remove a DNS record (provider-dependent).
Parameters:
domain (string) - Domain namerecord (DNSRecord) - Record to removeReturns: Promise<void>
removeRecords(domain, records)Remove multiple DNS records.
Parameters:
domain (string) - Domain namerecords (DNSRecord[]) - Records to removeReturns: Promise<void>
The library supports comprehensive DNS record types:
{ type: 'A', address: string, ttl: number }{ type: 'AAAA', address: string, ttl: number }{ type: 'CNAME', value: string }{ type: 'MX', priority: number, exchange: string }{ type: 'TXT', entries: string[] }{ type: 'NS', value: string }{ type: 'SOA', nsname: string, hostmaster: string, serial: number, refresh: number, retry: number, expire: number, minttl: number }{ type: 'SRV', priority: number, weight: number, port: number, name: string }{ type: 'CAA', critical: number, issue?: string, iodef?: string }{ type: 'TLSA', usage: number, selector: number, matchingType: number, certificate: string }{ type: 'NAPTR', order: number, preference: number, flags: string, service: string, regexp: string, replacement: string }FAQs
Unified DNS library with multi-driver support, DoH server, and comprehensive record management
We found that undns demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.