@@ -488,6 +488,17 @@ countMessagesFor = \messages toKey t ->
488488 where m.receivedAt >= t - messageMaxAge
489489 yield m)
490490
491+&pendingAcks = do
492+ ackedIds <- *ackedIds
493+ yield (do a <- ackedIds; where isFederatedOrigin a.originServer; yield a)
494+
495+&knownMessageKeys = do
496+ messages <- *messages
497+ ackedIds <- *ackedIds
498+ yield (union
499+ (do m <- messages; yield {messageId: m.messageId, toKey: m.toKey})
500+ (do a <- ackedIds; yield {messageId: a.messageId, toKey: a.toKey}))
501+
491502validGossipEvents : [GossipEvent] -> Bool -> Timestamp -> GossipEventType -> [{pubkey: PubkeyHex, server: Text, expiresAt: Timestamp, timestamp: Timestamp, ttl: Int<S>}]
492503validGossipEvents = \events validRequest t eventType ->
493504 do
@@ -668,11 +679,7 @@ pruneAndRetry = \t -> do
668679 let pendingForwards = do
669680 f <- forwards
670681 yield {toServer: f.toServer, toKey: f.toKey, fromKey: f.fromKey, encryptedBlob: f.encryptedBlob, timestamp: f.timestamp, messageId: f.messageId}
671− ackedIds <- *ackedIds
672− let pendingAcks = do
673− a <- ackedIds
674− where isFederatedOrigin a.originServer
675− yield a
682+ pendingAcks <- &pendingAcks
676683 yield {expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, pendingForwards: pendingForwards, pendingAcks: pendingAcks}
677684 broadcastOfflineGossip t result.peerServers result.expiredLocal
678685 if federationEnabled && count result.pendingForwards > 0
@@ -1134,12 +1141,9 @@ serve = \req -> case req of
11341141 let seqTs = nextSeqTs t seqCounter
11351142 let recipientMsgCount = if not (authorized && validOrigin) then 0
11361143 else countMessagesFor messages toKey t
1137− let existsInMessages = if not (authorized && validOrigin) then False {}
1138− else any messages (\m -> m.messageId == messageId && m.toKey == toKey)
1139− ackedIds <- *ackedIds
1140− let existsInAcked = if not (authorized && validOrigin) then False {}
1141− else any ackedIds (\a -> a.messageId == messageId && a.toKey == toKey)
1142− let exists = existsInMessages || existsInAcked
1144+ knownKeys <- &knownMessageKeys
1145+ let exists = if not (authorized && validOrigin) then False {}
1146+ else any knownKeys (\k -> k.messageId == messageId && k.toKey == toKey)
11431147 let shouldInsert = authorized && validOrigin && not exists && recipientMsgCount < maxMessagesPerRecipient
11441148 set *seqCounter = if shouldInsert then seqTs else seqCounter
11451149 set *messages = if shouldInsert