/// <reference types="node" />
import { ChildProcess as NodeChildProcess } from "child_process";
import { BehaviorSubject, Observable, Subject } from "rxjs";
import { IEnvironmentVariables, ILogMetadata, IModuleDependencies, IModuleDestroy, IModuleHook, RxModule } from "../../../container";
import { ErrorChain } from "../../error/error-chain";
import { Process } from "./process";
/** Scripts process options. */
export interface IScriptsForkOptions {
    args?: string[];
    env?: IEnvironmentVariables;
}
/** Scripts worker options. */
export interface IScriptsWorkerOptions extends IScriptsForkOptions {
    /** Worker process should restart after exit. */
    restart?: boolean;
    /** Worker process restarts maximum number of times. */
    restartLimit?: number;
}
/** Scripts worker. */
export interface IScriptsWorker {
    next$: BehaviorSubject<ScriptsProcess>;
    unsubscribe$: Subject<void>;
    restarts: number;
}
/** Scripts process exit event. */
export interface IScriptsProcessExit {
    pid: number;
    code?: number;
    signal?: string;
}
/** Scripts process error event. */
export interface IScriptsProcessError {
    pid: number;
    error: any;
}
/** Scripts log names. */
export declare enum EScriptsLog {
    Information = "Scripts.Information"
}
/** ScriptsProcess error codes. */
export declare enum EScriptsProcessError {
    Exit = "ScriptsProcessError.Exit",
    Error = "ScriptsProcessError.Error"
}
/** ScriptsProcess error class. */
export declare class ScriptsProcessError extends ErrorChain {
    constructor(code: EScriptsProcessError, cause?: Error, context?: object);
}
/** Spawned scripts process. */
export declare class ScriptsProcess {
    readonly scripts: Scripts;
    readonly fileName: string;
    readonly process: NodeChildProcess;
    readonly exit$: Observable<number | string>;
    constructor(scripts: Scripts, fileName: string, process: NodeChildProcess);
    /** End child process with signal. */
    kill(signal?: string): Observable<number | string>;
}
/** Scripts environment variable names. */
export declare enum EScriptsEnv {
    /** Scripts directory path (required). */
    Path = "SCRIPTS_PATH"
}
/** Scripts log names. */
export declare enum EScriptsLog {
    WorkerStart = "Scripts.WorkerStart",
    WorkerStop = "Scripts.WorkerStop",
    WorkerExit = "Scripts.WorkerExit",
    WorkerRestart = "Scripts.WorkerRestart",
    WorkerRestartLimit = "Scripts.WorkerRestartLimit"
}
/** Node.js scripts module. */
export declare class Scripts extends RxModule {
    /** Default module name. */
    static readonly moduleName: string;
    /** Absolute path to script files directory. */
    readonly envPath: string;
    /** Observable stream of process exit events. */
    readonly processExit$: Subject<IScriptsProcessExit>;
    /** Observable stream of process error events. */
    readonly processError$: Subject<IScriptsProcessError>;
    /** Workers state. */
    protected readonly scriptsWorkers: {
        [name: string]: IScriptsWorker;
    };
    /** Process module dependency. */
    protected readonly process: Process;
    moduleDependencies(...previous: IModuleDependencies[]): IModuleDependencies;
    moduleUp(...args: IModuleHook[]): Promise<void>;
    moduleDown(...args: IModuleHook[]): Promise<void>;
    moduleDestroy(...args: IModuleDestroy[]): void;
    /** Spawn new Node.js process using script file. */
    fork(fileName: string, options?: IScriptsForkOptions): ScriptsProcess;
    startWorker(name: string, fileName: string, options?: IScriptsWorkerOptions): Observable<ScriptsProcess>;
    stopWorker(name: string): Observable<string | number>;
    protected scriptsWorkerLogMetadata(data: {
        name: string;
        worker: IScriptsWorker;
        options?: IScriptsWorkerOptions;
        code?: string | number;
    }): ILogMetadata;
}
