The storage adapter API has two parts: the built-in adapters in fabricjs-document-engine/storage, and the DocumentStorage interface your own adapter implements.
Built-in adapters
function createLocalStorage(options?: LocalStorageOptions): ManagedDocumentStorageThe same as createMemoryStorage, backed by localStorage. Also offers listDocuments() and deleteDocument(id).
function createMemoryStorage(): ManagedDocumentStorageIn-memory storage with revisions, listing and versions. Useful for tests and demos.
function createKeyValueStorage(store: KeyValueStore, prefix: string): ManagedDocumentStorageThe same, on any key-value store that has { read, write, remove, keys }.
| Name | Type | Default | Description |
|---|---|---|---|
| prefix | string | — | Prefix for every key, so several apps can share one origin. |
| storage | Storage | localStorage | Another Storage object, such as sessionStorage. |
The built-in adapters also have listDocuments() and deleteDocument(id), and support versions.
Checking an adapter
function verifyStorageAdapter(storage: DocumentStorage): Promise<AdapterReport>Runs the storage contract against your adapter and returns { ok, checks }, so you know it follows the save rules.
See verify an adapter for what each check means.
The DocumentStorage interface
| Name | Type | Default | Description |
|---|---|---|---|
| loadDocument* | (id: string): Promise<unknown> | — | Returns the stored document, or plain Fabric JSON. |
| saveDocument* | (document: FabricDocument, context: SaveContext): Promise<void | SaveResult> | — | Stores the document. Throw an error with code: 'SAVE_CONFLICT' when the stored revision differs from expectedRevision. Return { revision } if your backend assigns its own number. |
| Name | Type | Default | Description |
|---|---|---|---|
| expectedRevision* | number | null | — | The revision this editor last saved or loaded. null when the user chose to overwrite. |
| signal* | AbortSignal | — | Aborted when another document is opened. Pass it to fetch. |
Versions
A storage adapter adds these four methods to support versions:
| Name | Type | Default | Description |
|---|---|---|---|
| saveVersion* | (version: DocumentVersion): Promise<void> | — | Stores a full copy of the document as a version. |
| listVersions* | (documentId: string): Promise<VersionSummary[]> | — | Version summaries for a document, newest first. |
| loadVersion* | (documentId: string, versionId: string): Promise<DocumentVersion> | — | Returns one version. |
| deleteVersion* | (documentId: string, versionId: string): Promise<void> | — | Deletes one version. |
Conflicts
function createConflictError(documentId: string, expectedRevision: number, actualRevision: number): DocumentEngineErrorA SAVE_CONFLICT error for your storage adapter to throw.
The rules behind this storage adapter API, with a full REST example, are in custom backend.