41 lines
2.9 KiB
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>
|