import { SpawnOptions, ChildProcess } from 'node:child_process';
import { OpenOptions } from 'maria2';
import { PartialDeep } from 'type-fest';
import { PreconfiguredSocket, Aria2RpcWebSocketUrl, Socket, ReadyState } from 'maria2/transport';
import { Aria2RPCOptions, Prettify, Aria2GlobalOptions } from '@naria2/options';

type ChildProcessOptions = {
    rpc: Partial<Aria2RPCOptions>;
    /**
     * 'inherit': inherit the current envrionment variables
     *
     * 'ignore': remove the related environment variables
     *
     * @link https://aria2.github.io/manual/en/html/aria2c.html#environment
     */
    environment: 'inherit' | 'ignore'
    /**
     * @link https://aria2.github.io/manual/en/html/aria2c.html#environment
     */
     | Partial<{
        http_proxy: string;
        https_proxy: string;
        ftp_proxy: string;
        all_proxy: string;
        no_proxy: string[];
    }>;
    /**
     * Options passed to spawn aria2c process
     */
    spawn: SpawnOptions & {
        binary?: string;
    };
};
interface ChildProcessOpenOptions extends OpenOptions {
    /**
     * Max retry times for connecting aria2 JSON RPC server
     *
     * @default 5
     */
    retry?: number;
    /**
     * Retry delay (unit: ms) for connecting aria2 JSON RPC server
     *
     * @default 100
     */
    retryDelay?: number;
}
type ResolvedChildProcessOptions = Omit<ChildProcessOptions, 'environment' | 'rpc'> & {
    rpc: Pick<Aria2RPCOptions, 'listenPort' | 'secret'> & Partial<Aria2RPCOptions>;
    ws: ChildProcessOpenOptions;
    args: string[];
};
declare class ChildProcessSocket implements PreconfiguredSocket {
    readonly url: Aria2RpcWebSocketUrl;
    readonly childProcess: ChildProcess;
    readonly disposables: Set<() => void>;
    readonly options: ResolvedChildProcessOptions;
    socket: Socket;
    constructor(url: Aria2RpcWebSocketUrl, childProcess: ChildProcess, options: ResolvedChildProcessOptions);
    get readyState(): ReadyState;
    getOptions(): {
        listenPort: number;
        secret: string;
        args: string[];
    };
    onClose(fn: () => void): () => void;
    close(code?: number, reason?: string): void;
    send(data: string): void;
    addEventListener(type: 'message', listener: (event: {
        data: any;
    }) => void, options?: {
        once?: boolean;
    }): void;
    addEventListener(type: 'open', listener: () => void, options?: {
        once?: boolean;
    }): void;
    addEventListener(type: 'error', listener: (error: any) => void, options?: {
        once?: boolean;
    }): void;
    addEventListener(type: 'close', listener: () => void, options?: {
        once?: boolean;
    }): void;
}
declare function createChildProcess(options?: Prettify<Partial<ChildProcessOptions> & PartialDeep<Aria2GlobalOptions> & {
    ws?: ChildProcessOpenOptions;
}>): Promise<ChildProcessSocket>;

export { type ChildProcessOptions as C, type ResolvedChildProcessOptions as R, type ChildProcessOpenOptions as a, ChildProcessSocket as b, createChildProcess as c };
