Coalesce session refreshes during event bursts
This commit is contained in:
@@ -98,6 +98,8 @@ final class Store {
|
|||||||
@ObservationIgnored private var requestSeqs: [String: Int] = [:]
|
@ObservationIgnored private var requestSeqs: [String: Int] = [:]
|
||||||
@ObservationIgnored private var taskReloads: Set<String> = []
|
@ObservationIgnored private var taskReloads: Set<String> = []
|
||||||
@ObservationIgnored private var listReloads: Set<String> = []
|
@ObservationIgnored private var listReloads: Set<String> = []
|
||||||
|
@ObservationIgnored private var sessionReloads: Set<String> = []
|
||||||
|
@ObservationIgnored private var sessionRefetches: Set<String> = []
|
||||||
@ObservationIgnored private var taskRefetches: [String: Set<String>] = [:]
|
@ObservationIgnored private var taskRefetches: [String: Set<String>] = [:]
|
||||||
@ObservationIgnored private var terminalChanges = 0
|
@ObservationIgnored private var terminalChanges = 0
|
||||||
@ObservationIgnored private var streamOpens = 0
|
@ObservationIgnored private var streamOpens = 0
|
||||||
@@ -854,13 +856,9 @@ final class Store {
|
|||||||
reloadTask(ev)
|
reloadTask(ev)
|
||||||
case "session.created", "session.state", "session.subagents", "session.model":
|
case "session.created", "session.state", "session.subagents", "session.model":
|
||||||
if ev.owner != nil {
|
if ev.owner != nil {
|
||||||
spawn("load lead sessions") {
|
reloadSessions(nil)
|
||||||
try await self.loadLeadSessions()
|
|
||||||
}
|
|
||||||
} else if let taskId = ev.taskId {
|
} else if let taskId = ev.taskId {
|
||||||
spawn("load sessions") {
|
reloadSessions(taskId)
|
||||||
try await self.loadSessions(taskId)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
case "inbox.created":
|
case "inbox.created":
|
||||||
if let taskId = ev.taskId {
|
if let taskId = ev.taskId {
|
||||||
@@ -917,6 +915,34 @@ final class Store {
|
|||||||
events.send(ev)
|
events.send(ev)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func reloadSessions(_ taskId: String?) {
|
||||||
|
let key = taskId ?? "lead"
|
||||||
|
sessionRefetches.insert(key)
|
||||||
|
guard sessionReloads.insert(key).inserted else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
spawn("load sessions") {
|
||||||
|
defer {
|
||||||
|
self.sessionReloads.remove(key)
|
||||||
|
}
|
||||||
|
var failure: (any Error)?
|
||||||
|
while self.sessionRefetches.remove(key) != nil {
|
||||||
|
do {
|
||||||
|
if let taskId {
|
||||||
|
try await self.loadSessions(taskId)
|
||||||
|
} else {
|
||||||
|
try await self.loadLeadSessions()
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
failure = error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let failure {
|
||||||
|
throw failure
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func reloadTask(_ ev: ByreEvent) {
|
private func reloadTask(_ ev: ByreEvent) {
|
||||||
guard let projectId = ev.projectId, let taskId = ev.taskId else {
|
guard let projectId = ev.projectId, let taskId = ev.taskId else {
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user