@@ -329,9 +329,11 @@ verifyMaintenanceAuth = \authorization ->
329329 let token = extractToken authorization
330330 let fedResult = safeCompare token (if federationSecret == "" then "x" else federationSecret)
331331 let maintResult = safeCompare token (if maintenanceSecret == "" then "x" else maintenanceSecret)
332− let fedOk = not (federationSecret == "") && fedResult
333− let maintOk = not (maintenanceSecret == "") && maintResult
334− fedOk || maintOk
332+ let fedN = if fedResult then 1 else 0
333+ let maintN = if maintResult then 1 else 0
334+ let fedSecretSet = if federationSecret == "" then 0 else 1
335+ let maintSecretSet = if maintenanceSecret == "" then 0 else 1
336+ fedN * fedSecretSet + maintN * maintSecretSet > 0
335337
336338clampTtl = \ttl -> if ttl < 1 then 1 else if ttl > maxPresenceTtl then maxPresenceTtl else ttl
337339
@@ -354,8 +356,8 @@ evictOldestAckedIds = \items n ->
354356 in diff items toEvict
355357
356358safeCompareLoop = \s1 s2 n result ->
357− if n <= 0
358− then result + (if s1 == "" then 0 else 1) + (if s2 == "" then 0 else 1)
359+ if n <= 0 && s1 == "" && s2 == ""
360+ then result
359361 else safeCompareLoop (drop 1 s1) (drop 1 s2) (n - 1) (result + (if take 1 s1 == take 1 s2 then 0 else 1))
360362
361363safeCompare = \a b ->
@@ -795,13 +797,17 @@ serve = \req -> case req of
795797 ackedIds <- *ackedIds
796798 let combinedAckedIds = union ackedIds ackedFederated
797799 let excessCount = count combinedAckedIds - maxAckedIds
798− set *ackedIds = if excessCount <= 0
800+ let afterEviction = if excessCount <= 0
799801 then combinedAckedIds
800802 else evictOldestAckedIds combinedAckedIds excessCount
803+ let evictedEntries = if excessCount <= 0
804+ then []
805+ else diff combinedAckedIds afterEviction
806+ set *ackedIds = afterEviction
801807 let ok = case session of
802808 Nothing {} -> False {}
803809 _ -> True {}
804− yield {ok: ok, ackedMessages: ackedMessages, expiredLocal: pr.expiredLocal, peerServers: pr.peerServers}
810+ yield {ok: ok, ackedMessages: ackedMessages, expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, evictedEntries: evictedEntries}
805811 let fedMessages = do
806812 m <- result.ackedMessages
807813 where not (m.originServer == "")
@@ -818,6 +824,17 @@ serve = \req -> case req of
818824 yield {messageId: m.messageId, toKey: m.toKey, ackedAt: t, originServer: m.originServer}
819825 sendAcksAndClean pendingAcks originServers
820826 else yield {}
827+ if count result.evictedEntries > 0 && not (federationSecret == "")
828+ then do
829+ let evictedOriginServers = fold (\acc a ->
830+ if count (do s <- acc; where s == a.originServer; yield s) > 0 then acc
831+ else union acc [a.originServer]) [] result.evictedEntries
832+ sendToEach evictedOriginServers (\server ->
833+ fetch (federationScheme ++ server) (FederationAck {
834+ authorization: "Bearer " ++ federationSecret,
835+ messageIds: (do a <- result.evictedEntries; where a.originServer == server; yield a.messageId),
836+ originServer: server, fromServer: serverHostN}))
837+ else yield {}
821838 broadcastOfflineGossip t result.peerServers result.expiredLocal
822839
823840 LookupPresence {pubkey, authorization, respond} -> do
@@ -1121,7 +1138,6 @@ serve = \req -> case req of
11211138 m <- messages
11221139 where m.messageId == messageId
11231140 where m.toKey == toKey
1124− where m.receivedAt >= t - messageMaxAge
11251141 yield m) > 0
11261142 ackedIds <- *ackedIds
11271143 let existsInAcked = count (do