on master help sign in
Simplify code: merge LookupPresence fold, restrict offlineOnlyKeys to fromServer, remove let alias; refactor Client ConnStatus to use Session type
commite6d52540f7a36ceb966de06191cfd7c3d223c800 authoriko <mail@iko.soy> dateFri 10 Apr 2026, 19:58 (6 months ago) parent0c01684
2 files changed+12−19
client/App.fs+5−10 server.knot+7−9
client/App.fs+5−10
@@ -17,9 +17,9 @@ module App =
1717
1818 // ── Domain Types ──
1919
20+ [<JsonConverter(typeof<EnvelopeTypeConverter>)>]
2021 type private EnvelopeType = Text | UnknownEnvelope of string
21−
22− type private EnvelopeTypeConverter() =
22+ and private EnvelopeTypeConverter() =
2323 inherit JsonConverter<EnvelopeType>()
2424 override _.Read(reader, _, _) =
2525 match reader.GetString() with
@@ -37,11 +37,6 @@ module App =
3737 [<JsonPropertyName("id")>] Id: string
3838 [<JsonPropertyName("body")>] Body: string }
3939
40− let private envelopeJsonOpts =
41− let opts = JsonSerializerOptions()
42− opts.Converters.Add(EnvelopeTypeConverter())
43− opts
44−
4540 type Page =
4641 | Setup
4742 | Conversations
@@ -54,7 +49,7 @@ module App =
5449 type ConnStatus =
5550 | Offline
5651 | Connecting
57− | Online of token: string
52+ | Online of Session
5853
5954 type AuthState =
6055 | NoIdentity
@@ -166,7 +161,7 @@ module App =
166161
167162 let private trySession model =
168163 match model.Auth with
169− | Identified(id, Online token) -> Some { Url = model.ServerUrl; Token = token; Identity = id }
164+ | Identified(_, Online session) -> Some session
170165 | _ -> None
171166
172167 let private setConn status model =
@@ -225,7 +220,7 @@ module App =
225220 match model.Auth with
226221 | Identified(id, Connecting) ->
227222 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 },
229224 [ CmdPoll(session, model.PollCursor) ]
230225 | _ -> model, []
231226
server.knot+7−9
@@ -912,12 +912,11 @@ serve = \req -> case req of
912912 p <- presence
913913 where p.pubkey == pubkey && p.expiresAt > t
914914 yield p
915− let localPresent = any valid (\p -> p.server == serverHostN)
916− let bestRemote = (fold (\acc p ->
917− if p.server != serverHostN && p.expiresAt > acc.best
918− then {server: p.server, best: p.expiresAt}
919− else acc) {server: "", best: 0} valid).server
920− let foundServer = if localPresent then serverHostN else bestRemote
915+ let foundServer = (fold (\acc p ->
916+ if acc.local then acc
917+ else if p.server == serverHostN then {server: serverHostN, best: 0, local: True {}}
918+ else if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt, local: False {}}
919+ else acc) {server: "", best: 0, local: False {}} valid).server
921920 yield {pr: pr, authorized: True {}, foundServer: foundServer}
922921 forkBroadcastOffline t result.pr
923922 yield (respond {online: result.foundServer != "", server: result.foundServer, authorized: result.authorized})
@@ -958,7 +957,7 @@ serve = \req -> case req of
958957 let merged = mergeByPubkeyServer presence trustedDeduped
959958 let offlineOnlyKeys = do
960959 e <- allValidEntries
961− where none trustedDeduped (\d -> samePubkeyServer d e)
960+ where e.server == fromServer && none trustedDeduped (\d -> samePubkeyServer d e)
962961 yield e
963962 let afterOffline = removeOffline merged offlineOnlyKeys trustedOffline t
964963 let appliedOffline = do p <- diff merged afterOffline; yield {pubkey: p.pubkey, server: p.server}
@@ -979,8 +978,7 @@ serve = \req -> case req of
979978 where s != fromServer
980979 yield s
981980 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)
984982 yield (respond {ok: True {}})
985983
986984 ForwardMessage {toKey, fromKey, encryptedBlob, timestamp, originServer, messageId, authorization, respond} -> do