/// <reference types="node" />
import EventEmitter from 'eventemitter3';
import { Socket } from 'socket.io-client';
declare type FileInfo<T = unknown> = {
    /**
     * file size
     */
    size: number;
    /**
     * file name
     */
    name: string;
    /**
     * Your custom data to send to the server. please note that you should not put
     * some largest object here. otherwise the socket will failed and disconnect itself  automatically.
     * This is the reason while we need upload large buffer by chunk.
     * >
     * **Please remove your file from this object. eg: Your File buffer.**
     * >
     * Puts some json object here..
     */
    meta: T;
    /**
     * file buffer
     * if you are using browser you can use https://github.com/feross/blob-to-buffer to convert a Blob to buffer
     */
    content: Buffer;
    /**
     * last modified time
     */
    mtime: number;
};
declare type Options = {
    /**
     * max file: 200MB
     */
    maxFileSize: number;
    /**
     * socket event name prefix
     */
    prefix: string;
    /**
     * chunk size: 50kb
     */
    chunkSize: number;
};
export interface UploaderClient<T> {
    /**
     * The start event, you can listen and add some meta info via
     * `file.meta = { x: 'my data'}`
     * @param event
     * @param listener
     */
    on(event: 'start', listener: (params: {
        file: Partial<FileInfo>;
    }) => void): this;
    on(event: 'progress', listener: (params: {
        file: FileInfo<T>;
        bytesLoaded: number;
        name: string;
    }) => void): this;
    /**
     * The complete event contains some important infos.
     * - detail you can pass through data from server side to client after upload completely.
     * - success which the upload status
     * @param event
     * @param listener
     */
    on(event: 'complete', listener: (params: {
        file: FileInfo;
        success: boolean;
        detail: T;
    }) => void): this;
    /**
     * An error occurred
     * @param event
     * @param listener
     */
    on(event: 'error', listener: (params: {
        file: FileInfo;
        error: Error;
        message: string;
    }) => void): this;
}
/**
 * socket.io upload client for browser and react-native
 */
export declare class UploaderClient<T = Record<string, unknown>> extends EventEmitter {
    private readonly socket;
    private readonly options;
    static downloads: number;
    constructor(socket: Socket, options?: Partial<Options>);
    private get maxFileSize();
    /**
     * files
     */
    private files;
    /**
     * get event with prefix
     * @param event
     */
    private getSocketNameWithPrefix;
    upload(file: FileInfo<T>): void;
    chunkCallbacks: {};
    readyCallbacks: {};
    communicators: {};
    /**
     * listen on socket
     * @param socket
     */
    private listenSocket;
    destroy(): void;
}
export {};