@@ -48,7 +48,15 @@ federationEnabled = federationSecret != ""
4848-- Types
4949-- ============================================
5050
51−type PollEvent = {id: MessageIdHex, eventType: Text, payload: {encryptedBlob: BlobHex, fromKey: PubkeyHex, timestamp: Timestamp, toKey: PubkeyHex}}
51+type PollEventType = PollMessage {}
52+
53+impl ToJSON PollEventType where
54+ toJson _ = toJson "message"
55+
56+impl FromJSON PollEventType where
57+ parseJson _ = PollMessage {}
58+
59+type PollEvent = {id: MessageIdHex, eventType: PollEventType, payload: {encryptedBlob: BlobHex, fromKey: PubkeyHex, timestamp: Timestamp, toKey: PubkeyHex}}
5260
5361type GossipEventType = GossipOnline {} | GossipOffline {}
5462
@@ -63,7 +71,6 @@ impl FromJSON GossipEventType where
6371 if s == "online" then GossipOnline {} else GossipOffline {}
6472
6573isGossipOnline = \et -> case et of GossipOnline {} -> True {}; _ -> False {}
66−isGossipOffline = \et -> case et of GossipOffline {} -> True {}; _ -> False {}
6774
6875type GossipEvent = {eventType: GossipEventType, pubkey: PubkeyHex, server: ServerName, timestamp: Timestamp, ttl: Int<S>}
6976
@@ -715,7 +722,7 @@ pollOnce = \token cursor -> do
715722 let limitedMsgs = boundedSmallest matchingMsgs maxPollEvents (\m -> m.receivedAt)
716723 let evts = do
717724 m <- limitedMsgs
718− yield {id: m.messageId, eventType: "message",
725+ yield {id: m.messageId, eventType: PollMessage {},
719726 payload: {toKey: m.toKey, fromKey: m.fromKey,
720727 encryptedBlob: m.encryptedBlob,
721728 timestamp: m.timestamp}}
@@ -906,11 +913,12 @@ serve = \req -> case req of
906913 p <- presence
907914 where p.pubkey == pubkey && p.expiresAt > t
908915 yield p
909− let foundServer = (fold (\acc p ->
910− if acc.server == serverHostN then acc
911− else if p.server == serverHostN then {server: serverHostN, best: p.expiresAt}
912− else if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt}
913− else acc) {server: "", best: 0} valid).server
916+ let localPresent = any valid (\p -> p.server == serverHostN)
917+ let bestRemote = (fold (\acc p ->
918+ if p.server != serverHostN && p.expiresAt > acc.best
919+ then {server: p.server, best: p.expiresAt}
920+ else acc) {server: "", best: 0} valid).server
921+ let foundServer = if localPresent then serverHostN else bestRemote
914922 yield {pr: pr, authorized: True {}, foundServer: foundServer}
915923 forkBroadcastOffline t result.pr
916924 yield (respond {online: result.foundServer != "", server: result.foundServer, authorized: result.authorized})
@@ -926,7 +934,7 @@ serve = \req -> case req of
926934 else do
927935 let allValidEntries = validGossipEvents events t
928936 let onlineEntries = do e <- allValidEntries; where isGossipOnline e.eventType; yield e
929− let offlineEntries = do e <- allValidEntries; where isGossipOffline e.eventType; yield e
937+ let offlineEntries = do e <- allValidEntries; where not (isGossipOnline e.eventType); yield e
930938 let filteredOnline = do
931939 e <- onlineEntries
932940 where none offlineEntries (\o -> o.server == fromServer && samePubkeyServer o e && o.timestamp > e.timestamp)
@@ -936,8 +944,8 @@ serve = \req -> case req of
936944 where none onlineEntries (\o -> samePubkeyServer o e && o.timestamp > e.timestamp)
937945 yield e
938946 let trustedOffline = do
939− e <- offlineEntries
940− where e.server == fromServer
947+ e <- allValidEntries
948+ where not (isGossipOnline e.eventType) && e.server == fromServer
941949 yield e
942950 let deduped = mergeByPubkeyServer [] filteredOnline
943951 gossipResult <- atomic do