Swiftpack.co - orlandos-nl/DNSClient as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
See all packages published by orlandos-nl.
orlandos-nl/DNSClient 2.4.1
A DNS Resolver in Swift
⭐️ 42
🕓 14 weeks ago
iOS macOS
.package(url: "https://github.com/orlandos-nl/DNSClient.git", from: "2.4.1")


Async DNS resolution, with all the DNS features you need!

Join our Discord for any questions and friendly banter.

Installation 💥

Add the package:

.package(url: "https://github.com/orlandos-nl/DNSClient.git", from: "2.0.0"),

And to your target:

.product(name: "DNSClient", package: "DNSClient"),

Usage 🤯

Connect to your default DNS Server using UDP:

let client = try DNSClient.connect(on: loop).wait()

Connect to a specific DNS Server:

let googleDNS = SocketAddress(ipAddress: "", port: 53)
let client = try DNSClient.connect(on: loop, config: [googleDNS]).wait()

Resolve SRV Records:

let records = try client.sendQuery(forHost: "example.com", type: .srv).wait()

Resolve TXT Records:

let records = try client.sendQuery(forHost: "example.com", type: .txt).wait()

Resolve PTR Records:

let records = try client.ipv4InverseAddress("").wait()

let records = try client.ipv6InverseAddress("2001:DB8::").wait()

Need I say more?

Note: You can replace .wait() function calls with .get() to get the result using async/await.

iOS and TCP Support

On iOS 12+, you can connect using Network.Framework:

import NIOTransportServices
import DNSClient

let client = try DNSClient.connect(on: loop, host: "").wait()

There is also another overload that implements TCP support:

let client = try DNSClient.connectTSTCP(on: loop, host: "").wait()

TCP support is also available on Linux as DNSClient.connectTCP(on: loop, host: ...)

Note that NIOTS (TransportServices) needs their own EventLoop type, whereas NIO's MultiThreadedEventLoopGroup is used for the POSIX/Linux implementation.


The DNS Client doesn't retain itself during requests. This means that you cannot do the following:

DNSClient.connect(on: request.eventLoop).flatMap { client in
    // client.doQueryStuff()

The client will deallocate itself, resulting in a timeout. Make sure that the client is strongly referenced, either until all results are in or by setting it on a shared context. In Vapor, that can be the request's storage container. On other services, you could consider a global, ThreadSpecificVariable or a property on your class.

Featured In 🛍


Stars: 42
Last commit: 13 weeks ago
Advertisement: IndiePitcher.com - Cold Email Software for Startups

Release Notes

14 weeks ago

Disable PTR APIs on Linux, as the C structs being used are symbol name is mangled on Linux, and differently between some Swift versions

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics