on master help sign in
Forward queued messages when recipients come online on remote servers
commitcacfe3d506e62a92cb3df8e05ca2af241ecc9007 authoriko <mail@iko.soy> dateSat 18 Apr 2026, 02:31 (6 months ago) parent7373014
1 file changed+29−1
server.knot+29−1
server.knot+29−1
@@ -733,6 +733,27 @@ retryPendingForwards = \pending -> do
733733 retryForwardsForServer (do x <- pending; where x.toServer == server; yield x) maxForwardRetriesPerServer)
734734 yield {}
735735
736+forwardQueuedMessages = \targets t -> do
737+ newForwards <- atomic do
738+ messages <- *messages
739+ forwards <- *forwards
740+ presence <- *presence
741+ let localOnline = do p <- presence; where isLocalServer p.server && p.expiresAt > t; yield p.pubkey
742+ let remoteTargets = do target <- targets; where none localOnline (\pk -> pk == target.pubkey); yield target
743+ let candidates = do
744+ target <- remoteTargets
745+ m <- messages
746+ where m.toKey == target.pubkey
747+ where none forwards (\f -> f.messageId == m.messageId && f.toServer == target.server)
748+ yield {messageId: m.messageId, toServer: target.server, createdAt: t,
749+ toKey: m.toKey, fromKey: m.fromKey, encryptedBlob: m.encryptedBlob, timestamp: m.timestamp}
750+ let capped = takeN candidates (maxForwardsEntries - count forwards)
751+ set *forwards = union forwards capped
752+ yield capped
753+ let servers = collectPeerServers newForwards (\x -> x.toServer)
754+ sendToEach servers (\server ->
755+ retryForwardsForServer (do x <- newForwards; where x.toServer == server; yield x) maxForwardRetriesPerServer)
756+
736757fetchFederationAck = \server messageIds ->
737758 fetch (federationUrl server) (FederationAck {
738759 authorization: federationAuth,
@@ -1035,6 +1056,11 @@ serve = \req -> case req of
10351056 let effectiveEvents = union (effectiveGossipEvents filteredOnline gossipResult.gm.appliedKeys (GossipOnline {})) (effectiveGossipEvents filteredOffline gossipResult.gm.appliedKeys (GossipOffline {}))
10361057 when (not gossipResult.gm.withinCapacity)
10371058 (println ("gossip: presence at capacity (" ++ show maxPresenceEntries ++ "), limiting new entries from " ++ fromServer))
1059+ let newlyOnlineRemote = do
1060+ e <- filteredOnline
1061+ where any gossipResult.gm.appliedKeys (\a -> samePubkeyServer a e)
1062+ where not (isLocalServer e.server)
1063+ yield {pubkey: e.pubkey, server: e.server}
10381064 fork (do
10391065 when (cappedHops > 1 && federationEnabled && count effectiveEvents > 0) (
10401066 let targets = do
@@ -1042,7 +1068,9 @@ serve = \req -> case req of
10421068 where s != fromServer
10431069 yield s
10441070 in sendBatchedGossip targets effectiveEvents (cappedHops - 1))
1045− broadcastOfflineGossip t gossipResult.pr.peerServers gossipResult.pr.expiredLocal)
1071+ broadcastOfflineGossip t gossipResult.pr.peerServers gossipResult.pr.expiredLocal
1072+ when (federationEnabled && count newlyOnlineRemote > 0)
1073+ (forwardQueuedMessages newlyOnlineRemote t))
10461074 yield (respond {ok: True {}}))
10471075
10481076 ForwardMessage {toKey, fromKey, encryptedBlob, timestamp, originServer, messageId, authorization, respond} -> do