on master help sign in
Simplify code and improve type safety: replace manual JSON with JsonSerializer, type EventPayload, remove Identity from Connecting
3dd6eediko
client/ApiClient.fs+12−12
@@ -8,7 +8,8 @@ open System.Threading.Tasks
8
8
9module ApiClient =
9module ApiClient =
10
10
11+ type EventPayload = { EncryptedBlob: string; Timestamp: int64 }
11− type PollEvent = { Id: string; Payload: JsonElement }
12+ type PollEvent = { Id: string; Payload: EventPayload }
12
13
13 type AuthResult = { Token: string; ExpiresAt: int64 }
14 type AuthResult = { Token: string; ExpiresAt: int64 }
14 type SendResult = { Status: string; MessageId: string }
15 type SendResult = { Status: string; MessageId: string }
@@ -63,7 +64,7 @@ module ApiClient =
63
64
64 let requestChallenge (serverUrl: string) (pubkeyHex: string) =
65 let requestChallenge (serverUrl: string) (pubkeyHex: string) =
65 async {
66 async {
66− let body = $"""{{ "pubkey": "{pubkeyHex}" }}"""
67+ let body = JsonSerializer.Serialize({| pubkey = pubkeyHex |})
67 let! doc = postJson $"{serverUrl}/auth/challenge" body None
68 let! doc = postJson $"{serverUrl}/auth/challenge" body None
68 let root = expectObject doc "/auth/challenge"
69 let root = expectObject doc "/auth/challenge"
69 return root.GetProperty("challenge").GetString()
70 return root.GetProperty("challenge").GetString()
@@ -71,8 +72,7 @@ module ApiClient =
71
72
72 let verify (serverUrl: string) (pubkeyHex: string) (challenge: string) (signatureHex: string) =
73 let verify (serverUrl: string) (pubkeyHex: string) (challenge: string) (signatureHex: string) =
73 async {
74 async {
74− let body =
75− $"""{{ "pubkey": "{pubkeyHex}", "challenge": "{challenge}", "signature": "{signatureHex}" }}"""
75+ let body = JsonSerializer.Serialize({| pubkey = pubkeyHex; challenge = challenge; signature = signatureHex |})
76
76
77 let! doc = postJson $"{serverUrl}/auth/verify" body None
77 let! doc = postJson $"{serverUrl}/auth/verify" body None
78 let root = expectObject doc "/auth/verify"
78 let root = expectObject doc "/auth/verify"
@@ -83,8 +83,7 @@ module ApiClient =
83
83
84 let sendMessage (serverUrl: string) (token: string) (toHex: string) (blobHex: string) (timestamp: int64) =
84 let sendMessage (serverUrl: string) (token: string) (toHex: string) (blobHex: string) (timestamp: int64) =
85 async {
85 async {
86− let body =
87− $"""{{ "to": "{toHex}", "encryptedBlob": "{blobHex}", "timestamp": {timestamp} }}"""
86+ let body = JsonSerializer.Serialize({| ``to`` = toHex; encryptedBlob = blobHex; timestamp = timestamp |})
88
87
89 let! doc = postJson $"{serverUrl}/messages" body (Some token)
88 let! doc = postJson $"{serverUrl}/messages" body (Some token)
90 let root = expectObject doc "/messages"
89 let root = expectObject doc "/messages"
@@ -101,7 +100,7 @@ module ApiClient =
101 let poll (serverUrl: string) (token: string) (cursor: uint64) =
100 let poll (serverUrl: string) (token: string) (cursor: uint64) =
102 async {
101 async {
103 let request = new HttpRequestMessage(HttpMethod.Post, $"{serverUrl}/poll")
102 let request = new HttpRequestMessage(HttpMethod.Post, $"{serverUrl}/poll")
104− request.Content <- new StringContent($"""{{"cursor":{cursor},"timeout":30000}}""", Encoding.UTF8, "application/json")
103+ request.Content <- new StringContent(JsonSerializer.Serialize({| cursor = cursor; timeout = 30000 |}), Encoding.UTF8, "application/json")
105 request.Headers.Add("Authorization", $"Bearer {token}")
104 request.Headers.Add("Authorization", $"Bearer {token}")
106
105
107 let! response = pollClient.SendAsync(request) |> awaitTask
106 let! response = pollClient.SendAsync(request) |> awaitTask
@@ -116,18 +115,19 @@ module ApiClient =
116 [ for e in events.EnumerateArray() do
115 [ for e in events.EnumerateArray() do
117 if e.ValueKind = JsonValueKind.Object
116 if e.ValueKind = JsonValueKind.Object
118 && e.GetProperty("eventType").GetString() = "message" then
117 && e.GetProperty("eventType").GetString() = "message" then
118+ let p = e.GetProperty("payload")
119+ let ts = p.GetProperty("timestamp")
119 yield
120 yield
120 { Id = e.GetProperty("id").GetString()
121 { Id = e.GetProperty("id").GetString()
121− Payload = e.GetProperty("payload") } ]
122+ Payload =
123+ { EncryptedBlob = p.GetProperty("encryptedBlob").GetString()
124+ Timestamp = if ts.ValueKind = JsonValueKind.String then Int64.Parse(ts.GetString()) else ts.GetInt64() } } ]
122
125
123 return { Events = events; Cursor = cursor }
126 return { Events = events; Cursor = cursor }
124 }
127 }
125
128
126 let ackMessages (serverUrl: string) (token: string) (messageIds: string list) =
129 let ackMessages (serverUrl: string) (token: string) (messageIds: string list) =
127 async {
130 async {
128− let idsJson =
131+ let body = JsonSerializer.Serialize({| messageIds = messageIds |})
129− messageIds |> List.map (fun id -> $"\"{id}\"") |> String.concat ", "
130−
131− let body = $"""{{ "messageIds": [{idsJson}] }}"""
132 do! postJson $"{serverUrl}/messages/ack" body (Some token) |> Async.Ignore
132 do! postJson $"{serverUrl}/messages/ack" body (Some token) |> Async.Ignore
133 }
133 }
client/App.fs+45−52
@@ -40,7 +40,7 @@ module App =
40
40
41 type ConnState =
41 type ConnState =
42 | Offline
42 | Offline
43− | Connecting of Identity
43+ | Connecting
44 | Online of Session
44 | Online of Session
45
45
46 type PollResultData =
46 type PollResultData =
@@ -178,12 +178,12 @@ module App =
178 | DoConnect ->
178 | DoConnect ->
179 match model.Identity with
179 match model.Identity with
180 | Some id ->
180 | Some id ->
181− { model with Conn = Connecting id }, [ CmdConnect(model.ServerUrl, id) ]
181+ { model with Conn = Connecting }, [ CmdConnect(model.ServerUrl, id) ]
182 | None -> { model with Error = Some "No identity generated" }, []
182 | None -> { model with Error = Some "No identity generated" }, []
183
183
184 | AuthOk token ->
184 | AuthOk token ->
185− match model.Conn with
185+ match model.Conn, model.Identity with
186− | Connecting id ->
186+ | Connecting, Some id ->
187 let session = { Url = model.ServerUrl; Token = token; Identity = id }
187 let session = { Url = model.ServerUrl; Token = token; Identity = id }
188 { model with Conn = Online session; Page = Conversations; Error = None },
188 { model with Conn = Online session; Page = Conversations; Error = None },
189 [ CmdPoll(session, model.PollCursor) ]
189 [ CmdPoll(session, model.PollCursor) ]
@@ -252,7 +252,7 @@ module App =
252
252
253 | DoSaveContact ->
253 | DoSaveContact ->
254 if model.NewPubkey <> "" && model.NewNickname <> "" then
254 if model.NewPubkey <> "" && model.NewNickname <> "" then
255− let contact =
255+ let contact: Contact =
256 { Pubkey = model.NewPubkey
256 { Pubkey = model.NewPubkey
257 Nickname = model.NewNickname }
257 Nickname = model.NewNickname }
258
258
@@ -281,38 +281,36 @@ module App =
281
281
282 | DismissError -> { model with Error = None }, []
282 | DismissError -> { model with Error = None }, []
283
283
284− | StateLoaded { Identity = identityOpt; Data = dataOpt } ->
284+ | StateLoaded { Identity = None } -> model, []
285− match identityOpt with
286− | None -> model, []
287− | Some identity ->
285+ | StateLoaded { Identity = Some identity; Data = dataOpt } ->
288− let model' = { model with Identity = Some identity; Conn = Connecting identity }
286+ let model' = { model with Identity = Some identity; Conn = Connecting }
289
287
290− let model' =
288+ let model' =
291− match dataOpt with
289+ match dataOpt with
292− | Some data ->
290+ | Some data ->
293− let messages =
291+ let messages =
294− data.Messages
292+ data.Messages
295− |> Seq.map (fun (KeyValue(pk, dtos)) ->
293+ |> Seq.map (fun (KeyValue(pk, dtos)) ->
296− pk,
294+ pk,
297− dtos
295+ dtos
298− |> Array.toList
296+ |> Array.toList
299− |> List.map (fun m ->
297+ |> List.map (fun m ->
300− { Id = m.Id
298+ { Id = m.Id
301− Body = m.Body
299+ Body = m.Body
302− Timestamp = DateTimeOffset.FromUnixTimeSeconds m.TimestampUnix
300+ Timestamp = DateTimeOffset.FromUnixTimeSeconds m.TimestampUnix
303− IsOutgoing = m.IsOutgoing }))
301+ IsOutgoing = m.IsOutgoing }))
304− |> Map.ofSeq
302+ |> Map.ofSeq
305−
303+
306− { model' with
304+ { model' with
307− Contacts = data.Contacts |> Array.toList
305+ Contacts = data.Contacts |> Array.toList
308− Messages = messages
306+ Messages = messages
309− ServerUrl = if data.ServerUrl <> "" then data.ServerUrl else model.ServerUrl
307+ ServerUrl = if data.ServerUrl <> "" then data.ServerUrl else model.ServerUrl
310− PollCursor = data.PollCursor
308+ PollCursor = data.PollCursor
311− Page = Conversations }
309+ Page = Conversations }
312−
310+
313− | None -> { model' with Page = Settings }
311+ | None -> { model' with Page = Settings }
314−
312+
315− model', [ CmdConnect(model'.ServerUrl, identity) ]
313+ model', [ CmdConnect(model'.ServerUrl, identity) ]
316
314
317 // ── mapCmd ──
315 // ── mapCmd ──
318
316
@@ -325,24 +323,19 @@ module App =
325 }))
323 }))
326 |> ignore)
324 |> ignore)
327
325
328− let private decryptEvent (privKey: byte[]) (payload: JsonElement) =
326+ let private decryptEvent (privKey: byte[]) (payload: ApiClient.EventPayload) =
329 try
327 try
330− let blobHex = payload.GetProperty("encryptedBlob").GetString()
331− let tsEl = payload.GetProperty("timestamp")
332− let ts =
333− if tsEl.ValueKind = JsonValueKind.String then Int64.Parse(tsEl.GetString())
334− else tsEl.GetInt64()
335− let blob = Crypto.fromHex blobHex
328+ let blob = Crypto.fromHex payload.EncryptedBlob
336
329
337 match Crypto.decrypt privKey blob with
330 match Crypto.decrypt privKey blob with
338 | Some(plaintext, senderHex) ->
331 | Some(plaintext, senderHex) ->
339− let ptDoc = JsonDocument.Parse(plaintext)
332+ let pt = JsonDocument.Parse(plaintext).RootElement
340− let ptRoot = ptDoc.RootElement
341
333
342− if ptRoot.GetProperty("type").GetString() = "text" then
334+ if pt.GetProperty("type").GetString() = "text" then
343− let msgId = ptRoot.GetProperty("id").GetString()
344− let body = ptRoot.GetProperty("body").GetString()
345− Ok { FromPubkey = senderHex; Body = body; Timestamp = ts; MessageId = msgId }
335+ Ok { FromPubkey = senderHex
336+ Body = pt.GetProperty("body").GetString()
337+ Timestamp = payload.Timestamp
338+ MessageId = pt.GetProperty("id").GetString() }
346 else
339 else
347 Error "unknown type"
340 Error "unknown type"
348 | None -> Error "decrypt failed"
341 | None -> Error "decrypt failed"
@@ -376,7 +369,7 @@ module App =
376 let ts = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
369 let ts = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
377
370
378 let payload =
371 let payload =
379− $"""{{ "type": "text", "id": "{messageId}", "timestamp": {ts}, "body": {JsonSerializer.Serialize(text)} }}"""
372+ JsonSerializer.Serialize({| ``type`` = "text"; id = messageId; timestamp = ts; body = text |})
380
373
381 let blob = Crypto.encrypt session.Identity.PrivKey recipPub payload
374 let blob = Crypto.encrypt session.Identity.PrivKey recipPub payload
382 let blobHex = Crypto.toHex blob
375 let blobHex = Crypto.toHex blob
@@ -503,7 +496,7 @@ module App =
503
496
504 match model.Conn with
497 match model.Conn with
505 | Offline -> Button("Connect", DoConnect)
498 | Offline -> Button("Connect", DoConnect)
506− | Connecting _ -> Label("Connecting...").centerTextHorizontal()
499+ | Connecting -> Label("Connecting...").centerTextHorizontal()
507 | Online _ ->
500 | Online _ ->
508 Button("Disconnect", DoDisconnect)
501 Button("Disconnect", DoDisconnect)
509 Button("Go to Conversations", Nav Conversations)
502 Button("Go to Conversations", Nav Conversations)
@@ -516,7 +509,7 @@ module App =
516 let connStr =
509 let connStr =
517 match model.Conn with
510 match model.Conn with
518 | Offline -> "OFFLINE"
511 | Offline -> "OFFLINE"
519− | Connecting _ -> "CONNECTING"
512+ | Connecting -> "CONNECTING"
520 | Online _ -> "ONLINE"
513 | Online _ -> "ONLINE"
521
514
522 let contactNames =
515 let contactNames =
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
@@ -162,11 +162,11 @@
162 </data>
162 </data>
163 <key>Skrepka.dll</key>
163 <key>Skrepka.dll</key>
164 <data>
164 <data>
165− YuvKkwqaKzWQzRQXpENlDG0Qj74=
165+ sPcmYumCi7ODANv0qBWzcUKeaPI=
166 </data>
166 </data>
167 <key>Skrepka.pdb</key>
167 <key>Skrepka.pdb</key>
168 <data>
168 <data>
169− uWv9Q0kXJ3vU7v5u8O43aOdycdk=
169+ TF5b1I6J39w2Dj1Wrqug0/yg9qg=
170 </data>
170 </data>
171 <key>Sodium.Core.dll</key>
171 <key>Sodium.Core.dll</key>
172 <data>
172 <data>
@@ -1382,14 +1382,14 @@
1382 <dict>
1382 <dict>
1383 <key>hash2</key>
1383 <key>hash2</key>
1384 <data>
1384 <data>
1385− Z58lx+z8OWKQABghiCVt0azHU+vbKzyMKcw6PrDtiNg=
1385+ BjaEjWa8QEFUOCVL1Ng+wnOYAZURekP8Q+FOVrnOCPQ=
1386 </data>
1386 </data>
1387 </dict>
1387 </dict>
1388 <key>Skrepka.pdb</key>
1388 <key>Skrepka.pdb</key>
1389 <dict>
1389 <dict>
1390 <key>hash2</key>
1390 <key>hash2</key>
1391 <data>
1391 <data>
1392− Z6xpYAcLJvuMODZXHsZdQO2dSNygZZZgeSiq725F/6s=
1392+ PCHpD3YLFr5j0LMCBnow74wXEPFzHYve3q9OnCr7KSE=
1393 </data>
1393 </data>
1394 </dict>
1394 </dict>
1395 <key>Sodium.Core.dll</key>
1395 <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
@@ -240,14 +240,14 @@
240 <dict>
240 <dict>
241 <key>hash2</key>
241 <key>hash2</key>
242 <data>
242 <data>
243− 91zpkFT4/RM8YRa7FJkiFdDR7Pto7K+XY9imNTAYHjo=
243+ J0e0G+5VLninqP1T7boUEWU/O/eykbUdWGzOK8RH4/M=
244 </data>
244 </data>
245 </dict>
245 </dict>
246 <key>MonoBundle/Skrepka.pdb</key>
246 <key>MonoBundle/Skrepka.pdb</key>
247 <dict>
247 <dict>
248 <key>hash2</key>
248 <key>hash2</key>
249 <data>
249 <data>
250− PBlWefCE9ZRLSbMgbnh+/sPWyukURBAZvneq4SzNCRA=
250+ cb32M8TckGOvsdyO5UBJyRy7PLwXN2rTWF2p7NOSjQc=
251 </data>
251 </data>
252 </dict>
252 </dict>
253 <key>MonoBundle/Sodium.Core.dll</key>
253 <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+53111fd5732cdcd3f192c7b234c1e758166a5b4e")>]
13+[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+b86f18ac7bc1810c038cac76bbaa8d60a06f932b")>]
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−0ef83a245978e87cd24a7f73f252d902b7105a6b078059a69fddd28d07e76f29
1+1073aae7a8bfac91f0bc132ade6bddfa78bd27e8884b1abd921d1a371aa4b39f
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−22
@@ -333,25 +333,3 @@
333/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.pdb
333/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.pdb
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/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Fabulous.stamp
337−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Fabulous.MauiControls.stamp
338−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/FSharp.Core.stamp
339−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Configuration.Abstractions.stamp
340−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Configuration.stamp
341−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.DependencyInjection.Abstractions.stamp
342−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.DependencyInjection.stamp
343−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Diagnostics.Abstractions.stamp
344−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.FileProviders.Abstractions.stamp
345−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Hosting.Abstractions.stamp
346−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Logging.Abstractions.stamp
347−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Logging.stamp
348−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Options.stamp
349−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Extensions.Primitives.stamp
350−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Maui.Controls.Compatibility.stamp
351−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Maui.Controls.stamp
352−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Maui.Controls.Xaml.stamp
353−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Maui.stamp
354−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Maui.Essentials.stamp
355−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Microsoft.Maui.Graphics.stamp
356−/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/resourcestamps/Sodium.Core.stamp
357−/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/53111fd5732cdcd3f192c7b234c1e758166a5b4e/*"}}
1+{"documents":{"/Users/iko/Developer/skrepka/*":"https://raw.githubusercontent.com/ilyakooo0/skrepka/b86f18ac7bc1810c038cac76bbaa8d60a06f932b/*"}}
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+ecdd432bf2c8310d4626a31121c2e9c307be193e")>]
13+[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+b86f18ac7bc1810c038cac76bbaa8d60a06f932b")>]
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−83cc1d0f7837e56dfd3e64e2491b55a1e8c0c0e8eac0237e2d9f361c0cdf8383
1+65f3a65e8aad333c4ce67904855fcf84ff492a316f7f53d5fb7bac25600d9db6
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/ecdd432bf2c8310d4626a31121c2e9c307be193e/*"}}
1+{"documents":{"/Users/iko/Developer/skrepka/*":"https://raw.githubusercontent.com/ilyakooo0/skrepka/b86f18ac7bc1810c038cac76bbaa8d60a06f932b/*"}}
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.