@@ -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
257289instance MonadRemoteStoreR r m => MonadRemoteStoreR r (StateT s m )
258290instance 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