UNPKG

container.ts

Version:
103 lines (102 loc) 3.83 kB
/// <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; }