# Storage API

> The storage adapter API: createLocalStorage, createMemoryStorage, createKeyValueStorage, verifyStorageAdapter and the DocumentStorage interface.

Source: https://fabricjs-document-engine.jscrate.dev/docs/api/storage-api
Last updated: 2026-09-28

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

```ts
function createLocalStorage(options?: LocalStorageOptions): ManagedDocumentStorage
```

The same as `createMemoryStorage`, backed by `localStorage`. Also offers `listDocuments()` and `deleteDocument(id)`.

```ts
function createMemoryStorage(): ManagedDocumentStorage
```

In-memory storage with revisions, listing and versions. Useful for tests and demos.

```ts
function createKeyValueStorage(store: KeyValueStore, prefix: string): ManagedDocumentStorage
```

The 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

```ts
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](https://fabricjs-document-engine.jscrate.dev/docs/storage/verify-adapter) for what each check means.

## The DocumentStorage interface

| Name | Type | Default | Description |
| --- | --- | --- | --- |
| `loadDocument` (required) | `(id: string): Promise<unknown>` | — | Returns the stored document, or plain Fabric JSON. |
| `saveDocument` (required) | `(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` (required) | `number \| null` | — | The revision this editor last saved or loaded. `null` when the user chose to overwrite. |
| `signal` (required) | `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` (required) | `(version: DocumentVersion): Promise<void>` | — | Stores a full copy of the document as a version. |
| `listVersions` (required) | `(documentId: string): Promise<VersionSummary[]>` | — | Version summaries for a document, newest first. |
| `loadVersion` (required) | `(documentId: string, versionId: string): Promise<DocumentVersion>` | — | Returns one version. |
| `deleteVersion` (required) | `(documentId: string, versionId: string): Promise<void>` | — | Deletes one version. |

## Conflicts

```ts
function createConflictError(documentId: string, expectedRevision: number, actualRevision: number): DocumentEngineError
```

A `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](https://fabricjs-document-engine.jscrate.dev/docs/storage/custom-backend).
