summaryrefslogtreecommitdiff
path: root/src/Erebos/Network.hs
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-01-25 10:22:04 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2026-01-27 19:45:23 +0100
commit66bfcd8ad4ef16dcd0e287004dc08f8948589bce (patch)
tree337a1658cc4ff76c14254a0d69aafd6c61765a14 /src/Erebos/Network.hs
parent7e0685f049f8981c4f11c3c83caacf85bc855577 (diff)
Deferred object loading
Diffstat (limited to 'src/Erebos/Network.hs')
-rw-r--r--src/Erebos/Network.hs14
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)