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
JavaScript
"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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xhaXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL0NsYWlyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUF3QjtBQUN4QiwyRUFBc0U7QUFDdEUsNERBQXVEO0FBQ3ZELDZGQUF3RjtBQUN4RixtR0FBOEY7QUFFOUYsZ0ZBQTJFO0FBQzNFLDBEQUFxRDtBQUNyRCxxRkFBZ0Y7QUFDaEYsbUdBQThGO0FBQzlGLHVHQUFrRztBQUNsRyw2R0FBd0c7QUFDeEcseUZBQW9GO0FBQ3BGLDhEQUE0RDtBQUM1RCxzREFBaUQ7QUFDakQsNENBQXVGO0FBQ3ZGLCtGQUEwRjtBQUkxRixNQUFhLE1BQU07SUFvQmY7UUFYTyxTQUFJLEdBQVcsSUFBSSxDQUFDO1FBQ3BCLGNBQVMsR0FBYSxJQUFJO1lBQ2hCLElBQUk7O29CQUNiLE9BQU87Z0JBQ1gsQ0FBQzthQUFBO1lBRVksSUFBSTs7b0JBQ2IsT0FBTztnQkFDWCxDQUFDO2FBQUE7U0FDSixDQUFDO1FBR0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHVDQUFrQixFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLDZCQUFhLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxxREFBeUIsRUFBRSxDQUFDO1FBQzFELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEdBQUcsSUFBSSxpREFBdUIsRUFBRSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLHlEQUEyQixFQUFFLENBQUM7UUFDOUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLCtEQUE4QixFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLDJDQUFvQixFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVELElBQVcsV0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQVcsV0FBVyxDQUFDLFdBQWdDO1FBQ25ELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLG9DQUFrQixFQUFFLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSx5Q0FBbUIsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsTUFBTSxDQUFDLE1BQXNCO1FBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLG9DQUFrQixFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSwrQkFBYyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELElBQVcsb0JBQW9CLENBQUMsb0JBQWtEO1FBQzlFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQztRQUNsRCxvQ0FBa0IsRUFBRSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSwyREFBNEIsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRCxJQUFXLG9CQUFvQjtRQUMzQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBVyxrQkFBa0IsQ0FBQyxrQkFBOEM7UUFDeEUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO1FBQzlDLG9DQUFrQixFQUFFLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLHVEQUEwQixDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELElBQVcsa0JBQWtCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxhQUFvQztRQUN6RCxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFXLGVBQWUsQ0FBQyxlQUF3QztRQUMvRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDO1FBQ3hDLG9DQUFrQixFQUFFLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxpREFBdUIsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFYSxJQUFJOztZQUNkLE1BQU0sZUFBZSxHQUFHLG9DQUFrQixFQUFFLENBQUM7WUFFN0MsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxLQUFLLE1BQU0sT0FBTyxJQUFJLGVBQWUsQ0FBQyxRQUFRLEVBQUU7Z0JBQzVDLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtvQkFDbEIsTUFBTyxPQUFPLENBQUMsUUFBNEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDdEQ7YUFDSjtZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDdkMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDO0tBQUE7SUFFWSxLQUFLOztZQUVkLHNCQUFzQjtZQUN0QixPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7Z0JBQzdDLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2dCQUM1QyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sQ0FBQyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsRCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sQ0FBQyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxNQUFXLEVBQUUsQ0FBTSxFQUFFLEVBQUU7Z0JBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7WUFFSCxzQkFBc0I7WUFDdEIsTUFBTSxlQUFlLEdBQUcsb0NBQWtCLEVBQUUsQ0FBQztZQUU3QyxLQUFLLE1BQU0sVUFBVSxJQUFJLGVBQWUsQ0FBQyxXQUFXLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO29CQUN0QixVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUN4RDthQUNKO1lBRUQsS0FBSyxNQUFNLFFBQVEsSUFBSSxlQUFlLENBQUMsY0FBYyxFQUFFO2dCQUNuRCxNQUFNLGlCQUFpQixHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsWUFBWSxRQUFRLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUU5TSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ2hDLE1BQU0sSUFBSSx5QkFBVyxDQUFDLDhCQUFxQixFQUFFLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2lCQUNsSDtnQkFFRCxJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzlCLE1BQU0sSUFBSSx5QkFBVyxDQUFDLHdDQUErQixFQUFFLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2lCQUM1SDtnQkFDRCxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7YUFDNUU7WUFFRCwyQkFBMkI7WUFDM0IsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRWxDLGtCQUFrQjtZQUNsQixLQUFLLE1BQU0sT0FBTyxJQUFJLGVBQWUsQ0FBQyxRQUFRLEVBQUU7Z0JBQzVDLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtvQkFDbEIsTUFBTyxPQUFPLENBQUMsUUFBNEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDdEQ7YUFDSjtZQUVELGNBQWM7WUFDZCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFNUIsNEJBQTRCO1lBQzVCLElBQUksTUFBTSxHQUFHLGNBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNqQywyQkFBMkI7WUFDM0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRTtnQkFDNUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUMzRCxxQkFBcUI7Z0JBQ3JCLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRTtvQkFDMUQsTUFBTSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQzNCO2dCQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixFQUFFO29CQUMvQyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDOUQ7Z0JBQ0QsTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdEQ7WUFDRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO2dCQUM5QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzdELHFCQUFxQjtnQkFDckIsS0FBSyxNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFO29CQUM1RCxNQUFNLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDM0I7Z0JBQ0QsTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDeEQ7WUFFRCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNuQyxJQUFJO29CQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7d0JBQzFCLE9BQU8sT0FBTyxFQUFFLENBQUM7b0JBQ3JCLENBQUMsQ0FBQyxDQUFDO2lCQUNOO2dCQUFDLE9BQU8sR0FBRyxFQUFFO29CQUNWLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN0QjtZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztLQUFBO0NBQ0o7QUE1TEQsd0JBNExDIn0=