{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Accumulate.RPC.Api
( runTCPClient
, reqGetData
) where
import Control.Concurrent
import Control.Exception (bracket)
import Control.Monad.IO.Class
import Control.Remote.Monad.JSON
import Control.Remote.Monad.JSON.Client
import Control.Remote.Monad.JSON.Router
import Control.Remote.Monad.JSON.Trace
import Data.Aeson
import Data.Aeson.Types
import Data.Text as T
import Network.Socket (HostName, ServiceName,
SocketType (Stream),
addrAddress, addrFamily,
addrProtocol,
addrSocketType, close,
connect, defaultHints,
getAddrInfo, socket)
import Accumulate.RPC.JsonRpc (JsonRpcT, runJsonRpcT)
import Accumulate.RPC.Types.ApiDataResponse
import Accumulate.RPC.Types.ApiDataMetricsResponse
import Accumulate.RPC.Types.ApiDataVersionResponse
--------------------------------------------------------------------------------
endpoint = "http://95.141.37.250:35554/v1"
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
-- Options to convert internal types into Aeson values
-- $ Named [("jsonrpc", String "2.0"), ("id", toJSON (0::Int))]
--------------------------------------------------------------------------------
-- Data retrieval methods
-- | getData returns Accumulate Object by URL
--
reqGetData :: Text -> RPC APIDataResponse
reqGetData url = method "get" $ Named [("url", String url)] -- Named [("wait", Bool False), ("url", String url)]
-- | GetDirectory returns ADI directory entries
--
reqGetDirectory :: Text -> RPC ()
reqGetDirectory url = method "get-directory" $ List [String url]
--------------------------------------------------------------------------------
-- ADIs
-- |
--
reqGetADI :: Text -> RPC ()
reqGetADI url = method "adi" $ List [String url]
-- |
--
reqCreateADI :: Text -> RPC ()
reqCreateADI url = method "adi-create" $ List [String url]
--------------------------------------------------------------------------------
-- Key Management
-- |
--
reqGetKeyBook :: Text -> RPC ()
reqGetKeyBook url = method "sig-spec-group" $ List [String url]
--------------------------------------------------------------------------------
-- Tokens
-- | Get infromation about token
--
reqGetToken :: Text -> RPC ()
reqGetToken url = method "token" $ List [String url]
-- | Get information about token transaction
--
reqGetTokenTx :: Text -> RPC ()
reqGetTokenTx txid = method "token-tx" $ List [String txid]
-- | Create new token transaction
--
reqCreateTokenTx :: Text -> RPC ()
reqCreateTokenTx url = method "token-tx-create" $ List [String url]
--------------------------------------------------------------------------------
-- Metrics
-- |
--
reqGetMetrics :: Text -> Text -> RPC APIDataMetricsResponse
reqGetMetrics metricName duration =
method "metrics" $ Named [ ("metric" , String metricName)
, ("duration", String duration)
]
reqGetVersion :: RPC APIDataVersionResponse
reqGetVersion = method "version" $ List []
--------------------------------------------------------------------------------
-- Faucet
-- |
--
reqFaucet :: Text -> RPC ()
reqFaucet url = method "faucet" $ Named [("url", String url)]
--------------------------------------------------------------------------------
-- Credits
-- |
--
reqAddCredits :: Text -> RPC ()
reqAddCredits url = method "add-credits" $ List [String url]
main = do
let s = weakSession (traceSendAPI "" $ clientSendAPI endpoint)
(m,v) <-
send s $ do
--h <- reqGetData "acc://c9359900016daa23da0f4c07e66be42c398fe2b10017cecb/ACME"
--t <- reqGetTokenTx ""
m <- reqGetMetrics "tps" "1h"
v <- reqGetVersion
return (m, v)
putStrLn "-----------"
print $ show $ m
putStrLn "-----------"
print $ show $ v