@abyss-project/monitor 1.0.59 → 1.0.61

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.
@@ -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)(req);
10
+ const requestIsKillable = isKillable ? isKillable(req) : (0, killable_route_utils_1.isRouteKillable)(res);
11
11
  logger === null || logger === void 0 ? void 0 : logger.info(`Incoming request ${req.method} ${req.url} killable: ${requestIsKillable}`);
12
12
  if ((0, request_tracker_utils_1.getIsShuttingDown)()) {
13
13
  res.status(503).json({
@@ -16,4 +16,5 @@ export type IMonitorLocals = {
16
16
  path?: string;
17
17
  error?: any;
18
18
  timer: IMonitorTimerLocals;
19
+ isKillable?: boolean;
19
20
  };
@@ -1,3 +1,3 @@
1
- import 'reflect-metadata';
2
- import { Request } from 'express-serve-static-core';
3
- export declare const isRouteKillable: (req: Request) => boolean;
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
- require("reflect-metadata");
5
- const metadata_1 = require("../frameworks/express/metadata");
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
- logger === null || logger === void 0 ? void 0 : logger.debug(`Waiting for ${activeRequests} active requests to complete...`, {
60
- data: {
61
- activeRequests,
62
- elapsedMs: Date.now() - startTime,
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();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abyss-project/monitor",
3
- "version": "1.0.59",
3
+ "version": "1.0.61",
4
4
  "description": "Core package to interact with Abyss-Monitor",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",