marconi-core-json-rpc-1.2.0.0: Utilities for wrapping the query interface of Marconi indexers in a JSON-RPC HTTP server.
Safe HaskellSafe-Inferred
LanguageHaskell2010

Marconi.Core.JsonRpc

Description

This library provides some utilities for running `marconi-core`'s Queryable interface throught a JSON-RPC HTTP server.

Particularly, these utilities use the `servant-server` Haskell package.

Synopsis

Documentation

type ReaderHandler env = ExceptT ServerError (ReaderT env IO) #

type ReaderServer env api = ServerT api (ReaderHandler env) #

catchHttpHandlerExceptions :: Trace IO Text -> Handler a -> Handler a #

dimapHandler :: Functor m => (qry' -> qry) -> (res -> res') -> (qry -> m (Either e res)) -> qry' -> m (Either e res') #

Given two mapping functions, one for the query and one for the result, convert a query handler into one that takes a modified version of the query and returns a modified version of the result.

This is technically a profunctor operation with some extra levels of Functor on the right: dimapHandler l ≡ dimap l . fmap . fmap

However, since we need it only for (->) it's not worth pulling in the profunctor dependency.

Example ===

originalHandler
  :: SomeQuery -> ReaderHandler HttpServerConfig (Either (JsonRpcErr String) SomeResult)
originalHandler = queryHttpReaderHandler someLens

modifiedHandler
  :: ModifiedQuery -> ReaderHandler HttpServerConfig (Either (JsonRpcErr String) ModifiedResult)
modifiedHandler =
  let mapQuery = ... :: ModifiedQuery -> SomeQuery
      mapResult = ... :: SomeResult -> ModifiedResult
   in dimapHandler mapQuery mapResult originalHandler

hoistHttpHandler :: Handler a -> ReaderHandler env a #

hoistReaderHandler :: env -> ReaderHandler env a -> Handler a #

mkHttpRequestTracer :: MonadIO m => Trace IO Text -> m Middleware #

queryHttpHandler :: (Show (Result query), Ord (Point event), Queryable (ExceptT (QueryError query) IO) event query indexer, IsSync IO event indexer) => Getter env (MVar (indexer event)) -> env -> query -> Handler (Either (JsonRpcErr String) (Result query)) #

Given an env and a way to get the indexer inside an MVar, run the query in a Servant Handler.

queryHttpReaderHandler :: (Show (Result query), Ord (Point event), Queryable (ExceptT (QueryError query) IO) event query indexer, IsSync IO event indexer) => Getter env (MVar (indexer event)) -> query -> ReaderHandler env (Either (JsonRpcErr String) (Result query)) #

Given a way to get the indexer from the environment, run the query in a ReaderHandler.

queryIndexerHttpHandler :: (Show (Result query), Ord (Point event), Queryable (ExceptT (QueryError query) IO) event query indexer, IsSync IO event indexer) => indexer event -> query -> Handler (Either (JsonRpcErr String) (Result query)) #

Given an indexer event, run the query in a Servant Handler.

queryIndexerVarHttpHandler :: (Show (Result query), Ord (Point event), Queryable (ExceptT (QueryError query) IO) event query indexer, IsSync IO event indexer) => MVar (indexer event) -> query -> Handler (Either (JsonRpcErr String) (Result query)) #

Given an indexer event inside an MVar, run the query in a Servant Handler.

queryErrToRpcErr :: Show (Result query) => QueryError query -> JsonRpcErr String #

Convert a query error to a JSON-RPC protocol error.

withReaderHandler :: (r' -> r) -> ReaderHandler r a -> ReaderHandler r' a #