@@ -562,7 +562,7 @@ tooLong : Text -> Int -> Bool
562562tooLong = \s maxLen -> count (chars s) > maxLen
563563
564564isValidHex : Text -> Bool
565−isValidHex = \s -> let cs = chars s in let n = count cs in n > 0 && mod n 2 == 0 && all cs (\c -> contains c "0123456789abcdef")
565+isValidHex = \s -> count (chars s) > 0 && mod (count (chars s)) 2 == 0 && all (chars s) (\c -> contains c "0123456789abcdef")
566566
567567normalizeHex : Text -> Text
568568normalizeHex = \s -> bytesToHex (bytesFromHex s)
@@ -602,9 +602,8 @@ isBadServerName = \sn ->
602602matchIp = \clientIp sessionIp -> sessionIp == "" || clientIp == sessionIp
603603
604604extractToken = \authHeader ->
605− let token = drop 7 authHeader in
606− if hasPrefix "Bearer " authHeader && token != "" && not (tooLong token maxTokenLen)
607− then Just {value: token}
605+ if hasPrefix "Bearer " authHeader && drop 7 authHeader != "" && not (tooLong (drop 7 authHeader) maxTokenLen)
606+ then Just {value: drop 7 authHeader}
608607 else Nothing {}
609608
610609verifyMaintenanceAuth : Text -> IO Bool
@@ -771,11 +770,10 @@ recordFailure = \server -> do
771770 t <- now
772771 atomic do
773772 failures <- *forwardFailures
774− let same = \f -> f.server == server
775− let prev = case findFirst failures same of
773+ let prev = case findFirst failures (\f -> f.server == server) of
776774 Just {value: f} -> {count: f.failures, firstFailedAt: f.firstFailedAt}
777775 _ -> {count: 0, firstFailedAt: t}
778− set *forwardFailures = union (removeWhere failures same)
776+ set *forwardFailures = union (removeWhere failures (\f -> f.server == server))
779777 [{server: server, failedAt: t, failures: min (prev.count + 1) 10, firstFailedAt: prev.firstFailedAt}]
780778
781779clearFailure = \server -> atomic (pruneRef forwardFailures (\f -> f.server != server))
@@ -804,9 +802,8 @@ presenceForKey = \presence pubkey t ->
804802
805803-- Resolve a key's server for client lookup, masking remote identities behind "remote".
806804maskedServer = \pres pubkey t ->
807− let entries = presenceForKey pres pubkey t in
808− if any entries (\p -> isLocalServer p.server) then serverHostN
809− else if count entries > 0 then "remote"
805+ if any (presenceForKey pres pubkey t) (\p -> isLocalServer p.server) then serverHostN
806+ else if count (presenceForKey pres pubkey t) > 0 then "remote"
810807 else ""
811808
812809hasMessage : MessageIdHex -> PubkeyHex -> [{messageId: MessageIdHex, toKey: PubkeyHex | a}] -> Bool
@@ -825,9 +822,8 @@ knownPeerServersFromPresence = \presence -> collectPeers presence (\p -> p.serve
825822-- Last-write-wins merge by (pubkey, server), keeping the entry with the larger expiresAt.
826823mergePresence = \existing incoming ->
827824 fold (\acc e ->
828− let same = \x -> x.pubkey == e.pubkey && x.server == e.server in
829− if any acc (\x -> same x && x.expiresAt >= e.expiresAt) then acc
830− else union (removeWhere acc same) [e]) existing incoming
825+ if any acc (\x -> x.pubkey == e.pubkey && x.server == e.server && x.expiresAt >= e.expiresAt) then acc
826+ else union (removeWhere acc (\x -> x.pubkey == e.pubkey && x.server == e.server)) [e]) existing incoming
831827
832828-- ============================================
833829-- Pruning
@@ -1282,10 +1278,8 @@ handleAckMessages = \messageIds authorization clientIp respond -> do
12821278 let mkErr = \e -> {ok: False {}, authorized: False {}, ackedCount: 0, error: e}
12831279 gateClientWrite authorization clientIp t respond mkErr
12841280 {ok: False {}, authorized: True {}, ackedCount: 0, error: "rate_limited"} (\pubkey -> do
1285− let dedupedIds = dedupMessageIds messageIds
1286− let matches = \x -> x.toKey == pubkey && elem dedupedIds x.messageId
12871281 result <- atomic do
1288− toAck <- removeForKey matches
1282+ toAck <- removeForKey (\x -> x.toKey == pubkey && elem (dedupMessageIds messageIds) x.messageId)
12891283 ackedFed <- recordAcksAndDeliveries toAck t
12901284 yield {ackedCount: count toAck, pendingAcks: ackedFed}
12911285 when federationEnabled (fork (sendAcksAndClean result.pendingAcks))
@@ -1307,10 +1301,8 @@ handleDeleteMessages = \messageIds authorization clientIp respond -> do
13071301 let mkErr = \e -> {ok: False {}, authorized: False {}, deletedCount: 0, error: if e == "draining" then "" else e}
13081302 gateClientWrite authorization clientIp t respond mkErr
13091303 {ok: False {}, authorized: True {}, deletedCount: 0, error: "rate_limited"} (\pubkey -> do
1310− let dedupedIds = dedupMessageIds messageIds
1311− let matches = \x -> x.toKey == pubkey && elem dedupedIds x.messageId
13121304 result <- atomic do
1313− toDel <- removeForKey matches
1305+ toDel <- removeForKey (\x -> x.toKey == pubkey && elem (dedupMessageIds messageIds) x.messageId)
13141306 let ackedFed = mapWhere toDel (\m -> m.originServer != "") (\m -> mkAckedEntry m t)
13151307 appendCapped ackedIds ackedFed maxAckedIds (\a -> a.ackedAt)
13161308 yield {deletedCount: count toDel, pendingAcks: ackedFed}