Strongly typed DNS for scala based on the cats ecosystem with scodec and fs2
Version | Release date | fs2 version | Scala versions |
---|---|---|---|
1.2.1 |
2022-12-29 | 3.4.0 |
3.2.1 |
1.2.0 |
2022-12-24 | 3.4.0 |
3.2.1 |
1.1.0 |
2022-03-25 | 3.2.5 |
3.1.1 |
1.0.0 |
2021-05-09 | 3.0.2 |
2.13.5 , 2.12.13 |
0.3.0 |
2021-01-09 | 2.5.0 |
2.13.4 , 2.12.12 |
0.2.0 |
2020-12-20 | 2.4.6 |
2.13.4 , 2.12.12 |
0.1.0 |
2020-12-17 | 2.4.6 |
2.13.4 , 2.12.12 |
// DNS with fs2
libraryDependencies += "fr.davit" %% "taxonomy-fs2" % "<version>"
If you want to only part of the project with another IO implementation for instance, you can import the following sub modules
// for the scala model only
libraryDependencies += "fr.davit" %% "taxonomy-model" % "<version>"
// for the binary protocol with scodec
libraryDependencies += "fr.davit" %% "taxonomy-scodec" % "<version>"
Here is a quick example of a DNS lookup to the 9.9.9.9
DNS server for the davit.fr
domain name
import java.net.{Inet4Address, InetAddress, InetSocketAddress}
import cats.effect.*
import cats.effect.unsafe.implicits.*
import fr.davit.taxonomy.model.record.*
import fr.davit.taxonomy.model.*
import fr.davit.taxonomy.scodec.DnsCodec
import fs2.io.net.Network
import munit.CatsEffectSuite
import scodec.Codec
import scala.concurrent.duration.*
given Codec[DnsMessage] = DnsCodec.dnsMessage
val quad9DnsServer = new InetSocketAddress("9.9.9.9", 53)
val question = DnsQuestion("davit.fr", DnsRecordType.A, unicastResponse = false, DnsRecordClass.Internet)
val query = DnsMessage.query(id = 1, questions = Seq(question))
val socketResource = Network[IO].openDatagramSocket()
val response = socketResource.use(s => Dns.resolve(s, DnsPacket(quad9DnsServer, query))).unsafeRunSync()