Bun implements its own dns module and the node:dns module.
import * as dns from "node:dns";
const addrs = await dns.promises.resolve4("bun.com", { ttl: true });
console.log(addrs);
// => [{ address: "172.67.161.226", family: 4, ttl: 0 }, ...]
import { dns } from "bun";
dns.prefetch("bun.com", 443);
DNS caching in Bun
Bun caches DNS lookups, which makes repeated connections to the same hosts faster.
The cache holds up to 255 entries for a maximum of 30 seconds each. If a connection to a host fails, Bun removes that host’s entry from the cache. Simultaneous connections to the same host share one DNS lookup.
This cache is automatically used by:
bun install
fetch()
node:http (client)
Bun.connect
node:net
node:tls
When should I prefetch a DNS entry?
Web browsers expose <link rel="dns-prefetch"> to resolve a hostname before it’s needed. In Bun, dns.prefetch does the same thing: use it when you know you’ll connect to a host soon and want to avoid the initial DNS lookup.
import { dns } from "bun";
dns.prefetch("my.database-host.com", 5432);
A database driver is a good example: prefetch the database host’s DNS entry when your application starts, and by the time the rest of the application has loaded, the lookup may already be complete.
dns.prefetch
This API is experimental and may change in the future.
dns.prefetch resolves a hostname before you need it.
dns.prefetch(hostname: string, port: number): void;
Here’s an example:
import { dns } from "bun";
dns.prefetch("bun.com", 443);
//
// ... sometime later ...
await fetch("https://bun.com");
dns.getCacheStats()
This API is experimental and may change in the future.
dns.getCacheStats() returns the current cache stats as an object with the following properties:
{
cacheHitsCompleted: number; // Cache hits completed
cacheHitsInflight: number; // Cache hits in flight
cacheMisses: number; // Cache misses
size: number; // Number of items in the DNS cache
errors: number; // Number of times a connection failed
totalCount: number; // Number of times a connection was requested at all (including cache hits and misses)
}
Example:
import { dns } from "bun";
const stats = dns.getCacheStats();
console.log(stats);
// => { cacheHitsCompleted: 0, cacheHitsInflight: 0, cacheMisses: 0, size: 0, errors: 0, totalCount: 0 }
Configuring DNS cache TTL
Bun caches DNS entries for 30 seconds by default. To change the TTL, set the $BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS environment variable. For example, to set it to 5 seconds:
BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS=5 bun run my-script.ts
Why is 30 seconds the default?
The system API underneath (getaddrinfo) does not expose the TTL of a DNS entry, so Bun has to pick a number. We chose 30 seconds because it’s long enough to see the benefits of caching and short enough to be unlikely to cause issues if a DNS entry changes. Amazon Web Services recommends 5 seconds for the Java Virtual Machine, though the JVM’s default is to cache indefinitely.