UNPKG

miter

Version:

A typescript web framework based on ExpressJs based loosely on SailsJs

178 lines 7.98 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const injector_1 = require("../core/injector"); const injectable_decorator_1 = require("../decorators/services/injectable.decorator"); const name_decorator_1 = require("../decorators/services/name.decorator"); const server_1 = require("../metadata/server/server"); const logger_1 = require("../services/logger"); let ServiceReflector = class ServiceReflector { constructor(injector, serverMeta, logger) { this.injector = injector; this.serverMeta = serverMeta; this.logger = logger; this._startedServices = []; } startServices() { return __awaiter(this, void 0, void 0, function* () { this.logger.verbose(`Starting services...`); yield this.reflectServices(this.serverMeta.services || []); this.logger.info(`Finished starting services.`); }); } reflectServices(services) { return __awaiter(this, void 0, void 0, function* () { services = services || []; let failures = 0; for (let q = 0; q < services.length; q++) { let result = yield this.reflectService(services[q]); if (!result) { this.logger.error(`Failed to start service: ${services[q].name || services[q]}`); failures++; } } if (!!failures) { this.logger.error(`${services.length - failures} services started correctly out of ${services.length}`); return false; } else { this.logger.info(`${services.length - failures} services started correctly out of ${services.length}`); return true; } }); } reflectService(serviceFn) { return __awaiter(this, void 0, void 0, function* () { let serviceName = serviceFn.name || serviceFn; try { let service = this.injector.resolveInjectable(serviceFn); if (typeof service === 'undefined') throw new Error(`Failed to inject service: ${serviceName}`); let result = yield service.start(); if (typeof result === 'boolean' && !result) return false; this._startedServices.push(service); return true; } catch (e) { this.logger.error(`Exception occurred when trying to start service: ${serviceName}`); this.logger.error(e); return false; } }); } listenServices(webServer) { return __awaiter(this, void 0, void 0, function* () { this.logger.verbose(`Sending services 'listen' lifecycle hook...`); let result = yield this.listenServicesImpl(webServer); this.logger.verbose(`Finished sending services 'listen' lifecycle hook.`); return result; }); } listenServicesImpl(webServer) { return __awaiter(this, void 0, void 0, function* () { let services = [...this._startedServices]; let failures = 0; for (let q = 0; q < services.length; q++) { let result = yield this.listenService(services[q], webServer); if (!result) { this.logger.error(`Failed to send 'listen' lifecycle hook for service: ${services[q]}`); failures++; } } if (!!failures) { this.logger.error(`${services.length - failures} services recieved 'listen' lifecycle hook correctly out of ${services.length}`); return false; } else { this.logger.verbose(`${services.length - failures} services recieved 'listen' lifecycle hook correctly out of ${services.length}`); return true; } }); } listenService(service, webServer) { return __awaiter(this, void 0, void 0, function* () { let serviceName = `${service}`; try { if (typeof service.listen !== 'undefined') yield service.listen(webServer); return true; } catch (e) { this.logger.error(`Exception occurred when trying to stop service: ${serviceName}`); this.logger.error(e); return false; } }); } shutdownServices() { return __awaiter(this, void 0, void 0, function* () { this.logger.verbose(`Shutting down services...`); let result = yield this.shutdownServicesImpl(); this.logger.info(`Finished shutting down services.`); return result; }); } shutdownServicesImpl() { return __awaiter(this, void 0, void 0, function* () { let services = this._startedServices; this._startedServices = []; let failures = 0; for (let q = 0; q < services.length; q++) { let result = yield this.shutdownService(services[q]); if (!result) { this.logger.error(`Failed to stop service: ${services[q]}`); failures++; } } if (!!failures) { this.logger.error(`${services.length - failures} services terminated correctly out of ${services.length}`); return false; } else { this.logger.info(`${services.length - failures} services terminated correctly out of ${services.length}`); return true; } }); } shutdownService(service) { return __awaiter(this, void 0, void 0, function* () { let serviceName = `${service}`; try { if (typeof service.stop !== 'undefined') yield service.stop(); return true; } catch (e) { this.logger.error(`Exception occurred when trying to stop service: ${serviceName}`); this.logger.error(e); return false; } }); } }; ServiceReflector = __decorate([ injectable_decorator_1.Injectable(), name_decorator_1.Name('services'), __metadata("design:paramtypes", [injector_1.Injector, server_1.ServerMetadata, logger_1.Logger]) ], ServiceReflector); exports.ServiceReflector = ServiceReflector; //# sourceMappingURL=reflector.js.map