claire-framework
Version:
- được viết bằng TypeScript - hỗ trợ websocket và HTTP request - hỗ trợ CLI để generate base project (claire-cli)
166 lines • 15.5 kB
JavaScript
;
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) {
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 express_1 = __importDefault(require("express"));
const AbstractHttpRequestHandler_1 = require("../controller/http/AbstractHttpRequestHandler");
const HTTP_1 = require("../enum/HTTP");
const DefaultJsonResponder_1 = require("./DefaultJsonResponder");
const ClaireError_1 = require("../system/ClaireError");
const errors_1 = require("../system/errors");
const AbstractLogger_1 = require("../logger/AbstractLogger");
const core_1 = require("../decorator/core");
class DefaultHttpRequestHandler extends AbstractHttpRequestHandler_1.AbstractHttpRequestHandler {
constructor() {
super();
}
configure(server) {
super.assertValid();
this.app = express_1.default();
//-- use global middleware
const requestUpgradeMiddleware = (req, res, next) => {
// @ts-ignore
req["valueMap"] = new Map();
// @ts-ignore
req["getQuery"] = () => req.query;
// @ts-ignore
req["getBody"] = () => req.body;
// @ts-ignore
req["getParams"] = () => req.params;
// @ts-ignore
req["getValue"] = (key) => req["valueMap"].get(key);
// @ts-ignore
req["setValue"] = (key, value) => req["valueMap"].set(key, value);
return next();
};
let globalMiddleware = this.middleware.map((m) => {
return (request, response, next) => {
try {
return m.intercept()(request, response, next);
}
catch (err) {
this.errorHandler.handle(request, response, err);
}
};
});
this.app.use([requestUpgradeMiddleware, ...globalMiddleware]);
let defaultJsonResponder = new DefaultJsonResponder_1.DefaultJsonResponder();
//-- process routers
const expressRouter = express_1.default.Router();
for (let i = 0; i < this.controllers.length; i++) {
let controller = this.controllers[i];
const routes = controller.handlers;
for (let j = 0; j < routes.length; j++) {
let route = routes[j];
let middleware = (route.middleware || []).map((m) => {
return (req, res, next) => {
try {
return m.intercept()(req, res, next);
}
catch (err) {
this.errorHandler.handle(req, res, err);
}
};
});
let expressHandler;
switch (route.method) {
case HTTP_1.HTTP.GET:
expressHandler = expressRouter.get.bind(expressRouter);
break;
case HTTP_1.HTTP.POST:
expressHandler = expressRouter.post.bind(expressRouter);
break;
case HTTP_1.HTTP.DEL:
expressHandler = expressRouter.delete.bind(expressRouter);
break;
case HTTP_1.HTTP.PUT:
expressHandler = expressRouter.put.bind(expressRouter);
break;
default:
expressHandler = undefined;
}
let _this = this;
!!expressHandler && expressHandler(route.url, middleware, function (req, res) {
//-- validate
((_this) => __awaiter(this, void 0, void 0, function* () {
if (route.queryValidator !== undefined) {
//-- disable strict type checking because query values are always string
let validationResult = yield _this.dataValidator.validate(route.queryValidator, req.query, false);
if (validationResult !== true) {
//-- return validation report
throw new ClaireError_1.ClaireError(errors_1.VALIDATION_ERROR, validationResult);
}
}
if (route.paramsValidator !== undefined) {
//-- disable strict type checking because param values are always string
let validationResult = yield _this.dataValidator.validate(route.paramsValidator, req.params, false);
if (validationResult !== true) {
//-- return validation report
throw new ClaireError_1.ClaireError(errors_1.VALIDATION_ERROR, validationResult);
}
}
if (route.bodyValidator !== undefined) {
//- enable strict type checking
let validationResult = yield _this.dataValidator.validate(route.bodyValidator, req.body, true);
if (validationResult !== true) {
//-- return validation report
throw new ClaireError_1.ClaireError(errors_1.VALIDATION_ERROR, validationResult);
}
}
//-- call authorization provider
if (!route.openAccess && _this.authorizationProvider) {
yield _this.authorizationProvider.authorize(req, route);
}
return yield controller[route.handlerFn](req);
// if (route.responseValidator !== undefined) {
// //-- enable strict type checking for response
// let validationResult = await _this.dataValidator.validate(route.responseValidator, result, true);
// if (validationResult !== true) {
// //-- this is the system error
// throw new ClaireError(BACKEND_RETURN_ERROR_DATA, validationResult);
// }
// }
}))(_this)
.then((result) => {
let responder = route.responder || defaultJsonResponder;
responder.response(res, result);
})
.catch((err) => {
_this.errorHandler.handle(req, res, err);
});
});
}
}
this.app.use(this.mountPoint, expressRouter);
//-- last resort for error handling
this.app.use((req, res) => {
this.errorHandler.handle(req, res, new ClaireError_1.ClaireError(errors_1.HTTP_HANDLER_NOT_FOUND));
});
return require("http")["Server"](this.app);
}
}
__decorate([
core_1.Inject(),
__metadata("design:type", AbstractLogger_1.AbstractLogger)
], DefaultHttpRequestHandler.prototype, "logger", void 0);
exports.DefaultHttpRequestHandler = DefaultHttpRequestHandler;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEh0dHBSZXF1ZXN0SGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kZWZhdWx0LWltcGxlbWVudGF0aW9ucy9EZWZhdWx0SHR0cFJlcXVlc3RIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0Esc0RBQThFO0FBQzlFLDhGQUF5RjtBQUd6Rix1Q0FBa0M7QUFDbEMsaUVBQTREO0FBQzVELHVEQUFrRDtBQUNsRCw2Q0FBMEU7QUFDMUUsNkRBQXdEO0FBQ3hELDRDQUF5QztBQUV6QyxNQUFhLHlCQUEwQixTQUFRLHVEQUEwQjtJQU9yRTtRQUNJLEtBQUssRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVNLFNBQVMsQ0FBQyxNQUFjO1FBRTNCLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUMsR0FBRyxHQUFHLGlCQUFPLEVBQUUsQ0FBQztRQUVyQiwwQkFBMEI7UUFDMUIsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLEdBQVksRUFBRSxHQUFhLEVBQUUsSUFBa0IsRUFBTyxFQUFFO1lBQ3RGLGFBQWE7WUFDYixHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztZQUN6QyxhQUFhO1lBQ2IsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDbEMsYUFBYTtZQUNiLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ2hDLGFBQWE7WUFDYixHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUNwQyxhQUFhO1lBQ2IsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxD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