import { EventEmitter } from 'eventemitter3';
import { Hosts } from '../config';
import { MetadataOptions, RetrieveOptions } from './api/file';
import { TransformOptions } from './api/transform';
import * as Utils from './utils';
import { InputFile, UploadOptions, StoreUploadOptions, UploadTags } from './api/upload';
import { PreviewOptions } from './api/preview';
import { PrefetchResponse, PrefetchOptions } from './api/prefetch';
import { StoreParams } from './filelink';
import { PickerInstance, PickerOptions } from './picker';
export interface Session {
    apikey: string;
    urls: Hosts;
    cname?: string;
    policy?: string;
    signature?: string;
    prefetch?: PrefetchResponse;
}
export interface Security {
    policy: string;
    signature: string;
}
export interface ClientOptions {
    [option: string]: any;
    /**
     * Security object with policy and signature keys.
     * Can be used to limit client capabilities and protect public URLs.
     * It is intended to be used with server-side policy and signature generation.
     * Read about [security policies](https://www.filestack.com/docs/concepts/security).
     */
    security?: Security;
    /**
     * Domain to use for all URLs. __Requires the custom CNAME addon__.
     * If this is enabled then you must also set up your own OAuth applications
     * for each cloud source you wish to use in the picker.
     */
    cname?: string;
    /**
     * Enable/disable caching of the cloud session token. Default is false.
     * This ensures that users will be remembered on your domain when calling the cloud API from the browser.
     * Please be aware that tokens stored in localStorage are accessible by other scripts on the same domain.
     */
    sessionCache?: boolean;
    /**
     * Enable forwarding error logs to sentry
     * @default false
     */
    forwardErrors?: boolean;
}
/**
 * The Filestack client, the entry point for all public methods. Encapsulates session information.
 *
 * ### Example
 * ```js
 * // ES module
 * import * as filestack from 'filestack-js';
 * const client = filestack.init('apikey');
 * ```
 *
 * ```js
 * // UMD module in browser
 * <script src="https://static.filestackapi.com/filestack-js/3.x.x/filestack.min.js"></script>
 * const client = filestack.init('apikey');
 * ```
 */
export declare class Client extends EventEmitter {
    session: Session;
    private cloud;
    private prefetchInstance;
    private forwardErrors;
    /**
     * Returns filestack utils
     *
     * @readonly
     * @memberof Client
     */
    get utils(): typeof Utils;
    constructor(apikey: string, options?: ClientOptions);
    /**
     * Make basic prefetch request to check permissions
     *
     * @param params
     */
    prefetch(params: PrefetchOptions): Promise<PrefetchResponse>;
    /**
     * Set security object
     *
     * @param {Security} security
     * @memberof Client
     */
    setSecurity(security: Security): void;
    /**
     * Set custom cname
     *
     * @param {string} cname
     * @returns
     * @memberof Client
     */
    setCname(cname: string): void;
    /**
     * Clear all current cloud sessions in the picker.
     * Optionally pass a cloud source name to only log out of that cloud source.
     * This essentially clears the OAuth authorization codes from the Filestack session.
     * @param name Optional cloud source name.
     */
    logout(name?: string): Promise<any>;
    /**
     * Retrieve detailed data of stored files.
     *
     * ### Example
     *
     * ```js
     * client
     *   .metadata('DCL5K46FS3OIxb5iuKby')
     *   .then((res) => {
     *     console.log(res);
     *   })
     *   .catch((err) => {
     *     console.log(err);
     *   }));
     * ```
     * @see [File API - Metadata](https://www.filestack.com/docs/api/file#metadata).
     * @param handle Valid Filestack handle.
     * @param options Metadata fields to enable on response.
     * @param security Optional security override.
     */
    metadata(handle: string, options?: MetadataOptions, security?: Security): Promise<any>;
    /**
     * Construct a new picker instance.
     */
    picker(options?: PickerOptions): PickerInstance;
    /**
     * Used for viewing files via Filestack handles or storage aliases, __requires Document Viewer addon to your Filestack application__.
     * Opens document viewer in new window if id option is not provided.
     *
     * ### Example
     *
     * ```js
     * // <div id="preview"></div>
     *
     * client.preview('DCL5K46FS3OIxb5iuKby', { id: 'preview' });
     * ```
     * @param handle Valid Filestack handle.
     * @param options Preview options
     */
    preview(handle: string, options?: PreviewOptions): HTMLIFrameElement | Window;
    /**
     * Remove a file from storage and the Filestack system.
     *
     * __Requires a valid security policy and signature__. The policy and signature will be pulled from the client session, or it can be overridden with the security parameter.
     *
     * ### Example
     *
     * ```js
     * client
     *   .remove('DCL5K46FS3OIxb5iuKby')
     *   .then((res) => {
     *     console.log(res);
     *   })
     *   .catch((err) => {
     *     console.log(err);
     *   }));
     * ```
     * @see [File API - Delete](https://www.filestack.com/docs/api/file#delete)
     * @param handle Valid Filestack handle.
     * @param security Optional security override.
     */
    remove(handle: string, security?: Security): Promise<any>;
    /**
     * Remove a file **only** from the Filestack system. The file remains in storage.
     *
     * __Requires a valid security policy and signature__. The policy and signature will be pulled from the client session, or it can be overridden with the security parameter.
     *
     * ### Example
     *
     * ```js
     * client
     *   .removeMetadata('DCL5K46FS3OIxb5iuKby')
     *   .then((res) => {
     *     console.log(res);
     *   })
     *   .catch((err) => {
     *     console.log(err);
     *   }));
     * ```
     * @see [File API - Delete](https://www.filestack.com/docs/api/file#delete)
     * @param handle Valid Filestack handle.
     * @param security Optional security override.
     */
    removeMetadata(handle: string, security?: Security): Promise<any>;
    /**
     * Store a file from its URL.
     *
     * ### Example
     *
     * ```js
     * client
     *   .storeURL('https://d1wtqaffaaj63z.cloudfront.net/images/NY_199_E_of_Hammertown_2014.jpg')
     *   .then(res => console.log(res));
     * ```
     * @see [File API - Store](https://www.filestack.com/docs/api/file#store)
     * @param url       Valid URL to a file.
     * @param options   Configure file storage.
     * @param token     Optional control token to call .cancel()
     * @param security  Optional security override.
     * @param uploadTags Optional tags visible in webhooks.
     * @param headers    Optional headers to send
     */
    storeURL(url: string, storeParams?: StoreParams, token?: any, security?: Security, uploadTags?: UploadTags, headers?: {
        [key: string]: string;
    }): Promise<Object>;
    /**
     * Access files via their Filestack handles.
     *
     * If head option is provided - request headers are returned in promise
     * If metadata option is provided - metadata object is returned in promise
     * Otherwise file blob is returned
     * Metadata and head options cannot be mixed
     *
     * ### Example
     *
     * ```js
     * client.retrieve('fileHandle', {
     *  metadata: true,
     * }).then((response) => {
     *  console.log(response);
     * }).catch((err) => {
     *  console.error(err);
     * })
     * ```
     *
     * @see [File API - Download](https://www.filestack.com/docs/api/file#download)
     * @param handle    Valid file handle
     * @param options   RetrieveOptions
     * @param security  Optional security override.
     * @throws          Error
     */
    retrieve(handle: string, options?: RetrieveOptions, security?: Security): Promise<Object | Blob>;
    /**
     * Interface to the Filestack [Processing API](https://www.filestack.com/docs/api/processing).
     * Convert a URL, handle, or storage alias to another URL which links to the transformed file.
     * You can optionally store the returned URL with client.storeURL.
     *
     * Transform params can be provided in camelCase or snakeCase style ie: partial_pixelate or partialPixelate
     *
     * ### Example
     *
     * ```js
     * const transformedUrl = client.transform(url, {
     *   crop: {
     *     dim: [x, y, width, height],
     *   },
     *   vignette: {
     *     blurmode: 'gaussian',
     *     amount: 50,
     *   },
     *   flip: true,
     *   partial_pixelate: {
     *     objects: [[10, 20, 200, 250], [275, 91, 500, 557]],
     *   },
     * };
     *
     * // optionally store the new URL
     * client.storeURL(transformedUrl).then(res => console.log(res));
     * ```
     * @see [Filestack Processing API](https://www.filestack.com/docs/api/processing)
     * @param url     Single or multiple valid URLs (http(s)://), file handles, or storage aliases (src://) to an image.
     * @param options Transformations are applied in the order specified by this object.
     * @param b64     Use new more safe format for generating transforms url (default=false) Note: If there will be any issues with url please test it with enabled b64 support
     * @returns       A new URL that points to the transformed resource.
     */
    transform(url: string | string[], options: TransformOptions, b64?: boolean): string;
    /**
     * Initiates a multi-part upload flow. Use this for Filestack CIN and FII uploads.
     *
     * In Node runtimes the file argument is treated as a file path.
     * Uploading from a Node buffer is not yet implemented.
     *
     * ### Example
     *
     * ```js
     * const token = {};
     * const onRetry = (obj) => {
     *   console.log(`Retrying ${obj.location} for ${obj.filename}. Attempt ${obj.attempt} of 10.`);
     * };
     *
     * client.upload(file, { onRetry }, { filename: 'foobar.jpg' }, token)
     *   .then(res => console.log(res));
     *
     * client.upload({file, name}, { onRetry }, { filename: 'foobar.jpg' }, token)
     *   .then(res => console.log(res));
     *
     * token.pause();  // Pause flow
     * token.resume(); // Resume flow
     * token.cancel(); // Cancel flow (rejects)
     * ```
     * @param {InputFile}    file           Must be a valid [File | Blob | Buffer | string]
     * @param uploadOptions  Uploader options.
     * @param storeOptions   Storage options.
     * @param token          A control token that can be used to call cancel(), pause(), and resume().
     * @param security       Optional security policy and signature override.
     *
     * @returns {Promise}
     */
    upload(file: InputFile, options?: UploadOptions, storeOptions?: StoreUploadOptions, token?: any, security?: Security): Promise<any>;
    /**
     * Initiates a multi-part upload flow. Use this for Filestack CIN and FII uploads.
     *
     * In Node runtimes the file argument is treated as a file path.
     * Uploading from a Node buffer is not yet implemented.
     *
     * ### Example
     *
     * ```js
     * const token = {};
     * const onRetry = (obj) => {
     *   console.log(`Retrying ${obj.location} for ${obj.filename}. Attempt ${obj.attempt} of 10.`);
     * };
     *
     * client.multiupload([file], { onRetry }, token)
     *   .then(res => console.log(res));
     *
     * client.multiupload([{file, name}], { onRetry }, token)
     *   .then(res => console.log(res));
     *
     * token.pause();  // Pause flow
     * token.resume(); // Resume flow
     * token.cancel(); // Cancel flow (rejects)
     * ```
     * @param {InputFile[]}  file           Must be a valid [File | Blob | Buffer | string (base64)]
     * @param uploadOptions  Upload options.
     * @param storeOptions   Storage options.
     * @param token          A control token that can be used to call cancel(), pause(), and resume().
     * @param security       Optional security policy and signature override.
     *
     * @returns {Promise}
     */
    multiupload(file: InputFile[], options?: UploadOptions, storeOptions?: StoreUploadOptions, token?: any, security?: Security): Promise<any>;
}
