@@ -541,7 +541,31 @@ retryPendingForwards = \pending -> do
541 retryForwardsForServer (do x <- pending; where x.toServer == server; yield x) maxForwardRetriesPerServer)
541 retryForwardsForServer (do x <- pending; where x.toServer == server; yield x) maxForwardRetriesPerServer)
544+sendBatchedAcksToServer : [{messageId: Text, toKey: Text, originServer: Text, | a}] -> Text -> IO {network} {}
545+sendBatchedAcksToServer = \serverAcks server ->
546+ if count serverAcks == 0
549+ let batch = fold (\acc a ->
550+ if count acc >= maxMessageIds then acc
551+ else union acc [a]) [] serverAcks
552+ let rest = diff serverAcks batch
553+ result <- fetch (federationScheme ++ server) (FederationAck {
554+ authorization: "Bearer " ++ federationSecret,
555+ messageIds: (do a <- batch; yield a.messageId),
556+ originServer: server, fromServer: serverHostN})
560+ ackedIds <- *ackedIds
563+ where not (a.originServer == server && count (do sa <- batch; where sa.messageId == a.messageId; where sa.toKey == a.toKey; yield sa) > 0)
566+ sendBatchedAcksToServer rest server
544−sendAcksAndClean : [{messageId: Text, originServer: Text, | a}] -> [Text] -> IO {network} {}
568+sendAcksAndClean : [{messageId: Text, toKey: Text, originServer: Text, | a}] -> [Text] -> IO {network} {}
545sendAcksAndClean = \pendingAcks servers ->
569sendAcksAndClean = \pendingAcks servers ->
546 if count servers == 0
570 if count servers == 0
547 then yield {}
571 then yield {}
@@ -551,22 +575,7 @@ sendAcksAndClean = \pendingAcks servers ->
551 if server == ""
575 if server == ""
552 then yield {}
576 then yield {}
555− let serverAcks = do a <- pendingAcks; where a.originServer == server; yield a
578+ fork (sendBatchedAcksToServer (do a <- pendingAcks; where a.originServer == server; yield a) server)
556− result <- fetch (federationScheme ++ server) (FederationAck {
557− authorization: "Bearer " ++ federationSecret,
558− messageIds: (do a <- serverAcks; yield a.messageId),
559− originServer: server, fromServer: serverHostN})
563− ackedIds <- *ackedIds
566− where not (a.originServer == server && count (do sa <- serverAcks; where sa.messageId == a.messageId; where sa.toKey == a.toKey; yield sa) > 0)
570 sendAcksAndClean pendingAcks rest
579 sendAcksAndClean pendingAcks rest
572pollOnce : Text -> Int -> IO {clock} {authorized: Bool, cursor: Int, events: [PollEvent]}
581pollOnce : Text -> Int -> IO {clock} {authorized: Bool, cursor: Int, events: [PollEvent]}