/// 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; unsubscribe$: Subject; 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; constructor(scripts: Scripts, fileName: string, process: NodeChildProcess); /** End child process with signal. */ kill(signal?: string): Observable; } /** 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; /** Observable stream of process error events. */ readonly processError$: Subject; /** Workers state. */ protected readonly scriptsWorkers: { [name: string]: IScriptsWorker; }; /** Process module dependency. */ protected readonly process: Process; moduleDependencies(...previous: IModuleDependencies[]): IModuleDependencies; moduleUp(...args: IModuleHook[]): Promise; moduleDown(...args: IModuleHook[]): Promise; 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; stopWorker(name: string): Observable; protected scriptsWorkerLogMetadata(data: { name: string; worker: IScriptsWorker; options?: IScriptsWorkerOptions; code?: string | number; }): ILogMetadata; }