@@ -342,7 +342,9 @@ evictOldestAckedIds = \items n ->
343 let toEvict = (fold (\acc a ->
343 let toEvict = (fold (\acc a ->
344 if acc.size < n
344 if acc.size < n
346+ let newHeap = union acc.heap [a]
345− then {size: acc.size + 1, heap: union acc.heap [a], heapMax: if a.ackedAt > acc.heapMax then a.ackedAt else acc.heapMax}
347+ {size: count newHeap, heap: newHeap, heapMax: if a.ackedAt > acc.heapMax then a.ackedAt else acc.heapMax}
346 else if a.ackedAt < acc.heapMax
348 else if a.ackedAt < acc.heapMax
348 let removed = fold (\r x ->
350 let removed = fold (\r x ->
@@ -438,10 +440,7 @@ sendBatchedGossip = \peerServers allEvents ->
438 let batch = fold (\acc e ->
440 let batch = fold (\acc e ->
439 if count acc >= maxGossipEvents then acc
441 if count acc >= maxGossipEvents then acc
440 else union acc [e]) [] allEvents
442 else union acc [e]) [] allEvents
441− let rest = (fold (\acc e ->
443+ let rest = diff allEvents batch
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
445 sendToEach peerServers (\server ->
444 sendToEach peerServers (\server ->
446 fetch (federationScheme ++ server) (RecvGossip {
445 fetch (federationScheme ++ server) (RecvGossip {
447 authorization: "Bearer " ++ federationSecret,
446 authorization: "Bearer " ++ federationSecret,
@@ -566,7 +565,7 @@ serve = \req -> case req of
566 pruneResult <- atomic do
565 pruneResult <- atomic do
567 pr <- maybePrune t
566 pr <- maybePrune t
568 challenges <- *challenges
567 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)
570 let oldestChallengeExpiry = fold (\acc c2 -> if c2.pubkey == pubkey && (acc == -1 || c2.expiresAt < acc) then c2.expiresAt else acc) -1 challenges
569 let oldestChallengeExpiry = fold (\acc c2 -> if c2.pubkey == pubkey && (acc == -1 || c2.expiresAt < acc) then c2.expiresAt else acc) -1 challenges
571 let cappedChallenges = if existingCount >= maxChallengesPerKey && oldestChallengeExpiry >= 0
570 let cappedChallenges = if existingCount >= maxChallengesPerKey && oldestChallengeExpiry >= 0
572 then fold (\acc c ->
571 then fold (\acc c ->
@@ -857,10 +856,9 @@ serve = \req -> case req of
857 ackedIds <- *ackedIds
856 ackedIds <- *ackedIds
858 let reinsert = do a <- evictedToRetry; where a.originServer == server; yield a
857 let reinsert = do a <- evictedToRetry; where a.originServer == server; yield a
859 let available = maxAckedIds - count ackedIds
858 let available = maxAckedIds - count ackedIds
860− let needed = count reinsert - available
859+ let toReinsert = if available <= 0 then []
861− let afterEvict = if needed <= 0 then ackedIds
860+ else fold (\acc a -> if count acc >= available then acc else union acc [a]) [] reinsert
862− else evictOldestAckedIds ackedIds needed
863− set *ackedIds = union afterEvict reinsert))
861+ set *ackedIds = union ackedIds toReinsert))
864 else yield {}
862 else yield {}
865 broadcastOfflineGossip t result.peerServers result.expiredLocal
863 broadcastOfflineGossip t result.peerServers result.expiredLocal
@@ -886,12 +884,9 @@ serve = \req -> case req of
886 Just {value: _} ->
884 Just {value: _} ->
887 if not validPubkey || count valid == 0
885 if not validPubkey || count valid == 0
889− else case single (do
891− where p.server == serverHostN
887+ else if count (do p <- valid; where p.server == serverHostN; yield p) > 0
892− yield p) of
888+ then serverHostN
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
889+ else (fold (\acc p -> if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt} else acc) {server: "", best: 0} valid).server
895 yield {foundServer: foundServer, authorized: authorized, expiredLocal: pr.expiredLocal, peerServers: pr.peerServers}
890 yield {foundServer: foundServer, authorized: authorized, expiredLocal: pr.expiredLocal, peerServers: pr.peerServers}
896 respond {online: not (result.foundServer == ""), server: result.foundServer, authorized: result.authorized}
891 respond {online: not (result.foundServer == ""), server: result.foundServer, authorized: result.authorized}
897 broadcastOfflineGossip t result.peerServers result.expiredLocal
892 broadcastOfflineGossip t result.peerServers result.expiredLocal