import { Observable } from 'rxjs';
import { ExtensionWithConfig, BootstrapOptions } from './interfaces';
import { Type } from './decorators';
export declare class Hapiness {
    private static module;
    private static extensions;
    private static logger;
    private static shutdownUtils;
    private static defaultTimeout;
    /**
     * Entrypoint to bootstrap a module
     * will load the extentions and trigger
     * module's hooks
     *
     * @param  {Type<any>} module
     * @param  {Array<Type<any>|ExtensionWithConfig>} extensions?
     * @param  {BootstrapOptions} options?
     * @returns Promise
     */
    static bootstrap(module: Type<any>, extensions?: Array<Type<any> | ExtensionWithConfig>, options?: BootstrapOptions): Promise<void>;
    /**
     * Force a shutdown
     *
     * @returns Observable
     */
    static shutdown(): Observable<boolean>;
    private static handleShutdownSignals();
    /**
     * Retrieve all shutdown hooks
     *
     * @returns ExtensionShutdown[]
     */
    private static getShutdownHooks();
    /**
     * Load extensions
     *
     * @param  {Array<Type<any>|ExtensionWithConfig>} extensions
     * @param  {CoreModule} moduleResolved
     * @param  {BootstrapOptions} options?
     * @returns Observable
     */
    private static loadExtensions(extensions, moduleResolved, options);
    /**
     * Instantiate module
     *
     * @param  {Extension[]} extensionsLoaded
     * @param  {CoreModule} moduleResolved
     * @returns Observable
     */
    private static instantiateModule(extensionsLoaded, moduleResolved, options);
    /**
     * Call Register Hooks
     *
     * @param  {CoreModule} moduleInstantiated
     * @returns Observable
     */
    private static callRegister(moduleInstantiated);
    /**
     * Call Start Hooks
     *
     * @param  {CoreModule} moduleInstantiated
     * @returns Observable
     */
    private static callStart(moduleInstantiated);
    /**
     * Check if the provided module
     * is right
     *
     * @param  {Type<any>} module
     * @returns Observable
     */
    private static checkArg(module);
    /**
     * Convert an extension type to ExtensionWithConfig
     *
     * @param  {} extension
     * @returns ExtensionWithConfig
     */
    private static toExtensionWithConfig(extension);
    /**
     * Call the OnExtensionLoad hook
     * of an extension
     *
     * @param  {ExtensionWithConfig} extension
     * @returns Observable
     */
    private static loadExtention(extension, module, options);
    /**
     * Call the OnModuleInstantiated hook
     * of an extension
     *
     * @param  {Extension} extension
     * @returns Observable
     */
    private static moduleInstantiated(extension, module);
}
/**
 * Error handler
 * Call onError of Root module
 * Or log in console
 *
 * @param  {Error} error
 * @param  {any} data
 * @returns void
 */
export declare function errorHandler(error: Error, data?: any): void;
