Files
Web_FreeCAD_Bitbybit/public/chrome-persistence-harness.html

41 lines
2.9 KiB
HTML

<!doctype html>
<meta charset="utf-8">
<title>Chrome OPFS persistence harness</title>
<pre id="result">running</pre>
<script type="module">
import { createSqliteProjectPersistence } from '/src/facade/projectStore.ts'
const output = document.querySelector('#result')
const report = { schemaVersion: 1, browserId: 'chrome', crossOriginIsolated: globalThis.crossOriginIsolated === true, status: 'running' }
const documentSnapshot = {
id: 'chrome-opfs-persistence', label: 'Chrome OPFS persistence', version: 7, dirty: true, readOnly: false, units: 'mm',
tree: [{ id: 'root', label: 'Root', type: 'feature', state: 'valid' }],
objects: [{ id: 'root', typeId: 'PartDesign::Feature', properties: [{ name: 'Label', label: 'Label', type: 'App::PropertyString', value: 'Root', recompute: false }] }],
dependencies: [], recompute: { generation: 2, status: 'completed', objectStates: { root: 'up-to-date' }, dirtyObjects: [], order: ['root'], errors: [] },
}
let persistence
try {
persistence = createSqliteProjectPersistence()
const capabilities = await persistence.initialize()
const saved = await persistence.save(documentSnapshot)
const loaded = await persistence.load(documentSnapshot.id)
const checkpoint = await persistence.loadCheckpoint(documentSnapshot.id, documentSnapshot.version)
const bytes = new TextEncoder().encode('chrome-opfs-resource')
const resource = await persistence.resource.put(bytes, 'text/plain')
const restoredBytes = await persistence.resource.get(resource.hash)
await persistence.resource.release(resource.hash)
const recovery = await persistence.recovery(documentSnapshot.id)
report.capabilities = capabilities
report.roundTrip = { savedMode: saved.mode, loadedVersion: loaded?.version ?? null, loadedLabel: loaded?.label ?? null, checkpointVersion: checkpoint?.version ?? null, resourceRoundTrip: restoredBytes ? new TextDecoder().decode(restoredBytes) === 'chrome-opfs-resource' : false, recoveryIntegrity: recovery.integrity, checkpointCount: recovery.checkpoints.length }
report.status = report.crossOriginIsolated && capabilities.mode === 'sqlite-opfs' && capabilities.sqliteWasm && capabilities.opfs && saved.mode === 'sqlite-opfs' && loaded?.id === documentSnapshot.id && loaded.version === documentSnapshot.version && checkpoint?.version === documentSnapshot.version && report.roundTrip.resourceRoundTrip && recovery.integrity === 'ok' ? 'pass' : 'failed'
} catch (error) {
report.status = 'failed'
report.error = error instanceof Error ? `${error.name}: ${error.message}` : String(error)
} finally {
await persistence?.dispose().catch(() => {})
}
output.textContent = JSON.stringify(report, null, 2)
await fetch('/__persistence-report', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(report) })
if (report.status !== 'pass') throw new Error(report.error || 'Chrome OPFS persistence harness failed.')
</script>