diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-10-17 21:51:50 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-10-18 10:14:59 +0200 |
| commit | 552cb773ce9d8472530e123e926493b3dd1e658f (patch) | |
| tree | f031ea4a621bb2d974fb569fe7f02252e432719c /src | |
| parent | eaa4c4b247e13ed6ff3b4365cbe82366bf2c9448 (diff) | |
Network: add connection to packet handler state
Diffstat (limited to 'src')
| -rw-r--r-- | src/Erebos/Network.hs | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/src/Erebos/Network.hs b/src/Erebos/Network.hs index 3cb961d..6e17fd6 100644 --- a/src/Erebos/Network.hs +++ b/src/Erebos/Network.hs @@ -419,7 +419,7 @@ startServer serverOptions serverOrigHead logd' serverServices = do case mbpid of Just dgst -> do identity <- readMVar serverIdentity_ - atomically $ runPacketHandler False peer $ do + atomically $ runPacketHandler False peer conn $ do wref <- newWaitingRef dgst $ handleIdentityAnnounce identity peer readTVarP (peerIdentityVar peer) >>= \case PeerIdentityUnknown idwait -> do @@ -434,7 +434,7 @@ startServer serverOptions serverOrigHead logd' serverServices = do prefs <- forM objs $ storeObject $ peerInStorage peer identity <- readMVar serverIdentity_ let svcs = map someServiceID serverServices - handlePacket paddr identity secure peer chanSvc svcs header prefs + handlePacket conn identity secure peer chanSvc svcs header prefs peerLoop Nothing -> do case paddr of @@ -542,10 +542,10 @@ newtype PacketHandler a = PacketHandler { unPacketHandler :: StateT PacketHandle instance MonadFail PacketHandler where fail = throwError -runPacketHandler :: Bool -> Peer -> PacketHandler () -> STM () -runPacketHandler secure peer@Peer {..} act = do +runPacketHandler :: Bool -> Peer -> Connection PeerAddress -> PacketHandler () -> STM () +runPacketHandler secure peer@Peer {..} conn act = do let logd = writeTQueue $ serverErrorLog peerServer_ - runExceptT (flip execStateT (PacketHandlerState peer [] [] [] Nothing False) $ unPacketHandler act) >>= \case + runExceptT (flip execStateT (PacketHandlerState peer conn [] [] [] Nothing False) $ unPacketHandler act) >>= \case Left err -> do logd $ "Error in handling packet from " ++ show peerAddress ++ ": " ++ err Right ph -> do @@ -577,9 +577,10 @@ modifyTMVarP v f = liftSTM $ putTMVar v . f =<< takeTMVar v data PacketHandlerState = PacketHandlerState { phPeer :: Peer - , phHead :: [TransportHeaderItem] - , phAckedBy :: [TransportHeaderItem] - , phBody :: [Ref] + , phConnection :: Connection PeerAddress + , phHead :: [ TransportHeaderItem ] + , phAckedBy :: [ TransportHeaderItem ] + , phBody :: [ Ref ] , phBodyStream :: Maybe RawStreamWriter , phPlaintextReply :: Bool } @@ -607,9 +608,7 @@ keepPlaintextReply = modify $ \ph -> ph { phPlaintextReply = True } openStream :: PacketHandler RawStreamWriter openStream = do Peer {..} <- gets phPeer - conn <- readTVarP peerState >>= \case - PeerConnected conn -> return conn - _ -> throwError "can't open stream without established connection" + conn <- gets phConnection (hdr, writer, handler) <- liftEither =<< liftSTM (connAddWriteStream conn) liftSTM $ writeTQueue (serverIOActions peerServer_) (liftIO $ forkServerThread peerServer_ "stream-writer" handler) @@ -618,10 +617,7 @@ openStream = do acceptStream :: Word8 -> PacketHandler RawStreamReader acceptStream streamNumber = do - Peer {..} <- gets phPeer - conn <- readTVarP peerState >>= \case - PeerConnected conn -> return conn - _ -> throwError "can't accept stream without established connection" + conn <- gets phConnection liftSTM $ connAddReadStream conn streamNumber appendDistinct :: Eq a => a -> [a] -> [a] @@ -629,10 +625,11 @@ appendDistinct x (y:ys) | x == y = y : ys | otherwise = y : appendDistinct x ys appendDistinct x [] = [x] -handlePacket :: PeerAddress -> UnifiedIdentity -> Bool +handlePacket :: Connection PeerAddress -> UnifiedIdentity -> Bool -> Peer -> TQueue ( Peer, PeerAddress, ServiceID, Ref, [ RawStreamReader ] ) -> [ ServiceID ] -> TransportHeader -> [ PartialRef ] -> IO () -handlePacket paddr identity secure peer chanSvc svcs (TransportHeader headers) prefs = atomically $ do +handlePacket conn identity secure peer chanSvc svcs (TransportHeader headers) prefs = atomically $ do + let paddr = connAddress conn let server = peerServer peer ochannel <- getPeerChannel peer let sidentity = idData identity @@ -645,7 +642,7 @@ handlePacket paddr identity secure peer chanSvc svcs (TransportHeader headers) p _ -> [] ] - runPacketHandler secure peer $ do + runPacketHandler secure peer conn $ do let logd = liftSTM . writeTQueue (serverErrorLog server) forM_ headers $ \case Acknowledged dgst -> do |