Skip to content

[Frameforge 3] Implement durable IndexedDB project and Blob storage with stable app origins #56

Description

@danwalmsley

Outcome

Frameforge currently falls back to session-only storage. Implement actual IndexedDB persistence for projects and imported Blob media; the same infrastructure should benefit Aureon recovery. This can proceed independently of playback.

Specification and implementation

  • Implement IDBFactory.open/versioned upgrades, IDBOpenDBRequest, IDBDatabase/createObjectStore/transaction/close, IDBObjectStore.get/put and requests/transactions with result/error, upgradeneeded, success/error, complete/abort events. Specify and test key validation, structured cloning, transaction active windows, serialization and abort rollback. Audit additional standard methods before exposing a claimed profile; unimplemented operations must not appear successful.
  • Persist structured project objects and Blob/File bytes with MIME metadata. Do not store native pointer values, V8 handles or filesystem path tokens as serialized browser values. Reuse safe clone semantics and durable blob ownership.
  • Use an asynchronous transactional storage backend; document SQLite or alternative selection, schema upgrades, atomicity, quota accounting and recovery. Keep disk I/O off runtime/UI threads. Provide host-controlled data location and clear-data behavior.
  • Fix sample storage identity: the current loopback server chooses a random port on every run, changing the web origin. Design a stable admitted app origin (or stable endpoint with explicit instance-conflict policy) and persistent profile. Do not solve this by merging arbitrary origins or dropping port isolation globally.
  • Preserve origin partitioning, opaque-origin behavior, denied/unavailable storage errors and multi-context versionchange/blocked handling; settle callbacks on navigation/shutdown. Keep clear-data and deletion bounded and safe.

Tests and verification

Round-trip nested project data and binary Blobs, cross-process app restart, failed transaction rollback, concurrent writers, upgrade/blocked connections, quota/disk-write failure and origin separation. Test absence of half-written project/media pairs after interruption. Verify same app profile restores while a distinct app/origin cannot read it. Add IndexedDB WPT selections with published exclusions.

Acceptance

  • Original imported media and edited autosave restore after quitting/relaunching the packaged app.
  • Failure leaves prior committed data intact and emits real request/transaction errors.
  • Stable identity is implemented without weakening origin isolation.
  • Persistence and clone/blob tests pass in Native AOT; session fallback remains honest when unavailable.

References

IndexedDB standard.

Original application references

Shared delivery requirements

Parent: #53. Baseline: PR #43 / ce56d49; sample experiments/WebScene.Frameforge.
Reference application: https://github.com/wieslawsoltes/Frameforge (pin f414cd44896b659a5c6da2e4fc596a2ded055f2a, includes demo media and THIRD_PARTY_NOTICES.md).
Implement in WebScene, leaving original application JavaScript/WGSL unchanged. No fake capability objects, synthetic successful events or swallowed errors. Keep public contracts cross-platform with isolated backend implementations; qualify macOS arm64 first and explicitly track Windows/Linux follow-up. Production Avalonia 11 must remain supported; only samples opt into Avalonia 12. Native AOT/trim safety is mandatory.
Add focused native/managed regression coverage and a pinned WPT subset or clearly labeled project-owned contract for non-WebGPU behavior. Applicable WebGPU CTS cases belong with GPU work. Record exact revisions, test commands, negative cases and reproducible evidence in the implementation PR. Unsupported functionality cannot be marked passed; distinguish app coverage from standards conformance. Review existing implementation before adding overlapping infrastructure.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions