on master help sign in
Simplify server.knot: dedupe helpers, bind subexpressions, flatten conditionals
commitbccd2aecc060dffd174dc23c7d9d6e0c3a826a65 authoriko <mail@iko.soy> dateMon 27 Apr 2026, 18:52 (5 months ago) parentd6ba1ab
1 file changed+17−14
server.knot+17−14
server.knot+17−14
@@ -449,7 +449,7 @@ countWhere = \xs pred -> count (filter xs pred)
449449any : [a] -> (a -> Bool) -> Bool
450450any = \xs pred -> countWhere xs pred > 0
451451none : [a] -> (a -> Bool) -> Bool
452−none = \xs pred -> countWhere xs pred == 0
452+none = \xs pred -> not (any xs pred)
453453all : [a] -> (a -> Bool) -> Bool
454454all = \xs pred -> countWhere xs pred == count xs
455455elem = \xs x -> any xs (\y -> y == x)
@@ -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 count cs > 0 && mod (count cs) 2 == 0 && all cs (\c -> contains c "0123456789abcdef")
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")
566566
567567normalizeHex : Text -> Text
568568normalizeHex = \s -> bytesToHex (bytesFromHex s)
@@ -621,9 +621,10 @@ withMaintAuth = \authorization onUnauth onAuth -> do
621621gateAuth = \checkDrain auth ip t respond mkErr onAuth -> do
622622 dp <- *drainPhase
623623 g <- checkGlobalRate t
624− if checkDrain && dp >= 2 then yield (respond (mkErr "draining"))
625− else if g then yield (respond (mkErr "rate_limited"))
626− else withSessionAuth auth t ip (yield (respond (mkErr "unauthorized"))) onAuth
624+ let err = \e -> yield (respond (mkErr e))
625+ if checkDrain && dp >= 2 then err "draining"
626+ else if g then err "rate_limited"
627+ else withSessionAuth auth t ip (err "unauthorized") onAuth
627628
628629-- gateAuth + per-key rate gate. `rateResp` is the response value when the per-key gate trips.
629630gateRated = \checkDrain auth ip rateRef maxRate windowMs t respond mkErr rateResp onAuth ->
@@ -673,9 +674,7 @@ verifyFederationAuth = \authorization fromServer scope requestTimestamp -> do
673674 else {sig: acc.sig ++ c, nonce: "", split: False {}}) {sig: "", nonce: "", split: False {}} (chars payload)
674675 result <- fetch (federationUrl fromServer) (FederationPubkey {})
675676 case result of
676− Ok r ->
677− if not r.ok || r.pubkey == "" then yield False
678− else yield (verify (bytesFromHex r.pubkey) (textToBytes (scope ++ "|" ++ show requestTimestamp ++ "|" ++ fromServer ++ (if parts.nonce == "" then "" else "|" ++ parts.nonce))) (bytesFromHex parts.sig))
677+ Ok r -> yield (r.ok && r.pubkey != "" && verify (bytesFromHex r.pubkey) (textToBytes (scope ++ "|" ++ show requestTimestamp ++ "|" ++ fromServer ++ (if parts.nonce == "" then "" else "|" ++ parts.nonce))) (bytesFromHex parts.sig))
679678 _ -> yield False
680679 else case extractToken authorization of
681680 Just {value: token} -> do
@@ -987,12 +986,14 @@ refreshLocalPresence = \t -> do
987986 refreshState <- atomic do
988987 sessions <- *sessions
989988 presence <- *presence
989+ let newExpiry = t + sessionExpiry
990+ let sessionKeys = unique (pluck sessions (\s -> s.pubkey))
990991 let updated = pluck presence (\p ->
991− if isLocalServer p.server && elem (unique (pluck sessions (\s -> s.pubkey))) p.pubkey && p.expiresAt - t < sessionExpiry / 2
992− then {pubkey: p.pubkey, server: p.server, expiresAt: t + sessionExpiry, timestamp: t}
992+ if isLocalServer p.server && elem sessionKeys p.pubkey && p.expiresAt - t < sessionExpiry / 2
993+ then {pubkey: p.pubkey, server: p.server, expiresAt: newExpiry, timestamp: t}
993994 else p)
994995 set *presence = updated
995− yield {refreshed: filter updated (\p -> isLocalServer p.server && p.expiresAt == t + sessionExpiry), peers: knownPeerServersFromPresence updated}
996+ yield {refreshed: filter updated (\p -> isLocalServer p.server && p.expiresAt == newExpiry), peers: knownPeerServersFromPresence updated}
996997 when (count refreshState.refreshed > 0)
997998 (fork (sendBatchedGossip refreshState.peers (pluck refreshState.refreshed (\p -> mkGossip (GossipOnline {}) p.pubkey t (clampTtl (sessionExpiry / 1000)))) gossipOriginHops))
998999
@@ -1063,11 +1064,12 @@ handleRevoke = \targetToken authorization clientIp respond -> do
10631064
10641065handleLogout = \authorization clientIp respond -> do
10651066 t <- now
1067+ let myToken = extractToken authorization
10661068 removed <- atomic (withSessionAuth authorization t clientIp
10671069 (yield {ok: False {}, pubkey: "", peers: []})
10681070 (\pubkey -> do
10691071 ses <- *sessions
1070− set *sessions = removeWhere ses (\s -> Just {value: s.token} == extractToken authorization)
1072+ set *sessions = removeWhere ses (\s -> Just {value: s.token} == myToken)
10711073 after <- *sessions
10721074 peers <- if any after (\s -> s.pubkey == pubkey) then yield []
10731075 else do
@@ -1089,8 +1091,9 @@ handlePoll = \cursor generation watchKeys authorization clientIp respond -> do
10891091 dp <- *drainPhase
10901092 g <- checkGlobalRate t
10911093 let cursorWasReset = generation != serverGen && cursor > 0
1092− if dp >= 2 then yield (respond (emptyPollResp 0 (True {}) (False {}) (True {}) serverGen 0 cursorWasReset))
1093− else if g then yield (respond (emptyPollResp 0 (False {}) (True {}) (False {}) serverGen globalRateWindowMs cursorWasReset))
1094+ let er = \auth rate drain retry -> yield (respond (emptyPollResp 0 auth rate drain serverGen retry cursorWasReset))
1095+ if dp >= 2 then er (True {}) (False {}) (True {}) 0
1096+ else if g then er (False {}) (True {}) (False {}) globalRateWindowMs
10941097 else pollOnce authorization (if cursorWasReset then 0 else cursor) cursorWasReset (takeRelation maxWatchKeys watchKeys) clientIp serverGen respond t
10951098
10961099pollOnce = \authorization cursor cursorWasReset watchKeys clientIp serverGen respond t -> do