container.ts
Version:
Modular application framework
103 lines (102 loc) • 3.83 kB
TypeScript
/// <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;
}