Skip to content

Commit df2731b

Browse files
committed
refactor(tui): clarify pending reconciliation
1 parent 8f98e5b commit df2731b

1 file changed

Lines changed: 26 additions & 12 deletions

File tree

packages/tui/src/context/data.tsx

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,16 @@ function createSync() {
121121
}
122122
}
123123

124+
// Apply local admissions and promotions that arrived while the server snapshot was loading.
125+
function reconcilePendingInputs(baseline: string[], current: string[], server: string[]) {
126+
const result = new Set(server)
127+
const before = new Set(baseline)
128+
const now = new Set(current)
129+
baseline.filter((id) => !now.has(id)).forEach((id) => result.delete(id))
130+
current.filter((id) => !before.has(id)).forEach((id) => result.add(id))
131+
return [...result]
132+
}
133+
124134
export const { use: useData, provider: DataProvider } = createSimpleContext({
125135
name: "Data",
126136
init: () => {
@@ -985,26 +995,30 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
985995
},
986996
sync(sessionID: string) {
987997
return sync.run(`session.message:${sessionID}`, async () => {
988-
const inputsBeforeSync = new Set(store.session.input[sessionID] ?? [])
998+
const localInputs = store.session.input[sessionID] ?? []
989999
const [projected, pending] = await Promise.all([
9901000
client.api.message.list({ sessionID, limit: 200, order: "desc" }),
9911001
client.api.session.pending.list({ sessionID }),
9921002
])
993-
const messages = projected.data.toReversed()
994-
const projectedIDs = new Set(messages.map((message) => message.id))
995-
const pendingMessages = pending.filter((item) => !projectedIDs.has(item.id)).map(message.fromPending)
996-
const next = [...messages, ...pendingMessages]
997-
messageIndex.set(sessionID, new Map(next.map((message, index) => [message.id, index])))
998-
const inputsAfterSync = new Set(store.session.input[sessionID] ?? [])
1003+
const pendingMessages = pending.map(message.fromPending)
1004+
const next = projected.data.toReversed()
1005+
const index = new Map(next.map((message, index) => [message.id, index]))
1006+
const localInputIDs = new Set(localInputs)
1007+
store.session.message[sessionID]
1008+
?.filter((message) => localInputIDs.has(message.id))
1009+
.forEach((item) => message.append(next, index, item))
1010+
pendingMessages.forEach((item) => message.append(next, index, item))
1011+
messageIndex.set(sessionID, index)
9991012
setStore(
10001013
"session",
10011014
"input",
10021015
sessionID,
1003-
pendingMessages.flatMap((message) =>
1004-
(message.type === "user" || message.type === "synthetic") &&
1005-
(!inputsBeforeSync.has(message.id) || inputsAfterSync.has(message.id))
1006-
? [message.id]
1007-
: [],
1016+
reconcilePendingInputs(
1017+
localInputs,
1018+
store.session.input[sessionID] ?? [],
1019+
pendingMessages.flatMap((message) =>
1020+
message.type === "user" || message.type === "synthetic" ? [message.id] : [],
1021+
),
10081022
),
10091023
)
10101024
setStore("session", "message", sessionID, reconcile(next))

0 commit comments

Comments
 (0)