@@ -438,12 +438,16 @@ safeCompare = \a b ->
438438 safeCompareLoop a b maxTokenLen 0 + (if a == "" then 1 else 0) + (if b == "" then 1 else 0) == 0
439439
440440evictOneOldest = \items getKey ->
441− let oldest = fold (\acc x -> let k = getKey x in if acc == -1 || k < acc then k else acc) (-1) items in
442− if oldest == -1 then items
443− else (fold (\acc x ->
444− if not acc.removed && getKey x == oldest
445− then {removed: True {}, items: acc.items}
446− else {removed: acc.removed, items: union acc.items [x]}) {removed: False {}, items: []} items).items
441+ let oldest = fold (\acc x -> let k = getKey x in case acc of
442+ Nothing {} -> Just {value: k}
443+ Just {value: v} -> if k < v then Just {value: k} else acc) Nothing {} items in
444+ case oldest of
445+ Nothing {} -> items
446+ Just {value: oldestKey} ->
447+ (fold (\acc x ->
448+ if not acc.removed && getKey x == oldestKey
449+ then {removed: True {}, items: acc.items}
450+ else {removed: acc.removed, items: union acc.items [x]}) {removed: False {}, items: []} items).items
447451
448452capPerKey = \items matchKey maxPerKey getExpiry t ->
449453 let activeCount = count (do x <- items; where matchKey x; where getExpiry x > t; yield x) in
@@ -655,9 +659,8 @@ pruneAndRetry = \t -> do
655659 forwards <- *forwards
656660 ackedIds <- *ackedIds
657661 let pendingAcks = do a <- ackedIds; where isFederatedOrigin a.originServer; yield a
658− yield {pr: pr, pendingForwards: forwards, pendingAcks: pendingAcks}
659− let pr = result.pr
660− broadcastOfflineGossip t pr.peerServers pr.expiredLocal
662+ yield {expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, pendingForwards: forwards, pendingAcks: pendingAcks}
663+ broadcastOfflineGossip t result.peerServers result.expiredLocal
661664 when (federationEnabled && count result.pendingForwards > 0)
662665 (retryPendingForwards result.pendingForwards)
663666 when (federationEnabled && count result.pendingAcks > 0) (do
@@ -1054,12 +1057,15 @@ serve = \req -> case req of
10541057 t <- now
10551058 let authorized = verifyFederationAuth authorization
10561059 let validOrigin = isFederatedOrigin originServer
1057− let clampedTs = clampTimestamp timestamp t
1058− result <- atomic do
1059− pr <- maybePrune t
1060− if not (authorized && validOrigin)
1061− then yield {pr: pr, ok: False {}}
1062− else do
1060+ if not (authorized && validOrigin)
1061+ then do
1062+ pruneResult <- atomic do maybePrune t
1063+ forkBroadcastOffline t pruneResult
1064+ yield (respond {ok: False {}})
1065+ else do
1066+ let clampedTs = clampTimestamp timestamp t
1067+ result <- atomic do
1068+ pr <- maybePrune t
10631069 messages <- *messages
10641070 ackedIds <- *ackedIds
10651071 if any messages (\m -> m.messageId == messageId && m.toKey == toKey)
@@ -1075,8 +1081,8 @@ serve = \req -> case req of
10751081 [{messageId: messageId, toKey: toKey, fromKey: fromKey,
10761082 encryptedBlob: encryptedBlob, timestamp: clampedTs, originServer: originServer, receivedAt: seqTs}]
10771083 yield {pr: pr, ok: True {}}
1078− forkBroadcastOffline t result.pr
1079− yield (respond {ok: result.ok})
1084+ forkBroadcastOffline t result.pr
1085+ yield (respond {ok: result.ok})
10801086
10811087 FederationAck {messageIds, originServer, fromServer, authorization, respond} -> do
10821088 let fromServer = normalizeServerName fromServer
@@ -1087,16 +1093,12 @@ serve = \req -> case req of
10871093 let validAck = authorized && originServer == serverHostN && not (fromServer == serverHostN)
10881094 pruneResult <- atomic do
10891095 pr <- maybePrune t
1090− forwards <- *forwards
1091− let forwardsToRemove = do
1092− f <- forwards
1093− mid <- dedupedIds
1094− where f.messageId == mid
1095− where f.toServer == fromServer
1096− yield f
1097− set *forwards = if validAck
1098− then diff forwards forwardsToRemove
1099− else forwards
1096+ when validAck (do
1097+ forwards <- *forwards
1098+ set *forwards = do
1099+ f <- forwards
1100+ where not (f.toServer == fromServer && any dedupedIds (\mid -> f.messageId == mid))
1101+ yield f)
11001102 yield pr
11011103 forkBroadcastOffline t pruneResult
11021104 yield (respond {ok: validAck})