{-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE TypeOperators #-} module Network.Tox.Transport (toxTransport) where import Network.QueryResponse import Crypto.Tox import Network.Tox.DHT.Transport import Network.Tox.Onion.Transport import Network.Tox.Crypto.Transport import Network.Socket toxTransport :: TransportCrypto -> (PublicKey -> IO (Maybe NodeInfo)) -> UDPTransport -> IO ( Transport String NodeInfo (DHTMessage Encrypted8) , Transport String OnionToOwner (OnionMessage Encrypted) , Transport String SockAddr NetCrypto ) toxTransport crypto closeLookup udp = do (dht,udp1) <- partitionTransport parseDHTAddr encodeDHTAddr id $ forwardOnions crypto udp (onion,udp2) <- partitionTransport parseOnionAddr encodeOnionAddr id udp1 let netcrypto = layerTransport parseNetCrypto encodeNetCrypto udp2 return ( forwardDHTRequests crypto closeLookup dht , onion , netcrypto ) -- instance (Sized a, Sized b) => Sized (a,b) where size = _todo -- Byte value Packet Kind Return address -- :----------- :-------------------- -- `0x00` Ping Request DHTNode -- `0x01` Ping Response - -- `0x02` Nodes Request DHTNode -- `0x04` Nodes Response - -- `0x18` Cookie Request DHTNode, but without sending pubkey in response -- `0x19` Cookie Response - (no pubkey) -- -- `0x21` LAN Discovery DHTNode (No reply, port 33445, trigger Nodes Request/Response) -- -- `0x20` DHT Request DHTNode/-forward -- -- `0x1a` Crypto Handshake CookieAddress -- -- `0x1b` Crypto Data SessionAddress -- -- `0x83` Announce Request OnionToOwner -- `0x84` Announce Response - -- `0x85` Onion Data Request OnionToOwner -- `0x86` Onion Data Response - -- -- `0xf0` Bootstrap Info SockAddr? -- -- `0x80` Onion Request 0 -forward -- `0x81` Onion Request 1 -forward -- `0x82` Onion Request 2 -forward -- `0x8c` Onion Response 3 -return -- `0x8d` Onion Response 2 -return -- `0x8e` Onion Response 1 -return