evaengine 1.0.14 → 2.0.0

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.
Files changed (199) hide show
  1. package/README.md +15 -1
  2. package/bin/engine +2 -31
  3. package/dist/bin.d.ts +1 -0
  4. package/dist/bin.js +40 -0
  5. package/dist/bin.js.map +1 -0
  6. package/{src/commands/index.js → dist/commands/index.d.ts} +1 -8
  7. package/dist/commands/index.js +6 -0
  8. package/dist/commands/index.js.map +1 -0
  9. package/dist/commands/interface.d.ts +18 -0
  10. package/dist/commands/interface.js +40 -0
  11. package/dist/commands/interface.js.map +1 -0
  12. package/dist/commands/make_entity.d.ts +47 -0
  13. package/dist/commands/make_entity.js +410 -0
  14. package/dist/commands/make_entity.js.map +1 -0
  15. package/dist/commands/tramp.d.ts +7 -0
  16. package/dist/commands/tramp.js +29 -0
  17. package/dist/commands/tramp.js.map +1 -0
  18. package/dist/config/index.d.ts +92 -0
  19. package/dist/config/index.js +96 -0
  20. package/dist/config/index.js.map +1 -0
  21. package/dist/di.d.ts +73 -0
  22. package/dist/di.js +76 -0
  23. package/dist/di.js.map +1 -0
  24. package/dist/engine.d.ts +85 -0
  25. package/dist/engine.js +404 -0
  26. package/dist/engine.js.map +1 -0
  27. package/dist/entities/index.d.ts +54 -0
  28. package/dist/entities/index.js +228 -0
  29. package/dist/entities/index.js.map +1 -0
  30. package/dist/exceptions/index.d.ts +153 -0
  31. package/dist/exceptions/index.js +439 -0
  32. package/dist/exceptions/index.js.map +1 -0
  33. package/dist/index.d.ts +45 -0
  34. package/dist/index.js +45 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/middlewares/auth.d.ts +5 -0
  37. package/dist/middlewares/auth.js +63 -0
  38. package/dist/middlewares/auth.js.map +1 -0
  39. package/dist/middlewares/auth_kong.d.ts +2 -0
  40. package/dist/middlewares/auth_kong.js +24 -0
  41. package/dist/middlewares/auth_kong.js.map +1 -0
  42. package/dist/middlewares/debug.d.ts +3 -0
  43. package/dist/middlewares/debug.js +50 -0
  44. package/dist/middlewares/debug.js.map +1 -0
  45. package/{src/middlewares/index.js → dist/middlewares/index.d.ts} +1 -11
  46. package/dist/middlewares/index.js +9 -0
  47. package/dist/middlewares/index.js.map +1 -0
  48. package/dist/middlewares/providers.d.ts +25 -0
  49. package/dist/middlewares/providers.js +63 -0
  50. package/dist/middlewares/providers.js.map +1 -0
  51. package/dist/middlewares/session.d.ts +6 -0
  52. package/dist/middlewares/session.js +51 -0
  53. package/dist/middlewares/session.js.map +1 -0
  54. package/dist/middlewares/trace.d.ts +52 -0
  55. package/dist/middlewares/trace.js +225 -0
  56. package/dist/middlewares/trace.js.map +1 -0
  57. package/dist/middlewares/validator.d.ts +10 -0
  58. package/dist/middlewares/validator.js +43 -0
  59. package/dist/middlewares/validator.js.map +1 -0
  60. package/dist/middlewares/view_cache.d.ts +14 -0
  61. package/dist/middlewares/view_cache.js +102 -0
  62. package/dist/middlewares/view_cache.js.map +1 -0
  63. package/dist/services/cache.d.ts +66 -0
  64. package/dist/services/cache.js +207 -0
  65. package/dist/services/cache.js.map +1 -0
  66. package/dist/services/config.d.ts +25 -0
  67. package/dist/services/config.js +88 -0
  68. package/dist/services/config.js.map +1 -0
  69. package/dist/services/env.d.ts +12 -0
  70. package/dist/services/env.js +24 -0
  71. package/dist/services/env.js.map +1 -0
  72. package/dist/services/event_manager.d.ts +29 -0
  73. package/dist/services/event_manager.js +75 -0
  74. package/dist/services/event_manager.js.map +1 -0
  75. package/dist/services/http_client.d.ts +66 -0
  76. package/dist/services/http_client.js +62 -0
  77. package/dist/services/http_client.js.map +1 -0
  78. package/{src/services/index.js → dist/services/index.d.ts} +1 -15
  79. package/dist/services/index.js +14 -0
  80. package/dist/services/index.js.map +1 -0
  81. package/{src/services/interface.js → dist/services/interface.d.ts} +1 -3
  82. package/dist/services/interface.js +6 -0
  83. package/dist/services/interface.js.map +1 -0
  84. package/{src/services/joi.js → dist/services/joi.d.ts} +2 -9
  85. package/dist/services/joi.js +11 -0
  86. package/dist/services/joi.js.map +1 -0
  87. package/dist/services/jwt_token.d.ts +24 -0
  88. package/dist/services/jwt_token.js +77 -0
  89. package/dist/services/jwt_token.js.map +1 -0
  90. package/dist/services/jwt_token_kong.d.ts +25 -0
  91. package/dist/services/jwt_token_kong.js +65 -0
  92. package/dist/services/jwt_token_kong.js.map +1 -0
  93. package/dist/services/logger.d.ts +30 -0
  94. package/dist/services/logger.js +126 -0
  95. package/dist/services/logger.js.map +1 -0
  96. package/dist/services/namespace.d.ts +55 -0
  97. package/dist/services/namespace.js +157 -0
  98. package/dist/services/namespace.js.map +1 -0
  99. package/dist/services/now.d.ts +14 -0
  100. package/dist/services/now.js +43 -0
  101. package/dist/services/now.js.map +1 -0
  102. package/dist/services/providers.d.ts +55 -0
  103. package/dist/services/providers.js +134 -0
  104. package/dist/services/providers.js.map +1 -0
  105. package/dist/services/redis.d.ts +18 -0
  106. package/dist/services/redis.js +53 -0
  107. package/dist/services/redis.js.map +1 -0
  108. package/dist/services/rest_client.d.ts +48 -0
  109. package/dist/services/rest_client.js +96 -0
  110. package/dist/services/rest_client.js.map +1 -0
  111. package/dist/swagger/index.d.ts +223 -0
  112. package/dist/swagger/index.js +564 -0
  113. package/dist/swagger/index.js.map +1 -0
  114. package/dist/types/express.d.ts +14 -0
  115. package/dist/types/vendor.d.ts +102 -0
  116. package/dist/utils/api_scaffold.d.ts +74 -0
  117. package/dist/utils/api_scaffold.js +220 -0
  118. package/dist/utils/api_scaffold.js.map +1 -0
  119. package/dist/utils/case_converter.d.ts +7 -0
  120. package/dist/utils/case_converter.js +29 -0
  121. package/dist/utils/case_converter.js.map +1 -0
  122. package/dist/utils/crc32.d.ts +2 -0
  123. package/dist/utils/crc32.js +43 -0
  124. package/dist/utils/crc32.js.map +1 -0
  125. package/dist/utils/cron.d.ts +27 -0
  126. package/dist/utils/cron.js +186 -0
  127. package/dist/utils/cron.js.map +1 -0
  128. package/dist/utils/datetime.d.ts +4 -0
  129. package/dist/utils/datetime.js +6 -0
  130. package/dist/utils/datetime.js.map +1 -0
  131. package/dist/utils/host.d.ts +18 -0
  132. package/dist/utils/host.js +33 -0
  133. package/dist/utils/host.js.map +1 -0
  134. package/{src/utils/index.js → dist/utils/index.d.ts} +2 -26
  135. package/dist/utils/index.js +12 -0
  136. package/dist/utils/index.js.map +1 -0
  137. package/dist/utils/pagination.d.ts +150 -0
  138. package/dist/utils/pagination.js +242 -0
  139. package/dist/utils/pagination.js.map +1 -0
  140. package/dist/utils/random.d.ts +3 -0
  141. package/dist/utils/random.js +18 -0
  142. package/dist/utils/random.js.map +1 -0
  143. package/dist/utils/request_client.d.ts +33 -0
  144. package/dist/utils/request_client.js +153 -0
  145. package/dist/utils/request_client.js.map +1 -0
  146. package/dist/utils/smart_query.d.ts +144 -0
  147. package/dist/utils/smart_query.js +310 -0
  148. package/dist/utils/smart_query.js.map +1 -0
  149. package/dist/utils/test.d.ts +14 -0
  150. package/dist/utils/test.js +37 -0
  151. package/dist/utils/test.js.map +1 -0
  152. package/dist/utils/wrapper.d.ts +3 -0
  153. package/dist/utils/wrapper.js +5 -0
  154. package/dist/utils/wrapper.js.map +1 -0
  155. package/package.json +24 -10
  156. package/index.js +0 -2
  157. package/src/commands/interface.js +0 -45
  158. package/src/commands/make_entity.js +0 -490
  159. package/src/commands/tramp.js +0 -34
  160. package/src/config/index.js +0 -95
  161. package/src/di.js +0 -96
  162. package/src/engine.js +0 -556
  163. package/src/entities/index.js +0 -272
  164. package/src/exceptions/index.js +0 -501
  165. package/src/index.js +0 -55
  166. package/src/middlewares/auth.js +0 -67
  167. package/src/middlewares/auth_kong.js +0 -28
  168. package/src/middlewares/debug.js +0 -88
  169. package/src/middlewares/providers.js +0 -73
  170. package/src/middlewares/session.js +0 -63
  171. package/src/middlewares/trace.js +0 -254
  172. package/src/middlewares/validator.js +0 -50
  173. package/src/middlewares/view_cache.js +0 -127
  174. package/src/services/cache.js +0 -223
  175. package/src/services/config.js +0 -115
  176. package/src/services/env.js +0 -28
  177. package/src/services/event_manager.js +0 -84
  178. package/src/services/http_client.js +0 -69
  179. package/src/services/jwt_token.js +0 -89
  180. package/src/services/jwt_token_kong.js +0 -75
  181. package/src/services/logger.js +0 -150
  182. package/src/services/namespace.js +0 -176
  183. package/src/services/now.js +0 -49
  184. package/src/services/providers.js +0 -158
  185. package/src/services/redis.js +0 -63
  186. package/src/services/rest_client.js +0 -112
  187. package/src/swagger/index.js +0 -665
  188. package/src/utils/api_scaffold.js +0 -240
  189. package/src/utils/case_converter.js +0 -33
  190. package/src/utils/crc32.js +0 -44
  191. package/src/utils/cron.js +0 -208
  192. package/src/utils/datetime.js +0 -13
  193. package/src/utils/host.js +0 -39
  194. package/src/utils/pagination.js +0 -260
  195. package/src/utils/random.js +0 -23
  196. package/src/utils/request_client.js +0 -179
  197. package/src/utils/smart_query.js +0 -352
  198. package/src/utils/test.js +0 -48
  199. package/src/utils/wrapper.js +0 -8
package/src/engine.js DELETED
@@ -1,556 +0,0 @@
1
- import express from 'express';
2
- import http from 'http';
3
- import https from 'https';
4
- import path from 'path';
5
- import yargs from 'yargs/yargs';
6
- import moment from 'moment-timezone';
7
- import packageJson from '../package.json' with { type: 'json' };
8
- import DI from './di.js';
9
- import * as ServiceProviders from './services/providers.js';
10
- import * as MiddlewareProviders from './middlewares/providers.js';
11
- import { StandardException, RuntimeException } from './exceptions/index.js';
12
- import { parseCron, setCronInterval } from './utils/cron.js';
13
-
14
- moment.tz.setDefault(process.env.TZ ? process.env.TZ : 'Asia/Shanghai');
15
-
16
- export const MODES = {
17
- WEB: 'web',
18
- CLI: 'cli'
19
- };
20
-
21
- export {
22
- DI,
23
- express,
24
- yargs
25
- };
26
-
27
- let app = null;
28
-
29
- let baseServiceProviders = [
30
- ServiceProviders.EnvProvider,
31
- ServiceProviders.ConfigProvider,
32
- ServiceProviders.LoggerProvider,
33
- ServiceProviders.NamespaceProvider,
34
- ServiceProviders.NowProvider,
35
- ServiceProviders.EventManagerProvider
36
- ];
37
-
38
- let serviceProvidersForWeb = [
39
- ServiceProviders.RedisProvider,
40
- ServiceProviders.CacheProvider,
41
- ServiceProviders.HttpClientProvider,
42
- ServiceProviders.RestClientProvider,
43
- ServiceProviders.ValidatorBaseProvider,
44
- ServiceProviders.JsonWebTokenProvider
45
- ];
46
-
47
- let middlewareProviders = [
48
- MiddlewareProviders.SessionMiddlewareProvider,
49
- MiddlewareProviders.AuthMiddlewareProvider,
50
- MiddlewareProviders.DebugMiddlewareProvider,
51
- MiddlewareProviders.ViewCacheMiddlewareProvider,
52
- MiddlewareProviders.ValidatorMiddlewareProvider,
53
- MiddlewareProviders.TraceMiddlewareProvider
54
- ];
55
-
56
- let serviceProvidersForCLI = [
57
- ServiceProviders.CacheProvider,
58
- ServiceProviders.HttpClientProvider,
59
- ServiceProviders.RestClientProvider,
60
- ServiceProviders.RedisProvider
61
- ];
62
-
63
- /**
64
- * @class EvaEngine
65
- */
66
- export default class EvaEngine {
67
- /**
68
- * @param {string} projectRoot
69
- * @param {string} configPath
70
- * @param {string} sourceRoot
71
- * @param {Config} config
72
- * @param {Logger} logger
73
- * @param {string} namespace
74
- * @param {number} port
75
- * @param {string} mode
76
- */
77
- constructor({
78
- projectRoot,
79
- configPath,
80
- sourceRoot,
81
- config,
82
- logger,
83
- namespace,
84
- port = 3000
85
- }, mode = MODES.WEB) {
86
- this.server = null;
87
- this.commands = {};
88
- this.command = null;
89
- this.commandName = null;
90
- this.port = ((val) => {
91
- const rawPort = parseInt(val, 10);
92
- if (Number.isNaN(rawPort)) {
93
- return val;
94
- }
95
- if (rawPort >= 0) {
96
- return rawPort;
97
- }
98
- return false;
99
- })(port);
100
- this.defaultErrorHandler = null;
101
- this.serverErrorHandler = null;
102
- this.uncaughtExceptionHandler = null;
103
- this.crontabJobHandlers = [];
104
-
105
- this.meta = {
106
- mode,
107
- port: this.port,
108
- projectRoot: path.normalize(projectRoot),
109
- configPath: path.normalize(configPath || `${projectRoot}/config`),
110
- sourceRoot: path.normalize(sourceRoot || `${projectRoot}/src`)
111
- };
112
- this.registerServiceProviders(EvaEngine.getBaseServiceProviders());
113
- this.logger = logger || DI.get('logger');
114
- this.config = config || DI.get('config');
115
- this.namespace = namespace || DI.get('namespace');
116
- this.logger.info('Engine started, Meta: %j', this.meta);
117
- this.logger.debug('Engine config files loaded: %j', this.config.getMergedFiles());
118
- }
119
-
120
- /**
121
- * @returns {{mode: string, port: *, projectRoot, configPath, sourceRoot}|*}
122
- */
123
- getMeta() {
124
- return this.meta;
125
- }
126
-
127
- /**
128
- * @returns {DI}
129
- */
130
- getDI() {
131
- return DI;
132
- }
133
-
134
- /**
135
- * @returns {express}
136
- */
137
- static getApp() {
138
- if (app) {
139
- return app;
140
- }
141
- app = express();
142
- return app;
143
- }
144
-
145
- /**
146
- * @returns {express}
147
- */
148
- static createRouter() {
149
- return express.Router();
150
- }
151
-
152
- /**
153
- * @returns {yargs}
154
- */
155
- getCLI(commandNameInput) {
156
- if (Object.keys(this.commands).length < 1) {
157
- throw new RuntimeException('No command registered yet');
158
- }
159
- this.registerServiceProviders(EvaEngine.getServiceProvidersForCLI());
160
- this.logger.debug('Bound services %j', Object.keys(DI.getBound()));
161
- const [, , commandNameFromArgv] = process.argv;
162
-
163
- const commandName = commandNameInput || commandNameFromArgv;
164
- if (!commandName) {
165
- return yargs(process.argv.slice(2)).argv;
166
- }
167
-
168
- this.commandName = commandName;
169
- if (!this.commands[commandName]) {
170
- throw new RuntimeException('Command %s not registered.', commandName);
171
- }
172
- const command = this.commands[commandName];
173
-
174
- if (!{}.hasOwnProperty.call(command, 'getSpec')
175
- || !{}.hasOwnProperty.call(command, 'getDescription')) {
176
- throw new RuntimeException('Command require getSpec and getDescription static method');
177
- }
178
- const { argv } = yargs(process.argv.slice(2))
179
- .command(commandName, command.getDescription(), Object.assign({
180
- verbose: {
181
- alias: 'v',
182
- count: true
183
- },
184
- help: {
185
- alias: '?'
186
- }
187
- }, command.getSpec()))
188
- .help()
189
- .count('verbose');
190
-
191
-
192
- const { verbose } = argv;
193
- const levels = ['info', 'verbose', 'debug', 'debug'];
194
- const level = levels[verbose] ? levels[verbose] : 'info';
195
- for (const [, transport = {}] of Object.entries(this.logger.getInstance().transports)) {
196
- transport.level = level;
197
- }
198
- return argv;
199
- }
200
-
201
- static setBaseServiceProviders(providers) {
202
- baseServiceProviders = providers;
203
- }
204
-
205
- /**
206
- * @returns {[]}
207
- */
208
- static getBaseServiceProviders() {
209
- return baseServiceProviders;
210
- }
211
-
212
-
213
- /**
214
- * @returns []
215
- */
216
- static getServiceProvidersForWeb() {
217
- return serviceProvidersForWeb;
218
- }
219
-
220
- /**
221
- * @param {Array} providers
222
- */
223
- static setServiceProvidersForWeb(providers) {
224
- serviceProvidersForWeb = providers;
225
- }
226
-
227
- /**
228
- * @returns []
229
- */
230
- static getMiddlewareProviders() {
231
- return middlewareProviders;
232
- }
233
-
234
- static setMiddlewareProviders(providers) {
235
- middlewareProviders = providers;
236
- }
237
-
238
- /**
239
- * @returns []
240
- */
241
- static getServiceProvidersForCLI() {
242
- return serviceProvidersForCLI;
243
- }
244
-
245
- static setServiceProvidersForCLI(providers) {
246
- serviceProvidersForCLI = providers;
247
- }
248
-
249
- /**
250
- * @param {Array} providers
251
- */
252
- registerServiceProviders(providers = []) {
253
- return DI.registerServiceProviders(providers, this);
254
- }
255
-
256
- /**
257
- * @param {constructor} ProviderClass
258
- */
259
- registerService(ProviderClass) {
260
- return DI.registerService(ProviderClass, this);
261
- }
262
-
263
- /**
264
- * @param {(Array|Object)}commands
265
- * @returns {EvaEngine}
266
- */
267
- registerCommands(commands) {
268
- //TODO: validate command
269
- const registerCommandClass = (commandClasses) => {
270
- Object.keys(commandClasses).forEach((commandClassName) => {
271
- const commandClass = commandClasses[commandClassName];
272
- this.commands[commandClass.getName()] = commandClass;
273
- });
274
- };
275
- if (Array.isArray(commands)) {
276
- if (Array.isArray(commands[0])) {
277
- commands.forEach(commandsPerFile => commandsPerFile.forEach(registerCommandClass));
278
- } else {
279
- commands.forEach(registerCommandClass);
280
- }
281
- } else {
282
- registerCommandClass(commands);
283
- }
284
- this.logger.debug('Registered commands %j', Object.keys(this.commands));
285
- return this;
286
- }
287
-
288
- getCommand() {
289
- return this.command;
290
- }
291
-
292
- getCommands() {
293
- return this.commands;
294
- }
295
-
296
- clearCommands() {
297
- this.commands = {};
298
- }
299
-
300
- clearCrontabs() {
301
- this.crontabJobHandlers.forEach((handler) => {
302
- if (handler && typeof handler.clear === 'function') {
303
- handler.clear();
304
- } else {
305
- clearInterval(handler);
306
- }
307
- });
308
- this.crontabJobHandlers = [];
309
- }
310
-
311
-
312
- /**
313
- * @returns {string}
314
- */
315
- getCommandName() {
316
- return this.commandName;
317
- }
318
-
319
- /**
320
- * @param {Function} handler
321
- * @returns {EvaEngine}
322
- */
323
- setDefaultErrorHandler(handler) {
324
- this.defaultErrorHandler = handler;
325
- return this;
326
- }
327
-
328
- /**
329
- * @returns {Function}
330
- */
331
- getDefaultErrorHandler() {
332
- const env = DI.get('env');
333
- return this.defaultErrorHandler ||
334
- ((err, req, res, next) => { //eslint-disable-line no-unused-vars
335
- let exception = err;
336
- if (!(err instanceof Error)) {
337
- this.logger.error('%s %s | %o', req.method, req.originalUrl || req.url, exception);
338
- exception = (new RuntimeException('Unknown error')).setPrevError(err);
339
- }
340
- if (!(exception instanceof StandardException)) {
341
- exception = new RuntimeException(err);
342
- }
343
- if (exception instanceof RuntimeException) {
344
- //TODO: report to sentry
345
- //TODO: with req & res
346
- this.logger.error('%s %s | %o', req.method, req.originalUrl || req.url, exception);
347
- } else {
348
- this.logger.warn(
349
- '%s %s | %o',
350
- req.method,
351
- req.originalUrl || req.url,
352
- exception.getImportance() > 0 ? exception : exception.message
353
- );
354
- }
355
- return res
356
- .status(exception.getStatusCode())
357
- .json(Object.assign(
358
- exception.toJSON(),
359
- env.isDevelopment()
360
- ? {} : {
361
- prevError: {},
362
- filename: '',
363
- stack: [],
364
- fullStack: []
365
- }
366
- ));
367
- });
368
- }
369
-
370
- /**
371
- * @param {Function} handler
372
- * @returns {EvaEngine}
373
- */
374
- setUncaughtExceptionHandler(handler) {
375
- this.uncaughtExceptionHandler = handler;
376
- return this;
377
- }
378
-
379
- /**
380
- * @returns {Function}
381
- */
382
- getUncaughtExceptionHandler() {
383
- return this.uncaughtExceptionHandler ||
384
- ((err) => {
385
- this.logger.error(err);
386
- try {
387
- const killTimer = setTimeout(() => {
388
- process.exit(1);
389
- }, 30000);
390
- killTimer.unref();
391
- this.server.close();
392
- } catch (e) {
393
- this.logger.error('Error when exit %s', e.stack);
394
- }
395
- });
396
- }
397
-
398
- /**
399
- * @param {Function} handler
400
- * @returns {EvaEngine}
401
- */
402
- setServerErrorHandler(handler) {
403
- this.serverErrorHandler = handler;
404
- return this;
405
- }
406
-
407
- /**
408
- * @returns {Function}
409
- */
410
- getServerErrorHandler() {
411
- return this.serverErrorHandler ||
412
- ((error) => {
413
- this.logger.error(error);
414
- if (error.syscall !== 'listen') {
415
- throw error;
416
- }
417
-
418
- const { port } = this;
419
-
420
- const bind = typeof port === 'string'
421
- ? `Pipe ${port}`
422
- : `Port ${port}`;
423
-
424
- // handle specific listen errors with friendly messages
425
- switch (error.code) {
426
- case 'EACCES':
427
- this.logger.error('%s requires elevated privileges', bind);
428
- process.exit(1);
429
- break;
430
- case 'EADDRINUSE':
431
- this.logger.error('%s is already in use', bind);
432
- process.exit(1);
433
- break;
434
- default:
435
- throw error;
436
- }
437
- });
438
- }
439
-
440
- /**
441
- * @returns {EvaEngine}
442
- */
443
- bootstrap() {
444
- this.registerServiceProviders(EvaEngine.getServiceProvidersForWeb());
445
- this.registerServiceProviders(EvaEngine.getMiddlewareProviders());
446
- this.logger.info('Engine bootstrapped under env %s', DI.get('env').get());
447
- this.logger.debug('Bound services %j', Object.keys(DI.getBound()));
448
- return this;
449
- }
450
-
451
- use(...args) {
452
- return EvaEngine.getApp().use(...args);
453
- }
454
-
455
- /**
456
- * @returns {EvaEngine}
457
- */
458
- run(port) {
459
- process.on('uncaughtException', this.getUncaughtExceptionHandler());
460
- EvaEngine.getApp().set('port', port || this.port);
461
- EvaEngine.getApp().use(this.getDefaultErrorHandler());
462
- this.server = http.createServer(EvaEngine.getApp());
463
- this.server.listen(port || this.port);
464
- this.server.on('error', this.getServerErrorHandler());
465
- this.logger.info('Engine running http server by listening on %s', this.port);
466
- return this;
467
- }
468
-
469
- /**
470
- * @returns {EvaEngine}
471
- */
472
- runHttps(port, options = {}) {
473
- process.on('uncaughtException', this.getUncaughtExceptionHandler());
474
- EvaEngine.getApp().set('port', port || this.port);
475
- EvaEngine.getApp().use(this.getDefaultErrorHandler());
476
- this.server = https.createServer(options, EvaEngine.getApp());
477
- this.server.listen(port || this.port);
478
- this.server.on('error', this.getServerErrorHandler());
479
- this.logger.info('Engine running http server by listening on %s', this.port);
480
- return this;
481
- }
482
-
483
- getServer() {
484
- return this.server;
485
- }
486
-
487
- static getVersion() {
488
- return packageJson.version;
489
- }
490
-
491
- async runCLI(inputCommandName) {
492
- const argv = this.getCLI(inputCommandName);
493
- const commandName = this.getCommandName();
494
- if (!commandName) {
495
- this.logger.info('Available commands:');
496
- Object.entries(this.commands).forEach(([name, commandClass]) => {
497
- this.logger.info(`- ${(`${name} `).padEnd(30, '-')} ${commandClass.getDescription()}`);
498
- });
499
- return;
500
- }
501
-
502
- this.logger.debug('Start run command %s', commandName);
503
- this.logger.debug('Received arguments %j', argv);
504
- const CommandClass = this.commands[commandName];
505
- this.command = new CommandClass(argv);
506
- await this.command.run();
507
- this.logger.debug('CLI run finished');
508
- }
509
-
510
- /**
511
- * @param {String} sequence
512
- * @param {String} commandString
513
- * @param {Boolean} useSeconds
514
- */
515
- runCrontab(sequence, commandString, useSeconds = false) {
516
- if (Object.keys(this.commands).length < 1) {
517
- throw new RuntimeException('No command registered yet');
518
- }
519
- this.registerServiceProviders(EvaEngine.getServiceProvidersForCLI());
520
- this.logger.debug('Bound services %j', Object.keys(DI.getBound()));
521
- //Cron jobs run in local time, matching the previous later.date.localTime() default
522
- this.logger.info('Cron job using %s Timezone', 'Local');
523
- const [commandName, ...options] = commandString.split(' ');
524
- if (Object.keys(this.commands).includes(commandName) === false) {
525
- throw new RuntimeException(`Command ${commandName} not registered`);
526
- }
527
- const { argv } = yargs(options);
528
- const command = new this.commands[commandName](argv);
529
-
530
- let i = 1;
531
- const schedule = parseCron(sequence, useSeconds);
532
- const handler = setCronInterval(async() => {
533
- this.logger.info('Cron job [%s] | Round %d | started with params %j', commandName, i, argv);
534
- //Let job crash if any exception happen
535
- await command.run();
536
- this.logger.info('Cron job [%s] | Round %d | finished', commandName, i);
537
- i += 1;
538
- }, schedule); //useSeconds 为 True 时启用秒级字段
539
- this.logger.info('Cron job [%s] with sequence [%s] registered as %j', commandString, sequence, schedule);
540
- this.crontabJobHandlers.push(handler);
541
- }
542
-
543
- /**
544
- * @param commandString
545
- * @returns {Promise.<EvaEngine|Promise|*>}
546
- */
547
- async runCommand(commandString) {
548
- const [commandName, ...options] = commandString.split(' ');
549
- if (Object.keys(this.commands).includes(commandName) === false) {
550
- throw new RuntimeException(`Command ${commandName} not registered`);
551
- }
552
- const { argv } = yargs(options);
553
- const command = new this.commands[commandName](argv);
554
- return command.run();
555
- }
556
- }