module Network.QUIC.Types.CID (
    CID(..)
  , myCIDLength
  , newCID
  , fromCID
  , toCID
  , makeCID
  , unpackCID
  , StatelessResetToken(..)
  , newStatelessResetToken
  , PathData(..)
  , newPathData
  , CIDInfo(..)
  ) where

import qualified Data.ByteString.Short as Short

import Network.QUIC.Imports

myCIDLength :: Int
myCIDLength :: Int
myCIDLength = Int
8

-- | A type for conneciton ID.
newtype CID = CID Bytes deriving (CID -> CID -> Bool
(CID -> CID -> Bool) -> (CID -> CID -> Bool) -> Eq CID
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CID -> CID -> Bool
$c/= :: CID -> CID -> Bool
== :: CID -> CID -> Bool
$c== :: CID -> CID -> Bool
Eq, Eq CID
Eq CID
-> (CID -> CID -> Ordering)
-> (CID -> CID -> Bool)
-> (CID -> CID -> Bool)
-> (CID -> CID -> Bool)
-> (CID -> CID -> Bool)
-> (CID -> CID -> CID)
-> (CID -> CID -> CID)
-> Ord CID
CID -> CID -> Bool
CID -> CID -> Ordering
CID -> CID -> CID
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CID -> CID -> CID
$cmin :: CID -> CID -> CID
max :: CID -> CID -> CID
$cmax :: CID -> CID -> CID
>= :: CID -> CID -> Bool
$c>= :: CID -> CID -> Bool
> :: CID -> CID -> Bool
$c> :: CID -> CID -> Bool
<= :: CID -> CID -> Bool
$c<= :: CID -> CID -> Bool
< :: CID -> CID -> Bool
$c< :: CID -> CID -> Bool
compare :: CID -> CID -> Ordering
$ccompare :: CID -> CID -> Ordering
$cp1Ord :: Eq CID
Ord)

instance Show CID where
    show :: CID -> String
show (CID Bytes
cid) = Bytes -> String
shortToString (Bytes -> Bytes
enc16s Bytes
cid)

newCID :: IO CID
newCID :: IO CID
newCID = Bytes -> CID
CID (Bytes -> CID) -> IO Bytes -> IO CID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> IO Bytes
getRandomBytes Int
myCIDLength

toCID :: ByteString -> CID
toCID :: ByteString -> CID
toCID = Bytes -> CID
CID (Bytes -> CID) -> (ByteString -> Bytes) -> ByteString -> CID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Bytes
Short.toShort

-- | Converting a connection ID.
fromCID :: CID -> ByteString
fromCID :: CID -> ByteString
fromCID (CID Bytes
sbs) = Bytes -> ByteString
Short.fromShort Bytes
sbs

makeCID :: ShortByteString -> CID
makeCID :: Bytes -> CID
makeCID = Bytes -> CID
CID

unpackCID :: CID -> (ShortByteString, Word8)
unpackCID :: CID -> (Bytes, Word8)
unpackCID (CID Bytes
sbs) = (Bytes
sbs, Word8
len)
  where
    len :: Word8
len = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> Int -> Word8
forall a b. (a -> b) -> a -> b
$ Bytes -> Int
Short.length Bytes
sbs

-- 16 bytes
newtype StatelessResetToken = StatelessResetToken Bytes deriving (StatelessResetToken -> StatelessResetToken -> Bool
(StatelessResetToken -> StatelessResetToken -> Bool)
-> (StatelessResetToken -> StatelessResetToken -> Bool)
-> Eq StatelessResetToken
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: StatelessResetToken -> StatelessResetToken -> Bool
$c/= :: StatelessResetToken -> StatelessResetToken -> Bool
== :: StatelessResetToken -> StatelessResetToken -> Bool
$c== :: StatelessResetToken -> StatelessResetToken -> Bool
Eq,Eq StatelessResetToken
Eq StatelessResetToken
-> (StatelessResetToken -> StatelessResetToken -> Ordering)
-> (StatelessResetToken -> StatelessResetToken -> Bool)
-> (StatelessResetToken -> StatelessResetToken -> Bool)
-> (StatelessResetToken -> StatelessResetToken -> Bool)
-> (StatelessResetToken -> StatelessResetToken -> Bool)
-> (StatelessResetToken
    -> StatelessResetToken -> StatelessResetToken)
-> (StatelessResetToken
    -> StatelessResetToken -> StatelessResetToken)
-> Ord StatelessResetToken
StatelessResetToken -> StatelessResetToken -> Bool
StatelessResetToken -> StatelessResetToken -> Ordering
StatelessResetToken -> StatelessResetToken -> StatelessResetToken
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: StatelessResetToken -> StatelessResetToken -> StatelessResetToken
$cmin :: StatelessResetToken -> StatelessResetToken -> StatelessResetToken
max :: StatelessResetToken -> StatelessResetToken -> StatelessResetToken
$cmax :: StatelessResetToken -> StatelessResetToken -> StatelessResetToken
>= :: StatelessResetToken -> StatelessResetToken -> Bool
$c>= :: StatelessResetToken -> StatelessResetToken -> Bool
> :: StatelessResetToken -> StatelessResetToken -> Bool
$c> :: StatelessResetToken -> StatelessResetToken -> Bool
<= :: StatelessResetToken -> StatelessResetToken -> Bool
$c<= :: StatelessResetToken -> StatelessResetToken -> Bool
< :: StatelessResetToken -> StatelessResetToken -> Bool
$c< :: StatelessResetToken -> StatelessResetToken -> Bool
compare :: StatelessResetToken -> StatelessResetToken -> Ordering
$ccompare :: StatelessResetToken -> StatelessResetToken -> Ordering
$cp1Ord :: Eq StatelessResetToken
Ord,Int -> StatelessResetToken -> ShowS
[StatelessResetToken] -> ShowS
StatelessResetToken -> String
(Int -> StatelessResetToken -> ShowS)
-> (StatelessResetToken -> String)
-> ([StatelessResetToken] -> ShowS)
-> Show StatelessResetToken
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [StatelessResetToken] -> ShowS
$cshowList :: [StatelessResetToken] -> ShowS
show :: StatelessResetToken -> String
$cshow :: StatelessResetToken -> String
showsPrec :: Int -> StatelessResetToken -> ShowS
$cshowsPrec :: Int -> StatelessResetToken -> ShowS
Show)

newStatelessResetToken :: IO StatelessResetToken
newStatelessResetToken :: IO StatelessResetToken
newStatelessResetToken = Bytes -> StatelessResetToken
StatelessResetToken (Bytes -> StatelessResetToken)
-> IO Bytes -> IO StatelessResetToken
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> IO Bytes
getRandomBytes Int
16

-- 8 bytes
newtype PathData = PathData Bytes deriving (PathData -> PathData -> Bool
(PathData -> PathData -> Bool)
-> (PathData -> PathData -> Bool) -> Eq PathData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PathData -> PathData -> Bool
$c/= :: PathData -> PathData -> Bool
== :: PathData -> PathData -> Bool
$c== :: PathData -> PathData -> Bool
Eq,Int -> PathData -> ShowS
[PathData] -> ShowS
PathData -> String
(Int -> PathData -> ShowS)
-> (PathData -> String) -> ([PathData] -> ShowS) -> Show PathData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PathData] -> ShowS
$cshowList :: [PathData] -> ShowS
show :: PathData -> String
$cshow :: PathData -> String
showsPrec :: Int -> PathData -> ShowS
$cshowsPrec :: Int -> PathData -> ShowS
Show)

newPathData :: IO PathData
newPathData :: IO PathData
newPathData = Bytes -> PathData
PathData (Bytes -> PathData) -> IO Bytes -> IO PathData
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> IO Bytes
getRandomBytes Int
8

data CIDInfo = CIDInfo {
    CIDInfo -> Int
cidInfoSeq :: Int
  , CIDInfo -> CID
cidInfoCID :: CID
  , CIDInfo -> StatelessResetToken
cidInfoSRT :: StatelessResetToken
  } deriving (CIDInfo -> CIDInfo -> Bool
(CIDInfo -> CIDInfo -> Bool)
-> (CIDInfo -> CIDInfo -> Bool) -> Eq CIDInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CIDInfo -> CIDInfo -> Bool
$c/= :: CIDInfo -> CIDInfo -> Bool
== :: CIDInfo -> CIDInfo -> Bool
$c== :: CIDInfo -> CIDInfo -> Bool
Eq, Eq CIDInfo
Eq CIDInfo
-> (CIDInfo -> CIDInfo -> Ordering)
-> (CIDInfo -> CIDInfo -> Bool)
-> (CIDInfo -> CIDInfo -> Bool)
-> (CIDInfo -> CIDInfo -> Bool)
-> (CIDInfo -> CIDInfo -> Bool)
-> (CIDInfo -> CIDInfo -> CIDInfo)
-> (CIDInfo -> CIDInfo -> CIDInfo)
-> Ord CIDInfo
CIDInfo -> CIDInfo -> Bool
CIDInfo -> CIDInfo -> Ordering
CIDInfo -> CIDInfo -> CIDInfo
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CIDInfo -> CIDInfo -> CIDInfo
$cmin :: CIDInfo -> CIDInfo -> CIDInfo
max :: CIDInfo -> CIDInfo -> CIDInfo
$cmax :: CIDInfo -> CIDInfo -> CIDInfo
>= :: CIDInfo -> CIDInfo -> Bool
$c>= :: CIDInfo -> CIDInfo -> Bool
> :: CIDInfo -> CIDInfo -> Bool
$c> :: CIDInfo -> CIDInfo -> Bool
<= :: CIDInfo -> CIDInfo -> Bool
$c<= :: CIDInfo -> CIDInfo -> Bool
< :: CIDInfo -> CIDInfo -> Bool
$c< :: CIDInfo -> CIDInfo -> Bool
compare :: CIDInfo -> CIDInfo -> Ordering
$ccompare :: CIDInfo -> CIDInfo -> Ordering
$cp1Ord :: Eq CIDInfo
Ord, Int -> CIDInfo -> ShowS
[CIDInfo] -> ShowS
CIDInfo -> String
(Int -> CIDInfo -> ShowS)
-> (CIDInfo -> String) -> ([CIDInfo] -> ShowS) -> Show CIDInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CIDInfo] -> ShowS
$cshowList :: [CIDInfo] -> ShowS
show :: CIDInfo -> String
$cshow :: CIDInfo -> String
showsPrec :: Int -> CIDInfo -> ShowS
$cshowsPrec :: Int -> CIDInfo -> ShowS
Show)