import { type NodeBuilder } from 'json-joy/lib/json-crdt'; import type { BlockId, LocalRepo } from '../local/types'; import { EditSession } from './EditSession'; export interface EditSessionFactoryOpts { readonly sid: number; readonly repo: LocalRepo; } export declare class EditSessionFactory { protected readonly opts: EditSessionFactoryOpts; constructor(opts: EditSessionFactoryOpts); /** * Creates a new editing session synchronously (immediately). If the block * with a given ID already exists, it asynchronously synchronizes the local * and remote state. */ make(opts: EditSessionMakeOpts): { session: EditSession; sync?: Promise; }; /** * Load block from the local repo. Creates a new editing session * asynchronously from an existing local block. * * It is also possible to block on remote state check in case the block does * not exist locally, or to pull the latest state from the remote. */ load(opts: EditSessionLoadOpts): Promise; } /** * Constructs a new editing session synchronously. */ export interface EditSessionMakeOpts { /** Block ID. */ id: BlockId; /** Thew new block schema, if any. */ schema?: NodeBuilder; /** * Weather to asynchronously pull for any existing local block state, if a * block with the same ID already exists. Defaults to `true`. */ pull?: boolean; /** * Internal unique session ID. */ session?: number; } /** * Constructs and editing session asynchronously from an existing block. In * case the block does not exist, it is possible to create one or throw an * error. */ export interface EditSessionLoadOpts { /** Block ID. */ id: BlockId; /** * If specified, will create a new block, if one does not already exist. Will * use these `make` options and provide them to the `make()` call. */ make?: Omit; /** Thew new block schema, if any. */ schema?: NodeBuilder; /** * Internal unique session ID. */ session?: number; remote?: { /** * Time in milliseconds to wait for the remote to respond. If the remote * does not respond in time, the call will proceed with the local state. * * If upsert `make` option is not provided, the call will throw a "TIMEOUT" * error. */ timeout?: number; /** * Defaults to an empty string. Otherwise, if "missing", will throw a * "NOT_FOUND" error if the block does not exist remotely. If "exists", will * a "CONFLICT" error if the block exists remotely. */ throwIf?: '' | 'missing' | 'exists'; }; }