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
@@ -1,88 +0,0 @@
1
- import morgan from 'morgan';
2
- import os from 'os';
3
- import constitute from 'constitute';
4
- import Logger from '../services/logger.js';
5
-
6
- /**
7
- Log format:
8
- NCSA Combined Log Format + extended fields
9
-
10
- Nginx config as below
11
-
12
- log_format upstream '$http_x_forwarded_for - $remote_user [$time_local] '
13
- '"$request" $status $body_bytes_sent '
14
- '"$http_referer" "$http_user_agent" '
15
- '"$remote_addr" $host $request_time $upstream_response_time $scheme $server_port '
16
- '$hostname $upstream_addr $http_x_device_id $sent_http_x_uid $sent_http_x_token '
17
- '$sent_http_x_service_name $sent_http_x_b3_spanid $sent_http_x_b3_traceid '
18
- '$sent_http_x_b3_parentspanid $sent_http_x_b3_sampled';
19
- */
20
-
21
- morgan.token(
22
- 'host',
23
- req =>
24
- req.headers.host
25
- );
26
-
27
- morgan.token(
28
- 'real-ip',
29
- req =>
30
- req.headers['x-real-ip'] ||
31
- req.headers['x-forwarded-for'] ||
32
- req.ip ||
33
- (req.connection && req.connection.remoteAddress)
34
- );
35
-
36
- morgan.token(
37
- 'port',
38
- req =>
39
- (req.headers.host && req.headers.host.split(':')[1]) || -1
40
- );
41
-
42
- const hostname = os.hostname();
43
- morgan.token('hostname', () => hostname);
44
-
45
- morgan.token(
46
- 'tokens',
47
- (req, res) =>
48
- [
49
- res.getHeader('X-Uid') || '-',
50
- res.getHeader('X-Token') || '-'
51
- ].join(' ')
52
- );
53
-
54
- morgan.token(
55
- 'tracer',
56
- (req, res) =>
57
- [
58
- res.getHeader('X-Service-Name') || '-',
59
- res.getHeader('X-B3-SpanId') || '-',
60
- res.getHeader('X-B3-TraceId') || '-',
61
- res.getHeader('X-B3-ParentSpanId') || '-',
62
- res.getHeader('X-B3-Sampled') || '-'
63
- ].join(' ')
64
- );
65
-
66
-
67
- /**
68
- * @param logger {Logger}
69
- * @returns {function()}
70
- * @constructor
71
- */
72
- function DebugMiddleware(logger) {
73
- return () =>
74
- morgan(
75
- ':real-ip - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent" ' +
76
- '":remote-addr" :host :response-time - :http-version :port :hostname - :tokens :tracer %s',
77
- {
78
- stream: {
79
- write: (message) => {
80
- logger.info(message);
81
- }
82
- }
83
- }
84
- );
85
- }
86
-
87
- constitute.Dependencies(Logger)(DebugMiddleware);
88
- export default DebugMiddleware;
@@ -1,73 +0,0 @@
1
- import SessionMiddleware from '../middlewares/session.js';
2
- import AuthMiddleware from '../middlewares/auth.js';
3
- import AuthKongMiddleware from '../middlewares/auth_kong.js';
4
- import DebugMiddleware from '../middlewares/debug.js';
5
- import TraceMiddleware from '../middlewares/trace.js';
6
- import ViewCacheMiddleware from '../middlewares/view_cache.js';
7
- import ValidatorMiddleware from '../middlewares/validator.js';
8
- import DI from '../di.js';
9
- import { ServiceProvider } from '../services/providers.js';
10
-
11
- export class SessionMiddlewareProvider extends ServiceProvider {
12
- get name() {
13
- return 'session';
14
- }
15
-
16
- register() {
17
- DI.bindMethod(this.name, SessionMiddleware);
18
- }
19
- }
20
-
21
- export class AuthMiddlewareProvider extends ServiceProvider {
22
- get name() {
23
- return 'auth';
24
- }
25
-
26
- register() {
27
- if (DI.get('config').get('token.provider') === 'kong') {
28
- DI.bindMethod(this.name, AuthKongMiddleware);
29
- } else {
30
- DI.bindMethod(this.name, AuthMiddleware);
31
- }
32
- }
33
- }
34
-
35
- export class DebugMiddlewareProvider extends ServiceProvider {
36
- get name() {
37
- return 'debug';
38
- }
39
-
40
- register() {
41
- DI.bindMethod(this.name, DebugMiddleware);
42
- }
43
- }
44
-
45
- export class ViewCacheMiddlewareProvider extends ServiceProvider {
46
- get name() {
47
- return 'view_cache';
48
- }
49
-
50
- register() {
51
- DI.bindMethod(this.name, ViewCacheMiddleware);
52
- }
53
- }
54
-
55
- export class TraceMiddlewareProvider extends ServiceProvider {
56
- get name() {
57
- return 'trace';
58
- }
59
-
60
- register() {
61
- DI.bindMethod(this.name, TraceMiddleware);
62
- }
63
- }
64
-
65
- export class ValidatorMiddlewareProvider extends ServiceProvider {
66
- get name() {
67
- return 'validator';
68
- }
69
-
70
- register() {
71
- DI.bindMethod(this.name, ValidatorMiddleware);
72
- }
73
- }
@@ -1,63 +0,0 @@
1
- import session from 'express-session';
2
- import { RedisStore } from 'connect-redis';
3
- import constitute from 'constitute';
4
- import DI from '../di.js';
5
- import Config from '../services/config.js';
6
- import Redis from '../services/redis.js';
7
- import Namespace from '../services/namespace.js';
8
-
9
- let middleware = null;
10
-
11
- //Fix issue https://github.com/othiym23/node-continuation-local-storage/issues/29
12
- const clsifyMiddleware = (fn, ns) =>
13
- (req, res, next) =>
14
- fn.call(this, req, res, ns.bind(next));
15
-
16
- /**
17
- * @param _config {Config}
18
- * @param redis {Redis}
19
- * @param namespace {Namespace}
20
- * @returns {function()}
21
- * @constructor
22
- */
23
- function SessionMiddleware(_config, redis, namespace) {
24
- return () => {
25
- if (middleware) {
26
- return middleware;
27
- }
28
- const Store = RedisStore;
29
- let store = null;
30
- const config = _config.get().session;
31
-
32
- if (config.store) {
33
- const RedisClient = new Store(Object.assign({}, config.store, {
34
- client: config.store.client || redis.getInstance()
35
- }));
36
- RedisClient.client.on('error', (err) => {
37
- try {
38
- DI.get('logger').error('Session Redis store error:', err);
39
- } catch {
40
- console.error('Session Redis store error:', err);
41
- }
42
- });
43
- store = RedisClient;
44
- } else {
45
- store = new Store(Object.assign({}, { client: redis.getInstance() }));
46
- }
47
-
48
- middleware = session({
49
- store,
50
- cookie: Object.assign({}, _config.get().cookie),
51
- secret: config.secret,
52
- resave: config.resave,
53
- saveUninitialized: config.saveUninitialized
54
- });
55
-
56
- return namespace.isEnabled() ?
57
- clsifyMiddleware(middleware, namespace.use().getContext()) :
58
- middleware;
59
- };
60
- }
61
- constitute.Dependencies(Config, Redis, Namespace)(SessionMiddleware);
62
-
63
- export default SessionMiddleware;
@@ -1,254 +0,0 @@
1
- import constitute from 'constitute';
2
- import { randomString, getHostFullUrl, getHostPort, getHostIp, getMicroTimestamp } from '../utils/index.js';
3
- import Namespace from '../services/namespace.js';
4
- import Config from '../services/config.js';
5
- import Logger from '../services/logger.js';
6
- import HttpClient from '../services/http_client.js';
7
-
8
- const hostIp = getHostIp();
9
-
10
- /**
11
- * Execute a listener when a response is about to write headers.
12
- * Inlined from the on-headers package (MIT), limited to the behavior trace middleware needs.
13
- * @param {object} res
14
- * @param {function} listener
15
- */
16
- const onHeaders = (res, listener) => {
17
- if (!res) {
18
- throw new TypeError('argument res is required');
19
- }
20
- if (typeof listener !== 'function') {
21
- throw new TypeError('argument listener must be a function');
22
- }
23
-
24
- const prevWriteHead = res.writeHead;
25
- let fired = false;
26
-
27
- res.writeHead = function writeHead() {
28
- if (!fired) {
29
- fired = true;
30
- listener.call(this);
31
- }
32
- return prevWriteHead.apply(this, arguments);
33
- };
34
- };
35
-
36
- export const tracerToZipkins = (tracer) => {
37
- if (!tracer) {
38
- return false;
39
- }
40
- const {
41
- url,
42
- method,
43
- serviceName,
44
- spanId: id,
45
- traceId,
46
- parentId,
47
- timestamp,
48
- duration,
49
- statusCode,
50
- port,
51
- queries
52
- } = tracer;
53
-
54
- const name = `${statusCode} ${method} ${url}`;
55
- const endpoint = {
56
- serviceName,
57
- ipv4: hostIp,
58
- port
59
- };
60
- const zipkin = {
61
- id,
62
- traceId,
63
- name,
64
- timestamp,
65
- duration,
66
- annotations: [
67
- {
68
- endpoint,
69
- timestamp,
70
- value: 'sr'
71
- },
72
- {
73
- endpoint,
74
- timestamp: timestamp + duration,
75
- value: 'ss'
76
- }
77
- ],
78
- binaryAnnotations: [
79
- {
80
- key: 'traceId',
81
- value: traceId
82
- },
83
- {
84
- key: 'spanId',
85
- value: id
86
- },
87
- {
88
- key: 'method',
89
- value: method
90
- },
91
- {
92
- key: 'url',
93
- value: url
94
- },
95
- {
96
- key: 'port',
97
- value: port.toString()
98
- },
99
- {
100
- key: 'statusCode',
101
- value: statusCode.toString()
102
- }
103
- ]
104
- };
105
-
106
- if (parentId) {
107
- zipkin.parentId = parentId;
108
- }
109
-
110
- const zipkins = [zipkin];
111
- if (queries && queries.length > 0) {
112
- queries.forEach((element) => {
113
- const { query, cost, finishedAt } = element;
114
- zipkins.push({
115
- id: randomString(),
116
- parentId: id,
117
- traceId,
118
- name: 'sequelize',
119
- timestamp: finishedAt - cost,
120
- duration: cost,
121
- annotations: [
122
- {
123
- endpoint,
124
- timestamp: finishedAt - cost,
125
- value: 'cs'
126
- },
127
- {
128
- endpoint,
129
- timestamp: finishedAt,
130
- value: 'cr'
131
- }
132
- ],
133
- binaryAnnotations: [{
134
- key: 'query',
135
- value: query
136
- }]
137
- });
138
- });
139
- }
140
- return zipkins;
141
- };
142
-
143
-
144
- function TraceMiddleware(ns, config, logger, client) {
145
- const enabled = config.get('trace.enable');
146
- return name => (req, res, next) => {
147
- const spanId = randomString();
148
- const traceId = req.get('X-B3-TraceId') || spanId;
149
- const parentId = req.get('X-B3-SpanId') || '';
150
- const startedAt = process.hrtime();
151
- const timestamp = getMicroTimestamp();
152
- const serviceName = name || config.get('app.name');
153
- //目前默认全部采样
154
- let sampled = enabled ? 1 : 0;
155
- //只有service为第二级, 且通过参数关闭时才禁止采样
156
- if (sampled && parseInt(req.get('X-B3-Sampled'), 10) < 1 && parentId > 0) {
157
- sampled = 0;
158
- }
159
- const tracer = {
160
- serviceName,
161
- method: req.method,
162
- url: getHostFullUrl(req),
163
- port: getHostPort(req),
164
- spanId,
165
- traceId,
166
- parentId,
167
- sampled,
168
- timestamp,
169
- duration: null,
170
- statusCode: null,
171
- queries: [],
172
- debug: {}
173
- };
174
-
175
- res.set({
176
- 'X-Service-Name': serviceName,
177
- 'X-Requested-At': timestamp,
178
- 'X-B3-SpanId': spanId,
179
- 'X-B3-TraceId': traceId,
180
- 'X-B3-ParentSpanId': parentId,
181
- 'X-B3-Sampled': sampled
182
- });
183
-
184
- if (sampled < 1) {
185
- onHeaders(res, () => {
186
- const [seconds, nanoseconds] = process.hrtime(startedAt);
187
- const duration = ((seconds * 1e3) + (nanoseconds * 1e-6));
188
- res.set('X-Response-Milliseconds', parseInt(duration, 10));
189
- });
190
- next();
191
- return;
192
- }
193
-
194
- onHeaders(res, () => {
195
- const [seconds, nanoseconds] = process.hrtime(startedAt);
196
- const duration = ((seconds * 1e3) + (nanoseconds * 1e-6)) * 1000;
197
- tracer.duration = parseInt(duration, 10);
198
- tracer.statusCode = res.statusCode;
199
- res.set('X-Response-Milliseconds', tracer.duration / 1000);
200
-
201
- const useHeader = config.get('trace.header');
202
- if (!useHeader) {
203
- return;
204
- }
205
- const zipkins = tracerToZipkins(tracer);
206
- if (!zipkins) {
207
- logger.warn('Tracer not send by no data for request %s', spanId);
208
- } else {
209
- res.set(`X-Debug-${spanId}`, JSON.stringify(zipkins));
210
- }
211
-
212
- if (Object.keys(tracer.debug).length > 0) {
213
- Object.entries(tracer.debug).forEach(([key, value]) => {
214
- res.set(key.replace('x-debug', 'X-Debug'), value);
215
- });
216
- }
217
- });
218
-
219
- const recordZipkin = () => {
220
- const api = config.get('trace.api');
221
- if (!api) {
222
- return;
223
- }
224
- logger.debug('Tracer prepare to send for request %s', spanId);
225
- const zipkins = tracerToZipkins(ns.get('tracer'));
226
- if (!zipkins) {
227
- logger.warn('Tracer not send by no data for request %s', spanId);
228
- return;
229
- }
230
- client.request({
231
- url: api,
232
- method: 'POST',
233
- json: zipkins
234
- }).catch((e) => {
235
- logger.error('Error happened on sending tracing data: %o', e);
236
- });
237
- };
238
-
239
- res.on('finish', recordZipkin);
240
- res.on('error', recordZipkin);
241
-
242
- ns.bindEmitter(req);
243
- ns.bindEmitter(res);
244
- ns.run(() => {
245
- // logger.debug('Tracer settled for request %s, tracer: %j', spanId, tracer);
246
- ns.set('tracer', tracer);
247
- next();
248
- });
249
- };
250
- }
251
-
252
- constitute.Dependencies(Namespace, Config, Logger, HttpClient)(TraceMiddleware);
253
-
254
- export default TraceMiddleware;
@@ -1,50 +0,0 @@
1
- import Joi from 'joi';
2
- import constitute from 'constitute';
3
- import wrapper from '../utils/wrapper.js';
4
- import { FormInvalidateException } from '../exceptions/index.js';
5
- import ValidatorBase from '../services/joi.js';
6
-
7
- const validate = (data, schema, options) => {
8
- const validationOptions = Object.assign(
9
- { abortEarly: false, allowUnknown: true },
10
- options
11
- );
12
- if (schema && typeof schema.validateAsync === 'function') {
13
- return schema.validateAsync(data, validationOptions);
14
- }
15
- return new Promise((resolve, reject) => {
16
- Joi.validate(data, schema, validationOptions, (err, value) => {
17
- if (err) reject(err);
18
- else resolve(value);
19
- });
20
- });
21
- };
22
-
23
- /**
24
- * @returns {function()}
25
- * @constructor
26
- */
27
- function ValidatorMiddleware(validatorBase) {
28
- return (getSchema, options, validator) =>
29
- wrapper(async (req, res, next) => {
30
- const { query, body, path } = getSchema(validator || validatorBase.getJoi());
31
- try {
32
- if (query) {
33
- await validate(req.query, query, options);
34
- }
35
- if (body) {
36
- await validate(req.body, body, options);
37
- }
38
- if (path) {
39
- await validate(req.params, path, options);
40
- }
41
- return next();
42
- } catch (e) {
43
- throw new FormInvalidateException(e);
44
- }
45
- });
46
- }
47
-
48
- constitute.Dependencies(ValidatorBase)(ValidatorMiddleware);
49
-
50
- export default ValidatorMiddleware;
@@ -1,127 +0,0 @@
1
- import constitute from 'constitute';
2
- import crypto from 'crypto';
3
- import moment from 'moment-timezone';
4
- import Logger from '../services/logger.js';
5
- import Cache from '../services/cache.js';
6
- import wrapper from '../utils/wrapper.js';
7
- import { RuntimeException } from '../exceptions/index.js';
8
-
9
- export const defaultHashStrategy = obj => obj;
10
-
11
- export const defaultHeadersFilter = (res) => {
12
- const headers = [];
13
- ['Content-Type'].forEach((key) => {
14
- const value = res.get(key);
15
- if (value) {
16
- headers.push([key, value]);
17
- }
18
- });
19
- return headers;
20
- };
21
-
22
- export const requestToCacheKey = (req, hashStrategy) => {
23
- const {
24
- method,
25
- originalUrl,
26
- query: originQuery,
27
- route
28
- } = req;
29
- //Prefer uid resolved by auth middleware, keep req.uid as custom rule fallback
30
- const uid = (req.auth && req.auth.uid) || req.uid || null;
31
- const query = { ...originQuery };
32
- delete query.flush;
33
- if (hashStrategy && typeof hashStrategy !== 'function') {
34
- throw new RuntimeException(`View cache hash strategy must be a function for ${originalUrl}`);
35
- }
36
- if (!route) {
37
- throw new RuntimeException(`View cache middleware require route for ${originalUrl}`);
38
- }
39
- if (method.toLowerCase() !== 'get') {
40
- throw new RuntimeException(`View cache middleware only support GET method of http request for ${originalUrl}`);
41
- }
42
- const { host = 'unknown' } = req.headers;
43
- const [urlPath = ''] = originalUrl.split('?');
44
- const key = [method, `/${host}`, urlPath].join('').replace(/:/g, '_').toLowerCase();
45
- const strategy = hashStrategy || defaultHashStrategy;
46
- const hash = crypto
47
- .createHash('md5')
48
- .update(JSON
49
- .stringify(strategy({
50
- method,
51
- urlPath,
52
- query,
53
- uid
54
- })))
55
- .digest('hex');
56
- return [key, hash].join(':');
57
- };
58
-
59
-
60
- /**
61
- * @param {Cache} cache
62
- * @param {Logger} logger
63
- * @returns {function(*=)}
64
- * @constructor
65
- */
66
- function ViewCacheMiddleware(cache, logger) {
67
- return (options = {}) => {
68
- if (options === null || typeof options !== 'object') {
69
- options = {
70
- ttl: options
71
- };
72
- }
73
- const {
74
- ttl,
75
- headersFilter,
76
- namespace,
77
- hashStrategy
78
- } = Object.assign({
79
- ttl: 60,
80
- headersFilter: defaultHeadersFilter,
81
- hashStrategy: defaultHashStrategy,
82
- namespace: 'view'
83
- }, options);
84
- return wrapper(async (req, res, next) => {
85
- const cacheKey = requestToCacheKey(req, hashStrategy);
86
- const {
87
- headers: cachedHeaders = [],
88
- body: cachedBody
89
- } = await cache.namespace(namespace).get(cacheKey)
90
- || {
91
- headers: [],
92
- body: null
93
- };
94
- if (req.query.flush !== 'true' && cachedBody) {
95
- logger.debug('View cache hit by key %s', cacheKey);
96
- if (cachedHeaders.length > 0) {
97
- cachedHeaders.forEach(([key, value]) => {
98
- res.setHeader(key, value);
99
- });
100
- }
101
- res.setHeader('X-View-Cache-Hit', cacheKey);
102
- res.send(cachedBody);
103
- return;
104
- }
105
- res.realSend = res.send;
106
- res.send = (body) => {
107
- logger.debug('View cache missed by key %s, creating...', cacheKey);
108
- res.setHeader('X-View-Cache-Miss', cacheKey);
109
- res.setHeader('X-View-Cache-Expire-At', moment().add(ttl, 'minute').format('YYYY-MM-DD HH:mm:ss Z'));
110
- res.setHeader('X-View-Cache-Created-At', moment().format('YYYY-MM-DD HH:mm:ss Z'));
111
- res.realSend(body);
112
- const headers = headersFilter && typeof headersFilter === 'function' ?
113
- headersFilter(res) : defaultHeadersFilter(res);
114
- if (res.statusCode <= 500) {
115
- cache.namespace(namespace).set(cacheKey, { headers, body }, ttl).catch((e) => {
116
- logger.error('View cache set failed for %s: %o', cacheKey, e);
117
- });
118
- }
119
- };
120
- next();
121
- });
122
- };
123
- }
124
-
125
- constitute.Dependencies(Cache, Logger)(ViewCacheMiddleware);
126
-
127
- export default ViewCacheMiddleware;