@@ -48,7 +48,12 @@ federationEnabled = federationSecret != ""
4848-- Types
4949-- ============================================
5050
51−type PollEvent = {id: MessageIdHex, eventType: Text, payload: {encryptedBlob: BlobHex, fromKey: PubkeyHex, timestamp: Timestamp, toKey: PubkeyHex}}
51+data PollEventType = PtMessage {}
52+
53+impl ToJSON PollEventType where
54+ toJson _ = toJson "message"
55+
56+type PollEvent = {id: MessageIdHex, eventType: PollEventType, payload: {encryptedBlob: BlobHex, fromKey: PubkeyHex, timestamp: Timestamp, toKey: PubkeyHex}}
5257
5358data GossipEventType = GossipOnline {} | GossipOffline {} | GossipUnknown {}
5459
@@ -73,15 +78,15 @@ type GossipEvent = {eventType: GossipEventType, pubkey: PubkeyHex, server: Serve
7378
7479type ValidGossipEntry = {eventType: GossipEventType, pubkey: PubkeyHex, server: ServerName, expiresAt: Timestamp, timestamp: Timestamp, ttl: Int<S>}
7580
76−data MessageStatus = MsDelivered {} | MsFederated {} | MsQueued {}
77−
78−messageStatusText = \ms -> case ms of
79− MsDelivered {} -> "delivered"
80− MsFederated {} -> "federated"
81− MsQueued {} -> "queued"
81+data MessageStatus = MsDelivered {} | MsFederated {} | MsQueued {} | MsUnauthorized {} | MsRejected {}
8282
8383impl ToJSON MessageStatus where
84− toJson ms = toJson (messageStatusText ms)
84+ toJson ms = toJson (case ms of
85+ MsDelivered {} -> "delivered"
86+ MsFederated {} -> "federated"
87+ MsQueued {} -> "queued"
88+ MsUnauthorized {} -> "unauthorized"
89+ MsRejected {} -> "rejected")
8590
8691type PubkeyHex = Text where \s -> isValidHex s && not (tooLong s maxPubkeyLen) && s == normalizeHex s
8792type BlobHex = Text where \s -> isValidHex s && not (tooLong s maxBlobLen) && s == normalizeHex s
@@ -150,7 +155,7 @@ route ClientApi where
150155 = Poll
151156 /messages
152157 POST {to: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp} / headers {authorization: Text}
153− -> {status: Text, messageId: OptionalMessageId}
158+ -> {status: MessageStatus, messageId: OptionalMessageId}
154159 = SendMessage
155160 POST {messageIds: [MessageIdHex]} /ack headers {authorization: Text}
156161 -> {ok: Bool}
@@ -727,7 +732,7 @@ pollOnce = \token cursor -> do
727732 let limitedMsgs = boundedSmallest matchingMsgs maxPollEvents (\m -> m.receivedAt)
728733 let evts = do
729734 m <- limitedMsgs
730− yield {id: m.messageId, eventType: "message",
735+ yield {id: m.messageId, eventType: PtMessage {},
731736 payload: {toKey: m.toKey, fromKey: m.fromKey,
732737 encryptedBlob: m.encryptedBlob,
733738 timestamp: m.timestamp}}
@@ -872,9 +877,9 @@ serve = \req -> case req of
872877 _ -> yield {}
873878 broadcastOfflineGossip t result.pr.peerServers result.pr.expiredLocal)
874879 yield (case result.send of
875− SendUnauthorized {} -> respond {status: "unauthorized", messageId: ""}
876− SendRejected {} -> respond {status: "rejected", messageId: ""}
877− SendDone {status} -> respond {status: messageStatusText status, messageId: msgId})
880+ SendUnauthorized {} -> respond {status: MsUnauthorized {}, messageId: ""}
881+ SendRejected {} -> respond {status: MsRejected {}, messageId: ""}
882+ SendDone {status} -> respond {status: status, messageId: msgId})
878883
879884 AckMessages {messageIds, authorization, respond} -> do
880885 t <- now
@@ -892,9 +897,11 @@ serve = \req -> case req of
892897 where m.toKey == pubkey && any dedupedIds (\mid -> m.messageId == mid)
893898 yield m
894899 set *messages = diff messages ackedMessages
895− let ackedFederated = fold (\acc m -> case m.origin of
896− FederatedOrigin {server} -> union acc [{messageId: m.messageId, toKey: m.toKey, ackedAt: t, originServer: server}]
897− LocalOrigin {} -> acc) [] ackedMessages
900+ let ackedFederated = do
901+ m <- ackedMessages
902+ case m.origin of
903+ FederatedOrigin {server} -> yield {messageId: m.messageId, toKey: m.toKey, ackedAt: t, originServer: server}
904+ LocalOrigin {} -> []
898905 ackedIds <- *ackedIds
899906 let combinedAckedIds = union ackedIds ackedFederated
900907 let evictedEntries = let excessCount = count combinedAckedIds - maxAckedIds in