@jeaks03/overseer
Version:
Just another TypeScript Back-End framework
163 lines • 13.7 kB
JavaScript
;
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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