evaengine 0.11.2 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ai/analysis.md +657 -0
- package/.ai/architecture/runtime.md +504 -0
- package/.ai/contracts/public-api.md +447 -0
- package/.ai/external-project-guide.md +248 -0
- package/.ai/vision.md +314 -0
- package/README.md +51 -62
- package/bin/engine +15 -21
- package/index.js +2 -18
- package/package.json +60 -64
- package/src/commands/index.js +12 -0
- package/{lib → src}/commands/interface.js +5 -11
- package/src/commands/make_entity.js +490 -0
- package/src/commands/tramp.js +34 -0
- package/{lib → src}/config/index.js +7 -9
- package/{lib → src}/di.js +11 -26
- package/src/engine.js +551 -0
- package/{lib → src}/entities/index.js +72 -82
- package/{lib → src}/exceptions/index.js +71 -92
- package/src/index.js +57 -0
- package/src/middlewares/auth.js +67 -0
- package/src/middlewares/auth_kong.js +28 -0
- package/src/middlewares/debug.js +88 -0
- package/src/middlewares/index.js +18 -0
- package/src/middlewares/providers.js +73 -0
- package/src/middlewares/session.js +58 -0
- package/{lib → src}/middlewares/trace.js +74 -86
- package/src/middlewares/validator.js +50 -0
- package/src/middlewares/view_cache.js +127 -0
- package/{lib → src}/services/cache.js +45 -56
- package/src/services/config.js +111 -0
- package/src/services/env.js +28 -0
- package/src/services/event_manager.js +84 -0
- package/src/services/http_client.js +160 -0
- package/src/services/index.js +27 -0
- package/src/services/interface.js +5 -0
- package/src/services/joi.js +13 -0
- package/src/services/jwt_token.js +89 -0
- package/src/services/jwt_token_kong.js +75 -0
- package/src/services/logger.js +148 -0
- package/src/services/namespace.js +176 -0
- package/src/services/now.js +49 -0
- package/src/services/providers.js +158 -0
- package/src/services/redis.js +55 -0
- package/src/services/rest_client.js +112 -0
- package/src/swagger/index.js +668 -0
- package/{lib → src}/utils/api_scaffold.js +26 -39
- package/src/utils/case_converter.js +33 -0
- package/src/utils/crc32.js +44 -0
- package/src/utils/datetime.js +13 -0
- package/src/utils/host.js +39 -0
- package/src/utils/index.js +35 -0
- package/{lib → src}/utils/pagination.js +22 -31
- package/src/utils/random.js +23 -0
- package/{lib → src}/utils/smart_query.js +27 -27
- package/src/utils/test.js +48 -0
- package/src/utils/wrapper.js +8 -0
- package/bin/engine-babel +0 -38
- package/lib/commands/index.js +0 -25
- package/lib/commands/index.js.map +0 -1
- package/lib/commands/interface.js.map +0 -1
- package/lib/commands/make_entity.js +0 -549
- package/lib/commands/make_entity.js.map +0 -1
- package/lib/commands/tramp.js +0 -53
- package/lib/commands/tramp.js.map +0 -1
- package/lib/config/index.js.map +0 -1
- package/lib/di.js.map +0 -1
- package/lib/engine.js +0 -558
- package/lib/engine.js.map +0 -1
- package/lib/entities/index.js.map +0 -1
- package/lib/exceptions/index.js.map +0 -1
- package/lib/index.js +0 -105
- package/lib/index.js.map +0 -1
- package/lib/middlewares/auth.js +0 -97
- package/lib/middlewares/auth.js.map +0 -1
- package/lib/middlewares/auth_kong.js +0 -48
- package/lib/middlewares/auth_kong.js.map +0 -1
- package/lib/middlewares/debug.js +0 -68
- package/lib/middlewares/debug.js.map +0 -1
- package/lib/middlewares/index.js +0 -45
- package/lib/middlewares/index.js.map +0 -1
- package/lib/middlewares/providers.js +0 -102
- package/lib/middlewares/providers.js.map +0 -1
- package/lib/middlewares/session.js +0 -76
- package/lib/middlewares/session.js.map +0 -1
- package/lib/middlewares/trace.js.map +0 -1
- package/lib/middlewares/validator.js +0 -71
- package/lib/middlewares/validator.js.map +0 -1
- package/lib/middlewares/view_cache.js +0 -160
- package/lib/middlewares/view_cache.js.map +0 -1
- package/lib/services/cache.js.map +0 -1
- package/lib/services/config.js +0 -140
- package/lib/services/config.js.map +0 -1
- package/lib/services/env.js +0 -40
- package/lib/services/env.js.map +0 -1
- package/lib/services/event_manager.js +0 -110
- package/lib/services/event_manager.js.map +0 -1
- package/lib/services/http_client.js +0 -178
- package/lib/services/http_client.js.map +0 -1
- package/lib/services/index.js +0 -70
- package/lib/services/index.js.map +0 -1
- package/lib/services/interface.js +0 -12
- package/lib/services/interface.js.map +0 -1
- package/lib/services/joi.js +0 -28
- package/lib/services/joi.js.map +0 -1
- package/lib/services/jwt_token.js +0 -120
- package/lib/services/jwt_token.js.map +0 -1
- package/lib/services/jwt_token_kong.js +0 -111
- package/lib/services/jwt_token_kong.js.map +0 -1
- package/lib/services/logger.js +0 -172
- package/lib/services/logger.js.map +0 -1
- package/lib/services/namespace.js +0 -188
- package/lib/services/namespace.js.map +0 -1
- package/lib/services/now.js +0 -69
- package/lib/services/now.js.map +0 -1
- package/lib/services/providers.js +0 -195
- package/lib/services/providers.js.map +0 -1
- package/lib/services/redis.js +0 -77
- package/lib/services/redis.js.map +0 -1
- package/lib/services/rest_client.js +0 -136
- package/lib/services/rest_client.js.map +0 -1
- package/lib/swagger/index.js +0 -684
- package/lib/swagger/index.js.map +0 -1
- package/lib/utils/api_scaffold.js.map +0 -1
- package/lib/utils/case_converter.js +0 -48
- package/lib/utils/case_converter.js.map +0 -1
- package/lib/utils/crc32.js +0 -22
- package/lib/utils/crc32.js.map +0 -1
- package/lib/utils/datetime.js +0 -21
- package/lib/utils/datetime.js.map +0 -1
- package/lib/utils/host.js +0 -48
- package/lib/utils/host.js.map +0 -1
- package/lib/utils/index.js +0 -61
- package/lib/utils/index.js.map +0 -1
- package/lib/utils/pagination.js.map +0 -1
- package/lib/utils/random.js +0 -33
- package/lib/utils/random.js.map +0 -1
- package/lib/utils/smart_query.js.map +0 -1
- package/lib/utils/test.js +0 -62
- package/lib/utils/test.js.map +0 -1
- package/lib/utils/wrapper.js +0 -9
- package/lib/utils/wrapper.js.map +0 -1
package/lib/config/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/config/index.js"],"names":["app","name","sequelize","logging","logger","file","trace","enable","header","api","namespace","defaultName","cache","prefix","driver","redis","host","port","lazyConnect","db","dialect","database","dialectOptions","multipleStatements","timeout","replication","write","username","password","pool","read","session","cookie","path","httpOnly","secure","maxAge","store","secret","resave","saveUninitialized","token","faker","key","uid","swagger","info","title","description","version","produces","basePath","schemes","securityDefinitions","api_key","type","in","security","paths","definitions"],"mappings":";;;;;kBAAe;AACbA,OAAK;AACHC,UAAM;AADH,GADQ;AAIbC,aAAW;AACTC,aAAS;AADA,GAJE;AAObC,UAAQ;AACNC,UAAM,KADA,CACM;AADN,GAPK;AAUbC,SAAO;AACLC,YAAQ,IADH;AAELC,YAAQ,KAFH;AAGLC,SAAK;AAHA,GAVM;AAebC,aAAW;AACTH,YAAQ,IADC;AAETI,iBAAa;AAFJ,GAfE;AAmBbC,SAAO;AACLC,YAAQ,KADH;AAELC,YAAQ;AAFH,GAnBM;AAuBbC,SAAO;AACLC,UAAM,WADD;AAELC,UAAM,IAFD;AAGLC,iBAAa;AAHR,GAvBM;AA4BbC,MAAI;AACFC,aAAS,OADP;AAEFH,UAAM,IAFJ;AAGFI,cAAU,EAHR;AAIFC,oBAAgB;AACdC,0BAAoB,IADN;AAEdC,eAAS;AAFK,KAJd;AAQFC,iBAAa;AACXC,aAAO;AACLV,cAAM,EADD;AAELW,kBAAU,EAFL;AAGLC,kBAAU,EAHL;AAILC,cAAM;AAJD,OADI;AAOXC,YAAM;AAPK;AARX,GA5BS;AA8CbC,WAAS;AACPC,YAAQ;AACNC,YAAM,GADA;AAENC,gBAAU,KAFJ;AAGNC,cAAQ,KAHF;AAINC,cAAQ,OAAO,IAJT,CAIc;AAJd,KADD;AAOPC,WAAO,IAPA;AAQPC,YAAQ,WARD;AASPC,YAAQ,IATD;AAUPC,uBAAmB;AAVZ,GA9CI;AA0DbC,SAAO;AACL5B,YAAQ,EADH;AAELyB,YAAQ,EAFH;AAGLI,WAAO;AACLnC,cAAQ,KADH;AAELoC,WAAK,KAFA;AAGLC,WAAK;AAHA;AAHF,GA1DM;AAmEbC,WAAS;AACPA,aAAS,KADF;AAEPC,UAAM;AACJC,aAAO,EADH;AAEJC,mBAAa,EAFT;AAGJC,eAAS;AAHL,KAFC;AAOPC,cAAU,CACR,kBADQ,CAPH;AAUPlC,UAAM,EAVC;AAWPmC,cAAU,GAXH;AAYPC,aAAS,CACP,MADO,CAZF;AAePC,yBAAqB;AACnBC,eAAS;AACPC,cAAM,QADC;AAEPtD,cAAM,SAFC;AAGPuD,YAAI;AAHG;AADU,KAfd;AAsBPC,cAAU,CAAC;AACTH,eAAS;AADA,KAAD,CAtBH;AAyBPI,WAAO,EAzBA;AA0BPC,iBAAa;AA1BN;AAnEI,C","file":"index.js","sourcesContent":["export default {\n app: {\n name: 'evaengine'\n },\n sequelize: {\n logging: true\n },\n logger: {\n file: false //set to false to disable file logger\n },\n trace: {\n enable: true,\n header: false,\n api: false\n },\n namespace: {\n enable: true,\n defaultName: 'eva.ns'\n },\n cache: {\n prefix: 'eva',\n driver: 'redis'\n },\n redis: {\n host: '127.0.0.1',\n port: 6379,\n lazyConnect: true\n },\n db: {\n dialect: 'mysql',\n port: 3306,\n database: '',\n dialectOptions: {\n multipleStatements: true,\n timeout: 3\n },\n replication: {\n write: {\n host: '',\n username: '',\n password: '',\n pool: {}\n },\n read: []\n }\n },\n session: {\n cookie: {\n path: '/',\n httpOnly: false,\n secure: false,\n maxAge: 3600 * 1000 //这里单位是ms\n },\n store: null,\n secret: 'evaengine',\n resave: true,\n saveUninitialized: true\n },\n token: {\n prefix: '',\n secret: '',\n faker: {\n enable: false,\n key: 'eva',\n uid: 1\n }\n },\n swagger: {\n swagger: '2.0',\n info: {\n title: '',\n description: '',\n version: ''\n },\n produces: [\n 'application/json'\n ],\n host: '',\n basePath: '/',\n schemes: [\n 'http'\n ],\n securityDefinitions: {\n api_key: {\n type: 'apiKey',\n name: 'api_key',\n in: 'query'\n }\n },\n security: [{\n api_key: []\n }],\n paths: {},\n definitions: {}\n }\n};\n"]}
|
package/lib/di.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/di.js"],"names":["container","constitute","Container","bound","DI","getContainer","getBound","get","service","RuntimeException","bindClass","args","bindValue","bindMethod","reset","registerServiceProviders","providers","engine","providerClass","registerService","ProviderClass","provider","ServiceProvider","name","register","registerMockedProviders","configPath","mockEngine","getMeta"],"mappings":";;;;;;;AAAA;;;;AACA;;AACA;;;;AAEA,IAAIA,YAAY,IAAIC,qBAAWC,SAAf,EAAhB;AACA,IAAIC,QAAQ,EAAZ;;IAEqBC,E,GAAN,MAAMA,EAAN,CAAS;AACtB,SAAOC,YAAP,GAAsB;AACpB,WAAOL,SAAP;AACD;;AAED,SAAOM,QAAP,GAAkB;AAChB,WAAOH,KAAP;AACD;;AAED,SAAOI,GAAP,CAAWC,OAAX,EAAoB;AAClB,QAAI,OAAOA,OAAP,KAAmB,QAAvB,EAAiC;AAC/B,aAAOR,UAAUC,UAAV,CAAqBO,OAArB,CAAP;AACD;;AAED,QAAI,CAACL,MAAMK,OAAN,CAAL,EAAqB;AACnB,YAAM,IAAIC,4BAAJ,CAAsB,WAAUD,OAAQ,gBAAxC,CAAN;AACD;AACD,WAAOR,UAAUC,UAAV,CAAqBE,MAAMK,OAAN,CAArB,CAAP;AACD;;AAED,SAAOE,SAAP,CAAiB,GAAGC,IAApB,EAA0B;AACxB,QAAI,OAAOA,KAAK,CAAL,CAAP,KAAmB,QAAvB,EAAiC;AAC/B,SAAGR,MAAMQ,KAAK,CAAL,CAAN,CAAH,IAAqBA,IAArB;AACD;AACD,WAAOX,UAAUU,SAAV,CAAoB,GAAGC,IAAvB,CAAP;AACD;;AAED,SAAOC,SAAP,CAAiB,GAAGD,IAApB,EAA0B;AACxB,QAAI,OAAOA,KAAK,CAAL,CAAP,KAAmB,QAAvB,EAAiC;AAC/B,SAAGR,MAAMQ,KAAK,CAAL,CAAN,CAAH,IAAqBA,IAArB;AACD;AACD,WAAOX,UAAUY,SAAV,CAAoB,GAAGD,IAAvB,CAAP;AACD;;AAED,SAAOE,UAAP,CAAkB,GAAGF,IAArB,EAA2B;AACzB,QAAI,OAAOA,KAAK,CAAL,CAAP,KAAmB,QAAvB,EAAiC;AAC/B,SAAGR,MAAMQ,KAAK,CAAL,CAAN,CAAH,IAAqBA,IAArB;AACD;AACD,WAAOX,UAAUa,UAAV,CAAqB,GAAGF,IAAxB,CAAP;AACD;;AAED,SAAOG,KAAP,GAAe;AACbd,gBAAY,IAAIC,qBAAWC,SAAf,EAAZ;AACAC,YAAQ,EAAR;AACD;;AAED;;;;AAIA,SAAOY,wBAAP,CAAgCC,YAAY,EAA5C,EAAgDC,MAAhD,EAAwD;AACtD,SAAK,MAAMC,aAAX,IAA4BF,SAA5B,EAAuC;AACrCZ,SAAGe,eAAH,CAAmBD,aAAnB,EAAkCD,MAAlC;AACD;AACF;;AAED;;;;AAIA,SAAOE,eAAP,CAAuBC,aAAvB,EAAsCH,MAAtC,EAA8C;AAC5C,UAAMI,WAAW,IAAID,aAAJ,CAAkBH,MAAlB,CAAjB;AACA,QAAI,EAAEI,oBAAoBC,0BAAtB,CAAJ,EAA4C;AAC1C,YAAM,IAAIb,4BAAJ,CAAsB,kBAAiBY,SAASE,IAAK,uBAArD,CAAN;AACD;AACDF,aAASG,QAAT;AACD;;AAED,SAAOC,uBAAP,CAA+BT,SAA/B,EAA0CU,UAA1C,EAAsD;AACpD,UAAMC,aAAa;AACjBC,eAAS,OAAO;AACdF;AADc,OAAP;AADQ,KAAnB;AAKAtB,OAAGW,wBAAH,CAA4BC,SAA5B,EAAuCW,UAAvC;AACD;AA3EqB,C;kBAAHvB,E","file":"di.js","sourcesContent":["import constitute from 'constitute';\nimport { RuntimeException } from './exceptions';\nimport { ServiceProvider } from './services/providers';\n\nlet container = new constitute.Container();\nlet bound = {};\n\nexport default class DI {\n static getContainer() {\n return container;\n }\n\n static getBound() {\n return bound;\n }\n\n static get(service) {\n if (typeof service !== 'string') {\n return container.constitute(service);\n }\n\n if (!bound[service]) {\n throw new RuntimeException(`Service ${service} not bound yet`);\n }\n return container.constitute(bound[service]);\n }\n\n static bindClass(...args) {\n if (typeof args[0] === 'string') {\n [, bound[args[0]]] = args;\n }\n return container.bindClass(...args);\n }\n\n static bindValue(...args) {\n if (typeof args[0] === 'string') {\n [, bound[args[0]]] = args;\n }\n return container.bindValue(...args);\n }\n\n static bindMethod(...args) {\n if (typeof args[0] === 'string') {\n [, bound[args[0]]] = args;\n }\n return container.bindMethod(...args);\n }\n\n static reset() {\n container = new constitute.Container();\n bound = {};\n }\n\n /**\n * @param {Array} providers\n * @param {EvaEngine} engine\n */\n static registerServiceProviders(providers = [], engine) {\n for (const providerClass of providers) {\n DI.registerService(providerClass, engine);\n }\n }\n\n /**\n * @param {constructor} ProviderClass\n * @param {EvaEngine} engine\n */\n static registerService(ProviderClass, engine) {\n const provider = new ProviderClass(engine);\n if (!(provider instanceof ServiceProvider)) {\n throw new RuntimeException(`Input provider ${provider.name} not service provider`);\n }\n provider.register();\n }\n\n static registerMockedProviders(providers, configPath) {\n const mockEngine = {\n getMeta: () => ({\n configPath\n })\n };\n DI.registerServiceProviders(providers, mockEngine);\n }\n}\n"]}
|
package/lib/engine.js
DELETED
|
@@ -1,558 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = exports.later = exports.yargs = exports.express = exports.DI = exports.MODES = undefined;
|
|
7
|
-
|
|
8
|
-
var _express = require('express');
|
|
9
|
-
|
|
10
|
-
var _express2 = _interopRequireDefault(_express);
|
|
11
|
-
|
|
12
|
-
var _http = require('http');
|
|
13
|
-
|
|
14
|
-
var _http2 = _interopRequireDefault(_http);
|
|
15
|
-
|
|
16
|
-
var _https = require('https');
|
|
17
|
-
|
|
18
|
-
var _https2 = _interopRequireDefault(_https);
|
|
19
|
-
|
|
20
|
-
var _path = require('path');
|
|
21
|
-
|
|
22
|
-
var _path2 = _interopRequireDefault(_path);
|
|
23
|
-
|
|
24
|
-
var _yargs = require('yargs');
|
|
25
|
-
|
|
26
|
-
var _yargs2 = _interopRequireDefault(_yargs);
|
|
27
|
-
|
|
28
|
-
var _later = require('later');
|
|
29
|
-
|
|
30
|
-
var _later2 = _interopRequireDefault(_later);
|
|
31
|
-
|
|
32
|
-
var _momentTimezone = require('moment-timezone');
|
|
33
|
-
|
|
34
|
-
var _momentTimezone2 = _interopRequireDefault(_momentTimezone);
|
|
35
|
-
|
|
36
|
-
var _di = require('./di');
|
|
37
|
-
|
|
38
|
-
var _di2 = _interopRequireDefault(_di);
|
|
39
|
-
|
|
40
|
-
var _providers = require('./services/providers');
|
|
41
|
-
|
|
42
|
-
var ServiceProviders = _interopRequireWildcard(_providers);
|
|
43
|
-
|
|
44
|
-
var _providers2 = require('./middlewares/providers');
|
|
45
|
-
|
|
46
|
-
var MiddlewareProviders = _interopRequireWildcard(_providers2);
|
|
47
|
-
|
|
48
|
-
var _exceptions = require('./exceptions');
|
|
49
|
-
|
|
50
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
51
|
-
|
|
52
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
53
|
-
|
|
54
|
-
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
|
|
55
|
-
|
|
56
|
-
_momentTimezone2.default.tz.setDefault(process.env.TZ ? process.env.TZ : 'Asia/Shanghai');
|
|
57
|
-
|
|
58
|
-
const MODES = exports.MODES = {
|
|
59
|
-
WEB: 'web',
|
|
60
|
-
CLI: 'cli'
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
exports.DI = _di2.default;
|
|
64
|
-
exports.express = _express2.default;
|
|
65
|
-
exports.yargs = _yargs2.default;
|
|
66
|
-
exports.later = _later2.default;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
let app = null;
|
|
70
|
-
|
|
71
|
-
let baseServiceProviders = [ServiceProviders.EnvProvider, ServiceProviders.ConfigProvider, ServiceProviders.LoggerProvider, ServiceProviders.NamespaceProvider, ServiceProviders.NowProvider, ServiceProviders.EventManagerProvider];
|
|
72
|
-
|
|
73
|
-
let serviceProvidersForWeb = [ServiceProviders.RedisProvider, ServiceProviders.CacheProvider, ServiceProviders.HttpClientProvider, ServiceProviders.RestClientProvider, ServiceProviders.ValidatorBaseProvider, ServiceProviders.JsonWebTokenProvider];
|
|
74
|
-
|
|
75
|
-
let middlewareProviders = [MiddlewareProviders.SessionMiddlewareProvider, MiddlewareProviders.AuthMiddlewareProvider, MiddlewareProviders.DebugMiddlewareProvider, MiddlewareProviders.ViewCacheMiddlewareProvider, MiddlewareProviders.ValidatorMiddlewareProvider, MiddlewareProviders.TraceMiddlewareProvider];
|
|
76
|
-
|
|
77
|
-
let serviceProvidersForCLI = [ServiceProviders.CacheProvider, ServiceProviders.HttpClientProvider, ServiceProviders.RestClientProvider, ServiceProviders.RedisProvider];
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* @class EvaEngine
|
|
81
|
-
*/
|
|
82
|
-
let EvaEngine = class EvaEngine {
|
|
83
|
-
/**
|
|
84
|
-
* @param {string} projectRoot
|
|
85
|
-
* @param {string} configPath
|
|
86
|
-
* @param {string} sourceRoot
|
|
87
|
-
* @param {Config} config
|
|
88
|
-
* @param {Logger} logger
|
|
89
|
-
* @param {string} namespace
|
|
90
|
-
* @param {number} port
|
|
91
|
-
* @param {string} mode
|
|
92
|
-
*/
|
|
93
|
-
constructor({
|
|
94
|
-
projectRoot,
|
|
95
|
-
configPath,
|
|
96
|
-
sourceRoot,
|
|
97
|
-
config,
|
|
98
|
-
logger,
|
|
99
|
-
namespace,
|
|
100
|
-
port = 3000
|
|
101
|
-
}, mode = MODES.WEB) {
|
|
102
|
-
this.server = null;
|
|
103
|
-
this.commands = {};
|
|
104
|
-
this.command = null;
|
|
105
|
-
this.commandName = null;
|
|
106
|
-
this.port = (val => {
|
|
107
|
-
const rawPort = parseInt(val, 10);
|
|
108
|
-
if (Number.isNaN(rawPort)) {
|
|
109
|
-
return val;
|
|
110
|
-
}
|
|
111
|
-
if (rawPort >= 0) {
|
|
112
|
-
return rawPort;
|
|
113
|
-
}
|
|
114
|
-
return false;
|
|
115
|
-
})(port);
|
|
116
|
-
this.defaultErrorHandler = null;
|
|
117
|
-
this.serverErrorHandler = null;
|
|
118
|
-
this.uncaughtExceptionHandler = null;
|
|
119
|
-
this.crontabJobHandlers = [];
|
|
120
|
-
|
|
121
|
-
this.meta = {
|
|
122
|
-
mode,
|
|
123
|
-
port: this.port,
|
|
124
|
-
projectRoot: _path2.default.normalize(projectRoot),
|
|
125
|
-
configPath: _path2.default.normalize(configPath || `${projectRoot}/config`),
|
|
126
|
-
sourceRoot: _path2.default.normalize(sourceRoot || `${projectRoot}/src`)
|
|
127
|
-
};
|
|
128
|
-
this.registerServiceProviders(EvaEngine.getBaseServiceProviders());
|
|
129
|
-
this.logger = logger || _di2.default.get('logger');
|
|
130
|
-
this.config = config || _di2.default.get('config');
|
|
131
|
-
this.namespace = namespace || _di2.default.get('namespace');
|
|
132
|
-
this.logger.info('Engine started, Meta:', this.meta);
|
|
133
|
-
this.logger.debug('Engine config files loaded:', this.config.getMergedFiles());
|
|
134
|
-
_later2.default.date.localTime();
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* @returns {{mode: string, port: *, projectRoot, configPath, sourceRoot}|*}
|
|
139
|
-
*/
|
|
140
|
-
getMeta() {
|
|
141
|
-
return this.meta;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* @returns {DI}
|
|
146
|
-
*/
|
|
147
|
-
getDI() {
|
|
148
|
-
return _di2.default;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* @returns {express}
|
|
153
|
-
*/
|
|
154
|
-
static getApp() {
|
|
155
|
-
if (app) {
|
|
156
|
-
return app;
|
|
157
|
-
}
|
|
158
|
-
app = (0, _express2.default)();
|
|
159
|
-
return app;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* @returns {express}
|
|
164
|
-
*/
|
|
165
|
-
static createRouter() {
|
|
166
|
-
return _express2.default.Router(); //eslint-disable-line new-cap
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* @returns {yargs}
|
|
171
|
-
*/
|
|
172
|
-
getCLI(commandNameInput) {
|
|
173
|
-
if (Object.keys(this.commands).length < 1) {
|
|
174
|
-
throw new _exceptions.RuntimeException('No command registered yet');
|
|
175
|
-
}
|
|
176
|
-
this.registerServiceProviders(EvaEngine.getServiceProvidersForCLI());
|
|
177
|
-
this.logger.debug('Bound services', Object.keys(_di2.default.getBound()));
|
|
178
|
-
const [,, commandNameFromArgv] = process.argv;
|
|
179
|
-
|
|
180
|
-
const commandName = commandNameInput || commandNameFromArgv;
|
|
181
|
-
if (!commandName) {
|
|
182
|
-
return _yargs2.default.argv;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
this.commandName = commandName;
|
|
186
|
-
if (!this.commands[commandName]) {
|
|
187
|
-
throw new _exceptions.RuntimeException('Command %s not registered.', commandName);
|
|
188
|
-
}
|
|
189
|
-
const command = this.commands[commandName];
|
|
190
|
-
|
|
191
|
-
if (!{}.hasOwnProperty.call(command, 'getSpec') || !{}.hasOwnProperty.call(command, 'getDescription')) {
|
|
192
|
-
throw new _exceptions.RuntimeException('Command require getSpec and getDescription static method');
|
|
193
|
-
}
|
|
194
|
-
const { argv } = _yargs2.default.command(commandName, command.getDescription(), Object.assign({
|
|
195
|
-
verbose: {
|
|
196
|
-
alias: 'v',
|
|
197
|
-
count: true
|
|
198
|
-
},
|
|
199
|
-
help: {
|
|
200
|
-
alias: '?'
|
|
201
|
-
}
|
|
202
|
-
}, command.getSpec())).help().count('verbose');
|
|
203
|
-
|
|
204
|
-
const { verbose } = argv;
|
|
205
|
-
const levels = ['info', 'verbose', 'debug', 'debug'];
|
|
206
|
-
const level = levels[verbose] ? levels[verbose] : 'info';
|
|
207
|
-
for (const [, transport = {}] of Object.entries(this.logger.getInstance().transports)) {
|
|
208
|
-
transport.level = level;
|
|
209
|
-
}
|
|
210
|
-
return argv;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
static setBaseServiceProviders(providers) {
|
|
214
|
-
baseServiceProviders = providers;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* @returns {[]}
|
|
219
|
-
*/
|
|
220
|
-
static getBaseServiceProviders() {
|
|
221
|
-
return baseServiceProviders;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* @returns []
|
|
226
|
-
*/
|
|
227
|
-
static getServiceProvidersForWeb() {
|
|
228
|
-
return serviceProvidersForWeb;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* @param {Array} providers
|
|
233
|
-
*/
|
|
234
|
-
static setServiceProvidersForWeb(providers) {
|
|
235
|
-
serviceProvidersForWeb = providers;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* @returns []
|
|
240
|
-
*/
|
|
241
|
-
static getMiddlewareProviders() {
|
|
242
|
-
return middlewareProviders;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
static setMiddlewareProviders(providers) {
|
|
246
|
-
middlewareProviders = providers;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* @returns []
|
|
251
|
-
*/
|
|
252
|
-
static getServiceProvidersForCLI() {
|
|
253
|
-
return serviceProvidersForCLI;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
static setServiceProvidersForCLI(providers) {
|
|
257
|
-
serviceProvidersForCLI = providers;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* @param {Array} providers
|
|
262
|
-
*/
|
|
263
|
-
registerServiceProviders(providers = []) {
|
|
264
|
-
return _di2.default.registerServiceProviders(providers, this);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* @param {constructor} ProviderClass
|
|
269
|
-
*/
|
|
270
|
-
registerService(ProviderClass) {
|
|
271
|
-
return _di2.default.registerService(ProviderClass, this);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
/**
|
|
275
|
-
* @param {(Array|Object)}commands
|
|
276
|
-
* @returns {EvaEngine}
|
|
277
|
-
*/
|
|
278
|
-
registerCommands(commands) {
|
|
279
|
-
//TODO: validate command
|
|
280
|
-
const registerCommandClass = commandClasses => {
|
|
281
|
-
Object.keys(commandClasses).forEach(commandClassName => {
|
|
282
|
-
const commandClass = commandClasses[commandClassName];
|
|
283
|
-
this.commands[commandClass.getName()] = commandClass;
|
|
284
|
-
});
|
|
285
|
-
};
|
|
286
|
-
if (Array.isArray(commands)) {
|
|
287
|
-
if (Array.isArray(commands[0])) {
|
|
288
|
-
commands.forEach(commandsPerFile => commandsPerFile.forEach(registerCommandClass));
|
|
289
|
-
} else {
|
|
290
|
-
commands.forEach(registerCommandClass);
|
|
291
|
-
}
|
|
292
|
-
} else {
|
|
293
|
-
registerCommandClass(commands);
|
|
294
|
-
}
|
|
295
|
-
this.logger.debug('Registered commands', Object.keys(this.commands));
|
|
296
|
-
return this;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
getCommand() {
|
|
300
|
-
return this.command;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
getCommands() {
|
|
304
|
-
return this.commands;
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
clearCommands() {
|
|
308
|
-
this.commands = [];
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
clearCrontabs() {
|
|
312
|
-
this.crontabJobHandlers.forEach(handler => {
|
|
313
|
-
clearInterval(handler);
|
|
314
|
-
});
|
|
315
|
-
this.crontabJobHandlers = [];
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* @returns {string}
|
|
320
|
-
*/
|
|
321
|
-
getCommandName() {
|
|
322
|
-
return this.commandName;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* @param {Function} handler
|
|
327
|
-
* @returns {EvaEngine}
|
|
328
|
-
*/
|
|
329
|
-
setDefaultErrorHandler(handler) {
|
|
330
|
-
this.defaultErrorHandler = handler;
|
|
331
|
-
return this;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* @returns {Function}
|
|
336
|
-
*/
|
|
337
|
-
getDefaultErrorHandler() {
|
|
338
|
-
const env = _di2.default.get('env');
|
|
339
|
-
return this.defaultErrorHandler || ((err, req, res, next) => {
|
|
340
|
-
//eslint-disable-line no-unused-vars
|
|
341
|
-
let exception = err;
|
|
342
|
-
if (!(err instanceof Error)) {
|
|
343
|
-
this.logger.error(req.method, req.originalUrl || req.url, '|', exception);
|
|
344
|
-
exception = new _exceptions.RuntimeException('Unknown error').setPrevError(err);
|
|
345
|
-
}
|
|
346
|
-
if (!(exception instanceof _exceptions.StandardException)) {
|
|
347
|
-
exception = new _exceptions.RuntimeException(err);
|
|
348
|
-
}
|
|
349
|
-
if (exception instanceof _exceptions.RuntimeException) {
|
|
350
|
-
//TODO: report to sentry
|
|
351
|
-
//TODO: with req & res
|
|
352
|
-
this.logger.error(req.method, req.originalUrl || req.url, '|', exception);
|
|
353
|
-
} else {
|
|
354
|
-
this.logger.warn(req.method, req.originalUrl || req.url, '|', exception.getImportance() > 0 ? exception : exception.message);
|
|
355
|
-
}
|
|
356
|
-
return res.status(exception.getStatusCode()).json(Object.assign(exception.toJSON(), env.isDevelopment() ? {} : {
|
|
357
|
-
prevError: {},
|
|
358
|
-
filename: '',
|
|
359
|
-
stack: [],
|
|
360
|
-
fullStack: []
|
|
361
|
-
}));
|
|
362
|
-
});
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
/**
|
|
366
|
-
* @param {Function} handler
|
|
367
|
-
* @returns {EvaEngine}
|
|
368
|
-
*/
|
|
369
|
-
setUncaughtExceptionHandler(handler) {
|
|
370
|
-
this.uncaughtExceptionHandler = handler;
|
|
371
|
-
return this;
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* @returns {Function}
|
|
376
|
-
*/
|
|
377
|
-
getUncaughtExceptionHandler() {
|
|
378
|
-
return this.uncaughtExceptionHandler || (err => {
|
|
379
|
-
this.logger.error(err);
|
|
380
|
-
try {
|
|
381
|
-
const killTimer = setTimeout(() => {
|
|
382
|
-
process.exit(1);
|
|
383
|
-
}, 30000);
|
|
384
|
-
killTimer.unref();
|
|
385
|
-
this.server.close();
|
|
386
|
-
} catch (e) {
|
|
387
|
-
this.logger.error('Error when exit', e.stack);
|
|
388
|
-
}
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
/**
|
|
393
|
-
* @param {Function} handler
|
|
394
|
-
* @returns {EvaEngine}
|
|
395
|
-
*/
|
|
396
|
-
setServerErrorHandler(handler) {
|
|
397
|
-
this.serverErrorHandler = handler;
|
|
398
|
-
return this;
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
/**
|
|
402
|
-
* @returns {Function}
|
|
403
|
-
*/
|
|
404
|
-
getServerErrorHandler() {
|
|
405
|
-
return this.serverErrorHandler || (error => {
|
|
406
|
-
this.logger.error(error);
|
|
407
|
-
if (error.syscall !== 'listen') {
|
|
408
|
-
throw error;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
const { port } = this;
|
|
412
|
-
|
|
413
|
-
const bind = typeof port === 'string' ? `Pipe ${port}` : `Port ${port}`;
|
|
414
|
-
|
|
415
|
-
// handle specific listen errors with friendly messages
|
|
416
|
-
switch (error.code) {
|
|
417
|
-
case 'EACCES':
|
|
418
|
-
this.logger.error(bind, 'requires elevated privileges');
|
|
419
|
-
process.exit(1);
|
|
420
|
-
break;
|
|
421
|
-
case 'EADDRINUSE':
|
|
422
|
-
this.logger.error(bind, 'is already in use');
|
|
423
|
-
process.exit(1);
|
|
424
|
-
break;
|
|
425
|
-
default:
|
|
426
|
-
throw error;
|
|
427
|
-
}
|
|
428
|
-
});
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
/**
|
|
432
|
-
* @returns {EvaEngine}
|
|
433
|
-
*/
|
|
434
|
-
bootstrap() {
|
|
435
|
-
this.registerServiceProviders(EvaEngine.getServiceProvidersForWeb());
|
|
436
|
-
this.registerServiceProviders(EvaEngine.getMiddlewareProviders());
|
|
437
|
-
this.logger.info('Engine bootstrapped under env', _di2.default.get('env').get());
|
|
438
|
-
this.logger.debug('Bound services', Object.keys(_di2.default.getBound()));
|
|
439
|
-
return this;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
use(...args) {
|
|
443
|
-
return EvaEngine.getApp().use(...args);
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
/**
|
|
447
|
-
* @returns {EvaEngine}
|
|
448
|
-
*/
|
|
449
|
-
run(port) {
|
|
450
|
-
process.on('uncaughtException', this.getUncaughtExceptionHandler());
|
|
451
|
-
EvaEngine.getApp().set('port', port || this.port);
|
|
452
|
-
EvaEngine.getApp().use(this.getDefaultErrorHandler());
|
|
453
|
-
this.server = _http2.default.createServer(EvaEngine.getApp());
|
|
454
|
-
this.server.listen(port || this.port);
|
|
455
|
-
this.server.on('error', this.getServerErrorHandler());
|
|
456
|
-
this.logger.info('Engine running http server by listening', this.port);
|
|
457
|
-
return this;
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
/**
|
|
461
|
-
* @returns {EvaEngine}
|
|
462
|
-
*/
|
|
463
|
-
runHttps(port, options = {}) {
|
|
464
|
-
process.on('uncaughtException', this.getUncaughtExceptionHandler());
|
|
465
|
-
EvaEngine.getApp().set('port', port || this.port);
|
|
466
|
-
EvaEngine.getApp().use(this.getDefaultErrorHandler());
|
|
467
|
-
this.server = _https2.default.createServer(options, EvaEngine.getApp());
|
|
468
|
-
this.server.listen(port || this.port);
|
|
469
|
-
this.server.on('error', this.getServerErrorHandler());
|
|
470
|
-
this.logger.info('Engine running http server by listening', this.port);
|
|
471
|
-
return this;
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
getServer() {
|
|
475
|
-
return this.server;
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
static getVersion() {
|
|
479
|
-
return require(`${__dirname}/../package.json`).version; //eslint-disable-line
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
runCLI(inputCommandName) {
|
|
483
|
-
var _this = this;
|
|
484
|
-
|
|
485
|
-
return _asyncToGenerator(function* () {
|
|
486
|
-
const argv = _this.getCLI(inputCommandName);
|
|
487
|
-
const commandName = _this.getCommandName();
|
|
488
|
-
if (!commandName) {
|
|
489
|
-
_this.logger.info('Available commands:');
|
|
490
|
-
Object.entries(_this.commands).forEach(function ([name, commandClass]) {
|
|
491
|
-
_this.logger.info('-', `${name} `.padEnd(30, '-'), commandClass.getDescription());
|
|
492
|
-
});
|
|
493
|
-
return;
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
_this.logger.debug('Start run command', commandName);
|
|
497
|
-
_this.logger.debug('Received arguments', argv);
|
|
498
|
-
const CommandClass = _this.commands[commandName];
|
|
499
|
-
_this.command = new CommandClass(argv);
|
|
500
|
-
yield _this.command.run();
|
|
501
|
-
_this.logger.debug('CLI run finished');
|
|
502
|
-
})();
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
/**
|
|
506
|
-
* @param {String} sequence
|
|
507
|
-
* @param {String} commandString
|
|
508
|
-
* @param {Boolean} useSeconds
|
|
509
|
-
*/
|
|
510
|
-
runCrontab(sequence, commandString, useSeconds = false) {
|
|
511
|
-
var _this2 = this;
|
|
512
|
-
|
|
513
|
-
if (Object.keys(this.commands).length < 1) {
|
|
514
|
-
throw new _exceptions.RuntimeException('No command registered yet');
|
|
515
|
-
}
|
|
516
|
-
this.registerServiceProviders(EvaEngine.getServiceProvidersForCLI());
|
|
517
|
-
this.logger.debug('Bound services', Object.keys(_di2.default.getBound()));
|
|
518
|
-
this.logger.info('Cron job using %s Timezone', _later2.default.date.isUTC ? 'UTC' : 'Local');
|
|
519
|
-
const [commandName, ...options] = commandString.split(' ');
|
|
520
|
-
if (Object.keys(this.commands).includes(commandName) === false) {
|
|
521
|
-
throw new _exceptions.RuntimeException(`Command ${commandName} not registered`);
|
|
522
|
-
}
|
|
523
|
-
const { argv } = (0, _yargs2.default)(options ? options.join(' ') : '');
|
|
524
|
-
const command = new this.commands[commandName](argv);
|
|
525
|
-
|
|
526
|
-
let i = 1;
|
|
527
|
-
const schedule = _later2.default.parse.cron(sequence, useSeconds);
|
|
528
|
-
const handler = _later2.default.setInterval(_asyncToGenerator(function* () {
|
|
529
|
-
_this2.logger.info('Cron job [%s] | Round %d | started with params %j', commandName, i, argv);
|
|
530
|
-
//Let job crash if any exception happen
|
|
531
|
-
yield command.run();
|
|
532
|
-
_this2.logger.info('Cron job [%s] | Round %d | finished', commandName, i);
|
|
533
|
-
i += 1;
|
|
534
|
-
}), schedule); //第二个参数为True表示支持秒
|
|
535
|
-
this.logger.info('Cron job [%s] with sequence [%s] registered as %j', commandString, sequence, schedule);
|
|
536
|
-
this.crontabJobHandlers.push(handler);
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
/**
|
|
540
|
-
* @param commandString
|
|
541
|
-
* @returns {Promise.<EvaEngine|Promise|*>}
|
|
542
|
-
*/
|
|
543
|
-
runCommand(commandString) {
|
|
544
|
-
var _this3 = this;
|
|
545
|
-
|
|
546
|
-
return _asyncToGenerator(function* () {
|
|
547
|
-
const [commandName, ...options] = commandString.split(' ');
|
|
548
|
-
if (Object.keys(_this3.commands).includes(commandName) === false) {
|
|
549
|
-
throw new _exceptions.RuntimeException(`Command ${commandName} not registered`);
|
|
550
|
-
}
|
|
551
|
-
const { argv } = (0, _yargs2.default)(options ? options.join(' ') : '');
|
|
552
|
-
const command = new _this3.commands[commandName](argv);
|
|
553
|
-
return command.run();
|
|
554
|
-
})();
|
|
555
|
-
}
|
|
556
|
-
};
|
|
557
|
-
exports.default = EvaEngine;
|
|
558
|
-
//# sourceMappingURL=engine.js.map
|
package/lib/engine.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine.js"],"names":["ServiceProviders","MiddlewareProviders","moment","tz","setDefault","process","env","TZ","MODES","WEB","CLI","DI","express","yargs","later","app","baseServiceProviders","EnvProvider","ConfigProvider","LoggerProvider","NamespaceProvider","NowProvider","EventManagerProvider","serviceProvidersForWeb","RedisProvider","CacheProvider","HttpClientProvider","RestClientProvider","ValidatorBaseProvider","JsonWebTokenProvider","middlewareProviders","SessionMiddlewareProvider","AuthMiddlewareProvider","DebugMiddlewareProvider","ViewCacheMiddlewareProvider","ValidatorMiddlewareProvider","TraceMiddlewareProvider","serviceProvidersForCLI","EvaEngine","constructor","projectRoot","configPath","sourceRoot","config","logger","namespace","port","mode","server","commands","command","commandName","val","rawPort","parseInt","Number","isNaN","defaultErrorHandler","serverErrorHandler","uncaughtExceptionHandler","crontabJobHandlers","meta","path","normalize","registerServiceProviders","getBaseServiceProviders","get","info","debug","getMergedFiles","date","localTime","getMeta","getDI","getApp","createRouter","Router","getCLI","commandNameInput","Object","keys","length","RuntimeException","getServiceProvidersForCLI","getBound","commandNameFromArgv","argv","hasOwnProperty","call","getDescription","assign","verbose","alias","count","help","getSpec","levels","level","transport","entries","getInstance","transports","setBaseServiceProviders","providers","getServiceProvidersForWeb","setServiceProvidersForWeb","getMiddlewareProviders","setMiddlewareProviders","setServiceProvidersForCLI","registerService","ProviderClass","registerCommands","registerCommandClass","commandClasses","forEach","commandClassName","commandClass","getName","Array","isArray","commandsPerFile","getCommand","getCommands","clearCommands","clearCrontabs","handler","clearInterval","getCommandName","setDefaultErrorHandler","getDefaultErrorHandler","err","req","res","next","exception","Error","error","method","originalUrl","url","setPrevError","StandardException","warn","getImportance","message","status","getStatusCode","json","toJSON","isDevelopment","prevError","filename","stack","fullStack","setUncaughtExceptionHandler","getUncaughtExceptionHandler","killTimer","setTimeout","exit","unref","close","e","setServerErrorHandler","getServerErrorHandler","syscall","bind","code","bootstrap","use","args","run","on","set","http","createServer","listen","runHttps","options","https","getServer","getVersion","require","__dirname","version","runCLI","inputCommandName","name","padEnd","CommandClass","runCrontab","sequence","commandString","useSeconds","isUTC","split","includes","join","i","schedule","parse","cron","setInterval","push","runCommand"],"mappings":"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","file":"engine.js","sourcesContent":["import express from 'express';\nimport http from 'http';\nimport https from 'https';\nimport path from 'path';\nimport yargs from 'yargs';\nimport later from 'later';\nimport moment from 'moment-timezone';\nimport DI from './di';\nimport * as ServiceProviders from './services/providers';\nimport * as MiddlewareProviders from './middlewares/providers';\nimport { StandardException, RuntimeException } from './exceptions';\n\nmoment.tz.setDefault(process.env.TZ ? process.env.TZ : 'Asia/Shanghai');\n\nexport const MODES = {\n WEB: 'web',\n CLI: 'cli'\n};\n\nexport {\n DI,\n express,\n yargs,\n later\n};\n\nlet app = null;\n\nlet baseServiceProviders = [\n ServiceProviders.EnvProvider,\n ServiceProviders.ConfigProvider,\n ServiceProviders.LoggerProvider,\n ServiceProviders.NamespaceProvider,\n ServiceProviders.NowProvider,\n ServiceProviders.EventManagerProvider\n];\n\nlet serviceProvidersForWeb = [\n ServiceProviders.RedisProvider,\n ServiceProviders.CacheProvider,\n ServiceProviders.HttpClientProvider,\n ServiceProviders.RestClientProvider,\n ServiceProviders.ValidatorBaseProvider,\n ServiceProviders.JsonWebTokenProvider\n];\n\nlet middlewareProviders = [\n MiddlewareProviders.SessionMiddlewareProvider,\n MiddlewareProviders.AuthMiddlewareProvider,\n MiddlewareProviders.DebugMiddlewareProvider,\n MiddlewareProviders.ViewCacheMiddlewareProvider,\n MiddlewareProviders.ValidatorMiddlewareProvider,\n MiddlewareProviders.TraceMiddlewareProvider\n];\n\nlet serviceProvidersForCLI = [\n ServiceProviders.CacheProvider,\n ServiceProviders.HttpClientProvider,\n ServiceProviders.RestClientProvider,\n ServiceProviders.RedisProvider\n];\n\n/**\n * @class EvaEngine\n */\nexport default class EvaEngine {\n /**\n * @param {string} projectRoot\n * @param {string} configPath\n * @param {string} sourceRoot\n * @param {Config} config\n * @param {Logger} logger\n * @param {string} namespace\n * @param {number} port\n * @param {string} mode\n */\n constructor({\n projectRoot,\n configPath,\n sourceRoot,\n config,\n logger,\n namespace,\n port = 3000\n }, mode = MODES.WEB) {\n this.server = null;\n this.commands = {};\n this.command = null;\n this.commandName = null;\n this.port = ((val) => {\n const rawPort = parseInt(val, 10);\n if (Number.isNaN(rawPort)) {\n return val;\n }\n if (rawPort >= 0) {\n return rawPort;\n }\n return false;\n })(port);\n this.defaultErrorHandler = null;\n this.serverErrorHandler = null;\n this.uncaughtExceptionHandler = null;\n this.crontabJobHandlers = [];\n\n this.meta = {\n mode,\n port: this.port,\n projectRoot: path.normalize(projectRoot),\n configPath: path.normalize(configPath || `${projectRoot}/config`),\n sourceRoot: path.normalize(sourceRoot || `${projectRoot}/src`)\n };\n this.registerServiceProviders(EvaEngine.getBaseServiceProviders());\n this.logger = logger || DI.get('logger');\n this.config = config || DI.get('config');\n this.namespace = namespace || DI.get('namespace');\n this.logger.info('Engine started, Meta:', this.meta);\n this.logger.debug('Engine config files loaded:', this.config.getMergedFiles());\n later.date.localTime();\n }\n\n /**\n * @returns {{mode: string, port: *, projectRoot, configPath, sourceRoot}|*}\n */\n getMeta() {\n return this.meta;\n }\n\n /**\n * @returns {DI}\n */\n getDI() {\n return DI;\n }\n\n /**\n * @returns {express}\n */\n static getApp() {\n if (app) {\n return app;\n }\n app = express();\n return app;\n }\n\n /**\n * @returns {express}\n */\n static createRouter() {\n return express.Router(); //eslint-disable-line new-cap\n }\n\n /**\n * @returns {yargs}\n */\n getCLI(commandNameInput) {\n if (Object.keys(this.commands).length < 1) {\n throw new RuntimeException('No command registered yet');\n }\n this.registerServiceProviders(EvaEngine.getServiceProvidersForCLI());\n this.logger.debug('Bound services', Object.keys(DI.getBound()));\n const [, , commandNameFromArgv] = process.argv;\n\n const commandName = commandNameInput || commandNameFromArgv;\n if (!commandName) {\n return yargs.argv;\n }\n\n this.commandName = commandName;\n if (!this.commands[commandName]) {\n throw new RuntimeException('Command %s not registered.', commandName);\n }\n const command = this.commands[commandName];\n\n if (!{}.hasOwnProperty.call(command, 'getSpec')\n || !{}.hasOwnProperty.call(command, 'getDescription')) {\n throw new RuntimeException('Command require getSpec and getDescription static method');\n }\n const { argv } = yargs\n .command(commandName, command.getDescription(), Object.assign({\n verbose: {\n alias: 'v',\n count: true\n },\n help: {\n alias: '?'\n }\n }, command.getSpec()))\n .help()\n .count('verbose');\n\n\n const { verbose } = argv;\n const levels = ['info', 'verbose', 'debug', 'debug'];\n const level = levels[verbose] ? levels[verbose] : 'info';\n for (const [, transport = {}] of Object.entries(this.logger.getInstance().transports)) {\n transport.level = level;\n }\n return argv;\n }\n\n static setBaseServiceProviders(providers) {\n baseServiceProviders = providers;\n }\n\n /**\n * @returns {[]}\n */\n static getBaseServiceProviders() {\n return baseServiceProviders;\n }\n\n\n /**\n * @returns []\n */\n static getServiceProvidersForWeb() {\n return serviceProvidersForWeb;\n }\n\n /**\n * @param {Array} providers\n */\n static setServiceProvidersForWeb(providers) {\n serviceProvidersForWeb = providers;\n }\n\n /**\n * @returns []\n */\n static getMiddlewareProviders() {\n return middlewareProviders;\n }\n\n static setMiddlewareProviders(providers) {\n middlewareProviders = providers;\n }\n\n /**\n * @returns []\n */\n static getServiceProvidersForCLI() {\n return serviceProvidersForCLI;\n }\n\n static setServiceProvidersForCLI(providers) {\n serviceProvidersForCLI = providers;\n }\n\n /**\n * @param {Array} providers\n */\n registerServiceProviders(providers = []) {\n return DI.registerServiceProviders(providers, this);\n }\n\n /**\n * @param {constructor} ProviderClass\n */\n registerService(ProviderClass) {\n return DI.registerService(ProviderClass, this);\n }\n\n /**\n * @param {(Array|Object)}commands\n * @returns {EvaEngine}\n */\n registerCommands(commands) {\n //TODO: validate command\n const registerCommandClass = (commandClasses) => {\n Object.keys(commandClasses).forEach((commandClassName) => {\n const commandClass = commandClasses[commandClassName];\n this.commands[commandClass.getName()] = commandClass;\n });\n };\n if (Array.isArray(commands)) {\n if (Array.isArray(commands[0])) {\n commands.forEach(commandsPerFile => commandsPerFile.forEach(registerCommandClass));\n } else {\n commands.forEach(registerCommandClass);\n }\n } else {\n registerCommandClass(commands);\n }\n this.logger.debug('Registered commands', Object.keys(this.commands));\n return this;\n }\n\n getCommand() {\n return this.command;\n }\n\n getCommands() {\n return this.commands;\n }\n\n clearCommands() {\n this.commands = [];\n }\n\n clearCrontabs() {\n this.crontabJobHandlers.forEach((handler) => {\n clearInterval(handler);\n });\n this.crontabJobHandlers = [];\n }\n\n\n /**\n * @returns {string}\n */\n getCommandName() {\n return this.commandName;\n }\n\n /**\n * @param {Function} handler\n * @returns {EvaEngine}\n */\n setDefaultErrorHandler(handler) {\n this.defaultErrorHandler = handler;\n return this;\n }\n\n /**\n * @returns {Function}\n */\n getDefaultErrorHandler() {\n const env = DI.get('env');\n return this.defaultErrorHandler ||\n ((err, req, res, next) => { //eslint-disable-line no-unused-vars\n let exception = err;\n if (!(err instanceof Error)) {\n this.logger.error(req.method, req.originalUrl || req.url, '|', exception);\n exception = (new RuntimeException('Unknown error')).setPrevError(err);\n }\n if (!(exception instanceof StandardException)) {\n exception = new RuntimeException(err);\n }\n if (exception instanceof RuntimeException) {\n //TODO: report to sentry\n //TODO: with req & res\n this.logger.error(req.method, req.originalUrl || req.url, '|', exception);\n } else {\n this.logger.warn(\n req.method, req.originalUrl || req.url, '|',\n exception.getImportance() > 0 ? exception : exception.message\n );\n }\n return res\n .status(exception.getStatusCode())\n .json(Object.assign(\n exception.toJSON(),\n env.isDevelopment()\n ? {} : {\n prevError: {},\n filename: '',\n stack: [],\n fullStack: []\n }\n ));\n });\n }\n\n /**\n * @param {Function} handler\n * @returns {EvaEngine}\n */\n setUncaughtExceptionHandler(handler) {\n this.uncaughtExceptionHandler = handler;\n return this;\n }\n\n /**\n * @returns {Function}\n */\n getUncaughtExceptionHandler() {\n return this.uncaughtExceptionHandler ||\n ((err) => {\n this.logger.error(err);\n try {\n const killTimer = setTimeout(() => {\n process.exit(1);\n }, 30000);\n killTimer.unref();\n this.server.close();\n } catch (e) {\n this.logger.error('Error when exit', e.stack);\n }\n });\n }\n\n /**\n * @param {Function} handler\n * @returns {EvaEngine}\n */\n setServerErrorHandler(handler) {\n this.serverErrorHandler = handler;\n return this;\n }\n\n /**\n * @returns {Function}\n */\n getServerErrorHandler() {\n return this.serverErrorHandler ||\n ((error) => {\n this.logger.error(error);\n if (error.syscall !== 'listen') {\n throw error;\n }\n\n const { port } = this;\n\n const bind = typeof port === 'string'\n ? `Pipe ${port}`\n : `Port ${port}`;\n\n // handle specific listen errors with friendly messages\n switch (error.code) {\n case 'EACCES':\n this.logger.error(bind, 'requires elevated privileges');\n process.exit(1);\n break;\n case 'EADDRINUSE':\n this.logger.error(bind, 'is already in use');\n process.exit(1);\n break;\n default:\n throw error;\n }\n });\n }\n\n /**\n * @returns {EvaEngine}\n */\n bootstrap() {\n this.registerServiceProviders(EvaEngine.getServiceProvidersForWeb());\n this.registerServiceProviders(EvaEngine.getMiddlewareProviders());\n this.logger.info('Engine bootstrapped under env', DI.get('env').get());\n this.logger.debug('Bound services', Object.keys(DI.getBound()));\n return this;\n }\n\n use(...args) {\n return EvaEngine.getApp().use(...args);\n }\n\n /**\n * @returns {EvaEngine}\n */\n run(port) {\n process.on('uncaughtException', this.getUncaughtExceptionHandler());\n EvaEngine.getApp().set('port', port || this.port);\n EvaEngine.getApp().use(this.getDefaultErrorHandler());\n this.server = http.createServer(EvaEngine.getApp());\n this.server.listen(port || this.port);\n this.server.on('error', this.getServerErrorHandler());\n this.logger.info('Engine running http server by listening', this.port);\n return this;\n }\n\n /**\n * @returns {EvaEngine}\n */\n runHttps(port, options = {}) {\n process.on('uncaughtException', this.getUncaughtExceptionHandler());\n EvaEngine.getApp().set('port', port || this.port);\n EvaEngine.getApp().use(this.getDefaultErrorHandler());\n this.server = https.createServer(options, EvaEngine.getApp());\n this.server.listen(port || this.port);\n this.server.on('error', this.getServerErrorHandler());\n this.logger.info('Engine running http server by listening', this.port);\n return this;\n }\n\n getServer() {\n return this.server;\n }\n\n static getVersion() {\n return require(`${__dirname}/../package.json`).version; //eslint-disable-line\n }\n\n async runCLI(inputCommandName) {\n const argv = this.getCLI(inputCommandName);\n const commandName = this.getCommandName();\n if (!commandName) {\n this.logger.info('Available commands:');\n Object.entries(this.commands).forEach(([name, commandClass]) => {\n this.logger.info('-', (`${name} `).padEnd(30, '-'), commandClass.getDescription());\n });\n return;\n }\n\n this.logger.debug('Start run command', commandName);\n this.logger.debug('Received arguments', argv);\n const CommandClass = this.commands[commandName];\n this.command = new CommandClass(argv);\n await this.command.run();\n this.logger.debug('CLI run finished');\n }\n\n /**\n * @param {String} sequence\n * @param {String} commandString\n * @param {Boolean} useSeconds\n */\n runCrontab(sequence, commandString, useSeconds = false) {\n if (Object.keys(this.commands).length < 1) {\n throw new RuntimeException('No command registered yet');\n }\n this.registerServiceProviders(EvaEngine.getServiceProvidersForCLI());\n this.logger.debug('Bound services', Object.keys(DI.getBound()));\n this.logger.info('Cron job using %s Timezone', later.date.isUTC ? 'UTC' : 'Local');\n const [commandName, ...options] = commandString.split(' ');\n if (Object.keys(this.commands).includes(commandName) === false) {\n throw new RuntimeException(`Command ${commandName} not registered`);\n }\n const { argv } = yargs(options ? options.join(' ') : '');\n const command = new this.commands[commandName](argv);\n\n let i = 1;\n const schedule = later.parse.cron(sequence, useSeconds);\n const handler = later.setInterval(async() => {\n this.logger.info('Cron job [%s] | Round %d | started with params %j', commandName, i, argv);\n //Let job crash if any exception happen\n await command.run();\n this.logger.info('Cron job [%s] | Round %d | finished', commandName, i);\n i += 1;\n }, schedule); //第二个参数为True表示支持秒\n this.logger.info('Cron job [%s] with sequence [%s] registered as %j', commandString, sequence, schedule);\n this.crontabJobHandlers.push(handler);\n }\n\n /**\n * @param commandString\n * @returns {Promise.<EvaEngine|Promise|*>}\n */\n async runCommand(commandString) {\n const [commandName, ...options] = commandString.split(' ');\n if (Object.keys(this.commands).includes(commandName) === false) {\n throw new RuntimeException(`Command ${commandName} not registered`);\n }\n const { argv } = yargs(options ? options.join(' ') : '');\n const command = new this.commands[commandName](argv);\n return command.run();\n }\n}\n"]}
|