import { File, FilePartMetadata } from './../file';
import { StoreUploadOptions } from './../types';
import { UploaderAbstract } from './abstract';
export interface UploadPart extends FilePartMetadata {
    etag?: string;
    offset?: number;
    progress?: number;
}
export interface UploadPayload {
    file: File;
    parts: UploadPart[];
    handle?: string;
    uri?: string;
    region?: string;
    upload_id?: number;
    location_url?: string;
    location_region?: string;
}
export declare class S3Uploader extends UploaderAbstract {
    private partsQueue;
    private cancelToken;
    private payloads;
    constructor(storeOptions: StoreUploadOptions, concurrency?: any);
    /**
     * Pause upload queue
     *
     * @memberof S3Uploader
     */
    pause(): void;
    /**
     * resume upload queue if its paused
     *
     * @memberof S3Uploader
     */
    resume(): void;
    /**
     * Aborts queue (all pending requests with will be aborted)
     *
     * @memberof S3Uploader
     */
    abort(msg?: string): void;
    /**
     * Execute all queued files
     *
     * @returns {Promise<any>}
     * @memberof S3Uploader
     */
    execute(): Promise<any>;
    /**
     * Add file to upload queue
     *
     * @param {File} file
     * @returns
     * @memberof S3Uploader
     */
    addFile(file: File): string;
    /**
     * Returns host for upload (region based)
     *
     * @private
     * @returns
     * @memberof S3Uploader
     */
    private getUploadUrl;
    /**
     * Returns formatted store options
     *
     * @private
     * @returns
     * @memberof S3Uploader
     */
    private getStoreOptions;
    /**
     * Returns all default fields for filestack requests
     *
     * @private
     * @returns
     * @memberof S3Uploader
     */
    private getDefaultFields;
    /**
     * Returns default headers needed for filestack request
     *
     * @private
     * @returns
     * @memberof S3Uploader
     */
    private getDefaultHeaders;
    private getPayloadById;
    /**
     * Split file onto parts for uploading with multipart mechanism and setup start
     *
     * @private
     * @memberof S3Uploader
     */
    private prepareParts;
    /**
     * Make start request for getting needed upload fields
     *
     * @private
     * @returns {Promise<any>}
     * @memberof S3Uploader
     */
    private startRequest;
    /**
     * Enqueue file parts to upload
     *
     * @private
     * @returns
     * @memberof S3Uploader
     */
    private startPartsQueue;
    /**
     * Decide if upload should be made using ii or regular upload
     * It allows change upload mode during upload queue
     *
     * @private
     * @param {number} partNumber
     * @returns {Promise<any>}
     * @memberof S3Uploader
     */
    private startPart;
    /**
     * Returns part data needed for upload
     *
     * @private
     * @param {string} id - id of a currently uploading file
     * @param {FilePart} part
     * @returns
     * @memberof S3Uploader
     */
    private getS3PartMetadata;
    /**
     * Regular multipart request to amazon
     *
     * @private
     * @param {number} partNumber
     * @returns {Promise<any>}
     * @memberof S3Uploader
     */
    private uploadRegular;
    /**
     * Upload file using intelligent mechanism
     *
     * @private
     * @param {string} id
     * @param {number} partNumber
     * @returns {Promise<any>}
     * @memberof S3Uploader
     */
    private uploadIntelligent;
    /**
     * Recursively upload file in chunk mode (intelligent ingession)
     *
     * @private
     * @param {string} id
     * @param {number} partNumber
     * @param {number} chunkSize
     * @returns
     * @memberof S3Uploader
     */
    private uploadNextChunk;
    /**
     * Commit after upload all chunks of the part in ii mode
     *
     * @private
     * @param {string} id
     * @param {FilePart} part
     * @returns
     * @memberof S3Uploader
     */
    private commitPart;
    /**
     * Complete request to merge all parts and get file handle etc
     *
     * @private
     * @returns
     * @memberof S3Uploader
     */
    private completeRequest;
    /**
     * UUpgrade upload progress and run progress event
     *
     * @private
     * @param {string} id
     * @param {number} partNumber
     * @param {number} loaded
     * @memberof S3Uploader
     */
    private onProgressUpdate;
    /**
     * Emits normalized progress event
     *
     * @private
     * @memberof S3Uploader
     */
    private emitProgress;
    /**
     * Apply provided data to given payload
     *
     * @private
     * @param {string} id
     * @param {*} data
     * @memberof S3Uploader
     */
    private updatePayload;
    /**
     * Sets etag for part
     *
     * @private
     * @param {number} partNumber
     * @param {string} etag
     * @memberof S3Uploader
     */
    private setPartETag;
    /**
     * Sets part value for a key
     *
     * @private
     * @param {number} partNumber
     * @param {string} etag
     * @memberof S3Uploader
     */
    private setPartData;
    /**
     * Set payload file state
     *
     * @param id
     * @param status
     */
    private setPayloadStatus;
    /**
     * Returns error details if response exists
     *
     * @param err
     */
    private parseError;
    private rejectUpload;
}
