@ -11,11 +11,14 @@ import ATrade.MDS.Protocol
import ATrade.Types
import ATrade.Types
import Control.Concurrent
import Control.Concurrent
import Control.Monad
import Control.Monad
import Control.Monad.IO.Class
import Data.Aeson
import Data.Aeson
import Data.Binary.Get
import Data.Binary.Get
import Data.Binary.Put
import Data.Binary.Put
import qualified Data.ByteString as B
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Lazy as BL
import Data.Conduit as C
import Data.Conduit.Combinators
import Data.List.NonEmpty
import Data.List.NonEmpty
import qualified Data.Text as T
import qualified Data.Text as T
import Data.Time.Clock.POSIX
import Data.Time.Clock.POSIX
@ -56,9 +59,20 @@ serveQHP db sock = forever $ do
handleCmd peerId cmd = case cmd of
handleCmd peerId cmd = case cmd of
rq -> do
rq -> do
debugM " QHP " $ " Incoming command: " ++ show cmd
debugM " QHP " $ " Incoming command: " ++ show cmd
qdata <- getData db ( rqTicker rq ) ( TimeInterval ( rqStartTime rq ) ( rqEndTime rq ) ) ( Timeframe ( periodSeconds $ rqPeriod rq ) )
let dataC = getDataConduit db ( rqTicker rq ) ( TimeInterval ( rqStartTime rq ) ( rqEndTime rq ) ) ( Timeframe ( periodSeconds $ rqPeriod rq ) )
let bytes = serializeBars $ V . concat $ fmap snd qdata
runConduit $ dataC .| ( conduitVector chunkSize ) .| ( sendChunks peerId )
sendMulti sock $ peerId :| [ B . empty , " OK " , BL . toStrict bytes ]
--qdata <- getData db (rqTicker rq) (TimeInterval (rqStartTime rq) (rqEndTime rq)) (Timeframe (periodSeconds $ rqPeriod rq))
--let bytes = serializeBars $ V.concat $ fmap snd qdata
--sendMulti sock $ peerId :| [B.empty, "OK", BL.toStrict bytes]
sendChunks :: ( MonadIO m ) => B . ByteString -> ConduitT ( V . Vector Bar ) Void m ()
sendChunks peerId = do
liftIO $ send sock [ SendMore ] peerId
liftIO $ send sock [ SendMore ] B . empty
liftIO $ send sock [ SendMore ] " OK "
awaitForever $ \ vBars -> liftIO $ do
debugM " QHP " $ " Sending chunk: " ++ show ( V . length vBars ) ++ " bars "
send sock [ SendMore ] $ BL . toStrict $ serializeBars vBars
liftIO $ send sock [] B . empty
serializeBars :: V . Vector Bar -> BL . ByteString
serializeBars :: V . Vector Bar -> BL . ByteString
serializeBars bars = runPut $ V . forM_ bars serializeBar'
serializeBars bars = runPut $ V . forM_ bars serializeBar'
serializeBar' bar = do
serializeBar' bar = do
@ -69,6 +83,8 @@ serveQHP db sock = forever $ do
putDoublele ( toDouble . barClose $ bar )
putDoublele ( toDouble . barClose $ bar )
putWord64le ( fromInteger . barVolume $ bar )
putWord64le ( fromInteger . barVolume $ bar )
chunkSize = 4096
serveHAP :: ( Sender a , Receiver a ) => MdsHandle -> Socket a -> IO ()
serveHAP :: ( Sender a , Receiver a ) => MdsHandle -> Socket a -> IO ()
serveHAP db sock = forever $ do
serveHAP db sock = forever $ do
rq <- receiveMulti sock
rq <- receiveMulti sock