/// <reference types="node" />
/// <reference types="node" />
import { ChildProcess } from 'child_process';
export interface RPCRequest<P extends string, A extends any[]> {
    type: 'rpc-request';
    id: string;
    procedure: P;
    args: A;
}
export interface RPCResponse<R extends RPCRequest<any, any>, D extends object> {
    type: 'rpc-response';
    id: string;
    procedure: R['procedure'];
    request: R;
    err?: any;
    data: D;
}
export declare type RPC<P extends string, A extends any[], D extends object> = RPCResponse<RPCRequest<P, A>, D>;
export interface RPCProcessOptions {
    readonly name?: string;
    readonly timeout?: number;
}
export declare class RPCProcess {
    readonly name: string;
    readonly timeout: number;
    protected responseProcedures: Map<string, (args: any[]) => Promise<any>>;
    protected proc?: ChildProcess;
    constructor({ name, timeout }?: RPCProcessOptions);
    start(proc: ChildProcess | NodeJS.Process): void;
    register<R extends RPCResponse<any, object>>(procedure: R['procedure'], fn: (args: R['request']['args']) => Promise<R['data']>): void;
    call<R extends RPCResponse<any, object>>(procedure: R['procedure'], args: R['request']['args']): Promise<R['data']>;
    end(): void;
}
export declare class RPCHost {
    readonly modulePath: string;
    readonly args: readonly string[];
    protected rpc: RPCProcess;
    constructor(modulePath: string, args: readonly string[]);
    start(): void;
    register<R extends RPCResponse<any, object>>(procedure: R['procedure'], fn: (args: R['request']['args']) => Promise<R['data']>): void;
    call<R extends RPCResponse<any, object>>(procedure: R['procedure'], args: R['request']['args']): Promise<R['data']>;
    end(): void;
}
