on master help sign in
Simplify code: merge LookupPresence fold, restrict offlineOnlyKeys to fromServer, remove let alias; refactor Client ConnStatus to use Session type
e6d5254iko
client/App.fs+5−10
@@ -17,9 +17,9 @@ module App =
17
17
18 // ── Domain Types ──
18 // ── Domain Types ──
19
19
20+ [<JsonConverter(typeof<EnvelopeTypeConverter>)>]
20 type private EnvelopeType = Text | UnknownEnvelope of string
21 type private EnvelopeType = Text | UnknownEnvelope of string
21−
22− type private EnvelopeTypeConverter() =
22+ and private EnvelopeTypeConverter() =
23 inherit JsonConverter<EnvelopeType>()
23 inherit JsonConverter<EnvelopeType>()
24 override _.Read(reader, _, _) =
24 override _.Read(reader, _, _) =
25 match reader.GetString() with
25 match reader.GetString() with
@@ -37,11 +37,6 @@ module App =
37 [<JsonPropertyName("id")>] Id: string
37 [<JsonPropertyName("id")>] Id: string
38 [<JsonPropertyName("body")>] Body: string }
38 [<JsonPropertyName("body")>] Body: string }
39
39
40− let private envelopeJsonOpts =
41− let opts = JsonSerializerOptions()
42− opts.Converters.Add(EnvelopeTypeConverter())
43− opts
44−
45 type Page =
40 type Page =
46 | Setup
41 | Setup
47 | Conversations
42 | Conversations
@@ -54,7 +49,7 @@ module App =
54 type ConnStatus =
49 type ConnStatus =
55 | Offline
50 | Offline
56 | Connecting
51 | Connecting
57− | Online of token: string
52+ | Online of Session
58
53
59 type AuthState =
54 type AuthState =
60 | NoIdentity
55 | NoIdentity
@@ -166,7 +161,7 @@ module App =
166
161
167 let private trySession model =
162 let private trySession model =
168 match model.Auth with
163 match model.Auth with
169− | Identified(id, Online token) -> Some { Url = model.ServerUrl; Token = token; Identity = id }
164+ | Identified(_, Online session) -> Some session
170 | _ -> None
165 | _ -> None
171
166
172 let private setConn status model =
167 let private setConn status model =
@@ -225,7 +220,7 @@ module App =
225 match model.Auth with
220 match model.Auth with
226 | Identified(id, Connecting) ->
221 | Identified(id, Connecting) ->
227 let session = { Url = model.ServerUrl; Token = token; Identity = id }
222 let session = { Url = model.ServerUrl; Token = token; Identity = id }
228− { model with Auth = Identified(id, Online token); Page = Conversations; Error = None },
223+ { model with Auth = Identified(id, Online session); Page = Conversations; Error = None },
229 [ CmdPoll(session, model.PollCursor) ]
224 [ CmdPoll(session, model.PollCursor) ]
230 | _ -> model, []
225 | _ -> model, []
231
226
server.knot+7−9
@@ -912,12 +912,11 @@ serve = \req -> case req of
912 p <- presence
912 p <- presence
913 where p.pubkey == pubkey && p.expiresAt > t
913 where p.pubkey == pubkey && p.expiresAt > t
914 yield p
914 yield p
915− let localPresent = any valid (\p -> p.server == serverHostN)
915+ let foundServer = (fold (\acc p ->
916− let bestRemote = (fold (\acc p ->
916+ if acc.local then acc
917− if p.server != serverHostN && p.expiresAt > acc.best
917+ else if p.server == serverHostN then {server: serverHostN, best: 0, local: True {}}
918− then {server: p.server, best: p.expiresAt}
918+ else if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt, local: False {}}
919− else acc) {server: "", best: 0} valid).server
919+ else acc) {server: "", best: 0, local: False {}} valid).server
920− let foundServer = if localPresent then serverHostN else bestRemote
921 yield {pr: pr, authorized: True {}, foundServer: foundServer}
920 yield {pr: pr, authorized: True {}, foundServer: foundServer}
922 forkBroadcastOffline t result.pr
921 forkBroadcastOffline t result.pr
923 yield (respond {online: result.foundServer != "", server: result.foundServer, authorized: result.authorized})
922 yield (respond {online: result.foundServer != "", server: result.foundServer, authorized: result.authorized})
@@ -958,7 +957,7 @@ serve = \req -> case req of
958 let merged = mergeByPubkeyServer presence trustedDeduped
957 let merged = mergeByPubkeyServer presence trustedDeduped
959 let offlineOnlyKeys = do
958 let offlineOnlyKeys = do
960 e <- allValidEntries
959 e <- allValidEntries
961− where none trustedDeduped (\d -> samePubkeyServer d e)
960+ where e.server == fromServer && none trustedDeduped (\d -> samePubkeyServer d e)
962 yield e
961 yield e
963 let afterOffline = removeOffline merged offlineOnlyKeys trustedOffline t
962 let afterOffline = removeOffline merged offlineOnlyKeys trustedOffline t
964 let appliedOffline = do p <- diff merged afterOffline; yield {pubkey: p.pubkey, server: p.server}
963 let appliedOffline = do p <- diff merged afterOffline; yield {pubkey: p.pubkey, server: p.server}
@@ -979,8 +978,7 @@ serve = \req -> case req of
979 where s != fromServer
978 where s != fromServer
980 yield s
979 yield s
981 in sendBatchedGossip targets effectiveEvents (cappedHops - 1))
980 in sendBatchedGossip targets effectiveEvents (cappedHops - 1))
982− let pr = gossipResult.pr
983− broadcastOfflineGossip t pr.peerServers pr.expiredLocal)
981+ broadcastOfflineGossip t gossipResult.pr.peerServers gossipResult.pr.expiredLocal)
984 yield (respond {ok: True {}})
982 yield (respond {ok: True {}})
985
983
986 ForwardMessage {toKey, fromKey, encryptedBlob, timestamp, originServer, messageId, authorization, respond} -> do
984 ForwardMessage {toKey, fromKey, encryptedBlob, timestamp, originServer, messageId, authorization, respond} -> do