{-# 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