P2/P5: coordinate tabs and render feature preview

This commit is contained in:
2026-08-02 18:09:03 -04:00
parent cb6877be36
commit 709cfea1eb
7 changed files with 111 additions and 29 deletions

View File

@@ -3,7 +3,7 @@ import assert from 'node:assert/strict'
import { strToU8, zipSync } from 'fflate'
import { createMockFacade } from '../src/facade/mockFacade'
import { PROJECT_SCHEMA_MIGRATIONS, PROJECT_SCHEMA_SQL, PROJECT_SCHEMA_VERSION } from '../src/facade/projectSchema'
import { PersistenceWriteQueue, ProjectAutosaveScheduler } from '../src/facade/projectStore'
import { createSqliteProjectPersistence, PersistenceWriteQueue, ProjectAutosaveScheduler } from '../src/facade/projectStore'
import { DependencyGraph } from '../src/facade/dependencyGraph'
import { evaluateQuantityExpression, quantityFromNumber } from '../src/facade/units'
import { createEdgeSubshapeRefs, createSubshapeRefs, createVertexSubshapeRefs, matchSubshapes, signatureForEdge, signatureForFace, signatureForVertex } from '../src/facade/topologyNaming'
@@ -376,6 +376,27 @@ test('persistence writes are serialized and continue after a failed write', asyn
assert.equal(results[2].status, 'fulfilled')
})
test('project persistence broadcasts saved document versions across clients', async () => {
const writer = createSqliteProjectPersistence()
const observer = createSqliteProjectPersistence()
const notice = new Promise<{ documentId: string; documentVersion: number }>((resolve, reject) => {
const timer = setTimeout(() => reject(new Error('Expected cross-tab save notice.')), 250)
const unsubscribe = observer.subscribeExternalChanges((change) => {
clearTimeout(timer)
unsubscribe()
resolve(change)
})
})
const document = recomputeDocumentFixture()
const saved = await writer.save(document)
assert.equal(writer.capabilities().crossTabWriteLock, 'local-queue')
const received = await notice
assert.equal(received.documentId, saved.documentId)
assert.equal(received.documentVersion, saved.documentVersion)
await writer.dispose()
await observer.dispose()
})
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)