on master help sign in
Simplify server.knot: refactor GossipEventType parsing, compute touched pubkeys once, inline recordFailure predicate
commitd9f295ad2e1db77f22d3599f6235e29920d91410 authoriko <mail@iko.soy> dateSun 10 May 2026, 16:56 (5 months ago) parented8ba48
1 file changed+13−10
server.knot+13−10
server.knot+13−10
@@ -156,7 +156,11 @@ impl ToJSON GossipEventType where
156156 GossipUnknown {} -> toJson {eventType: "unknown"}
157157
158158impl FromJSON GossipEventType where
159− parseJson t = (\raw -> if raw.eventType == "online" then GossipOnline {raw.pubkey} else if raw.eventType == "offline" then GossipOffline {raw.pubkey} else GossipUnknown {}) (parseJson t : {eventType: Text, pubkey: PubkeyHex})
159+ parseJson t =
160+ let raw = parseJson t : {eventType: Text, pubkey: PubkeyHex}
161+ if raw.eventType == "online" then GossipOnline {raw.pubkey}
162+ else if raw.eventType == "offline" then GossipOffline {raw.pubkey}
163+ else GossipUnknown {}
160164
161165-- /messages is all-or-nothing per call: either every message in the batch is
162166-- enqueued (delivered, federated, or buffered for federation), or none are
@@ -329,7 +333,7 @@ tooLong = \s maxLen -> count (chars s) > maxLen
329333
330334-- True when `s` is non-empty, even-length, and only lowercase hex digits.
331335isValidHex : Text -> Bool
332−isValidHex = \s ->
336+isValidHex = \s -> do
333337 let cs = chars s
334338 let n = count cs
335339 n > 0 && n / 2 * 2 == n && all (\c -> contains c "0123456789abcdef") cs
@@ -440,11 +444,10 @@ recordFailure = \server -> do
440444 t <- now
441445 atomic (do
442446 failures <- *forwardFailures
443− let same = \f -> f.server == server
444− let new = case findFirst failures same of
447+ let new = case findFirst failures (\f -> f.server == server) of
445448 Just {value: f} -> {server, failedAt: t, failures: f.failures + 1, f.firstFailedAt}
446449 _ -> {server, failedAt: t, failures: 1, firstFailedAt: t}
447− *forwardFailures = union (filter (\f -> not same f) failures) [new])
450+ *forwardFailures = union (filter (\f -> f.server != server) failures) [new])
448451
449452-- Drop the failure record for `server` (called after any successful peer call).
450453-- Single-success recovery — there is no half-open state.
@@ -838,14 +841,14 @@ handleRecvGossip = \events fromServer -> do
838841 else do
839842 newlyOnline <- atomic (do
840843 pres <- *presence
841− let touched = \pk -> any (\e -> case e of
842− GossipOnline {pubkey} -> pubkey == pk
843− GossipOffline {pubkey} -> pubkey == pk
844− _ -> False {}) events
844+ let touchedPubkeys = fold (\acc e -> case e of
845+ GossipOnline {pubkey} -> union acc [pubkey]
846+ GossipOffline {pubkey} -> union acc [pubkey]
847+ _ -> acc) [] events
845848 let added = fold (\acc e -> case e of
846849 GossipOnline {pubkey} -> union acc [{pubkey, server: fromServer, expiresAt: t + onlineGossipTtl}]
847850 _ -> acc) [] events
848− let kept = filter (\p -> p.server != fromServer || not touched p.pubkey) pres
851+ let kept = filter (\p -> p.server != fromServer || not elem p.pubkey touchedPubkeys) pres
849852 *presence = union kept added
850853 yield (filter (\pk -> not any (\p -> p.pubkey == pk && p.server == fromServer && p.expiresAt > t) pres) (map (\p -> p.pubkey) added)))
851854 fork (forEach newlyOnline (\pk -> forwardQueuedToServer pk fromServer))