@midwayjs/core 4.0.0-beta.11 → 4.0.0-beta.13
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/dist/baseFramework.js +18 -1
- package/dist/common/asyncContextManager.js +0 -1
- package/dist/common/dataSourceManager.d.ts +1 -1
- package/dist/common/fileDetector.d.ts +1 -0
- package/dist/common/fileDetector.js +26 -0
- package/dist/common/webGenerator.js +3 -1
- package/dist/config/config.default.d.ts +2 -2
- package/dist/config/config.default.js +6 -1
- package/dist/context/componentLoader.js +1 -1
- package/dist/context/container.js +7 -0
- package/dist/decorator/common/tracer.d.ts +9 -0
- package/dist/decorator/common/tracer.js +18 -0
- package/dist/decorator/constant.d.ts +1 -0
- package/dist/decorator/constant.js +2 -1
- package/dist/decorator/index.d.ts +1 -0
- package/dist/decorator/index.js +1 -0
- package/dist/decorator/metadataManager.js +0 -2
- package/dist/decorator/web/requestMapping.d.ts +4 -0
- package/dist/decorator/web/requestMapping.js +14 -3
- package/dist/error/framework.d.ts +13 -1
- package/dist/error/framework.js +3 -1
- package/dist/functional/adapter.d.ts +4 -0
- package/dist/functional/adapter.js +7 -0
- package/dist/functional/api.d.ts +68 -0
- package/dist/functional/api.js +262 -0
- package/dist/functional/constants.d.ts +3 -0
- package/dist/functional/constants.js +6 -0
- package/dist/functional/hooks.js +0 -1
- package/dist/functional/index.d.ts +3 -0
- package/dist/functional/index.js +7 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/interface.d.ts +29 -3
- package/dist/interface.js +1 -1
- package/dist/service/configService.js +0 -1
- package/dist/service/lifeCycleService.js +3 -1
- package/dist/service/traceService.d.ts +49 -0
- package/dist/service/traceService.js +306 -0
- package/dist/service/webRouterService.d.ts +40 -0
- package/dist/service/webRouterService.js +197 -45
- package/dist/setup.js +4 -0
- package/dist/util/index.d.ts +1 -0
- package/dist/util/index.js +78 -2
- package/package.json +3 -2
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MidwayTraceService = void 0;
|
|
13
|
+
const api_1 = require("@opentelemetry/api");
|
|
14
|
+
const decorator_1 = require("../decorator");
|
|
15
|
+
const interface_1 = require("../interface");
|
|
16
|
+
const tracer_1 = require("../decorator/common/tracer");
|
|
17
|
+
const decoratorService_1 = require("./decoratorService");
|
|
18
|
+
let MidwayTraceService = class MidwayTraceService {
|
|
19
|
+
currentTracerName = 'midway';
|
|
20
|
+
tracingConfig;
|
|
21
|
+
app;
|
|
22
|
+
decoratorService;
|
|
23
|
+
tracingOptions;
|
|
24
|
+
logger;
|
|
25
|
+
init() {
|
|
26
|
+
this.currentTracerName = this.app?.getProjectName?.() ?? 'unknown_project';
|
|
27
|
+
this.tracingConfig = {
|
|
28
|
+
enable: true,
|
|
29
|
+
onError: 'ignore',
|
|
30
|
+
logOnError: false,
|
|
31
|
+
...(this.tracingOptions ?? {}),
|
|
32
|
+
};
|
|
33
|
+
this.decoratorService.registerMethodHandler(tracer_1.TRACE_KEY, options => {
|
|
34
|
+
return {
|
|
35
|
+
around: async (joinPoint) => {
|
|
36
|
+
return this.createSpan(options.metadata['spanName'], async (span) => {
|
|
37
|
+
try {
|
|
38
|
+
const result = await joinPoint.proceed(...joinPoint.args);
|
|
39
|
+
span.setStatus({
|
|
40
|
+
code: api_1.SpanStatusCode.OK,
|
|
41
|
+
});
|
|
42
|
+
span.end();
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
span.setStatus({
|
|
47
|
+
code: api_1.SpanStatusCode.ERROR,
|
|
48
|
+
});
|
|
49
|
+
span.recordException(err);
|
|
50
|
+
span.end();
|
|
51
|
+
throw err;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
getCurrentSpan() {
|
|
59
|
+
return api_1.trace.getSpan(api_1.context.active());
|
|
60
|
+
}
|
|
61
|
+
getTraceId() {
|
|
62
|
+
return this.getCurrentSpan()?.spanContext().traceId;
|
|
63
|
+
}
|
|
64
|
+
createSpan(name, callback) {
|
|
65
|
+
return api_1.trace.getTracer(this.currentTracerName).startActiveSpan(name, {
|
|
66
|
+
kind: api_1.SpanKind.CLIENT,
|
|
67
|
+
}, callback);
|
|
68
|
+
}
|
|
69
|
+
defaultGetter = {
|
|
70
|
+
get(carrier, key) {
|
|
71
|
+
if (!carrier || !key) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
if (typeof carrier.get === 'function') {
|
|
75
|
+
return carrier.get(key);
|
|
76
|
+
}
|
|
77
|
+
const lowerKey = key.toLowerCase();
|
|
78
|
+
const realKey = Object.keys(carrier).find(item => item.toLowerCase() === lowerKey);
|
|
79
|
+
return realKey ? carrier[realKey] : undefined;
|
|
80
|
+
},
|
|
81
|
+
keys(carrier) {
|
|
82
|
+
if (!carrier) {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
return Object.keys(carrier);
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
defaultSetter = {
|
|
89
|
+
set(carrier, key, value) {
|
|
90
|
+
if (!carrier || !key) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (typeof carrier.setHeader === 'function') {
|
|
94
|
+
carrier.setHeader(key, value);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (typeof carrier.set === 'function') {
|
|
98
|
+
carrier.set(key, value);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
carrier[key] = value;
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
getProtocolFromAttributes(attributes) {
|
|
105
|
+
const protocol = attributes?.['midway.protocol'];
|
|
106
|
+
if (!protocol || typeof protocol !== 'string') {
|
|
107
|
+
return 'default';
|
|
108
|
+
}
|
|
109
|
+
return protocol;
|
|
110
|
+
}
|
|
111
|
+
isProtocolEnabled() {
|
|
112
|
+
return this.tracingConfig?.enable !== false;
|
|
113
|
+
}
|
|
114
|
+
handleTraceError(err, phase) {
|
|
115
|
+
if (this.tracingConfig?.logOnError) {
|
|
116
|
+
this.logger?.warn?.(`[midway:trace] ${phase} failed: ${err?.message || err}`);
|
|
117
|
+
}
|
|
118
|
+
if (this.tracingConfig?.onError === 'throw') {
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
pickTraceMetaValue(meta) {
|
|
123
|
+
if (!meta || typeof meta !== 'object') {
|
|
124
|
+
return {};
|
|
125
|
+
}
|
|
126
|
+
const result = {};
|
|
127
|
+
for (const [key, value] of Object.entries(meta)) {
|
|
128
|
+
if (value === null || value === undefined) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (typeof value === 'string' ||
|
|
132
|
+
typeof value === 'number' ||
|
|
133
|
+
typeof value === 'boolean') {
|
|
134
|
+
result[key] = value;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
resolveTraceMeta(resolver, args) {
|
|
140
|
+
if (!resolver) {
|
|
141
|
+
return {};
|
|
142
|
+
}
|
|
143
|
+
const mergeMeta = (target, source) => {
|
|
144
|
+
if (!source) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const resolved = typeof source === 'function'
|
|
148
|
+
? source(args)
|
|
149
|
+
: source;
|
|
150
|
+
Object.assign(target, this.pickTraceMetaValue(resolved));
|
|
151
|
+
};
|
|
152
|
+
if (typeof resolver === 'function') {
|
|
153
|
+
return this.pickTraceMetaValue(resolver(args));
|
|
154
|
+
}
|
|
155
|
+
const resolverWithDirection = resolver;
|
|
156
|
+
if (resolverWithDirection.common !== undefined ||
|
|
157
|
+
resolverWithDirection.entry !== undefined ||
|
|
158
|
+
resolverWithDirection.exit !== undefined) {
|
|
159
|
+
const result = {};
|
|
160
|
+
mergeMeta(result, resolverWithDirection.common);
|
|
161
|
+
mergeMeta(result, resolverWithDirection[args.direction]);
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
return this.pickTraceMetaValue(resolver);
|
|
165
|
+
}
|
|
166
|
+
runWithEntrySpan(name, options, callback) {
|
|
167
|
+
const protocol = this.getProtocolFromAttributes(options.attributes);
|
|
168
|
+
const traceMeta = this.resolveTraceMeta(options.meta, {
|
|
169
|
+
direction: 'entry',
|
|
170
|
+
protocol,
|
|
171
|
+
spanName: name,
|
|
172
|
+
...(options.metaArgs ?? {}),
|
|
173
|
+
});
|
|
174
|
+
const spanAttributes = {
|
|
175
|
+
...(options.attributes ?? {}),
|
|
176
|
+
...traceMeta,
|
|
177
|
+
};
|
|
178
|
+
if (!this.isProtocolEnabled() || options.enable === false) {
|
|
179
|
+
return Promise.resolve(callback(undefined));
|
|
180
|
+
}
|
|
181
|
+
const getter = options.getter ?? this.defaultGetter;
|
|
182
|
+
const setter = options.setter ?? this.defaultSetter;
|
|
183
|
+
let parentContext = api_1.context.active();
|
|
184
|
+
if (options.carrier) {
|
|
185
|
+
try {
|
|
186
|
+
parentContext = api_1.propagation.extract(api_1.context.active(), options.carrier, getter);
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
this.handleTraceError(err, 'extract entry context');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return api_1.trace.getTracer(this.currentTracerName).startActiveSpan(name, {
|
|
193
|
+
kind: options.kind ?? api_1.SpanKind.SERVER,
|
|
194
|
+
attributes: spanAttributes,
|
|
195
|
+
}, parentContext, async (span) => {
|
|
196
|
+
try {
|
|
197
|
+
const result = await callback(span);
|
|
198
|
+
span.setStatus({
|
|
199
|
+
code: api_1.SpanStatusCode.OK,
|
|
200
|
+
});
|
|
201
|
+
if (options.responseCarrier) {
|
|
202
|
+
try {
|
|
203
|
+
api_1.propagation.inject(api_1.context.active(), options.responseCarrier, setter);
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
this.handleTraceError(err, 'inject entry response context');
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return result;
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
span.setStatus({
|
|
213
|
+
code: api_1.SpanStatusCode.ERROR,
|
|
214
|
+
});
|
|
215
|
+
span.recordException(err);
|
|
216
|
+
throw err;
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
span.end();
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
runWithExitSpan(name, options, callback) {
|
|
224
|
+
const protocol = this.getProtocolFromAttributes(options.attributes);
|
|
225
|
+
const traceMeta = this.resolveTraceMeta(options.meta, {
|
|
226
|
+
direction: 'exit',
|
|
227
|
+
protocol,
|
|
228
|
+
spanName: name,
|
|
229
|
+
...(options.metaArgs ?? {}),
|
|
230
|
+
});
|
|
231
|
+
const spanAttributes = {
|
|
232
|
+
...(options.attributes ?? {}),
|
|
233
|
+
...traceMeta,
|
|
234
|
+
};
|
|
235
|
+
if (!this.isProtocolEnabled() || options.enable === false) {
|
|
236
|
+
return Promise.resolve(callback(undefined));
|
|
237
|
+
}
|
|
238
|
+
const setter = options.setter ?? this.defaultSetter;
|
|
239
|
+
const carrier = options.carrier ?? {};
|
|
240
|
+
return api_1.trace.getTracer(this.currentTracerName).startActiveSpan(name, {
|
|
241
|
+
kind: options.kind ?? api_1.SpanKind.CLIENT,
|
|
242
|
+
attributes: spanAttributes,
|
|
243
|
+
}, async (span) => {
|
|
244
|
+
try {
|
|
245
|
+
try {
|
|
246
|
+
api_1.propagation.inject(api_1.context.active(), carrier, setter);
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
this.handleTraceError(err, 'inject exit context');
|
|
250
|
+
}
|
|
251
|
+
const result = await callback(span);
|
|
252
|
+
span.setStatus({
|
|
253
|
+
code: api_1.SpanStatusCode.OK,
|
|
254
|
+
});
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
span.setStatus({
|
|
259
|
+
code: api_1.SpanStatusCode.ERROR,
|
|
260
|
+
});
|
|
261
|
+
span.recordException(err);
|
|
262
|
+
throw err;
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
span.end();
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
injectContext(carrier, setter) {
|
|
270
|
+
try {
|
|
271
|
+
api_1.propagation.inject(api_1.context.active(), carrier, setter ?? this.defaultSetter);
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
this.handleTraceError(err, 'inject context');
|
|
275
|
+
}
|
|
276
|
+
return carrier;
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
exports.MidwayTraceService = MidwayTraceService;
|
|
280
|
+
__decorate([
|
|
281
|
+
(0, decorator_1.MainApp)(),
|
|
282
|
+
__metadata("design:type", Object)
|
|
283
|
+
], MidwayTraceService.prototype, "app", void 0);
|
|
284
|
+
__decorate([
|
|
285
|
+
(0, decorator_1.Inject)(),
|
|
286
|
+
__metadata("design:type", decoratorService_1.MidwayDecoratorService)
|
|
287
|
+
], MidwayTraceService.prototype, "decoratorService", void 0);
|
|
288
|
+
__decorate([
|
|
289
|
+
(0, decorator_1.Config)('tracing'),
|
|
290
|
+
__metadata("design:type", Object)
|
|
291
|
+
], MidwayTraceService.prototype, "tracingOptions", void 0);
|
|
292
|
+
__decorate([
|
|
293
|
+
(0, decorator_1.Logger)('coreLogger'),
|
|
294
|
+
__metadata("design:type", Object)
|
|
295
|
+
], MidwayTraceService.prototype, "logger", void 0);
|
|
296
|
+
__decorate([
|
|
297
|
+
(0, decorator_1.Init)(),
|
|
298
|
+
__metadata("design:type", Function),
|
|
299
|
+
__metadata("design:paramtypes", []),
|
|
300
|
+
__metadata("design:returntype", void 0)
|
|
301
|
+
], MidwayTraceService.prototype, "init", null);
|
|
302
|
+
exports.MidwayTraceService = MidwayTraceService = __decorate([
|
|
303
|
+
(0, decorator_1.Provide)(),
|
|
304
|
+
(0, decorator_1.Scope)(interface_1.ScopeEnum.Singleton)
|
|
305
|
+
], MidwayTraceService);
|
|
306
|
+
//# sourceMappingURL=traceService.js.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ControllerOption } from '../decorator';
|
|
2
|
+
import { MidwayLoggerService } from './loggerService';
|
|
2
3
|
export interface RouterInfo {
|
|
3
4
|
/**
|
|
4
5
|
* uuid
|
|
@@ -104,6 +105,31 @@ export interface RouterInfo {
|
|
|
104
105
|
* version prefix for URI versioning
|
|
105
106
|
*/
|
|
106
107
|
versionPrefix?: string;
|
|
108
|
+
/**
|
|
109
|
+
* route definition source
|
|
110
|
+
*/
|
|
111
|
+
source?: 'functional' | 'decorator';
|
|
112
|
+
/**
|
|
113
|
+
* route-level ignore global prefix
|
|
114
|
+
*/
|
|
115
|
+
ignoreGlobalPrefix?: boolean;
|
|
116
|
+
}
|
|
117
|
+
export interface RouteManifestItem {
|
|
118
|
+
source: 'functional' | 'decorator';
|
|
119
|
+
operationId: string;
|
|
120
|
+
controllerId?: string;
|
|
121
|
+
controllerPrefix: string;
|
|
122
|
+
method: string;
|
|
123
|
+
path: string;
|
|
124
|
+
fullPath: string;
|
|
125
|
+
routerName?: string;
|
|
126
|
+
middlewareCount: number;
|
|
127
|
+
ignoreGlobalPrefix: boolean;
|
|
128
|
+
version?: string | string[];
|
|
129
|
+
versionType?: 'URI' | 'HEADER' | 'MEDIA_TYPE' | 'CUSTOM';
|
|
130
|
+
versionPrefix?: string;
|
|
131
|
+
summary?: string;
|
|
132
|
+
description?: string;
|
|
107
133
|
}
|
|
108
134
|
export type DynamicRouterInfo = Omit<RouterInfo, 'id' | 'method' | 'controllerId' | 'controllerMiddleware' | 'responseMetadata'>;
|
|
109
135
|
export interface RouterPriority {
|
|
@@ -126,6 +152,7 @@ export declare class MidwayWebRouterService {
|
|
|
126
152
|
private isReady;
|
|
127
153
|
protected routes: Map<string, RouterInfo[]>;
|
|
128
154
|
protected routesPriority: RouterPriority[];
|
|
155
|
+
loggerService: MidwayLoggerService;
|
|
129
156
|
constructor(options?: RouterCollectorOptions);
|
|
130
157
|
protected analyze(): Promise<void>;
|
|
131
158
|
protected analyzeController(): void;
|
|
@@ -256,6 +283,14 @@ export declare class MidwayWebRouterService {
|
|
|
256
283
|
* version prefix for URI versioning
|
|
257
284
|
*/
|
|
258
285
|
versionPrefix?: string;
|
|
286
|
+
/**
|
|
287
|
+
* route definition source
|
|
288
|
+
*/
|
|
289
|
+
source?: "functional" | "decorator";
|
|
290
|
+
/**
|
|
291
|
+
* route-level ignore global prefix
|
|
292
|
+
*/
|
|
293
|
+
ignoreGlobalPrefix?: boolean;
|
|
259
294
|
}[];
|
|
260
295
|
getRoutePriorityList(): Promise<RouterPriority[]>;
|
|
261
296
|
getRouterTable(): Promise<Map<string, RouterInfo[]>>;
|
|
@@ -263,6 +298,11 @@ export declare class MidwayWebRouterService {
|
|
|
263
298
|
compileUrlPattern?: boolean;
|
|
264
299
|
}): Promise<RouterInfo[]>;
|
|
265
300
|
getMatchedRouterInfo(routerUrl: string, method: string): Promise<RouterInfo | undefined>;
|
|
301
|
+
getRouteManifest(): Promise<RouteManifestItem[]>;
|
|
266
302
|
protected checkDuplicateAndPush(prefix: any, routerInfo: RouterInfo): void;
|
|
303
|
+
protected logRouteLoaded(routerInfo: RouterInfo): void;
|
|
304
|
+
protected getRouterHandlerIdentity(routerInfo: RouterInfo): string;
|
|
305
|
+
protected getOperationId(routeInfo: RouterInfo): string;
|
|
306
|
+
protected checkDuplicateOperationId(manifest: RouteManifestItem[]): void;
|
|
267
307
|
}
|
|
268
308
|
//# sourceMappingURL=webRouterService.d.ts.map
|