From 9d28d822897d59c7e98aac1ca8ba254fc00fd9df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Mon, 4 Aug 2025 19:45:50 +0200 Subject: Separate notifications for new and updated peers --- src/Erebos/DirectMessage.hs | 4 +++- src/Erebos/Network.hs | 13 +++++++------ src/Erebos/Service.hs | 3 +++ src/Erebos/Sync.hs | 1 + 4 files changed, 14 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/Erebos/DirectMessage.hs b/src/Erebos/DirectMessage.hs index d680997..7807204 100644 --- a/src/Erebos/DirectMessage.hs +++ b/src/Erebos/DirectMessage.hs @@ -108,9 +108,11 @@ instance Service DirectMessage where else join $ asks $ dmOwnerMismatch . svcAttributes serviceNewPeer = do - updateDirectMessagePeer . finalOwner =<< asks svcPeerIdentity syncDirectMessageToPeer . lookupSharedValue . lsShared . fromStored =<< svcGetLocal + serviceUpdatedPeer = do + updateDirectMessagePeer . finalOwner =<< asks svcPeerIdentity + serviceStorageWatchers _ = [ SomeStorageWatcher (lookupSharedValue . lsShared . fromStored) syncDirectMessageToPeer , GlobalStorageWatcher (lookupSharedValue . lsShared . fromStored) findMissingPeers diff --git a/src/Erebos/Network.hs b/src/Erebos/Network.hs index f0c44a4..6265bbf 100644 --- a/src/Erebos/Network.hs +++ b/src/Erebos/Network.hs @@ -784,7 +784,7 @@ finalizedChannel peer@Peer {..} ch self = do -- Notify services about new peer readTVar peerIdentityVar >>= \case - PeerIdentityFull _ -> notifyServicesOfPeer peer + PeerIdentityFull _ -> notifyServicesOfPeer True peer _ -> return () @@ -810,7 +810,7 @@ handleIdentityAnnounce self peer ref = liftIO $ atomically $ do PeerIdentityFull pid | idData pid `precedes` wrappedLoad ref -> validateAndUpdate (idUpdates pid) $ \_ -> do - notifyServicesOfPeer peer + notifyServicesOfPeer False peer _ -> return () @@ -823,16 +823,17 @@ handleIdentityUpdate peer ref = liftIO $ atomically $ do writeTVar (peerIdentityVar peer) $ PeerIdentityFull pid' writeTChan (serverChanPeer $ peerServer peer) peer when (pid /= pid') $ do - notifyServicesOfPeer peer + notifyServicesOfPeer False peer | otherwise -> return () -notifyServicesOfPeer :: Peer -> STM () -notifyServicesOfPeer peer@Peer { peerServer_ = Server {..} } = do +notifyServicesOfPeer :: Bool -> Peer -> STM () +notifyServicesOfPeer new peer@Peer { peerServer_ = Server {..} } = do writeTQueue serverIOActions $ do paddr <- getPeerAddress peer forM_ serverServices $ \service@(SomeService _ attrs) -> - runPeerServiceOn (Just ( service, attrs )) [] paddr peer serviceNewPeer + runPeerServiceOn (Just ( service, attrs )) [] paddr peer $ + if new then serviceNewPeer else serviceUpdatedPeer receivedFromCustomAddress :: PeerAddressType addr => Server -> addr -> ByteString -> IO () diff --git a/src/Erebos/Service.hs b/src/Erebos/Service.hs index afcf512..303f9db 100644 --- a/src/Erebos/Service.hs +++ b/src/Erebos/Service.hs @@ -51,6 +51,9 @@ class ( serviceNewPeer :: ServiceHandler s () serviceNewPeer = return () + serviceUpdatedPeer :: ServiceHandler s () + serviceUpdatedPeer = return () + type ServiceAttributes s = attr | attr -> s type ServiceAttributes s = Proxy s defaultServiceAttributes :: proxy s -> ServiceAttributes s diff --git a/src/Erebos/Sync.hs b/src/Erebos/Sync.hs index d837a14..5f5fdec 100644 --- a/src/Erebos/Sync.hs +++ b/src/Erebos/Sync.hs @@ -31,6 +31,7 @@ instance Service SyncService where else return ls serviceNewPeer = notifyPeer . lsShared . fromStored =<< svcGetLocal + serviceUpdatedPeer = serviceNewPeer serviceStorageWatchers _ = (:[]) $ SomeStorageWatcher (lsShared . fromStored) notifyPeer instance Storable SyncService where -- cgit v1.2.3