import { Log } from 'json-joy/lib/json-crdt/log/Log';
import { type JsonNode, Model, type Patch } from 'json-joy/lib/json-crdt';
import { Subject } from 'rxjs';
import type { BlockId, LocalRepo } from '../local/types';
export declare class EditSession<N extends JsonNode = JsonNode<any>> {
    readonly repo: LocalRepo;
    readonly id: BlockId;
    protected start: Model<N>;
    cursor: undefined | unknown;
    protected readonly session: number;
    log: Log<N>;
    protected _stopped: boolean;
    protected _stop$: Subject<void>;
    onsyncerror?: (error: Error | unknown) => void;
    private _syncRace;
    get model(): Model<N>;
    constructor(repo: LocalRepo, id: BlockId, start: Model<N>, cursor?: undefined | unknown, session?: number);
    dispose(): void;
    protected clear(): void;
    private saveInProgress;
    /**
     * Push (persist) any in-memory changes and pull (load) the latest state
     * from the local repo.
     */
    sync(): Promise<null | {
        remote?: Promise<void>;
    }>;
    syncLog(): void;
    del(): Promise<void>;
    /**
     * Load latest state from the local repo.
     */
    load(): Promise<void>;
    loadSilent(): void;
    protected reset(model: Model<N>): void;
    protected rebase(patches: Patch[]): void;
    protected merge(patches: Patch[]): void;
    private events;
    private onEvent;
    private drainEvents;
}
