@@ -115,7 +115,7 @@ type PresenceEntry = {pubkey: PubkeyHex, server: AnyServerName, expiresAt: Times
115115type ForwardEntry = {messageId: MessageIdHex, toServer: ServerName, createdAt: Timestamp, toKey: PubkeyHex, fromKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp}
116116type AckedEntry = {messageId: MessageIdHex, toKey: PubkeyHex, ackedAt: Timestamp, originServer: ServerName}
117117type AuthResult = Authorized {pubkey: PubkeyHex} | Unauthorized {}
118−type SendResult = SendUnauthorized {} | SendRejected {} | SendDone {status: MessageStatus, remoteServers: [ServerName], fromKey: PubkeyHex}
118+type SendResult = SendFailed {status: MessageStatus} | SendDone {status: MessageStatus, remoteServers: [ServerName], fromKey: PubkeyHex}
119119
120120
121121-- ============================================
@@ -818,11 +818,11 @@ serve = \req -> case req of
818818 auth <- authenticateRequest authorization t
819819 case auth of
820820 Unauthorized {} ->
821− yield {pr: pr, send: SendUnauthorized {}}
821+ yield {pr: pr, send: SendFailed {status: MsUnauthorized {}}}
822822 Authorized {pubkey: fromKey} -> do
823823 messages <- *messages
824824 if countMessagesFor messages to t >= maxMessagesPerRecipient
825− then yield {pr: pr, send: SendRejected {}}
825+ then yield {pr: pr, send: SendFailed {status: MsRejected {}}}
826826 else do
827827 presence <- *presence
828828 seqCounter <- *seqCounter
@@ -860,8 +860,7 @@ serve = \req -> case req of
860860 _ -> yield {}
861861 broadcastOfflineGossip t result.pr.peerServers result.pr.expiredLocal)
862862 yield (case result.send of
863− SendUnauthorized _ -> respond {status: MsUnauthorized {}, messageId: ""}
864− SendRejected _ -> respond {status: MsRejected {}, messageId: ""}
863+ SendFailed {status} -> respond {status: status, messageId: ""}
865864 SendDone {status} -> respond {status: status, messageId: msgId})
866865
867866 AckMessages {messageIds, authorization, respond} -> do
@@ -913,10 +912,10 @@ serve = \req -> case req of
913912 where p.pubkey == pubkey && p.expiresAt > t
914913 yield p
915914 let foundServer = (fold (\acc p ->
916− if acc.local then acc
917− else if p.server == serverHostN then {server: serverHostN, best: 0, local: True {}}
918− else if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt, local: False {}}
919− else acc) {server: "", best: 0, local: False {}} valid).server
915+ if acc.server == serverHostN then acc
916+ else if p.server == serverHostN then {server: serverHostN, best: 0}
917+ else if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt}
918+ else acc) {server: "", best: 0} valid).server
920919 yield {pr: pr, authorized: True {}, foundServer: foundServer}
921920 forkBroadcastOffline t result.pr
922921 yield (respond {online: result.foundServer != "", server: result.foundServer, authorized: result.authorized})
@@ -932,16 +931,16 @@ serve = \req -> case req of
932931 else do
933932 let allValidEntries = validGossipEvents events t
934933 let onlineEntries = do e <- allValidEntries; where isGossipOnline e.eventType; yield e
935− let offlineEntries = do e <- allValidEntries; where not (isGossipOnline e.eventType); yield e
934+ let offlineEntries = diff allValidEntries onlineEntries
935+ let trustedOffline = do e <- offlineEntries; where e.server == fromServer; yield e
936936 let filteredOnline = do
937937 e <- onlineEntries
938− where none offlineEntries (\o -> o.server == fromServer && samePubkeyServer o e && o.timestamp > e.timestamp)
938+ where none trustedOffline (\o -> samePubkeyServer o e && o.timestamp > e.timestamp)
939939 yield e
940940 let filteredOffline = do
941941 e <- offlineEntries
942942 where none onlineEntries (\o -> samePubkeyServer o e && o.timestamp > e.timestamp)
943943 yield e
944− let trustedOffline = do e <- offlineEntries; where e.server == fromServer; yield e
945944 let deduped = mergeByPubkeyServer [] filteredOnline
946945 gossipResult <- atomic do
947946 pr <- maybePrune t