import { EventEmitter } from 'node:events';
export type WorkerDataInterface = {
    workerFile: string;
};
export type WorkerReqMsg<TArgs extends unknown[]> = {
    msgId: number;
    req: TArgs;
};
export type WorkerRespMsg<TResp, TErr> = {
    msgId: number;
} & ({
    resp: TResp;
    error?: null;
} | {
    resp?: null;
    error: TErr;
});
export type WorkerPoolModuleInterface<TArgs extends unknown[], TResp> = {
    workerModule: NodeJS.Module;
    processTask: (...args: TArgs) => Promise<TResp> | TResp;
} | {
    default: {
        workerModule: NodeJS.Module;
        processTask: (...args: TArgs) => Promise<TResp> | TResp;
    };
};
export declare class WorkerThreadManager<TArgs extends unknown[], TResp> {
    private readonly workers;
    private readonly idleWorkers;
    private readonly jobQueue;
    private readonly msgRequests;
    private lastMsgId;
    readonly workerCount: number;
    readonly workerFile: string;
    private readonly abortControlller;
    readonly events: EventEmitter<{
        workersReady: [];
    }>;
    get idleWorkerCount(): number;
    get busyWorkerCount(): number;
    get queuedJobCount(): number;
    static init<TArgs extends unknown[], TResp>(workerModule: WorkerPoolModuleInterface<TArgs, TResp>, opts?: {
        workerCount?: number;
    }): Promise<WorkerThreadManager<TArgs, TResp>>;
    constructor(workerModule: WorkerPoolModuleInterface<TArgs, TResp>, opts?: {
        workerCount?: number;
    });
    exec(...args: TArgs): Promise<TResp>;
    createWorkerPool(): void;
    private setupWorkerHandler;
    private assignJobs;
    close(): Promise<void>;
}
