import { EventEmitter } from 'events';
import { BaseStorage, DiskStorageOptions, UploadList, UploadxEventType, UploadxFile, UserIdentifier } from '../storages';
import { IncomingMessage, ResponseBodyType, ServerResponse, UploadxResponse } from '../types';
import { ErrorResponses, Logger, UploadxError } from '../utils';
import { Cors } from './cors';
type Handlers = 'delete' | 'get' | 'head' | 'options' | 'patch' | 'post' | 'put';
export type AsyncHandler = (req: IncomingMessage, res: ServerResponse) => Promise<any>;
export type MethodHandler = {
    [h in Handlers]?: AsyncHandler;
};
type ReqEvent = {
    request: Pick<IncomingMessage, 'url' | 'headers' | 'method'>;
};
export type UploadxEvent<TFile extends UploadxFile> = TFile & ReqEvent;
export type UploadxErrorEvent = UploadxError & ReqEvent;
export interface BaseHandler<TFile extends UploadxFile> extends EventEmitter {
    on(event: 'error', listener: (error: UploadxErrorEvent) => void): this;
    on(event: UploadxEventType, listener: (payload: UploadxEvent<TFile>) => void): this;
    off(event: UploadxEventType, listener: (payload: UploadxEvent<TFile>) => void): this;
    off(event: 'error', listener: (error: UploadxErrorEvent) => void): this;
    emit(event: UploadxEventType, payload: UploadxEvent<TFile>): boolean;
    emit(event: 'error', error: UploadxErrorEvent): boolean;
}
export type UploadxOptions<TFile extends UploadxFile> = {
    storage: BaseStorage<TFile>;
    userIdentifier?: UserIdentifier;
} | DiskStorageOptions;
export declare abstract class BaseHandler<TFile extends UploadxFile> extends EventEmitter implements MethodHandler {
    /**
     * Limiting enabled http method handlers
     * @example
     * ```ts
     * Uploadx.methods = ['post', 'put', 'delete'];
     * app.use('/upload', uploadx(opts));
     * ```
     */
    static methods: Handlers[];
    cors: Cors;
    responseType: ResponseBodyType;
    storage: BaseStorage<TFile>;
    registeredHandlers: Map<string, AsyncHandler>;
    logger: Logger;
    protected _errorResponses: ErrorResponses;
    constructor(config?: UploadxOptions<TFile>);
    /**
     *  Override error responses
     *  @example
     * ```ts
     *  const uploadx = new Uploadx({ storage });
     *  uploadx.errorResponses = {
     *    FileNotFound: [404, { message: 'Not Found!' }]
     *  }
     * ```
     */
    set errorResponses(value: Partial<ErrorResponses>);
    compose(): void;
    assembleErrors(customErrors?: {}): void;
    handle: (req: IncomingMessage, res: ServerResponse) => void;
    upload: (req: IncomingMessage, res: ServerResponse, next?: () => void) => void;
    getUserId: UserIdentifier;
    options(req: IncomingMessage, res: ServerResponse): Promise<TFile>;
    /**
     * Returns user uploads list
     */
    get(req: IncomingMessage, res: ServerResponse): Promise<UploadList>;
    /**
     * Make response
     */
    send(res: ServerResponse, { statusCode, headers, body }: UploadxResponse): void;
    /**
     * Send Error to client
     */
    sendError(res: ServerResponse, error: Error): void;
    /**
     * Get id from request
     */
    getId(req: IncomingMessage): string;
    getAndVerifyId(req: IncomingMessage, res: ServerResponse): Promise<string>;
    /**
     * Build file url from request
     */
    buildFileUrl(req: IncomingMessage, file: TFile): string;
    protected finish(req: IncomingMessage, res: ServerResponse, response: UploadxResponse): void;
}
export {};
