UNPKG

claire-framework

Version:

- được viết bằng TypeScript - hỗ trợ websocket và HTTP request - hỗ trợ CLI để generate base project (claire-cli)

191 lines 16.3 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 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) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const http_1 = __importDefault(require("http")); const AbstractEnvProvider_1 = require("./environment/AbstractEnvProvider"); const AbstractLogger_1 = require("./logger/AbstractLogger"); const AbstractHttpRequestHandler_1 = require("./controller/http/AbstractHttpRequestHandler"); const AbstractSocketRequestHandler_1 = require("./controller/socket/AbstractSocketRequestHandler"); const AbstractDatabaseAdapter_1 = require("./database/AbstractDatabaseAdapter"); const DefaultLogger_1 = require("./logger/DefaultLogger"); const DefaultEnvProvider_1 = require("./default-implementations/DefaultEnvProvider"); const DefaultHttpRequestHandler_1 = require("./default-implementations/DefaultHttpRequestHandler"); const DefaultSocketRequestHandler_1 = require("./default-implementations/DefaultSocketRequestHandler"); const DefaultInMemoryDatabaseAdapter_1 = require("./default-implementations/DefaultInMemoryDatabaseAdapter"); const DefaultDataValidator_1 = require("./default-implementations/DefaultDataValidator"); const GlobalInjection_1 = require("./system/GlobalInjection"); const ClaireError_1 = require("./system/ClaireError"); const errors_1 = require("./system/errors"); const DefaultHttpErrorHandler_1 = require("./default-implementations/DefaultHttpErrorHandler"); class Claire { constructor() { this.port = 1992; this.bootstrap = new class { init() { return __awaiter(this, void 0, void 0, function* () { return; }); } stop() { return __awaiter(this, void 0, void 0, function* () { return; }); } }; this.envProvider = new DefaultEnvProvider_1.DefaultEnvProvider(); this.logger = new DefaultLogger_1.DefaultLogger(); this.httpRequestHandler = new DefaultHttpRequestHandler_1.DefaultHttpRequestHandler(); this.httpRequestHandler.errorHandler = new DefaultHttpErrorHandler_1.DefaultHttpErrorHandler(); this.socketRequestHandler = new DefaultSocketRequestHandler_1.DefaultSocketRequestHandler(); this.databaseAdapter = new DefaultInMemoryDatabaseAdapter_1.DefaultInMemoryDatabaseAdapter(); this.dataValidator = new DefaultDataValidator_1.DefaultDataValidator(); } get envProvider() { return this._envProvider; } set envProvider(envProvider) { this._envProvider = envProvider; GlobalInjection_1.getGlobalInjection().findAndReplace(envProvider, AbstractEnvProvider_1.AbstractEnvProvider); } get logger() { return this._logger; } set logger(logger) { this._logger = logger; GlobalInjection_1.getGlobalInjection().findAndReplace(logger, AbstractLogger_1.AbstractLogger); } set socketRequestHandler(socketRequestHandler) { this._socketRequestHandler = socketRequestHandler; GlobalInjection_1.getGlobalInjection().findAndReplace(socketRequestHandler, AbstractSocketRequestHandler_1.AbstractSocketRequestHandler); } get socketRequestHandler() { return this._socketRequestHandler; } set httpRequestHandler(httpRequestHandler) { this._httpRequestHandler = httpRequestHandler; GlobalInjection_1.getGlobalInjection().findAndReplace(httpRequestHandler, AbstractHttpRequestHandler_1.AbstractHttpRequestHandler); } get httpRequestHandler() { return this._httpRequestHandler; } set dataValidator(dataValidator) { this._dataValidator = dataValidator; } get dataValidator() { return this._dataValidator; } get databaseAdapter() { return this._databaseAdapter; } set databaseAdapter(databaseAdapter) { this._databaseAdapter = databaseAdapter; GlobalInjection_1.getGlobalInjection().findAndReplace(databaseAdapter, AbstractDatabaseAdapter_1.AbstractDatabaseAdapter); } stop() { return __awaiter(this, void 0, void 0, function* () { const globalInjection = GlobalInjection_1.getGlobalInjection(); yield this.bootstrap.stop(); yield this.databaseAdapter.stop(); for (const service of globalInjection.services) { if (service.instance) { yield service.instance.stop(); } } this.logger.info("Program terminate."); process.exit(0); }); } start() { return __awaiter(this, void 0, void 0, function* () { //-- handle exceptions process.on('SIGTERM', () => { this.logger.warn("SIGTERM interrupt signal"); return this.stop(); }); process.on('SIGINT', () => { this.logger.warn("SIGINT interrupt signal"); return this.stop(); }); process.on('uncaughtException', (err) => { this.logger.error('uncaughtException', err.stack); return this.stop(); }); process.on('unhandledRejection', (reason, p) => { this.logger.error('unhandledRejection', reason, p); return this.stop(); }); //-- perform injection const globalInjection = GlobalInjection_1.getGlobalInjection(); for (const injectable of globalInjection.injectables) { if (!injectable.instance) { injectable.instance = new injectable.constructorFn(); } } for (const registry of globalInjection.injectRegistry) { const matchedInjectable = globalInjection.injectables.filter(injectable => injectable.instance instanceof registry.keyPrototype && (!injectable.env || injectable.env.includes(this.envProvider.currentEnv))); if (matchedInjectable.length === 0) { throw new ClaireError_1.ClaireError(errors_1.NO_MATCHED_INJECTABLE, `${registry.prototype.constructor.name}:${registry.propertyKey}`); } if (matchedInjectable.length > 1) { throw new ClaireError_1.ClaireError(errors_1.MULTIPLE_VERSIONS_OF_INJECTABLE, `${registry.prototype.constructor.name}:${registry.propertyKey}`); } registry.prototype[registry.propertyKey] = matchedInjectable[0].instance; } //-- init database adapters yield this.databaseAdapter.init(); //-- init services for (const service of globalInjection.services) { if (service.instance) { yield service.instance.init(); } } //-- bootstrap yield this.bootstrap.init(); //-- mount request handlers; let server = http_1.default.createServer(); //-- config http and socket if (this.httpRequestHandler.controllers.length) { this.httpRequestHandler.dataValidator = this.dataValidator; //-- init controllers for (const controller of this.httpRequestHandler.controllers) { yield controller.init(); } if (this.httpRequestHandler.authorizationProvider) { yield this.httpRequestHandler.authorizationProvider.init(); } server = this.httpRequestHandler.configure(server); } if (this.socketRequestHandler.controllers.length) { this.socketRequestHandler.dataValidator = this.dataValidator; //-- init controllers for (const controller of this.socketRequestHandler.controllers) { yield controller.init(); } server = this.socketRequestHandler.configure(server); } return new Promise((resolve, reject) => { try { server.listen(this.port, () => { return resolve(); }); } catch (err) { return reject(err); } }); }); } } exports.Claire = Claire; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xhaXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL0NsYWlyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUF3QjtBQUN4QiwyRUFBc0U7QUFDdEUsNERBQXVEO0FBQ3ZELDZGQUF3RjtBQUN4RixtR0FBOEY7QUFFOUYsZ0ZBQTJFO0FBQzNFLDBEQUFxRDtBQUNyRCxxRkFBZ0Y7QUFDaEYsbUdBQThGO0FBQzlGLHVHQUFrRztBQUNsRyw2R0FBd0c7QUFDeEcseUZBQW9GO0FBQ3BGLDhEQUE0RDtBQUM1RCxzREFBaUQ7QUFDakQsNENBQXVGO0FBQ3ZGLCtGQUEwRjtBQUkxRixNQUFhLE1BQU07SUFvQmY7UUFYTyxTQUFJLEdBQVcsSUFBSSxDQUFDO1FBQ3BCLGNBQVMsR0FBYSxJQUFJO1lBQ2hCLElBQUk7O29CQUNiLE9BQU87Z0JBQ1gsQ0FBQzthQUFBO1lBRVksSUFBSTs7b0JBQ2IsT0FBTztnQkFDWCxDQUFDO2FBQUE7U0FDSixDQUFDO1FBR0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHVDQUFrQixFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLDZCQUFhLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxxREFBeUIsRUFBRSxDQUFDO1FBQzFELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEdBQUcsSUFBSSxpREFBdUIsRUFBRSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLHlEQUEyQixFQUFFLENBQUM7UUFDOUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLCtEQUE4QixFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLDJDQUFvQixFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVELElBQVcsV0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDN0IsQ0FBQztJQUVE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