Match pending sends by a send id the server echoes

This commit is contained in:
Ian Gulliver
2026-10-20 15:22:50 -07:00
parent b8c5331a0c
commit 8fec4b9040
29 changed files with 437 additions and 327 deletions
+19
View File
@@ -88,6 +88,7 @@ final class Store {
@ObservationIgnored private var leadStream: EventStream?
@ObservationIgnored private var stopped = false
@ObservationIgnored var changesMemory = ChangesMemory()
@ObservationIgnored private var localSends: [String: LocalSends] = [:]
init(api: API, images: ImageDrafts, forwards: Forwards) {
self.api = api
@@ -98,6 +99,22 @@ final class Store {
remote = Remote(api: api)
}
func sends(_ key: String) -> LocalSends {
if let sends = localSends[key] {
return sends
}
let sends = LocalSends()
localSends[key] = sends
return sends
}
private func confirmSend(_ key: String, _ ev: ByreEvent) {
guard ev.kind == "user.queued" || ev.kind == "user.message", let sendID = str(ev.payload.value, "send_id") else {
return
}
localSends[key]?.items.removeAll { $0.sendID == sendID }
}
func stop() async {
stopped = true
globalStream?.stop()
@@ -569,6 +586,7 @@ final class Store {
leadMore = page.more
leadStream = EventStream(api: api, after: page.events.last?.seq ?? 0, lead: true, onEvent: { [weak self] ev in
self?.leadFeed.push(ev)
self?.confirmSend("lead", ev)
}, onState: { _ in }, onReady: { [weak self] in
self?.leadFeed.load(page.events)
})
@@ -603,6 +621,7 @@ final class Store {
func handleEvent(_ ev: ByreEvent) {
if let taskId = ev.taskId {
taskFeeds[taskId]?.push(ev)
confirmSend(taskId, ev)
}
if ev.seq == 0 {
events.send(ev)