P2-04: coalesce facade autosaves

This commit is contained in:
2026-08-02 05:21:31 -04:00
parent 5f0d9a8d0e
commit feb2eb8be6
5 changed files with 51 additions and 6 deletions

View File

@@ -2,7 +2,7 @@ import { test } from 'node:test'
import assert from 'node:assert/strict'
import { createMockFacade } from '../src/facade/mockFacade'
import { PROJECT_SCHEMA_MIGRATIONS, PROJECT_SCHEMA_SQL, PROJECT_SCHEMA_VERSION } from '../src/facade/projectSchema'
import { PersistenceWriteQueue } from '../src/facade/projectStore'
import { PersistenceWriteQueue, ProjectAutosaveScheduler } from '../src/facade/projectStore'
test('facade exposes a stable initial document projection', () => {
const facade = createMockFacade()
@@ -42,6 +42,20 @@ test('persistence writes are serialized and continue after a failed write', asyn
assert.equal(results[2].status, 'fulfilled')
})
test('autosave scheduler coalesces idle document changes and flushes the latest version', async () => {
const savedVersions: number[] = []
const scheduler = new ProjectAutosaveScheduler(async (document) => { savedVersions.push(document.version); return { documentId: document.id, documentVersion: document.version, persistedAt: Date.now(), mode: 'sqlite-memory' } }, 5)
const document = (version: number) => ({ id: 'doc', label: 'Autosave', version, dirty: true, readOnly: false, units: 'mm', tree: [] })
scheduler.schedule(document(1))
scheduler.schedule(document(2))
await new Promise((resolve) => setTimeout(resolve, 15))
assert.deepEqual(savedVersions, [2])
scheduler.schedule(document(3))
const result = await scheduler.flush()
assert.equal(result?.documentVersion, 3)
scheduler.cancel()
})
test('workbench and selection changes are event driven', () => {
const facade = createMockFacade()
const events: string[] = []