on master help sign in
Simplify code and improve type safety: embed Session in ConnState, fix message ID consistency, replace mutable arrays with fold
4e71ddeiko
client/App.fs+40−39
@@ -33,15 +33,15 @@ module App =
33 | AddContact
33 | AddContact
34 | Settings
34 | Settings
35
35
36− type ConnState =
37− | Offline
38− | Connecting
39− | Online of token: string
40−
41 type Identity = { PrivKey: byte[]; PubKeyHex: string }
36 type Identity = { PrivKey: byte[]; PubKeyHex: string }
42
37
43 type Session = { Url: string; Token: string; Identity: Identity }
38 type Session = { Url: string; Token: string; Identity: Identity }
44
39
40+ type ConnState =
41+ | Offline
42+ | Connecting
43+ | Online of Session
44+
45 // ── Model ──
45 // ── Model ──
46
46
47 type Model =
47 type Model =
@@ -72,7 +72,7 @@ module App =
72 | DoDisconnect
72 | DoDisconnect
73 | SetCompose of string
73 | SetCompose of string
74 | DoSend
74 | DoSend
75− | Sent of recipient: string * status: string
75+ | Sent of status: string
76 | SetNewPubkey of string
76 | SetNewPubkey of string
77 | SetNewNickname of string
77 | SetNewNickname of string
78 | DoSaveContact
78 | DoSaveContact
@@ -87,7 +87,7 @@ module App =
87 type CmdMsg =
87 type CmdMsg =
88 | CmdGenIdentity
88 | CmdGenIdentity
89 | CmdConnect of url: string * identity: Identity
89 | CmdConnect of url: string * identity: Identity
90− | CmdSend of session: Session * recipientHex: string * text: string
90+ | CmdSend of session: Session * recipientHex: string * text: string * messageId: string
91 | CmdPoll of session: Session * cursor: uint64
91 | CmdPoll of session: Session * cursor: uint64
92 | CmdCopyToClipboard of string
92 | CmdCopyToClipboard of string
93
93
@@ -119,8 +119,8 @@ module App =
119 model.Identity |> Option.map _.PubKeyHex |> Option.defaultValue ""
119 model.Identity |> Option.map _.PubKeyHex |> Option.defaultValue ""
120
120
121 let private trySession model =
121 let private trySession model =
122− match model.Identity, model.Conn with
122+ match model.Conn with
123− | Some id, Online token -> Some { Url = model.ServerUrl; Token = token; Identity = id }
123+ | Online session -> Some session
124 | _ -> None
124 | _ -> None
125
125
126 // ── Init ──
126 // ── Init ──
@@ -164,7 +164,7 @@ module App =
164 match model.Identity with
164 match model.Identity with
165 | Some id ->
165 | Some id ->
166 let session = { Url = model.ServerUrl; Token = token; Identity = id }
166 let session = { Url = model.ServerUrl; Token = token; Identity = id }
167− { model with Conn = Online token; Page = Conversations; Error = None },
167+ { model with Conn = Online session; Page = Conversations; Error = None },
168 [ CmdPoll(session, model.PollCursor) ]
168 [ CmdPoll(session, model.PollCursor) ]
169 | None ->
169 | None ->
170 { model with Error = Some "No identity generated" }, []
170 { model with Error = Some "No identity generated" }, []
@@ -179,8 +179,9 @@ module App =
179 match model.Page, trySession model with
179 match model.Page, trySession model with
180 | Chat pk, Some session when model.ComposeText <> "" ->
180 | Chat pk, Some session when model.ComposeText <> "" ->
181 let text = model.ComposeText
181 let text = model.ComposeText
182+ let id = Guid.NewGuid().ToString()
182 let outMsg =
183 let outMsg =
183− { Id = Guid.NewGuid().ToString()
184+ { Id = id
184 Body = text
185 Body = text
185 Timestamp = DateTimeOffset.UtcNow
186 Timestamp = DateTimeOffset.UtcNow
186 IsOutgoing = true }
187 IsOutgoing = true }
@@ -189,10 +190,10 @@ module App =
189 { model with
190 { model with
190 ComposeText = ""
191 ComposeText = ""
191 Messages = model.Messages |> Map.add pk (msgs @ [ outMsg ]) },
192 Messages = model.Messages |> Map.add pk (msgs @ [ outMsg ]) },
192− [ CmdSend(session, pk, text) ]
193+ [ CmdSend(session, pk, text, id) ]
193 | _ -> model, []
194 | _ -> model, []
194
195
195− | Sent(_, status) -> { model with LastSendStatus = status }, []
196+ | Sent status -> { model with LastSendStatus = status }, []
196
197
197 | PollResult(incoming, status, newCursor) ->
198 | PollResult(incoming, status, newCursor) ->
198 let model' =
199 let model' =
@@ -312,21 +313,20 @@ module App =
312 return AuthErr ex.Message
313 return AuthErr ex.Message
313 })
314 })
314
315
315− | CmdSend(session, recipientHex, text) ->
316+ | CmdSend(session, recipientHex, text, messageId) ->
316 asyncCmd (async {
317 asyncCmd (async {
317 try
318 try
318 let pubKey = session.Identity.PrivKey.[32..63]
319 let pubKey = session.Identity.PrivKey.[32..63]
319 let recipPub = Crypto.fromHex recipientHex
320 let recipPub = Crypto.fromHex recipientHex
320− let id = Guid.NewGuid().ToString()
321 let ts = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
321 let ts = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
322
322
323 let payload =
323 let payload =
324− $"""{{ "type": "text", "id": "{id}", "timestamp": {ts}, "body": {JsonSerializer.Serialize(text)} }}"""
324+ $"""{{ "type": "text", "id": "{messageId}", "timestamp": {ts}, "body": {JsonSerializer.Serialize(text)} }}"""
325
325
326 let blob = Crypto.encrypt session.Identity.PrivKey pubKey recipPub payload
326 let blob = Crypto.encrypt session.Identity.PrivKey pubKey recipPub payload
327 let blobHex = Crypto.toHex blob
327 let blobHex = Crypto.toHex blob
328 let! (status, msgId) = ApiClient.sendMessage session.Url session.Token recipientHex blobHex ts
328 let! (status, msgId) = ApiClient.sendMessage session.Url session.Token recipientHex blobHex ts
329− return Sent(recipientHex, $"{status}:{msgId}")
329+ return Sent $"{status}:{msgId}"
330 with ex ->
330 with ex ->
331 return DismissError // TODO: show send errors properly
331 return DismissError // TODO: show send errors properly
332 })
332 })
@@ -335,29 +335,26 @@ module App =
335 asyncCmd (async {
335 asyncCmd (async {
336 try
336 try
337 let! (events, newCursor) = ApiClient.poll session.Url session.Token cursor
337 let! (events, newCursor) = ApiClient.poll session.Url session.Token cursor
338− let messages = ResizeArray()
338+ let messages, ackIds, errors =
339− let ackIds = ResizeArray()
339+ events
340− let errors = ResizeArray()
340+ |> List.fold (fun (msgs, acks, errs) (evtId, evtType, payload) ->
341−
342− for (evtId, evtType, payload) in events do
343− if evtType = "message" then
341+ if evtType <> "message" then (msgs, acks, errs)
342+ else
344− match decryptEvent session.Identity.PrivKey payload with
343+ match decryptEvent session.Identity.PrivKey payload with
345− | Ok msg ->
344+ | Ok msg -> (msg :: msgs, evtId :: acks, errs)
346− messages.Add(msg)
347− ackIds.Add(evtId)
348− | Error err ->
345+ | Error err -> (msgs, acks, err :: errs))
349− errors.Add(err)
346+ ([], [], [])
350−
347+
351− if ackIds.Count > 0 then
348+ if not ackIds.IsEmpty then
352− do! ApiClient.ackMessages session.Url session.Token (Seq.toList ackIds)
349+ do! ApiClient.ackMessages session.Url session.Token ackIds
353
350
354 let now = DateTimeOffset.UtcNow.ToString("HH:mm:ss")
351 let now = DateTimeOffset.UtcNow.ToString("HH:mm:ss")
355
352
356 let status =
353 let status =
357− $"[{now}] evts:{events.Length} msgs:{messages.Count} errs:{errors.Count}"
354+ $"[{now}] evts:{events.Length} msgs:{messages.Length} errs:{errors.Length}"
358− + (if errors.Count > 0 then $" [{errors.[0]}]" else "")
355+ + (match errors with err :: _ -> $" [{err}]" | [] -> "")
359
356
360− return PollResult(Seq.toList messages, status, newCursor)
357+ return PollResult(List.rev messages, status, newCursor)
361 with
358 with
362 | :? TimeoutException ->
359 | :? TimeoutException ->
363 return PollResult([], "polling...", cursor)
360 return PollResult([], "polling...", cursor)
@@ -411,12 +408,14 @@ module App =
411
408
412 Entry(model.ServerUrl, SetServerUrl)
409 Entry(model.ServerUrl, SetServerUrl)
413
410
414− if model.Error.IsSome then
411+ match model.Error with
415− Label(model.Error.Value)
412+ | Some err ->
413+ Label(err)
416 .textColor(Colors.Red)
414 .textColor(Colors.Red)
417 .font(size = 12.)
415 .font(size = 12.)
418
416
419 Button("Dismiss", DismissError)
417 Button("Dismiss", DismissError)
418+ | None -> ()
420
419
421 match model.Conn with
420 match model.Conn with
422 | Offline -> Button("Connect", DoConnect)
421 | Offline -> Button("Connect", DoConnect)
@@ -504,10 +503,12 @@ module App =
504 .centerTextHorizontal()
503 .centerTextHorizontal()
505 }
504 }
506
505
507− if model.Error.IsSome then
506+ match model.Error with
508− Label(model.Error.Value)
507+ | Some err ->
508+ Label(err)
509 .textColor(Colors.Red)
509 .textColor(Colors.Red)
510 .font(size = 11.)
510 .font(size = 11.)
511+ | None -> ()
511
512
512 Label($"[{msgs.Length} message(s), compose: \"{model.ComposeText}\", send: \"{model.LastSendStatus}\"]")
513 Label($"[{msgs.Length} message(s), compose: \"{model.ComposeText}\", send: \"{model.LastSendStatus}\"]")
513 .textColor(Colors.Gray)
514 .textColor(Colors.Gray)
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− CeTBQvhkvL1/EcEY1Kac+n8Bx9Q=
165+ w0DNyNBaWuiqu3JZ6IK1CiXdyds=
166 </data>
166 </data>
167 <key>Skrepka.pdb</key>
167 <key>Skrepka.pdb</key>
168 <data>
168 <data>
169− 6zfAl+vMNts+V2cDihTfBAU7qE8=
169+ hNL2aGSgObSukvwWpEaqXFxLTBo=
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− hOO3wSiltqVfbPfmOuTAxv7lmEs2WLwwm5MvkCv2Zes=
1385+ yNVPEWWcGVOLcPWRCJjH6KBfR5tg8HAAMmICMYmZsjw=
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− kmjBQN07kWsY1/HXhYkdO3kjdifQq2fFkig7HxmMRYk=
1392+ MgZLilBsY5Eg6Pq6+oq50VZhoEZaSvPWBs2XmbQDLbU=
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− Vn+FDLReC1N3ufTvaWxAof2GDpXaFK15kE1qnv30lfo=
243+ /uLW7Tc9NVMGFfD1b32rCguDE4br7LeNsm+PES0pAks=
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− a7AKD+ddEPH8nfW+/IfEzsna2CWaA+HD2IezDhWtizg=
250+ qfBPe8FloTdTl+WOYlEwzh8tv0jPIazccIUsJqaDSNE=
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+3964fd862ab856cbb1406ad52f4523dd2c119a53")>]
13+[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+952040910192b24cfad159457c94cebd8040466a")>]
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−d9154c820b51f064aa00760cde29d657ca60e63964b18a475cf0ad904f6074d9
1+be41ec7873ea59244c1fc90c226419f96480720bb1f4b6c0a8bec31bba3b7b3d
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/3964fd862ab856cbb1406ad52f4523dd2c119a53/*"}}
1+{"documents":{"/Users/iko/Developer/skrepka/*":"https://raw.githubusercontent.com/ilyakooo0/skrepka/952040910192b24cfad159457c94cebd8040466a/*"}}
client/obj/Debug/net10.0-ios/iossimulator-arm64/linked/Skrepka.dll

Binary file not shown.

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

Binary file not shown.

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+3964fd862ab856cbb1406ad52f4523dd2c119a53")>]
13+[<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+952040910192b24cfad159457c94cebd8040466a")>]
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−7730279932bc940b8619bf395e54c158db9633d590a5927d35446a96c7518d10
1+5791a1e99cb6c99782086d8078b57b4c711d3c1cac05e3842ccb2c434657a739
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/3964fd862ab856cbb1406ad52f4523dd2c119a53/*"}}
1+{"documents":{"/Users/iko/Developer/skrepka/*":"https://raw.githubusercontent.com/ilyakooo0/skrepka/952040910192b24cfad159457c94cebd8040466a/*"}}
client/obj/Debug/net10.0-maccatalyst/maccatalyst-arm64/linked/Skrepka.dll

Binary file not shown.

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

Binary file not shown.

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.