{"version":3,"sources":["../src/plugin.manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAiB,SAAS,EAAE,MAAM,aAAa,CAAC;AAEvD;IASgB,OAAO,CAAC,UAAU;IAP9B,SAAS,CAAC,WAAW,EAAE,MAAM,CAAQ;IACrC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,IAAI,CAAsB;IAClC,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,QAAQ,CAA0B;gBAEtB,UAAU,GAAE,KAAK,CAAC,aAAa,CAAM;IA8BlD,cAAc,CAAC,MAAM,EAAE,MAAM;IAI7B,cAAc;IAId,MAAM,CAAC,KAAK,EAAE,MAAM;IAIpB,MAAM,CAAC,KAAK,EAAE,MAAM;IAIpB,eAAe,CAAC,OAAO,EAAE,OAAO;IAIhC,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC;IAInD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;IAgB/C,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;IAgBlD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAc/C,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC;IAOzC,IAAI;CAwDpB","file":"plugin.manager.d.ts","sourcesContent":["import * as Agenda from 'agenda';\nimport * as winston from 'winston';\nimport { Dao, Job, Service } from './entities';\nimport { MultivestError } from './error';\nimport { PluginOptions } from './model';\nimport { Plugin } from './plugin';\nimport { Constructable, Hashtable } from './structure';\n\nexport class PluginManager {\n    // @ts-ignore\n    protected jobExecutor: Agenda = null;\n    private plugins: Hashtable<Plugin<any>> = {};\n    private pluginsOrdered: Array<Plugin<any>> = [];\n    private jobs: Hashtable<Job> = {};\n    private daos: Hashtable<Dao<any>> = {};\n    private services: Hashtable<Service> = {};\n\n    constructor(private pluginList: Array<PluginOptions> = []) {\n        const myFormat = winston.format.printf((info) => {\n            return `${info.timestamp} ${info.level}: ${info.message}`;\n        });\n\n        winston.configure({\n            format: winston.format.combine(\n                winston.format.timestamp(),\n                myFormat\n            ),\n            transports: [\n                new winston.transports.Console()\n            ]\n        });\n\n        winston.debug('creating PluginManager');\n\n        process.on('unhandledRejection', (err) => {\n            winston.error('unhandledRejection', err);\n\n            throw err;\n        });\n\n        process.on('uncaughtException', (err) => {\n            winston.error('uncaughtException', err);\n\n            throw err;\n        });\n    }\n\n    public setJobExecutor(agenda: Agenda) {\n        this.jobExecutor = agenda;\n    }\n\n    public getJobExecutor() {\n        return this.jobExecutor;\n    }\n\n    public getJob(jobId: string) {\n        return this.jobs[jobId];\n    }\n\n    public getDao(daoId: string) {\n        return this.daos[daoId];\n    }\n\n    public registerService(service: Service) {\n        this.services[service.getServiceId()] = service;\n    }\n\n    public getService<T extends Service>(serviceId: string): T {\n        return this.services[serviceId] as T;\n    }\n\n    public getServicesByPath(path: string): Array<Service> {\n        const ids = Object.keys(this.services);\n\n        const filteredServices: Array<Service> = [];\n\n        for (const id of ids) {\n            if (id.match(path)) {\n                const service = this.services[id];\n\n                filteredServices.push(service);\n            }\n        }\n\n        return filteredServices;\n    }\n\n    public getServicesTableByPath(path: string): Hashtable<Service> {\n        const ids = Object.keys(this.services);\n\n        const filteredServices: Hashtable<Service> = {};\n\n        for (const id of ids) {\n            if (id.match(path)) {\n                const service = this.services[id];\n\n                filteredServices[id] = service;\n            }\n        }\n\n        return filteredServices;\n    }\n\n    public async enableJob(jobId: string, interval: string) {\n        if (!Object.prototype.hasOwnProperty.call(this.jobs, jobId)) {\n            throw new MultivestError(`PluginManager: Unknown job ${jobId}`);\n        }\n\n        if (this.jobs[jobId].enabled) {\n            return;\n        }\n\n        await this.jobs[jobId].init();\n        this.jobExecutor.every(interval, jobId);\n        this.jobs[jobId].enabled = true;\n    }\n\n    public get<T extends Plugin<any>>(pluginId: string): T {\n        if (Object.prototype.hasOwnProperty.call(this.plugins, pluginId)) {\n            return this.plugins[pluginId] as T;\n        }\n        throw new MultivestError(`Unknown plugin ${pluginId}`);\n    }\n\n    public async init() {\n        winston.debug('PluginManager init called');\n\n        const startTime = new Date().getTime();\n\n        try {\n            for (const pluginOptions of this.pluginList) {\n                winston.debug(`loading plugin ${pluginOptions.path}`);\n\n                try {\n                    let pluginInstance;\n                    if (pluginOptions && pluginOptions.path) {\n                        const PluginClass = require(pluginOptions.path).Plugin;\n                        const PluginConstructor = PluginClass as Constructable<Plugin<any>>;\n                        pluginInstance = new PluginConstructor(this);\n                    } else if (pluginOptions && pluginOptions.pluginClass) {\n                        pluginInstance = new pluginOptions.pluginClass(this);\n                    }\n\n                    // @ts-ignore\n                    this.plugins[pluginInstance.getPluginId()] = pluginInstance;\n\n                    this.pluginsOrdered.push(pluginInstance);\n                }\n                catch (error) {\n                    winston.error(`PluginManager: Failed to load plugin ${pluginOptions.path}`, error);\n\n                    process.exit(1);\n                }\n            }\n\n            for (const plugin of this.pluginsOrdered) {\n                await plugin.init(); // registerService(), servicesClasses.push(ServiceConstructor)\n            }\n\n            for (const plugin of this.pluginsOrdered) {\n                plugin.invoke();\n                this.jobs = Object.assign(this.jobs, plugin.getJobs());\n                this.daos = Object.assign(this.daos, await plugin.getDaos());\n                this.services = Object.assign(this.services, plugin.getServices()); // authService, userService ...\n            }\n\n            for (const serviceId in this.services) {\n                if (this.services[serviceId]) {\n                    await this.services[serviceId].init(); // userService calls authService\n                }\n            }\n\n            const endTime = new Date().getTime();\n\n            winston.info(`PluginManager: Launched for ${endTime - startTime} ms`);\n        }\n        catch (error) {\n            winston.error('PluginManager: Failed to launch', error);\n        }\n    }\n}\n"]}