UNPKG

@jeaks03/overseer

Version:

Just another TypeScript Back-End framework

163 lines 13.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const logger_1 = __importDefault(require("@jeaks03/logger")); const requisites_1 = require("./requisites"); const perf_hooks_1 = require("perf_hooks"); const custom_types_1 = require("../misc/custom-types"); const path_1 = __importDefault(require("path")); const global_1 = require("../configs/global"); const events_1 = require("./events"); const resources_1 = require("./resources"); const mime_finder_1 = require("../misc/mime-finder"); const router_1 = require("../routes/router"); class Overseer { constructor(port) { this.port = port; Overseer.instance = Overseer.instance || this; logger_1.default.info(this, 'Initialized in base directory {}', this.basePath); } static loadPackages(packages) { packages.forEach(pack => Overseer.packages.push(pack)); return Overseer; } static composePackage(nodeModule) { return new requisites_1.ComposedPackageImpl(nodeModule); } static serve(port) { const timeStart = perf_hooks_1.performance.now(); Overseer.instance = new Overseer(port); Overseer.instance.init().then(() => { const timeEnd = perf_hooks_1.performance.now(); logger_1.default.info(this, 'Application started running in {} seconds', Math.ceil(timeEnd - timeStart) / 1000); }); } get basePath() { let rootModule = module; while (rootModule.parent) { rootModule = rootModule.parent; } return path_1.default.join(rootModule.filename, '..'); } async init() { this.loadPrerequisites(); this.loadLibs(); await this.initializeRequisites(); // this.setupRouter(); await this.triggerAfterStartupLifecycle(); logger_1.default.info(this, '{} a total of {} requisites from sources', global_1.GlobalConfig.isLibraryPackage ? 'Packed' : 'Loaded', requisites_1.Requisites.instances().length); } loadLibs() { requisites_1.Requisites.findClassesFromSourceFiles(this.basePath); const myModule = module; Overseer.packages .map(item => path_1.default.join(item.module.filename, '..')) .forEach(item => requisites_1.Requisites.findClassesFromSourceFiles(item)); } loadPrerequisites() { const resources = new resources_1.Resources(this.basePath, new mime_finder_1.MimeFinder()); requisites_1.Requisites.addInstance(new events_1.Events()); requisites_1.Requisites.addInstance(this); requisites_1.Requisites.addInstance(resources); requisites_1.Requisites.addInstance(new router_1.Router(this.port, resources)); } setupRouter() { const router = requisites_1.Requisites.find(router_1.Router); router.routes.forEach((route) => { const controller = requisites_1.Requisites.findByName(route.handlerName); route.handler.bind(controller); }); router.initializeServer(); } async initializeRequisites() { // tslint:disable-next-line: array-type let metaClasses = [...requisites_1.Requisites.classes()]; const addInstance = (metaClass, metaInstance) => { if (!requisites_1.Requisites.instances().includes(metaInstance)) { requisites_1.Requisites.instances().push(metaInstance); } }; const removeMetaClass = (metaClass, metaClassesParam) => { return metaClassesParam.filter(item => item !== metaClass); }; // Should be enough let stackLimit = 5000; while (metaClasses.length !== 0) { for (const metaClass of metaClasses) { // Constructor doesn't require any other dependencies if (!metaClass.prototype.__shadowMeta.required) { metaClass.prototype.__shadowMeta.required = []; // Just in case } // Dependencies are not instantiated yet if (!this.canInstantiate(metaClass)) { continue; } // All OK. Create instance and add to array addInstance(metaClass, await this.instantiateMetaClass(metaClass)); // Update remaining meta classes metaClasses = removeMetaClass(metaClass, metaClasses); } if (--stackLimit < 0) { logger_1.default.error(this, 'Exceeded maximum iteration count for dependency injection. Check for circular dependencies in the following classes: {}', metaClasses); throw new Error(`Dependency injection stack overflow!`); } } } async instantiateMetaClass(metaClass) { const required = metaClass.prototype.__shadowMeta.required || []; const args = []; for (const requiredClass of required) { for (const resource of requisites_1.Requisites.instances()) { if (requiredClass === resource.constructor) { args.push(resource); break; } } } const metaInstance = new metaClass(...args); await this.performLifecycle(metaInstance, 'onInit'); return metaInstance; } async triggerAfterStartupLifecycle() { const metaInstances = requisites_1.Requisites.instances(); for (const metaInstance of metaInstances) { await this.performLifecycle(metaInstance, 'afterInit'); } } async performLifecycle(metaInstance, lifecycle) { const shadowMeta = metaInstance.__proto__.__shadowMeta; if (!shadowMeta || !shadowMeta.lifecycle || !shadowMeta.lifecycle[lifecycle]) { return; } const fn = shadowMeta.lifecycle[lifecycle].bind(metaInstance); if (fn) { if (fn instanceof custom_types_1.AsyncFunction) { await fn(); } else { fn(); } } } canInstantiate(metaClass) { const required = [...metaClass.prototype.__shadowMeta.required]; for (const requiredClass of required) { let found = false; for (const resource of requisites_1.Requisites.instances()) { if (requiredClass === resource.constructor) { found = true; break; } } if (!found) { return false; } } return true; } } Overseer.packages = []; exports.Overseer = Overseer; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcnNlZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9vdmVyc2Vlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZEQUFxQztBQUNyQyw2Q0FBZ0Y7QUFDaEYsMkNBQXlDO0FBQ3pDLHVEQUE0RztBQUM1RyxnREFBd0I7QUFDeEIsOENBQWlEO0FBQ2pELHFDQUEyQztBQUMzQywyQ0FBd0M7QUFDeEMscURBQWlEO0FBQ2pELDZDQUEwQztBQUkxQyxNQUFhLFFBQVE7SUFJakIsWUFBNEIsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7UUFDcEMsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQztRQUM5QyxnQkFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTSxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQTJCO1FBQ2xELFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUEyQixDQUFDLENBQUMsQ0FBQztRQUM5RSxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFzQjtRQUMvQyxPQUFPLElBQUksZ0NBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBWTtRQUM1QixNQUFNLFNBQVMsR0FBRyx3QkFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXBDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sT0FB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