{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} module Factom.RPC.Api ( runTCPClient ) where import Control.Exception (bracket) import Network.Socket (HostName, ServiceName, SocketType (Stream), addrAddress, addrFamily, addrProtocol, addrSocketType, close, connect, defaultHints, getAddrInfo, socket) import Factom.RPC.JsonRpc (JsonRpcT, runJsonRpcT) -------------------------------------------------------------------------------- endpoint = "http://localhost:8088/v2" runTCPClient :: HostName -> ServiceName -> JsonRpcT IO a -> IO a runTCPClient host port f = do addr <- resolve host port bracket (open addr) close talk where resolve host' port' = do let hints = defaultHints { addrSocketType = Stream } addr:_ <- getAddrInfo (Just hints) (Just host') (Just port') return addr open addr = do sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr) connect sock $ addrAddress addr return sock talk sock = runJsonRpcT sock f