packages feed

dnsbase-1.0.1.0: dnsbase.cabal

cabal-version:  3.12
name:           dnsbase
version:        1.0.1.0
build-type:     Simple
synopsis:       Stub DNS resolver with a typed RData model and value-based extension API

description:    A DNS stub resolver library for Haskell.  The IO layer is
                derived from Kazu Yamamoto's @dns@ package; what @dnsbase@
                adds is a rich set of RRtypes and a runtime-extensible
                RRtype data model with a simple configuration interface.
                .
                Every RR type's payload is modeled as a dedicated Haskell
                type — these include, for example, the recent SVCB and HTTPS
                service-binding records, with extensible up-to-date SvcParam
                coverage.  EDNS option support includes Extended DNS Errors
                (EDE) whose info-code name table is user-extensible.  Coverage
                of both widely used and historical DNS RR types is comprehensive
                — only the most marginal obsolete or experimental types remain
                unimplemented.
                .
                Applications can extend the library with any /missing/
                RRTYPEs, EDNS(0) options, SVCB and HTTPS SvcParam values.
                Application-specified data types take precedence over any
                existing or later added built-in implementations.
                .
                Extensions are registered by constructing a pure resolver
                configuration value, rather than via IO actions on mutable
                global state.  Adding custom data types to the library does not
                require a source-code fork.  See the
                <https://hackage-content.haskell.org/package/dnsbase-1.0.0.0/candidate/docs/Net-DNSBase-Extensible.html Net.DNSBase.Extensible>
                module for
                <https://hackage-content.haskell.org/package/dnsbase-1.0.0.0/candidate/docs/Net-DNSBase-Extensible.html#customRRtype detailed examples>
                .
                The library has been deployed as part of a DANE/DNSSEC survey
                for many years, and performs ~108 million queries each day,
                over approximately 3.5 hours (while also saving results to a
                database and performing some SMTP STARTTLS probes).  Domain-name
                parsing supports 8-bit RFC 1035 names directly and also
                supports pluggable @Text@-based parsers via external
                libraries, for example from the companion
                <https://hackage.haskell.org/package/idna2008 idna2008>
                package.
                .

license:        BSD-3-Clause
license-files:  LICENSE
                LICENSE.dns
author:         Viktor Dukhovni
maintainer:     ietf-dane@dukhovni.org
homepage:       https://github.com/dnsbase/dnsbase
bug-reports:    https://github.com/dnsbase/dnsbase/issues
copyright:      2018-2026 Viktor Dukhovni
category:       Network
tested-with: GHC == 9.10.3
           , GHC == 9.12.3
extra-source-files:
    CHANGELOG.md
    README.md

common all
  ghc-options: -O2 -Wall
  default-language: GHC2024
  default-extensions:
    BlockArguments
    DerivingVia
    MultiWayIf
    PatternSynonyms
    RequiredTypeArguments
    StrictData
    TypeFamilies
    ViewPatterns

common deps
  build-depends:
      base                  >=4.20      && <5
    , base16               ^>=1.0
    , base32                >=0.3       && <0.5
    , base64               ^>=1.0
    , bytestring            >=0.10.8    && <0.13
    , crypton               >=0.30      && <1.2
    , containers            >=0.6       && <0.9
    , deepseq              ^>=1.5
    , hashtables            >=1.2       && <1.6
    , hourglass            ^>=0.2.12
    , iproute              ^>=1.7.9
    , monad-ste            ^>=0.1
    , mtl                   >=2.2       && <2.4
    , network               >=3.1       && <3.3
    , primitive             >=0.8       && <0.10
    , template-haskell      >=2.22      && <2.25
    , text                  >=2.0       && <2.2
    , time                  >=1.11      && <1.16
    , transformers          >=0.5       && <2.7
    , unordered-containers ^>=0.2

-- Shared source layout for both the main library and the
-- test-only internal library.  Both compile the same .hs files
-- under @src@ and @internal@; the two library stanzas differ
-- only in which modules they expose.
common library-source
  hs-source-dirs: src internal

-- Test-only sub-library that exposes every module of the package.
-- Tests @build-depends: dnsbase:internal@ instead of @dnsbase@ so
-- they can reach internal modules without going through a hidden
-- import.  Built only when the package's test components are built.
library internal
  import: all, deps, library-source
  visibility: private
  exposed-modules:
    Net.DNSBase
    Net.DNSBase.Bytes
    Net.DNSBase.Decode.Domain
    Net.DNSBase.Decode.State
    Net.DNSBase.Domain
    Net.DNSBase.EDNS
    Net.DNSBase.EDNS.OptNum
    Net.DNSBase.EDNS.Option
    Net.DNSBase.EDNS.Option.ECS
    Net.DNSBase.EDNS.Option.EDE
    Net.DNSBase.EDNS.Option.NSID
    Net.DNSBase.EDNS.Option.Opaque
    Net.DNSBase.EDNS.Option.Secalgs
    Net.DNSBase.Encode.Metric
    Net.DNSBase.Encode.State
    Net.DNSBase.Error
    Net.DNSBase.Extensible
    Net.DNSBase.Flags
    Net.DNSBase.Lookup
    Net.DNSBase.Message
    Net.DNSBase.Nat16
    Net.DNSBase.NonEmpty
    Net.DNSBase.NsecTypes
    Net.DNSBase.Opcode
    Net.DNSBase.Present
    Net.DNSBase.RCODE
    Net.DNSBase.RData
    Net.DNSBase.RData.A
    Net.DNSBase.RData.CAA
    Net.DNSBase.RData.CSYNC
    Net.DNSBase.RData.Dnssec
    Net.DNSBase.RData.NSEC
    Net.DNSBase.RData.Obsolete
    Net.DNSBase.RData.SOA
    Net.DNSBase.RData.SRV
    Net.DNSBase.RData.SVCB
    Net.DNSBase.RData.SVCB.SPV
    Net.DNSBase.RData.SVCB.SPVList
    Net.DNSBase.RData.SVCB.SPVSet
    Net.DNSBase.RData.SVCB.SVCParamKey
    Net.DNSBase.RData.SVCB.SVCParamValue
    Net.DNSBase.RData.TLSA
    Net.DNSBase.RData.TXT
    Net.DNSBase.RData.WKS
    Net.DNSBase.RData.XNAME
    Net.DNSBase.RR
    Net.DNSBase.RRCLASS
    Net.DNSBase.RRTYPE
    Net.DNSBase.RRSet
    Net.DNSBase.Resolver
    Net.DNSBase.Secalgs
    Net.DNSBase.Text
    Net.DNSBase.Decode.Internal.Domain
    Net.DNSBase.Decode.Internal.Message
    Net.DNSBase.Decode.Internal.Option
    Net.DNSBase.Decode.Internal.RData
    Net.DNSBase.Decode.Internal.State
    Net.DNSBase.EDNS.Internal.OptNum
    Net.DNSBase.EDNS.Internal.Option
    Net.DNSBase.EDNS.Internal.Option.Opaque
    Net.DNSBase.Encode.Internal.Metric
    Net.DNSBase.Encode.Internal.State
    Net.DNSBase.Internal.Bytes
    Net.DNSBase.Internal.Domain
    Net.DNSBase.Internal.EDNS
    Net.DNSBase.Internal.Error
    Net.DNSBase.Internal.Flags
    Net.DNSBase.Internal.Message
    Net.DNSBase.Internal.NameComp
    Net.DNSBase.Internal.Nat16
    Net.DNSBase.Internal.Opcode
    Net.DNSBase.Internal.Peer
    Net.DNSBase.Internal.Present
    Net.DNSBase.Internal.RCODE
    Net.DNSBase.Internal.RData
    Net.DNSBase.Internal.RR
    Net.DNSBase.Internal.RRCLASS
    Net.DNSBase.Internal.RRTYPE
    Net.DNSBase.Internal.SockIO
    Net.DNSBase.Internal.Text
    Net.DNSBase.Internal.Transport
    Net.DNSBase.Internal.Util
    Net.DNSBase.RData.Internal.XNAME
    Net.DNSBase.Resolver.Internal.Encoding
    Net.DNSBase.Resolver.Internal.Parser
    Net.DNSBase.Resolver.Internal.Types

-- The main library.  This is what downstream packages (and Hackage)
-- see; @other-modules@ keeps the implementation hidden but compiled
-- into the same library, so haddocks on internal symbols propagate
-- to their public re-exports.
library
  import: all, deps, library-source
  exposed-modules:
    Net.DNSBase
    Net.DNSBase.Bytes
    Net.DNSBase.Decode.Domain
    Net.DNSBase.Decode.State
    Net.DNSBase.Domain
    Net.DNSBase.EDNS
    Net.DNSBase.EDNS.Option
    Net.DNSBase.EDNS.Option.ECS
    Net.DNSBase.EDNS.Option.EDE
    Net.DNSBase.EDNS.Option.NSID
    Net.DNSBase.EDNS.Option.Opaque
    Net.DNSBase.EDNS.Option.Secalgs
    Net.DNSBase.EDNS.OptNum
    Net.DNSBase.Encode.Metric
    Net.DNSBase.Encode.State
    Net.DNSBase.Error
    Net.DNSBase.Extensible
    Net.DNSBase.Flags
    Net.DNSBase.Lookup
    Net.DNSBase.Message
    Net.DNSBase.Nat16
    Net.DNSBase.NonEmpty
    Net.DNSBase.NsecTypes
    Net.DNSBase.Opcode
    Net.DNSBase.Present
    Net.DNSBase.RCODE
    Net.DNSBase.RData
    Net.DNSBase.RData.A
    Net.DNSBase.RData.CAA
    Net.DNSBase.RData.CSYNC
    Net.DNSBase.RData.Dnssec
    Net.DNSBase.RData.NSEC
    Net.DNSBase.RData.Obsolete
    Net.DNSBase.RData.SOA
    Net.DNSBase.RData.SRV
    Net.DNSBase.RData.SVCB
    Net.DNSBase.RData.SVCB.SPV
    Net.DNSBase.RData.SVCB.SPVList
    Net.DNSBase.RData.SVCB.SPVSet
    Net.DNSBase.RData.SVCB.SVCParamKey
    Net.DNSBase.RData.SVCB.SVCParamValue
    Net.DNSBase.RData.TLSA
    Net.DNSBase.RData.TXT
    Net.DNSBase.RData.WKS
    Net.DNSBase.RData.XNAME
    Net.DNSBase.Resolver
    Net.DNSBase.RR
    Net.DNSBase.RRCLASS
    Net.DNSBase.RRSet
    Net.DNSBase.RRTYPE
    Net.DNSBase.Secalgs
    Net.DNSBase.Text
  other-modules:
    Net.DNSBase.Decode.Internal.Domain
    Net.DNSBase.Decode.Internal.Message
    Net.DNSBase.Decode.Internal.Option
    Net.DNSBase.Decode.Internal.RData
    Net.DNSBase.Decode.Internal.State
    Net.DNSBase.EDNS.Internal.OptNum
    Net.DNSBase.EDNS.Internal.Option
    Net.DNSBase.EDNS.Internal.Option.Opaque
    Net.DNSBase.Encode.Internal.Metric
    Net.DNSBase.Encode.Internal.State
    Net.DNSBase.Internal.Bytes
    Net.DNSBase.Internal.Domain
    Net.DNSBase.Internal.EDNS
    Net.DNSBase.Internal.Error
    Net.DNSBase.Internal.Flags
    Net.DNSBase.Internal.Message
    Net.DNSBase.Internal.NameComp
    Net.DNSBase.Internal.Nat16
    Net.DNSBase.Internal.Opcode
    Net.DNSBase.Internal.Peer
    Net.DNSBase.Internal.Present
    Net.DNSBase.Internal.RCODE
    Net.DNSBase.Internal.RData
    Net.DNSBase.Internal.RR
    Net.DNSBase.Internal.RRCLASS
    Net.DNSBase.Internal.RRTYPE
    Net.DNSBase.Internal.SockIO
    Net.DNSBase.Internal.Text
    Net.DNSBase.Internal.Transport
    Net.DNSBase.Internal.Util
    Net.DNSBase.RData.Internal.XNAME
    Net.DNSBase.Resolver.Internal.Encoding
    Net.DNSBase.Resolver.Internal.Parser
    Net.DNSBase.Resolver.Internal.Types

-- Test framework dependencies, split out so individual stanzas
-- can opt in.
common test-deps
  build-depends:
      tasty
    , tasty-hunit
    , tasty-quickcheck

common test
  import: all, deps
  hs-source-dirs: tests
  build-depends: dnsbase:internal

test-suite domain
  import: test
  type: exitcode-stdio-1.0
  main-is: domain.hs

test-suite literals
  import: test
  type: exitcode-stdio-1.0
  main-is: literals.hs
  other-modules: LiteralsParser

test-suite message
  import: test
  type: exitcode-stdio-1.0
  main-is: message.hs

test-suite extensibility
  import: test, test-deps
  type: exitcode-stdio-1.0
  main-is: extensibility.hs

test-suite test
  import: test, test-deps
  type: exitcode-stdio-1.0
  main-is: test.hs

benchmark bench
  import: test
  hs-source-dirs: bench
  type: exitcode-stdio-1.0
  main-is: bench.hs
  build-depends:
      tasty-bench