Browser persistence and file API
Store objects in IndexedDB and retain file stages for undo/redo and explicit sync. Import from @chester-hill-solutions/stow-s3/browser.
Defaults and limits
| Setting | Value |
|---|---|
| BrowserFileHistory.maxVersions | 50; minimum 2 |
| remoteBucket | Required for file history; remote transport is optional until needed |
| Persistence ownership | Exclusive per namespace; Web Locks across tabs |
| Save completion | After durable commit, not after memory mutation |
Behavior
- openBrowserEmbeddedStow needs an EmbeddedHost and persistence adapter.
- read fetches remotely only on a local miss.
- save and saveReceipt never upload; saveReceipt omits returned file bytes.
- sync uploads the selected stage.
- undo/redo persist the cursor.
- A save after undo removes the redo branch.
- adoptRemote requires any uncertain attempt to be resolved first.
- File-history instances do not close their underlying store or host.
Errors
- BrowserPersistenceError exposes the BrowserPersistenceErrorCode union.
- FileHistoryError exposes FileHistoryErrorCode, including conflict, history_boundary, history_corrupt and uncertain_write.
- Quota or persistence failures restore the previous committed state.
- Without Web Locks, the original adapter checks ownership only within one JavaScript realm.
Example
import { BrowserFileHistory } from "@chester-hill-solutions/stow-s3/browser";
const files = await BrowserFileHistory.open(store, { remoteBucket: "files", remote });
await files.save("note.txt", new TextEncoder().encode("offline edit"));
await files.undo("note.txt");
await files.redo("note.txt");
const status = await files.sync("note.txt");
// store and remote are supplied by your application.
Symbols
BROWSER_PERSISTENCE_FORMAT_VERSION · BrowserEmbeddedStow · BrowserFileHistory · BrowserFileHistoryOptions · BrowserObjectMutation · BrowserPersistenceError · BrowserPersistenceErrorCode · DeleteBucketChange · DeleteObjectChange · FileHistoryError · FileHistoryErrorCode · FileHistoryExport · FileHistoryStatus · FileReadResult · FileSaveOptions · FileSaveReceipt · FileVersion · IndexedDbPersistenceAdapter · IndexedDbPersistenceAdapterOptions · LockManagerLike · ObjectSyncRemote · openBrowserEmbeddedStow · PersistenceAdapter · PersistenceChange · PersistenceSnapshot · PersistentEmbeddedStowOptions · PutBucketChange · PutObjectChange · RemoteObjectBasis · SyncRemoteObject · SyncRemoteWrite
BROWSER_PERSISTENCE_FORMAT_VERSION
Supported IndexedDB object format version: 1.
const BROWSER_PERSISTENCE_FORMAT_VERSION: 1;
BrowserEmbeddedStow
class BrowserEmbeddedStow {
static open(host: EmbeddedHost, options: PersistentEmbeddedStowOptions): Promise<BrowserEmbeddedStow>;
static create(host: EmbeddedHost, adapter: PersistenceAdapter, namespace: string, options?: EmbeddedStowOptions): Promise<BrowserEmbeddedStow>;
readonly handle: number;
capabilities(): Promise<EmbeddedCapabilities>;
usage(): Promise<EmbeddedUsage>;
createBucket(bucket: string): Promise<void>;
deleteBucket(bucket: string): Promise<void>;
listBuckets(): Promise<EmbeddedBucket[]>;
putObject(bucket: string, key: string, data: Uint8Array<ArrayBufferLike>, options?: EmbeddedPutOptions): Promise<EmbeddedObject>;
getObject(bucket: string, key: string): Promise<EmbeddedObject>;
headObject(bucket: string, key: string): Promise<EmbeddedObject>;
listObjects(bucket: string, options?: EmbeddedListOptions): Promise<EmbeddedObjectPage>;
deleteObject(bucket: string, key: string): Promise<void>;
writeBatch(mutations: BrowserObjectMutation[]): Promise<void>;
copyObject(sourceBucket: string, sourceKey: string, destinationBucket: string, destinationKey: string): Promise<EmbeddedObject>;
reset(): Promise<void>;
close(): Promise<void>;
}
| Field | Type | Optional | Description |
|---|---|---|---|
handle |
number |
No | Open runtime handle issued by the WASM bridge. |
BrowserEmbeddedStow.open
Open a handle. Retain it until operations finish, then close it.
open(host: EmbeddedHost, options: PersistentEmbeddedStowOptions): Promise<BrowserEmbeddedStow>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
host |
EmbeddedHost |
Yes | — | Bind address; native default is 127.0.0.1. |
options |
PersistentEmbeddedStowOptions |
Yes | — | Configuration for this operation; the parameter type lists the accepted settings. |
Returns: Promise<BrowserEmbeddedStow>.
BrowserEmbeddedStow.create
create(host: EmbeddedHost, adapter: PersistenceAdapter, namespace: string, options?: EmbeddedStowOptions): Promise<BrowserEmbeddedStow>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
host |
EmbeddedHost |
Yes | — | Bind address; native default is 127.0.0.1. |
adapter |
PersistenceAdapter |
Yes | — | Content persistence adapter; its namespace must be open before operations. |
namespace |
string |
Yes | — | Nonempty local persistence namespace; ownership is exclusive. |
options |
EmbeddedStowOptions |
No | {} | Configuration for this operation; the parameter type lists the accepted settings. |
Returns: Promise<BrowserEmbeddedStow>.
BrowserEmbeddedStow.capabilities
Return the operations and limits supported by this handle.
capabilities(): Promise<EmbeddedCapabilities>
Returns: Promise<EmbeddedCapabilities>.
BrowserEmbeddedStow.usage
Return current storage accounting.
usage(): Promise<EmbeddedUsage>
Returns: Promise<EmbeddedUsage>.
BrowserEmbeddedStow.createBucket
Create the named bucket before storing objects.
createBucket(bucket: string): Promise<void>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
bucket |
string |
Yes | — | Bucket name. Create it before storing objects. |
Returns: Promise<void>.
BrowserEmbeddedStow.deleteBucket
Remove an empty bucket; a nonempty bucket is refused.
deleteBucket(bucket: string): Promise<void>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
bucket |
string |
Yes | — | Bucket name. Create it before storing objects. |
Returns: Promise<void>.
BrowserEmbeddedStow.listBuckets
Return the buckets visible to the handle.
listBuckets(): Promise<EmbeddedBucket[]>
Returns: Promise<EmbeddedBucket[]>.
BrowserEmbeddedStow.putObject
Store complete bytes and metadata, subject to write conditions and quotas.
putObject(bucket: string, key: string, data: Uint8Array<ArrayBufferLike>, options?: EmbeddedPutOptions): Promise<EmbeddedObject>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
bucket |
string |
Yes | — | Bucket name. Create it before storing objects. |
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
data |
Uint8Array<ArrayBufferLike> |
Yes | — | Object bytes. Input ownership and size rules depend on the method. |
options |
EmbeddedPutOptions |
No | {} | Configuration for this operation; the parameter type lists the accepted settings. |
Returns: Promise<EmbeddedObject>.
BrowserEmbeddedStow.getObject
Return complete object bytes and metadata.
getObject(bucket: string, key: string): Promise<EmbeddedObject>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
bucket |
string |
Yes | — | Bucket name. Create it before storing objects. |
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
Returns: Promise<EmbeddedObject>.
BrowserEmbeddedStow.headObject
Return object metadata without reading the body into the result.
headObject(bucket: string, key: string): Promise<EmbeddedObject>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
bucket |
string |
Yes | — | Bucket name. Create it before storing objects. |
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
Returns: Promise<EmbeddedObject>.
BrowserEmbeddedStow.listObjects
Return one page. Pass nextCursor to continue when truncated is true.
listObjects(bucket: string, options?: EmbeddedListOptions): Promise<EmbeddedObjectPage>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
bucket |
string |
Yes | — | Bucket name. Create it before storing objects. |
options |
EmbeddedListOptions |
No | {} | Configuration for this operation; the parameter type lists the accepted settings. |
Returns: Promise<EmbeddedObjectPage>.
BrowserEmbeddedStow.deleteObject
Delete the selected object; deleting a missing object is idempotent.
deleteObject(bucket: string, key: string): Promise<void>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
bucket |
string |
Yes | — | Bucket name. Create it before storing objects. |
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
Returns: Promise<void>.
BrowserEmbeddedStow.writeBatch
Commit all related object mutations in one durable transaction or restore the previous state.
writeBatch(mutations: BrowserObjectMutation[]): Promise<void>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
mutations |
BrowserObjectMutation[] |
Yes | — |
Returns: Promise<void>.
BrowserEmbeddedStow.copyObject
Copy source bytes and metadata to the destination object.
copyObject(sourceBucket: string, sourceKey: string, destinationBucket: string, destinationKey: string): Promise<EmbeddedObject>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
sourceBucket |
string |
Yes | — | Bucket containing the source object. |
sourceKey |
string |
Yes | — | Source object key. |
destinationBucket |
string |
Yes | — | Bucket that receives the copy. |
destinationKey |
string |
Yes | — | Object key that receives the copy. |
Returns: Promise<EmbeddedObject>.
BrowserEmbeddedStow.reset
Clear storage state where the backend supports reset.
reset(): Promise<void>
Returns: Promise<void>.
BrowserEmbeddedStow.close
Release this handle. Do not submit new operations after closing it.
close(): Promise<void>
Returns: Promise<void>.
BrowserFileHistory
Durable file stages over the browser store.
class BrowserFileHistory {
static open(store: BrowserEmbeddedStow, options: BrowserFileHistoryOptions): Promise<BrowserFileHistory>;
read(key: string): Promise<FileReadResult>;
save(key: string, data: Uint8Array<ArrayBufferLike>, options?: FileSaveOptions): Promise<FileReadResult>;
saveReceipt(key: string, data: Uint8Array<ArrayBufferLike>, options?: FileSaveOptions): Promise<FileSaveReceipt>;
status(key: string): Promise<FileHistoryStatus>;
exportRetained(key: string, visit: (version: FileVersion, bytes: Uint8Array<ArrayBufferLike>, history: FileHistoryExport) => Promise<void>): Promise<FileHistoryExport>;
undo(key: string): Promise<FileReadResult>;
redo(key: string): Promise<FileReadResult>;
sync(key: string): Promise<FileHistoryStatus>;
adoptRemote(key: string): Promise<FileReadResult>;
}
BrowserFileHistory.open
Open a handle. Retain it until operations finish, then close it.
open(store: BrowserEmbeddedStow, options: BrowserFileHistoryOptions): Promise<BrowserFileHistory>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
store |
BrowserEmbeddedStow |
Yes | — | Open underlying object or content store supplied by the application. |
options |
BrowserFileHistoryOptions |
Yes | — | Configuration for this operation; the parameter type lists the accepted settings. |
Returns: Promise<BrowserFileHistory>.
BrowserFileHistory.read
Read the selected file's bytes.
read(key: string): Promise<FileReadResult>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
Returns: Promise<FileReadResult>.
BrowserFileHistory.save
Commit a complete local file stage before resolving.
save(key: string, data: Uint8Array<ArrayBufferLike>, options?: FileSaveOptions): Promise<FileReadResult>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
data |
Uint8Array<ArrayBufferLike> |
Yes | — | Object bytes. Input ownership and size rules depend on the method. |
options |
FileSaveOptions |
No | {} | Configuration for this operation; the parameter type lists the accepted settings. |
Returns: Promise<FileReadResult>.
BrowserFileHistory.saveReceipt
Commit a local stage and return its receipt without copying file bytes back.
saveReceipt(key: string, data: Uint8Array<ArrayBufferLike>, options?: FileSaveOptions): Promise<FileSaveReceipt>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
data |
Uint8Array<ArrayBufferLike> |
Yes | — | Object bytes. Input ownership and size rules depend on the method. |
options |
FileSaveOptions |
No | {} | Configuration for this operation; the parameter type lists the accepted settings. |
Returns: Promise<FileSaveReceipt>.
BrowserFileHistory.status
Return the selected revision, retained history and pending sync state.
status(key: string): Promise<FileHistoryStatus>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
Returns: Promise<FileHistoryStatus>.
BrowserFileHistory.exportRetained
Call visit for each retained stage while holding source history stable.
exportRetained(key: string, visit: (version: FileVersion, bytes: Uint8Array<ArrayBufferLike>, history: FileHistoryExport) => Promise<void>): Promise<FileHistoryExport>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
visit |
(version: FileVersion, bytes: Uint8Array<ArrayBufferLike>, history: FileHistoryExport) => Promise<void> |
Yes | — | Callback invoked for each retained stage during export. |
Returns: Promise<FileHistoryExport>.
BrowserFileHistory.undo
Select the preceding retained revision; fail at the history boundary.
undo(key: string): Promise<FileReadResult>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
Returns: Promise<FileReadResult>.
BrowserFileHistory.redo
Select the next retained revision; fail at the history boundary.
redo(key: string): Promise<FileReadResult>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
Returns: Promise<FileReadResult>.
BrowserFileHistory.sync
Publish the selected revision with the saved remote condition; preserve local work on conflict.
sync(key: string): Promise<FileHistoryStatus>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
Returns: Promise<FileHistoryStatus>.
BrowserFileHistory.adoptRemote
Record the current remote bytes as a confirmed stage after reconciliation.
adoptRemote(key: string): Promise<FileReadResult>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
Returns: Promise<FileReadResult>.
BrowserFileHistoryOptions
interface BrowserFileHistoryOptions {
remoteBucket: string;
remote?: ObjectSyncRemote | undefined;
historyBucket?: string | undefined;
maxVersions?: number | undefined;
}
| Field | Type | Optional | Description |
|---|---|---|---|
remoteBucket |
string |
No | Remote bucket used by file or project sync. |
remote |
ObjectSyncRemote | undefined |
Yes | Application-supplied authenticated transport for conditional remote sync. |
historyBucket |
string | undefined |
Yes | Dedicated local history bucket; do not modify it through another API. |
maxVersions |
number | undefined |
Yes | Retained revision count. Defaults to 50; must be at least 2. |
BrowserObjectMutation
All changes in a batch commit together, including failures in the WASM runtime.
type BrowserObjectMutation = {
type: "put";
bucket: string;
key: string;
data: Uint8Array;
options?: EmbeddedPutOptions;
} | {
type: "delete";
bucket: string;
key: string;
};
BrowserPersistenceError
class BrowserPersistenceError extends Error {
readonly code: BrowserPersistenceErrorCode;
constructor(code: BrowserPersistenceErrorCode, message: string);
}
| Field | Type | Optional | Description |
|---|---|---|---|
code |
BrowserPersistenceErrorCode |
No | Structured error code; inspect the code rather than matching message text. |
name |
string |
No | Name identifying this bucket, head, protection or error class. |
message |
string |
No | Human-readable error message. |
stack |
string | undefined |
Yes | JavaScript stack trace, when available. |
cause |
unknown |
Yes | Underlying error cause, when provided. |
BrowserPersistenceError.constructor
function Object() { [native code] }
constructor(code: BrowserPersistenceErrorCode, message: string)
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
code |
BrowserPersistenceErrorCode |
Yes | — | Structured error code; inspect the code rather than matching message text. |
message |
string |
Yes | — | Human-readable error message. |
Returns: BrowserPersistenceError.
BrowserPersistenceErrorCode
type BrowserPersistenceErrorCode = "persistence_unsupported" | "persistence_denied" | "already_open" | "persistence_error" | "persistence_corrupt" | "quota_exceeded" | "closed";
DeleteBucketChange
type DeleteBucketChange = {
type: "deleteBucket";
bucket: string;
};
DeleteObjectChange
type DeleteObjectChange = {
type: "deleteObject";
bucket: string;
key: string;
};
FileHistoryError
class FileHistoryError extends Error {
constructor(code: FileHistoryErrorCode, message: string);
}
| Field | Type | Optional | Description |
|---|---|---|---|
code |
FileHistoryErrorCode |
No | Structured error code; inspect the code rather than matching message text. |
name |
string |
No | Name identifying this bucket, head, protection or error class. |
message |
string |
No | Human-readable error message. |
stack |
string | undefined |
Yes | JavaScript stack trace, when available. |
cause |
unknown |
Yes | Underlying error cause, when provided. |
FileHistoryError.constructor
function Object() { [native code] }
constructor(code: FileHistoryErrorCode, message: string)
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
code |
FileHistoryErrorCode |
Yes | — | Structured error code; inspect the code rather than matching message text. |
message |
string |
Yes | — | Human-readable error message. |
Returns: FileHistoryError.
FileHistoryErrorCode
type FileHistoryErrorCode = "not_found" | "conflict" | "history_boundary" | "remote_unavailable" | "history_corrupt" | "invalid_options" | "uncertain_write";
FileHistoryExport
interface FileHistoryExport {
key: string;
remoteBucket: string;
versions: FileVersion[];
currentVersionId: string;
}
| Field | Type | Optional | Description |
|---|---|---|---|
key |
string |
No | Object or file key within the selected bucket or project. |
remoteBucket |
string |
No | Remote bucket used by file or project sync. |
versions |
FileVersion[] |
No | Retained revisions in history order. |
currentVersionId |
string |
No | Selected local stage or project revision ID. |
FileHistoryStatus
interface FileHistoryStatus {
key: string;
versions: FileVersion[];
currentVersionId: string;
pending: boolean;
canUndo: boolean;
canRedo: boolean;
remoteETag?: string | undefined;
hasUncertainWrite: boolean;
}
| Field | Type | Optional | Description |
|---|---|---|---|
key |
string |
No | Object or file key within the selected bucket or project. |
versions |
FileVersion[] |
No | Retained revisions in history order. |
currentVersionId |
string |
No | Selected local stage or project revision ID. |
pending |
boolean |
No | Whether the selected revision still needs remote confirmation. |
canUndo |
boolean |
No | Whether an earlier retained revision can be selected. |
canRedo |
boolean |
No | Whether a later retained revision can be selected. |
remoteETag |
string | undefined |
Yes | ETag of the last confirmed remote file. |
hasUncertainWrite |
boolean |
No | Whether a saved remote attempt needs reconciliation. |
FileReadResult
interface FileReadResult {
data: Uint8Array<ArrayBufferLike>;
version: FileVersion;
status: FileHistoryStatus;
}
| Field | Type | Optional | Description |
|---|---|---|---|
data |
Uint8Array<ArrayBufferLike> |
No | Object bytes. Input ownership and size rules depend on the method. |
version |
FileVersion |
No | |
status |
FileHistoryStatus |
No |
FileSaveOptions
interface FileSaveOptions extends Pick<EmbeddedPutOptions, "contentType" | "metadata"> {
label?: string | undefined;
}
| Field | Type | Optional | Description |
|---|---|---|---|
label |
string | undefined |
Yes | Optional revision label; it does not prevent retention from removing the revision. |
contentType |
string | undefined |
Yes | MIME content type attached to the object or file. |
metadata |
Record<string, string> | undefined |
Yes | User metadata included in storage and sync comparisons. |
FileSaveReceipt
A committed save without materializing the saved file again.
type FileSaveReceipt = Omit<FileReadResult, "data">;
FileVersion
interface FileVersion {
id: string;
createdAt: string;
label?: string | undefined;
contentType?: string | undefined;
metadata?: Record<string, string> | undefined;
}
| Field | Type | Optional | Description |
|---|---|---|---|
id |
string |
No | Stable identity of this workspace, file stage, revision or immutable record. |
createdAt |
string |
No | Revision creation timestamp. |
label |
string | undefined |
Yes | Optional revision label; it does not prevent retention from removing the revision. |
contentType |
string | undefined |
Yes | MIME content type attached to the object or file. |
metadata |
Record<string, string> | undefined |
Yes | User metadata included in storage and sync comparisons. |
IndexedDbPersistenceAdapter
class IndexedDbPersistenceAdapter implements PersistenceAdapter {
constructor(options?: IndexedDbPersistenceAdapterOptions);
open(namespace: string): Promise<void>;
load(namespace: string): Promise<PersistenceSnapshot | null>;
commit(namespace: string, expectedGeneration: number, changes: PersistenceChange[]): Promise<number>;
clear(namespace: string, expectedGeneration: number): Promise<number>;
close(): Promise<void>;
}
IndexedDbPersistenceAdapter.constructor
function Object() { [native code] }
constructor(options?: IndexedDbPersistenceAdapterOptions)
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
options |
IndexedDbPersistenceAdapterOptions |
No | {} | Configuration for this operation; the parameter type lists the accepted settings. |
Returns: IndexedDbPersistenceAdapter.
IndexedDbPersistenceAdapter.open
Open a handle. Retain it until operations finish, then close it.
open(namespace: string): Promise<void>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
namespace |
string |
Yes | — | Nonempty local persistence namespace; ownership is exclusive. |
Returns: Promise<void>.
IndexedDbPersistenceAdapter.load
load(namespace: string): Promise<PersistenceSnapshot | null>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
namespace |
string |
Yes | — | Nonempty local persistence namespace; ownership is exclusive. |
Returns: Promise<PersistenceSnapshot | null>.
IndexedDbPersistenceAdapter.commit
Publish all requested file changes as one project revision.
commit(namespace: string, expectedGeneration: number, changes: PersistenceChange[]): Promise<number>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
namespace |
string |
Yes | — | Nonempty local persistence namespace; ownership is exclusive. |
expectedGeneration |
number |
Yes | — | Generation that must still match when publishing. |
changes |
PersistenceChange[] |
Yes | — | File puts, deletes and fixed-length range replacements to publish together. |
Returns: Promise<number>.
IndexedDbPersistenceAdapter.clear
clear(namespace: string, expectedGeneration: number): Promise<number>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
namespace |
string |
Yes | — | Nonempty local persistence namespace; ownership is exclusive. |
expectedGeneration |
number |
Yes | — | Generation that must still match when publishing. |
Returns: Promise<number>.
IndexedDbPersistenceAdapter.close
Release this handle. Do not submit new operations after closing it.
close(): Promise<void>
Returns: Promise<void>.
IndexedDbPersistenceAdapterOptions
interface IndexedDbPersistenceAdapterOptions {
indexedDB?: IDBFactory | undefined;
databaseName?: string | undefined;
manifestStoreName?: string | undefined;
bucketStoreName?: string | undefined;
objectStoreName?: string | undefined;
lockManager?: LockManagerLike | undefined;
lockName?: ((namespace: string) => string) | undefined;
}
| Field | Type | Optional | Description |
|---|---|---|---|
indexedDB |
IDBFactory | undefined |
Yes | Optional IDBFactory override for the storage adapter. |
databaseName |
string | undefined |
Yes | Defaults to chs-stow. |
manifestStoreName |
string | undefined |
Yes | |
bucketStoreName |
string | undefined |
Yes | |
objectStoreName |
string | undefined |
Yes | |
lockManager |
LockManagerLike | undefined |
Yes | Web Locks implementation used for namespace ownership. |
lockName |
((namespace: string) => string) | undefined |
Yes |
LockManagerLike
interface LockManagerLike {
request(name: string, options: { mode: "exclusive"; ifAvailable?: boolean | undefined; }, callback: (lock: unknown) => Promise<void>): Promise<void>;
}
LockManagerLike.request
request(name: string, options: { mode: "exclusive"; ifAvailable?: boolean | undefined; }, callback: (lock: unknown) => Promise<void>): Promise<void>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
name |
string |
Yes | — | Name identifying this bucket, head, protection or error class. |
options |
{ mode: "exclusive"; ifAvailable?: boolean | undefined; } |
Yes | — | Configuration for this operation; the parameter type lists the accepted settings. |
callback |
(lock: unknown) => Promise<void> |
Yes | — |
Returns: Promise<void>.
ObjectSyncRemote
Host-owned credentials, networking and conditional object writes.
interface ObjectSyncRemote {
headObject(bucket: string, key: string): Promise<{ etag: string; size: number; metadata?: Record<string, string> | undefined; sha256?: string | undefined; } | null>;
getObject(bucket: string, key: string): Promise<SyncRemoteObject | null>;
putObject(bucket: string, key: string, data: Uint8Array<ArrayBufferLike>, options: SyncRemoteWrite): Promise<{ etag: string; }>;
}
ObjectSyncRemote.headObject
Return object metadata without reading the body into the result.
headObject(bucket: string, key: string): Promise<{ etag: string; size: number; metadata?: Record<string, string> | undefined; sha256?: string | undefined; } | null>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
bucket |
string |
Yes | — | Bucket name. Create it before storing objects. |
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
Returns: Promise<{ etag: string; size: number; metadata?: Record<string, string> | undefined; sha256?: string | undefined; } | null>.
ObjectSyncRemote.getObject
Return complete object bytes and metadata.
getObject(bucket: string, key: string): Promise<SyncRemoteObject | null>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
bucket |
string |
Yes | — | Bucket name. Create it before storing objects. |
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
Returns: Promise<SyncRemoteObject | null>.
ObjectSyncRemote.putObject
Store complete bytes and metadata, subject to write conditions and quotas.
putObject(bucket: string, key: string, data: Uint8Array<ArrayBufferLike>, options: SyncRemoteWrite): Promise<{ etag: string; }>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
bucket |
string |
Yes | — | Bucket name. Create it before storing objects. |
key |
string |
Yes | — | Object or file key within the selected bucket or project. |
data |
Uint8Array<ArrayBufferLike> |
Yes | — | Object bytes. Input ownership and size rules depend on the method. |
options |
SyncRemoteWrite |
Yes | — | Configuration for this operation; the parameter type lists the accepted settings. |
Returns: Promise<{ etag: string; }>.
openBrowserEmbeddedStow
openBrowserEmbeddedStow(host: EmbeddedHost, options: PersistentEmbeddedStowOptions): Promise<BrowserEmbeddedStow>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
host |
EmbeddedHost |
Yes | — | Bind address; native default is 127.0.0.1. |
options |
PersistentEmbeddedStowOptions |
Yes | — | Configuration for this operation; the parameter type lists the accepted settings. |
Returns: Promise<BrowserEmbeddedStow>.
PersistenceAdapter
interface PersistenceAdapter {
open(namespace: string): Promise<void>;
load(namespace: string): Promise<PersistenceSnapshot | null | undefined>;
commit(namespace: string, expectedGeneration: number, changes: PersistenceChange[]): Promise<number>;
clear(namespace: string, expectedGeneration: number): Promise<number>;
close(): Promise<void>;
}
PersistenceAdapter.open
Open a handle. Retain it until operations finish, then close it.
open(namespace: string): Promise<void>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
namespace |
string |
Yes | — | Nonempty local persistence namespace; ownership is exclusive. |
Returns: Promise<void>.
PersistenceAdapter.load
load(namespace: string): Promise<PersistenceSnapshot | null | undefined>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
namespace |
string |
Yes | — | Nonempty local persistence namespace; ownership is exclusive. |
Returns: Promise<PersistenceSnapshot | null | undefined>.
PersistenceAdapter.commit
Publish all requested file changes as one project revision.
commit(namespace: string, expectedGeneration: number, changes: PersistenceChange[]): Promise<number>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
namespace |
string |
Yes | — | Nonempty local persistence namespace; ownership is exclusive. |
expectedGeneration |
number |
Yes | — | Generation that must still match when publishing. |
changes |
PersistenceChange[] |
Yes | — | File puts, deletes and fixed-length range replacements to publish together. |
Returns: Promise<number>.
PersistenceAdapter.clear
clear(namespace: string, expectedGeneration: number): Promise<number>
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
namespace |
string |
Yes | — | Nonempty local persistence namespace; ownership is exclusive. |
expectedGeneration |
number |
Yes | — | Generation that must still match when publishing. |
Returns: Promise<number>.
PersistenceAdapter.close
Release this handle. Do not submit new operations after closing it.
close(): Promise<void>
Returns: Promise<void>.
PersistenceChange
type PersistenceChange = PutBucketChange | DeleteBucketChange | PutObjectChange | DeleteObjectChange;
PersistenceSnapshot
interface PersistenceSnapshot {
formatVersion: 1;
generation: number;
buckets: EmbeddedBucket[];
objects: EmbeddedObject[];
}
| Field | Type | Optional | Description |
|---|---|---|---|
formatVersion |
1 |
No | |
generation |
number |
No | Committed storage generation used to detect stale publication. |
buckets |
EmbeddedBucket[] |
No | Buckets to create before startup resolves, or buckets returned by inspection. |
objects |
EmbeddedObject[] |
No | Objects returned by the listing or persistence snapshot. |
PersistentEmbeddedStowOptions
interface PersistentEmbeddedStowOptions extends EmbeddedStowOptions {
namespace: string;
persistence: PersistenceAdapter;
}
| Field | Type | Optional | Description |
|---|---|---|---|
namespace |
string |
No | Nonempty local persistence namespace; ownership is exclusive. |
persistence |
PersistenceAdapter |
No | Adapter used for atomic durable object generations. |
maxBytes |
number | undefined |
Yes | Maximum managed object bytes; zero means unlimited. |
maxObjects |
number | undefined |
Yes | Maximum object count; zero means unlimited. |
PutBucketChange
type PutBucketChange = {
type: "putBucket";
bucket: EmbeddedBucket;
};
PutObjectChange
type PutObjectChange = {
type: "putObject";
object: EmbeddedObject;
};
RemoteObjectBasis
The remote must enforce this condition atomically with its write.
type RemoteObjectBasis = {
etag: string;
} | {
absent: true;
};
SyncRemoteObject
interface SyncRemoteObject {
data: Uint8Array<ArrayBufferLike>;
etag: string;
contentType?: string | undefined;
metadata?: Record<string, string> | undefined;
saveId?: string | undefined;
}
| Field | Type | Optional | Description |
|---|---|---|---|
data |
Uint8Array<ArrayBufferLike> |
No | Object bytes. Input ownership and size rules depend on the method. |
etag |
string |
No | Content validator returned by the store or provider. |
contentType |
string | undefined |
Yes | MIME content type attached to the object or file. |
metadata |
Record<string, string> | undefined |
Yes | User metadata included in storage and sync comparisons. |
saveId |
string | undefined |
Yes | Unique remote-write receipt, stored as reserved stow-save-id metadata. |
SyncRemoteWrite
interface SyncRemoteWrite {
basis: RemoteObjectBasis;
saveId: string;
contentType?: string | undefined;
metadata?: Record<string, string> | undefined;
sha256?: string | undefined;
}
| Field | Type | Optional | Description |
|---|---|---|---|
basis |
RemoteObjectBasis |
No | Confirmed remote ETag or expected absence, enforced atomically on PUT. |
saveId |
string |
No | Unique remote-write receipt, stored as reserved stow-save-id metadata. |
contentType |
string | undefined |
Yes | MIME content type attached to the object or file. |
metadata |
Record<string, string> | undefined |
Yes | User metadata included in storage and sync comparisons. |
sha256 |
string | undefined |
Yes | Full-object SHA-256 in hexadecimal, verified by the provider. |