on master help sign in
Simplify code and improve type safety: make capPerKey filter expired items, extract shouldForward condition, use explicit pattern matches, merge ForwardMessage guard into atomic block
commite692eb5d42ef866622de97d2bc08d09fdb62a11b authoriko <mail@iko.soy> dateFri 10 Apr 2026, 11:50 (6 months ago) parent2f625d9
1 file changed+23−25
server.knot+23−25
server.knot+23−25
@@ -462,12 +462,13 @@ evictOneOldest = \items getKey ->
462462 else {removed: acc.removed, items: union acc.items [x]}) {removed: False {}, items: []} items).items
463463
464464capPerKey = \items matchKey maxPerKey getExpiry t ->
465− let activeCount = count (do x <- items; where matchKey x; where getExpiry x > t; yield x) in
466− if activeCount >= maxPerKey
467− then let forKey = do x <- items; where matchKey x; yield x in
468− let others = do x <- items; where not (matchKey x); yield x in
465+ let active = do x <- items; where getExpiry x > t; yield x in
466+ let activeForKeyCount = count (do x <- active; where matchKey x; yield x) in
467+ if activeForKeyCount >= maxPerKey
468+ then let forKey = do x <- active; where matchKey x; yield x in
469+ let others = do x <- active; where not (matchKey x); yield x in
469470 union others (evictOneOldest forKey getExpiry)
470− else items
471+ else active
471472
472473capGlobal = \items maxCount getKey ->
473474 if count items >= maxCount
@@ -735,8 +736,7 @@ serve = \req -> case req of
735736 pruneResult <- atomic do
736737 pr <- maybePrune t
737738 challenges <- *challenges
738− let challengesCapped = capPerKey challenges (\c -> c.pubkey == pubkey) maxChallengesPerKey (\c -> c.expiresAt) t
739− let activeChallenges = do c <- challengesCapped; where c.expiresAt > t; yield c
739+ let activeChallenges = capPerKey challenges (\c -> c.pubkey == pubkey) maxChallengesPerKey (\c -> c.expiresAt) t
740740 let globalCapped = capGlobal activeChallenges maxChallenges (\c -> c.expiresAt)
741741 set *challenges = union
742742 globalCapped
@@ -771,9 +771,8 @@ serve = \req -> case req of
771771 c <- challenges
772772 where not (c.pubkey == pubkey && c.challenge == challenge)
773773 yield c
774− let sessionsCapped = capPerKey sessions (\s -> s.pubkey == pubkey) maxSessionsPerKey (\s -> s.expiresAt) t
775− let activeSessionsCapped = do s <- sessionsCapped; where s.expiresAt > t; yield s
776− let globalSessionsCapped = capGlobal activeSessionsCapped maxSessions (\s -> s.expiresAt)
774+ let activeSessions = capPerKey sessions (\s -> s.pubkey == pubkey) maxSessionsPerKey (\s -> s.expiresAt) t
775+ let globalSessionsCapped = capGlobal activeSessions maxSessions (\s -> s.expiresAt)
777776 set *sessions = union globalSessionsCapped [{token: token, pubkey: pubkey, expiresAt: expiry}]
778777 let presenceWithout = do
779778 p <- presence
@@ -845,10 +844,11 @@ serve = \req -> case req of
845844 let remoteServers = do p <- toPresence; where not (p.server == serverHostN); yield p.server
846845 forwards <- *forwards
847846 let forwardServers = takeN remoteServers (maxForwardsEntries - count forwards)
847+ let shouldForward = federationEnabled && count forwardServers > 0
848848 let status = if localOnline then "delivered"
849− else if federationEnabled && count forwardServers > 0 then "federated"
849+ else if shouldForward then "federated"
850850 else "queued"
851− set *forwards = if federationEnabled && count forwardServers > 0
851+ set *forwards = if shouldForward
852852 then union forwards (do s <- forwardServers; yield {messageId: msgId, toServer: s, createdAt: t, toKey: to, fromKey: fromKey, encryptedBlob: encryptedBlob, timestamp: clampedTs})
853853 else forwards
854854 yield {pr: pr, send: SendDone {status: status, remoteServers: remoteServers, fromKey: fromKey}}
@@ -866,7 +866,8 @@ serve = \req -> case req of
866866 Err _ -> yield {}))
867867 when (status == "queued" && count remoteServers > 0 && federationEnabled)
868868 (println ("sendMessage: forwards at capacity (" ++ show maxForwardsEntries ++ "), skipping forward tracking"))
869− _ -> yield {}
869+ SendUnauthorized {} -> yield {}
870+ SendRejected {} -> yield {}
870871 broadcastOfflineGossip t result.pr.peerServers result.pr.expiredLocal)
871872 yield (case result.send of
872873 SendUnauthorized _ -> respond {status: "unauthorized", messageId: ""}
@@ -936,7 +937,7 @@ serve = \req -> case req of
936937 when (dropped > 0)
937938 (println ("ackMessages: ackedIds at capacity (" ++ show maxAckedIds ++ "), " ++ show dropped ++ " ack entries permanently lost for " ++ server))
938939 _ -> yield {}))
939− _ -> yield {}
940+ AckUnauthorized {} -> yield {}
940941 broadcastOfflineGossip t result.pr.peerServers result.pr.expiredLocal)
941942 yield (case result.ack of
942943 AckUnauthorized _ -> respond {ok: False {}}
@@ -1063,15 +1064,12 @@ serve = \req -> case req of
10631064 t <- now
10641065 let authorized = verifyFederationAuth authorization
10651066 let validOrigin = isFederatedOrigin originServer
1066− if not (authorized && validOrigin)
1067− then do
1068− pruneResult <- atomic do maybePrune t
1069− forkBroadcastOffline t pruneResult
1070− yield (respond {ok: False {}})
1071− else do
1072− let clampedTs = clampTimestamp timestamp t
1073− result <- atomic do
1074− pr <- maybePrune t
1067+ let clampedTs = clampTimestamp timestamp t
1068+ result <- atomic do
1069+ pr <- maybePrune t
1070+ if not (authorized && validOrigin)
1071+ then yield {pr: pr, ok: False {}}
1072+ else do
10751073 messages <- *messages
10761074 ackedIds <- *ackedIds
10771075 if any messages (\m -> m.messageId == messageId && m.toKey == toKey)
@@ -1087,8 +1085,8 @@ serve = \req -> case req of
10871085 [{messageId: messageId, toKey: toKey, fromKey: fromKey,
10881086 encryptedBlob: encryptedBlob, timestamp: clampedTs, originServer: originServer, receivedAt: seqTs}]
10891087 yield {pr: pr, ok: True {}}
1090− forkBroadcastOffline t result.pr
1091− yield (respond {ok: result.ok})
1088+ forkBroadcastOffline t result.pr
1089+ yield (respond {ok: result.ok})
10921090
10931091 FederationAck {messageIds, originServer, fromServer, authorization, respond} -> do
10941092 let fromServer = normalizeServerName fromServer