From 66bfcd8ad4ef16dcd0e287004dc08f8948589bce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sun, 25 Jan 2026 10:22:04 +0100 Subject: Deferred object loading --- src/Erebos/Network.hs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src/Erebos/Network.hs') 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) -- cgit v1.2.3