on master help sign in
Simplify server code: extract magic numbers as constants, use wildcards in cases, inline variable
dddd66fiko
client/App.fs+16−22
@@ -3,7 +3,6 @@ namespace Skrepka
3open System
3open System
4open System.IO
4open System.IO
5open System.Text.Json
5open System.Text.Json
6−open System.Text.Json.Serialization
7open Fabulous
6open Fabulous
8open Fabulous.Maui
7open Fabulous.Maui
9open Microsoft.Maui.Graphics
8open Microsoft.Maui.Graphics
@@ -66,8 +65,7 @@ module App =
66 // ── Msg ──
65 // ── Msg ──
67
66
68 type StateLoadResult =
67 type StateLoadResult =
69− | IdentityAndData of Identity * Data * Profile option
68+ | Loaded of Identity * Data option * Profile option
70− | IdentityOnly of Identity * Profile option
71 | NothingSaved
69 | NothingSaved
72
70
73 type Msg =
71 type Msg =
@@ -340,7 +338,7 @@ module App =
340 | None -> () ]
338 | None -> () ]
341 | _ -> model, []
339 | _ -> model, []
342
340
343− | StateLoaded(IdentityAndData(identity, data, profile)) ->
341+ | StateLoaded(Loaded(identity, Some data, profile)) ->
344 let model' =
342 let model' =
345 { model with
343 { model with
346 Auth = Identified(identity, Connecting)
344 Auth = Identified(identity, Connecting)
@@ -351,7 +349,7 @@ module App =
351 Profile = profile
349 Profile = profile
352 Page = Conversations }
350 Page = Conversations }
353 model', [ CmdConnect(model'.ServerUrl, identity) ]
351 model', [ CmdConnect(model'.ServerUrl, identity) ]
354− | StateLoaded(IdentityOnly(identity, profile)) ->
352+ | StateLoaded(Loaded(identity, None, profile)) ->
355 { model with Auth = Identified(identity, Offline); Profile = profile; Page = Settings }, []
353 { model with Auth = Identified(identity, Offline); Profile = profile; Page = Settings }, []
356 | StateLoaded NothingSaved -> model, []
354 | StateLoaded NothingSaved -> model, []
357
355
@@ -367,16 +365,16 @@ module App =
367
365
368 type private Envelope =
366 type private Envelope =
369 | TextMessage of id: string * body: string
367 | TextMessage of id: string * body: string
370− | DeliveryAck of id: string * ackIds: string list
368+ | DeliveryAck of ackIds: string list
371− | ProfileMessage of id: string * profile: Profile
369+ | ProfileMessage of profile: Profile
372
370
373 let private serializeEnvelope = function
371 let private serializeEnvelope = function
374 | TextMessage(id, body) ->
372 | TextMessage(id, body) ->
375 JsonSerializer.Serialize({| ``type`` = "text"; id = id; body = body |})
373 JsonSerializer.Serialize({| ``type`` = "text"; id = id; body = body |})
376− | DeliveryAck(id, ackIds) ->
374+ | DeliveryAck ackIds ->
377− JsonSerializer.Serialize({| ``type`` = "delivery.ack"; id = id; ack_ids = ackIds |})
375+ JsonSerializer.Serialize({| ``type`` = "delivery.ack"; id = Guid.NewGuid().ToString(); ack_ids = ackIds |})
378− | ProfileMessage(id, profile) ->
376+ | ProfileMessage profile ->
379− JsonSerializer.Serialize({| ``type`` = "profile"; id = id; timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); display_name = profile.DisplayName; bio = profile.Bio; photo = profile.PhotoBase64 |})
377+ JsonSerializer.Serialize({| ``type`` = "profile"; id = Guid.NewGuid().ToString(); timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); display_name = profile.DisplayName; bio = profile.Bio; photo = profile.PhotoBase64 |})
380
378
381 let private sendEnvelope (session: Session) (recipientHex: string) (envelope: Envelope) =
379 let private sendEnvelope (session: Session) (recipientHex: string) (envelope: Envelope) =
382 async {
380 async {
@@ -399,12 +397,12 @@ module App =
399 Some(TextMessage(root.GetProperty("id").GetString(), root.GetProperty("body").GetString()))
397 Some(TextMessage(root.GetProperty("id").GetString(), root.GetProperty("body").GetString()))
400 | "delivery.ack" ->
398 | "delivery.ack" ->
401 let ackIds = root.GetProperty("ack_ids").EnumerateArray() |> Seq.map _.GetString() |> Seq.toList
399 let ackIds = root.GetProperty("ack_ids").EnumerateArray() |> Seq.map _.GetString() |> Seq.toList
402− Some(DeliveryAck(root.GetProperty("id").GetString(), ackIds))
400+ Some(DeliveryAck ackIds)
403 | "profile" ->
401 | "profile" ->
404 let displayName = root.GetProperty("display_name").GetString()
402 let displayName = root.GetProperty("display_name").GetString()
405 let bio = tryGetJsonString root "bio" |> Option.defaultValue ""
403 let bio = tryGetJsonString root "bio" |> Option.defaultValue ""
406 let photo = tryGetJsonString root "photo" |> Option.defaultValue ""
404 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 })
408 | _ -> None
406 | _ -> None
409
407
410 let private decryptEvent (privKey: byte[]) (payload: EventPayload) =
408 let private decryptEvent (privKey: byte[]) (payload: EventPayload) =
@@ -420,9 +418,9 @@ module App =
420 Timestamp = DateTimeOffset.FromUnixTimeSeconds(payload.Timestamp)
418 Timestamp = DateTimeOffset.FromUnixTimeSeconds(payload.Timestamp)
421 IsOutgoing = false
419 IsOutgoing = false
422 Status = DeliveryStatus.Delivered }))
420 Status = DeliveryStatus.Delivered }))
423− | Some(DeliveryAck(_, ackIds)) ->
421+ | Some(DeliveryAck ackIds) ->
424 Ok(IncomingDeliveryAck(senderHex, ackIds))
422 Ok(IncomingDeliveryAck(senderHex, ackIds))
425− | Some(ProfileMessage(_, profile)) ->
423+ | Some(ProfileMessage profile) ->
426 Ok(IncomingProfile(senderHex, profile))
424 Ok(IncomingProfile(senderHex, profile))
427 | None -> Error "unknown envelope type"
425 | None -> Error "unknown envelope type"
428 | None -> Error "decrypt failed"
426 | None -> Error "decrypt failed"
@@ -438,7 +436,7 @@ module App =
438 |> List.map (fun (sender, pairs) -> sender, List.map snd pairs)
436 |> List.map (fun (sender, pairs) -> sender, List.map snd pairs)
439
437
440 for sender, msgIds in chatsBySender do
438 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
442 with _ -> ()
440 with _ -> ()
443 }
441 }
444
442
@@ -506,11 +504,7 @@ module App =
506 asyncCmd (async {
504 asyncCmd (async {
507 match! Store.loadIdentity () with
505 match! Store.loadIdentity () with
508 | Some id ->
506 | Some id ->
509− let profile = Store.loadProfile ()
510− return StateLoaded(
507+ return StateLoaded(Loaded(id, Store.loadData (), Store.loadProfile ()))
511− match Store.loadData () with
512− | Some data -> IdentityAndData(id, data, profile)
513− | None -> IdentityOnly(id, profile))
514 | None -> return StateLoaded NothingSaved
508 | None -> return StateLoaded NothingSaved
515 })
509 })
516
510
@@ -542,7 +536,7 @@ module App =
542 Cmd.ofEffect (fun _ ->
536 Cmd.ofEffect (fun _ ->
543 async {
537 async {
544 for recipientHex in recipientHexes do
538 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
546 with _ -> ()
540 with _ -> ()
547 } |> Async.Start)
541 } |> Async.Start)
548
542
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 @@
166 </data>
166 </data>
167 <key>Skrepka.dll</key>
167 <key>Skrepka.dll</key>
168 <data>
168 <data>
169− zm59/PSrWKZiLU1jxPLjSpv2s0s=
169+ OjZtkz0VbSsZAPLqo/EwqAhSduU=
170 </data>
170 </data>
171 <key>Skrepka.pdb</key>
171 <key>Skrepka.pdb</key>
172 <data>
172 <data>
173− 9JiX44lGMitB4IFkSrPpNqppv9Y=
173+ 288OaA4YI1RkDT0OJaEP/3YzPMc=
174 </data>
174 </data>
175 <key>Sodium.Core.dll</key>
175 <key>Sodium.Core.dll</key>
176 <data>
176 <data>
@@ -1393,14 +1393,14 @@
1393 <dict>
1393 <dict>
1394 <key>hash2</key>
1394 <key>hash2</key>
1395 <data>
1395 <data>
1396− yDZ9r78oz/SwMDjgSqMWBuIABfcf+pqLJmP3a/t/3qA=
1396+ GATWVaegaBDKB/p62UIV/s9+8HLonMfOJQDIur7CkO8=
1397 </data>
1397 </data>
1398 </dict>
1398 </dict>
1399 <key>Skrepka.pdb</key>
1399 <key>Skrepka.pdb</key>
1400 <dict>
1400 <dict>
1401 <key>hash2</key>
1401 <key>hash2</key>
1402 <data>
1402 <data>
1403− Bne0biQx+iOwUvETBgS0ZpBPnqj9iMIcJsbMtjEGsB8=
1403+ xqtzoyoQh4wNTDI5bDqxqXQt8uNenDqsbW18iqrMsVs=
1404 </data>
1404 </data>
1405 </dict>
1405 </dict>
1406 <key>Sodium.Core.dll</key>
1406 <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 @@
251 <dict>
251 <dict>
252 <key>hash2</key>
252 <key>hash2</key>
253 <data>
253 <data>
254− /muL9+VQW3p0CxjUNmMSZit0d+SjXG5P0rlAa3orDmo=
254+ p4a7Jz8sihEyuUmS+Y+uK2NzEHAlqdpvMP8DN36P+GY=
255 </data>
255 </data>
256 </dict>
256 </dict>
257 <key>MonoBundle/Skrepka.pdb</key>
257 <key>MonoBundle/Skrepka.pdb</key>
258 <dict>
258 <dict>
259 <key>hash2</key>
259 <key>hash2</key>
260 <data>
260 <data>
261− SGyPeKxWxldHdxyu67USmcmURx0ELpgiV7C4wpDifcU=
261+ pmSRC/TvVv/BifxqaC+vH+uL3c1xcWkV07N+dOnKDCw=
262 </data>
262 </data>
263 </dict>
263 </dict>
264 <key>MonoBundle/Sodium.Core.dll</key>
264 <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
10[<assembly: System.Reflection.AssemblyCompanyAttribute("Skrepka")>]
10[<assembly: System.Reflection.AssemblyCompanyAttribute("Skrepka")>]
11[<assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")>]
11[<assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")>]
12[<assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")>]
12[<assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")>]
13−[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+7b4b58d8a12eba7ce8c31b169029ead687ed7426")>]
13+[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+c2421eb18cd299aa1aa49d08e6aac0aff8c6c2b0")>]
14[<assembly: System.Reflection.AssemblyProductAttribute("Skrepka")>]
14[<assembly: System.Reflection.AssemblyProductAttribute("Skrepka")>]
15[<assembly: System.Reflection.AssemblyTitleAttribute("Skrepka")>]
15[<assembly: System.Reflection.AssemblyTitleAttribute("Skrepka")>]
16[<assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")>]
16[<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 @@
334/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.genruntimeconfig.cache
334/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.genruntimeconfig.cache
335/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/ref/Skrepka.dll
335/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/ref/Skrepka.dll
336/Users/iko/Developer/skrepka/client/bin/Debug/net10.0-ios/iossimulator-arm64/LiteDB.dll
336/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
10[<assembly: System.Reflection.AssemblyCompanyAttribute("Skrepka")>]
10[<assembly: System.Reflection.AssemblyCompanyAttribute("Skrepka")>]
11[<assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")>]
11[<assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")>]
12[<assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")>]
12[<assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")>]
13−[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+7b4b58d8a12eba7ce8c31b169029ead687ed7426")>]
13+[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+c2421eb18cd299aa1aa49d08e6aac0aff8c6c2b0")>]
14[<assembly: System.Reflection.AssemblyProductAttribute("Skrepka")>]
14[<assembly: System.Reflection.AssemblyProductAttribute("Skrepka")>]
15[<assembly: System.Reflection.AssemblyTitleAttribute("Skrepka")>]
15[<assembly: System.Reflection.AssemblyTitleAttribute("Skrepka")>]
16[<assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")>]
16[<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
42offlineGossipMinTtl : Int<S>
42offlineGossipMinTtl : Int<S>
43offlineGossipMinTtl = 60 -- minimum TTL for offline gossip events
43offlineGossipMinTtl = 60 -- minimum TTL for offline gossip events
44maxForwardRetriesPerServer = 100
44maxForwardRetriesPerServer = 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
45federationEnabled = federationSecret != ""
51federationEnabled = federationSecret != ""
46federationAuth = "Bearer " ++ federationSecret
52federationAuth = "Bearer " ++ federationSecret
47federationUrl = \server -> federationScheme ++ server
53federationUrl = \server -> federationScheme ++ server
@@ -598,7 +604,7 @@ broadcastOfflineGossip = \t peerServers expiredLocal ->
598 p <- expiredLocal
604 p <- expiredLocal
599 let ttl = clamp offlineGossipMinTtl maxPresenceTtl ((p.expiresAt - p.timestamp) / 1000)
605 let ttl = clamp offlineGossipMinTtl maxPresenceTtl ((p.expiresAt - p.timestamp) / 1000)
600 yield {eventType: GossipOffline {}, pubkey: p.pubkey, server: serverHostN, timestamp: p.expiresAt, ttl: ttl})
606 yield {eventType: GossipOffline {}, pubkey: p.pubkey, server: serverHostN, timestamp: p.expiresAt, ttl: ttl})
601− sendBatchedGossip peerServers gossipEvents 2)
607+ sendBatchedGossip peerServers gossipEvents gossipOriginHops)
602
608
603forkBroadcastOffline = \t result ->
609forkBroadcastOffline = \t result ->
604 fork (broadcastOfflineGossip t result.peerServers result.expiredLocal)
610 fork (broadcastOfflineGossip t result.peerServers result.expiredLocal)
@@ -798,13 +804,13 @@ serve = \req -> case req of
798 let expiredLocal = do p <- result.pr.expiredLocal; where p.pubkey != pubkey; yield p
804 let expiredLocal = do p <- result.pr.expiredLocal; where p.pubkey != pubkey; yield p
799 fork (do
805 fork (do
800 when federationEnabled
806 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)
802 broadcastOfflineGossip t result.pr.peerServers expiredLocal)
808 broadcastOfflineGossip t result.pr.peerServers expiredLocal)
803 yield (respond {token: token, expiresAt: expiry})
809 yield (respond {token: token, expiresAt: expiry})
804
810
805 Poll {cursor, timeout, authorization, respond} -> do
811 Poll {cursor, timeout, authorization, respond} -> do
806 t <- now
812 t <- now
807− let clampedTimeout = clamp 0 60000 timeout
813+ let clampedTimeout = clamp 0 maxPollTimeout timeout
808 let deadline = t + clampedTimeout
814 let deadline = t + clampedTimeout
809 let token = extractToken authorization
815 let token = extractToken authorization
810 result <- pollLoop token cursor deadline
816 result <- pollLoop token cursor deadline
@@ -862,8 +868,7 @@ serve = \req -> case req of
862 case status of
868 case status of
863 MsQueued {} -> println ("sendMessage: forwards at capacity (" ++ show maxForwardsEntries ++ "), skipping forward tracking")
869 MsQueued {} -> println ("sendMessage: forwards at capacity (" ++ show maxForwardsEntries ++ "), skipping forward tracking")
864 _ -> yield {})
870 _ -> yield {})
865− SendUnauthorized {} -> yield {}
866− SendRejected {} -> yield {}
871+ _ -> yield {}
867 broadcastOfflineGossip t result.pr.peerServers result.pr.expiredLocal)
872 broadcastOfflineGossip t result.pr.peerServers result.pr.expiredLocal)
868 yield (case result.send of
873 yield (case result.send of
869 SendUnauthorized {} -> respond {status: MsUnauthorized {}, messageId: ""}
874 SendUnauthorized {} -> respond {status: MsUnauthorized {}, messageId: ""}
@@ -922,8 +927,7 @@ serve = \req -> case req of
922 where p.pubkey == pubkey && p.expiresAt > t
927 where p.pubkey == pubkey && p.expiresAt > t
923 yield p
928 yield p
924 let localOnline = any valid (\p -> p.server == serverHostN)
929 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
927 let foundServer = if localOnline then serverHostN else bestRemote
931 let foundServer = if localOnline then serverHostN else bestRemote
928 yield {pr: pr, lookup: LookupDone {server: foundServer}}
932 yield {pr: pr, lookup: LookupDone {server: foundServer}}
929 forkBroadcastOffline t result.pr
933 forkBroadcastOffline t result.pr
@@ -934,7 +938,7 @@ serve = \req -> case req of
934 RecvGossip {events, hopsRemaining, fromServer, authorization, respond} -> do
938 RecvGossip {events, hopsRemaining, fromServer, authorization, respond} -> do
935 t <- now
939 t <- now
936 let authorized = verifyFederationAuth authorization
940 let authorized = verifyFederationAuth authorization
937− let cappedHops = clamp 0 5 hopsRemaining
941+ let cappedHops = clamp 0 maxGossipHops hopsRemaining
938 if not authorized || cappedHops < 1 || fromServer == serverHostN || count events > maxGossipEvents
942 if not authorized || cappedHops < 1 || fromServer == serverHostN || count events > maxGossipEvents
939 then rejectFederation t respond
943 then rejectFederation t respond
940 else do
944 else do
@@ -1003,7 +1007,7 @@ serve = \req -> case req of
1003 encryptedBlob: encryptedBlob, timestamp: clampedTs, origin: FederatedOrigin {server: originServer}, receivedAt: seqTs}]
1007 encryptedBlob: encryptedBlob, timestamp: clampedTs, origin: FederatedOrigin {server: originServer}, receivedAt: seqTs}]
1004 yield {pr: pr, forward: ForwardStored {}}
1008 yield {pr: pr, forward: ForwardStored {}}
1005 forkBroadcastOffline t result.pr
1009 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 {}})
1007
1011
1008 FederationAck {messageIds, originServer, fromServer, authorization, respond} -> do
1012 FederationAck {messageIds, originServer, fromServer, authorization, respond} -> do
1009 t <- now
1013 t <- now
@@ -1034,7 +1038,7 @@ serve = \req -> case req of
1034-- ============================================
1038-- ============================================
1035
1039
1036backgroundPrune = do
1040backgroundPrune = do
1037− sleep 30000
1041+ sleep backgroundPruneInterval
1038 t <- now
1042 t <- now
1039 pruneAndRetry t
1043 pruneAndRetry t
1040 fork backgroundPrune
1044 fork backgroundPrune