/// <reference types="node" />
import * as fetch from 'node-fetch';
import { Response } from "../response/response";
import { Context, Domain } from "@larksuiteoapi/core";
import * as stream from "stream";
export declare type OptFn = (opt: Opt) => void;
export declare enum AccessTokenType {
    None = "none_access_token",
    App = "app_access_token",
    Tenant = "tenant_access_token",
    User = "user_access_token"
}
export declare class Opt {
    isNotDataField: boolean;
    pathParams: {
        [key: string]: any;
    };
    queryParams: {
        [key: string]: any;
    };
    userAccessToken: string;
    tenantKey: string;
    timeoutOfMs: number;
    isResponseStream: boolean;
    responseStream: any;
    needHelpDeskAuth: boolean;
}
export declare class Info<T> {
    domain: string;
    httpPath: string;
    httpMethod: string;
    queryParams: string;
    input: any;
    accessibleTokenTypeSet: Set<AccessTokenType>;
    accessTokenType: AccessTokenType;
    tenantKey: string;
    userAccessToken: string;
    isNotDataField: boolean;
    isResponseStream: boolean;
    isResponseStreamReal: boolean;
    output: T;
    retryable: boolean;
    needHelpDeskAuth: boolean;
    timeout: number;
    optFns: OptFn[];
    withContext(ctx: Context): void;
}
export declare const getInfoByCtx: (ctx: Context) => Info<any>;
export declare const setTimeoutOfMs: (timeoutOfMs: number) => (opt: Opt) => void;
export declare const setUserAccessToken: (userAccessToken: string) => (opt: Opt) => void;
export declare const setTenantKey: (tenantKey: string) => (opt: Opt) => void;
export declare const setPathParams: (pathParams: {
    [key: string]: any;
}) => (opt: Opt) => void;
export declare const setQueryParams: (queryParams: {
    [key: string]: any;
}) => (opt: Opt) => void;
export declare const setIsNotDataField: () => (opt: Opt) => void;
export declare const setIsResponseStream: () => (opt: Opt) => void;
export declare const setNeedHelpDeskAuth: () => (opt: Opt) => void;
export declare const setResponseStream: (responseStream: stream.Writable) => (opt: Opt) => void;
export interface HTTPRequestOpts {
    method: string;
    timeout: number;
    body?: any;
    headers: {};
    bodySource?: {
        isStream: boolean;
        filePath: string;
    };
}
export declare class Request<T> extends Info<T> {
    httpRequestOpts: HTTPRequestOpts;
    httpResponse: fetch.Response;
    response: Response<T>;
    url(): string;
    fullUrl(domain: Domain): string;
    setPathParams(pathParams: {
        [key: string]: any;
    }): number;
    setQueryParams(queryParams: {
        [key: string]: any;
    }): number;
    setTimeoutOfMs(timeoutOfMs: number): number;
    setTenantKey(tenantKey: string): number;
    setUserAccessToken(userAccessToken: string): number;
    setIsNotDataField(): number;
    setIsResponseStream(): number;
    setResponseStream(responseStream: stream.Writable): number;
    setNeedHelpDeskAuth(): number;
    toString(): string;
    init(domain: string): void;
}
export declare const newRequestByAuth: <T>(httpPath: string, httpMethod: string, input: any, output: T) => Request<T>;
export declare const newRequestOfTs: <T>(httpPath: string, httpMethod: string, accessTokenTypes: AccessTokenType[], input: any, output: T, ...optFns: OptFn[]) => Request<T>;
export declare const newRequest: (httpPath: string, httpMethod: string, accessTokenType: AccessTokenType, input: any, ...optFns: OptFn[]) => Request<any>;
//# sourceMappingURL=request.d.ts.map