on master help sign in
Simplify server code: extract magic numbers as constants, use wildcards in cases, inline variable
commitdddd66f0bf97c47fa53d616a7c0df16842361244 authoriko <mail@iko.soy> dateSat 11 Apr 2026, 14:45 (6 months ago) parentc2421eb
27 files changed+65−44
client/App.fs+16−22 client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.app/Skrepka.dll client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.app/Skrepka.pdb client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.app/_CodeSignature/CodeResources+4−4 client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.dll client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.pdb client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.app/Contents/MonoBundle/Skrepka.dll client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.app/Contents/MonoBundle/Skrepka.pdb client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.app/Contents/_CodeSignature/CodeResources+2−2 client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.dll client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.pdb client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.AssemblyInfo.fs+1−1 client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.AssemblyInfoInputs.cache+1−1 client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.dll client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.fsproj.FileListAbsolute.txt+23 client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.pdb client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.sourcelink.json+1−1 client/obj/Debug/net10.0-ios/iossimulator-arm64/ref/Skrepka.dll client/obj/Debug/net10.0-ios/iossimulator-arm64/refint/Skrepka.dll client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.AssemblyInfo.fs+1−1 client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.AssemblyInfoInputs.cache+1−1 client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.dll client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.pdb client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.sourcelink.json+1−1 client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/ref/Skrepka.dll client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/refint/Skrepka.dll server.knot+14−10
client/App.fs+16−22
@@ -3,7 +3,6 @@ namespace Skrepka
33open System
44open System.IO
55open System.Text.Json
6−open System.Text.Json.Serialization
76open Fabulous
87open Fabulous.Maui
98open Microsoft.Maui.Graphics
@@ -66,8 +65,7 @@ module App =
6665 // ── Msg ──
6766
6867 type StateLoadResult =
69− | IdentityAndData of Identity * Data * Profile option
70− | IdentityOnly of Identity * Profile option
68+ | Loaded of Identity * Data option * Profile option
7169 | NothingSaved
7270
7371 type Msg =
@@ -340,7 +338,7 @@ module App =
340338 | None -> () ]
341339 | _ -> model, []
342340
343− | StateLoaded(IdentityAndData(identity, data, profile)) ->
341+ | StateLoaded(Loaded(identity, Some data, profile)) ->
344342 let model' =
345343 { model with
346344 Auth = Identified(identity, Connecting)
@@ -351,7 +349,7 @@ module App =
351349 Profile = profile
352350 Page = Conversations }
353351 model', [ CmdConnect(model'.ServerUrl, identity) ]
354− | StateLoaded(IdentityOnly(identity, profile)) ->
352+ | StateLoaded(Loaded(identity, None, profile)) ->
355353 { model with Auth = Identified(identity, Offline); Profile = profile; Page = Settings }, []
356354 | StateLoaded NothingSaved -> model, []
357355
@@ -367,16 +365,16 @@ module App =
367365
368366 type private Envelope =
369367 | TextMessage of id: string * body: string
370− | DeliveryAck of id: string * ackIds: string list
371− | ProfileMessage of id: string * profile: Profile
368+ | DeliveryAck of ackIds: string list
369+ | ProfileMessage of profile: Profile
372370
373371 let private serializeEnvelope = function
374372 | TextMessage(id, body) ->
375373 JsonSerializer.Serialize({| ``type`` = "text"; id = id; body = body |})
376− | DeliveryAck(id, ackIds) ->
377− JsonSerializer.Serialize({| ``type`` = "delivery.ack"; id = id; ack_ids = ackIds |})
378− | ProfileMessage(id, profile) ->
379− JsonSerializer.Serialize({| ``type`` = "profile"; id = id; timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); display_name = profile.DisplayName; bio = profile.Bio; photo = profile.PhotoBase64 |})
374+ | DeliveryAck ackIds ->
375+ JsonSerializer.Serialize({| ``type`` = "delivery.ack"; id = Guid.NewGuid().ToString(); ack_ids = ackIds |})
376+ | ProfileMessage profile ->
377+ JsonSerializer.Serialize({| ``type`` = "profile"; id = Guid.NewGuid().ToString(); timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); display_name = profile.DisplayName; bio = profile.Bio; photo = profile.PhotoBase64 |})
380378
381379 let private sendEnvelope (session: Session) (recipientHex: string) (envelope: Envelope) =
382380 async {
@@ -399,12 +397,12 @@ module App =
399397 Some(TextMessage(root.GetProperty("id").GetString(), root.GetProperty("body").GetString()))
400398 | "delivery.ack" ->
401399 let ackIds = root.GetProperty("ack_ids").EnumerateArray() |> Seq.map _.GetString() |> Seq.toList
402− Some(DeliveryAck(root.GetProperty("id").GetString(), ackIds))
400+ Some(DeliveryAck ackIds)
403401 | "profile" ->
404402 let displayName = root.GetProperty("display_name").GetString()
405403 let bio = tryGetJsonString root "bio" |> Option.defaultValue ""
406404 let photo = tryGetJsonString root "photo" |> Option.defaultValue ""
407− Some(ProfileMessage(root.GetProperty("id").GetString(), { DisplayName = displayName; Bio = bio; PhotoBase64 = photo }))
405+ Some(ProfileMessage { DisplayName = displayName; Bio = bio; PhotoBase64 = photo })
408406 | _ -> None
409407
410408 let private decryptEvent (privKey: byte[]) (payload: EventPayload) =
@@ -420,9 +418,9 @@ module App =
420418 Timestamp = DateTimeOffset.FromUnixTimeSeconds(payload.Timestamp)
421419 IsOutgoing = false
422420 Status = DeliveryStatus.Delivered }))
423− | Some(DeliveryAck(_, ackIds)) ->
421+ | Some(DeliveryAck ackIds) ->
424422 Ok(IncomingDeliveryAck(senderHex, ackIds))
425− | Some(ProfileMessage(_, profile)) ->
423+ | Some(ProfileMessage profile) ->
426424 Ok(IncomingProfile(senderHex, profile))
427425 | None -> Error "unknown envelope type"
428426 | None -> Error "decrypt failed"
@@ -438,7 +436,7 @@ module App =
438436 |> List.map (fun (sender, pairs) -> sender, List.map snd pairs)
439437
440438 for sender, msgIds in chatsBySender do
441− try do! sendEnvelope session sender (DeliveryAck(Guid.NewGuid().ToString(), msgIds)) |> Async.Ignore
439+ try do! sendEnvelope session sender (DeliveryAck msgIds) |> Async.Ignore
442440 with _ -> ()
443441 }
444442
@@ -506,11 +504,7 @@ module App =
506504 asyncCmd (async {
507505 match! Store.loadIdentity () with
508506 | Some id ->
509− let profile = Store.loadProfile ()
510− return StateLoaded(
511− match Store.loadData () with
512− | Some data -> IdentityAndData(id, data, profile)
513− | None -> IdentityOnly(id, profile))
507+ return StateLoaded(Loaded(id, Store.loadData (), Store.loadProfile ()))
514508 | None -> return StateLoaded NothingSaved
515509 })
516510
@@ -542,7 +536,7 @@ module App =
542536 Cmd.ofEffect (fun _ ->
543537 async {
544538 for recipientHex in recipientHexes do
545− try do! sendEnvelope session recipientHex (ProfileMessage(Guid.NewGuid().ToString(), profile)) |> Async.Ignore
539+ try do! sendEnvelope session recipientHex (ProfileMessage profile) |> Async.Ignore
546540 with _ -> ()
547541 } |> Async.Start)
548542
client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.app/Skrepka.dll

Binary file not shown.

client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.app/Skrepka.pdb

Binary file not shown.

client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.app/_CodeSignature/CodeResources+4−4
@@ -166,11 +166,11 @@
166166 </data>
167167 <key>Skrepka.dll</key>
168168 <data>
169− zm59/PSrWKZiLU1jxPLjSpv2s0s=
169+ OjZtkz0VbSsZAPLqo/EwqAhSduU=
170170 </data>
171171 <key>Skrepka.pdb</key>
172172 <data>
173− 9JiX44lGMitB4IFkSrPpNqppv9Y=
173+ 288OaA4YI1RkDT0OJaEP/3YzPMc=
174174 </data>
175175 <key>Sodium.Core.dll</key>
176176 <data>
@@ -1393,14 +1393,14 @@
13931393 <dict>
13941394 <key>hash2</key>
13951395 <data>
1396− yDZ9r78oz/SwMDjgSqMWBuIABfcf+pqLJmP3a/t/3qA=
1396+ GATWVaegaBDKB/p62UIV/s9+8HLonMfOJQDIur7CkO8=
13971397 </data>
13981398 </dict>
13991399 <key>Skrepka.pdb</key>
14001400 <dict>
14011401 <key>hash2</key>
14021402 <data>
1403− Bne0biQx+iOwUvETBgS0ZpBPnqj9iMIcJsbMtjEGsB8=
1403+ xqtzoyoQh4wNTDI5bDqxqXQt8uNenDqsbW18iqrMsVs=
14041404 </data>
14051405 </dict>
14061406 <key>Sodium.Core.dll</key>
client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.dll

Binary file not shown.

client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.pdb

Binary file not shown.

client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.app/Contents/MonoBundle/Skrepka.dll

Binary file not shown.

client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.app/Contents/MonoBundle/Skrepka.pdb

Binary file not shown.

client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.app/Contents/_CodeSignature/CodeResources+2−2
@@ -251,14 +251,14 @@
251251 <dict>
252252 <key>hash2</key>
253253 <data>
254− /muL9+VQW3p0CxjUNmMSZit0d+SjXG5P0rlAa3orDmo=
254+ p4a7Jz8sihEyuUmS+Y+uK2NzEHAlqdpvMP8DN36P+GY=
255255 </data>
256256 </dict>
257257 <key>MonoBundle/Skrepka.pdb</key>
258258 <dict>
259259 <key>hash2</key>
260260 <data>
261− SGyPeKxWxldHdxyu67USmcmURx0ELpgiV7C4wpDifcU=
261+ pmSRC/TvVv/BifxqaC+vH+uL3c1xcWkV07N+dOnKDCw=
262262 </data>
263263 </dict>
264264 <key>MonoBundle/Sodium.Core.dll</key>
client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.dll

Binary file not shown.

client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.pdb

Binary file not shown.

client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.AssemblyInfo.fs+1−1
@@ -10,7 +10,7 @@ open System.Reflection
1010[<assembly: System.Reflection.AssemblyCompanyAttribute("Skrepka")>]
1111[<assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")>]
1212[<assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")>]
13−[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+7b4b58d8a12eba7ce8c31b169029ead687ed7426")>]
13+[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+c2421eb18cd299aa1aa49d08e6aac0aff8c6c2b0")>]
1414[<assembly: System.Reflection.AssemblyProductAttribute("Skrepka")>]
1515[<assembly: System.Reflection.AssemblyTitleAttribute("Skrepka")>]
1616[<assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")>]
client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.AssemblyInfoInputs.cache+1−1
@@ -1 +1 @@
1−5f10364172f6e789ac911d4e11e6aa100fa841aceb13f823dff6f01aacb0ac84
1+42712c0ef894cb13fa15e474d67e6d25426158a6759d2d78deb6c136776fb18b
client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.dll

Binary file not shown.

client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.fsproj.FileListAbsolute.txt+23
@@ -334,3 +334,26 @@
334334/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.genruntimeconfig.cache
335335/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/ref/Skrepka.dll
336336/Users/iko/Developer/skrepka/client/bin/Debug/net10.0-ios/iossimulator-arm64/LiteDB.dll
337+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Fabulous.stamp
338+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Fabulous.MauiControls.stamp
339+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/FSharp.Core.stamp
340+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/LiteDB.stamp
341+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Configuration.Abstractions.stamp
342+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Configuration.stamp
343+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.DependencyInjection.Abstractions.stamp
344+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.DependencyInjection.stamp
345+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Diagnostics.Abstractions.stamp
346+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.FileProviders.Abstractions.stamp
347+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Hosting.Abstractions.stamp
348+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Logging.Abstractions.stamp
349+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Logging.stamp
350+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Options.stamp
351+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Primitives.stamp
352+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Maui.Controls.Compatibility.stamp
353+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Maui.Controls.stamp
354+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Maui.Controls.Xaml.stamp
355+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Maui.stamp
356+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Maui.Essentials.stamp
357+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Maui.Graphics.stamp
358+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Sodium.Core.stamp
359+/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/unpack/Microsoft.Maui.Essentials/BundleResource/xml/microsoft_maui_essentials_fileprovider_file_paths.xml
client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.pdb

Binary file not shown.

client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.sourcelink.json+1−1
@@ -1 +1 @@
1−{"documents":{"/Users/iko/Developer/skrepka/*":"https://raw.githubusercontent.com/ilyakooo0/skrepka/7b4b58d8a12eba7ce8c31b169029ead687ed7426/*"}}
1+{"documents":{"/Users/iko/Developer/skrepka/*":"https://raw.githubusercontent.com/ilyakooo0/skrepka/c2421eb18cd299aa1aa49d08e6aac0aff8c6c2b0/*"}}
client/obj/Debug/net10.0-ios/iossimulator-arm64/ref/Skrepka.dll

Binary file not shown.

client/obj/Debug/net10.0-ios/iossimulator-arm64/refint/Skrepka.dll

Binary file not shown.

client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.AssemblyInfo.fs+1−1
@@ -10,7 +10,7 @@ open System.Reflection
1010[<assembly: System.Reflection.AssemblyCompanyAttribute("Skrepka")>]
1111[<assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")>]
1212[<assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")>]
13−[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+7b4b58d8a12eba7ce8c31b169029ead687ed7426")>]
13+[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+c2421eb18cd299aa1aa49d08e6aac0aff8c6c2b0")>]
1414[<assembly: System.Reflection.AssemblyProductAttribute("Skrepka")>]
1515[<assembly: System.Reflection.AssemblyTitleAttribute("Skrepka")>]
1616[<assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")>]
client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.AssemblyInfoInputs.cache+1−1
@@ -1 +1 @@
1−ecb7ceeceb37b90c5ee8f96b06919afc09665607f70abf08cc16906c5f16c356
1+306144550fbf863e667cabc76cbd65bf3da202cb8745fb510e5ee9d5bdd466b3
client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.dll

Binary file not shown.

client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.pdb

Binary file not shown.

client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.sourcelink.json+1−1
@@ -1 +1 @@
1−{"documents":{"/Users/iko/Developer/skrepka/*":"https://raw.githubusercontent.com/ilyakooo0/skrepka/7b4b58d8a12eba7ce8c31b169029ead687ed7426/*"}}
1+{"documents":{"/Users/iko/Developer/skrepka/*":"https://raw.githubusercontent.com/ilyakooo0/skrepka/c2421eb18cd299aa1aa49d08e6aac0aff8c6c2b0/*"}}
client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/ref/Skrepka.dll

Binary file not shown.

client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/refint/Skrepka.dll

Binary file not shown.

server.knot+14−10
@@ -42,6 +42,12 @@ onlineGossipTtl = 3600 -- 1 hour
4242offlineGossipMinTtl : Int<S>
4343offlineGossipMinTtl = 60 -- minimum TTL for offline gossip events
4444maxForwardRetriesPerServer = 100
45+maxGossipHops = 5
46+gossipOriginHops = 2
47+maxPollTimeout : Int<Ms>
48+maxPollTimeout = 60000 -- 1 minute
49+backgroundPruneInterval : Int<Ms>
50+backgroundPruneInterval = 30000 -- 30 seconds
4551federationEnabled = federationSecret != ""
4652federationAuth = "Bearer " ++ federationSecret
4753federationUrl = \server -> federationScheme ++ server
@@ -598,7 +604,7 @@ broadcastOfflineGossip = \t peerServers expiredLocal ->
598604 p <- expiredLocal
599605 let ttl = clamp offlineGossipMinTtl maxPresenceTtl ((p.expiresAt - p.timestamp) / 1000)
600606 yield {eventType: GossipOffline {}, pubkey: p.pubkey, server: serverHostN, timestamp: p.expiresAt, ttl: ttl})
601− sendBatchedGossip peerServers gossipEvents 2)
607+ sendBatchedGossip peerServers gossipEvents gossipOriginHops)
602608
603609forkBroadcastOffline = \t result ->
604610 fork (broadcastOfflineGossip t result.peerServers result.expiredLocal)
@@ -798,13 +804,13 @@ serve = \req -> case req of
798804 let expiredLocal = do p <- result.pr.expiredLocal; where p.pubkey != pubkey; yield p
799805 fork (do
800806 when federationEnabled
801− (sendBatchedGossip peerServers [{eventType: GossipOnline {}, pubkey: pubkey, server: serverHostN, timestamp: t, ttl: onlineGossipTtl}] 2)
807+ (sendBatchedGossip peerServers [{eventType: GossipOnline {}, pubkey: pubkey, server: serverHostN, timestamp: t, ttl: onlineGossipTtl}] gossipOriginHops)
802808 broadcastOfflineGossip t result.pr.peerServers expiredLocal)
803809 yield (respond {token: token, expiresAt: expiry})
804810
805811 Poll {cursor, timeout, authorization, respond} -> do
806812 t <- now
807− let clampedTimeout = clamp 0 60000 timeout
813+ let clampedTimeout = clamp 0 maxPollTimeout timeout
808814 let deadline = t + clampedTimeout
809815 let token = extractToken authorization
810816 result <- pollLoop token cursor deadline
@@ -862,8 +868,7 @@ serve = \req -> case req of
862868 case status of
863869 MsQueued {} -> println ("sendMessage: forwards at capacity (" ++ show maxForwardsEntries ++ "), skipping forward tracking")
864870 _ -> yield {})
865− SendUnauthorized {} -> yield {}
866− SendRejected {} -> yield {}
871+ _ -> yield {}
867872 broadcastOfflineGossip t result.pr.peerServers result.pr.expiredLocal)
868873 yield (case result.send of
869874 SendUnauthorized {} -> respond {status: MsUnauthorized {}, messageId: ""}
@@ -922,8 +927,7 @@ serve = \req -> case req of
922927 where p.pubkey == pubkey && p.expiresAt > t
923928 yield p
924929 let localOnline = any valid (\p -> p.server == serverHostN)
925− let remoteValid = do p <- valid; where p.server != serverHostN; yield p
926− let bestRemote = (fold (\acc p -> if p.expiresAt > acc.best then {server: p.server, best: p.expiresAt} else acc) {server: "", best: 0} remoteValid).server
930+ 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
927931 let foundServer = if localOnline then serverHostN else bestRemote
928932 yield {pr: pr, lookup: LookupDone {server: foundServer}}
929933 forkBroadcastOffline t result.pr
@@ -934,7 +938,7 @@ serve = \req -> case req of
934938 RecvGossip {events, hopsRemaining, fromServer, authorization, respond} -> do
935939 t <- now
936940 let authorized = verifyFederationAuth authorization
937− let cappedHops = clamp 0 5 hopsRemaining
941+ let cappedHops = clamp 0 maxGossipHops hopsRemaining
938942 if not authorized || cappedHops < 1 || fromServer == serverHostN || count events > maxGossipEvents
939943 then rejectFederation t respond
940944 else do
@@ -1003,7 +1007,7 @@ serve = \req -> case req of
10031007 encryptedBlob: encryptedBlob, timestamp: clampedTs, origin: FederatedOrigin {server: originServer}, receivedAt: seqTs}]
10041008 yield {pr: pr, forward: ForwardStored {}}
10051009 forkBroadcastOffline t result.pr
1006− yield (respond {ok: case result.forward of ForwardDuplicate {} -> True {}; ForwardStored {} -> True {}; ForwardFull {} -> False {}})
1010+ yield (respond {ok: case result.forward of ForwardFull {} -> False {}; _ -> True {}})
10071011
10081012 FederationAck {messageIds, originServer, fromServer, authorization, respond} -> do
10091013 t <- now
@@ -1034,7 +1038,7 @@ serve = \req -> case req of
10341038-- ============================================
10351039
10361040backgroundPrune = do
1037− sleep 30000
1041+ sleep backgroundPruneInterval
10381042 t <- now
10391043 pruneAndRetry t
10401044 fork backgroundPrune