quic-0.0.0: Network/QUIC/Stream/Table.hs
{-# LANGUAGE OverloadedStrings #-}
module Network.QUIC.Stream.Table (
StreamTable
, emptyStreamTable
, lookupStream
, insertStream
, deleteStream
, insertCryptoStreams
, deleteCryptoStream
, lookupCryptoStream
) where
import Data.IntMap.Strict (IntMap)
import qualified Data.IntMap.Strict as Map
import {-# Source #-} Network.QUIC.Connection.Types
import Network.QUIC.Stream.Types
import Network.QUIC.Types
----------------------------------------------------------------
newtype StreamTable = StreamTable (IntMap Stream)
emptyStreamTable :: StreamTable
emptyStreamTable = StreamTable Map.empty
----------------------------------------------------------------
lookupStream :: StreamId -> StreamTable -> Maybe Stream
lookupStream sid (StreamTable tbl) = Map.lookup sid tbl
insertStream :: StreamId -> Stream -> StreamTable -> StreamTable
insertStream sid strm (StreamTable tbl) = StreamTable $ Map.insert sid strm tbl
deleteStream :: StreamId -> StreamTable -> StreamTable
deleteStream sid (StreamTable tbl) = StreamTable $ Map.delete sid tbl
----------------------------------------------------------------
initialCryptoStreamId,handshakeCryptoStreamId,rtt1CryptoStreamId :: StreamId
initialCryptoStreamId = -1
handshakeCryptoStreamId = -2
rtt1CryptoStreamId = -3
toCryptoStreamId :: EncryptionLevel -> StreamId
toCryptoStreamId InitialLevel = initialCryptoStreamId
-- This is to generate an error packet of CRYPTO in 0-RTT
toCryptoStreamId RTT0Level = rtt1CryptoStreamId
toCryptoStreamId HandshakeLevel = handshakeCryptoStreamId
toCryptoStreamId RTT1Level = rtt1CryptoStreamId
----------------------------------------------------------------
insertCryptoStreams :: Connection -> StreamTable -> IO StreamTable
insertCryptoStreams conn stbl = do
strm1 <- newStream conn initialCryptoStreamId
strm2 <- newStream conn handshakeCryptoStreamId
strm3 <- newStream conn rtt1CryptoStreamId
return $ insertStream initialCryptoStreamId strm1
$ insertStream handshakeCryptoStreamId strm2
$ insertStream rtt1CryptoStreamId strm3 stbl
deleteCryptoStream :: EncryptionLevel -> StreamTable -> StreamTable
deleteCryptoStream InitialLevel = deleteStream initialCryptoStreamId
deleteCryptoStream RTT0Level = deleteStream rtt1CryptoStreamId
deleteCryptoStream HandshakeLevel = deleteStream handshakeCryptoStreamId
deleteCryptoStream RTT1Level = deleteStream rtt1CryptoStreamId
----------------------------------------------------------------
lookupCryptoStream :: EncryptionLevel -> StreamTable -> Maybe Stream
lookupCryptoStream lvl stbl = lookupStream sid stbl
where
sid = toCryptoStreamId lvl