@@ -115,7 +115,7 @@ type PresenceEntry = {pubkey: PubkeyHex, server: AnyServerName, expiresAt: Times
115type ForwardEntry = {messageId: MessageIdHex, toServer: ServerName, createdAt: Timestamp, toKey: PubkeyHex, fromKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp}
115type ForwardEntry = {messageId: MessageIdHex, toServer: ServerName, createdAt: Timestamp, toKey: PubkeyHex, fromKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp}
116type AckedEntry = {messageId: MessageIdHex, toKey: PubkeyHex, ackedAt: Timestamp, originServer: ServerName}
116type AckedEntry = {messageId: MessageIdHex, toKey: PubkeyHex, ackedAt: Timestamp, originServer: ServerName}
117type AuthResult = Authorized {pubkey: PubkeyHex} | Unauthorized {}
117type 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}
121-- ============================================
121-- ============================================
@@ -818,11 +818,11 @@ serve = \req -> case req of
818 auth <- authenticateRequest authorization t
818 auth <- authenticateRequest authorization t
819 case auth of
819 case auth of
820 Unauthorized {} ->
820 Unauthorized {} ->
821− yield {pr: pr, send: SendUnauthorized {}}
821+ yield {pr: pr, send: SendFailed {status: MsUnauthorized {}}}
822 Authorized {pubkey: fromKey} -> do
822 Authorized {pubkey: fromKey} -> do
823 messages <- *messages
823 messages <- *messages
824 if countMessagesFor messages to t >= maxMessagesPerRecipient
824 if countMessagesFor messages to t >= maxMessagesPerRecipient
825− then yield {pr: pr, send: SendRejected {}}
825+ then yield {pr: pr, send: SendFailed {status: MsRejected {}}}
827 presence <- *presence
827 presence <- *presence
828 seqCounter <- *seqCounter
828 seqCounter <- *seqCounter
@@ -860,8 +860,7 @@ serve = \req -> case req of
860 _ -> yield {}
860 _ -> yield {}
861 broadcastOfflineGossip t result.pr.peerServers result.pr.expiredLocal)
861 broadcastOfflineGossip t result.pr.peerServers result.pr.expiredLocal)
862 yield (case result.send of
862 yield (case result.send of
863− SendUnauthorized _ -> respond {status: MsUnauthorized {}, messageId: ""}
864− SendRejected _ -> respond {status: MsRejected {}, messageId: ""}
863+ SendFailed {status} -> respond {status: status, messageId: ""}
865 SendDone {status} -> respond {status: status, messageId: msgId})
864 SendDone {status} -> respond {status: status, messageId: msgId})
867 AckMessages {messageIds, authorization, respond} -> do
866 AckMessages {messageIds, authorization, respond} -> do
@@ -913,10 +912,10 @@ serve = \req -> case req of
913 where p.pubkey == pubkey && p.expiresAt > t
912 where p.pubkey == pubkey && p.expiresAt > t
915 let foundServer = (fold (\acc p ->
914 let foundServer = (fold (\acc p ->
916− if acc.local then acc
915+ if acc.server == serverHostN then acc
917− else if p.server == serverHostN then {server: serverHostN, best: 0, local: True {}}
916+ else if p.server == serverHostN then {server: serverHostN, best: 0}
918− else if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt, local: False {}}
917+ else if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt}
919− else acc) {server: "", best: 0, local: False {}} valid).server
918+ else acc) {server: "", best: 0} valid).server
920 yield {pr: pr, authorized: True {}, foundServer: foundServer}
919 yield {pr: pr, authorized: True {}, foundServer: foundServer}
921 forkBroadcastOffline t result.pr
920 forkBroadcastOffline t result.pr
922 yield (respond {online: result.foundServer != "", server: result.foundServer, authorized: result.authorized})
921 yield (respond {online: result.foundServer != "", server: result.foundServer, authorized: result.authorized})
@@ -932,16 +931,16 @@ serve = \req -> case req of
933 let allValidEntries = validGossipEvents events t
932 let allValidEntries = validGossipEvents events t
934 let onlineEntries = do e <- allValidEntries; where isGossipOnline e.eventType; yield e
933 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
936 let filteredOnline = do
936 let filteredOnline = do
937 e <- onlineEntries
937 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)
940 let filteredOffline = do
940 let filteredOffline = do
941 e <- offlineEntries
941 e <- offlineEntries
942 where none onlineEntries (\o -> samePubkeyServer o e && o.timestamp > e.timestamp)
942 where none onlineEntries (\o -> samePubkeyServer o e && o.timestamp > e.timestamp)
944− let trustedOffline = do e <- offlineEntries; where e.server == fromServer; yield e
945 let deduped = mergeByPubkeyServer [] filteredOnline
944 let deduped = mergeByPubkeyServer [] filteredOnline
946 gossipResult <- atomic do
945 gossipResult <- atomic do
947 pr <- maybePrune t
946 pr <- maybePrune t