module Network.Hermes.Types where
import Control.Applicative
import Control.Concurrent.STM(TVar,TChan,TMVar)
import Data.Set(Set)
import Data.Map(Map)
import qualified Data.ByteString as B
import System.IO(Handle)
import Data.Serialize
import Network.Hermes.Protocol
import Network.Hermes.Misc
import Network.Hermes.MChan
import Codec.Crypto.RSA(PublicKey,PrivateKey)
import Codec.Crypto.AES.IO(AESCtx)
data CoreContext = CoreContext {
myKey :: PublicKey
,myPrivateKey :: PrivateKey
,myHermesID :: HermesID
,myKeySignature :: TVar (Maybe Signature)
,authorities :: TVar [PublicKey]
,listeners :: TVar (Set ListenerAddress)
,listenerKillers :: TVar (Map ListenerAddress (IO ()))
,peerAddress :: TVar (Map HermesID Address)
,peerKeys :: TVar (Map HermesID PeerKey)
,peerFailures :: TVar (Map HermesID Int)
,peerConnections :: TVar (Map HermesID (TMVar Connection))
,trustLimit :: TVar TrustLevel
,messageBox :: MChan (Type,Type,B.ByteString) (HermesID,B.ByteString)
,timeLimit :: TVar Double
}
data CoreContextSnapshot = CoreContextSnapshot {
myKeySnap :: PublicKey
,myPrivateKeySnap :: PrivateKey
,myHermesIDSnap :: HermesID
,myKeySignatureSnap :: Maybe Signature
,authoritiesSnap :: [PublicKey]
,peerAddressSnap :: Map HermesID Address
,peerKeysSnap :: Map HermesID PeerKey
,peerFailuresSnap :: Map HermesID Int
,trustLimitSnap :: TrustLevel
,timeLimitSnap :: Double
} deriving(Show)
instance Serialize CoreContextSnapshot where
put (CoreContextSnapshot a b c d e f g h i j) = put a >> put b >> put c >> put d >> put e >> put f >> put g >> put h >> put i >> put j
get = CoreContextSnapshot <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
data ListenerAddress = ListenerAddress {
localAddress :: Address
,remoteAddress :: Address
} deriving(Eq,Ord)
type Signature = B.ByteString
data PeerKey = PeerKey {
peerKey :: PublicKey
,trust :: TrustLevel
,signature :: Maybe Signature
} deriving(Show)
instance Serialize PeerKey where
put (PeerKey a b c) = put a >> put b >> put c
get = PeerKey <$> get <*> get <*> get
data Connection = Connection {
aesctx :: AESCtx
,aesKey :: B.ByteString
,handle :: Handle
,typeMap :: TVar (Map Type Int)
,typeMax :: TVar Int
}