@@ -226,7 +226,9 @@ type Session = {token: Text, pubkey: PubkeyHex, expiresAt: Timestamp, ip: Text}
226-- `encryptedBlob` (the server cannot read it). `deliveredTo` records peers
226-- `encryptedBlob` (the server cannot read it). `deliveredTo` records peers
227-- that have already accepted a federated forward of this blob, so a later
227-- that have already accepted a federated forward of this blob, so a later
228-- presence re-announce of `toKey` doesn't trigger a duplicate delivery.
228-- presence re-announce of `toKey` doesn't trigger a duplicate delivery.
229+-- (Single-field record rows, not bare names: the Knot runtime cannot persist
230+-- a nested relation of scalars.)
229−type Message = {toKey: PubkeyHex, encryptedBlob: BlobHex, receivedAt: Timestamp, deliveredTo: [ServerName]}
231+type Message = {toKey: PubkeyHex, encryptedBlob: BlobHex, receivedAt: Timestamp, deliveredTo: [{server: ServerName}]}
230-- Last-known location of a pubkey, either local (`server == serverHost`) or
232-- Last-known location of a pubkey, either local (`server == serverHost`) or
231-- learned from a peer via gossip. Multiple entries per pubkey are allowed.
233-- learned from a peer via gossip. Multiple entries per pubkey are allowed.
232type PresenceEntry = {pubkey: PubkeyHex, server: ServerName, expiresAt: Timestamp}
234type PresenceEntry = {pubkey: PubkeyHex, server: ServerName, expiresAt: Timestamp}
@@ -657,8 +659,8 @@ retryPendingForwards = do
657 else x) (filter (\x -> not isDone x) cur)
659 else x) (filter (\x -> not isDone x) cur)
658 when success (do
660 when success (do
659 msgs <- *messages
661 msgs <- *messages
660− *messages = map (\m -> if m.toKey == f.toKey && m.encryptedBlob == f.encryptedBlob && not elem server m.deliveredTo
662+ *messages = map (\m -> if m.toKey == f.toKey && m.encryptedBlob == f.encryptedBlob && not any (\d -> d.server == server) m.deliveredTo
661− then {m.toKey, m.encryptedBlob, m.receivedAt, deliveredTo: union m.deliveredTo [server]}
663+ then {m.toKey, m.encryptedBlob, m.receivedAt, deliveredTo: union m.deliveredTo [{server}]}
662 else m) msgs)))))
664 else m) msgs)))))
664-- Forward queued messages to a server when a remote key comes online.
666-- Forward queued messages to a server when a remote key comes online.
@@ -670,7 +672,7 @@ forwardQueuedToServer = \pubkey server -> atomic (do
670 fwds <- *forwards
672 fwds <- *forwards
671 let existing = count (filter (\f -> f.toServer == server) fwds)
673 let existing = count (filter (\f -> f.toServer == server) fwds)
672 let budget = max 0 (maxForwardsPerServer - existing)
674 let budget = max 0 (maxForwardsPerServer - existing)
673− let candidates = filter (\m -> m.toKey == pubkey && not any (forwardMatches m.encryptedBlob server) fwds && not elem server m.deliveredTo) msgs
675+ let candidates = filter (\m -> m.toKey == pubkey && not any (forwardMatches m.encryptedBlob server) fwds && not any (\d -> d.server == server) m.deliveredTo) msgs
674 let newFwds = map (\m -> {toServer: server, m.toKey, m.encryptedBlob, retries: 0}) (take budget (sortBy (\m -> m.receivedAt) candidates))
676 let newFwds = map (\m -> {toServer: server, m.toKey, m.encryptedBlob, retries: 0}) (take budget (sortBy (\m -> m.receivedAt) candidates))
675 *forwards = union fwds newFwds)
677 *forwards = union fwds newFwds)
@@ -897,8 +899,8 @@ forkForwardsTo = \to encryptedBlob servers -> forEach servers (\server -> when (
897 fwds <- *forwards
899 fwds <- *forwards
898 *forwards = filter (\x -> not same x) fwds
900 *forwards = filter (\x -> not same x) fwds
899 msgs <- *messages
901 msgs <- *messages
900− *messages = map (\m -> if m.toKey == to && m.encryptedBlob == encryptedBlob && not elem server m.deliveredTo
902+ *messages = map (\m -> if m.toKey == to && m.encryptedBlob == encryptedBlob && not any (\d -> d.server == server) m.deliveredTo
901− then {m.toKey, m.encryptedBlob, m.receivedAt, deliveredTo: union m.deliveredTo [server]}
903+ then {m.toKey, m.encryptedBlob, m.receivedAt, deliveredTo: union m.deliveredTo [{server}]}
902 else m) msgs)))
904 else m) msgs)))
904-- ============================================
906-- ============================================