Skip to content

Commit

Permalink
remote: add Types.Handshake, use as a greeting result
Browse files Browse the repository at this point in the history
  • Loading branch information
sorki committed Dec 2, 2023
1 parent 0c186a0 commit 62e472f
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 22 deletions.
1 change: 1 addition & 0 deletions hnix-store-remote/hnix-store-remote.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ library
, System.Nix.Store.Remote.Types.Activity
, System.Nix.Store.Remote.Types.CheckMode
, System.Nix.Store.Remote.Types.GC
, System.Nix.Store.Remote.Types.Handshake
, System.Nix.Store.Remote.Types.Logger
, System.Nix.Store.Remote.Types.ProtoVersion
, System.Nix.Store.Remote.Types.StoreConfig
Expand Down
52 changes: 30 additions & 22 deletions hnix-store-remote/src/System/Nix/Store/Remote/Client.hs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import System.Nix.Store.Remote.Logger (processOutput)
import System.Nix.Store.Remote.MonadStore
import System.Nix.Store.Remote.Socket (sockPutS, sockGetS)
import System.Nix.Store.Remote.Serializer (bool, enum, int, mapErrorS, protoVersion, text, trustedFlag, workerMagic)
import System.Nix.Store.Remote.Types.Handshake (Handshake(..))
import System.Nix.Store.Remote.Types.Logger (Logger)
import System.Nix.Store.Remote.Types.ProtoVersion (ProtoVersion(..), ourProtoVersion)
import System.Nix.Store.Remote.Types.StoreConfig (PreStoreConfig, preStoreConfigToStoreConfig)
Expand Down Expand Up @@ -81,13 +82,13 @@ runStoreSocket
-> Run a
runStoreSocket preStoreConfig code =
runRemoteStoreT preStoreConfig $ do
pv <- greet
Handshake{..} <- greet
mapStoreConfig
(preStoreConfigToStoreConfig pv)
(preStoreConfigToStoreConfig handshakeProtoVersion)
code

where
greet :: MonadRemoteStoreHandshake ProtoVersion
greet :: MonadRemoteStoreHandshake Handshake
greet = do

sockPutS
Expand Down Expand Up @@ -124,25 +125,32 @@ runStoreSocket preStoreConfig code =
(mapErrorS RemoteStoreError_SerializerPut bool)
False -- reserveSpace, obsolete

when (minimumCommonVersion >= ProtoVersion 1 33) $ do
-- If we were buffering I/O, we would flush the output here.
_daemonNixVersion <-
sockGetS
$ mapErrorS
RemoteStoreError_SerializerGet
text
return ()

_remoteTrustsUs <- if minimumCommonVersion >= ProtoVersion 1 35
daemonNixVersion <- if minimumCommonVersion >= ProtoVersion 1 33
then do
-- If we were buffering I/O, we would flush the output here.
txtVer <-
sockGetS
$ mapErrorS
RemoteStoreError_SerializerGet
text
pure $ Just txtVer
else pure Nothing

remoteTrustsUs <- if minimumCommonVersion >= ProtoVersion 1 35
then do
sockGetS
$ mapErrorS RemoteStoreError_SerializerHandshake trustedFlag
else do
return Nothing

-- TODO do something with it
_ <- mapStoreConfig
(preStoreConfigToStoreConfig minimumCommonVersion)
processOutput

pure minimumCommonVersion
else pure Nothing

logs <-
mapStoreConfig
(preStoreConfigToStoreConfig minimumCommonVersion)
processOutput

pure Handshake
{ handshakeNixVersion = daemonNixVersion
, handshakeTrust = remoteTrustsUs
, handshakeProtoVersion = minimumCommonVersion
, handshakeRemoteProtoVersion = daemonVersion
, handshakeLogs = logs
}
19 changes: 19 additions & 0 deletions hnix-store-remote/src/System/Nix/Store/Remote/Types/Handshake.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module System.Nix.Store.Remote.Types.Handshake
( Handshake(..)
) where

import Data.Text (Text)
import GHC.Generics (Generic)
import System.Nix.Store.Remote.Types.Logger (Logger)
import System.Nix.Store.Remote.Types.ProtoVersion (ProtoVersion)
import System.Nix.Store.Remote.Types.TrustedFlag (TrustedFlag)

-- | Data for initial protocol handshake
data Handshake = Handshake
{ handshakeNixVersion :: Maybe Text -- ^ Textual version, since 1.33
, handshakeTrust :: Maybe TrustedFlag -- ^ Whether remote side trusts us
, handshakeProtoVersion :: ProtoVersion -- ^ Minimum protocol supported by both sides
, handshakeRemoteProtoVersion :: ProtoVersion -- ^ Protocol supported by remote side
, handshakeLogs :: [Logger] -- ^ Logs produced right after greeting exchange
}
deriving (Eq, Generic, Ord, Show)

0 comments on commit 62e472f

Please sign in to comment.