mirror of https://github.com/voidlizard/hbs2
Mailbox CLI and RPC boilerplate
This commit is contained in:
parent
49e80c5ae9
commit
72f9f6c811
|
@ -0,0 +1,77 @@
|
||||||
|
module CLI.Mailbox (pMailBox) where
|
||||||
|
|
||||||
|
import HBS2.Prelude.Plated
|
||||||
|
import HBS2.OrDie
|
||||||
|
import HBS2.Net.Proto.Service
|
||||||
|
import HBS2.Net.Auth.Credentials
|
||||||
|
import HBS2.Data.Types.SignedBox
|
||||||
|
import HBS2.Peer.Proto.LWWRef
|
||||||
|
|
||||||
|
import HBS2.Peer.RPC.API.Mailbox
|
||||||
|
import HBS2.KeyMan.Keys.Direct
|
||||||
|
|
||||||
|
import CLI.Common
|
||||||
|
import RPC2()
|
||||||
|
import PeerLogger hiding (info)
|
||||||
|
|
||||||
|
import Data.Config.Suckless.Script
|
||||||
|
|
||||||
|
import System.Exit
|
||||||
|
import System.Environment (lookupEnv)
|
||||||
|
|
||||||
|
import Control.Monad.Trans.Cont
|
||||||
|
import Options.Applicative
|
||||||
|
import Data.Maybe
|
||||||
|
|
||||||
|
import Data.Word
|
||||||
|
import Lens.Micro.Platform
|
||||||
|
|
||||||
|
|
||||||
|
pMailBox :: Parser (IO ())
|
||||||
|
pMailBox = do
|
||||||
|
rpc <- pRpcCommon
|
||||||
|
what <- many (strArgument (metavar "ARGS" <> help "hbs2-cli mailbox command-line"))
|
||||||
|
pure (runMailboxCLI rpc what)
|
||||||
|
|
||||||
|
runMailboxCLI :: RPCOpt -> [String] -> IO ()
|
||||||
|
runMailboxCLI rpc s = do
|
||||||
|
|
||||||
|
cli <- parseTop (unwords s) & either (error.show) pure
|
||||||
|
|
||||||
|
let t = TimeoutSec 1
|
||||||
|
|
||||||
|
let dict api = makeDict @C do
|
||||||
|
entry $ bindMatch "hey" $ nil_ $ const do
|
||||||
|
who <- liftIO (lookupEnv "USER") <&> fromMaybe "stranger"
|
||||||
|
liftIO $ print $ "hey," <+> pretty who
|
||||||
|
|
||||||
|
entry $ bindMatch "poke" $ nil_ $ const do
|
||||||
|
_ <- callRpcWaitMay @RpcMailboxPoke t api ()
|
||||||
|
>>= orThrowUser "rpc call timeout"
|
||||||
|
|
||||||
|
liftIO $ print $ pretty "okay, rpc is here"
|
||||||
|
|
||||||
|
entry $ bindMatch "create" $ nil_ $ const do
|
||||||
|
warn "mailbox create is not here yet"
|
||||||
|
-- TODO: mailbox-create
|
||||||
|
-- - [ ] answer: via RPC or direct
|
||||||
|
-- - [ ] answer: peer state or separate database (separate)
|
||||||
|
-- - [ ] implement: MailboxWorker
|
||||||
|
-- - [ ] implement: interwire MailboxWorker and mailboxProto
|
||||||
|
|
||||||
|
entry $ bindMatch "help" $ nil_ \case
|
||||||
|
HelpEntryBound what -> helpEntry what
|
||||||
|
[StringLike s] -> helpList False (Just s)
|
||||||
|
_ -> helpList False Nothing
|
||||||
|
|
||||||
|
flip runContT pure do
|
||||||
|
|
||||||
|
caller <- ContT $ withMyRPC @MailboxAPI rpc
|
||||||
|
lift $ run (dict caller) cli >>= eatNil display
|
||||||
|
|
||||||
|
-- withMyRPC @LWWRefAPI rpc $ \caller -> do
|
||||||
|
-- callService @RpcLWWRefGet caller ref >>= \case
|
||||||
|
-- Left e -> err (viaShow e) >> exitFailure
|
||||||
|
-- Right r -> print $ pretty r
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,7 @@ import PeerMeta
|
||||||
import CLI.Common
|
import CLI.Common
|
||||||
import CLI.RefChan
|
import CLI.RefChan
|
||||||
import CLI.LWWRef
|
import CLI.LWWRef
|
||||||
|
import CLI.Mailbox
|
||||||
import RefChan
|
import RefChan
|
||||||
import RefChanNotifyLog
|
import RefChanNotifyLog
|
||||||
import Fetch (fetchHash)
|
import Fetch (fetchHash)
|
||||||
|
@ -74,6 +75,7 @@ import HBS2.Peer.RPC.API.Peer
|
||||||
import HBS2.Peer.RPC.API.RefLog
|
import HBS2.Peer.RPC.API.RefLog
|
||||||
import HBS2.Peer.RPC.API.RefChan
|
import HBS2.Peer.RPC.API.RefChan
|
||||||
import HBS2.Peer.RPC.API.LWWRef
|
import HBS2.Peer.RPC.API.LWWRef
|
||||||
|
import HBS2.Peer.RPC.API.Mailbox
|
||||||
import HBS2.Peer.Notify
|
import HBS2.Peer.Notify
|
||||||
import HBS2.Peer.RPC.Client.StorageClient
|
import HBS2.Peer.RPC.Client.StorageClient
|
||||||
|
|
||||||
|
@ -246,6 +248,7 @@ runCLI = do
|
||||||
<> command "reflog" (info pRefLog (progDesc "reflog commands"))
|
<> command "reflog" (info pRefLog (progDesc "reflog commands"))
|
||||||
<> command "refchan" (info pRefChan (progDesc "refchan commands"))
|
<> command "refchan" (info pRefChan (progDesc "refchan commands"))
|
||||||
<> command "lwwref" (info pLwwRef (progDesc "lwwref commands"))
|
<> command "lwwref" (info pLwwRef (progDesc "lwwref commands"))
|
||||||
|
<> command "mailbox" (info pMailBox (progDesc "mailbox commands"))
|
||||||
<> command "peers" (info pPeers (progDesc "show known peers"))
|
<> command "peers" (info pPeers (progDesc "show known peers"))
|
||||||
<> command "pexinfo" (info pPexInfo (progDesc "show pex"))
|
<> command "pexinfo" (info pPexInfo (progDesc "show pex"))
|
||||||
<> command "download" (info pDownload (progDesc "download management"))
|
<> command "download" (info pDownload (progDesc "download management"))
|
||||||
|
@ -1229,6 +1232,7 @@ runPeer opts = Exception.handle (\e -> myException e
|
||||||
, makeResponse (makeServer @RefChanAPI)
|
, makeResponse (makeServer @RefChanAPI)
|
||||||
, makeResponse (makeServer @StorageAPI)
|
, makeResponse (makeServer @StorageAPI)
|
||||||
, makeResponse (makeServer @LWWRefAPI)
|
, makeResponse (makeServer @LWWRefAPI)
|
||||||
|
, makeResponse (makeServer @MailboxAPI)
|
||||||
, makeResponse (makeNotifyServer @(RefChanEvents L4Proto) env)
|
, makeResponse (makeNotifyServer @(RefChanEvents L4Proto) env)
|
||||||
, makeResponse (makeNotifyServer @(RefLogEvents L4Proto) envrl)
|
, makeResponse (makeNotifyServer @(RefLogEvents L4Proto) envrl)
|
||||||
]
|
]
|
||||||
|
|
|
@ -3,6 +3,7 @@ module RPC2
|
||||||
, module RPC2.RefLog
|
, module RPC2.RefLog
|
||||||
, module RPC2.RefChan
|
, module RPC2.RefChan
|
||||||
, module RPC2.LWWRef
|
, module RPC2.LWWRef
|
||||||
|
, module RPC2.Mailbox
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,4 +11,5 @@ import RPC2.Peer
|
||||||
import RPC2.RefLog
|
import RPC2.RefLog
|
||||||
import RPC2.RefChan
|
import RPC2.RefChan
|
||||||
import RPC2.LWWRef
|
import RPC2.LWWRef
|
||||||
|
import RPC2.Mailbox()
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
||||||
|
{-# Language UndecidableInstances #-}
|
||||||
|
module RPC2.Mailbox where
|
||||||
|
|
||||||
|
import HBS2.Peer.Prelude
|
||||||
|
|
||||||
|
import HBS2.Actors.Peer
|
||||||
|
import HBS2.Data.Types.SignedBox
|
||||||
|
import HBS2.Peer.Proto
|
||||||
|
import HBS2.Peer.Proto.Mailbox
|
||||||
|
import HBS2.Storage
|
||||||
|
import HBS2.Net.Messaging.Unix
|
||||||
|
import HBS2.Misc.PrettyStuff
|
||||||
|
|
||||||
|
import PeerTypes
|
||||||
|
|
||||||
|
import HBS2.Peer.RPC.Internal.Types
|
||||||
|
import HBS2.Peer.RPC.API.Mailbox
|
||||||
|
|
||||||
|
import Lens.Micro.Platform
|
||||||
|
import Control.Monad.Reader
|
||||||
|
import Control.Monad.Trans.Maybe
|
||||||
|
|
||||||
|
|
||||||
|
instance (MonadIO m) => HandleMethod m RpcMailboxPoke where
|
||||||
|
|
||||||
|
handleMethod key = do
|
||||||
|
debug "rpc.RpcMailboxPoke"
|
||||||
|
|
|
@ -176,6 +176,7 @@ library
|
||||||
HBS2.Peer.RPC.API.RefLog
|
HBS2.Peer.RPC.API.RefLog
|
||||||
HBS2.Peer.RPC.API.RefChan
|
HBS2.Peer.RPC.API.RefChan
|
||||||
HBS2.Peer.RPC.API.LWWRef
|
HBS2.Peer.RPC.API.LWWRef
|
||||||
|
HBS2.Peer.RPC.API.Mailbox
|
||||||
HBS2.Peer.RPC.API.Storage
|
HBS2.Peer.RPC.API.Storage
|
||||||
HBS2.Peer.RPC.Client.Unix
|
HBS2.Peer.RPC.Client.Unix
|
||||||
HBS2.Peer.RPC.Client.StorageClient
|
HBS2.Peer.RPC.Client.StorageClient
|
||||||
|
@ -270,6 +271,7 @@ executable hbs2-peer
|
||||||
, RPC2.RefLog
|
, RPC2.RefLog
|
||||||
, RPC2.RefChan
|
, RPC2.RefChan
|
||||||
, RPC2.LWWRef
|
, RPC2.LWWRef
|
||||||
|
, RPC2.Mailbox
|
||||||
, PeerTypes
|
, PeerTypes
|
||||||
, PeerLogger
|
, PeerLogger
|
||||||
, PeerConfig
|
, PeerConfig
|
||||||
|
@ -284,6 +286,7 @@ executable hbs2-peer
|
||||||
, CLI.Common
|
, CLI.Common
|
||||||
, CLI.RefChan
|
, CLI.RefChan
|
||||||
, CLI.LWWRef
|
, CLI.LWWRef
|
||||||
|
, CLI.Mailbox
|
||||||
|
|
||||||
, Paths_hbs2_peer
|
, Paths_hbs2_peer
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
{-# Language UndecidableInstances #-}
|
||||||
|
module HBS2.Peer.RPC.API.Mailbox where
|
||||||
|
|
||||||
|
import HBS2.Peer.Prelude
|
||||||
|
import HBS2.Net.Proto.Service
|
||||||
|
import HBS2.Net.Messaging.Unix (UNIX)
|
||||||
|
import HBS2.Data.Types.Refs (HashRef(..))
|
||||||
|
import HBS2.Data.Types.SignedBox
|
||||||
|
|
||||||
|
import Data.ByteString.Lazy ( ByteString )
|
||||||
|
import Data.ByteString qualified as BS
|
||||||
|
import Codec.Serialise
|
||||||
|
|
||||||
|
data RpcMailboxPoke
|
||||||
|
|
||||||
|
type MailboxAPI = '[ RpcMailboxPoke
|
||||||
|
]
|
||||||
|
|
||||||
|
type MailboxAPIProto = 0x056091510d3b2ec9
|
||||||
|
|
||||||
|
|
||||||
|
instance HasProtocol UNIX (ServiceProto MailboxAPI UNIX) where
|
||||||
|
type instance ProtocolId (ServiceProto MailboxAPI UNIX) = MailboxAPIProto
|
||||||
|
type instance Encoded UNIX = ByteString
|
||||||
|
decode = either (const Nothing) Just . deserialiseOrFail
|
||||||
|
encode = serialise
|
||||||
|
|
||||||
|
type instance Input RpcMailboxPoke = ()
|
||||||
|
type instance Output RpcMailboxPoke = ()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue