import type { Operation } from 'fast-json-patch';
import { CreateOpts, LoadOpts, UpdateOpts, Stream, CeramicCommit, GenesisCommit, SignedCommitContainer, CeramicSigner, StreamWriter, StreamReader, IntoSigner, CommitHeader, NonEmptyArray } from '@ceramicnetwork/common';
import { CommitID, StreamID } from '@ceramicnetwork/streamid';
export interface ModelInstanceDocumentMetadataArgs {
    controller?: string;
    model: StreamID;
    context?: StreamID;
    deterministic?: boolean;
    shouldIndex?: boolean;
}
export declare type ModelInstanceDocumentStateMetadata = {
    controllers: NonEmptyArray<string>;
    model: StreamID;
    context?: StreamID;
    unique?: Uint8Array;
    shouldIndex?: boolean;
};
export interface ModelInstanceDocumentMetadata {
    controller: string;
    model: StreamID;
    unique?: Uint8Array;
    context?: StreamID;
    shouldIndex?: boolean;
}
export declare class ModelInstanceDocument<T = Record<string, any>> extends Stream {
    static STREAM_TYPE_NAME: string;
    static STREAM_TYPE_ID: number;
    static MAX_DOCUMENT_SIZE: number;
    private _isReadOnly;
    get content(): T | null;
    get metadata(): ModelInstanceDocumentMetadata;
    static create<T>(ceramic: StreamWriter, content: T | null, metadata: ModelInstanceDocumentMetadataArgs, opts?: CreateOpts): Promise<ModelInstanceDocument<T>>;
    static single<T>(ceramic: StreamWriter, metadata: ModelInstanceDocumentMetadataArgs, opts?: CreateOpts): Promise<ModelInstanceDocument<T>>;
    static set<T>(ceramic: StreamWriter, metadata: ModelInstanceDocumentMetadataArgs, unique: Array<string>, opts?: CreateOpts): Promise<ModelInstanceDocument<T>>;
    static load<T>(reader: StreamReader, streamId: StreamID | CommitID | string, opts?: LoadOpts): Promise<ModelInstanceDocument<T>>;
    replace(content: T | null, metadata?: Partial<ModelInstanceDocumentMetadataArgs> | undefined | null, opts?: UpdateOpts): Promise<void>;
    patch(jsonPatch: Operation[], metadata?: Partial<ModelInstanceDocumentMetadataArgs> | undefined | null, opts?: UpdateOpts): Promise<void>;
    shouldIndex(shouldIndex: boolean, opts?: UpdateOpts): Promise<void>;
    makeReadOnly(): void;
    get isReadOnly(): boolean;
    static makeUpdateCommit<T>(signer: CeramicSigner, prev: CommitID, oldContent: T | null, newContent: T | null, header?: Partial<CommitHeader>): Promise<CeramicCommit>;
    private static _makeRawCommit;
    static makeGenesis<T>(context: IntoSigner, content: T | null, metadata: ModelInstanceDocumentMetadataArgs, unique?: Array<string>): Promise<SignedCommitContainer | GenesisCommit>;
    private static _makeRawGenesis;
}
export declare function validateContentLength<T>(content: T | null): void;
//# sourceMappingURL=model-instance-document.d.ts.map