import { Transfer } from '../../external/transfer';
import TransferConfig from './TransferConfig';
import { TransferDirection, TransferEventType, TransferState } from '../../external';
import TransferClient from '../services/TransferClient';
import TransferEvent from '../../external/transfer/events/TransferEvent';
/**
 * An abstract implementation of common functionalities between upload and download transfers
 */
export default abstract class AbstractTransfer implements Transfer {
    protected _transferClient: TransferClient;
    protected _transferConfig: TransferConfig;
    protected _transferId: string;
    protected _originatorId: string;
    protected _transferState: TransferState;
    private readonly _handleTransferClientStateChangeBoundInstance;
    private readonly _eventHandlerMap;
    protected constructor(_transferClient: TransferClient);
    private handleTransferClientStateChange;
    private publishTransferConnectionStatusUpdateEvent;
    cancel(): Promise<void>;
    private isInCancellableState;
    get currentTransferState(): TransferState;
    unsubscribeAll(): boolean;
    private isInRetryableState;
    retry(): Promise<void>;
    abstract getTransferDirection(): TransferDirection;
    start(): Promise<void>;
    abstract onTransferEvent(eventData: TransferEvent): Promise<void>;
    private onTransferUpdate;
    private publishTransferEvent;
    private unsubscribeFromAllTransferEvents;
    private subscribeToAllTransferEvents;
    private mapTransferClientEvent;
    private startTransfer;
    protected subscribeToEvent({ eventType, handler }: {
        eventType: TransferEventType;
        handler: Function;
    }): void;
    protected unsubscribeFromEvent({ eventType }: {
        eventType: TransferEventType;
    }): boolean;
    set transferId(transferId: string);
    get transferId(): string;
    abstract populateTransferConfig(): Promise<void>;
    /**
     * This could be either an upload or a download as defined by the subclass.
     * @protected
     */
    protected abstract executeTransferCommand(): Promise<void>;
}
//# sourceMappingURL=AbstractTransfer.d.ts.map