/// <reference types="node" />
/// <reference types="node" />
import { ServerResponse as Http1ServerResponse } from 'http';
import { Http2ServerResponse } from 'http2';
import { Logger } from './Logger';
import { FileServer } from './FileServer';
import { ErrorCallback, RouteResponse } from '../@types';
import { ServerRequest } from './Request';
export type ServerResponse<T extends typeof Http2ServerResponse | typeof Http1ServerResponse = typeof Http2ServerResponse | typeof Http1ServerResponse> = Omit<InstanceType<T>, 'end' | 'setHeader' | 'setHeaders' | 'removeHeader' | 'removeHeaders'> & {
    prototype: ServerResponse<T>;
    req: ServerRequest;
    logger: Logger;
    fileServer: FileServer;
    errorCallback: ErrorCallback | null;
    startedAt: Date;
    endedAt: Date;
    end(this: ServerResponse<T>, cb?: () => void): Promise<boolean>;
    end(this: ServerResponse<T>, data?: any, cb?: () => void): Promise<boolean>;
    /**
     * ends the response with optional response data, and optional data encoding
     * @param data optional data to send. either string or buffer
     * @param encoding data encoding if not buffer
     */
    end(this: ServerResponse<T>, data?: any, encoding?: string | (() => void), cb?: () => void): Promise<boolean>;
    /**
     * sets response header
     * @param name response header name
     * @param value response header value
     */
    setHeader(this: ServerResponse<T>, name: string, value: string | number | string[]): ServerResponse<T>;
    /**
     * sets multiple response headers
     * @param headers object containing response header name value pairs
     */
    setHeaders(this: ServerResponse<T>, headers: {
        [p: string]: string | number | string[];
    }): ServerResponse<T>;
    /**
     * removes a single set response header at a time. function is chainable
     * @param name response header to remove
     */
    removeHeader(this: ServerResponse<T>, name: string): ServerResponse<T>;
    /**
     * remove response headers that are already set. function is chainable
     * @param names - comma separated list of header names to remove
     */
    removeHeaders(this: ServerResponse<T>, ...names: string[]): ServerResponse<T>;
    /**
     * sets response http status code and message if given
     * @param code - the status code
     * @param message - the http status message to given sent
     */
    status(this: ServerResponse<T>, code: number, message?: string): ServerResponse<T>;
    /**
     * sends json response back to the client.
     * @param data - the json string or json object which will be stringified
     */
    json(this: ServerResponse<T>, data?: object | string): Promise<boolean>;
    /**
     * Redirect client to the given url
     */
    redirect(this: ServerResponse<T>, path: string, status?: number): Promise<boolean>;
    /**
     * sends a file download attachment to the client
     * @param filePath - relative or absolute file path
     * @param filename - suggested file download name
     */
    download(this: ServerResponse<T>, filePath: string, filename?: string): Promise<boolean>;
    /**
     * sends json error data back to the client
     */
    jsonError<Data, Errors>(this: ServerResponse<T>, response?: RouteResponse<Data, Errors>): Promise<boolean>;
    /**
     * sends json success data back to the client
     */
    jsonSuccess<Data, Errors>(this: ServerResponse<T>, response?: RouteResponse<Data, Errors>): Promise<boolean>;
    /**
     * waits for the given time
     */
    wait(this: ServerResponse<T>, time: number): Promise<ServerResponse<T>>;
    /**
     * it process a json api response, automatically handling
     * the then and catch responses,
     * @param response
     * @returns
     */
    processRouteResponse<Data, Errors>(this: ServerResponse<T>, 
    /**
     * the response promise
     */
    responsePromise: Promise<RouteResponse<Data, Errors>>): Promise<boolean>;
};
declare class HTTP1BaseResponse extends Http1ServerResponse {
    constructor(req: any);
}
export declare const Http1Response: typeof HTTP1BaseResponse;
declare class HTTP2BaseResponse extends Http2ServerResponse {
}
export declare const Http2Response: typeof HTTP2BaseResponse;
export {};
