@grandlinex/kernel 1.3.7 → 1.3.9

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.
@@ -1,12 +1,13 @@
1
1
  import { CoreKernel, CoreLogger } from '@grandlinex/core';
2
2
  import { ICClient, IKernel } from './lib/index.js';
3
- import { XRequest } from './lib/express.js';
3
+ import { BaseKernelMetric } from './classes/index.js';
4
4
  /**
5
5
  * @class Kernel
6
6
  */
7
7
  export default class Kernel extends CoreKernel<ICClient> implements IKernel {
8
8
  private expressPort;
9
9
  private readonly apiVersion;
10
+ protected metric: BaseKernelMetric<unknown> | null;
10
11
  /**
11
12
  * Default Constructor
12
13
  * @param options App Name
@@ -24,8 +25,5 @@ export default class Kernel extends CoreKernel<ICClient> implements IKernel {
24
25
  getAppServerPort(): number;
25
26
  setAppServerPort(port: number): void;
26
27
  getApiVersion(): number;
27
- responseCodeFunction(data: {
28
- code: number;
29
- req: XRequest;
30
- }): void;
28
+ getMetric(): BaseKernelMetric<unknown> | null;
31
29
  }
@@ -16,6 +16,7 @@ class Kernel extends core_1.CoreKernel {
16
16
  */
17
17
  constructor(options) {
18
18
  super({ ...options });
19
+ this.metric = null;
19
20
  this.apiVersion = options.apiVersion ?? 1;
20
21
  this.setBaseModule(new KernelModule_js_1.default(this));
21
22
  if (options.portOverride) {
@@ -39,11 +40,8 @@ class Kernel extends core_1.CoreKernel {
39
40
  getApiVersion() {
40
41
  return this.apiVersion;
41
42
  }
42
- responseCodeFunction(data) {
43
- const { code } = data;
44
- if (code < 200 || code >= 300) {
45
- this.debug(data.req.path, data.req.ip, data.code);
46
- }
43
+ getMetric() {
44
+ return this.metric;
47
45
  }
48
46
  }
49
47
  exports.default = Kernel;
@@ -15,7 +15,7 @@ class BaseAction extends core_1.CoreAction {
15
15
  static validateSchema(error, inputSchema, key, field, required = true) {
16
16
  let schema;
17
17
  if ((0, core_1.instanceOfEntity)(inputSchema)) {
18
- schema = swagger_mate_1.SPathUtil.schemaFromEntity(inputSchema);
18
+ schema = swagger_mate_1.ESchemaEditor.schemaFromEntity(inputSchema);
19
19
  }
20
20
  else {
21
21
  schema = inputSchema;
@@ -118,6 +118,21 @@ class BaseAction extends core_1.CoreAction {
118
118
  });
119
119
  }
120
120
  async secureHandler(req, res, next) {
121
+ const metric = this.getKernel().getMetric();
122
+ if (metric) {
123
+ const end = metric.start({
124
+ req,
125
+ action: this,
126
+ });
127
+ if (end) {
128
+ res.on('finish', () => metric.end({
129
+ started: end,
130
+ req,
131
+ res,
132
+ action: this,
133
+ }));
134
+ }
135
+ }
121
136
  const xPath = {};
122
137
  Object.entries(req.params).forEach(([k, v]) => {
123
138
  if (typeof v === 'string') {
@@ -132,12 +147,6 @@ class BaseAction extends core_1.CoreAction {
132
147
  });
133
148
  const extension = this.initExtension(res);
134
149
  const auth = extension.timing.start('auth');
135
- res.on('finish', () => {
136
- this.getKernel().responseCodeFunction({
137
- code: res.statusCode,
138
- req,
139
- });
140
- });
141
150
  const cc = this.getKernel().getCryptoClient();
142
151
  if (!cc) {
143
152
  res.status(504).send('internal server error');
@@ -0,0 +1,14 @@
1
+ import { XRequest, XResponse } from '../lib/express.js';
2
+ import BaseAction from './BaseAction.js';
3
+ export type MetricEventStart = {
4
+ req: XRequest;
5
+ action: BaseAction;
6
+ };
7
+ export type MetricEventEnd<T> = MetricEventStart & {
8
+ started: T;
9
+ res: XResponse;
10
+ };
11
+ export declare abstract class BaseKernelMetric<T> {
12
+ abstract start(event: MetricEventStart): T | null;
13
+ abstract end(event: MetricEventEnd<T>): void;
14
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseKernelMetric = void 0;
4
+ class BaseKernelMetric {
5
+ }
6
+ exports.BaseKernelMetric = BaseKernelMetric;
@@ -5,6 +5,7 @@ import BaseKernelModule from './BaseKernelModule.js';
5
5
  import BaseApiAction from './BaseApiAction.js';
6
6
  import RouteApiAction from './RouteApiAction.js';
7
7
  import BaseAuthProvider from './BaseAuthProvider.js';
8
+ export * from './BaseKernelMetric.js';
8
9
  export * from './BaseAction.js';
9
10
  export * from './BaseUserAgent.js';
10
11
  export * from './BaseAuthProvider.js';
@@ -60,6 +60,7 @@ const RouteApiAction_js_1 = __importDefault(require("./RouteApiAction.js"));
60
60
  exports.RouteApiAction = RouteApiAction_js_1.default;
61
61
  const BaseAuthProvider_js_1 = __importDefault(require("./BaseAuthProvider.js"));
62
62
  exports.BaseAuthProvider = BaseAuthProvider_js_1.default;
63
+ __exportStar(require("./BaseKernelMetric.js"), exports);
63
64
  __exportStar(require("./BaseAction.js"), exports);
64
65
  __exportStar(require("./BaseUserAgent.js"), exports);
65
66
  __exportStar(require("./BaseAuthProvider.js"), exports);
@@ -3,6 +3,7 @@ import express from 'express';
3
3
  import * as jwt from 'jsonwebtoken';
4
4
  import { IAuthProvider, JwtExtend, JwtToken } from '../classes/index.js';
5
5
  import { XActionEvent, XRequest } from './express.js';
6
+ import { BaseKernelMetric } from '../classes/BaseKernelMetric.js';
6
7
  /**
7
8
  * Represents a request for validating a JWT token with optional constraints.
8
9
  *
@@ -83,10 +84,7 @@ export interface IKernel<T extends JwtExtend = JwtExtend> extends ICoreKernel<IC
83
84
  getAppServerPort(): number;
84
85
  getApiVersion(): number;
85
86
  setAppServerPort(port: number): void;
86
- responseCodeFunction(data: {
87
- code: number;
88
- req: XRequest;
89
- }): void;
87
+ getMetric(): BaseKernelMetric<any> | null;
90
88
  }
91
89
  export type IBaseKernelModule<K extends IKernel = IKernel, T extends IDataBase<any, any> | null = any, P extends IBaseClient | null = any, C extends IBaseCache | null = any, E extends IBasePresenter | null = any> = ICoreKernelModule<K, T, P, C, E>;
92
90
  export type IBasePresenter = ICorePresenter<express.Express>;
@@ -1,12 +1,13 @@
1
1
  import { CoreKernel, CoreLogger } from '@grandlinex/core';
2
2
  import { ICClient, IKernel } from './lib/index.js';
3
- import { XRequest } from './lib/express.js';
3
+ import { BaseKernelMetric } from './classes/index.js';
4
4
  /**
5
5
  * @class Kernel
6
6
  */
7
7
  export default class Kernel extends CoreKernel<ICClient> implements IKernel {
8
8
  private expressPort;
9
9
  private readonly apiVersion;
10
+ protected metric: BaseKernelMetric<unknown> | null;
10
11
  /**
11
12
  * Default Constructor
12
13
  * @param options App Name
@@ -24,8 +25,5 @@ export default class Kernel extends CoreKernel<ICClient> implements IKernel {
24
25
  getAppServerPort(): number;
25
26
  setAppServerPort(port: number): void;
26
27
  getApiVersion(): number;
27
- responseCodeFunction(data: {
28
- code: number;
29
- req: XRequest;
30
- }): void;
28
+ getMetric(): BaseKernelMetric<unknown> | null;
31
29
  }
@@ -11,6 +11,7 @@ export default class Kernel extends CoreKernel {
11
11
  */
12
12
  constructor(options) {
13
13
  super({ ...options });
14
+ this.metric = null;
14
15
  this.apiVersion = options.apiVersion ?? 1;
15
16
  this.setBaseModule(new KernelModule(this));
16
17
  if (options.portOverride) {
@@ -34,10 +35,7 @@ export default class Kernel extends CoreKernel {
34
35
  getApiVersion() {
35
36
  return this.apiVersion;
36
37
  }
37
- responseCodeFunction(data) {
38
- const { code } = data;
39
- if (code < 200 || code >= 300) {
40
- this.debug(data.req.path, data.req.ip, data.code);
41
- }
38
+ getMetric() {
39
+ return this.metric;
42
40
  }
43
41
  }
@@ -1,5 +1,5 @@
1
1
  import { CoreAction, instanceOfEntity, } from '@grandlinex/core';
2
- import { ActionMode, isErrorType, isSwaggerRef, SPathUtil, } from '@grandlinex/swagger-mate';
2
+ import { ActionMode, ESchemaEditor, isErrorType, isSwaggerRef, } from '@grandlinex/swagger-mate';
3
3
  import { ExpressServerTiming } from './timing/index.js';
4
4
  import { BaseUserAgent } from './BaseUserAgent.js';
5
5
  export default class BaseAction extends CoreAction {
@@ -13,7 +13,7 @@ export default class BaseAction extends CoreAction {
13
13
  static validateSchema(error, inputSchema, key, field, required = true) {
14
14
  let schema;
15
15
  if (instanceOfEntity(inputSchema)) {
16
- schema = SPathUtil.schemaFromEntity(inputSchema);
16
+ schema = ESchemaEditor.schemaFromEntity(inputSchema);
17
17
  }
18
18
  else {
19
19
  schema = inputSchema;
@@ -116,6 +116,21 @@ export default class BaseAction extends CoreAction {
116
116
  });
117
117
  }
118
118
  async secureHandler(req, res, next) {
119
+ const metric = this.getKernel().getMetric();
120
+ if (metric) {
121
+ const end = metric.start({
122
+ req,
123
+ action: this,
124
+ });
125
+ if (end) {
126
+ res.on('finish', () => metric.end({
127
+ started: end,
128
+ req,
129
+ res,
130
+ action: this,
131
+ }));
132
+ }
133
+ }
119
134
  const xPath = {};
120
135
  Object.entries(req.params).forEach(([k, v]) => {
121
136
  if (typeof v === 'string') {
@@ -130,12 +145,6 @@ export default class BaseAction extends CoreAction {
130
145
  });
131
146
  const extension = this.initExtension(res);
132
147
  const auth = extension.timing.start('auth');
133
- res.on('finish', () => {
134
- this.getKernel().responseCodeFunction({
135
- code: res.statusCode,
136
- req,
137
- });
138
- });
139
148
  const cc = this.getKernel().getCryptoClient();
140
149
  if (!cc) {
141
150
  res.status(504).send('internal server error');
@@ -0,0 +1,14 @@
1
+ import { XRequest, XResponse } from '../lib/express.js';
2
+ import BaseAction from './BaseAction.js';
3
+ export type MetricEventStart = {
4
+ req: XRequest;
5
+ action: BaseAction;
6
+ };
7
+ export type MetricEventEnd<T> = MetricEventStart & {
8
+ started: T;
9
+ res: XResponse;
10
+ };
11
+ export declare abstract class BaseKernelMetric<T> {
12
+ abstract start(event: MetricEventStart): T | null;
13
+ abstract end(event: MetricEventEnd<T>): void;
14
+ }
@@ -0,0 +1,2 @@
1
+ export class BaseKernelMetric {
2
+ }
@@ -5,6 +5,7 @@ import BaseKernelModule from './BaseKernelModule.js';
5
5
  import BaseApiAction from './BaseApiAction.js';
6
6
  import RouteApiAction from './RouteApiAction.js';
7
7
  import BaseAuthProvider from './BaseAuthProvider.js';
8
+ export * from './BaseKernelMetric.js';
8
9
  export * from './BaseAction.js';
9
10
  export * from './BaseUserAgent.js';
10
11
  export * from './BaseAuthProvider.js';
@@ -5,6 +5,7 @@ import BaseKernelModule from './BaseKernelModule.js';
5
5
  import BaseApiAction from './BaseApiAction.js';
6
6
  import RouteApiAction from './RouteApiAction.js';
7
7
  import BaseAuthProvider from './BaseAuthProvider.js';
8
+ export * from './BaseKernelMetric.js';
8
9
  export * from './BaseAction.js';
9
10
  export * from './BaseUserAgent.js';
10
11
  export * from './BaseAuthProvider.js';
@@ -3,6 +3,7 @@ import express from 'express';
3
3
  import * as jwt from 'jsonwebtoken';
4
4
  import { IAuthProvider, JwtExtend, JwtToken } from '../classes/index.js';
5
5
  import { XActionEvent, XRequest } from './express.js';
6
+ import { BaseKernelMetric } from '../classes/BaseKernelMetric.js';
6
7
  /**
7
8
  * Represents a request for validating a JWT token with optional constraints.
8
9
  *
@@ -83,10 +84,7 @@ export interface IKernel<T extends JwtExtend = JwtExtend> extends ICoreKernel<IC
83
84
  getAppServerPort(): number;
84
85
  getApiVersion(): number;
85
86
  setAppServerPort(port: number): void;
86
- responseCodeFunction(data: {
87
- code: number;
88
- req: XRequest;
89
- }): void;
87
+ getMetric(): BaseKernelMetric<any> | null;
90
88
  }
91
89
  export type IBaseKernelModule<K extends IKernel = IKernel, T extends IDataBase<any, any> | null = any, P extends IBaseClient | null = any, C extends IBaseCache | null = any, E extends IBasePresenter | null = any> = ICoreKernelModule<K, T, P, C, E>;
92
90
  export type IBasePresenter = ICorePresenter<express.Express>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grandlinex/kernel",
3
- "version": "1.3.7",
3
+ "version": "1.3.9",
4
4
  "description": "GrandLineX is an out-of-the-box server framework on top of ExpressJs.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -47,7 +47,7 @@
47
47
  "license": "BSD-3-Clause",
48
48
  "dependencies": {
49
49
  "@grandlinex/core": "1.3.1",
50
- "@grandlinex/swagger-mate": "1.3.8",
50
+ "@grandlinex/swagger-mate": "1.3.9",
51
51
  "@types/jsonwebtoken": "9.0.10",
52
52
  "@types/ms": "2.1.0",
53
53
  "body-parser": "2.2.1",