Skip to content

Commit 516b92b

Browse files
committed
fix(task-history): atomic read-modify-write
prevents cross-process lost updates
1 parent 4e6fa84 commit 516b92b

2 files changed

Lines changed: 12 additions & 11 deletions

File tree

‎src/core/task-persistence/TaskHistoryStore.ts‎

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -915,18 +915,16 @@ export class TaskHistoryStore {
915915

916916
await safeWriteJson(indexPath, index, {
917917
merge: (existing, incoming) => {
918-
if (!existing || existing.version !== 1 || !Array.isArray(existing.entries)) {
919-
return incoming
918+
const prev = existing as HistoryIndex | null
919+
const next = incoming as HistoryIndex
920+
if (!prev || prev.version !== 1 || !Array.isArray(prev.entries)) {
921+
return next
920922
}
921-
const ourIds = new Set(incoming.entries.map((e: HistoryItem) => e.id))
922-
const peerEntries = existing.entries.filter(
923-
(e: HistoryItem) => e.id && !ourIds.has(e.id) && onDiskIds.has(e.id),
924-
)
923+
const ourIds = new Set(next.entries.map((e) => e.id))
924+
const peerEntries = prev.entries.filter((e) => e.id && !ourIds.has(e.id) && onDiskIds.has(e.id))
925925
return {
926-
...incoming,
927-
entries: [...incoming.entries, ...peerEntries].sort(
928-
(a: HistoryItem, b: HistoryItem) => b.ts - a.ts,
929-
),
926+
...next,
927+
entries: [...next.entries, ...peerEntries].sort((a, b) => b.ts - a.ts),
930928
}
931929
},
932930
})

‎src/utils/__tests__/safeWriteJson.test.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,10 @@ describe("safeWriteJson", () => {
476476

477477
const incoming = { b: 3, c: 4 }
478478
await safeWriteJson(currentTestFilePath, incoming, {
479-
merge: (existing, data) => ({ ...existing, ...data }),
479+
merge: (existing, data) => ({
480+
...(existing as Record<string, unknown>),
481+
...(data as Record<string, unknown>),
482+
}),
480483
})
481484

482485
const content = await readFileContent(currentTestFilePath)

0 commit comments

Comments
 (0)