export declare type ErrorCode = 'invalid-sync-id' | 'invalid-commits' | 'internal' | 'disconnected' | 'network' | 'bad-request' | 'unauthorized'; export declare type BaseCommit = { ref: string; baseRef?: string; delta?: Delta; metadata: CommitMetadata; }; export declare type EditCommit = BaseCommit; export declare type MergeCommit = BaseCommit & { baseRef: string; mergeRef: string; }; export declare function isMergeCommit(commit: Commit): commit is MergeCommit; export declare type CommitInfo = { ref: string; baseRef?: string; mergeRef?: string; }; export declare type Commit = MergeCommit | EditCommit; export declare type LocalReadStatus = 'loading' /** reading state from disk */ | 'error' | 'ready'; /** have latest state from disk, receiving local changes */ export declare type LocalSaveStatus = 'ready' /** no changes in local memory */ | 'error' | 'pending' /** changes in local memory, not sent to store yet */ | 'saving'; /** sent changes to local store, no `ack` yet */ export declare type RemoteConnectStatus = 'offline' | 'connecting' | 'online'; export declare type RemoteReadStatus = 'offline' | 'loading' | 'ready' | 'error' /** the remote is in a persistent bad state */; export declare type RemoteSaveStatus = 'ready' /** all local state has been synced to remote (though maybe local changes in memory) */ | 'pending' /** we have local state that hasn't been sent to remote yet (maybe offline) */ | 'saving' /** we got an error back from remote when saving commits */ | 'error'; /** we sent local state to remote, but haven't got `ack` yet */ export declare type SyncStatus = { localRead: LocalReadStatus; localSave: LocalSaveStatus; remoteConnect: RemoteConnectStatus; remoteRead: RemoteReadStatus; remoteSave: RemoteSaveStatus; }; export declare type ClientPresenceRef = { ref: string | undefined; presence: Presence | undefined; }; export declare type ClientInfo = ClientPresenceRef & { userId: string; clientId: string; }; export declare type LocalClientInfo = ClientInfo & { self?: true; }; export declare type ClientList = readonly LocalClientInfo[]; export declare type InitEvent = { type: 'init'; version?: undefined; lastSyncId: string | undefined; auth: unknown; } | { type: 'init'; version: 1; localStoreId: string; lastSyncCursor: string | undefined; auth: unknown; docId?: string; }; export declare type CommitAck = { ref: string; metadata?: CommitMetadata; }; export declare type CommitsEvent = { type: 'commits'; commits: readonly Commit[]; clientInfo?: ClientInfo; syncId?: string; }; export declare type ReadyEvent = { type: 'ready'; }; export declare type AckCommitErrorCode = 'invalid' | 'unknown-ref' | 'storage-failure' | 'internal'; export declare type AckCommitError = { code: AckCommitErrorCode; message?: string; }; export declare type AckRefErrors = Record; export declare type AckCommitsEvent = { type: 'ack'; acks: readonly CommitAck[]; refErrors?: AckRefErrors; syncId: string; }; export declare type ClientJoinEvent = { type: 'client-join'; info: ClientInfo; }; export declare type ClientPresenceEvent = { type: 'client-presence'; info: ClientInfo; }; export declare type ClientLeaveEvent = { type: 'client-leave'; userId: string; clientId: string; }; export declare type ErrorEvent = { type: 'error'; code: ErrorCode; message?: string; fatal?: boolean; reconnect?: boolean; }; export declare type RemoteStateEvent = { type: 'remote-state'; connect?: RemoteConnectStatus; read?: RemoteReadStatus; save?: RemoteSaveStatus; }; export declare type LeaderEvent = { type: 'leader'; action: 'request' | 'current' | 'accept' | 'withdraw'; clientId: string; }; export declare type SyncEvent = Readonly | ReadyEvent | LeaderEvent | AckCommitsEvent | ClientJoinEvent | ClientPresenceEvent | ClientLeaveEvent | RemoteStateEvent | ErrorEvent>; export declare type OnStoreEventFn = (event: SyncEvent, remoteOrigin: boolean) => void; export declare type OnRemoteEventFn = (event: SyncEvent) => void; export declare type GetLocalStoreFn = (userId: string, clientId: string, onEvent: OnStoreEventFn) => LocalStore; export declare type RemoteSyncInfo = { localStoreId: string; lastSyncCursor: string | undefined; }; export declare type GetRemoteFn = (userId: string, remoteSyncInfo: RemoteSyncInfo, onRemoteEvent: OnRemoteEventFn) => Remote | Promise>; export interface LocalStore { update(commits: readonly Commit[], presence: ClientPresenceRef | undefined): Promise; isRemoteLeader: boolean; shutdown(): void | Promise; } export interface Remote { send(event: SyncEvent): void; shutdown(): void | Promise; } export interface CommitRepository { getLocalCommits(): AsyncIterableIterator>; getCommitsForRemote(): AsyncIterableIterator>; addCommits(commits: readonly Commit[], remoteSyncId: string | undefined): Promise>; acknowledgeRemoteCommits(refs: readonly CommitAck[], remoteSyncId: string): Promise; getRemoteSyncInfo(): Promise; shutdown(): void | Promise; }