container.ts
Version:
Modular application framework
80 lines (79 loc) • 3.13 kB
TypeScript
import * as Debug from "debug";
import { ErrorChain } from "../lib/error";
import { Container } from "./container";
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 IModuleOptions {
moduleName: string;
opts: any;
}
/** Module dependencies. */
export interface IModuleDependencies {
[key: string]: typeof Module;
}
/** Module up/down hooks. */
export declare type IModuleUp = () => Promise<void>;
export declare type IModuleDown = () => Promise<void>;
export declare type IModuleHook = IModuleUp | IModuleDown;
/** Module destroy hook. */
export declare type IModuleDestroy = () => void;
/** Module error codes. */
export declare enum EModuleError {
Dependency = "ModuleError.Dependency"
}
/** Module error class. */
export declare class ModuleError extends ErrorChain {
constructor(code: EModuleError, cause?: Error, context?: object);
}
/** Container module log class. */
export declare class ModuleLog extends Log {
protected readonly container: Container;
protected readonly namespace: string;
constructor(container: Container, namespace: string);
/**
* Sends log message to container bus for consumption by modules.
* Adds module namespace to metadata object by default.
*/
protected log(level: ELogLevel, message: ILogMessage, metadata: ILogMetadata, ...args: any[]): void;
}
/** Container module metric class. */
export declare class ModuleMetric extends Metric {
protected readonly container: Container;
protected readonly namespace: string;
constructor(container: Container, namespace: string);
/**
* Sends metric message to container bus for consumption by modules.
* Adds module namespace to tags object by default.
*/
protected metric(type: EMetricType, name: string, value: any, tags: IMetricTags, ...args: any[]): void;
}
/** Base class for container class modules with dependency injection. */
export declare class Module {
/** Default module name. */
static readonly moduleName: string;
/** Module name. */
readonly moduleName: string;
/** Module container reference. */
readonly container: Container;
/** Module log interface. */
readonly log: ModuleLog;
/** Module metric interface. */
readonly metric: ModuleMetric;
/** Module debug interface. */
readonly debug: Debug.IDebugger;
/** Module container environment reference. */
get environment(): Environment;
/** Module container and module names. */
get namespace(): string;
constructor(options: IModuleOptions);
/** Module dependencies hook. */
moduleDependencies(...args: IModuleDependencies[]): IModuleDependencies;
/** Module operational state hook. */
moduleUp(...args: IModuleUp[]): Promise<void>;
/** Module non-operational state hook. */
moduleDown(...args: IModuleDown[]): Promise<void>;
/** Module destruction hook. */
moduleDestroy(...args: IModuleDestroy[]): void;
}