import type { Doc } from '@automerge/automerge' import type { DocumentId } from '../document-id.js' export type { DocumentId } from '../document-id.js' export interface ContractRepo { create(): ContractDocHandle find(id: DocumentId): Promise> delete(id: DocumentId): void } export interface ContractDocHandle { readonly url: DocumentId doc(): Doc change(callback: (doc: T) => void, options?: { message?: string }): void isReady(): boolean isUnloaded(): boolean isDeleted(): boolean whenReady(): Promise unload(): void delete(): void on(event: 'change', callback: ContractChangeCallback): void off(event: 'change', callback: ContractChangeCallback): void } export interface ContractChangePayload { doc: Doc patchInfo?: { before?: Doc after?: Doc source?: string } patches?: unknown[] handle?: ContractDocHandle } export type ContractChangeCallback = (payload: ContractChangePayload) => void export interface RuntimeBackend { readonly name: string createRepo(): Promise | RuntimeRepoFixture } export interface RuntimeRepoFixture { readonly repo: ContractRepo flush?(): Promise | void restart?(): Promise | RuntimeRepoFixture cleanup?(): Promise | void } export async function flushFixture(fixture: RuntimeRepoFixture): Promise { await fixture.flush?.() } export async function cleanupFixture(fixture: RuntimeRepoFixture): Promise { await fixture.cleanup?.() }