|
| 1 | +--- |
| 2 | +title: darvaza.org/resolver |
| 3 | +description: Pluggable DNS resolver library with forwarding, iterative, and parallel lookup strategies built on miekg/dns. |
| 4 | +category: |
| 5 | + - darvaza |
| 6 | + - networking |
| 7 | + - go |
| 8 | +repo: github:darvaza-proxy/resolver |
| 9 | +licence: MIT |
| 10 | +go: darvaza.org/resolver |
| 11 | +--- |
| 12 | + |
| 13 | +Pluggable DNS resolver library built on :go-pkg{mod="github.com/miekg/dns" label="miekg/dns"}. |
| 14 | +Defines the :go-pkg{mod="darvaza.org/resolver" sym="Resolver" short}, |
| 15 | +:go-pkg{mod="darvaza.org/resolver" sym="Lookuper" short}, |
| 16 | +and :go-pkg{mod="darvaza.org/resolver" sym="Exchanger" short} |
| 17 | +interfaces that decouple DNS consumers from the transport and |
| 18 | +resolution strategy. |
| 19 | + |
| 20 | +Three resolver constructors cover the common cases: |
| 21 | +`SystemResolver` wraps :go-pkg{mod="net" sym="Resolver"}, |
| 22 | +`NewResolver` delegates to any `Lookuper`, |
| 23 | +and `NewRootResolver` performs iterative resolution from the |
| 24 | +root servers. |
| 25 | + |
| 26 | +## Lookuper implementations |
| 27 | + |
| 28 | +| Lookuper | Description | |
| 29 | +|----------|-------------| |
| 30 | +| :go-pkg{mod="darvaza.org/resolver" sym="SingleLookuper" short} | Forwards queries to a single :go-pkg{mod="darvaza.org/resolver" dir="pkg/client" sym="Client" short} | |
| 31 | +| :go-pkg{mod="darvaza.org/resolver" sym="MultiLookuper" short} | Fans out to multiple lookupers, returns the first response | |
| 32 | +| :go-pkg{mod="darvaza.org/resolver" sym="RootLookuper" short} | Iterative resolution from root nameservers | |
| 33 | +| :go-pkg{mod="darvaza.org/resolver" sym="SingleFlight" short} | Deduplicates identical concurrent queries | |
| 34 | + |
| 35 | +Well-known recursive resolvers (Google, Cloudflare, Quad9) are |
| 36 | +available as one-liner constructors. |
| 37 | + |
| 38 | +## Client middleware |
| 39 | + |
| 40 | +| Middleware | Description | |
| 41 | +|------------|-------------| |
| 42 | +| :go-pkg{mod="darvaza.org/resolver" dir="pkg/client" sym="Auto" short} | Selects protocol by server prefix (`udp://`, `tcp://`, `tls://`), retries truncated UDP as TCP | |
| 43 | +| :go-pkg{mod="darvaza.org/resolver" dir="pkg/client" sym="SingleFlight" short} | Per-server deduplication with short-lived caching | |
| 44 | +| :go-pkg{mod="darvaza.org/resolver" dir="pkg/client" sym="WorkerPool" short} | Concurrency limiter for exchange calls | |
| 45 | +| :go-pkg{mod="darvaza.org/resolver" dir="pkg/client" sym="NoAAAA" short} | Strips `AAAA` records for IPv4-only environments | |
| 46 | + |
| 47 | +## Additional packages |
| 48 | + |
| 49 | +- The :go-pkg{dir="pkg/server" mod="darvaza.org/resolver"} package |
| 50 | + provides a DNS server handler on top of any `Lookuper` |
| 51 | + or `Exchanger`. |
| 52 | +- The :go-pkg{dir="pkg/reflect" mod="darvaza.org/resolver"} package |
| 53 | + provides optional logging middleware |
| 54 | + using :go-pkg{mod="darvaza.org/slog"}. |
| 55 | +- The :go-pkg{dir="pkg/errors" mod="darvaza.org/resolver"} package |
| 56 | + provides standard :go-pkg{mod="net" sym="DNSError"} wrappers |
| 57 | + with :go-pkg{mod="github.com/miekg/dns" sym="Msg"} conversion. |
| 58 | + |
| 59 | +## See also |
| 60 | + |
| 61 | +- Network helpers — :go-pkg{mod="darvaza.org/x/net"} |
| 62 | +- Structured logging — :go-pkg{mod="darvaza.org/slog"} |
| 63 | +- DNS library — :go-pkg{mod="github.com/miekg/dns" label="miekg/dns"} |
0 commit comments