on master help sign in
Improve type safety and simplify server: add DeliveryStatus type, extract isLocalServer predicate
commit5df6e95df9ea5612efd197a45f76769b5039dc65 authoriko <mail@iko.soy> dateSat 11 Apr 2026, 15:39 (6 months ago) parent13fba34
29 files changed+1292−136
client/ApiClient.fs+18−43 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.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 client/obj/Skrepka.fsproj.nuget.dgspec.json+3 client/obj/project.assets.json+1238−63 client/obj/project.nuget.cache+1−1 server.knot+20−17
client/ApiClient.fs+18−43
@@ -29,40 +29,9 @@ module ApiClient =
2929 [<CLIMutable>]
3030 type PollEvent = { Id: string; EventType: EventType; Payload: EventPayload }
3131
32− [<JsonConverter(typeof<MessageStatusConverter>)>]
33− type MessageStatus = Delivered | Federated | Queued | Rejected | Unauthorized | UnknownStatus of string
34− and private MessageStatusConverter() =
35− inherit JsonConverter<MessageStatus>()
36− override _.Read(reader, _, _) =
37− match reader.GetString() with
38− | "delivered" -> Delivered
39− | "federated" -> Federated
40− | "queued" -> Queued
41− | "rejected" -> Rejected
42− | "unauthorized" -> Unauthorized
43− | s -> UnknownStatus s
44− override _.Write(writer, value, _) =
45− writer.WriteStringValue(
46− match value with
47− | Delivered -> "delivered"
48− | Federated -> "federated"
49− | Queued -> "queued"
50− | Rejected -> "rejected"
51− | Unauthorized -> "unauthorized"
52− | UnknownStatus s -> s)
53−
54− [<CLIMutable>]
55− type private SendResult = { Status: MessageStatus }
56−
5732 [<CLIMutable>]
5833 type PollResponse = { Cursor: int64; Events: PollEvent array }
5934
60− [<CLIMutable>]
61− type private ChallengeResponse = { challenge: string }
62−
63− [<CLIMutable>]
64− type private VerifyResponse = { token: string }
65−
6635 /// Awaits a Task without converting TaskCanceledException to F# async
6736 /// cancellation (which bypasses try...with). Re-raises it as a regular exception.
6837 let private awaitTask (t: Task<'T>) : Async<'T> =
@@ -105,26 +74,32 @@ module ApiClient =
10574 return JsonSerializer.Deserialize<'T>(text, jsonOpts)
10675 }
10776
77+ let private getString (text: string) (prop: string) =
78+ use doc = JsonDocument.Parse(text)
79+ doc.RootElement.GetProperty(prop).GetString()
80+
10881 let authenticate (serverUrl: string) (identity: Crypto.Identity) =
10982 async {
11083 let body = JsonSerializer.Serialize({| pubkey = identity.PubKeyHex |})
111− let! resp = postJson<ChallengeResponse> client $"{serverUrl}/auth/challenge" body None
112− let sigHex = Crypto.signChallenge identity.PrivKey resp.challenge
113− let body = JsonSerializer.Serialize({| pubkey = identity.PubKeyHex; challenge = resp.challenge; signature = sigHex |})
114− let! resp = postJson<VerifyResponse> client $"{serverUrl}/auth/verify" body None
115− if String.IsNullOrEmpty(resp.token) then failwith "Authentication rejected by server"
116− return resp.token
84+ let! text = sendRequest client $"{serverUrl}/auth/challenge" body None
85+ let challenge = getString text "challenge"
86+ let sigHex = Crypto.signChallenge identity.PrivKey challenge
87+ let body = JsonSerializer.Serialize({| pubkey = identity.PubKeyHex; challenge = challenge; signature = sigHex |})
88+ let! text = sendRequest client $"{serverUrl}/auth/verify" body None
89+ let token = getString text "token"
90+ if String.IsNullOrEmpty(token) then failwith "Authentication rejected by server"
91+ return token
11792 }
11893
11994 let sendMessage (serverUrl: string) (token: string) (toHex: string) (blobHex: string) (timestamp: int64) =
12095 let body = JsonSerializer.Serialize({| ``to`` = toHex; encryptedBlob = blobHex; timestamp = timestamp |})
12196 async {
122− let! result = postJson<SendResult> client $"{serverUrl}/messages" body (Some token)
123− match result.Status with
124− | Delivered | Federated | Queued -> ()
125− | Rejected -> failwith "Message rejected by server"
126− | Unauthorized -> failwith "Not authorized to deliver message"
127− | UnknownStatus s -> failwith $"Unexpected status: {s}"
97+ let! text = sendRequest client $"{serverUrl}/messages" body (Some token)
98+ match getString text "status" with
99+ | "delivered" | "federated" | "queued" -> ()
100+ | "rejected" -> failwith "Message rejected by server"
101+ | "unauthorized" -> failwith "Not authorized to deliver message"
102+ | s -> failwith $"Unexpected status: {s}"
128103 }
129104
130105 let poll (serverUrl: string) (token: string) (cursor: int64) =
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− CVxF8wyk0z3J28KIFnEY6UjWNJI=
169+ aXUF2yqciArDUpIG8FWUZMDCA1I=
170170 </data>
171171 <key>Skrepka.pdb</key>
172172 <data>
173− G7nf25PmZnCBg5i1vZYRnqmejdc=
173+ 0n3E0Wq5iRv4YZ97OD9CsFBxP7w=
174174 </data>
175175 <key>Sodium.Core.dll</key>
176176 <data>
@@ -1393,14 +1393,14 @@
13931393 <dict>
13941394 <key>hash2</key>
13951395 <data>
1396− 8HBXEBvFZVoHcetj8atOdmzoBkDu0SNC+Vkh/V/BwPg=
1396+ UGHZWuVltZrNwVaYJ/N9owIgazB1eG0KCdfWAzXXaeg=
13971397 </data>
13981398 </dict>
13991399 <key>Skrepka.pdb</key>
14001400 <dict>
14011401 <key>hash2</key>
14021402 <data>
1403− FssxM3lPIPLJE+kwOrOMkmtxBhrZd/URY71MZtiAT9Q=
1403+ UpSY8oED9rpyHBTZgMHBlVoUdZJQYv8rFhpAlYw8uxk=
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− uu2JUNh2BV4Cx+DaGDT6+qwp5+CZ+rHHPcnDibLYIM4=
254+ 3LcdsLfdVYuDBW0ymTQh3rdGiQHcuX7ODuir5wWC31E=
255255 </data>
256256 </dict>
257257 <key>MonoBundle/Skrepka.pdb</key>
258258 <dict>
259259 <key>hash2</key>
260260 <data>
261− BgzRedMZeH7jNYuTzL20RHyUSWyA5RU9R0efsBMush8=
261+ lRWXRbB8uj3FbCIrO8gezrJOD9pFheKChVU0l3hAUww=
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+a348d96d7bb6d2123f0741a7188de45ed302a2b5")>]
13+[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+13fba34bce3f96385873f0ca187ae06eb3948ede")>]
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−c92865f901e6343a5442debcd3534cfae1be9b5fb5c9e182cd1bad60a00a4f3b
1+4c5fb9e930282efdfc08d13cf8523ae2e9407e25f7ae4d0f31c1a689a8d11501
client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.dll

Binary file not shown.

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/a348d96d7bb6d2123f0741a7188de45ed302a2b5/*"}}
1+{"documents":{"/Users/iko/Developer/skrepka/*":"https://raw.githubusercontent.com/ilyakooo0/skrepka/13fba34bce3f96385873f0ca187ae06eb3948ede/*"}}
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+a348d96d7bb6d2123f0741a7188de45ed302a2b5")>]
13+[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+13fba34bce3f96385873f0ca187ae06eb3948ede")>]
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−9858fc240e530aa6ce9a9ad38155bf1d2ac5ae1aab3edf0a2875dde7ceae7f88
1+bf686c8aa53e2b74b728dc8168a09d41edb321c94ecbe8bf4e3e21c20a8edd68
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/a348d96d7bb6d2123f0741a7188de45ed302a2b5/*"}}
1+{"documents":{"/Users/iko/Developer/skrepka/*":"https://raw.githubusercontent.com/ilyakooo0/skrepka/13fba34bce3f96385873f0ca187ae06eb3948ede/*"}}
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.

client/obj/Skrepka.fsproj.nuget.dgspec.json+3
@@ -717,6 +717,9 @@
717717 "runtimes": {
718718 "iossimulator-arm64": {
719719 "#import": []
720+ },
721+ "maccatalyst-arm64": {
722+ "#import": []
720723 }
721724 }
722725 }
client/obj/project.assets.json+1238−63
@@ -1232,6 +1232,592 @@
12321232 }
12331233 }
12341234 },
1235+ "net10.0-ios26.2/maccatalyst-arm64": {
1236+ "Fabulous/3.0.0-pre23": {
1237+ "type": "package",
1238+ "dependencies": {
1239+ "FSharp.Core": "8.0.300"
1240+ },
1241+ "compile": {
1242+ "lib/net8.0/Fabulous.dll": {
1243+ "related": ".xml"
1244+ }
1245+ },
1246+ "runtime": {
1247+ "lib/net8.0/Fabulous.dll": {
1248+ "related": ".xml"
1249+ }
1250+ }
1251+ },
1252+ "Fabulous.MauiControls/9.0.0-pre9": {
1253+ "type": "package",
1254+ "dependencies": {
1255+ "Fabulous": "3.0.0-pre23",
1256+ "Microsoft.Maui.Controls": "9.0.0",
1257+ "Microsoft.Maui.Controls.Compatibility": "9.0.0"
1258+ },
1259+ "compile": {
1260+ "lib/net9.0/Fabulous.MauiControls.dll": {
1261+ "related": ".xml"
1262+ }
1263+ },
1264+ "runtime": {
1265+ "lib/net9.0/Fabulous.MauiControls.dll": {
1266+ "related": ".xml"
1267+ }
1268+ }
1269+ },
1270+ "FSharp.Core/9.0.100": {
1271+ "type": "package",
1272+ "compile": {
1273+ "lib/netstandard2.1/FSharp.Core.dll": {
1274+ "related": ".xml"
1275+ }
1276+ },
1277+ "runtime": {
1278+ "lib/netstandard2.1/FSharp.Core.dll": {
1279+ "related": ".xml"
1280+ }
1281+ },
1282+ "resource": {
1283+ "lib/netstandard2.1/cs/FSharp.Core.resources.dll": {
1284+ "locale": "cs"
1285+ },
1286+ "lib/netstandard2.1/de/FSharp.Core.resources.dll": {
1287+ "locale": "de"
1288+ },
1289+ "lib/netstandard2.1/es/FSharp.Core.resources.dll": {
1290+ "locale": "es"
1291+ },
1292+ "lib/netstandard2.1/fr/FSharp.Core.resources.dll": {
1293+ "locale": "fr"
1294+ },
1295+ "lib/netstandard2.1/it/FSharp.Core.resources.dll": {
1296+ "locale": "it"
1297+ },
1298+ "lib/netstandard2.1/ja/FSharp.Core.resources.dll": {
1299+ "locale": "ja"
1300+ },
1301+ "lib/netstandard2.1/ko/FSharp.Core.resources.dll": {
1302+ "locale": "ko"
1303+ },
1304+ "lib/netstandard2.1/pl/FSharp.Core.resources.dll": {
1305+ "locale": "pl"
1306+ },
1307+ "lib/netstandard2.1/pt-BR/FSharp.Core.resources.dll": {
1308+ "locale": "pt-BR"
1309+ },
1310+ "lib/netstandard2.1/ru/FSharp.Core.resources.dll": {
1311+ "locale": "ru"
1312+ },
1313+ "lib/netstandard2.1/tr/FSharp.Core.resources.dll": {
1314+ "locale": "tr"
1315+ },
1316+ "lib/netstandard2.1/zh-Hans/FSharp.Core.resources.dll": {
1317+ "locale": "zh-Hans"
1318+ },
1319+ "lib/netstandard2.1/zh-Hant/FSharp.Core.resources.dll": {
1320+ "locale": "zh-Hant"
1321+ }
1322+ }
1323+ },
1324+ "libsodium/1.0.20.1": {
1325+ "type": "package",
1326+ "native": {
1327+ "runtimes/maccatalyst-arm64/native/libsodium.a": {}
1328+ }
1329+ },
1330+ "LiteDB/5.0.21": {
1331+ "type": "package",
1332+ "compile": {
1333+ "lib/netstandard2.0/LiteDB.dll": {
1334+ "related": ".xml"
1335+ }
1336+ },
1337+ "runtime": {
1338+ "lib/netstandard2.0/LiteDB.dll": {
1339+ "related": ".xml"
1340+ }
1341+ }
1342+ },
1343+ "Microsoft.Extensions.Configuration/10.0.0": {
1344+ "type": "package",
1345+ "dependencies": {
1346+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.0",
1347+ "Microsoft.Extensions.Primitives": "10.0.0"
1348+ },
1349+ "compile": {
1350+ "lib/net10.0/Microsoft.Extensions.Configuration.dll": {
1351+ "related": ".xml"
1352+ }
1353+ },
1354+ "runtime": {
1355+ "lib/net10.0/Microsoft.Extensions.Configuration.dll": {
1356+ "related": ".xml"
1357+ }
1358+ },
1359+ "build": {
1360+ "buildTransitive/net8.0/_._": {}
1361+ }
1362+ },
1363+ "Microsoft.Extensions.Configuration.Abstractions/10.0.0": {
1364+ "type": "package",
1365+ "dependencies": {
1366+ "Microsoft.Extensions.Primitives": "10.0.0"
1367+ },
1368+ "compile": {
1369+ "lib/net10.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
1370+ "related": ".xml"
1371+ }
1372+ },
1373+ "runtime": {
1374+ "lib/net10.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
1375+ "related": ".xml"
1376+ }
1377+ },
1378+ "build": {
1379+ "buildTransitive/net8.0/_._": {}
1380+ }
1381+ },
1382+ "Microsoft.Extensions.DependencyInjection/10.0.0": {
1383+ "type": "package",
1384+ "dependencies": {
1385+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0"
1386+ },
1387+ "compile": {
1388+ "lib/net10.0/Microsoft.Extensions.DependencyInjection.dll": {
1389+ "related": ".xml"
1390+ }
1391+ },
1392+ "runtime": {
1393+ "lib/net10.0/Microsoft.Extensions.DependencyInjection.dll": {
1394+ "related": ".xml"
1395+ }
1396+ },
1397+ "build": {
1398+ "buildTransitive/net8.0/_._": {}
1399+ }
1400+ },
1401+ "Microsoft.Extensions.DependencyInjection.Abstractions/10.0.0": {
1402+ "type": "package",
1403+ "compile": {
1404+ "lib/net10.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
1405+ "related": ".xml"
1406+ }
1407+ },
1408+ "runtime": {
1409+ "lib/net10.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
1410+ "related": ".xml"
1411+ }
1412+ },
1413+ "build": {
1414+ "buildTransitive/net8.0/_._": {}
1415+ }
1416+ },
1417+ "Microsoft.Extensions.Diagnostics.Abstractions/10.0.0": {
1418+ "type": "package",
1419+ "dependencies": {
1420+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0",
1421+ "Microsoft.Extensions.Options": "10.0.0"
1422+ },
1423+ "compile": {
1424+ "lib/net10.0/Microsoft.Extensions.Diagnostics.Abstractions.dll": {
1425+ "related": ".xml"
1426+ }
1427+ },
1428+ "runtime": {
1429+ "lib/net10.0/Microsoft.Extensions.Diagnostics.Abstractions.dll": {
1430+ "related": ".xml"
1431+ }
1432+ },
1433+ "build": {
1434+ "buildTransitive/net8.0/_._": {}
1435+ }
1436+ },
1437+ "Microsoft.Extensions.FileProviders.Abstractions/10.0.0": {
1438+ "type": "package",
1439+ "dependencies": {
1440+ "Microsoft.Extensions.Primitives": "10.0.0"
1441+ },
1442+ "compile": {
1443+ "lib/net10.0/Microsoft.Extensions.FileProviders.Abstractions.dll": {
1444+ "related": ".xml"
1445+ }
1446+ },
1447+ "runtime": {
1448+ "lib/net10.0/Microsoft.Extensions.FileProviders.Abstractions.dll": {
1449+ "related": ".xml"
1450+ }
1451+ },
1452+ "build": {
1453+ "buildTransitive/net8.0/_._": {}
1454+ }
1455+ },
1456+ "Microsoft.Extensions.Hosting.Abstractions/10.0.0": {
1457+ "type": "package",
1458+ "dependencies": {
1459+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.0",
1460+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0",
1461+ "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.0",
1462+ "Microsoft.Extensions.FileProviders.Abstractions": "10.0.0",
1463+ "Microsoft.Extensions.Logging.Abstractions": "10.0.0"
1464+ },
1465+ "compile": {
1466+ "lib/net10.0/Microsoft.Extensions.Hosting.Abstractions.dll": {
1467+ "related": ".xml"
1468+ }
1469+ },
1470+ "runtime": {
1471+ "lib/net10.0/Microsoft.Extensions.Hosting.Abstractions.dll": {
1472+ "related": ".xml"
1473+ }
1474+ },
1475+ "build": {
1476+ "buildTransitive/net8.0/_._": {}
1477+ }
1478+ },
1479+ "Microsoft.Extensions.Logging/10.0.0": {
1480+ "type": "package",
1481+ "dependencies": {
1482+ "Microsoft.Extensions.DependencyInjection": "10.0.0",
1483+ "Microsoft.Extensions.Logging.Abstractions": "10.0.0",
1484+ "Microsoft.Extensions.Options": "10.0.0"
1485+ },
1486+ "compile": {
1487+ "lib/net10.0/Microsoft.Extensions.Logging.dll": {
1488+ "related": ".xml"
1489+ }
1490+ },
1491+ "runtime": {
1492+ "lib/net10.0/Microsoft.Extensions.Logging.dll": {
1493+ "related": ".xml"
1494+ }
1495+ },
1496+ "build": {
1497+ "buildTransitive/net8.0/_._": {}
1498+ }
1499+ },
1500+ "Microsoft.Extensions.Logging.Abstractions/10.0.0": {
1501+ "type": "package",
1502+ "dependencies": {
1503+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0"
1504+ },
1505+ "compile": {
1506+ "lib/net10.0/Microsoft.Extensions.Logging.Abstractions.dll": {
1507+ "related": ".xml"
1508+ }
1509+ },
1510+ "runtime": {
1511+ "lib/net10.0/Microsoft.Extensions.Logging.Abstractions.dll": {
1512+ "related": ".xml"
1513+ }
1514+ },
1515+ "build": {
1516+ "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets": {}
1517+ }
1518+ },
1519+ "Microsoft.Extensions.Options/10.0.0": {
1520+ "type": "package",
1521+ "dependencies": {
1522+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0",
1523+ "Microsoft.Extensions.Primitives": "10.0.0"
1524+ },
1525+ "compile": {
1526+ "lib/net10.0/Microsoft.Extensions.Options.dll": {
1527+ "related": ".xml"
1528+ }
1529+ },
1530+ "runtime": {
1531+ "lib/net10.0/Microsoft.Extensions.Options.dll": {
1532+ "related": ".xml"
1533+ }
1534+ },
1535+ "build": {
1536+ "buildTransitive/net8.0/Microsoft.Extensions.Options.targets": {}
1537+ }
1538+ },
1539+ "Microsoft.Extensions.Primitives/10.0.0": {
1540+ "type": "package",
1541+ "compile": {
1542+ "lib/net10.0/Microsoft.Extensions.Primitives.dll": {
1543+ "related": ".xml"
1544+ }
1545+ },
1546+ "runtime": {
1547+ "lib/net10.0/Microsoft.Extensions.Primitives.dll": {
1548+ "related": ".xml"
1549+ }
1550+ },
1551+ "build": {
1552+ "buildTransitive/net8.0/_._": {}
1553+ }
1554+ },
1555+ "Microsoft.Maui.Controls/10.0.0": {
1556+ "type": "package",
1557+ "dependencies": {
1558+ "Microsoft.Maui.Controls.Build.Tasks": "10.0.0",
1559+ "Microsoft.Maui.Controls.Core": "10.0.0",
1560+ "Microsoft.Maui.Controls.Xaml": "10.0.0",
1561+ "Microsoft.Maui.Resizetizer": "10.0.0"
1562+ }
1563+ },
1564+ "Microsoft.Maui.Controls.Build.Tasks/10.0.0": {
1565+ "type": "package",
1566+ "dependencies": {
1567+ "Microsoft.Maui.Controls.Core": "10.0.0",
1568+ "Microsoft.Maui.Controls.Xaml": "10.0.0"
1569+ },
1570+ "build": {
1571+ "buildTransitive/net6.0-ios10.0/Microsoft.Maui.Controls.Build.Tasks.props": {},
1572+ "buildTransitive/net6.0-ios10.0/Microsoft.Maui.Controls.Build.Tasks.targets": {}
1573+ }
1574+ },
1575+ "Microsoft.Maui.Controls.Compatibility/9.0.0": {
1576+ "type": "package",
1577+ "dependencies": {
1578+ "Microsoft.Extensions.Configuration": "9.0.0",
1579+ "Microsoft.Extensions.Logging.Abstractions": "9.0.0",
1580+ "Microsoft.Maui.Controls.Core": "9.0.0",
1581+ "Microsoft.Maui.Controls.Xaml": "9.0.0"
1582+ },
1583+ "compile": {
1584+ "lib/net9.0-ios18.0/Microsoft.Maui.Controls.Compatibility.dll": {
1585+ "related": ".pdb;.xml"
1586+ }
1587+ },
1588+ "runtime": {
1589+ "lib/net9.0-ios18.0/Microsoft.Maui.Controls.Compatibility.dll": {
1590+ "related": ".pdb;.xml"
1591+ }
1592+ }
1593+ },
1594+ "Microsoft.Maui.Controls.Core/10.0.0": {
1595+ "type": "package",
1596+ "dependencies": {
1597+ "Microsoft.Extensions.Configuration": "10.0.0",
1598+ "Microsoft.Extensions.DependencyInjection": "10.0.0",
1599+ "Microsoft.Extensions.Logging": "10.0.0",
1600+ "Microsoft.Extensions.Logging.Abstractions": "10.0.0",
1601+ "Microsoft.Maui.Core": "10.0.0"
1602+ },
1603+ "compile": {
1604+ "lib/net10.0-ios26.0/Microsoft.Maui.Controls.dll": {
1605+ "related": ".pdb;.xml"
1606+ }
1607+ },
1608+ "runtime": {
1609+ "lib/net10.0-ios26.0/Microsoft.Maui.Controls.dll": {
1610+ "related": ".pdb;.xml"
1611+ }
1612+ },
1613+ "resource": {
1614+ "lib/net10.0-ios26.0/ar/Microsoft.Maui.Controls.resources.dll": {
1615+ "locale": "ar"
1616+ },
1617+ "lib/net10.0-ios26.0/ca/Microsoft.Maui.Controls.resources.dll": {
1618+ "locale": "ca"
1619+ },
1620+ "lib/net10.0-ios26.0/cs/Microsoft.Maui.Controls.resources.dll": {
1621+ "locale": "cs"
1622+ },
1623+ "lib/net10.0-ios26.0/da/Microsoft.Maui.Controls.resources.dll": {
1624+ "locale": "da"
1625+ },
1626+ "lib/net10.0-ios26.0/de/Microsoft.Maui.Controls.resources.dll": {
1627+ "locale": "de"
1628+ },
1629+ "lib/net10.0-ios26.0/el/Microsoft.Maui.Controls.resources.dll": {
1630+ "locale": "el"
1631+ },
1632+ "lib/net10.0-ios26.0/es/Microsoft.Maui.Controls.resources.dll": {
1633+ "locale": "es"
1634+ },
1635+ "lib/net10.0-ios26.0/fi/Microsoft.Maui.Controls.resources.dll": {
1636+ "locale": "fi"
1637+ },
1638+ "lib/net10.0-ios26.0/fr/Microsoft.Maui.Controls.resources.dll": {
1639+ "locale": "fr"
1640+ },
1641+ "lib/net10.0-ios26.0/he/Microsoft.Maui.Controls.resources.dll": {
1642+ "locale": "he"
1643+ },
1644+ "lib/net10.0-ios26.0/hi/Microsoft.Maui.Controls.resources.dll": {
1645+ "locale": "hi"
1646+ },
1647+ "lib/net10.0-ios26.0/hr/Microsoft.Maui.Controls.resources.dll": {
1648+ "locale": "hr"
1649+ },
1650+ "lib/net10.0-ios26.0/hu/Microsoft.Maui.Controls.resources.dll": {
1651+ "locale": "hu"
1652+ },
1653+ "lib/net10.0-ios26.0/id/Microsoft.Maui.Controls.resources.dll": {
1654+ "locale": "id"
1655+ },
1656+ "lib/net10.0-ios26.0/it/Microsoft.Maui.Controls.resources.dll": {
1657+ "locale": "it"
1658+ },
1659+ "lib/net10.0-ios26.0/ja/Microsoft.Maui.Controls.resources.dll": {
1660+ "locale": "ja"
1661+ },
1662+ "lib/net10.0-ios26.0/ko/Microsoft.Maui.Controls.resources.dll": {
1663+ "locale": "ko"
1664+ },
1665+ "lib/net10.0-ios26.0/ms/Microsoft.Maui.Controls.resources.dll": {
1666+ "locale": "ms"
1667+ },
1668+ "lib/net10.0-ios26.0/nb/Microsoft.Maui.Controls.resources.dll": {
1669+ "locale": "nb"
1670+ },
1671+ "lib/net10.0-ios26.0/nl/Microsoft.Maui.Controls.resources.dll": {
1672+ "locale": "nl"
1673+ },
1674+ "lib/net10.0-ios26.0/pl/Microsoft.Maui.Controls.resources.dll": {
1675+ "locale": "pl"
1676+ },
1677+ "lib/net10.0-ios26.0/pt-BR/Microsoft.Maui.Controls.resources.dll": {
1678+ "locale": "pt-BR"
1679+ },
1680+ "lib/net10.0-ios26.0/pt/Microsoft.Maui.Controls.resources.dll": {
1681+ "locale": "pt"
1682+ },
1683+ "lib/net10.0-ios26.0/ro/Microsoft.Maui.Controls.resources.dll": {
1684+ "locale": "ro"
1685+ },
1686+ "lib/net10.0-ios26.0/ru/Microsoft.Maui.Controls.resources.dll": {
1687+ "locale": "ru"
1688+ },
1689+ "lib/net10.0-ios26.0/sk/Microsoft.Maui.Controls.resources.dll": {
1690+ "locale": "sk"
1691+ },
1692+ "lib/net10.0-ios26.0/sv/Microsoft.Maui.Controls.resources.dll": {
1693+ "locale": "sv"
1694+ },
1695+ "lib/net10.0-ios26.0/th/Microsoft.Maui.Controls.resources.dll": {
1696+ "locale": "th"
1697+ },
1698+ "lib/net10.0-ios26.0/tr/Microsoft.Maui.Controls.resources.dll": {
1699+ "locale": "tr"
1700+ },
1701+ "lib/net10.0-ios26.0/uk/Microsoft.Maui.Controls.resources.dll": {
1702+ "locale": "uk"
1703+ },
1704+ "lib/net10.0-ios26.0/vi/Microsoft.Maui.Controls.resources.dll": {
1705+ "locale": "vi"
1706+ },
1707+ "lib/net10.0-ios26.0/zh-HK/Microsoft.Maui.Controls.resources.dll": {
1708+ "locale": "zh-HK"
1709+ },
1710+ "lib/net10.0-ios26.0/zh-Hans/Microsoft.Maui.Controls.resources.dll": {
1711+ "locale": "zh-Hans"
1712+ },
1713+ "lib/net10.0-ios26.0/zh-Hant/Microsoft.Maui.Controls.resources.dll": {
1714+ "locale": "zh-Hant"
1715+ }
1716+ }
1717+ },
1718+ "Microsoft.Maui.Controls.Xaml/10.0.0": {
1719+ "type": "package",
1720+ "dependencies": {
1721+ "Microsoft.Extensions.Configuration": "10.0.0",
1722+ "Microsoft.Maui.Controls.Core": "10.0.0",
1723+ "Microsoft.Maui.Core": "10.0.0"
1724+ },
1725+ "compile": {
1726+ "lib/net10.0-ios26.0/Microsoft.Maui.Controls.Xaml.dll": {
1727+ "related": ".pdb;.xml"
1728+ }
1729+ },
1730+ "runtime": {
1731+ "lib/net10.0-ios26.0/Microsoft.Maui.Controls.Xaml.dll": {
1732+ "related": ".pdb;.xml"
1733+ }
1734+ }
1735+ },
1736+ "Microsoft.Maui.Core/10.0.0": {
1737+ "type": "package",
1738+ "dependencies": {
1739+ "Microsoft.Extensions.Configuration": "10.0.0",
1740+ "Microsoft.Extensions.DependencyInjection": "10.0.0",
1741+ "Microsoft.Extensions.Hosting.Abstractions": "10.0.0",
1742+ "Microsoft.Extensions.Logging": "10.0.0",
1743+ "Microsoft.Extensions.Logging.Abstractions": "10.0.0",
1744+ "Microsoft.Maui.Essentials": "10.0.0",
1745+ "Microsoft.Maui.Graphics": "10.0.0"
1746+ },
1747+ "compile": {
1748+ "lib/net10.0-ios26.0/Microsoft.Maui.dll": {
1749+ "related": ".pdb;.xml"
1750+ }
1751+ },
1752+ "runtime": {
1753+ "lib/net10.0-ios26.0/Microsoft.Maui.dll": {
1754+ "related": ".pdb;.xml"
1755+ }
1756+ },
1757+ "build": {
1758+ "buildTransitive/Microsoft.Maui.Core.props": {},
1759+ "buildTransitive/Microsoft.Maui.Core.targets": {}
1760+ }
1761+ },
1762+ "Microsoft.Maui.Essentials/10.0.0": {
1763+ "type": "package",
1764+ "dependencies": {
1765+ "Microsoft.Maui.Graphics": "10.0.0"
1766+ },
1767+ "compile": {
1768+ "lib/net10.0-ios26.0/Microsoft.Maui.Essentials.dll": {
1769+ "related": ".pdb;.xml"
1770+ }
1771+ },
1772+ "runtime": {
1773+ "lib/net10.0-ios26.0/Microsoft.Maui.Essentials.dll": {
1774+ "related": ".pdb;.xml"
1775+ }
1776+ }
1777+ },
1778+ "Microsoft.Maui.Graphics/10.0.0": {
1779+ "type": "package",
1780+ "compile": {
1781+ "lib/net10.0-ios26.0/Microsoft.Maui.Graphics.dll": {
1782+ "related": ".pdb;.xml"
1783+ }
1784+ },
1785+ "runtime": {
1786+ "lib/net10.0-ios26.0/Microsoft.Maui.Graphics.dll": {
1787+ "related": ".pdb;.xml"
1788+ }
1789+ }
1790+ },
1791+ "Microsoft.Maui.Resizetizer/10.0.0": {
1792+ "type": "package",
1793+ "build": {
1794+ "buildTransitive/Microsoft.Maui.Resizetizer.props": {},
1795+ "buildTransitive/Microsoft.Maui.Resizetizer.targets": {}
1796+ }
1797+ },
1798+ "Microsoft.NET.ILLink.Tasks/10.0.5": {
1799+ "type": "package",
1800+ "build": {
1801+ "build/Microsoft.NET.ILLink.Tasks.props": {}
1802+ }
1803+ },
1804+ "Sodium.Core/1.4.0": {
1805+ "type": "package",
1806+ "dependencies": {
1807+ "libsodium": "[1.0.20.1, 1.0.21)"
1808+ },
1809+ "compile": {
1810+ "lib/net8.0-ios18.0/Sodium.Core.dll": {
1811+ "related": ".xml"
1812+ }
1813+ },
1814+ "runtime": {
1815+ "lib/net8.0-ios18.0/Sodium.Core.dll": {
1816+ "related": ".xml"
1817+ }
1818+ }
1819+ }
1820+ },
12351821 "net10.0-maccatalyst26.2": {
12361822 "Fabulous/3.0.0-pre23": {
12371823 "type": "package",
@@ -1323,67 +1909,653 @@
13231909 },
13241910 "libsodium/1.0.20.1": {
13251911 "type": "package",
1326− "runtimeTargets": {
1327− "runtimes/ios-arm64/native/libsodium.a": {
1328− "assetType": "native",
1329− "rid": "ios-arm64"
1330− },
1331− "runtimes/linux-arm/native/libsodium.so": {
1332− "assetType": "native",
1333− "rid": "linux-arm"
1334− },
1335− "runtimes/linux-arm64/native/libsodium.so": {
1336− "assetType": "native",
1337− "rid": "linux-arm64"
1338− },
1339− "runtimes/linux-musl-arm/native/libsodium.so": {
1340− "assetType": "native",
1341− "rid": "linux-musl-arm"
1342− },
1343− "runtimes/linux-musl-arm64/native/libsodium.so": {
1344− "assetType": "native",
1345− "rid": "linux-musl-arm64"
1346− },
1347− "runtimes/linux-musl-x64/native/libsodium.so": {
1348− "assetType": "native",
1349− "rid": "linux-musl-x64"
1350− },
1351− "runtimes/linux-x64/native/libsodium.so": {
1352− "assetType": "native",
1353− "rid": "linux-x64"
1354− },
1355− "runtimes/maccatalyst-arm64/native/libsodium.a": {
1356− "assetType": "native",
1357− "rid": "maccatalyst-arm64"
1358− },
1359− "runtimes/maccatalyst-x64/native/libsodium.a": {
1360− "assetType": "native",
1361− "rid": "maccatalyst-x64"
1362− },
1363− "runtimes/osx-arm64/native/libsodium.dylib": {
1364− "assetType": "native",
1365− "rid": "osx-arm64"
1366− },
1367− "runtimes/osx-x64/native/libsodium.dylib": {
1368− "assetType": "native",
1369− "rid": "osx-x64"
1370− },
1371− "runtimes/tvos-arm64/native/libsodium.a": {
1372− "assetType": "native",
1373− "rid": "tvos-arm64"
1374− },
1375− "runtimes/win-arm64/native/libsodium.dll": {
1376− "assetType": "native",
1377− "rid": "win-arm64"
1378− },
1379− "runtimes/win-x64/native/libsodium.dll": {
1380− "assetType": "native",
1381− "rid": "win-x64"
1382− },
1383− "runtimes/win-x86/native/libsodium.dll": {
1384− "assetType": "native",
1385− "rid": "win-x86"
1386− }
1912+ "runtimeTargets": {
1913+ "runtimes/ios-arm64/native/libsodium.a": {
1914+ "assetType": "native",
1915+ "rid": "ios-arm64"
1916+ },
1917+ "runtimes/linux-arm/native/libsodium.so": {
1918+ "assetType": "native",
1919+ "rid": "linux-arm"
1920+ },
1921+ "runtimes/linux-arm64/native/libsodium.so": {
1922+ "assetType": "native",
1923+ "rid": "linux-arm64"
1924+ },
1925+ "runtimes/linux-musl-arm/native/libsodium.so": {
1926+ "assetType": "native",
1927+ "rid": "linux-musl-arm"
1928+ },
1929+ "runtimes/linux-musl-arm64/native/libsodium.so": {
1930+ "assetType": "native",
1931+ "rid": "linux-musl-arm64"
1932+ },
1933+ "runtimes/linux-musl-x64/native/libsodium.so": {
1934+ "assetType": "native",
1935+ "rid": "linux-musl-x64"
1936+ },
1937+ "runtimes/linux-x64/native/libsodium.so": {
1938+ "assetType": "native",
1939+ "rid": "linux-x64"
1940+ },
1941+ "runtimes/maccatalyst-arm64/native/libsodium.a": {
1942+ "assetType": "native",
1943+ "rid": "maccatalyst-arm64"
1944+ },
1945+ "runtimes/maccatalyst-x64/native/libsodium.a": {
1946+ "assetType": "native",
1947+ "rid": "maccatalyst-x64"
1948+ },
1949+ "runtimes/osx-arm64/native/libsodium.dylib": {
1950+ "assetType": "native",
1951+ "rid": "osx-arm64"
1952+ },
1953+ "runtimes/osx-x64/native/libsodium.dylib": {
1954+ "assetType": "native",
1955+ "rid": "osx-x64"
1956+ },
1957+ "runtimes/tvos-arm64/native/libsodium.a": {
1958+ "assetType": "native",
1959+ "rid": "tvos-arm64"
1960+ },
1961+ "runtimes/win-arm64/native/libsodium.dll": {
1962+ "assetType": "native",
1963+ "rid": "win-arm64"
1964+ },
1965+ "runtimes/win-x64/native/libsodium.dll": {
1966+ "assetType": "native",
1967+ "rid": "win-x64"
1968+ },
1969+ "runtimes/win-x86/native/libsodium.dll": {
1970+ "assetType": "native",
1971+ "rid": "win-x86"
1972+ }
1973+ }
1974+ },
1975+ "LiteDB/5.0.21": {
1976+ "type": "package",
1977+ "compile": {
1978+ "lib/netstandard2.0/LiteDB.dll": {
1979+ "related": ".xml"
1980+ }
1981+ },
1982+ "runtime": {
1983+ "lib/netstandard2.0/LiteDB.dll": {
1984+ "related": ".xml"
1985+ }
1986+ }
1987+ },
1988+ "Microsoft.Extensions.Configuration/10.0.0": {
1989+ "type": "package",
1990+ "dependencies": {
1991+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.0",
1992+ "Microsoft.Extensions.Primitives": "10.0.0"
1993+ },
1994+ "compile": {
1995+ "lib/net10.0/Microsoft.Extensions.Configuration.dll": {
1996+ "related": ".xml"
1997+ }
1998+ },
1999+ "runtime": {
2000+ "lib/net10.0/Microsoft.Extensions.Configuration.dll": {
2001+ "related": ".xml"
2002+ }
2003+ },
2004+ "build": {
2005+ "buildTransitive/net8.0/_._": {}
2006+ }
2007+ },
2008+ "Microsoft.Extensions.Configuration.Abstractions/10.0.0": {
2009+ "type": "package",
2010+ "dependencies": {
2011+ "Microsoft.Extensions.Primitives": "10.0.0"
2012+ },
2013+ "compile": {
2014+ "lib/net10.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
2015+ "related": ".xml"
2016+ }
2017+ },
2018+ "runtime": {
2019+ "lib/net10.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
2020+ "related": ".xml"
2021+ }
2022+ },
2023+ "build": {
2024+ "buildTransitive/net8.0/_._": {}
2025+ }
2026+ },
2027+ "Microsoft.Extensions.DependencyInjection/10.0.0": {
2028+ "type": "package",
2029+ "dependencies": {
2030+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0"
2031+ },
2032+ "compile": {
2033+ "lib/net10.0/Microsoft.Extensions.DependencyInjection.dll": {
2034+ "related": ".xml"
2035+ }
2036+ },
2037+ "runtime": {
2038+ "lib/net10.0/Microsoft.Extensions.DependencyInjection.dll": {
2039+ "related": ".xml"
2040+ }
2041+ },
2042+ "build": {
2043+ "buildTransitive/net8.0/_._": {}
2044+ }
2045+ },
2046+ "Microsoft.Extensions.DependencyInjection.Abstractions/10.0.0": {
2047+ "type": "package",
2048+ "compile": {
2049+ "lib/net10.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
2050+ "related": ".xml"
2051+ }
2052+ },
2053+ "runtime": {
2054+ "lib/net10.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
2055+ "related": ".xml"
2056+ }
2057+ },
2058+ "build": {
2059+ "buildTransitive/net8.0/_._": {}
2060+ }
2061+ },
2062+ "Microsoft.Extensions.Diagnostics.Abstractions/10.0.0": {
2063+ "type": "package",
2064+ "dependencies": {
2065+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0",
2066+ "Microsoft.Extensions.Options": "10.0.0"
2067+ },
2068+ "compile": {
2069+ "lib/net10.0/Microsoft.Extensions.Diagnostics.Abstractions.dll": {
2070+ "related": ".xml"
2071+ }
2072+ },
2073+ "runtime": {
2074+ "lib/net10.0/Microsoft.Extensions.Diagnostics.Abstractions.dll": {
2075+ "related": ".xml"
2076+ }
2077+ },
2078+ "build": {
2079+ "buildTransitive/net8.0/_._": {}
2080+ }
2081+ },
2082+ "Microsoft.Extensions.FileProviders.Abstractions/10.0.0": {
2083+ "type": "package",
2084+ "dependencies": {
2085+ "Microsoft.Extensions.Primitives": "10.0.0"
2086+ },
2087+ "compile": {
2088+ "lib/net10.0/Microsoft.Extensions.FileProviders.Abstractions.dll": {
2089+ "related": ".xml"
2090+ }
2091+ },
2092+ "runtime": {
2093+ "lib/net10.0/Microsoft.Extensions.FileProviders.Abstractions.dll": {
2094+ "related": ".xml"
2095+ }
2096+ },
2097+ "build": {
2098+ "buildTransitive/net8.0/_._": {}
2099+ }
2100+ },
2101+ "Microsoft.Extensions.Hosting.Abstractions/10.0.0": {
2102+ "type": "package",
2103+ "dependencies": {
2104+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.0",
2105+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0",
2106+ "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.0",
2107+ "Microsoft.Extensions.FileProviders.Abstractions": "10.0.0",
2108+ "Microsoft.Extensions.Logging.Abstractions": "10.0.0"
2109+ },
2110+ "compile": {
2111+ "lib/net10.0/Microsoft.Extensions.Hosting.Abstractions.dll": {
2112+ "related": ".xml"
2113+ }
2114+ },
2115+ "runtime": {
2116+ "lib/net10.0/Microsoft.Extensions.Hosting.Abstractions.dll": {
2117+ "related": ".xml"
2118+ }
2119+ },
2120+ "build": {
2121+ "buildTransitive/net8.0/_._": {}
2122+ }
2123+ },
2124+ "Microsoft.Extensions.Logging/10.0.0": {
2125+ "type": "package",
2126+ "dependencies": {
2127+ "Microsoft.Extensions.DependencyInjection": "10.0.0",
2128+ "Microsoft.Extensions.Logging.Abstractions": "10.0.0",
2129+ "Microsoft.Extensions.Options": "10.0.0"
2130+ },
2131+ "compile": {
2132+ "lib/net10.0/Microsoft.Extensions.Logging.dll": {
2133+ "related": ".xml"
2134+ }
2135+ },
2136+ "runtime": {
2137+ "lib/net10.0/Microsoft.Extensions.Logging.dll": {
2138+ "related": ".xml"
2139+ }
2140+ },
2141+ "build": {
2142+ "buildTransitive/net8.0/_._": {}
2143+ }
2144+ },
2145+ "Microsoft.Extensions.Logging.Abstractions/10.0.0": {
2146+ "type": "package",
2147+ "dependencies": {
2148+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0"
2149+ },
2150+ "compile": {
2151+ "lib/net10.0/Microsoft.Extensions.Logging.Abstractions.dll": {
2152+ "related": ".xml"
2153+ }
2154+ },
2155+ "runtime": {
2156+ "lib/net10.0/Microsoft.Extensions.Logging.Abstractions.dll": {
2157+ "related": ".xml"
2158+ }
2159+ },
2160+ "build": {
2161+ "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets": {}
2162+ }
2163+ },
2164+ "Microsoft.Extensions.Options/10.0.0": {
2165+ "type": "package",
2166+ "dependencies": {
2167+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0",
2168+ "Microsoft.Extensions.Primitives": "10.0.0"
2169+ },
2170+ "compile": {
2171+ "lib/net10.0/Microsoft.Extensions.Options.dll": {
2172+ "related": ".xml"
2173+ }
2174+ },
2175+ "runtime": {
2176+ "lib/net10.0/Microsoft.Extensions.Options.dll": {
2177+ "related": ".xml"
2178+ }
2179+ },
2180+ "build": {
2181+ "buildTransitive/net8.0/Microsoft.Extensions.Options.targets": {}
2182+ }
2183+ },
2184+ "Microsoft.Extensions.Primitives/10.0.0": {
2185+ "type": "package",
2186+ "compile": {
2187+ "lib/net10.0/Microsoft.Extensions.Primitives.dll": {
2188+ "related": ".xml"
2189+ }
2190+ },
2191+ "runtime": {
2192+ "lib/net10.0/Microsoft.Extensions.Primitives.dll": {
2193+ "related": ".xml"
2194+ }
2195+ },
2196+ "build": {
2197+ "buildTransitive/net8.0/_._": {}
2198+ }
2199+ },
2200+ "Microsoft.Maui.Controls/10.0.0": {
2201+ "type": "package",
2202+ "dependencies": {
2203+ "Microsoft.Maui.Controls.Build.Tasks": "10.0.0",
2204+ "Microsoft.Maui.Controls.Core": "10.0.0",
2205+ "Microsoft.Maui.Controls.Xaml": "10.0.0",
2206+ "Microsoft.Maui.Resizetizer": "10.0.0"
2207+ }
2208+ },
2209+ "Microsoft.Maui.Controls.Build.Tasks/10.0.0": {
2210+ "type": "package",
2211+ "dependencies": {
2212+ "Microsoft.Maui.Controls.Core": "10.0.0",
2213+ "Microsoft.Maui.Controls.Xaml": "10.0.0"
2214+ },
2215+ "build": {
2216+ "buildTransitive/net6.0-maccatalyst13.1/Microsoft.Maui.Controls.Build.Tasks.props": {},
2217+ "buildTransitive/net6.0-maccatalyst13.1/Microsoft.Maui.Controls.Build.Tasks.targets": {}
2218+ }
2219+ },
2220+ "Microsoft.Maui.Controls.Compatibility/9.0.0": {
2221+ "type": "package",
2222+ "dependencies": {
2223+ "Microsoft.Extensions.Configuration": "9.0.0",
2224+ "Microsoft.Extensions.Logging.Abstractions": "9.0.0",
2225+ "Microsoft.Maui.Controls.Core": "9.0.0",
2226+ "Microsoft.Maui.Controls.Xaml": "9.0.0"
2227+ },
2228+ "compile": {
2229+ "lib/net9.0-maccatalyst18.0/Microsoft.Maui.Controls.Compatibility.dll": {
2230+ "related": ".pdb;.xml"
2231+ }
2232+ },
2233+ "runtime": {
2234+ "lib/net9.0-maccatalyst18.0/Microsoft.Maui.Controls.Compatibility.dll": {
2235+ "related": ".pdb;.xml"
2236+ }
2237+ }
2238+ },
2239+ "Microsoft.Maui.Controls.Core/10.0.0": {
2240+ "type": "package",
2241+ "dependencies": {
2242+ "Microsoft.Extensions.Configuration": "10.0.0",
2243+ "Microsoft.Extensions.DependencyInjection": "10.0.0",
2244+ "Microsoft.Extensions.Logging": "10.0.0",
2245+ "Microsoft.Extensions.Logging.Abstractions": "10.0.0",
2246+ "Microsoft.Maui.Core": "10.0.0"
2247+ },
2248+ "compile": {
2249+ "lib/net10.0-maccatalyst26.0/Microsoft.Maui.Controls.dll": {
2250+ "related": ".pdb;.xml"
2251+ }
2252+ },
2253+ "runtime": {
2254+ "lib/net10.0-maccatalyst26.0/Microsoft.Maui.Controls.dll": {
2255+ "related": ".pdb;.xml"
2256+ }
2257+ },
2258+ "resource": {
2259+ "lib/net10.0-maccatalyst26.0/ar/Microsoft.Maui.Controls.resources.dll": {
2260+ "locale": "ar"
2261+ },
2262+ "lib/net10.0-maccatalyst26.0/ca/Microsoft.Maui.Controls.resources.dll": {
2263+ "locale": "ca"
2264+ },
2265+ "lib/net10.0-maccatalyst26.0/cs/Microsoft.Maui.Controls.resources.dll": {
2266+ "locale": "cs"
2267+ },
2268+ "lib/net10.0-maccatalyst26.0/da/Microsoft.Maui.Controls.resources.dll": {
2269+ "locale": "da"
2270+ },
2271+ "lib/net10.0-maccatalyst26.0/de/Microsoft.Maui.Controls.resources.dll": {
2272+ "locale": "de"
2273+ },
2274+ "lib/net10.0-maccatalyst26.0/el/Microsoft.Maui.Controls.resources.dll": {
2275+ "locale": "el"
2276+ },
2277+ "lib/net10.0-maccatalyst26.0/es/Microsoft.Maui.Controls.resources.dll": {
2278+ "locale": "es"
2279+ },
2280+ "lib/net10.0-maccatalyst26.0/fi/Microsoft.Maui.Controls.resources.dll": {
2281+ "locale": "fi"
2282+ },
2283+ "lib/net10.0-maccatalyst26.0/fr/Microsoft.Maui.Controls.resources.dll": {
2284+ "locale": "fr"
2285+ },
2286+ "lib/net10.0-maccatalyst26.0/he/Microsoft.Maui.Controls.resources.dll": {
2287+ "locale": "he"
2288+ },
2289+ "lib/net10.0-maccatalyst26.0/hi/Microsoft.Maui.Controls.resources.dll": {
2290+ "locale": "hi"
2291+ },
2292+ "lib/net10.0-maccatalyst26.0/hr/Microsoft.Maui.Controls.resources.dll": {
2293+ "locale": "hr"
2294+ },
2295+ "lib/net10.0-maccatalyst26.0/hu/Microsoft.Maui.Controls.resources.dll": {
2296+ "locale": "hu"
2297+ },
2298+ "lib/net10.0-maccatalyst26.0/id/Microsoft.Maui.Controls.resources.dll": {
2299+ "locale": "id"
2300+ },
2301+ "lib/net10.0-maccatalyst26.0/it/Microsoft.Maui.Controls.resources.dll": {
2302+ "locale": "it"
2303+ },
2304+ "lib/net10.0-maccatalyst26.0/ja/Microsoft.Maui.Controls.resources.dll": {
2305+ "locale": "ja"
2306+ },
2307+ "lib/net10.0-maccatalyst26.0/ko/Microsoft.Maui.Controls.resources.dll": {
2308+ "locale": "ko"
2309+ },
2310+ "lib/net10.0-maccatalyst26.0/ms/Microsoft.Maui.Controls.resources.dll": {
2311+ "locale": "ms"
2312+ },
2313+ "lib/net10.0-maccatalyst26.0/nb/Microsoft.Maui.Controls.resources.dll": {
2314+ "locale": "nb"
2315+ },
2316+ "lib/net10.0-maccatalyst26.0/nl/Microsoft.Maui.Controls.resources.dll": {
2317+ "locale": "nl"
2318+ },
2319+ "lib/net10.0-maccatalyst26.0/pl/Microsoft.Maui.Controls.resources.dll": {
2320+ "locale": "pl"
2321+ },
2322+ "lib/net10.0-maccatalyst26.0/pt-BR/Microsoft.Maui.Controls.resources.dll": {
2323+ "locale": "pt-BR"
2324+ },
2325+ "lib/net10.0-maccatalyst26.0/pt/Microsoft.Maui.Controls.resources.dll": {
2326+ "locale": "pt"
2327+ },
2328+ "lib/net10.0-maccatalyst26.0/ro/Microsoft.Maui.Controls.resources.dll": {
2329+ "locale": "ro"
2330+ },
2331+ "lib/net10.0-maccatalyst26.0/ru/Microsoft.Maui.Controls.resources.dll": {
2332+ "locale": "ru"
2333+ },
2334+ "lib/net10.0-maccatalyst26.0/sk/Microsoft.Maui.Controls.resources.dll": {
2335+ "locale": "sk"
2336+ },
2337+ "lib/net10.0-maccatalyst26.0/sv/Microsoft.Maui.Controls.resources.dll": {
2338+ "locale": "sv"
2339+ },
2340+ "lib/net10.0-maccatalyst26.0/th/Microsoft.Maui.Controls.resources.dll": {
2341+ "locale": "th"
2342+ },
2343+ "lib/net10.0-maccatalyst26.0/tr/Microsoft.Maui.Controls.resources.dll": {
2344+ "locale": "tr"
2345+ },
2346+ "lib/net10.0-maccatalyst26.0/uk/Microsoft.Maui.Controls.resources.dll": {
2347+ "locale": "uk"
2348+ },
2349+ "lib/net10.0-maccatalyst26.0/vi/Microsoft.Maui.Controls.resources.dll": {
2350+ "locale": "vi"
2351+ },
2352+ "lib/net10.0-maccatalyst26.0/zh-HK/Microsoft.Maui.Controls.resources.dll": {
2353+ "locale": "zh-HK"
2354+ },
2355+ "lib/net10.0-maccatalyst26.0/zh-Hans/Microsoft.Maui.Controls.resources.dll": {
2356+ "locale": "zh-Hans"
2357+ },
2358+ "lib/net10.0-maccatalyst26.0/zh-Hant/Microsoft.Maui.Controls.resources.dll": {
2359+ "locale": "zh-Hant"
2360+ }
2361+ }
2362+ },
2363+ "Microsoft.Maui.Controls.Xaml/10.0.0": {
2364+ "type": "package",
2365+ "dependencies": {
2366+ "Microsoft.Extensions.Configuration": "10.0.0",
2367+ "Microsoft.Maui.Controls.Core": "10.0.0",
2368+ "Microsoft.Maui.Core": "10.0.0"
2369+ },
2370+ "compile": {
2371+ "lib/net10.0-maccatalyst26.0/Microsoft.Maui.Controls.Xaml.dll": {
2372+ "related": ".pdb;.xml"
2373+ }
2374+ },
2375+ "runtime": {
2376+ "lib/net10.0-maccatalyst26.0/Microsoft.Maui.Controls.Xaml.dll": {
2377+ "related": ".pdb;.xml"
2378+ }
2379+ }
2380+ },
2381+ "Microsoft.Maui.Core/10.0.0": {
2382+ "type": "package",
2383+ "dependencies": {
2384+ "Microsoft.Extensions.Configuration": "10.0.0",
2385+ "Microsoft.Extensions.DependencyInjection": "10.0.0",
2386+ "Microsoft.Extensions.Hosting.Abstractions": "10.0.0",
2387+ "Microsoft.Extensions.Logging": "10.0.0",
2388+ "Microsoft.Extensions.Logging.Abstractions": "10.0.0",
2389+ "Microsoft.Maui.Essentials": "10.0.0",
2390+ "Microsoft.Maui.Graphics": "10.0.0"
2391+ },
2392+ "compile": {
2393+ "lib/net10.0-maccatalyst26.0/Microsoft.Maui.dll": {
2394+ "related": ".pdb;.xml"
2395+ }
2396+ },
2397+ "runtime": {
2398+ "lib/net10.0-maccatalyst26.0/Microsoft.Maui.dll": {
2399+ "related": ".pdb;.xml"
2400+ }
2401+ },
2402+ "build": {
2403+ "buildTransitive/Microsoft.Maui.Core.props": {},
2404+ "buildTransitive/Microsoft.Maui.Core.targets": {}
2405+ }
2406+ },
2407+ "Microsoft.Maui.Essentials/10.0.0": {
2408+ "type": "package",
2409+ "dependencies": {
2410+ "Microsoft.Maui.Graphics": "10.0.0"
2411+ },
2412+ "compile": {
2413+ "lib/net10.0-maccatalyst26.0/Microsoft.Maui.Essentials.dll": {
2414+ "related": ".pdb;.xml"
2415+ }
2416+ },
2417+ "runtime": {
2418+ "lib/net10.0-maccatalyst26.0/Microsoft.Maui.Essentials.dll": {
2419+ "related": ".pdb;.xml"
2420+ }
2421+ }
2422+ },
2423+ "Microsoft.Maui.Graphics/10.0.0": {
2424+ "type": "package",
2425+ "compile": {
2426+ "lib/net10.0-maccatalyst26.0/Microsoft.Maui.Graphics.dll": {
2427+ "related": ".pdb;.xml"
2428+ }
2429+ },
2430+ "runtime": {
2431+ "lib/net10.0-maccatalyst26.0/Microsoft.Maui.Graphics.dll": {
2432+ "related": ".pdb;.xml"
2433+ }
2434+ }
2435+ },
2436+ "Microsoft.Maui.Resizetizer/10.0.0": {
2437+ "type": "package",
2438+ "build": {
2439+ "buildTransitive/Microsoft.Maui.Resizetizer.props": {},
2440+ "buildTransitive/Microsoft.Maui.Resizetizer.targets": {}
2441+ }
2442+ },
2443+ "Microsoft.NET.ILLink.Tasks/10.0.5": {
2444+ "type": "package",
2445+ "build": {
2446+ "build/Microsoft.NET.ILLink.Tasks.props": {}
2447+ }
2448+ },
2449+ "Sodium.Core/1.4.0": {
2450+ "type": "package",
2451+ "dependencies": {
2452+ "libsodium": "[1.0.20.1, 1.0.21)"
2453+ },
2454+ "compile": {
2455+ "lib/net8.0-maccatalyst18.0/Sodium.Core.dll": {
2456+ "related": ".xml"
2457+ }
2458+ },
2459+ "runtime": {
2460+ "lib/net8.0-maccatalyst18.0/Sodium.Core.dll": {
2461+ "related": ".xml"
2462+ }
2463+ }
2464+ }
2465+ },
2466+ "net10.0-maccatalyst26.2/iossimulator-arm64": {
2467+ "Fabulous/3.0.0-pre23": {
2468+ "type": "package",
2469+ "dependencies": {
2470+ "FSharp.Core": "8.0.300"
2471+ },
2472+ "compile": {
2473+ "lib/net8.0/Fabulous.dll": {
2474+ "related": ".xml"
2475+ }
2476+ },
2477+ "runtime": {
2478+ "lib/net8.0/Fabulous.dll": {
2479+ "related": ".xml"
2480+ }
2481+ }
2482+ },
2483+ "Fabulous.MauiControls/9.0.0-pre9": {
2484+ "type": "package",
2485+ "dependencies": {
2486+ "Fabulous": "3.0.0-pre23",
2487+ "Microsoft.Maui.Controls": "9.0.0",
2488+ "Microsoft.Maui.Controls.Compatibility": "9.0.0"
2489+ },
2490+ "compile": {
2491+ "lib/net9.0/Fabulous.MauiControls.dll": {
2492+ "related": ".xml"
2493+ }
2494+ },
2495+ "runtime": {
2496+ "lib/net9.0/Fabulous.MauiControls.dll": {
2497+ "related": ".xml"
2498+ }
2499+ }
2500+ },
2501+ "FSharp.Core/9.0.100": {
2502+ "type": "package",
2503+ "compile": {
2504+ "lib/netstandard2.1/FSharp.Core.dll": {
2505+ "related": ".xml"
2506+ }
2507+ },
2508+ "runtime": {
2509+ "lib/netstandard2.1/FSharp.Core.dll": {
2510+ "related": ".xml"
2511+ }
2512+ },
2513+ "resource": {
2514+ "lib/netstandard2.1/cs/FSharp.Core.resources.dll": {
2515+ "locale": "cs"
2516+ },
2517+ "lib/netstandard2.1/de/FSharp.Core.resources.dll": {
2518+ "locale": "de"
2519+ },
2520+ "lib/netstandard2.1/es/FSharp.Core.resources.dll": {
2521+ "locale": "es"
2522+ },
2523+ "lib/netstandard2.1/fr/FSharp.Core.resources.dll": {
2524+ "locale": "fr"
2525+ },
2526+ "lib/netstandard2.1/it/FSharp.Core.resources.dll": {
2527+ "locale": "it"
2528+ },
2529+ "lib/netstandard2.1/ja/FSharp.Core.resources.dll": {
2530+ "locale": "ja"
2531+ },
2532+ "lib/netstandard2.1/ko/FSharp.Core.resources.dll": {
2533+ "locale": "ko"
2534+ },
2535+ "lib/netstandard2.1/pl/FSharp.Core.resources.dll": {
2536+ "locale": "pl"
2537+ },
2538+ "lib/netstandard2.1/pt-BR/FSharp.Core.resources.dll": {
2539+ "locale": "pt-BR"
2540+ },
2541+ "lib/netstandard2.1/ru/FSharp.Core.resources.dll": {
2542+ "locale": "ru"
2543+ },
2544+ "lib/netstandard2.1/tr/FSharp.Core.resources.dll": {
2545+ "locale": "tr"
2546+ },
2547+ "lib/netstandard2.1/zh-Hans/FSharp.Core.resources.dll": {
2548+ "locale": "zh-Hans"
2549+ },
2550+ "lib/netstandard2.1/zh-Hant/FSharp.Core.resources.dll": {
2551+ "locale": "zh-Hant"
2552+ }
2553+ }
2554+ },
2555+ "libsodium/1.0.20.1": {
2556+ "type": "package",
2557+ "native": {
2558+ "runtimes/ios-arm64/native/libsodium.a": {}
13872559 }
13882560 },
13892561 "LiteDB/5.0.21": {
@@ -1877,7 +3049,7 @@
18773049 }
18783050 }
18793051 },
1880− "net10.0-maccatalyst26.2/iossimulator-arm64": {
3052+ "net10.0-maccatalyst26.2/maccatalyst-arm64": {
18813053 "Fabulous/3.0.0-pre23": {
18823054 "type": "package",
18833055 "dependencies": {
@@ -1969,7 +3141,7 @@
19693141 "libsodium/1.0.20.1": {
19703142 "type": "package",
19713143 "native": {
1972− "runtimes/ios-arm64/native/libsodium.a": {}
3144+ "runtimes/maccatalyst-arm64/native/libsodium.a": {}
19733145 }
19743146 },
19753147 "LiteDB/5.0.21": {
@@ -4490,6 +5662,9 @@
44905662 "runtimes": {
44915663 "iossimulator-arm64": {
44925664 "#import": []
5665+ },
5666+ "maccatalyst-arm64": {
5667+ "#import": []
44935668 }
44945669 }
44955670 }
client/obj/project.nuget.cache+1−1
@@ -1,6 +1,6 @@
11{
22 "version": 2,
3− "dgSpecHash": "mGD1igy7dck=",
3+ "dgSpecHash": "VeBMJNb5HXc=",
44 "success": true,
55 "projectFilePath": "/Users/iko/Developer/skrepka/client/Skrepka.fsproj",
66 "expectedPackageFiles": [
server.knot+20−17
@@ -65,6 +65,7 @@ type PollEvent = {id: MessageIdHex, eventType: PollEventType, payload: {encrypte
6565
6666data GossipEventType = GossipOnline {} | GossipOffline {} | GossipUnknown {}
6767data ValidGossipType = ValidOnline {} | ValidOffline {}
68+data DeliveryStatus = DsDelivered {} | DsFederated {} | DsQueued {}
6869
6970impl ToJSON GossipEventType where
7071 toJson et = toJson (case et of
@@ -82,6 +83,7 @@ impl FromJSON GossipEventType where
8283isOnlineEvent = \et -> case et of ValidOnline {} -> True {}; _ -> False {}
8384isOfflineEvent = \et -> case et of ValidOffline {} -> True {}; _ -> False {}
8485toGossipEventType = \et -> case et of ValidOnline {} -> GossipOnline {}; ValidOffline {} -> GossipOffline {}
86+toMessageStatus = \ds -> case ds of DsDelivered {} -> MsDelivered {}; DsFederated {} -> MsFederated {}; DsQueued {} -> MsQueued {}
8587
8688type GossipEvent = {eventType: GossipEventType, pubkey: PubkeyHex, server: ServerName, timestamp: Timestamp, ttl: Int<S>}
8789
@@ -118,7 +120,7 @@ type PresenceEntry = {pubkey: PubkeyHex, server: AnyServerName, expiresAt: Times
118120type ForwardEntry = {messageId: MessageIdHex, toServer: ServerName, createdAt: Timestamp, toKey: PubkeyHex, fromKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp}
119121type AckedEntry = {messageId: MessageIdHex, toKey: PubkeyHex, ackedAt: Timestamp, originServer: ServerName}
120122data AuthResult = Authorized {pubkey: PubkeyHex} | Unauthorized {}
121−data SendResult = SendUnauthorized {} | SendRejected {} | SendDone {status: MessageStatus, remoteServers: [ServerName], fromKey: PubkeyHex}
123+data SendResult = SendUnauthorized {} | SendRejected {} | SendDone {status: DeliveryStatus, remoteServers: [ServerName], fromKey: PubkeyHex}
122124data VerifyResult = VerifyFailed {} | VerifyOk {peerServers: [ServerName]}
123125data AckResult = AckUnauthorized {} | AckDone {pendingAcks: [AckedEntry], evictedEntries: [AckedEntry]}
124126data LookupResult = LookupUnauthorized {} | LookupDone {server: AnyServerName}
@@ -294,6 +296,7 @@ stripTrailingDot = \s ->
294296normalizeServerName = \s -> toLower (stripTrailingDot s)
295297
296298serverHostN = normalizeServerName serverHost
299+isLocalServer = \s -> s == serverHostN
297300
298301containsSuffixN = \suffix suffixLen s ->
299302 if s == "" then False {}
@@ -469,7 +472,7 @@ capPerKeyAndGlobal = \items matchKey maxPerKey getExpiry t maxGlobal ->
469472collectPeerServers = \items getServer ->
470473 fold (\acc item ->
471474 let s = getServer item in
472− if s == serverHostN then acc
475+ if isLocalServer s then acc
473476 else if any acc (\a -> a == s) then acc
474477 else union acc [s]) [] items
475478
@@ -525,7 +528,7 @@ validGossipEvents = \events t -> do
525528 GossipOnline {} -> [ValidOnline {}]
526529 GossipOffline {} -> [ValidOffline {}]
527530 _ -> []
528− where e.server != serverHostN && e.timestamp <= t + clockSkewTolerance
531+ where not (isLocalServer e.server) && e.timestamp <= t + clockSkewTolerance
529532 let ttl = clampTtl e.ttl
530533 let expiresAt = e.timestamp + ttl * 1000
531534 where expiresAt > t
@@ -570,7 +573,7 @@ pruneExpired = \t -> do
570573 yield a
571574 yield {expiredLocal: (do
572575 p <- presenceBefore
573− where p.expiresAt <= t && p.server == serverHostN && none presenceAfter (\q -> q.pubkey == p.pubkey && q.server == serverHostN)
576+ where p.expiresAt <= t && isLocalServer p.server && none presenceAfter (\q -> q.pubkey == p.pubkey && isLocalServer q.server)
574577 yield p), peerServers: peerServersBefore}
575578
576579maybePrune = \t -> do
@@ -707,7 +710,7 @@ pruneAndRetry = \t -> do
707710 pr <- pruneExpired t
708711 forwards <- *forwards
709712 ackedIds <- *ackedIds
710− let pendingAcks = do a <- ackedIds; where a.originServer != serverHostN; yield a
713+ let pendingAcks = do a <- ackedIds; where not (isLocalServer a.originServer); yield a
711714 yield {expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, pendingForwards: forwards, pendingAcks: pendingAcks}
712715 broadcastOfflineGossip t result.peerServers result.expiredLocal
713716 when federationEnabled (do
@@ -795,7 +798,7 @@ serve = \req -> case req of
795798 set *sessions = union capped [{token: token, pubkey: pubkey, expiresAt: expiry}]
796799 let presenceWithout = do
797800 p <- presence
798− where p.pubkey != pubkey || p.server != serverHostN
801+ where p.pubkey != pubkey || not (isLocalServer p.server)
799802 yield p
800803 let presenceEvicted = capGlobal presenceWithout maxPresenceEntries (\p -> p.expiresAt)
801804 let updatedPresence = union presenceEvicted [{pubkey: pubkey, server: serverHostN, expiresAt: expiry, timestamp: t}]
@@ -851,14 +854,14 @@ serve = \req -> case req of
851854 [{messageId: msgId, toKey: to, fromKey: fromKey,
852855 encryptedBlob: encryptedBlob, timestamp: clampedTs, origin: LocalOrigin {}, receivedAt: seqTs}]
853856 let toPresence = do p <- presence; where p.pubkey == to && p.expiresAt > t; yield p
854− let localOnline = any toPresence (\p -> p.server == serverHostN)
857+ let localOnline = any toPresence (\p -> isLocalServer p.server)
855858 let remoteServers = collectPeerServers toPresence (\p -> p.server)
856859 forwards <- *forwards
857860 let forwardServers = takeN remoteServers (maxForwardsEntries - count forwards)
858861 let shouldForward = federationEnabled && count forwardServers > 0
859− let status = if localOnline then MsDelivered {}
860− else if shouldForward then MsFederated {}
861− else MsQueued {}
862+ let status = if localOnline then DsDelivered {}
863+ else if shouldForward then DsFederated {}
864+ else DsQueued {}
862865 set *forwards = if shouldForward
863866 then union forwards (do s <- forwardServers; yield {messageId: msgId, toServer: s, createdAt: t, toKey: to, fromKey: fromKey, encryptedBlob: encryptedBlob, timestamp: clampedTs})
864867 else forwards
@@ -874,14 +877,14 @@ serve = \req -> case req of
874877 authorization: federationAuth})
875878 whenOk fwdResult (removeForward msgId server))
876879 case status of
877− MsQueued {} -> println ("sendMessage: forwards at capacity (" ++ show maxForwardsEntries ++ "), skipping forward tracking")
880+ DsQueued {} -> println ("sendMessage: forwards at capacity (" ++ show maxForwardsEntries ++ "), skipping forward tracking")
878881 _ -> yield {})
879882 _ -> yield {}
880883 broadcastOfflineGossip t result.pr.peerServers result.pr.expiredLocal)
881884 yield (case result.send of
882885 SendUnauthorized {} -> respond {status: MsUnauthorized {}, messageId: ""}
883886 SendRejected {} -> respond {status: MsRejected {}, messageId: ""}
884− SendDone {status} -> respond {status: status, messageId: msgId})
887+ SendDone {status} -> respond {status: toMessageStatus status, messageId: msgId})
885888
886889 AckMessages {messageIds, authorization, respond} -> do
887890 t <- now
@@ -934,8 +937,8 @@ serve = \req -> case req of
934937 p <- presence
935938 where p.pubkey == pubkey && p.expiresAt > t
936939 yield p
937− let localOnline = any valid (\p -> p.server == serverHostN)
938− 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
940+ let localOnline = any valid (\p -> isLocalServer p.server)
941+ let bestRemote = (fold (\acc p -> if not (isLocalServer p.server) && p.expiresAt > acc.best then {server: p.server, best: p.expiresAt} else acc) {server: "", best: 0} valid).server
939942 let foundServer = if localOnline then serverHostN else bestRemote
940943 yield {pr: pr, lookup: LookupDone {server: foundServer}}
941944 forkBroadcastOffline t result.pr
@@ -947,7 +950,7 @@ serve = \req -> case req of
947950 t <- now
948951 let authorized = verifyFederationAuth authorization
949952 let cappedHops = clamp 0 maxGossipHops hopsRemaining
950− if not authorized || cappedHops < 1 || fromServer == serverHostN || count events > maxGossipEvents
953+ if not authorized || cappedHops < 1 || isLocalServer fromServer || count events > maxGossipEvents
951954 then rejectFederation t respond
952955 else do
953956 let allValidEntries = validGossipEvents events t
@@ -993,7 +996,7 @@ serve = \req -> case req of
993996 ForwardMessage {toKey, fromKey, encryptedBlob, timestamp, originServer, messageId, authorization, respond} -> do
994997 t <- now
995998 let authorized = verifyFederationAuth authorization
996− if not authorized || originServer == serverHostN
999+ if not authorized || isLocalServer originServer
9971000 then rejectFederation t respond
9981001 else do
9991002 let clampedTs = clampTimestamp timestamp t
@@ -1019,7 +1022,7 @@ serve = \req -> case req of
10191022 FederationAck {messageIds, originServer, fromServer, authorization, respond} -> do
10201023 t <- now
10211024 let authorized = verifyFederationAuth authorization
1022− if not authorized || originServer != serverHostN || fromServer == serverHostN
1025+ if not authorized || not (isLocalServer originServer) || isLocalServer fromServer
10231026 then rejectFederation t respond
10241027 else do
10251028 let dedupedIds = dedupMessageIds messageIds