import { AbstractAccessor, FileNameIndex, FileSystemAsync, FileSystemObject } from "kura";
import { SyncOptions } from "./SyncOptions";
export interface SyncResult {
    backward: boolean;
    errors: any[];
    forward: boolean;
}
export interface Handler {
    afterCopy: (fromAccessor: AbstractAccessor, toAccessor: AbstractAccessor, obj: FileSystemObject) => Promise<void>;
    afterDelete: (accessor: AbstractAccessor, obj: FileSystemObject) => Promise<void>;
    beforeCopy: (fromAccessor: AbstractAccessor, toAccessor: AbstractAccessor, obj: FileSystemObject) => Promise<boolean>;
    beforeDelete: (accessor: AbstractAccessor, obj: FileSystemObject) => Promise<boolean>;
    completed: (result: SyncResult, error?: any) => Promise<void>;
    getNames: (fileNameIndex: FileNameIndex) => string[];
}
export declare class Notifier {
    private _callback;
    private _processed;
    private _total;
    constructor(_callback?: (processed: number, total: number) => void);
    get processed(): number;
    get total(): number;
    incrementProcessed(count?: number): void;
    incrementTotal(count?: number): void;
}
export declare const SYNC_RESULT_FALSES: SyncResult;
export declare class Synchronizer {
    local: FileSystemAsync;
    remote: FileSystemAsync;
    private options;
    private static NOT_EXISTS;
    private excludeNameRegExp;
    private excludePathRegExp;
    private localAccessor;
    private remoteAccessor;
    private transferer;
    constructor(local: FileSystemAsync, remote: FileSystemAsync, options?: SyncOptions);
    synchronizeAll(): Promise<SyncResult>;
    synchronizeDirectory(dirPath: string, recursively: boolean, notifier?: Notifier, handler?: Handler): Promise<SyncResult>;
    private copyFile;
    private debug;
    private deleteEntry;
    private makeDirectory;
    private mergeResult;
    private synchronizeChildren;
    private synchronizeOne;
    private toFileSystemObject;
    private truncateRecord;
    private warn;
}
//# sourceMappingURL=Synchronizer.d.ts.map