@abyss-project/monitor 1.0.58 → 1.0.60
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/frameworks/express/decorators.js +1 -2
- package/dist/frameworks/express/index.js +10 -6
- package/dist/middlewares/request-tracker.middleware.d.ts +2 -1
- package/dist/middlewares/request-tracker.middleware.js +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/utils/killable-route.utils.d.ts +3 -3
- package/dist/utils/killable-route.utils.js +2 -21
- package/dist/utils/request-tracker.utils.js +10 -6
- package/package.json +1 -1
|
@@ -90,8 +90,7 @@ exports.Middleware = Middleware;
|
|
|
90
90
|
function Middlewares(middlewares) {
|
|
91
91
|
return function (target, propertyKey) {
|
|
92
92
|
const existingMiddlewares = Reflect.getMetadata(_1.MIDDLEWARE_HOOK_WATERMARK, target) || [];
|
|
93
|
-
Reflect.defineMetadata(_1.MIDDLEWARE_HOOK_WATERMARK, [...existingMiddlewares, ...((middlewares === null || middlewares === void 0 ? void 0 : middlewares.map((middleware) => middleware.name)) || [])]
|
|
94
|
-
existingMiddlewares, target, propertyKey);
|
|
93
|
+
Reflect.defineMetadata(_1.MIDDLEWARE_HOOK_WATERMARK, [...existingMiddlewares, ...((middlewares === null || middlewares === void 0 ? void 0 : middlewares.map((middleware) => middleware.name)) || [])], target, propertyKey);
|
|
95
94
|
};
|
|
96
95
|
}
|
|
97
96
|
exports.Middlewares = Middlewares;
|
|
@@ -110,27 +110,27 @@ const controllerLoader = async (app, options) => {
|
|
|
110
110
|
case types_1.APIMethod.DELETE:
|
|
111
111
|
routerToUse.delete(path, ...(routeOptions.shouldSkipController
|
|
112
112
|
? []
|
|
113
|
-
: middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
|
|
113
|
+
: middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
|
|
114
114
|
break;
|
|
115
115
|
case types_1.APIMethod.GET:
|
|
116
116
|
routerToUse.get(path, ...(routeOptions.shouldSkipController
|
|
117
117
|
? []
|
|
118
|
-
: middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
|
|
118
|
+
: middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
|
|
119
119
|
break;
|
|
120
120
|
case types_1.APIMethod.POST:
|
|
121
121
|
routerToUse.post(path, ...(routeOptions.shouldSkipController
|
|
122
122
|
? []
|
|
123
|
-
: middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
|
|
123
|
+
: middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
|
|
124
124
|
break;
|
|
125
125
|
case types_1.APIMethod.PUT:
|
|
126
126
|
routerToUse.put(path, ...(routeOptions.shouldSkipController
|
|
127
127
|
? []
|
|
128
|
-
: middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
|
|
128
|
+
: middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
|
|
129
129
|
break;
|
|
130
130
|
case types_1.APIMethod.PATCH:
|
|
131
131
|
routerToUse.patch(path, ...(routeOptions.shouldSkipController
|
|
132
132
|
? []
|
|
133
|
-
: middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
|
|
133
|
+
: middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
|
|
134
134
|
break;
|
|
135
135
|
default:
|
|
136
136
|
console.error(`Method ${apiMethod} on route ${path} of controller ${controller} do not exist`);
|
|
@@ -166,8 +166,12 @@ const isRoute = (target, propertyKey) => {
|
|
|
166
166
|
return false;
|
|
167
167
|
}
|
|
168
168
|
};
|
|
169
|
-
const setLocalsMiddleware = (controller, options = { prefix: '/' }, controllerPrefix, path) => (req, res, next) => {
|
|
169
|
+
const setLocalsMiddleware = (controller, options = { prefix: '/' }, controllerPrefix, path, method, propertyKey) => (req, res, next) => {
|
|
170
170
|
res.locals.controller = controller.name;
|
|
171
171
|
res.locals.path = `${options.prefix}${controllerPrefix}${path !== null ? path || req.path : ''}`;
|
|
172
|
+
if (propertyKey) {
|
|
173
|
+
const isKillable = Reflect.getMetadata(metadata_1.KILLABLE_WATERMARK, controller.prototype, propertyKey);
|
|
174
|
+
res.locals.isKillable = !!isKillable;
|
|
175
|
+
}
|
|
172
176
|
next();
|
|
173
177
|
};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Request, Response, NextFunction } from 'express-serve-static-core';
|
|
2
2
|
import { Logger } from '../models/logger.model';
|
|
3
|
+
import { IMonitorLocals } from '../types';
|
|
3
4
|
export type IsKillableFn = (req: Request) => boolean;
|
|
4
5
|
export interface RequestTrackerOptions {
|
|
5
6
|
logger?: Logger;
|
|
6
7
|
isKillable?: IsKillableFn;
|
|
7
8
|
}
|
|
8
|
-
export declare const createRequestTrackerMiddleware: (options?: RequestTrackerOptions) => (req: Request, res: Response, next: NextFunction) => void;
|
|
9
|
+
export declare const createRequestTrackerMiddleware: (options?: RequestTrackerOptions) => (req: Request, res: Response<unknown, IMonitorLocals>, next: NextFunction) => void;
|
|
@@ -7,7 +7,7 @@ const killable_route_utils_1 = require("../utils/killable-route.utils");
|
|
|
7
7
|
const createRequestTrackerMiddleware = (options) => {
|
|
8
8
|
const { logger, isKillable } = options || {};
|
|
9
9
|
return (req, res, next) => {
|
|
10
|
-
const requestIsKillable = isKillable ? isKillable(req) : (0, killable_route_utils_1.isRouteKillable)(
|
|
10
|
+
const requestIsKillable = isKillable ? isKillable(req) : (0, killable_route_utils_1.isRouteKillable)(res);
|
|
11
11
|
if ((0, request_tracker_utils_1.getIsShuttingDown)()) {
|
|
12
12
|
res.status(503).json({
|
|
13
13
|
errorCode: graceful_shutdown_types_1.GracefulShutdownErrorCode.SERVICE_UNAVAILABLE,
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import '
|
|
2
|
-
import {
|
|
3
|
-
export declare const isRouteKillable: (
|
|
1
|
+
import { Response } from 'express-serve-static-core';
|
|
2
|
+
import { IMonitorLocals } from '../types';
|
|
3
|
+
export declare const isRouteKillable: (res: Response<unknown, IMonitorLocals>) => boolean;
|
|
@@ -1,26 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isRouteKillable = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const isRouteKillable = (req) => {
|
|
7
|
-
const route = req.route;
|
|
8
|
-
if (!route || !route.stack || route.stack.length === 0) {
|
|
9
|
-
return false;
|
|
10
|
-
}
|
|
11
|
-
for (const layer of route.stack) {
|
|
12
|
-
const handler = layer.handle;
|
|
13
|
-
if (!handler)
|
|
14
|
-
continue;
|
|
15
|
-
const prototype = Object.getPrototypeOf(handler);
|
|
16
|
-
if (prototype && prototype.constructor) {
|
|
17
|
-
const propertyKey = handler.name;
|
|
18
|
-
const isKillable = Reflect.getMetadata(metadata_1.KILLABLE_WATERMARK, prototype.constructor.prototype, propertyKey);
|
|
19
|
-
if (isKillable) {
|
|
20
|
-
return true;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return false;
|
|
4
|
+
const isRouteKillable = (res) => {
|
|
5
|
+
return res.locals.isKillable === true;
|
|
25
6
|
};
|
|
26
7
|
exports.isRouteKillable = isRouteKillable;
|
|
@@ -37,8 +37,10 @@ const decrementActiveRequests = (isKillable = false) => {
|
|
|
37
37
|
exports.decrementActiveRequests = decrementActiveRequests;
|
|
38
38
|
const waitForActiveRequests = async (timeout = 30000, checkInterval = 100, logger) => {
|
|
39
39
|
const startTime = Date.now();
|
|
40
|
+
let checkCount = 0;
|
|
40
41
|
return new Promise((resolve, reject) => {
|
|
41
42
|
const check = () => {
|
|
43
|
+
checkCount++;
|
|
42
44
|
if (activeRequests === 0) {
|
|
43
45
|
logger === null || logger === void 0 ? void 0 : logger.log('All active requests completed');
|
|
44
46
|
resolve();
|
|
@@ -56,12 +58,14 @@ const waitForActiveRequests = async (timeout = 30000, checkInterval = 100, logge
|
|
|
56
58
|
reject(new Error(errorMessage));
|
|
57
59
|
return;
|
|
58
60
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
if (checkCount % 10 === 0) {
|
|
62
|
+
logger === null || logger === void 0 ? void 0 : logger.debug(`Waiting for ${activeRequests} active requests to complete...`, {
|
|
63
|
+
data: {
|
|
64
|
+
activeRequests,
|
|
65
|
+
elapsedMs: Date.now() - startTime,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
}
|
|
65
69
|
setTimeout(check, checkInterval);
|
|
66
70
|
};
|
|
67
71
|
check();
|