/// <reference types="node" />
import { Readable } from 'stream';
import { CancellationToken } from '../cancellation-token';
export interface IAuthorizationToken {
    resource?: string;
    offline?: boolean;
    scope?: string;
    username?: string;
    password?: string;
    accessToken?: string;
    refreshToken?: string;
    onTokenUpdated?: (rawToken: any) => void;
    onTokenInvalid?: () => void;
}
export interface IHttpClient {
    isLoggedIn: boolean;
    shouldPost(path: string, params: any): boolean;
    authenticate(): Promise<any>;
    logout(): Promise<any>;
    getAccessToken(): Promise<string>;
    get(path: string, params?: any, token?: CancellationToken): Promise<any>;
    download(path: string, handler: (fileName: string, output: Readable) => Promise<any>, token?: CancellationToken): Promise<any>;
    upload(path: string, formData: FormData, params?: any, token?: CancellationToken): Promise<any>;
    post(path: string, body: any, params?: any, token?: CancellationToken): Promise<any>;
    put(path: string, body: any, params?: any, token?: CancellationToken): Promise<any>;
    patch(path: string, body: any, params?: any, token?: CancellationToken): Promise<any>;
    delete(path: string, params?: any, token?: CancellationToken): Promise<boolean>;
}
export declare class HttpError extends Error {
    status: any;
    errors?: any;
    constructor(message: any, status: any, errors?: any);
}
export declare abstract class HttpClient<TRequest, TResponse> implements IHttpClient {
    protected baseAddress: string;
    private token;
    private accessToken;
    private lastAccessToken;
    private readonly scope;
    private readonly apiUrl;
    private readonly isAuthRequired;
    constructor(baseAddress: string, token: IAuthorizationToken, site?: string);
    static getUrl(requestPath: string, baseUrl?: string, params?: any): string;
    get isLoggedIn(): boolean;
    shouldPost(path: string, params: any): boolean;
    authenticate(): Promise<any>;
    logout(): Promise<void>;
    getAccessToken(): Promise<string>;
    protected abstract executeJsonRequest(req: TRequest, callback: (err: any, response: TResponse, body: string) => void, token?: CancellationToken): any;
    protected abstract getStatusCode(response: TResponse): number;
    protected abstract getHeadersValue(headers: any, key: string): string;
    private getError;
    private executeApiRequest;
    abstract download(path: string, handler: (fileName: string, output: Readable) => Promise<any>, token?: CancellationToken): any;
    upload(path: string, formData: FormData, params?: any, token?: CancellationToken): Promise<any>;
    protected getOptions(path: string, options: any): Promise<any>;
    protected parseContentDispositionHeader(headers: any): string;
    get(path: string, params?: any, token?: CancellationToken): Promise<any>;
    private executePost;
    post(path: string, body: any, params?: any, token?: CancellationToken): Promise<any>;
    put(path: string, body: any, params?: any, token?: CancellationToken): Promise<any>;
    patch(path: string, body: any, params?: any, token?: CancellationToken): Promise<any>;
    delete(path: string, params?: any, token?: CancellationToken): Promise<boolean>;
}
