on master help sign in
Simplify server.knot: drop isOffline lambda, consolidate federation gates, use when instead of case findFirst
ab099dfiko
server.knot+24−28
@@ -549,11 +549,11 @@ sendBatchedGossip = \peers events -> forEach peers (\server -> do
549 Ok _ -> clearFailure server))
549 Ok _ -> clearFailure server))
550
550
551-- Tell known peers that the listed local pubkeys just went offline. No-op when
551-- Tell known peers that the listed local pubkeys just went offline. No-op when
552−-- federation is disabled or the list is empty.
552+-- the list is empty. Caller is responsible for the `federationEnabled` gate.
553broadcastOfflineGossip : [{pubkey: PubkeyHex | a}] -> IO {r *presence, rw *forwardFailures, network, clock} {}
553broadcastOfflineGossip : [{pubkey: PubkeyHex | a}] -> IO {r *presence, rw *forwardFailures, network, clock} {}
554−broadcastOfflineGossip = \expiredLocal -> do
554+broadcastOfflineGossip = \expiredLocal -> when (count expiredLocal > 0) (do
555 presence <- *presence
555 presence <- *presence
556− when (federationEnabled && count expiredLocal > 0) (sendBatchedGossip (knownPeerServersFromPresence presence) (map (\p -> GossipOffline {
556+ sendBatchedGossip (knownPeerServersFromPresence presence) (map (\p -> GossipOffline {
557 p.pubkey
557 p.pubkey
558 }) expiredLocal))
558 }) expiredLocal))
559
559
@@ -804,25 +804,23 @@ forkForwardsTo : PubkeyHex -> BlobHex -> [Text] -> IO {r *presence, rw *forwardF
804forkForwardsTo = \to encryptedBlob servers -> forEach servers (\server -> do
804forkForwardsTo = \to encryptedBlob servers -> forEach servers (\server -> do
805 fwds <- *forwards
805 fwds <- *forwards
806 let same = \x -> x.encryptedBlob == encryptedBlob && x.toServer == server
806 let same = \x -> x.encryptedBlob == encryptedBlob && x.toServer == server
807− case findFirst fwds same of
807+ when (any same fwds) (do
808− Nothing {} -> yield {}
809− Just {value: f} -> do
810− t <- now
808+ t <- now
811− result <- fetch (federationUrl server) (ForwardMessage {toKey: to, encryptedBlob})
809+ result <- fetch (federationUrl server) (ForwardMessage {toKey: to, encryptedBlob})
812− case result of
810+ case result of
813− Err _ -> recordFailure server
811+ Err _ -> recordFailure server
814− Ok _ -> do
812+ Ok _ -> do
815− clearFailure server
813+ clearFailure server
816− atomic (do
814+ atomic (do
817− fwds2 <- *forwards
815+ fwds2 <- *forwards
818− let remaining = filter (\x -> not same x) fwds2
816+ let remaining = filter (\x -> not same x) fwds2
819− *forwards = remaining
817+ *forwards = remaining
820− pres <- *presence
818+ pres <- *presence
821− let stillLocal = hasLocalPresence pres to t
819+ let stillLocal = hasLocalPresence pres to t
822− let othersPending = any (\x -> x.encryptedBlob == encryptedBlob) remaining
820+ let othersPending = any (\x -> x.encryptedBlob == encryptedBlob) remaining
823− when (not stillLocal && not othersPending) (do
821+ when (not stillLocal && not othersPending) (do
824− msgs <- *messages
822+ msgs <- *messages
825− *messages = filter (\m -> m.encryptedBlob != encryptedBlob) msgs)))
823+ *messages = filter (\m -> m.encryptedBlob != encryptedBlob) msgs))))
826
824
827-- ============================================
825-- ============================================
828-- Handler: federation receive
826-- Handler: federation receive
@@ -848,15 +846,12 @@ handleRecvGossip = \events fromServer -> do
848 let isOnline = \e -> case e of
846 let isOnline = \e -> case e of
849 GossipOnline {pubkey: _} -> True {}
847 GossipOnline {pubkey: _} -> True {}
850 _ -> False {}
848 _ -> False {}
851− let isOffline = \e -> case e of
852− GossipOffline {pubkey: _} -> True {}
853− _ -> False {}
854 let pubkeyOf = \e -> case e of
849 let pubkeyOf = \e -> case e of
855 GossipOnline {pubkey} -> pubkey
850 GossipOnline {pubkey} -> pubkey
856 GossipOffline {pubkey} -> pubkey
851 GossipOffline {pubkey} -> pubkey
857 _ -> ""
852 _ -> ""
858 let onlinePubkeys = map pubkeyOf (filter isOnline events)
853 let onlinePubkeys = map pubkeyOf (filter isOnline events)
859− let touchedPubkeys = map pubkeyOf (filter (\e -> isOnline e || isOffline e) events)
854+ let touchedPubkeys = filter (\pk -> pk != "") (map pubkeyOf events)
860 let kept = filter (\p -> p.server != fromServer || not elem p.pubkey touchedPubkeys) pres
855 let kept = filter (\p -> p.server != fromServer || not elem p.pubkey touchedPubkeys) pres
861 let added = map (\pk -> {pubkey: pk, server: fromServer, expiresAt: t + onlineGossipTtl}) onlinePubkeys
856 let added = map (\pk -> {pubkey: pk, server: fromServer, expiresAt: t + onlineGossipTtl}) onlinePubkeys
862 *presence = union kept added
857 *presence = union kept added
@@ -920,8 +915,9 @@ backgroundPrune : IO {rw *challenges, rw *forwardFailures, rw *forwards, rw *mes
920backgroundPrune = do
915backgroundPrune = do
921 t <- now
916 t <- now
922 expiredLocal <- pruneExpired t
917 expiredLocal <- pruneExpired t
923− fork (broadcastOfflineGossip expiredLocal)
918+ when federationEnabled (do
919+ fork (broadcastOfflineGossip expiredLocal)
924− when federationEnabled (fork retryPendingForwards)
920+ fork retryPendingForwards)
925 sleep backgroundPruneInterval
921 sleep backgroundPruneInterval
926 backgroundPrune
922 backgroundPrune
927
923