UNPKG

sardines-service-provider-http

Version:
334 lines (333 loc) 15.2 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 __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.HttpServiceProviderServer = exports.validatePath = exports.defaultSettings = void 0; var sardines_core_1 = require("sardines-core"); var Koa = require("koa"); var formidable = require("formidable"); var Cors = require("koa2-cors"); var Router = require("koa-router"); var bodyParser = function (opt) { return function (ctx, next) { return __awaiter(this, void 0, void 0, function () { var form, key; return __generator(this, function (_a) { switch (_a.label) { case 0: form = (new formidable.IncomingForm()); for (key in opt) { form[key] = opt[key]; } return [4, new Promise(function (reslove, reject) { form.parse(ctx.req, function (err, fields, files) { if (err) { reject(err); } else { ctx.request.body = fields; ctx.request.files = files; reslove(); } }); })]; case 1: _a.sent(); return [4, next()]; case 2: _a.sent(); return [2]; } }); }); }; }; exports.defaultSettings = { host: '0.0.0.0', port: 80, protocol: sardines_core_1.Http.Protocol.HTTP, root: '/', bodyParser: { formLimit: '10mb', jsonLimit: '10mb', textLimit: '10mb', }, safeGuard: true, cors: { credentials: true, }, syslog: true, public: { protocol: sardines_core_1.Http.Protocol.HTTP, host: '127.0.0.1', root: '/', port: 80, }, catcher: function (err, ctx, statusCode) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { ctx.status = statusCode || 200; ctx.body = sardines_core_1.utils.unifyErrMesg(err, 'service provider', 'server wide error catcher'); return [2]; }); }); }, }; exports.validatePath = function (path) { if (!path) return '/'; if (path[0] !== '/') return "/" + path; return path; }; var validateRoot = function (rootPath) { var result = exports.validatePath(rootPath); result = result.replace(/\/+/g, '/').replace(/[\*|:]+/g, ''); if (result.length > 1 && result[result.length - 1] === '/') { result = result.substr(0, result.length - 1); } return result; }; var HttpServiceProviderServer = (function () { function HttpServiceProviderServer(settings) { var tmpDefualtSettings = Object.assign({}, exports.defaultSettings); var serverSettings = sardines_core_1.utils.mergeObjects(tmpDefualtSettings, settings); for (var _i = 0, _a = ['port', 'protocol']; _i < _a.length; _i++) { var item = _a[_i]; serverSettings.public[item] = (settings.public || {})[item] || serverSettings[item]; } serverSettings.root = validateRoot(serverSettings.root); serverSettings.public.root = validateRoot(serverSettings.public.root); serverSettings.public.host = (settings.public || {}).host || '127.0.0.1'; this.serverSettings = serverSettings; } Object.defineProperty(HttpServiceProviderServer.prototype, "info", { get: function () { return this.serverSettings.public; }, enumerable: false, configurable: true }); Object.defineProperty(HttpServiceProviderServer.prototype, "infoStr", { get: function () { if (this.publicInfoStr) return this.publicInfoStr; var infoStr = ''; var infoObj = this.info; if (infoObj.protocol) infoStr = infoObj.protocol.toUpperCase() + "://"; if (infoObj.host) infoStr += infoObj.host; if (infoObj.port) infoStr += ":" + infoObj.port; if (infoObj.root && infoObj.root !== '/') infoStr += infoObj.port; this.publicInfoStr = infoStr; return infoStr; }, enumerable: false, configurable: true }); Object.defineProperty(HttpServiceProviderServer.prototype, "logMesgHeader", { get: function () { if (!this.errorMessageHeader) this.errorMessageHeader = "[HTTP Service Provider][" + this.infoStr; return this.errorMessageHeader; }, enumerable: false, configurable: true }); HttpServiceProviderServer.prototype.applySafeGuard = function (server) { var _this = this; if (this.serverSettings.safeGuard === true) { server.use(function (ctx, next) { return __awaiter(_this, void 0, void 0, function () { var e_1, err_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 3, , 8]); if (!next) return [3, 2]; return [4, next()]; case 1: _a.sent(); _a.label = 2; case 2: return [3, 8]; case 3: e_1 = _a.sent(); sardines_core_1.utils.inspectedDebugLog(this.logMesgHeader + " Safe guard catched ERROR", e_1); if (!(typeof this.serverSettings.catcher === 'function')) return [3, 7]; _a.label = 4; case 4: _a.trys.push([4, 6, , 7]); return [4, this.serverSettings.catcher(sardines_core_1.utils.unifyErrMesg(e_1, 'service provider', 'server wide error catcher'), ctx)]; case 5: _a.sent(); return [3, 7]; case 6: err_1 = _a.sent(); sardines_core_1.utils.inspectedDebugLog(this.logMesgHeader + " ERROR in custom cacher", e_1); return [3, 7]; case 7: return [3, 8]; case 8: return [2]; } }); }); }); sardines_core_1.utils.debugLog(this.logMesgHeader + " Using default safe guard"); } else if (typeof this.serverSettings.safeGuard === 'function') { this.server.use(this.serverSettings.safeGuard); sardines_core_1.utils.debugLog(this.logMesgHeader + " Using custom safe guard"); } }; HttpServiceProviderServer.prototype.applyCORS = function (server) { if (this.serverSettings.cors) { server.use(Cors(this.serverSettings.cors)); sardines_core_1.utils.debugLog(this.logMesgHeader + " Using CORS"); } }; HttpServiceProviderServer.prototype.applyHeaders = function (server) { var _this = this; if (!this.serverSettings.headers) return; server.use(function (ctx, next) { return __awaiter(_this, void 0, void 0, function () { var prop; return __generator(this, function (_a) { switch (_a.label) { case 0: for (prop in this.serverSettings.headers) { ctx.set(prop, this.serverSettings.headers[prop]); } sardines_core_1.utils.debugLog(this.logMesgHeader + " set custom headers"); if (!next) return [3, 2]; return [4, next()]; case 1: _a.sent(); _a.label = 2; case 2: return [2]; } }); }); }); }; HttpServiceProviderServer.prototype.applySysLogger = function (server) { var _this = this; if (this.serverSettings.syslog === true) { server.use(function (ctx, next) { return __awaiter(_this, void 0, void 0, function () { var start, ms; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!next) return [3, 2]; start = Date.now(); return [4, next()]; case 1: _a.sent(); ms = Date.now() - start; sardines_core_1.utils.debugLog("[" + ctx.method + "] - " + ms + "ms " + ctx.url); _a.label = 2; case 2: return [2]; } }); }); }); sardines_core_1.utils.debugLog(this.logMesgHeader + " Using default syslog"); } else if (this.serverSettings.syslog) { server.use(this.serverSettings.syslog); sardines_core_1.utils.debugLog(this.logMesgHeader + " Using custom syslog"); } }; HttpServiceProviderServer.prototype.applyBodyParser = function (server) { if (this.serverSettings.bodyParser) { server.use(bodyParser(this.serverSettings.bodyParser)); sardines_core_1.utils.debugLog(this.logMesgHeader + " Using body parser"); } }; HttpServiceProviderServer.prototype.applyMiddlewares = function (server) { if (this.serverSettings.middlewares) { for (var _i = 0, _a = this.serverSettings.middlewares; _i < _a.length; _i++) { var item = _a[_i]; server.use(item); } sardines_core_1.utils.debugLog(this.logMesgHeader + " Using middlewares"); } }; HttpServiceProviderServer.prototype.applyPostProcesses = function (server) { if (this.serverSettings.postProcesses) { for (var _i = 0, _a = this.serverSettings.postProcesses; _i < _a.length; _i++) { var item = _a[_i]; server.use(item); } sardines_core_1.utils.debugLog(this.logMesgHeader + " Using post processes"); } }; HttpServiceProviderServer.prototype.init = function () { var self = this; return new Promise(function (resolve, reject) { if (self.server) return resolve(self.info); try { var server = new Koa(); self.applySafeGuard(server); self.applyCORS(server); self.applyHeaders(server); self.applySysLogger(server); self.applyBodyParser(server); self.applyMiddlewares(server); self.applyPostProcesses(server); var router = new Router(); server.use(router.routes()); server.use(router.allowedMethods()); try { self.server = server.listen(self.serverSettings.port, self.serverSettings.host); self.server.on('error', function (err, data) { console.error('[service provider http] Error:', err, ', data:', data); }); } catch (e) { console.error("[service provider http] Error while trying to create listener on " + self.serverSettings.host + ":" + self.serverSettings.port, e); } self.router = router; sardines_core_1.utils.debugLog(self.logMesgHeader + " " + self.serverSettings.protocol + " server is listening: " + self.serverSettings.port + ": " + self.serverSettings.host); resolve(self.info); } catch (err) { var errMsg = "[Service Provider][" + self.infoStr + "] Error when init"; sardines_core_1.utils.debugLog(errMsg, err); reject(errMsg); } }); }; return HttpServiceProviderServer; }()); exports.HttpServiceProviderServer = HttpServiceProviderServer;