hbs2-git-oracle init

This commit is contained in:
Dmitry Zuikov 2024-03-24 08:04:37 +03:00
parent 37618a32bb
commit 3735b9b973
4 changed files with 89 additions and 10 deletions

View File

@ -23,9 +23,8 @@ main = do
<*> argument pLww (metavar "LWWREF")
join $ execParser (info (parser <**> helper)
( fullDesc
<> progDesc "Parse command line arguments"
<> header "Command line arguments parsing example"))
<> progDesc "subscribe to hbs2-git repo reference"
<> header "hbs2-git-subscribe"))
where
pLww :: ReadM (LWWRefKey HBS2Basic)

View File

@ -2,8 +2,29 @@ module Main where
import HBS2.Git.Oracle.Prelude
import Options.Applicative
main :: IO ()
main = do
print "hbs2-git-oracle"
let parser = runApp
<$> flag False True ( long "serve"
<> short 's'
<> help "serve"
)
join $ execParser (info (parser <**> helper)
( fullDesc
<> progDesc "hbs2-git oracle / distributed index builder"
<> header "hbs2-git-oracle"))
runApp :: MonadUnliftIO m => Bool -> m ()
runApp _ = do
pure ()
-- where
-- pLww :: ReadM (LWWRefKey HBS2Basic)
-- pLww = maybeReader fromStringMay

View File

@ -2,11 +2,13 @@ module HBS2.Git.Oracle.App where
import HBS2.Git.Oracle.Prelude
import Control.Monad.Reader
import HBS2.Peer.CLI.Detect
data OracleEnv =
OracleEnv
{
{ _peerAPI :: ServiceCaller PeerAPI UNIX
, _reflogAPI :: ServiceCaller RefLogAPI UNIX
, _lwwAPI :: ServiceCaller LWWRefAPI UNIX
}
deriving stock (Generic)
@ -21,8 +23,37 @@ newtype Oracle m a =
, MonadUnliftIO
)
newOracleEnv :: MonadIO m => m OracleEnv
newOracleEnv = pure OracleEnv
newOracleEnv :: MonadUnliftIO m => m OracleEnv
newOracleEnv = do
soname <- detectRPC
`orDie` "can't locate rpc"
flip runContT pure do
client <- lift $ race (pause @'Seconds 1) (newMessagingUnix False 1.0 soname)
>>= orThrowUser ("can't connect to" <+> pretty soname)
void $ ContT $ withAsync $ runMessagingUnix client
peerAPI <- makeServiceCaller @PeerAPI (fromString soname)
reflogAPI <- makeServiceCaller @RefLogAPI (fromString soname)
storageAPI <- makeServiceCaller @StorageAPI (fromString soname)
lwwAPI <- makeServiceCaller @LWWRefAPI (fromString soname)
let sto = AnyStorage (StorageClient storageAPI)
let endpoints = [ Endpoint @UNIX peerAPI
, Endpoint @UNIX reflogAPI
, Endpoint @UNIX lwwAPI
, Endpoint @UNIX storageAPI
]
void $ ContT $ withAsync $ liftIO $ runReaderT (runServiceClientMulti endpoints) client
pure $ OracleEnv peerAPI
reflogAPI
lwwAPI
withOracleEnv :: MonadIO m => OracleEnv -> Oracle m a -> m a
withOracleEnv env m = runReaderT (fromOracle m) env

View File

@ -1,12 +1,40 @@
module HBS2.Git.Oracle.Prelude
( module HBS2.Prelude.Plated
, module Control.Monad.Reader.Class
, module HBS2.OrDie
, module HBS2.Net.Auth.Schema
, module HBS2.Storage
, module HBS2.Peer.Proto.RefLog
, module HBS2.Peer.Proto.LWWRef
, module HBS2.Net.Proto.Service
, module HBS2.Peer.RPC.API.Peer
, module HBS2.Peer.RPC.API.RefLog
, module HBS2.Peer.RPC.API.LWWRef
, module HBS2.Peer.RPC.API.Storage
, module HBS2.Peer.RPC.Client.StorageClient
, module HBS2.Peer.RPC.Client.Unix
, module Control.Monad.Reader
, module Control.Monad.Trans.Cont
, module UnliftIO
) where
import HBS2.Prelude.Plated
import HBS2.OrDie
import HBS2.Net.Auth.Schema
import HBS2.Net.Proto.Service
import HBS2.Storage
import Control.Monad.Reader.Class
import HBS2.Peer.Proto.LWWRef
import HBS2.Peer.Proto.RefLog
import HBS2.Peer.RPC.API.Peer
import HBS2.Peer.RPC.API.RefLog
import HBS2.Peer.RPC.API.LWWRef
import HBS2.Peer.RPC.API.Storage
import HBS2.Peer.RPC.Client.StorageClient
import HBS2.Peer.RPC.Client.Unix
import Control.Monad.Reader
import Control.Monad.Trans.Cont
import UnliftIO