on master help sign in
Improve type safety and simplify code: named API types, filter events at boundary, record types for Msg cases, eliminate redundant encrypt parameter
commitecdd432bf2c8310d4626a31121c2e9c307be193e authoriko <mail@iko.soy> dateFri 10 Apr 2026, 00:15 (6 months ago) parent53111fd
28 files changed+91−64
client/ApiClient.fs+14−10 client/App.fs+41−41 client/Crypto.fs+2−1 client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.app/Skrepka.dll client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.app/Skrepka.pdb client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.app/_CodeSignature/CodeResources+4−4 client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.dll client/bin/Debug/net10.0-ios/iossimulator-arm64/Skrepka.pdb client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.app/Contents/MonoBundle/Skrepka.dll client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.app/Contents/MonoBundle/Skrepka.pdb client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.app/Contents/_CodeSignature/CodeResources+2−2 client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.dll client/bin/Debug/net10.0-maccatalyst/maccatalyst-arm64/Skrepka.pdb client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.AssemblyInfo.fs+1−1 client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.AssemblyInfoInputs.cache+1−1 client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.dll client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.fsproj.FileListAbsolute.txt+22 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/ApiClient.fs+14−10
@@ -8,7 +8,11 @@ open System.Threading.Tasks
88
99module ApiClient =
1010
11− type PollEvent = { Id: string; EventType: string; Payload: JsonElement }
11+ type PollEvent = { Id: string; Payload: JsonElement }
12+
13+ type AuthResult = { Token: string; ExpiresAt: int64 }
14+ type SendResult = { Status: string; MessageId: string }
15+ type PollResponse = { Events: PollEvent list; Cursor: uint64 }
1216
1317 /// Awaits a Task without converting TaskCanceledException to F# async
1418 /// cancellation (which bypasses try...with). Re-raises it as a regular exception.
@@ -72,9 +76,9 @@ module ApiClient =
7276
7377 let! doc = postJson $"{serverUrl}/auth/verify" body None
7478 let root = expectObject doc "/auth/verify"
75− let token = root.GetProperty("token").GetString()
76− let expiresAt = root.GetProperty("expiresAt").GetInt64()
77− return (token, expiresAt)
79+ return
80+ { Token = root.GetProperty("token").GetString()
81+ ExpiresAt = root.GetProperty("expiresAt").GetInt64() }
7882 }
7983
8084 let sendMessage (serverUrl: string) (token: string) (toHex: string) (blobHex: string) (timestamp: int64) =
@@ -84,9 +88,9 @@ module ApiClient =
8488
8589 let! doc = postJson $"{serverUrl}/messages" body (Some token)
8690 let root = expectObject doc "/messages"
87− let status = root.GetProperty("status").GetString()
88− let msgId = root.GetProperty("messageId").GetString()
89− return (status, msgId)
91+ return
92+ { Status = root.GetProperty("status").GetString()
93+ MessageId = root.GetProperty("messageId").GetString() }
9094 }
9195
9296 let private pollClient =
@@ -110,13 +114,13 @@ module ApiClient =
110114
111115 let events =
112116 [ for e in events.EnumerateArray() do
113− if e.ValueKind = JsonValueKind.Object then
117+ if e.ValueKind = JsonValueKind.Object
118+ && e.GetProperty("eventType").GetString() = "message" then
114119 yield
115120 { Id = e.GetProperty("id").GetString()
116− EventType = e.GetProperty("eventType").GetString()
117121 Payload = e.GetProperty("payload") } ]
118122
119− return (events, cursor)
123+ return { Events = events; Cursor = cursor }
120124 }
121125
122126 let ackMessages (serverUrl: string) (token: string) (messageIds: string list) =
client/App.fs+41−41
@@ -43,6 +43,15 @@ module App =
4343 | Connecting
4444 | Online of Session
4545
46+ type PollResultData =
47+ { Messages: IncomingMessage list
48+ Status: string
49+ Cursor: uint64 }
50+
51+ type LoadedState =
52+ { Identity: Identity option
53+ Data: Store.DataDto option }
54+
4655 // ── Model ──
4756
4857 type Model =
@@ -78,11 +87,11 @@ module App =
7887 | SetNewNickname of string
7988 | DoSaveContact
8089 | DoDeleteContact of string
81− | PollResult of messages: IncomingMessage list * status: string * cursor: uint64
90+ | PollResult of PollResultData
8291 | DoPoll
8392 | CopyPubKey
8493 | DismissError
85− | StateLoaded of Identity option * Store.DataDto option
94+ | StateLoaded of LoadedState
8695
8796 // ── CmdMsg ──
8897
@@ -110,6 +119,9 @@ module App =
110119 let private messagesFor (pk: string) (messages: Map<string, ChatMessage list>) =
111120 messages |> Map.tryFind pk |> Option.defaultValue []
112121
122+ let private appendMessage (pk: string) (msg: ChatMessage) (messages: Map<string, ChatMessage list>) =
123+ messages |> Map.add pk (messagesFor pk messages @ [ msg ])
124+
113125 let private addContactIfNew (contact: Contact) (contacts: Contact list) =
114126 if contacts |> List.exists (fun c -> c.Pubkey = contact.Pubkey) then contacts
115127 else contacts @ [ contact ]
@@ -194,26 +206,23 @@ module App =
194206 Body = text
195207 Timestamp = DateTimeOffset.UtcNow
196208 IsOutgoing = true }
197− let msgs = messagesFor pk model.Messages
198209
199210 let model' =
200211 { model with
201212 ComposeText = ""
202− Messages = model.Messages |> Map.add pk (msgs @ [ outMsg ]) }
213+ Messages = model.Messages |> appendMessage pk outMsg }
203214
204215 model', CmdSend(session, pk, text, id) :: saveCmd model'
205216 | _ -> model, []
206217
207218 | Sent status -> { model with LastSendStatus = status }, []
208219
209− | PollResult(incoming, status, newCursor) ->
220+ | PollResult { Messages = incoming; Status = status; Cursor = newCursor } ->
210221 let model' =
211222 incoming
212223 |> List.fold
213224 (fun m msg ->
214− let msgs = messagesFor msg.FromPubkey m.Messages
215−
216− if msgs |> List.exists (fun x -> x.Id = msg.MessageId) then
225+ if messagesFor msg.FromPubkey m.Messages |> List.exists (fun x -> x.Id = msg.MessageId) then
217226 m
218227 else
219228 let chatMsg =
@@ -224,7 +233,7 @@ module App =
224233
225234 { m with
226235 Contacts = m.Contacts |> addContactIfNew { Pubkey = msg.FromPubkey; Nickname = truncKey msg.FromPubkey }
227− Messages = m.Messages |> Map.add msg.FromPubkey (msgs @ [ chatMsg ]) })
236+ Messages = m.Messages |> appendMessage msg.FromPubkey chatMsg })
228237 { model with PollStatus = status; PollCursor = newCursor }
229238
230239 let cmds =
@@ -273,10 +282,12 @@ module App =
273282
274283 | DismissError -> { model with Error = None }, []
275284
276− | StateLoaded(identityOpt, dataOpt) ->
285+ | StateLoaded { Identity = identityOpt; Data = dataOpt } ->
277286 match identityOpt with
278287 | None -> model, []
279288 | Some identity ->
289+ let model' = { model with Identity = Some identity; Conn = Connecting }
290+
280291 let model' =
281292 match dataOpt with
282293 | Some data ->
@@ -302,22 +313,14 @@ module App =
302313 acc |> Map.add pk msgs)
303314 Map.empty
304315
305− { model with
306− Identity = Some identity
316+ { model' with
307317 Contacts = contacts
308318 Messages = messages
309− ServerUrl =
310− if data.ServerUrl <> "" then data.ServerUrl
311− else model.ServerUrl
319+ ServerUrl = if data.ServerUrl <> "" then data.ServerUrl else model.ServerUrl
312320 PollCursor = data.PollCursor
313− Page = Conversations
314− Conn = Connecting }
321+ Page = Conversations }
315322
316− | None ->
317− { model with
318− Identity = Some identity
319− Page = Settings
320− Conn = Connecting }
323+ | None -> { model' with Page = Settings }
321324
322325 model', [ CmdConnect(model'.ServerUrl, identity) ]
323326
@@ -366,12 +369,12 @@ module App =
366369 try
367370 let! challenge = ApiClient.requestChallenge url identity.PubKeyHex
368371 let sigHex = Crypto.signChallenge identity.PrivKey challenge
369− let! (token, _) = ApiClient.verify url identity.PubKeyHex challenge sigHex
372+ let! result = ApiClient.verify url identity.PubKeyHex challenge sigHex
370373
371− if String.IsNullOrEmpty(token) then
374+ if String.IsNullOrEmpty(result.Token) then
372375 return AuthErr "Authentication rejected by server"
373376 else
374− return AuthOk token
377+ return AuthOk result.Token
375378 with ex ->
376379 return AuthErr ex.Message
377380 })
@@ -379,17 +382,16 @@ module App =
379382 | CmdSend(session, recipientHex, text, messageId) ->
380383 asyncCmd (async {
381384 try
382− let pubKey = Crypto.fromHex session.Identity.PubKeyHex
383385 let recipPub = Crypto.fromHex recipientHex
384386 let ts = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
385387
386388 let payload =
387389 $"""{{ "type": "text", "id": "{messageId}", "timestamp": {ts}, "body": {JsonSerializer.Serialize(text)} }}"""
388390
389− let blob = Crypto.encrypt session.Identity.PrivKey pubKey recipPub payload
391+ let blob = Crypto.encrypt session.Identity.PrivKey recipPub payload
390392 let blobHex = Crypto.toHex blob
391− let! (status, msgId) = ApiClient.sendMessage session.Url session.Token recipientHex blobHex ts
392− return Sent $"{status}:{msgId}"
393+ let! result = ApiClient.sendMessage session.Url session.Token recipientHex blobHex ts
394+ return Sent $"{result.Status}:{result.MessageId}"
393395 with ex ->
394396 return DismissError // TODO: show send errors properly
395397 })
@@ -397,15 +399,13 @@ module App =
397399 | CmdPoll(session, cursor) ->
398400 asyncCmd (async {
399401 try
400− let! (events, newCursor) = ApiClient.poll session.Url session.Token cursor
402+ let! response = ApiClient.poll session.Url session.Token cursor
401403 let messages, ackIds, errors =
402− events
404+ response.Events
403405 |> List.fold (fun (msgs, acks, errs) evt ->
404− if evt.EventType <> "message" then (msgs, acks, errs)
405− else
406− match decryptEvent session.Identity.PrivKey evt.Payload with
407− | Ok msg -> (msg :: msgs, evt.Id :: acks, errs)
408− | Error err -> (msgs, acks, err :: errs))
406+ match decryptEvent session.Identity.PrivKey evt.Payload with
407+ | Ok msg -> (msg :: msgs, evt.Id :: acks, errs)
408+ | Error err -> (msgs, acks, err :: errs))
409409 ([], [], [])
410410
411411 if not ackIds.IsEmpty then
@@ -414,17 +414,17 @@ module App =
414414 let now = DateTimeOffset.UtcNow.ToString("HH:mm:ss")
415415
416416 let status =
417− $"[{now}] evts:{events.Length} msgs:{messages.Length} errs:{errors.Length}"
417+ $"[{now}] evts:{response.Events.Length} msgs:{messages.Length} errs:{errors.Length}"
418418 + (match errors with err :: _ -> $" [{err}]" | [] -> "")
419419
420− return PollResult(List.rev messages, status, newCursor)
420+ return PollResult { Messages = List.rev messages; Status = status; Cursor = response.Cursor }
421421 with
422422 | :? TimeoutException ->
423− return PollResult([], "polling...", cursor)
423+ return PollResult { Messages = []; Status = "polling..."; Cursor = cursor }
424424 | ex ->
425425 let now = DateTimeOffset.UtcNow.ToString("HH:mm:ss")
426426 do! Async.Sleep 3000
427− return PollResult([], $"[{now}] poll error: {ex.Message}", cursor)
427+ return PollResult { Messages = []; Status = $"[{now}] poll error: {ex.Message}"; Cursor = cursor }
428428 })
429429
430430 | CmdCopyToClipboard text ->
@@ -436,7 +436,7 @@ module App =
436436 asyncCmd (async {
437437 let! identity = Store.loadIdentity ()
438438 let data = Store.loadData ()
439− return StateLoaded(identity, data)
439+ return StateLoaded { Identity = identity; Data = data }
440440 })
441441
442442 | CmdSaveIdentity identity ->
client/Crypto.fs+2−1
@@ -23,7 +23,8 @@ module Crypto =
2323 let message = Encoding.UTF8.GetBytes(challenge)
2424 PublicKeyAuth.SignDetached(message, privKey) |> toHex
2525
26− let encrypt (senderPrivKey: byte[]) (senderPubKey: byte[]) (recipientEd25519Pub: byte[]) (plaintext: string) : byte[] =
26+ let encrypt (senderPrivKey: byte[]) (recipientEd25519Pub: byte[]) (plaintext: string) : byte[] =
27+ let senderPubKey = senderPrivKey.[32..63]
2728 let ephKp = PublicKeyBox.GenerateKeyPair()
2829 let recipientX25519Pub =
2930 PublicKeyAuth.ConvertEd25519PublicKeyToCurve25519PublicKey(recipientEd25519Pub)
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 @@
162162 </data>
163163 <key>Skrepka.dll</key>
164164 <data>
165− OYwezEvMh2kSn1TCF4gpKXKXgYw=
165+ YuvKkwqaKzWQzRQXpENlDG0Qj74=
166166 </data>
167167 <key>Skrepka.pdb</key>
168168 <data>
169− 6T2QPZw7EFCnFUY/89Ch+oEzRXg=
169+ uWv9Q0kXJ3vU7v5u8O43aOdycdk=
170170 </data>
171171 <key>Sodium.Core.dll</key>
172172 <data>
@@ -1382,14 +1382,14 @@
13821382 <dict>
13831383 <key>hash2</key>
13841384 <data>
1385− PMoIkhU1O9+V8P8AeaDyQljOgjR+z5qeuTBn7D/FSGw=
1385+ Z58lx+z8OWKQABghiCVt0azHU+vbKzyMKcw6PrDtiNg=
13861386 </data>
13871387 </dict>
13881388 <key>Skrepka.pdb</key>
13891389 <dict>
13901390 <key>hash2</key>
13911391 <data>
1392− YgnXPdc3zZf1mp7BgJZWvrcJtCSxwIhEufHWuJjK14o=
1392+ Z6xpYAcLJvuMODZXHsZdQO2dSNygZZZgeSiq725F/6s=
13931393 </data>
13941394 </dict>
13951395 <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 @@
240240 <dict>
241241 <key>hash2</key>
242242 <data>
243− sen9DAcM5m8/Ohc6ElADTlEOrvFEm1sSA7fRowfDgrc=
243+ 91zpkFT4/RM8YRa7FJkiFdDR7Pto7K+XY9imNTAYHjo=
244244 </data>
245245 </dict>
246246 <key>MonoBundle/Skrepka.pdb</key>
247247 <dict>
248248 <key>hash2</key>
249249 <data>
250− Ef11Yo4fM1PomVMJpvG73Vxp5MIfM56316luhoVVjyk=
250+ PBlWefCE9ZRLSbMgbnh+/sPWyukURBAZvneq4SzNCRA=
251251 </data>
252252 </dict>
253253 <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+06f6fccd5eca861f9f6aea926abad74a25306378")>]
13+[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+53111fd5732cdcd3f192c7b234c1e758166a5b4e")>]
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−eedd99803c3b27d5759de189487d1f622004d1f2067c5139ac9be1722d4be89f
1+0ef83a245978e87cd24a7f73f252d902b7105a6b078059a69fddd28d07e76f29
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,3 +333,25 @@
333333/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.pdb
334334/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/Skrepka.genruntimeconfig.cache
335335/Users/iko/Developer/skrepka/client/obj/Debug/net10.0-ios/iossimulator-arm64/ref/Skrepka.dll
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/06f6fccd5eca861f9f6aea926abad74a25306378/*"}}
1+{"documents":{"/Users/iko/Developer/skrepka/*":"https://raw.githubusercontent.com/ilyakooo0/skrepka/53111fd5732cdcd3f192c7b234c1e758166a5b4e/*"}}
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+06f6fccd5eca861f9f6aea926abad74a25306378")>]
13+[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+53111fd5732cdcd3f192c7b234c1e758166a5b4e")>]
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−b108f228be3a948e3c34a84a66948ebb1deac8d4a1b601338c34457cdb6bbecd
1+258df1087fc418adab33f09b6403611ecf00ae4643e2b1d8257eaca6be4c82ac
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/06f6fccd5eca861f9f6aea926abad74a25306378/*"}}
1+{"documents":{"/Users/iko/Developer/skrepka/*":"https://raw.githubusercontent.com/ilyakooo0/skrepka/53111fd5732cdcd3f192c7b234c1e758166a5b4e/*"}}
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.