@@ -342,7 +342,9 @@ evictOldestAckedIds = \items n ->
342342 else
343343 let toEvict = (fold (\acc a ->
344344 if acc.size < n
345− then {size: acc.size + 1, heap: union acc.heap [a], heapMax: if a.ackedAt > acc.heapMax then a.ackedAt else acc.heapMax}
345+ then
346+ let newHeap = union acc.heap [a]
347+ {size: count newHeap, heap: newHeap, heapMax: if a.ackedAt > acc.heapMax then a.ackedAt else acc.heapMax}
346348 else if a.ackedAt < acc.heapMax
347349 then
348350 let removed = fold (\r x ->
@@ -438,10 +440,7 @@ sendBatchedGossip = \peerServers allEvents ->
438440 let batch = fold (\acc e ->
439441 if count acc >= maxGossipEvents then acc
440442 else union acc [e]) [] allEvents
441− let rest = (fold (\acc e ->
442− if acc.taken < maxGossipEvents
443− then {taken: acc.taken + 1, items: acc.items}
444− else {taken: acc.taken, items: union acc.items [e]}) {taken: 0, items: []} allEvents).items
443+ let rest = diff allEvents batch
445444 sendToEach peerServers (\server ->
446445 fetch (federationScheme ++ server) (RecvGossip {
447446 authorization: "Bearer " ++ federationSecret,
@@ -566,7 +565,7 @@ serve = \req -> case req of
566565 pruneResult <- atomic do
567566 pr <- maybePrune t
568567 challenges <- *challenges
569− let existingCount = count (do c <- challenges; where c.pubkey == pubkey; yield c)
568+ let existingCount = count (do c <- challenges; where c.pubkey == pubkey; where c.expiresAt > t; yield c)
570569 let oldestChallengeExpiry = fold (\acc c2 -> if c2.pubkey == pubkey && (acc == -1 || c2.expiresAt < acc) then c2.expiresAt else acc) -1 challenges
571570 let cappedChallenges = if existingCount >= maxChallengesPerKey && oldestChallengeExpiry >= 0
572571 then fold (\acc c ->
@@ -857,10 +856,9 @@ serve = \req -> case req of
857856 ackedIds <- *ackedIds
858857 let reinsert = do a <- evictedToRetry; where a.originServer == server; yield a
859858 let available = maxAckedIds - count ackedIds
860− let needed = count reinsert - available
861− let afterEvict = if needed <= 0 then ackedIds
862− else evictOldestAckedIds ackedIds needed
863− set *ackedIds = union afterEvict reinsert))
859+ let toReinsert = if available <= 0 then []
860+ else fold (\acc a -> if count acc >= available then acc else union acc [a]) [] reinsert
861+ set *ackedIds = union ackedIds toReinsert))
864862 else yield {}
865863 broadcastOfflineGossip t result.peerServers result.expiredLocal
866864
@@ -886,12 +884,9 @@ serve = \req -> case req of
886884 Just {value: _} ->
887885 if not validPubkey || count valid == 0
888886 then ""
889− else case single (do
890− p <- valid
891− where p.server == serverHostN
892− yield p) of
893− Just {value: p} -> p.server
894− Nothing {} -> (fold (\acc p -> if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt} else acc) {server: "", best: 0} valid).server
887+ else if count (do p <- valid; where p.server == serverHostN; yield p) > 0
888+ then serverHostN
889+ else (fold (\acc p -> if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt} else acc) {server: "", best: 0} valid).server
895890 yield {foundServer: foundServer, authorized: authorized, expiredLocal: pr.expiredLocal, peerServers: pr.peerServers}
896891 respond {online: not (result.foundServer == ""), server: result.foundServer, authorized: result.authorized}
897892 broadcastOfflineGossip t result.peerServers result.expiredLocal