on master help sign in
Drop boolean indirection in handleVerifyAuth; storeFederated returns Result
commitbaee0aecd69bc1f44a3250d853dd7061d8057d49 authoriko <mail@iko.soy> dateSun 10 May 2026, 14:57 (5 months ago) parent92dfe84
1 file changed+16−23
server.knot+16−23
server.knot+16−23
@@ -439,12 +439,10 @@ recordFailure = \server -> do
439439 atomic (do
440440 failures <- *forwardFailures
441441 let same = \f -> f.server == server
442− let prev = case findFirst failures same of
443− Just {value: f} -> {failures: f.failures + 1, f.firstFailedAt}
444− _ -> {failures: 1, firstFailedAt: t}
445− *forwardFailures = union (filter (\f -> not same f) failures) [
446− {server, failedAt: t, prev.failures, prev.firstFailedAt}
447− ])
442+ let new = case findFirst failures same of
443+ Just {value: f} -> {server, failedAt: t, failures: f.failures + 1, f.firstFailedAt}
444+ _ -> {server, failedAt: t, failures: 1, firstFailedAt: t}
445+ *forwardFailures = union (filter (\f -> not same f) failures) [new])
448446
449447-- Drop the failure record for `server` (called after any successful peer call).
450448-- Single-success recovery — there is no half-open state.
@@ -630,7 +628,7 @@ handleVerifyAuth = \pubkey challenge signature revokeOthers clientIp -> do
630628 _ -> False {}
631629 let valid = any (\c -> same c && c.expiresAt > t && matchIp clientIp c.ip) ch && sigValid
632630 if not valid
633− then yield {valid: False {}, peers: []}
631+ then yield (Nothing {})
634632 else do
635633 *challenges = filter (\c -> not same c) ch
636634 ses <- *sessions
@@ -643,12 +641,12 @@ handleVerifyAuth = \pubkey challenge signature revokeOthers clientIp -> do
643641 let prunedPres = filter (\p -> not (p.pubkey == pubkey && isLocalServer p.server)) pres
644642 let newPres = union prunedPres [{pubkey, server: serverHost, expiresAt: expiry}]
645643 *presence = newPres
646− yield {valid: True {}, peers: knownPeerServersFromPresence newPres})
647− if not result.valid
648− then yield (Err {error: {status: 401, message: "invalid"}})
649− else do
650− when federationEnabled (fork (sendBatchedGossip result.peers [GossipOnline {pubkey}]))
651− yield (Ok {value: {token, expiresAt: expiry}})
644+ yield (Just {value: knownPeerServersFromPresence newPres}))
645+ case result of
646+ Nothing {} -> yield (Err {error: {status: 401, message: "invalid"}})
647+ Just {value: peers} -> do
648+ when federationEnabled (fork (sendBatchedGossip peers [GossipOnline {pubkey}]))
649+ yield (Ok {value: {token, expiresAt: expiry}})
652650
653651-- ============================================
654652-- Handler: poll
@@ -853,37 +851,32 @@ handleRecvGossip = \events fromServer -> do
853851 yield (Ok {value: {}})
854852
855853-- Store a federated/forwarded message into the local mailbox. Caller wraps in `atomic`.
856−-- Returns "" on success, otherwise the error code "no_presence".
857854--
858855-- The presence gate requires the recipient to be **currently locally online**
859856-- (not just visible to gossip somewhere). Without that, an A → B forward based
860857-- on stale gossip about R could land on B with no actively-polling client and
861858-- get stuck. If B refuses, A retries via `retryPendingForwards` against the
862859-- next presence target.
863−storeFederated : PubkeyHex -> BlobHex -> Int<Ms> -> IO {rw *messages, rw *pollWakeup, r *presence, rw *seqCounter} Text
860+storeFederated : PubkeyHex -> BlobHex -> Int<Ms> -> IO {rw *messages, rw *pollWakeup, r *presence, rw *seqCounter} (Result HttpError {})
864861storeFederated = \toKey encryptedBlob t -> do
865862 pres <- *presence
866863 msgs <- *messages
867864 if not (hasLocalPresence pres toKey t)
868− then yield "no_presence"
865+ then yield (Err {error: {status: 404, message: "no_presence"}})
869866 else do
870867 seq <- *seqCounter
871868 let seqTs = nextSeqTs t seq
872869 *seqCounter = seqTs
873870 *messages = union msgs [{toKey, encryptedBlob, receivedAt: seqTs}]
874871 *pollWakeup = seqTs
875− yield ""
872+ yield (Ok {value: {}})
876873
877874-- POST /federation/forward: receive a single federated message destined for
878−-- a local key. Delegates the actual store decision to `storeFederated`,
879−-- which returns "" on success.
875+-- a local key. Delegates the store decision to `storeFederated`.
880876handleForwardMessage : PubkeyHex -> BlobHex -> IO {rw *messages, rw *pollWakeup, r *presence, rw *seqCounter, clock} (Result HttpError {})
881877handleForwardMessage = \toKey encryptedBlob -> do
882878 t <- now
883− result <- atomic storeFederated toKey encryptedBlob t
884− if result == ""
885− then yield (Ok {value: {}})
886− else yield (Err {error: {status: 404, message: result}})
879+ atomic storeFederated toKey encryptedBlob t
887880
888881-- ============================================
889882-- Dispatch