@@ -58,7 +58,7 @@ type GossipEvent = {eventType: Text, pubkey: Text, server: Text, timestamp: Int,
5858
5959*forwards : [{messageId: Text, toServer: Text, createdAt: Int, toKey: Text, fromKey: Text, encryptedBlob: Text, timestamp: Int}]
6060
61−*ackedIds : [{messageId: Text, toKey: Text, ackedAt: Int}]
61+*ackedIds : [{messageId: Text, toKey: Text, ackedAt: Int, originServer: Text}]
6262
6363*lastPrunedAt : Int
6464
@@ -635,7 +635,8 @@ serve = \req -> case req of
635635 else if seqCounter > clampedCursor then seqCounter else clampedCursor
636636 yield {events: evts, cursor: newCursor, authorized: authorized, expiredLocal: pr.expiredLocal, peerServers: pr.peerServers}
637637 respond {events: result.events, cursor: result.cursor, authorized: result.authorized}
638− broadcastOfflineGossip t result.peerServers result.expiredLocal
638+ tAfterPoll <- now
639+ broadcastOfflineGossip tAfterPoll result.peerServers result.expiredLocal
639640
640641 SendMessage {to, encryptedBlob, timestamp, authorization, respond} -> do
641642 let validInput = not (to == "") && not (encryptedBlob == "") && not (tooLong to maxPubkeyLen) && not (tooLong encryptedBlob maxBlobLen) && isValidHex to && isValidHex encryptedBlob
@@ -742,7 +743,7 @@ serve = \req -> case req of
742743 m <- ackedMessages
743744 where not (m.originServer == "")
744745 where not (m.originServer == serverHostN)
745− yield {messageId: m.messageId, toKey: m.toKey, ackedAt: t}
746+ yield {messageId: m.messageId, toKey: m.toKey, ackedAt: t, originServer: m.originServer}
746747 ackedIds <- *ackedIds
747748 let combinedAckedIds = union ackedIds ackedFederated
748749 let oldestAckedAt = if count combinedAckedIds > maxAckedIds
@@ -1133,17 +1134,35 @@ serve = \req -> case req of
11331134 if authorized
11341135 then do
11351136 result <- atomic do
1137+ set *lastPrunedAt = t
11361138 pr <- pruneExpired t
11371139 forwards <- *forwards
11381140 let pendingForwards = do
11391141 f <- forwards
11401142 yield {toServer: f.toServer, toKey: f.toKey, fromKey: f.fromKey, encryptedBlob: f.encryptedBlob, timestamp: f.timestamp, messageId: f.messageId}
1141− yield {expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, pendingForwards: pendingForwards}
1143+ ackedIds <- *ackedIds
1144+ let pendingAcks = do
1145+ a <- ackedIds
1146+ where not (a.originServer == "")
1147+ where not (a.originServer == serverHostN)
1148+ yield a
1149+ yield {expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, pendingForwards: pendingForwards, pendingAcks: pendingAcks}
11421150 respond {ok: True {}}
11431151 broadcastOfflineGossip t result.peerServers result.expiredLocal
11441152 if not (federationSecret == "") && count result.pendingForwards > 0
11451153 then retryPendingForwards result.pendingForwards
11461154 else yield {}
1155+ if not (federationSecret == "") && count result.pendingAcks > 0
1156+ then do
1157+ let ackOriginServers = fold (\acc a ->
1158+ if count (do s <- acc; where s == a.originServer; yield s) > 0 then acc
1159+ else union acc [a.originServer]) [] result.pendingAcks
1160+ sendToEach ackOriginServers (\server ->
1161+ fetch (federationScheme ++ server) (FederationAck {
1162+ authorization: "Bearer " ++ federationSecret,
1163+ messageIds: (do a <- result.pendingAcks; where a.originServer == server; yield a.messageId),
1164+ originServer: server, fromServer: serverHostN}))
1165+ else yield {}
11471166 else respond {ok: False {}}
11481167
11491168-- ============================================