/// <reference types="debug" />
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";
import { Observable } from "./RxJS";
import { IModule, IModuleDependencies, IModuleOptions } from "./Types";
/** Module error class. */
export declare class ModuleError extends ErrorChain {
    constructor(name: string, cause?: Error);
}
/** Container module log class. */
export declare class ModuleLog extends Log {
    protected readonly container: Container;
    protected readonly name: string;
    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 ModuleMetric extends Metric {
    protected readonly container: Container;
    protected readonly name: string;
    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 Module implements IModule {
    /** Default module name. */
    static readonly moduleName: string;
    /** Error names. */
    static readonly ERROR: {
        DEPENDENCY: 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. */
    readonly environment: Environment;
    /** Module container and module names. */
    readonly namespace: string;
    constructor(options: IModuleOptions);
    /** Module dependencies hook. */
    moduleDependencies(...previous: IModuleDependencies[]): IModuleDependencies;
    /** Module operational state. */
    moduleUp(): void | Observable<void>;
    /** Module non-operational state. */
    moduleDown(): void | Observable<void>;
}
