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.
- package/README.md +15 -1
- package/bin/engine +2 -31
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +40 -0
- package/dist/bin.js.map +1 -0
- package/{src/commands/index.js → dist/commands/index.d.ts} +1 -8
- package/dist/commands/index.js +6 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/interface.d.ts +18 -0
- package/dist/commands/interface.js +40 -0
- package/dist/commands/interface.js.map +1 -0
- package/dist/commands/make_entity.d.ts +47 -0
- package/dist/commands/make_entity.js +410 -0
- package/dist/commands/make_entity.js.map +1 -0
- package/dist/commands/tramp.d.ts +7 -0
- package/dist/commands/tramp.js +29 -0
- package/dist/commands/tramp.js.map +1 -0
- package/dist/config/index.d.ts +92 -0
- package/dist/config/index.js +96 -0
- package/dist/config/index.js.map +1 -0
- package/dist/di.d.ts +73 -0
- package/dist/di.js +76 -0
- package/dist/di.js.map +1 -0
- package/dist/engine.d.ts +85 -0
- package/dist/engine.js +404 -0
- package/dist/engine.js.map +1 -0
- package/dist/entities/index.d.ts +54 -0
- package/dist/entities/index.js +228 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/exceptions/index.d.ts +153 -0
- package/dist/exceptions/index.js +439 -0
- package/dist/exceptions/index.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/middlewares/auth.d.ts +5 -0
- package/dist/middlewares/auth.js +63 -0
- package/dist/middlewares/auth.js.map +1 -0
- package/dist/middlewares/auth_kong.d.ts +2 -0
- package/dist/middlewares/auth_kong.js +24 -0
- package/dist/middlewares/auth_kong.js.map +1 -0
- package/dist/middlewares/debug.d.ts +3 -0
- package/dist/middlewares/debug.js +50 -0
- package/dist/middlewares/debug.js.map +1 -0
- package/{src/middlewares/index.js → dist/middlewares/index.d.ts} +1 -11
- package/dist/middlewares/index.js +9 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/middlewares/providers.d.ts +25 -0
- package/dist/middlewares/providers.js +63 -0
- package/dist/middlewares/providers.js.map +1 -0
- package/dist/middlewares/session.d.ts +6 -0
- package/dist/middlewares/session.js +51 -0
- package/dist/middlewares/session.js.map +1 -0
- package/dist/middlewares/trace.d.ts +52 -0
- package/dist/middlewares/trace.js +225 -0
- package/dist/middlewares/trace.js.map +1 -0
- package/dist/middlewares/validator.d.ts +10 -0
- package/dist/middlewares/validator.js +43 -0
- package/dist/middlewares/validator.js.map +1 -0
- package/dist/middlewares/view_cache.d.ts +14 -0
- package/dist/middlewares/view_cache.js +102 -0
- package/dist/middlewares/view_cache.js.map +1 -0
- package/dist/services/cache.d.ts +66 -0
- package/dist/services/cache.js +207 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/config.d.ts +25 -0
- package/dist/services/config.js +88 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/env.d.ts +12 -0
- package/dist/services/env.js +24 -0
- package/dist/services/env.js.map +1 -0
- package/dist/services/event_manager.d.ts +29 -0
- package/dist/services/event_manager.js +75 -0
- package/dist/services/event_manager.js.map +1 -0
- package/dist/services/http_client.d.ts +66 -0
- package/dist/services/http_client.js +62 -0
- package/dist/services/http_client.js.map +1 -0
- package/{src/services/index.js → dist/services/index.d.ts} +1 -15
- package/dist/services/index.js +14 -0
- package/dist/services/index.js.map +1 -0
- package/{src/services/interface.js → dist/services/interface.d.ts} +1 -3
- package/dist/services/interface.js +6 -0
- package/dist/services/interface.js.map +1 -0
- package/{src/services/joi.js → dist/services/joi.d.ts} +2 -9
- package/dist/services/joi.js +11 -0
- package/dist/services/joi.js.map +1 -0
- package/dist/services/jwt_token.d.ts +24 -0
- package/dist/services/jwt_token.js +77 -0
- package/dist/services/jwt_token.js.map +1 -0
- package/dist/services/jwt_token_kong.d.ts +25 -0
- package/dist/services/jwt_token_kong.js +65 -0
- package/dist/services/jwt_token_kong.js.map +1 -0
- package/dist/services/logger.d.ts +30 -0
- package/dist/services/logger.js +126 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/namespace.d.ts +55 -0
- package/dist/services/namespace.js +157 -0
- package/dist/services/namespace.js.map +1 -0
- package/dist/services/now.d.ts +14 -0
- package/dist/services/now.js +43 -0
- package/dist/services/now.js.map +1 -0
- package/dist/services/providers.d.ts +55 -0
- package/dist/services/providers.js +134 -0
- package/dist/services/providers.js.map +1 -0
- package/dist/services/redis.d.ts +18 -0
- package/dist/services/redis.js +53 -0
- package/dist/services/redis.js.map +1 -0
- package/dist/services/rest_client.d.ts +48 -0
- package/dist/services/rest_client.js +96 -0
- package/dist/services/rest_client.js.map +1 -0
- package/dist/swagger/index.d.ts +223 -0
- package/dist/swagger/index.js +564 -0
- package/dist/swagger/index.js.map +1 -0
- package/dist/types/express.d.ts +14 -0
- package/dist/types/vendor.d.ts +102 -0
- package/dist/utils/api_scaffold.d.ts +74 -0
- package/dist/utils/api_scaffold.js +220 -0
- package/dist/utils/api_scaffold.js.map +1 -0
- package/dist/utils/case_converter.d.ts +7 -0
- package/dist/utils/case_converter.js +29 -0
- package/dist/utils/case_converter.js.map +1 -0
- package/dist/utils/crc32.d.ts +2 -0
- package/dist/utils/crc32.js +43 -0
- package/dist/utils/crc32.js.map +1 -0
- package/dist/utils/cron.d.ts +27 -0
- package/dist/utils/cron.js +186 -0
- package/dist/utils/cron.js.map +1 -0
- package/dist/utils/datetime.d.ts +4 -0
- package/dist/utils/datetime.js +6 -0
- package/dist/utils/datetime.js.map +1 -0
- package/dist/utils/host.d.ts +18 -0
- package/dist/utils/host.js +33 -0
- package/dist/utils/host.js.map +1 -0
- package/{src/utils/index.js → dist/utils/index.d.ts} +2 -26
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/pagination.d.ts +150 -0
- package/dist/utils/pagination.js +242 -0
- package/dist/utils/pagination.js.map +1 -0
- package/dist/utils/random.d.ts +3 -0
- package/dist/utils/random.js +18 -0
- package/dist/utils/random.js.map +1 -0
- package/dist/utils/request_client.d.ts +33 -0
- package/dist/utils/request_client.js +153 -0
- package/dist/utils/request_client.js.map +1 -0
- package/dist/utils/smart_query.d.ts +144 -0
- package/dist/utils/smart_query.js +310 -0
- package/dist/utils/smart_query.js.map +1 -0
- package/dist/utils/test.d.ts +14 -0
- package/dist/utils/test.js +37 -0
- package/dist/utils/test.js.map +1 -0
- package/dist/utils/wrapper.d.ts +3 -0
- package/dist/utils/wrapper.js +5 -0
- package/dist/utils/wrapper.js.map +1 -0
- package/package.json +24 -10
- package/index.js +0 -2
- package/src/commands/interface.js +0 -45
- package/src/commands/make_entity.js +0 -490
- package/src/commands/tramp.js +0 -34
- package/src/config/index.js +0 -95
- package/src/di.js +0 -96
- package/src/engine.js +0 -556
- package/src/entities/index.js +0 -272
- package/src/exceptions/index.js +0 -501
- package/src/index.js +0 -55
- package/src/middlewares/auth.js +0 -67
- package/src/middlewares/auth_kong.js +0 -28
- package/src/middlewares/debug.js +0 -88
- package/src/middlewares/providers.js +0 -73
- package/src/middlewares/session.js +0 -63
- package/src/middlewares/trace.js +0 -254
- package/src/middlewares/validator.js +0 -50
- package/src/middlewares/view_cache.js +0 -127
- package/src/services/cache.js +0 -223
- package/src/services/config.js +0 -115
- package/src/services/env.js +0 -28
- package/src/services/event_manager.js +0 -84
- package/src/services/http_client.js +0 -69
- package/src/services/jwt_token.js +0 -89
- package/src/services/jwt_token_kong.js +0 -75
- package/src/services/logger.js +0 -150
- package/src/services/namespace.js +0 -176
- package/src/services/now.js +0 -49
- package/src/services/providers.js +0 -158
- package/src/services/redis.js +0 -63
- package/src/services/rest_client.js +0 -112
- package/src/swagger/index.js +0 -665
- package/src/utils/api_scaffold.js +0 -240
- package/src/utils/case_converter.js +0 -33
- package/src/utils/crc32.js +0 -44
- package/src/utils/cron.js +0 -208
- package/src/utils/datetime.js +0 -13
- package/src/utils/host.js +0 -39
- package/src/utils/pagination.js +0 -260
- package/src/utils/random.js +0 -23
- package/src/utils/request_client.js +0 -179
- package/src/utils/smart_query.js +0 -352
- package/src/utils/test.js +0 -48
- package/src/utils/wrapper.js +0 -8
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import morgan from 'morgan';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import constitute from 'constitute';
|
|
4
|
+
import Logger from "../services/logger.js";
|
|
5
|
+
/**
|
|
6
|
+
Log format:
|
|
7
|
+
NCSA Combined Log Format + extended fields
|
|
8
|
+
|
|
9
|
+
Nginx config as below
|
|
10
|
+
|
|
11
|
+
log_format upstream '$http_x_forwarded_for - $remote_user [$time_local] '
|
|
12
|
+
'"$request" $status $body_bytes_sent '
|
|
13
|
+
'"$http_referer" "$http_user_agent" '
|
|
14
|
+
'"$remote_addr" $host $request_time $upstream_response_time $scheme $server_port '
|
|
15
|
+
'$hostname $upstream_addr $http_x_device_id $sent_http_x_uid $sent_http_x_token '
|
|
16
|
+
'$sent_http_x_service_name $sent_http_x_b3_spanid $sent_http_x_b3_traceid '
|
|
17
|
+
'$sent_http_x_b3_parentspanid $sent_http_x_b3_sampled';
|
|
18
|
+
*/
|
|
19
|
+
morgan.token('host', req => req.headers.host);
|
|
20
|
+
morgan.token('real-ip', req => req.headers['x-real-ip'] ||
|
|
21
|
+
req.headers['x-forwarded-for'] ||
|
|
22
|
+
req.ip ||
|
|
23
|
+
(req.connection && req.connection.remoteAddress));
|
|
24
|
+
morgan.token('port', req => ((req.headers.host && req.headers.host.split(':')[1]) || -1));
|
|
25
|
+
const hostname = os.hostname();
|
|
26
|
+
morgan.token('hostname', () => hostname);
|
|
27
|
+
morgan.token('tokens', (req, res) => [
|
|
28
|
+
res.getHeader('X-Uid') || '-',
|
|
29
|
+
res.getHeader('X-Token') || '-'
|
|
30
|
+
].join(' '));
|
|
31
|
+
morgan.token('tracer', (req, res) => [
|
|
32
|
+
res.getHeader('X-Service-Name') || '-',
|
|
33
|
+
res.getHeader('X-B3-SpanId') || '-',
|
|
34
|
+
res.getHeader('X-B3-TraceId') || '-',
|
|
35
|
+
res.getHeader('X-B3-ParentSpanId') || '-',
|
|
36
|
+
res.getHeader('X-B3-Sampled') || '-'
|
|
37
|
+
].join(' '));
|
|
38
|
+
function DebugMiddleware(logger) {
|
|
39
|
+
return () => morgan(':real-ip - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent" ' +
|
|
40
|
+
'":remote-addr" :host :response-time - :http-version :port :hostname - :tokens :tracer %s', {
|
|
41
|
+
stream: {
|
|
42
|
+
write: (message) => {
|
|
43
|
+
logger.info(message);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
constitute.Dependencies(Logger)(DebugMiddleware);
|
|
49
|
+
export default DebugMiddleware;
|
|
50
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/middlewares/debug.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAG3C;;;;;;;;;;;;;GAaG;AAEH,MAAM,CAAC,KAAK,CACV,MAAM,EACN,GAAG,CAAC,EAAE,CACJ,GAAG,CAAC,OAAO,CAAC,IAAI,CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,CACV,SAAS,EACT,GAAG,CAAC,EAAE,CACJ,GAAG,CAAC,OAAO,CAAC,WAAW,CAAW;IAClC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAW;IACxC,GAAG,CAAC,EAAE;IACN,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CACnD,CAAC;AAEF,MAAM,CAAC,KAAK,CACV,MAAM,EACN,GAAG,CAAC,EAAE,CACJ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAW,CACzE,CAAC;AAEF,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AAC/B,MAAM,CAAC,KAAK,CAAoB,UAAU,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;AAE5D,MAAM,CAAC,KAAK,CACV,QAAQ,EACR,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACX;IACE,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,GAAG;IAC7B,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,GAAG;CAChC,CAAC,IAAI,CAAC,GAAG,CAAC,CACd,CAAC;AAEF,MAAM,CAAC,KAAK,CACV,QAAQ,EACR,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACX;IACE,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,GAAG;IACtC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,GAAG;IACnC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,GAAG;IACpC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,IAAI,GAAG;IACzC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,GAAG;CACrC,CAAC,IAAI,CAAC,GAAG,CAAC,CACd,CAAC;AAGF,SAAS,eAAe,CAAC,MAAc;IACrC,OAAO,GAAG,EAAE,CACV,MAAM,CACJ,gIAAgI;QAChI,0FAA0F,EAC1F;QACE,MAAM,EAAE;YACN,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;gBACjB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;SACF;KACF,CACF,CAAC;AACN,CAAC;AAED,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;AACjD,eAAe,eAAe,CAAC"}
|
|
@@ -5,14 +5,4 @@ import SessionMiddleware from './session.js';
|
|
|
5
5
|
import TraceMiddleware from './trace.js';
|
|
6
6
|
import ViewCacheMiddleware from './view_cache.js';
|
|
7
7
|
import ValidatorMiddleware from './validator.js';
|
|
8
|
-
|
|
9
|
-
export {
|
|
10
|
-
AuthMiddleware,
|
|
11
|
-
AuthKongMiddleware,
|
|
12
|
-
DebugMiddleware,
|
|
13
|
-
SessionMiddleware,
|
|
14
|
-
TraceMiddleware,
|
|
15
|
-
ViewCacheMiddleware,
|
|
16
|
-
ValidatorMiddleware
|
|
17
|
-
};
|
|
18
|
-
|
|
8
|
+
export { AuthMiddleware, AuthKongMiddleware, DebugMiddleware, SessionMiddleware, TraceMiddleware, ViewCacheMiddleware, ValidatorMiddleware };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import AuthMiddleware from "./auth.js";
|
|
2
|
+
import AuthKongMiddleware from "./auth_kong.js";
|
|
3
|
+
import DebugMiddleware from "./debug.js";
|
|
4
|
+
import SessionMiddleware from "./session.js";
|
|
5
|
+
import TraceMiddleware from "./trace.js";
|
|
6
|
+
import ViewCacheMiddleware from "./view_cache.js";
|
|
7
|
+
import ValidatorMiddleware from "./validator.js";
|
|
8
|
+
export { AuthMiddleware, AuthKongMiddleware, DebugMiddleware, SessionMiddleware, TraceMiddleware, ViewCacheMiddleware, ValidatorMiddleware };
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,WAAW,CAAC;AACvC,OAAO,kBAAkB,MAAM,gBAAgB,CAAC;AAChD,OAAO,eAAe,MAAM,YAAY,CAAC;AACzC,OAAO,iBAAiB,MAAM,cAAc,CAAC;AAC7C,OAAO,eAAe,MAAM,YAAY,CAAC;AACzC,OAAO,mBAAmB,MAAM,iBAAiB,CAAC;AAClD,OAAO,mBAAmB,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACpB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ServiceProvider } from '../services/providers.js';
|
|
2
|
+
export declare class SessionMiddlewareProvider extends ServiceProvider {
|
|
3
|
+
get name(): string;
|
|
4
|
+
register(): void;
|
|
5
|
+
}
|
|
6
|
+
export declare class AuthMiddlewareProvider extends ServiceProvider {
|
|
7
|
+
get name(): string;
|
|
8
|
+
register(): void;
|
|
9
|
+
}
|
|
10
|
+
export declare class DebugMiddlewareProvider extends ServiceProvider {
|
|
11
|
+
get name(): string;
|
|
12
|
+
register(): void;
|
|
13
|
+
}
|
|
14
|
+
export declare class ViewCacheMiddlewareProvider extends ServiceProvider {
|
|
15
|
+
get name(): string;
|
|
16
|
+
register(): void;
|
|
17
|
+
}
|
|
18
|
+
export declare class TraceMiddlewareProvider extends ServiceProvider {
|
|
19
|
+
get name(): string;
|
|
20
|
+
register(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare class ValidatorMiddlewareProvider extends ServiceProvider {
|
|
23
|
+
get name(): string;
|
|
24
|
+
register(): void;
|
|
25
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
export class SessionMiddlewareProvider extends ServiceProvider {
|
|
11
|
+
get name() {
|
|
12
|
+
return 'session';
|
|
13
|
+
}
|
|
14
|
+
register() {
|
|
15
|
+
DI.bindMethod(this.name, SessionMiddleware);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class AuthMiddlewareProvider extends ServiceProvider {
|
|
19
|
+
get name() {
|
|
20
|
+
return 'auth';
|
|
21
|
+
}
|
|
22
|
+
register() {
|
|
23
|
+
if (DI.get('config').get('token.provider') === 'kong') {
|
|
24
|
+
DI.bindMethod(this.name, AuthKongMiddleware);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
DI.bindMethod(this.name, AuthMiddleware);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class DebugMiddlewareProvider extends ServiceProvider {
|
|
32
|
+
get name() {
|
|
33
|
+
return 'debug';
|
|
34
|
+
}
|
|
35
|
+
register() {
|
|
36
|
+
DI.bindMethod(this.name, DebugMiddleware);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export class ViewCacheMiddlewareProvider extends ServiceProvider {
|
|
40
|
+
get name() {
|
|
41
|
+
return 'view_cache';
|
|
42
|
+
}
|
|
43
|
+
register() {
|
|
44
|
+
DI.bindMethod(this.name, ViewCacheMiddleware);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class TraceMiddlewareProvider extends ServiceProvider {
|
|
48
|
+
get name() {
|
|
49
|
+
return 'trace';
|
|
50
|
+
}
|
|
51
|
+
register() {
|
|
52
|
+
DI.bindMethod(this.name, TraceMiddleware);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export class ValidatorMiddlewareProvider extends ServiceProvider {
|
|
56
|
+
get name() {
|
|
57
|
+
return 'validator';
|
|
58
|
+
}
|
|
59
|
+
register() {
|
|
60
|
+
DI.bindMethod(this.name, ValidatorMiddleware);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/middlewares/providers.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,2BAA2B,CAAC;AAC1D,OAAO,cAAc,MAAM,wBAAwB,CAAC;AACpD,OAAO,kBAAkB,MAAM,6BAA6B,CAAC;AAC7D,OAAO,eAAe,MAAM,yBAAyB,CAAC;AACtD,OAAO,eAAe,MAAM,yBAAyB,CAAC;AACtD,OAAO,mBAAmB,MAAM,8BAA8B,CAAC;AAC/D,OAAO,mBAAmB,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,OAAO,yBAA0B,SAAQ,eAAe;IAC5D,IAAa,IAAI;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;IAEQ,QAAQ;QACf,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,eAAe;IACzD,IAAa,IAAI;QACf,OAAO,MAAM,CAAC;IAChB,CAAC;IAEQ,QAAQ;QACf,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,MAAM,EAAE,CAAC;YACtD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,eAAe;IAC1D,IAAa,IAAI;QACf,OAAO,OAAO,CAAC;IACjB,CAAC;IAEQ,QAAQ;QACf,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC5C,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,eAAe;IAC9D,IAAa,IAAI;QACf,OAAO,YAAY,CAAC;IACtB,CAAC;IAEQ,QAAQ;QACf,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAChD,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,eAAe;IAC1D,IAAa,IAAI;QACf,OAAO,OAAO,CAAC;IACjB,CAAC;IAEQ,QAAQ;QACf,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC5C,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,eAAe;IAC9D,IAAa,IAAI;QACf,OAAO,WAAW,CAAC;IACrB,CAAC;IAEQ,QAAQ;QACf,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAChD,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import Config from '../services/config.js';
|
|
2
|
+
import Redis from '../services/redis.js';
|
|
3
|
+
import Namespace from '../services/namespace.js';
|
|
4
|
+
import type { RequestHandler } from 'express';
|
|
5
|
+
declare function SessionMiddleware(_config: Config, redis: Redis, namespace: Namespace): () => RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
|
|
6
|
+
export default SessionMiddleware;
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
let middleware = null;
|
|
9
|
+
//Fix issue https://github.com/othiym23/node-continuation-local-storage/issues/29
|
|
10
|
+
const clsifyMiddleware = (fn, ns) => (req, res, next) => fn.call(this, req, res, ns.bind(next));
|
|
11
|
+
function SessionMiddleware(_config, redis, namespace) {
|
|
12
|
+
return () => {
|
|
13
|
+
if (middleware) {
|
|
14
|
+
return middleware;
|
|
15
|
+
}
|
|
16
|
+
const Store = RedisStore;
|
|
17
|
+
let store = null;
|
|
18
|
+
const config = _config.get().session;
|
|
19
|
+
if (config.store) {
|
|
20
|
+
const RedisClient = new Store(Object.assign({}, config.store, {
|
|
21
|
+
client: config.store.client || redis.getInstance()
|
|
22
|
+
}));
|
|
23
|
+
RedisClient.client.on('error', (err) => {
|
|
24
|
+
try {
|
|
25
|
+
DI.get('logger').error('Session Redis store error:', err);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
console.error('Session Redis store error:', err);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
store = RedisClient;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
store = new Store(Object.assign({}, { client: redis.getInstance() }));
|
|
35
|
+
}
|
|
36
|
+
middleware = session({
|
|
37
|
+
store,
|
|
38
|
+
cookie: Object.assign({}, _config.get().cookie),
|
|
39
|
+
secret: config.secret,
|
|
40
|
+
resave: config.resave,
|
|
41
|
+
saveUninitialized: config.saveUninitialized
|
|
42
|
+
});
|
|
43
|
+
return namespace.isEnabled() ?
|
|
44
|
+
//Store 基类 getContext() 类型为 unknown,运行时由 NsStore 返回 CLS namespace
|
|
45
|
+
clsifyMiddleware(middleware, namespace.use().getContext()) :
|
|
46
|
+
middleware;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
constitute.Dependencies(Config, Redis, Namespace)(SessionMiddleware);
|
|
50
|
+
export default SessionMiddleware;
|
|
51
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/middlewares/session.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAC3C,OAAO,KAAK,MAAM,sBAAsB,CAAC;AACzC,OAAO,SAAS,MAAM,0BAA0B,CAAC;AAIjD,IAAI,UAAU,GAA0B,IAAI,CAAC;AAE7C,iFAAiF;AACjF,MAAM,gBAAgB,GAAG,CAAC,EAAkB,EAAE,EAAgB,EAAkB,EAAE,CAChF,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CACjB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAS3C,SAAS,iBAAiB,CAAC,OAAe,EAAE,KAAY,EAAE,SAAoB;IAC5E,OAAO,GAAG,EAAE;QACV,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC;QACzB,IAAI,KAAK,GAA2C,IAAI,CAAC;QACzD,MAAM,MAAM,GAAI,OAAO,CAAC,GAAG,EAAiC,CAAC,OAAO,CAAC;QAErE,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE;gBAC5D,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE;aACnD,CAAC,CAAC,CAAC;YACJ,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACrC,IAAI,CAAC;oBACH,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;gBAC5D,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC,CAAC,CAAC;YACH,KAAK,GAAG,WAAW,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC;QAED,UAAU,GAAG,OAAO,CAAC;YACnB,KAAK;YACL,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAG,OAAO,CAAC,GAAG,EAA0B,CAAC,MAAM,CAAC;YACxE,MAAM,EAAE,MAAM,CAAC,MAAgB;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;SAC5C,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;YAC5B,iEAAiE;YACjE,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,UAAU,EAAkB,CAAC,CAAC,CAAC;YAC5E,UAAU,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AACD,UAAU,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC;AAErE,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import Namespace from '../services/namespace.js';
|
|
2
|
+
import Config from '../services/config.js';
|
|
3
|
+
import Logger from '../services/logger.js';
|
|
4
|
+
import HttpClient from '../services/http_client.js';
|
|
5
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
6
|
+
interface ZipkinEndpoint {
|
|
7
|
+
serviceName: unknown;
|
|
8
|
+
ipv4: string;
|
|
9
|
+
port: unknown;
|
|
10
|
+
}
|
|
11
|
+
interface ZipkinAnnotation {
|
|
12
|
+
endpoint: ZipkinEndpoint;
|
|
13
|
+
timestamp: number;
|
|
14
|
+
value: string;
|
|
15
|
+
}
|
|
16
|
+
interface ZipkinBinaryAnnotation {
|
|
17
|
+
key: string;
|
|
18
|
+
value: unknown;
|
|
19
|
+
}
|
|
20
|
+
interface ZipkinSpan {
|
|
21
|
+
id: string;
|
|
22
|
+
traceId: string;
|
|
23
|
+
name: string;
|
|
24
|
+
timestamp: number;
|
|
25
|
+
duration: number;
|
|
26
|
+
annotations: ZipkinAnnotation[];
|
|
27
|
+
binaryAnnotations: ZipkinBinaryAnnotation[];
|
|
28
|
+
parentId?: string;
|
|
29
|
+
}
|
|
30
|
+
interface TracerQuery {
|
|
31
|
+
query: unknown;
|
|
32
|
+
cost: number;
|
|
33
|
+
finishedAt: number;
|
|
34
|
+
}
|
|
35
|
+
interface Tracer {
|
|
36
|
+
serviceName: unknown;
|
|
37
|
+
method: string;
|
|
38
|
+
url: string;
|
|
39
|
+
port: string | number;
|
|
40
|
+
spanId: string;
|
|
41
|
+
traceId: string;
|
|
42
|
+
parentId: string;
|
|
43
|
+
sampled: number;
|
|
44
|
+
timestamp: number;
|
|
45
|
+
duration: number;
|
|
46
|
+
statusCode: number;
|
|
47
|
+
queries: TracerQuery[];
|
|
48
|
+
debug: Record<string, unknown>;
|
|
49
|
+
}
|
|
50
|
+
export declare const tracerToZipkins: (tracer: Tracer | null | undefined) => false | ZipkinSpan[];
|
|
51
|
+
declare function TraceMiddleware(ns: Namespace, config: Config, logger: Logger, client: HttpClient): (name?: string) => (req: Request, res: Response, next: NextFunction) => void;
|
|
52
|
+
export default TraceMiddleware;
|
|
@@ -0,0 +1,225 @@
|
|
|
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
|
+
const hostIp = getHostIp();
|
|
8
|
+
/**
|
|
9
|
+
* Execute a listener when a response is about to write headers.
|
|
10
|
+
* Inlined from the on-headers package (MIT), limited to the behavior trace middleware needs.
|
|
11
|
+
*/
|
|
12
|
+
const onHeaders = (res, listener) => {
|
|
13
|
+
if (!res) {
|
|
14
|
+
throw new TypeError('argument res is required');
|
|
15
|
+
}
|
|
16
|
+
if (typeof listener !== 'function') {
|
|
17
|
+
throw new TypeError('argument listener must be a function');
|
|
18
|
+
}
|
|
19
|
+
//writeHead 在 ServerResponse 上是重载签名,补丁替换按可变参数收敛为 unknown,运行时仍透传全部实参
|
|
20
|
+
const prevWriteHead = res.writeHead;
|
|
21
|
+
let fired = false;
|
|
22
|
+
res.writeHead = function writeHead(...args) {
|
|
23
|
+
if (!fired) {
|
|
24
|
+
fired = true;
|
|
25
|
+
listener.call(this);
|
|
26
|
+
}
|
|
27
|
+
return prevWriteHead.apply(this, args);
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export const tracerToZipkins = (tracer) => {
|
|
31
|
+
if (!tracer) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
const { url, method, serviceName, spanId: id, traceId, parentId, timestamp, duration, statusCode, port, queries } = tracer;
|
|
35
|
+
const name = `${statusCode} ${method} ${url}`;
|
|
36
|
+
const endpoint = {
|
|
37
|
+
serviceName,
|
|
38
|
+
ipv4: hostIp,
|
|
39
|
+
port
|
|
40
|
+
};
|
|
41
|
+
const zipkin = {
|
|
42
|
+
id,
|
|
43
|
+
traceId,
|
|
44
|
+
name,
|
|
45
|
+
timestamp,
|
|
46
|
+
duration,
|
|
47
|
+
annotations: [
|
|
48
|
+
{
|
|
49
|
+
endpoint,
|
|
50
|
+
timestamp,
|
|
51
|
+
value: 'sr'
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
endpoint,
|
|
55
|
+
timestamp: timestamp + duration,
|
|
56
|
+
value: 'ss'
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
binaryAnnotations: [
|
|
60
|
+
{
|
|
61
|
+
key: 'traceId',
|
|
62
|
+
value: traceId
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
key: 'spanId',
|
|
66
|
+
value: id
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
key: 'method',
|
|
70
|
+
value: method
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
key: 'url',
|
|
74
|
+
value: url
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
key: 'port',
|
|
78
|
+
value: port.toString()
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
key: 'statusCode',
|
|
82
|
+
value: statusCode.toString()
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
};
|
|
86
|
+
if (parentId) {
|
|
87
|
+
zipkin.parentId = parentId;
|
|
88
|
+
}
|
|
89
|
+
const zipkins = [zipkin];
|
|
90
|
+
if (queries && queries.length > 0) {
|
|
91
|
+
queries.forEach((element) => {
|
|
92
|
+
const { query, cost, finishedAt } = element;
|
|
93
|
+
zipkins.push({
|
|
94
|
+
id: randomString(),
|
|
95
|
+
parentId: id,
|
|
96
|
+
traceId,
|
|
97
|
+
name: 'sequelize',
|
|
98
|
+
timestamp: finishedAt - cost,
|
|
99
|
+
duration: cost,
|
|
100
|
+
annotations: [
|
|
101
|
+
{
|
|
102
|
+
endpoint,
|
|
103
|
+
timestamp: finishedAt - cost,
|
|
104
|
+
value: 'cs'
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
endpoint,
|
|
108
|
+
timestamp: finishedAt,
|
|
109
|
+
value: 'cr'
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
binaryAnnotations: [{
|
|
113
|
+
key: 'query',
|
|
114
|
+
value: query
|
|
115
|
+
}]
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return zipkins;
|
|
120
|
+
};
|
|
121
|
+
function TraceMiddleware(ns, config, logger, client) {
|
|
122
|
+
const enabled = config.get('trace.enable');
|
|
123
|
+
return (name) => (req, res, next) => {
|
|
124
|
+
const spanId = randomString();
|
|
125
|
+
const traceId = req.get('X-B3-TraceId') || spanId;
|
|
126
|
+
const parentId = req.get('X-B3-SpanId') || '';
|
|
127
|
+
const startedAt = process.hrtime();
|
|
128
|
+
const timestamp = getMicroTimestamp();
|
|
129
|
+
const serviceName = name || config.get('app.name');
|
|
130
|
+
//目前默认全部采样
|
|
131
|
+
let sampled = enabled ? 1 : 0;
|
|
132
|
+
//只有service为第二级, 且通过参数关闭时才禁止采样
|
|
133
|
+
if (sampled && parseInt(req.get('X-B3-Sampled'), 10) < 1 && parentId > 0) {
|
|
134
|
+
sampled = 0;
|
|
135
|
+
}
|
|
136
|
+
const tracer = {
|
|
137
|
+
serviceName,
|
|
138
|
+
method: req.method,
|
|
139
|
+
url: getHostFullUrl(req),
|
|
140
|
+
port: getHostPort(req),
|
|
141
|
+
spanId,
|
|
142
|
+
traceId,
|
|
143
|
+
parentId,
|
|
144
|
+
sampled,
|
|
145
|
+
timestamp,
|
|
146
|
+
//初始为 null,响应头写出后由下方 onHeaders 回填,类型按回填后的形态声明
|
|
147
|
+
duration: null,
|
|
148
|
+
statusCode: null,
|
|
149
|
+
queries: [],
|
|
150
|
+
debug: {}
|
|
151
|
+
};
|
|
152
|
+
res.set({
|
|
153
|
+
'X-Service-Name': serviceName,
|
|
154
|
+
'X-Requested-At': timestamp,
|
|
155
|
+
'X-B3-SpanId': spanId,
|
|
156
|
+
'X-B3-TraceId': traceId,
|
|
157
|
+
'X-B3-ParentSpanId': parentId,
|
|
158
|
+
'X-B3-Sampled': sampled
|
|
159
|
+
});
|
|
160
|
+
if (sampled < 1) {
|
|
161
|
+
onHeaders(res, () => {
|
|
162
|
+
const [seconds, nanoseconds] = process.hrtime(startedAt);
|
|
163
|
+
const duration = ((seconds * 1e3) + (nanoseconds * 1e-6));
|
|
164
|
+
//express 的 set 类型仅声明 string,运行时 Node 接受数字并自动强转
|
|
165
|
+
res.set('X-Response-Milliseconds', parseInt(duration, 10));
|
|
166
|
+
});
|
|
167
|
+
next();
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
onHeaders(res, () => {
|
|
171
|
+
const [seconds, nanoseconds] = process.hrtime(startedAt);
|
|
172
|
+
const duration = ((seconds * 1e3) + (nanoseconds * 1e-6)) * 1000;
|
|
173
|
+
tracer.duration = parseInt(duration, 10);
|
|
174
|
+
tracer.statusCode = res.statusCode;
|
|
175
|
+
res.set('X-Response-Milliseconds', (tracer.duration / 1000));
|
|
176
|
+
const useHeader = config.get('trace.header');
|
|
177
|
+
if (!useHeader) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const zipkins = tracerToZipkins(tracer);
|
|
181
|
+
if (!zipkins) {
|
|
182
|
+
logger.warn('Tracer not send by no data for request %s', spanId);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
res.set(`X-Debug-${spanId}`, JSON.stringify(zipkins));
|
|
186
|
+
}
|
|
187
|
+
if (Object.keys(tracer.debug).length > 0) {
|
|
188
|
+
Object.entries(tracer.debug).forEach(([key, value]) => {
|
|
189
|
+
res.set(key.replace('x-debug', 'X-Debug'), value);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
const recordZipkin = () => {
|
|
194
|
+
const api = config.get('trace.api');
|
|
195
|
+
if (!api) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
logger.debug('Tracer prepare to send for request %s', spanId);
|
|
199
|
+
const zipkins = tracerToZipkins(ns.get('tracer'));
|
|
200
|
+
if (!zipkins) {
|
|
201
|
+
logger.warn('Tracer not send by no data for request %s', spanId);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
client.request({
|
|
205
|
+
url: api,
|
|
206
|
+
method: 'POST',
|
|
207
|
+
json: zipkins
|
|
208
|
+
}).catch((e) => {
|
|
209
|
+
logger.error('Error happened on sending tracing data: %o', e);
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
res.on('finish', recordZipkin);
|
|
213
|
+
res.on('error', recordZipkin);
|
|
214
|
+
ns.bindEmitter(req);
|
|
215
|
+
ns.bindEmitter(res);
|
|
216
|
+
ns.run(() => {
|
|
217
|
+
// logger.debug('Tracer settled for request %s, tracer: %j', spanId, tracer);
|
|
218
|
+
ns.set('tracer', tracer);
|
|
219
|
+
next();
|
|
220
|
+
});
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
constitute.Dependencies(Namespace, Config, Logger, HttpClient)(TraceMiddleware);
|
|
224
|
+
export default TraceMiddleware;
|
|
225
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/middlewares/trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import Joi from 'joi';
|
|
2
|
+
import ValidatorBase from '../services/joi.js';
|
|
3
|
+
import type { Schema, AsyncValidationOptions } from 'joi';
|
|
4
|
+
type ValidatorSchemas = {
|
|
5
|
+
query?: Schema;
|
|
6
|
+
body?: Schema;
|
|
7
|
+
path?: Schema;
|
|
8
|
+
};
|
|
9
|
+
declare function ValidatorMiddleware(validatorBase: ValidatorBase): (getSchema: (joi: typeof Joi) => ValidatorSchemas, options?: AsyncValidationOptions, validator?: typeof Joi) => import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
|
|
10
|
+
export default ValidatorMiddleware;
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
const validate = (data, schema, options) => {
|
|
7
|
+
const validationOptions = Object.assign({ abortEarly: false, allowUnknown: true }, options);
|
|
8
|
+
if (schema && typeof schema.validateAsync === 'function') {
|
|
9
|
+
return schema.validateAsync(data, validationOptions);
|
|
10
|
+
}
|
|
11
|
+
//joi 18 已移除 legacy Joi.validate API,该分支仅在 schema 无 validateAsync 时可达,保留原调用形态
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
Joi.validate(data, schema, validationOptions, (err, value) => {
|
|
14
|
+
if (err)
|
|
15
|
+
reject(err);
|
|
16
|
+
else
|
|
17
|
+
resolve(value);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
function ValidatorMiddleware(validatorBase) {
|
|
22
|
+
return (getSchema, options, validator) => wrapper(async (req, res, next) => {
|
|
23
|
+
const { query, body, path } = getSchema(validator || validatorBase.getJoi());
|
|
24
|
+
try {
|
|
25
|
+
if (query) {
|
|
26
|
+
await validate(req.query, query, options);
|
|
27
|
+
}
|
|
28
|
+
if (body) {
|
|
29
|
+
await validate(req.body, body, options);
|
|
30
|
+
}
|
|
31
|
+
if (path) {
|
|
32
|
+
await validate(req.params, path, options);
|
|
33
|
+
}
|
|
34
|
+
return next();
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
throw new FormInvalidateException(e);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
constitute.Dependencies(ValidatorBase)(ValidatorMiddleware);
|
|
42
|
+
export default ValidatorMiddleware;
|
|
43
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/middlewares/validator.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,OAAO,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAS/C,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAE,MAAc,EAAE,OAAgC,EAAoB,EAAE;IACrG,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CACrC,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,EACzC,OAAO,CACR,CAAC;IACF,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;QACzD,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACvD,CAAC;IACD,6EAA6E;IAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACpC,GAEC,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC1D,IAAI,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;gBAChB,OAAO,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,mBAAmB,CAAC,aAA4B;IACvD,OAAO,CAAC,SAAgD,EAAE,OAAgC,EAAE,SAAsB,EAAE,EAAE,CACpH,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC/B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,SAAS,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,uBAAuB,CAAC,CAAU,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,UAAU,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,mBAAmB,CAAC,CAAC;AAE5D,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Logger from '../services/logger.js';
|
|
2
|
+
import Cache from '../services/cache.js';
|
|
3
|
+
import type { Request, Response } from 'express';
|
|
4
|
+
export declare const defaultHashStrategy: <T>(obj: T) => T;
|
|
5
|
+
export declare const defaultHeadersFilter: (res: Response) => Array<[string, string]>;
|
|
6
|
+
export declare const requestToCacheKey: (req: Request, hashStrategy?: unknown) => string;
|
|
7
|
+
interface ViewCacheOptions {
|
|
8
|
+
ttl?: number | string | null;
|
|
9
|
+
headersFilter?: (res: Response) => Array<[string, string]>;
|
|
10
|
+
hashStrategy?: unknown;
|
|
11
|
+
namespace?: string;
|
|
12
|
+
}
|
|
13
|
+
declare function ViewCacheMiddleware(cache: Cache, logger: Logger): (options?: ViewCacheOptions | number | string | null) => import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
|
|
14
|
+
export default ViewCacheMiddleware;
|