UNPKG

container.ts

Version:
167 lines (166 loc) 6.64 kB
/// <reference types="debug" /> import * as Debug from "debug"; import { Observable } from "rxjs/Observable"; import "rxjs/add/observable/of"; import "rxjs/add/observable/throw"; import "rxjs/add/observable/forkJoin"; import "rxjs/add/operator/catch"; import "rxjs/add/operator/filter"; import "rxjs/add/operator/switchMap"; import "rxjs/add/operator/take"; import "rxjs/add/operator/timeout"; import { Environment } from "./Environment"; import { ELogLevel, ILogMessage, ILogMetadata, Log } from "./Log"; import { EMetricType, IMetricTags, Metric } from "./Metric"; /** Container options injected by awilix library. */ export interface IContainerModuleOpts { [key: string]: any; } /** Container module constructor interface. */ export interface IContainerModuleConstructor { name: string; new (name: string, opts: IContainerModuleOpts): ContainerModule; } /** Container module dependencies. */ export interface IContainerModuleDepends { [key: string]: string; } /** Module state interface. */ export interface IContainerModuleState { [key: string]: boolean; } /** Container error class. */ export declare class ContainerError extends Error { constructor(message: string); } /** Container log message interface. */ export interface IContainerLogMessage { level: ELogLevel; message: ILogMessage; metadata: ILogMetadata; args: any[]; } /** Log message class for stream of module logs. */ export declare class ContainerLogMessage implements IContainerLogMessage { level: ELogLevel; message: ILogMessage; metadata: ILogMetadata; args: any[]; constructor(level: ELogLevel, message: ILogMessage, metadata: ILogMetadata, args: any[]); } /** Container metric message interface. */ export interface IContainerMetricMessage { type: EMetricType; name: string; value: any; tags: IMetricTags; } /** Metric message class for stream of module metrics. */ export declare class ContainerMetricMessage implements IContainerMetricMessage { type: EMetricType; name: string; value: any; tags: IMetricTags; constructor(type: EMetricType, name: string, value: any, tags: IMetricTags); } /** Container reference name used internally by modules. */ export declare const CONTAINER_NAME = "_container"; /** Wrapper around awilix library. */ export declare class Container { private _name; private _environment; private _container; private _modules; private _logs; private _metrics; /** Container name, used to namespace modules. */ readonly name: string; /** Container environment reference available to modules. */ readonly environment: Environment; /** Array of registered module names. */ readonly modules: string[]; /** Container logs. */ readonly logs: Observable<ContainerLogMessage>; /** Container metrics. */ readonly metrics: Observable<ContainerMetricMessage>; /** Creates a new container in proxy resolution mode. */ constructor(_name: string, environment?: Environment); /** Register a module in container, has singleton lifetime by default. */ registerModule<T extends IContainerModuleConstructor>(instance: T, lifetime?: string): Container; /** Register a value in container. */ registerValue<T>(name: string, value: T): Container; /** Resolve module in container by name. */ resolve<T>(name: string): T; /** Send log message of level for module. */ sendLog(level: ELogLevel, message: ILogMessage, metadata: ILogMetadata, args: any[]): void; /** Send metric message of type for module. */ sendMetric(type: EMetricType, name: string, value: any, tags: IMetricTags): void; /** Observable stream of logs filtered by level. */ filterLogs(level: ELogLevel): Observable<ContainerLogMessage>; /** Signal modules to enter operational state. */ start(timeout?: number): Observable<void>; /** Signal modules to leave operational state. */ stop(timeout?: number): Observable<void>; /** Wait for modules to start before calling next. */ waitStarted(...modules: string[]): Observable<void>; /** Wait for modules to stop before calling next. */ waitStopped(...modules: string[]): Observable<void>; /** Factory functions for modules. */ protected makeModule<T extends IContainerModuleConstructor>(name: string, instance: T, opts: IContainerModuleOpts): ContainerModule; /** Set modules state by calling start/stop methods. */ protected setModulesState(state: boolean, timeout?: number): Observable<void>; /** Update and report module state via internal subject. */ protected reportModuleState(name: string, state: boolean): Observable<void>; } /** Container module log class. */ export declare class ContainerModuleLog extends Log { private _container; private _name; constructor(_container: Container, _name: string); /** * Sends log message to container bus for consumption by modules. * Adds module name to metadata object by default. */ protected log(level: ELogLevel, message: ILogMessage, metadata: ILogMetadata, ...args: any[]): void; } /** Container module metric class. */ export declare class ContainerModuleMetric extends Metric { private _container; private _name; constructor(_container: Container, _name: string); /** * Sends metric message to container bus for consumption by modules. * Adds module name to tags object by default. */ protected metric(type: EMetricType, name: string, value: any, tags: IMetricTags): void; } /** Base class for container class modules with dependency injection. */ export declare class ContainerModule { private _container; private _name; private _log; private _metric; private _debug; private _identifier; /** Module container reference. */ readonly container: Container; /** Module container environment reference. */ readonly environment: Environment; /** Module name. */ readonly name: string; /** Module container and module names. */ readonly namespace: string; /** Module log interface. */ readonly log: ContainerModuleLog; /** Module metric interface. */ readonly metric: ContainerModuleMetric; /** Module debug interface. */ readonly debug: Debug.IDebugger; /** Incrementing counter for unique identifiers. */ protected readonly identifier: number; constructor(name: string, opts: IContainerModuleOpts, depends?: IContainerModuleDepends); /** Module operational state. */ start(): Observable<void>; /** Module non-operational state. */ stop(): Observable<void>; }