Skip to content

Commit c6cfd28

Browse files
committed
remote: implement Logger_Write
Adds `setDataSink` which can be used to set a function to be called when daemon sned us data using `Logger_Write`. `clearDataSink` should be used after the operation using the data sink is finished.
1 parent 811e2a0 commit c6cfd28

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

hnix-store-remote/src/System/Nix/Store/Remote/Logger.hs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import Data.ByteString (ByteString)
88
import Data.Serialize (Result(..))
99
import System.Nix.Store.Remote.Serializer (LoggerSError, logger, runSerialT)
1010
import System.Nix.Store.Remote.Socket (sockGet8)
11-
import System.Nix.Store.Remote.MonadStore (MonadRemoteStore, RemoteStoreError(..), appendLog, getDataSource, getStoreSocket, getProtoVersion, setError)
11+
import System.Nix.Store.Remote.MonadStore (MonadRemoteStore, RemoteStoreError(..), appendLog, getDataSource, getDataSink, getStoreSocket, getProtoVersion, setError)
1212
import System.Nix.Store.Remote.Types.Logger (Logger(..))
1313
import System.Nix.Store.Remote.Types.ProtoVersion (ProtoVersion)
1414

@@ -72,9 +72,14 @@ processOutput = do
7272
loop
7373

7474
-- Write data to sink
75-
-- used with tunnel sink in ExportPath operation
76-
Logger_Write _out -> do
77-
-- TODO: handle me
75+
Logger_Write out -> do
76+
mSink <- getDataSink
77+
case mSink of
78+
Nothing ->
79+
throwError RemoteStoreError_NoDataSinkProvided
80+
Just sink -> do
81+
liftIO $ sink out
82+
7883
loop
7984

8085
-- Following we just append and loop

hnix-store-remote/src/System/Nix/Store/Remote/MonadStore.hs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ data RemoteStoreState = RemoteStoreState {
4141
-- as the daemon requests chunks of size @Word64@.
4242
-- If the function returns Nothing and daemon tries to read more
4343
-- data an error is thrown.
44+
-- Used by @AddToStoreNar@ and @ImportPaths@ operations.
45+
, remoteStoreState_mDataSink :: Maybe (ByteString -> IO ())
46+
-- ^ Sink for @Logger_Write@, called repeatedly by the daemon
47+
-- to dump us some data. Used by @ExportPath@ operation.
4448
, remoteStoreState_mNarSource :: Maybe (NarSource IO)
4549
}
4650

@@ -61,6 +65,7 @@ data RemoteStoreError
6165
| RemoteStoreError_LoggerParserFail String ByteString -- when incremental parser returns ((Fail msg leftover) :: Result)
6266
| RemoteStoreError_NoDataSourceProvided -- remoteStoreState_mDataSource is required but it is Nothing
6367
| RemoteStoreError_DataSourceExhausted -- remoteStoreState_mDataSource returned Nothing but more data was requested
68+
| RemoteStoreError_NoDataSinkProvided -- remoteStoreState_mDataSink is required but it is Nothing
6469
| RemoteStoreError_NoNarSourceProvided
6570
| RemoteStoreError_OperationFailed
6671
| RemoteStoreError_ProtocolMismatch
@@ -128,6 +133,7 @@ runRemoteStoreT r =
128133
{ remoteStoreState_logs = mempty
129134
, remoteStoreState_gotError = False
130135
, remoteStoreState_mDataSource = Nothing
136+
, remoteStoreState_mDataSink = Nothing
131137
, remoteStoreState_mNarSource = Nothing
132138
}
133139

@@ -252,7 +258,33 @@ class ( MonadIO m
252258
=> m ()
253259
clearDataSource = lift clearDataSource
254260

261+
setDataSink :: (ByteString -> IO ()) -> m ()
262+
default setDataSink
263+
:: ( MonadTrans t
264+
, MonadRemoteStoreR r m'
265+
, m ~ t m'
266+
)
267+
=> (ByteString -> IO ())
268+
-> m ()
269+
setDataSink x = lift (setDataSink x)
270+
271+
getDataSink :: m (Maybe (ByteString -> IO ()))
272+
default getDataSink
273+
:: ( MonadTrans t
274+
, MonadRemoteStoreR r m'
275+
, m ~ t m'
276+
)
277+
=> m (Maybe (ByteString -> IO ()))
278+
getDataSink = lift getDataSink
255279

280+
clearDataSink :: m ()
281+
default clearDataSink
282+
:: ( MonadTrans t
283+
, MonadRemoteStoreR r m'
284+
, m ~ t m'
285+
)
286+
=> m ()
287+
clearDataSink = lift clearDataSink
256288

257289
instance MonadRemoteStoreR r m => MonadRemoteStoreR r (StateT s m)
258290
instance MonadRemoteStoreR r m => MonadRemoteStoreR r (ReaderT r m)
@@ -282,6 +314,10 @@ instance ( MonadIO m
282314
getDataSource = remoteStoreState_mDataSource <$> RemoteStoreT get
283315
clearDataSource = RemoteStoreT $ modify $ \s -> s { remoteStoreState_mDataSource = Nothing }
284316

317+
setDataSink x = RemoteStoreT $ modify $ \s -> s { remoteStoreState_mDataSink = pure x }
318+
getDataSink = remoteStoreState_mDataSink <$> RemoteStoreT get
319+
clearDataSink = RemoteStoreT $ modify $ \s -> s { remoteStoreState_mDataSink = Nothing }
320+
285321
setNarSource x = RemoteStoreT $ modify $ \s -> s { remoteStoreState_mNarSource = pure x }
286322
takeNarSource = RemoteStoreT $ do
287323
x <- remoteStoreState_mNarSource <$> get

0 commit comments

Comments
 (0)