on master help sign in
Simplify code and improve type safety: inline Sent handling, make SendResult private, factor nowStr helper
commitd41c2bfc20d4404c4af183459e680764cd1efaed authoriko <mail@iko.soy> dateFri 10 Apr 2026, 13:53 (6 months ago) parentb1414f5
2 files changed+20−14
client/ApiClient.fs+5−2 client/App.fs+15−12
client/ApiClient.fs+5−2
@@ -18,7 +18,7 @@ module ApiClient =
1818 type MessageStatus = Delivered | Federated | Queued | Rejected | Unauthorized
1919
2020 [<CLIMutable>]
21− type SendResult = { Status: MessageStatus; MessageId: string }
21+ type private SendResult = { Status: MessageStatus; MessageId: string }
2222
2323 [<CLIMutable>]
2424 type PollResponse = { Cursor: int64; Events: PollEvent array }
@@ -105,7 +105,10 @@ module ApiClient =
105105
106106 let sendMessage (serverUrl: string) (token: string) (toHex: string) (blobHex: string) (timestamp: int64) =
107107 let body = JsonSerializer.Serialize({| ``to`` = toHex; encryptedBlob = blobHex; timestamp = timestamp |})
108− postJson<SendResult> client $"{serverUrl}/messages" body (Some token)
108+ async {
109+ let! result = postJson<SendResult> client $"{serverUrl}/messages" body (Some token)
110+ return result.Status
111+ }
109112
110113 let poll (serverUrl: string) (token: string) (cursor: int64) =
111114 let body = JsonSerializer.Serialize({| cursor = cursor; timeout = 30000 |})
client/App.fs+15−12
@@ -67,7 +67,7 @@ module App =
6767 | DoDisconnect
6868 | SetCompose of string
6969 | DoSend
70− | Sent of Result<MessageStatus, string>
70+ | Sent of Result<unit, string>
7171 | SetNewPubkey of string
7272 | SetNewNickname of string
7373 | DoSaveContact
@@ -90,6 +90,9 @@ module App =
9090
9191 // ── Helpers ──
9292
93+ let private nowStr () =
94+ DateTimeOffset.UtcNow.ToString("HH:mm:ss")
95+
9396 let private truncate maxLen (s: string) =
9497 if s.Length > maxLen then s.[..maxLen - 1] + "..." else s
9598
@@ -204,12 +207,8 @@ module App =
204207 model', [ CmdSend(session, pk, compose, id); saveCmdMsg model' ]
205208 | _ -> model, []
206209
207− | Sent(Ok(Delivered | Federated | Queued)) -> model, []
208− | Sent(Ok Rejected) ->
209− { model with Error = Some "Message rejected by server" }, []
210− | Sent(Ok Unauthorized) ->
211− { model with Error = Some "Not authorized to deliver message" }, []
212− | Sent(Error err) -> { model with Error = Some $"Send failed: {err}" }, []
210+ | Sent(Ok()) -> model, []
211+ | Sent(Error err) -> { model with Error = Some err }, []
213212
214213 | PollResult(incoming, status, newCursor) ->
215214 let model' =
@@ -327,10 +326,14 @@ module App =
327326
328327 let blob = Crypto.encrypt session.Identity.PrivKey recipPub payload
329328 let blobHex = Crypto.toHex blob
330− let! result = sendMessage session.Url session.Token recipientHex blobHex ts
331− return Sent(Ok result.Status)
329+ let! status = sendMessage session.Url session.Token recipientHex blobHex ts
330+ return
331+ match status with
332+ | Delivered | Federated | Queued -> Sent(Ok())
333+ | Rejected -> Sent(Error "Message rejected by server")
334+ | Unauthorized -> Sent(Error "Not authorized to deliver message")
332335 with ex ->
333− return Sent(Error ex.Message)
336+ return Sent(Error $"Send failed: {ex.Message}")
334337 })
335338
336339 | CmdPoll(session, cursor) ->
@@ -349,7 +352,7 @@ module App =
349352 if not ackIds.IsEmpty then
350353 do! ackMessages session.Url session.Token ackIds
351354
352− let now = DateTimeOffset.UtcNow.ToString("HH:mm:ss")
355+ let now = nowStr ()
353356
354357 let status =
355358 $"[{now}] evts:{response.Events.Length} msgs:{messages.Length} errs:{errors.Length}"
@@ -360,7 +363,7 @@ module App =
360363 | :? TimeoutException ->
361364 return PollResult([], "polling...", cursor)
362365 | ex ->
363− let now = DateTimeOffset.UtcNow.ToString("HH:mm:ss")
366+ let now = nowStr ()
364367 do! Async.Sleep 3000
365368 return PollResult([], $"[{now}] poll error: {ex.Message}", cursor)
366369 })