packages feed

network-transport-quic-0.1.1: README.md

# `network-transport-quic`

This package provides an implementation of the `network-transport` interface, where networking is done via the QUIC protocol. The primary use-case for this package is as a Cloud Haskell backend.

QUIC has many advantages over TCP, including:

* No head-of-line blocking. Independent streams mean packet loss on one stream doesn't stall others;
* Connection migration. Connections survive IP address changes, which is important when a device switches from e.g. WIFI to 5G;
* Built-in encryption via TLS 1.3;

In benchmarks, `network-transport-quic` performs better than `network-transport-tcp` in dense network topologies. For example, if every `EndPoint` in your network connects to every other `EndPoint`, you might benefit greatly from switching to `network-transport-quic`! 

## Usage example

Provided you have a TLS 1.3 certificate, you can create a `Transport` like so:

```haskell
import Data.List.NonEmpty qualified as NonEmpty
import Network.Transport.QUIC (QUICTransportConfig(..), createTransport, credentialLoadX509)

main = do
    let certificate = "path/to/cert.crt"
        key = "path/to/cert.key"

    creds <- credentialLoadX509 certificate key
    case creds of
        Left error_message -> error error_message
        Right credential -> do
            let config = QUICTransportConfig
                            { hostName = "my.hostname.com" -- or some IP address
                            , serviceName = "https" -- alternatively, some port number
                            , credentials = NonEmpty.singleton credential
                            , validateCredentials = True -- should be 'False' for self-signed certificate
                            }
            transport <- createTransport config
            ...
```

There are tools online to help create self-signed TLS 1.3 certificates.