diff options
Diffstat (limited to 'src/Erebos/Network.hs')
| -rw-r--r-- | src/Erebos/Network.hs | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/Erebos/Network.hs b/src/Erebos/Network.hs index b5cfa6b..3a6f259 100644 --- a/src/Erebos/Network.hs +++ b/src/Erebos/Network.hs @@ -26,6 +26,7 @@ module Erebos.Network ( sendToPeerWith, runPeerService, modifyServiceGlobalState, + requestDataFromPeer, DataRequestResult(..), discoveryPort, ) where @@ -1063,6 +1064,19 @@ modifyServiceGlobalState server proxy f = do throwErebosError $ UnhandledService svc +data DataRequestResult + = DataRequestFulfilled Ref + | DataRequestRejected + | DataRequestInvalid + +requestDataFromPeer :: MonadIO m => Peer -> RefDigest -> (DataRequestResult -> ExceptT ErebosError IO ()) -> m () +requestDataFromPeer peer@Peer {..} dgst callback = do + liftIO $ atomically $ do + wref <- WaitingRef peerStorage_ (partialRefFromDigest peerInStorage dgst) (callback . DataRequestFulfilled) <$> newTVar (Left []) + putTMVar peerWaitingRefs . (wref :) =<< takeTMVar peerWaitingRefs + writeTQueue (serverDataResponse peerServer_) ( peer, Nothing ) + + foreign import ccall unsafe "Network/ifaddrs.h erebos_join_multicast" cJoinMulticast :: CInt -> Ptr CSize -> IO (Ptr Word32) foreign import ccall unsafe "Network/ifaddrs.h erebos_local_addresses" cLocalAddresses :: Ptr CSize -> IO (Ptr InetAddress) foreign import ccall unsafe "Network/ifaddrs.h erebos_broadcast_addresses" cBroadcastAddresses :: IO (Ptr Word32) |