on master help sign in
Simplify server.knot: extract helpers (min, pubkeyServer, resolveByTimestamp), use diff in capPerKey, apply De Morgan simplifications
commitb94da823dcc523bc6eac660f6e499d66ebd63dc8 authoriko <mail@iko.soy> dateFri 10 Apr 2026, 21:45 (6 months ago) parentb4f9f43
1 file changed+18−19
server.knot+18−19
server.knot+18−19
@@ -183,6 +183,7 @@ whenOk = \result action -> case result of
183183 Ok _ -> action
184184 Err _ -> yield {}
185185clamp = \lo hi x -> if x < lo then lo else if x > hi then hi else x
186+min = \a b -> if a < b then a else b
186187headOf = \items -> fold (\acc x -> case acc of
187188 Nothing {} -> Just {value: x}
188189 _ -> acc) Nothing {} items
@@ -444,7 +445,7 @@ capPerKey = \items matchKey maxPerKey getExpiry t ->
444445 let active = do x <- items; where getExpiry x > t; yield x in
445446 let forKey = do x <- active; where matchKey x; yield x in
446447 if count forKey >= maxPerKey
447− then let others = do x <- active; where not (matchKey x); yield x in
448+ then let others = diff active forKey in
448449 union others (evictOneOldest forKey getExpiry)
449450 else active
450451
@@ -464,6 +465,7 @@ collectPeerServers = \items getServer ->
464465 else union acc [s]) [] items
465466
466467samePubkeyServer = \a b -> a.pubkey == b.pubkey && a.server == b.server
468+pubkeyServer = \e -> {pubkey: e.pubkey, server: e.server}
467469
468470mergeByKey = \sameKey getFreshness initial items ->
469471 fold (\acc e ->
@@ -475,11 +477,14 @@ mergeByKey = \sameKey getFreshness initial items ->
475477
476478mergeByPubkeyServer = mergeByKey samePubkeyServer (\x -> x.expiresAt)
477479
480+resolveByTimestamp = \setA setB ->
481+ do e <- setA; where none setB (\o -> samePubkeyServer o e && o.timestamp > e.timestamp); yield e
482+
478483removeOffline = \presenceSet trustedOffline t ->
479484 diff presenceSet (do
480485 p <- presenceSet
481486 o <- trustedOffline
482− where samePubkeyServer p o && (if o.timestamp > t then t else o.timestamp) > p.timestamp
487+ where samePubkeyServer p o && min o.timestamp t > p.timestamp
483488 yield p)
484489
485490capGossipPresence = \afterOffline appliedOnline trustedDeduped presence trustedOffline t ->
@@ -494,8 +499,8 @@ capGossipPresence = \afterOffline appliedOnline trustedDeduped presence trustedO
494499 let reclaimedEntries = takeN newEntries reclaimSlots in
495500 {finalPresence: union updatesOnlyAfterOffline reclaimedEntries,
496501 appliedOnline: union
497− (do e <- updatesOnly; where none presence (\p -> samePubkeyServer p e && p.expiresAt >= e.expiresAt); yield {pubkey: e.pubkey, server: e.server})
498− (do e <- reclaimedEntries; yield {pubkey: e.pubkey, server: e.server}),
502+ (do e <- updatesOnly; where none presence (\p -> samePubkeyServer p e && p.expiresAt >= e.expiresAt); yield (pubkeyServer e))
503+ (do e <- reclaimedEntries; yield (pubkeyServer e)),
499504 withinCapacity: False {}}
500505
501506countMessagesFor = \messages toKey t ->
@@ -605,7 +610,7 @@ removeForward = \mid srv -> atomic do
605610 forwards <- *forwards
606611 set *forwards = do
607612 x <- forwards
608− where not (x.messageId == mid && x.toServer == srv)
613+ where x.messageId != mid || x.toServer != srv
609614 yield x
610615
611616retryForwardsForServer : [ForwardEntry] -> Int -> IO {network} {}
@@ -762,13 +767,13 @@ serve = \req -> case req of
762767 else do
763768 set *challenges = do
764769 c <- challenges
765− where not (c.pubkey == pubkey && c.challenge == challenge)
770+ where c.pubkey != pubkey || c.challenge != challenge
766771 yield c
767772 let capped = capPerKeyAndGlobal sessions (\s -> s.pubkey == pubkey) maxSessionsPerKey (\s -> s.expiresAt) t maxSessions
768773 set *sessions = union capped [{token: token, pubkey: pubkey, expiresAt: expiry}]
769774 let presenceWithout = do
770775 p <- presence
771− where not (p.pubkey == pubkey && p.server == serverHostN)
776+ where p.pubkey != pubkey || p.server != serverHostN
772777 yield p
773778 let presenceEvicted = capGlobal presenceWithout maxPresenceEntries (\p -> p.expiresAt)
774779 let updatedPresence = union presenceEvicted [{pubkey: pubkey, server: serverHostN, expiresAt: expiry, timestamp: t}]
@@ -901,8 +906,8 @@ serve = \req -> case req of
901906 where p.pubkey == pubkey && p.expiresAt > t
902907 yield p
903908 let localOnline = any valid (\p -> p.server == serverHostN)
904− let foundServer = if localOnline then serverHostN
905− else (fold (\acc p -> if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt} else acc) {server: "", best: 0} valid).server
909+ let bestServer = (fold (\acc p -> if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt} else acc) {server: "", best: 0} valid).server
910+ let foundServer = if localOnline then serverHostN else bestServer
906911 yield {pr: pr, authorized: True {}, foundServer: foundServer}
907912 forkBroadcastOffline t result.pr
908913 yield (respond {online: result.foundServer != "", server: result.foundServer, authorized: result.authorized})
@@ -919,14 +924,8 @@ serve = \req -> case req of
919924 let allValidEntries = validGossipEvents events t
920925 let onlineEntries = do e <- allValidEntries; where isGossipOnline e.eventType; yield e
921926 let trustedOffline = do e <- allValidEntries; where isGossipOffline e.eventType && e.server == fromServer; yield e
922− let filteredOnline = do
923− e <- onlineEntries
924− where none trustedOffline (\o -> samePubkeyServer o e && o.timestamp > e.timestamp)
925− yield e
926− let filteredOffline = do
927− e <- trustedOffline
928− where none onlineEntries (\o -> samePubkeyServer o e && o.timestamp > e.timestamp)
929− yield e
927+ let filteredOnline = resolveByTimestamp onlineEntries trustedOffline
928+ let filteredOffline = resolveByTimestamp trustedOffline onlineEntries
930929 let deduped = mergeByPubkeyServer [] filteredOnline
931930 gossipResult <- atomic do
932931 pr <- maybePrune t
@@ -938,10 +937,10 @@ serve = \req -> case req of
938937 let appliedOnline = do
939938 e <- trustedDeduped
940939 where none presence (\p -> samePubkeyServer p e && p.expiresAt >= e.expiresAt)
941− yield {pubkey: e.pubkey, server: e.server}
940+ yield (pubkeyServer e)
942941 let merged = mergeByPubkeyServer presence trustedDeduped
943942 let afterOffline = removeOffline merged trustedOffline t
944− let appliedOffline = do p <- diff merged afterOffline; yield {pubkey: p.pubkey, server: p.server}
943+ let appliedOffline = do p <- diff merged afterOffline; yield (pubkeyServer p)
945944 let capResult = capGossipPresence afterOffline appliedOnline trustedDeduped presence trustedOffline t
946945 set *presence = capResult.finalPresence
947946 let gossipPeerServers = collectPeerServers capResult.finalPresence (\p -> p.server)