|
|
|
@ -7,32 +7,60 @@ module ATrade.Broker.Server ( |
|
|
|
TradeSink |
|
|
|
TradeSink |
|
|
|
) where |
|
|
|
) where |
|
|
|
|
|
|
|
|
|
|
|
import ATrade.Broker.Backend |
|
|
|
import ATrade.Broker.Backend (BrokerBackend (..), |
|
|
|
import ATrade.Broker.Protocol |
|
|
|
BrokerBackendNotification (..), |
|
|
|
import ATrade.Types |
|
|
|
backendNotificationOrderId) |
|
|
|
import ATrade.Util |
|
|
|
import ATrade.Broker.Protocol (BrokerServerRequest (..), |
|
|
|
import Control.Concurrent hiding (readChan, writeChan) |
|
|
|
BrokerServerResponse (..), |
|
|
|
import Control.Concurrent.BoundedChan |
|
|
|
ClientIdentity, |
|
|
|
import Control.Exception |
|
|
|
Notification (..), |
|
|
|
import Control.Monad |
|
|
|
NotificationSqnum (NotificationSqnum), |
|
|
|
import Control.Monad.Loops |
|
|
|
RequestSqnum, |
|
|
|
import Data.Aeson |
|
|
|
getNotificationSqnum, |
|
|
|
|
|
|
|
nextSqnum, requestSqnum) |
|
|
|
|
|
|
|
import ATrade.Types (Order (orderAccountId, orderId), |
|
|
|
|
|
|
|
OrderId, |
|
|
|
|
|
|
|
ServerSecurityParams (sspCertificate, sspDomain), |
|
|
|
|
|
|
|
Trade (tradeOrderId)) |
|
|
|
|
|
|
|
import ATrade.Util (atomicMapIORef) |
|
|
|
|
|
|
|
import Control.Concurrent (MVar, ThreadId, forkIO, |
|
|
|
|
|
|
|
killThread, myThreadId, |
|
|
|
|
|
|
|
newEmptyMVar, putMVar, |
|
|
|
|
|
|
|
readMVar, threadDelay, |
|
|
|
|
|
|
|
tryReadMVar, yield) |
|
|
|
|
|
|
|
import Control.Concurrent.BoundedChan (BoundedChan, newBoundedChan, |
|
|
|
|
|
|
|
tryReadChan, tryWriteChan) |
|
|
|
|
|
|
|
import Control.Exception (finally) |
|
|
|
|
|
|
|
import Control.Monad (unless) |
|
|
|
|
|
|
|
import Control.Monad.Loops (whileM_) |
|
|
|
|
|
|
|
import Data.Aeson (eitherDecode, encode) |
|
|
|
import qualified Data.Bimap as BM |
|
|
|
import qualified Data.Bimap as BM |
|
|
|
import qualified Data.ByteString as B hiding (putStrLn) |
|
|
|
import qualified Data.ByteString as B hiding (putStrLn) |
|
|
|
import qualified Data.ByteString.Lazy as BL hiding (putStrLn) |
|
|
|
import qualified Data.ByteString.Lazy as BL hiding (putStrLn) |
|
|
|
import Data.IORef |
|
|
|
import Data.IORef (IORef, atomicModifyIORef', |
|
|
|
|
|
|
|
newIORef, readIORef) |
|
|
|
import qualified Data.List as L |
|
|
|
import qualified Data.List as L |
|
|
|
import Data.List.NonEmpty |
|
|
|
import Data.List.NonEmpty (NonEmpty ((:|))) |
|
|
|
import qualified Data.Map as M |
|
|
|
import qualified Data.Map as M |
|
|
|
import Data.Maybe |
|
|
|
import Data.Maybe (isJust, isNothing) |
|
|
|
import qualified Data.Text as T |
|
|
|
import qualified Data.Text as T |
|
|
|
import qualified Data.Text.Encoding as E |
|
|
|
import qualified Data.Text.Encoding as E |
|
|
|
import Data.Time.Clock |
|
|
|
import Data.Time.Clock () |
|
|
|
import Safe (lastMay) |
|
|
|
import Safe (lastMay) |
|
|
|
import System.Log.Logger |
|
|
|
import System.Log.Logger (debugM, warningM) |
|
|
|
import System.Timeout |
|
|
|
import System.Timeout () |
|
|
|
import System.ZMQ4 |
|
|
|
import System.ZMQ4 (Context, Event (In), |
|
|
|
import System.ZMQ4.ZAP |
|
|
|
Poll (Sock), Pub (..), |
|
|
|
|
|
|
|
Router (..), Socket, |
|
|
|
|
|
|
|
Switch (On), bind, close, poll, |
|
|
|
|
|
|
|
receiveMulti, restrict, |
|
|
|
|
|
|
|
sendMulti, setCurveServer, |
|
|
|
|
|
|
|
setLinger, setTcpKeepAlive, |
|
|
|
|
|
|
|
setTcpKeepAliveCount, |
|
|
|
|
|
|
|
setTcpKeepAliveIdle, |
|
|
|
|
|
|
|
setTcpKeepAliveInterval, |
|
|
|
|
|
|
|
setZapDomain, socket) |
|
|
|
|
|
|
|
import System.ZMQ4.ZAP (zapApplyCertificate) |
|
|
|
|
|
|
|
|
|
|
|
newtype OrderIdGenerator = IO OrderId |
|
|
|
newtype OrderIdGenerator = IO OrderId |
|
|
|
type PeerId = B.ByteString |
|
|
|
type PeerId = B.ByteString |
|
|
|
@ -59,7 +87,13 @@ data BrokerServerHandle = BrokerServerHandle ThreadId ThreadId (MVar ()) (MVar ( |
|
|
|
|
|
|
|
|
|
|
|
type TradeSink = Trade -> IO () |
|
|
|
type TradeSink = Trade -> IO () |
|
|
|
|
|
|
|
|
|
|
|
startBrokerServer :: [BrokerBackend] -> Context -> T.Text -> T.Text -> [TradeSink] -> ServerSecurityParams -> IO BrokerServerHandle |
|
|
|
startBrokerServer :: [BrokerBackend] -> |
|
|
|
|
|
|
|
Context -> |
|
|
|
|
|
|
|
T.Text -> |
|
|
|
|
|
|
|
T.Text -> |
|
|
|
|
|
|
|
[TradeSink] -> |
|
|
|
|
|
|
|
ServerSecurityParams -> |
|
|
|
|
|
|
|
IO BrokerServerHandle |
|
|
|
startBrokerServer brokers c ep notificationsEp tradeSinks params = do |
|
|
|
startBrokerServer brokers c ep notificationsEp tradeSinks params = do |
|
|
|
sock <- socket c Router |
|
|
|
sock <- socket c Router |
|
|
|
notificationsSock <- socket c Pub |
|
|
|
notificationsSock <- socket c Pub |
|
|
|
|