@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.
Files changed (44) hide show
  1. package/dist/baseFramework.js +18 -1
  2. package/dist/common/asyncContextManager.js +0 -1
  3. package/dist/common/dataSourceManager.d.ts +1 -1
  4. package/dist/common/fileDetector.d.ts +1 -0
  5. package/dist/common/fileDetector.js +26 -0
  6. package/dist/common/webGenerator.js +3 -1
  7. package/dist/config/config.default.d.ts +2 -2
  8. package/dist/config/config.default.js +6 -1
  9. package/dist/context/componentLoader.js +1 -1
  10. package/dist/context/container.js +7 -0
  11. package/dist/decorator/common/tracer.d.ts +9 -0
  12. package/dist/decorator/common/tracer.js +18 -0
  13. package/dist/decorator/constant.d.ts +1 -0
  14. package/dist/decorator/constant.js +2 -1
  15. package/dist/decorator/index.d.ts +1 -0
  16. package/dist/decorator/index.js +1 -0
  17. package/dist/decorator/metadataManager.js +0 -2
  18. package/dist/decorator/web/requestMapping.d.ts +4 -0
  19. package/dist/decorator/web/requestMapping.js +14 -3
  20. package/dist/error/framework.d.ts +13 -1
  21. package/dist/error/framework.js +3 -1
  22. package/dist/functional/adapter.d.ts +4 -0
  23. package/dist/functional/adapter.js +7 -0
  24. package/dist/functional/api.d.ts +68 -0
  25. package/dist/functional/api.js +262 -0
  26. package/dist/functional/constants.d.ts +3 -0
  27. package/dist/functional/constants.js +6 -0
  28. package/dist/functional/hooks.js +0 -1
  29. package/dist/functional/index.d.ts +3 -0
  30. package/dist/functional/index.js +7 -1
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.js +3 -1
  33. package/dist/interface.d.ts +29 -3
  34. package/dist/interface.js +1 -1
  35. package/dist/service/configService.js +0 -1
  36. package/dist/service/lifeCycleService.js +3 -1
  37. package/dist/service/traceService.d.ts +49 -0
  38. package/dist/service/traceService.js +306 -0
  39. package/dist/service/webRouterService.d.ts +40 -0
  40. package/dist/service/webRouterService.js +197 -45
  41. package/dist/setup.js +4 -0
  42. package/dist/util/index.d.ts +1 -0
  43. package/dist/util/index.js +78 -2
  44. 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