cabal-version:      >=1.10
name:               quic
version:            0.2.9
license:            BSD3
license-file:       LICENSE
maintainer:         kazu@iij.ad.jp
author:             Kazu Yamamoto
synopsis:           QUIC
description:
    Library for QUIC: A UDP-Based Multiplexed and Secure Transport

category:           Web
build-type:         Simple
extra-source-files:
    ChangeLog.md
    cbits/*.h
    cbits/picotls/*.h
    test/servercert.pem
    test/serverkey.pem

source-repository head
    type:     git
    location: https://github.com/kazu-yamamoto/quic

flag devel
    description: Development commands
    default:     False

flag fusion
    description: Use fusion AES-GCM engine from picotls
    manual:      True

library
    exposed-modules:
        Network.QUIC
        Network.QUIC.Client
        Network.QUIC.Internal
        Network.QUIC.Server

    other-modules:
        Network.QUIC.Client.Reader
        Network.QUIC.Client.Run
        Network.QUIC.Closer
        Network.QUIC.Common
        Network.QUIC.Config
        Network.QUIC.Connection
        Network.QUIC.Connection.Crypto
        Network.QUIC.Connection.Migration
        Network.QUIC.Connection.Misc
        Network.QUIC.Connection.PacketNumber
        Network.QUIC.Connection.Queue
        Network.QUIC.Connection.Role
        Network.QUIC.Connection.State
        Network.QUIC.Connection.Stream
        Network.QUIC.Connection.StreamTable
        Network.QUIC.Connection.Timeout
        Network.QUIC.Connection.Types
        Network.QUIC.Connector
        Network.QUIC.Crypto
        Network.QUIC.Crypto.Fusion
        Network.QUIC.Crypto.Keys
        Network.QUIC.Crypto.Nite
        Network.QUIC.Crypto.Types
        Network.QUIC.Crypto.Utils
        Network.QUIC.Event
        Network.QUIC.Exception
        Network.QUIC.Handshake
        Network.QUIC.IO
        Network.QUIC.Imports
        Network.QUIC.Info
        Network.QUIC.Logger
        Network.QUIC.Packet
        Network.QUIC.Packet.Decode
        Network.QUIC.Packet.Decrypt
        Network.QUIC.Packet.Encode
        Network.QUIC.Packet.Frame
        Network.QUIC.Packet.Header
        Network.QUIC.Packet.Number
        Network.QUIC.Packet.Token
        Network.QUIC.Parameters
        Network.QUIC.QLogger
        Network.QUIC.Qlog
        Network.QUIC.Receiver
        Network.QUIC.Recovery
        Network.QUIC.Recovery.Constants
        Network.QUIC.Recovery.Detect
        Network.QUIC.Recovery.Interface
        Network.QUIC.Recovery.LossRecovery
        Network.QUIC.Recovery.Metrics
        Network.QUIC.Recovery.Misc
        Network.QUIC.Recovery.PeerPacketNumbers
        Network.QUIC.Recovery.Persistent
        Network.QUIC.Recovery.Release
        Network.QUIC.Recovery.Timer
        Network.QUIC.Recovery.Types
        Network.QUIC.Recovery.Utils
        Network.QUIC.Sender
        Network.QUIC.Server.Reader
        Network.QUIC.Server.Run
        Network.QUIC.Socket
        Network.QUIC.Stream
        Network.QUIC.Stream.Frag
        Network.QUIC.Stream.Misc
        Network.QUIC.Stream.Queue
        Network.QUIC.Stream.Reass
        Network.QUIC.Stream.Skew
        Network.QUIC.Stream.Table
        Network.QUIC.Stream.Types
        Network.QUIC.TLS
        Network.QUIC.Types
        Network.QUIC.Types.Ack
        Network.QUIC.Types.CID
        Network.QUIC.Types.Constants
        Network.QUIC.Types.Error
        Network.QUIC.Types.Exception
        Network.QUIC.Types.Frame
        Network.QUIC.Types.Info
        Network.QUIC.Types.Integer
        Network.QUIC.Types.Packet
        Network.QUIC.Types.Queue
        Network.QUIC.Types.Resumption
        Network.QUIC.Types.Time
        Network.QUIC.Utils
        Network.QUIC.Windows

    default-language:   Haskell2010
    default-extensions: Strict StrictData
    ghc-options:        -Wall -Wcompat
    build-depends:
        base >=4.9 && <5,
        array >= 0.5 && < 0.6,
        async,
        base16-bytestring >= 1.0 && < 1.1,
        bytestring >= 0.10,
        containers,
        crypto-token >= 0.1.2 && < 0.2,
        crypton >= 0.34,
        crypton-x509 >= 1.7.6 && < 1.8,
        crypton-x509-system >= 1.6.7 && < 1.7,
        data-default,
        fast-logger >= 3.2.2 && < 3.3,
        filepath,
        iproute >= 1.7.12 && < 1.8,
        memory >= 0.18.0 && < 0.19,
        network >= 3.2.3,
        network-byte-order >= 0.1.7 && < 0.2,
        network-control >= 0.1.5 && < 0.2,
        random >= 1.3 && < 1.4,
        serialise,
        stm >= 2.5 && < 2.6,
        tls >= 2.1.6 && < 2.2,
        unix-time >= 0.4.12 && < 0.5

    if os(windows)
        cc-options: -D_WINDOWS

    if (flag(fusion) && arch(x86_64))
        cpp-options: -DUSE_FUSION
        cc-options:  -mavx2 -maes -mpclmul -mvaes -mvpclmulqdq
        c-sources:
            cbits/fusion.c
            cbits/picotls.c

executable quic-server
    main-is:            quic-server.hs
    hs-source-dirs:     util
    other-modules:
        H3
        Common
        ServerX

    default-language:   Haskell2010
    default-extensions: Strict StrictData
    ghc-options:        -Wall -threaded -rtsopts
    build-depends:
        base >=4.9 && <5,
        base16-bytestring,
        bytestring,
        filepath,
        http2,
        network-byte-order,
        quic,
        tls,
        tls-session-manager >= 0.0.5

    if flag(devel)

    else
        buildable: False

    if os(windows)
        ghc-options: -with-rtsopts=--io-manager=native

executable quic-client
    main-is:            quic-client.hs
    hs-source-dirs:     util
    other-modules:
        H3
        ClientX
        Common

    default-language:   Haskell2010
    default-extensions: Strict StrictData
    ghc-options:        -Wall -threaded -rtsopts
    build-depends:
        base >=4.9 && <5,
        async,
        base16-bytestring,
        bytestring,
        filepath,
        http2,
        network-byte-order,
        quic,
        tls,
        unix-time

    if flag(devel)

    else
        buildable: False

    if os(windows)
        ghc-options: -with-rtsopts=--io-manager=native

test-suite spec
    type:               exitcode-stdio-1.0
    main-is:            Spec.hs
    build-tool-depends: hspec-discover:hspec-discover
    hs-source-dirs:     test
    other-modules:
        Config
        ErrorSpec
        FrameSpec
        HandshakeSpec
        IOSpec
        PacketSpec
        RecoverySpec
        TLSSpec
        TransportError
        TypesSpec

    default-language:   Haskell2010
    default-extensions: Strict StrictData
    ghc-options:        -Wall -threaded -rtsopts
    build-depends:
        base >=4.9 && <5,
        QuickCheck,
        async,
        base16-bytestring >=1.0,
        bytestring,
        containers,
        crypton,
        hspec,
        network >=3.2.2,
        quic,
        tls,
        unix-time

    if os(windows)
        ghc-options: -with-rtsopts=--io-manager=native