@@ -102,9 +102,10 @@ type PresenceEntry = {pubkey: PubkeyHex, server: AnyServerName, expiresAt: Times
102102type ForwardEntry = {messageId: MessageIdHex, toServer: ServerName, createdAt: Timestamp, toKey: PubkeyHex, fromKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp}
103103type AckedEntry = {messageId: MessageIdHex, toKey: PubkeyHex, ackedAt: Timestamp, originServer: ServerName}
104104type AuthResult = Authorized {pubkey: PubkeyHex} | Unauthorized {}
105−type SendResult = SendFailed {status: MessageStatus} | SendDone {status: MessageStatus, remoteServers: [ServerName], fromKey: PubkeyHex}
105+type SendResult = SendUnauthorized {} | SendRejected {} | SendDone {status: MessageStatus, remoteServers: [ServerName], fromKey: PubkeyHex}
106106type VerifyResult = VerifyFailed {} | VerifyOk {peerServers: [ServerName]}
107107type AckResult = AckUnauthorized {} | AckDone {pendingAcks: [AckedEntry], evictedEntries: [AckedEntry]}
108+type LookupResult = LookupUnauthorized {} | LookupDone {server: AnyServerName}
108109
109110
110111-- ============================================
@@ -815,11 +816,11 @@ serve = \req -> case req of
815816 auth <- authenticateRequest authorization t
816817 case auth of
817818 Unauthorized {} ->
818− yield {pr: pr, send: SendFailed {status: MsUnauthorized {}}}
819+ yield {pr: pr, send: SendUnauthorized {}}
819820 Authorized {pubkey: fromKey} -> do
820821 messages <- *messages
821822 if countMessagesFor messages to t >= maxMessagesPerRecipient
822− then yield {pr: pr, send: SendFailed {status: MsRejected {}}}
823+ then yield {pr: pr, send: SendRejected {}}
823824 else do
824825 presence <- *presence
825826 seqCounter <- *seqCounter
@@ -857,7 +858,8 @@ serve = \req -> case req of
857858 _ -> yield {}
858859 broadcastOfflineGossip t result.pr.peerServers result.pr.expiredLocal)
859860 yield (case result.send of
860− SendFailed {status} -> respond {status: status, messageId: ""}
861+ SendUnauthorized {} -> respond {status: MsUnauthorized {}, messageId: ""}
862+ SendRejected {} -> respond {status: MsRejected {}, messageId: ""}
861863 SendDone {status} -> respond {status: status, messageId: msgId})
862864
863865 AckMessages {messageIds, authorization, respond} -> do
@@ -906,7 +908,7 @@ serve = \req -> case req of
906908 auth <- authenticateRequest authorization t
907909 case auth of
908910 Unauthorized {} ->
909− yield {pr: pr, authorized: False {}, foundServer: ""}
911+ yield {pr: pr, lookup: LookupUnauthorized {}}
910912 Authorized _ -> do
911913 presence <- *presence
912914 let valid = do
@@ -914,11 +916,14 @@ serve = \req -> case req of
914916 where p.pubkey == pubkey && p.expiresAt > t
915917 yield p
916918 let localOnline = any valid (\p -> p.server == serverHostN)
917− let bestRemote = (fold (\acc p -> if p.server != serverHostN && p.expiresAt > acc.best then {server: p.server, best: p.expiresAt} else acc) {server: "", best: 0} valid).server
919+ let remoteValid = do p <- valid; where p.server != serverHostN; yield p
920+ let bestRemote = (fold (\acc p -> if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt} else acc) {server: "", best: 0} remoteValid).server
918921 let foundServer = if localOnline then serverHostN else bestRemote
919− yield {pr: pr, authorized: True {}, foundServer: foundServer}
922+ yield {pr: pr, lookup: LookupDone {server: foundServer}}
920923 forkBroadcastOffline t result.pr
921− yield (respond {online: result.foundServer != "", server: result.foundServer, authorized: result.authorized})
924+ yield (case result.lookup of
925+ LookupUnauthorized {} -> respond {online: False {}, server: "", authorized: False {}}
926+ LookupDone {server} -> respond {online: server != "", server: server, authorized: True {}})
922927
923928 RecvGossip {events, hopsRemaining, fromServer, authorization, respond} -> do
924929 t <- now