@mondart/nestjs-common-module-core 3.2.7 → 3.2.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.
- package/README.md +11 -0
- package/dist/decorators/validations/index.d.ts +1 -0
- package/dist/decorators/validations/index.d.ts.map +1 -1
- package/dist/decorators/validations/index.js +1 -0
- package/dist/decorators/validations/index.js.map +1 -1
- package/dist/decorators/validations/sanitize-html.decorator.d.ts +3 -0
- package/dist/decorators/validations/sanitize-html.decorator.d.ts.map +1 -0
- package/dist/decorators/validations/sanitize-html.decorator.js +11 -0
- package/dist/decorators/validations/sanitize-html.decorator.js.map +1 -0
- package/dist/filters/global-exception.filter.d.ts +3 -1
- package/dist/filters/global-exception.filter.d.ts.map +1 -1
- package/dist/filters/global-exception.filter.js +27 -5
- package/dist/filters/global-exception.filter.js.map +1 -1
- package/dist/helpers/graceful-shutdown.helper.d.ts +15 -0
- package/dist/helpers/graceful-shutdown.helper.d.ts.map +1 -1
- package/dist/helpers/graceful-shutdown.helper.js +165 -3
- package/dist/helpers/graceful-shutdown.helper.js.map +1 -1
- package/dist/helpers/html-sanitizer.helper.d.ts +3 -0
- package/dist/helpers/html-sanitizer.helper.d.ts.map +1 -0
- package/dist/helpers/html-sanitizer.helper.js +31 -0
- package/dist/helpers/html-sanitizer.helper.js.map +1 -0
- package/dist/helpers/index.d.ts +1 -0
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/index.js +1 -0
- package/dist/helpers/index.js.map +1 -1
- package/package.json +12 -8
package/README.md
CHANGED
|
@@ -23,6 +23,14 @@ app.useGlobalPipes(new I18nValidationPipe(validationOptions));
|
|
|
23
23
|
app.useGlobalFilters(new GlobalExceptionFilter(true)); // true = report to Sentry
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
+
By default, Sentry reporting ignores HTTP status codes `400`, `401`, `403`,
|
|
27
|
+
`404`, and `422`. Pass a second argument to replace that list (including an
|
|
28
|
+
empty array to report every non-validation exception):
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
app.useGlobalFilters(new GlobalExceptionFilter(true, [400, 404]));
|
|
32
|
+
```
|
|
33
|
+
|
|
26
34
|
`GlobalExceptionFilter` catches everything — Nest's built-in exceptions,
|
|
27
35
|
package-local exceptions (e.g. `TooManyRequestsException`), plain errors, and
|
|
28
36
|
`I18nValidationException` — and always responds with the same `ErrorResponse`
|
|
@@ -231,6 +239,9 @@ On `SIGTERM` or `SIGINT`, the helper rejects new requests with `503` and a
|
|
|
231
239
|
Kafka, queue, and database shutdown hooks run. Configure the container stop
|
|
232
240
|
grace period above that deadline (the Swarm deployment uses two minutes).
|
|
233
241
|
Do not register Nest's default shutdown signal handlers alongside this helper.
|
|
242
|
+
During `app.close()`, the helper suppresses only ioredis's known
|
|
243
|
+
`Connection is closed.` rejection caused by an already-closing Bull connection;
|
|
244
|
+
any other unhandled shutdown rejection is logged and produces a failed exit.
|
|
234
245
|
|
|
235
246
|
## Kafka-related exports
|
|
236
247
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/decorators/validations/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/decorators/validations/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC"}
|
|
@@ -19,4 +19,5 @@ __exportStar(require("./is-id.decorator"), exports);
|
|
|
19
19
|
__exportStar(require("./is-not-empty-string.decorator"), exports);
|
|
20
20
|
__exportStar(require("./is-one-of-property.decorator"), exports);
|
|
21
21
|
__exportStar(require("./depend-on-property.decorator"), exports);
|
|
22
|
+
__exportStar(require("./sanitize-html.decorator"), exports);
|
|
22
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/decorators/validations/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,oDAAkC;AAClC,kEAAgD;AAChD,iEAA+C;AAC/C,iEAA+C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/decorators/validations/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,oDAAkC;AAClC,kEAAgD;AAChD,iEAA+C;AAC/C,iEAA+C;AAC/C,4DAA0C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize-html.decorator.d.ts","sourceRoot":"","sources":["../../../src/decorators/validations/sanitize-html.decorator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9C,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,iBAAiB,CAIlE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SanitizeHtml = SanitizeHtml;
|
|
4
|
+
const class_transformer_1 = require("class-transformer");
|
|
5
|
+
const helpers_1 = require("../../helpers");
|
|
6
|
+
function SanitizeHtml(options) {
|
|
7
|
+
return (0, class_transformer_1.Transform)(({ value }) => (0, helpers_1.sanitizeHtml)(value, options), {
|
|
8
|
+
toClassOnly: true,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=sanitize-html.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize-html.decorator.js","sourceRoot":"","sources":["../../../src/decorators/validations/sanitize-html.decorator.ts"],"names":[],"mappings":";;AAIA,oCAIC;AARD,yDAA8C;AAE9C,2CAA6C;AAE7C,SAAgB,YAAY,CAAC,OAAkB;IAC7C,OAAO,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAA,sBAAY,EAAC,KAAK,EAAE,OAAO,CAAC,EAAE;QAC5D,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -3,10 +3,12 @@ import { Response } from 'express';
|
|
|
3
3
|
export declare class GlobalExceptionFilter implements ExceptionFilter {
|
|
4
4
|
private readonly logger;
|
|
5
5
|
private readonly sentryEnable;
|
|
6
|
-
|
|
6
|
+
private readonly sentryIgnoredExceptionCodes;
|
|
7
|
+
constructor(sentryEnable?: boolean, sentryIgnoredExceptionCodes?: readonly number[]);
|
|
7
8
|
catch(exception: any, host: ArgumentsHost): import("rxjs").Observable<never> | Response<any, Record<string, any>>;
|
|
8
9
|
private isObject;
|
|
9
10
|
private isArray;
|
|
11
|
+
private isExpectedHealthCheckFailure;
|
|
10
12
|
private handleI18nValidationException;
|
|
11
13
|
private flattenValidationErrors;
|
|
12
14
|
private translateValidationConstraints;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-exception.filter.d.ts","sourceRoot":"","sources":["../../src/filters/global-exception.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEb,eAAe,EAKhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"global-exception.filter.d.ts","sourceRoot":"","sources":["../../src/filters/global-exception.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEb,eAAe,EAKhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAmCnC,qBACa,qBAAsB,YAAW,eAAe;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAEpB;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAsB;gBAOhE,YAAY,GAAE,OAAe,EAC7B,2BAA2B,GAAE,SAAS,MAAM,EACX;IAMnC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa;IAyIzC,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,4BAA4B;IAoBpC,OAAO,CAAC,6BAA6B;IA4BrC,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,8BAA8B;IAatC,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,kBAAkB;CAiC3B"}
|
|
@@ -52,20 +52,32 @@ const exceptions = __importStar(require("@nestjs/common/exceptions"));
|
|
|
52
52
|
const customExceptions = __importStar(require("../exceptions"));
|
|
53
53
|
const Sentry = __importStar(require("@sentry/nestjs"));
|
|
54
54
|
const nestjs_i18n_1 = require("nestjs-i18n");
|
|
55
|
+
const DEFAULT_IGNORED_EXCEPTION_CODES = [
|
|
56
|
+
common_1.HttpStatus.BAD_REQUEST,
|
|
57
|
+
common_1.HttpStatus.UNAUTHORIZED,
|
|
58
|
+
common_1.HttpStatus.FORBIDDEN,
|
|
59
|
+
common_1.HttpStatus.NOT_FOUND,
|
|
60
|
+
common_1.HttpStatus.UNPROCESSABLE_ENTITY,
|
|
61
|
+
];
|
|
55
62
|
let GlobalExceptionFilter = class GlobalExceptionFilter {
|
|
56
|
-
constructor(sentryEnable = false) {
|
|
63
|
+
constructor(sentryEnable = false, sentryIgnoredExceptionCodes = DEFAULT_IGNORED_EXCEPTION_CODES) {
|
|
57
64
|
this.logger = new common_1.Logger('GlobalExceptionFilter', {
|
|
58
65
|
timestamp: true,
|
|
59
66
|
});
|
|
60
67
|
this.sentryEnable = sentryEnable;
|
|
68
|
+
this.sentryIgnoredExceptionCodes = new Set(sentryIgnoredExceptionCodes);
|
|
61
69
|
}
|
|
62
70
|
catch(exception, host) {
|
|
63
71
|
const type = host?.getType();
|
|
64
72
|
const isI18nValidationException = exception instanceof nestjs_i18n_1.I18nValidationException;
|
|
73
|
+
const isExpectedHealthCheckFailure = this.isExpectedHealthCheckFailure(exception, host);
|
|
65
74
|
const messageKey = isI18nValidationException
|
|
66
75
|
? undefined
|
|
67
76
|
: this.translateException(exception, host);
|
|
68
|
-
if (this.sentryEnable &&
|
|
77
|
+
if (this.sentryEnable &&
|
|
78
|
+
!isI18nValidationException &&
|
|
79
|
+
!isExpectedHealthCheckFailure &&
|
|
80
|
+
!this.sentryIgnoredExceptionCodes.has(exception?.getStatus?.()))
|
|
69
81
|
Sentry.captureException(exception, exception?.response);
|
|
70
82
|
const context = host.switchToHttp();
|
|
71
83
|
const message = typeof exception?.message === 'string'
|
|
@@ -78,8 +90,10 @@ let GlobalExceptionFilter = class GlobalExceptionFilter {
|
|
|
78
90
|
exception?.message?.length !== 0)
|
|
79
91
|
? JSON.stringify(exception?.message)
|
|
80
92
|
: 'Unknown exception occurred.';
|
|
81
|
-
|
|
82
|
-
|
|
93
|
+
if (!isExpectedHealthCheckFailure) {
|
|
94
|
+
this.logger.error(`exceptionName: ${exception?.name} - ${message}`);
|
|
95
|
+
this.logger.debug(exception?.stack);
|
|
96
|
+
}
|
|
83
97
|
const nestExceptionsArray = Object.values(exceptions);
|
|
84
98
|
const customExceptionsArray = Object.values(customExceptions);
|
|
85
99
|
const exceptionsName = [
|
|
@@ -161,6 +175,14 @@ let GlobalExceptionFilter = class GlobalExceptionFilter {
|
|
|
161
175
|
isArray(value) {
|
|
162
176
|
return value !== null && typeof value === 'object' && Array.isArray(value);
|
|
163
177
|
}
|
|
178
|
+
isExpectedHealthCheckFailure(exception, host) {
|
|
179
|
+
if (host?.getType() !== 'http' || exception?.getStatus?.() !== 503) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
const request = host.switchToHttp().getRequest();
|
|
183
|
+
const path = request?.originalUrl ?? request?.url ?? '';
|
|
184
|
+
return /\/health-check\/(?:live|ready|database|http|redis|bull|kafka)(?:[/?#]|$)/.test(path);
|
|
185
|
+
}
|
|
164
186
|
handleI18nValidationException(exception, host, response) {
|
|
165
187
|
const i18n = nestjs_i18n_1.I18nContext.current(host) ?? nestjs_i18n_1.I18nContext.current();
|
|
166
188
|
const status = exception.getStatus?.() ?? common_1.HttpStatus.BAD_REQUEST;
|
|
@@ -226,6 +248,6 @@ let GlobalExceptionFilter = class GlobalExceptionFilter {
|
|
|
226
248
|
exports.GlobalExceptionFilter = GlobalExceptionFilter;
|
|
227
249
|
exports.GlobalExceptionFilter = GlobalExceptionFilter = __decorate([
|
|
228
250
|
(0, common_1.Catch)(),
|
|
229
|
-
__metadata("design:paramtypes", [Boolean])
|
|
251
|
+
__metadata("design:paramtypes", [Boolean, Array])
|
|
230
252
|
], GlobalExceptionFilter);
|
|
231
253
|
//# sourceMappingURL=global-exception.filter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-exception.filter.js","sourceRoot":"","sources":["../../src/filters/global-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAQwB;AAExB,+BAAkC;AAClC,gCAAuC;AACvC,oCAAgE;AAChE,wCAIoB;AACpB,sEAAwD;AACxD,gEAAkD;AAClD,uDAAyC;AACzC,6CAIqB;
|
|
1
|
+
{"version":3,"file":"global-exception.filter.js","sourceRoot":"","sources":["../../src/filters/global-exception.filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,13 +3,28 @@ export interface GracefulShutdownOptions {
|
|
|
3
3
|
timeoutMs?: number;
|
|
4
4
|
signals?: NodeJS.Signals[];
|
|
5
5
|
logger?: Pick<Logger, 'log' | 'warn' | 'error'>;
|
|
6
|
+
autoDiscoverParticipants?: boolean;
|
|
7
|
+
participants?: GracefulShutdownParticipant[];
|
|
8
|
+
}
|
|
9
|
+
export interface GracefulShutdownParticipant {
|
|
10
|
+
readonly name: string;
|
|
11
|
+
stopAccepting(): void | Promise<void>;
|
|
12
|
+
waitForIdle?(): void | Promise<void>;
|
|
6
13
|
}
|
|
7
14
|
export interface GracefulShutdownController {
|
|
8
15
|
readonly isDraining: () => boolean;
|
|
9
16
|
readonly activeRequests: () => number;
|
|
17
|
+
readonly activeHandlers: () => number;
|
|
10
18
|
shutdown(signal?: NodeJS.Signals): Promise<void>;
|
|
11
19
|
}
|
|
12
20
|
export declare class GracefulShutdownHelper {
|
|
21
|
+
private static isExpectedRedisShutdownError;
|
|
13
22
|
static enable(app: INestApplication, options?: GracefulShutdownOptions): GracefulShutdownController;
|
|
23
|
+
private static discoverParticipants;
|
|
24
|
+
private static getProviderInstances;
|
|
25
|
+
private static isClosable;
|
|
26
|
+
private static isSchedulerRegistry;
|
|
27
|
+
private static uniqueParticipants;
|
|
28
|
+
private static waitUntil;
|
|
14
29
|
}
|
|
15
30
|
//# sourceMappingURL=graceful-shutdown.helper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graceful-shutdown.helper.d.ts","sourceRoot":"","sources":["../../src/helpers/graceful-shutdown.helper.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"graceful-shutdown.helper.d.ts","sourceRoot":"","sources":["../../src/helpers/graceful-shutdown.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,gBAAgB,EAChB,MAAM,EAGP,MAAM,gBAAgB,CAAC;AAYxB,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAChD,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,YAAY,CAAC,EAAE,2BAA2B,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,aAAa,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,WAAW,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,MAAM,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,MAAM,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAgED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAS3C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE,uBAA4B,GACpC,0BAA0B;IA8J7B,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAkFnC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAenC,OAAO,CAAC,MAAM,CAAC,UAAU;IAQzB,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAclC,OAAO,CAAC,MAAM,CAAC,kBAAkB;mBAWZ,SAAS;CAO/B"}
|
|
@@ -2,8 +2,37 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GracefulShutdownHelper = void 0;
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
|
+
const core_1 = require("@nestjs/core");
|
|
6
|
+
const rxjs_1 = require("rxjs");
|
|
5
7
|
const DEFAULT_TIMEOUT_MS = 110_000;
|
|
8
|
+
const PARTICIPANT_POLL_INTERVAL_MS = 50;
|
|
9
|
+
class TransportActivityInterceptor {
|
|
10
|
+
constructor(isDraining) {
|
|
11
|
+
this.isDraining = isDraining;
|
|
12
|
+
this.active = 0;
|
|
13
|
+
}
|
|
14
|
+
intercept(context, next) {
|
|
15
|
+
if (context.getType() === 'http')
|
|
16
|
+
return next.handle();
|
|
17
|
+
if (this.isDraining()) {
|
|
18
|
+
return (0, rxjs_1.throwError)(() => new common_1.ServiceUnavailableException('Service is shutting down'));
|
|
19
|
+
}
|
|
20
|
+
this.active += 1;
|
|
21
|
+
return next.handle().pipe((0, rxjs_1.finalize)(() => {
|
|
22
|
+
this.active = Math.max(0, this.active - 1);
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
count() {
|
|
26
|
+
return this.active;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
6
29
|
class GracefulShutdownHelper {
|
|
30
|
+
static isExpectedRedisShutdownError(reason) {
|
|
31
|
+
if (!(reason instanceof Error))
|
|
32
|
+
return false;
|
|
33
|
+
return (reason.message === 'Connection is closed.' &&
|
|
34
|
+
(reason.stack?.includes('/ioredis/') ?? false));
|
|
35
|
+
}
|
|
7
36
|
static enable(app, options = {}) {
|
|
8
37
|
const server = app.getHttpServer();
|
|
9
38
|
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
@@ -12,6 +41,8 @@ class GracefulShutdownHelper {
|
|
|
12
41
|
let draining = false;
|
|
13
42
|
let activeRequests = 0;
|
|
14
43
|
let shutdownPromise;
|
|
44
|
+
const transportActivity = new TransportActivityInterceptor(() => draining);
|
|
45
|
+
app.useGlobalInterceptors(transportActivity);
|
|
15
46
|
app.use((_request, response, next) => {
|
|
16
47
|
if (draining) {
|
|
17
48
|
response.statusCode = 503;
|
|
@@ -41,6 +72,13 @@ class GracefulShutdownHelper {
|
|
|
41
72
|
shutdownPromise = (async () => {
|
|
42
73
|
draining = true;
|
|
43
74
|
logger.log(`${signal ?? 'Shutdown'} received; draining ${activeRequests} active request(s)`);
|
|
75
|
+
const participants = [
|
|
76
|
+
...(options.autoDiscoverParticipants === false
|
|
77
|
+
? []
|
|
78
|
+
: GracefulShutdownHelper.discoverParticipants(app, logger)),
|
|
79
|
+
...(options.participants ?? []),
|
|
80
|
+
];
|
|
81
|
+
const uniqueParticipants = GracefulShutdownHelper.uniqueParticipants(participants);
|
|
44
82
|
let closeServer = () => undefined;
|
|
45
83
|
const serverClosed = new Promise((resolve, reject) => {
|
|
46
84
|
closeServer = (error) => {
|
|
@@ -54,18 +92,46 @@ class GracefulShutdownHelper {
|
|
|
54
92
|
server.closeIdleConnections?.();
|
|
55
93
|
let timeout;
|
|
56
94
|
try {
|
|
95
|
+
const participantsDrained = Promise.all(uniqueParticipants.map(async (participant) => {
|
|
96
|
+
logger.log(`Stopping ${participant.name} intake`);
|
|
97
|
+
await participant.stopAccepting();
|
|
98
|
+
await participant.waitForIdle?.();
|
|
99
|
+
})).then(() => undefined);
|
|
57
100
|
await Promise.race([
|
|
58
|
-
|
|
101
|
+
Promise.all([
|
|
102
|
+
serverClosed,
|
|
103
|
+
GracefulShutdownHelper.waitUntil(() => transportActivity.count() === 0),
|
|
104
|
+
participantsDrained,
|
|
105
|
+
]).then(() => undefined),
|
|
59
106
|
new Promise((resolve) => {
|
|
60
107
|
timeout = setTimeout(() => {
|
|
61
|
-
logger.warn(`Graceful shutdown timed out with ${activeRequests} active request(s)`);
|
|
108
|
+
logger.warn(`Graceful shutdown timed out with ${activeRequests} active HTTP request(s) and ${transportActivity.count()} active transport handler(s)`);
|
|
62
109
|
server.closeAllConnections?.();
|
|
63
110
|
resolve();
|
|
64
111
|
}, timeoutMs);
|
|
65
112
|
timeout.unref();
|
|
66
113
|
}),
|
|
67
114
|
]);
|
|
68
|
-
|
|
115
|
+
let unexpectedShutdownRejection = false;
|
|
116
|
+
const handleShutdownRejection = (reason) => {
|
|
117
|
+
if (GracefulShutdownHelper.isExpectedRedisShutdownError(reason)) {
|
|
118
|
+
logger.warn('Ignored an expected ioredis connection-closed rejection during shutdown');
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
unexpectedShutdownRejection = true;
|
|
122
|
+
process.exitCode = 1;
|
|
123
|
+
logger.error('Unhandled rejection occurred during graceful shutdown', reason instanceof Error ? reason.stack : String(reason));
|
|
124
|
+
};
|
|
125
|
+
process.on('unhandledRejection', handleShutdownRejection);
|
|
126
|
+
try {
|
|
127
|
+
await app.close();
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
process.off('unhandledRejection', handleShutdownRejection);
|
|
131
|
+
}
|
|
132
|
+
if (unexpectedShutdownRejection) {
|
|
133
|
+
throw new Error('Graceful shutdown encountered an unexpected asynchronous error');
|
|
134
|
+
}
|
|
69
135
|
logger.log('Graceful shutdown completed');
|
|
70
136
|
}
|
|
71
137
|
catch (error) {
|
|
@@ -88,9 +154,105 @@ class GracefulShutdownHelper {
|
|
|
88
154
|
return {
|
|
89
155
|
isDraining: () => draining,
|
|
90
156
|
activeRequests: () => activeRequests,
|
|
157
|
+
activeHandlers: () => transportActivity.count(),
|
|
91
158
|
shutdown,
|
|
92
159
|
};
|
|
93
160
|
}
|
|
161
|
+
static discoverParticipants(app, logger) {
|
|
162
|
+
const providers = GracefulShutdownHelper.getProviderInstances(app);
|
|
163
|
+
const participants = [];
|
|
164
|
+
const microserviceServers = app
|
|
165
|
+
.getMicroservices()
|
|
166
|
+
.map((microservice) => microservice.serverInstance)
|
|
167
|
+
.filter((server) => GracefulShutdownHelper.isClosable(server));
|
|
168
|
+
if (microserviceServers.length > 0) {
|
|
169
|
+
participants.push({
|
|
170
|
+
name: 'Kafka/microservice',
|
|
171
|
+
stopAccepting: () => Promise.all(microserviceServers.map((server) => server.close())).then(() => undefined),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
const queueResources = new Set();
|
|
175
|
+
for (const [token, instance] of providers) {
|
|
176
|
+
if (typeof token === 'string' &&
|
|
177
|
+
token.startsWith('BullQueue_') &&
|
|
178
|
+
GracefulShutdownHelper.isClosable(instance)) {
|
|
179
|
+
queueResources.add(instance);
|
|
180
|
+
}
|
|
181
|
+
const worker = instance?.worker;
|
|
182
|
+
if (GracefulShutdownHelper.isClosable(worker))
|
|
183
|
+
queueResources.add(worker);
|
|
184
|
+
}
|
|
185
|
+
if (queueResources.size > 0) {
|
|
186
|
+
participants.push({
|
|
187
|
+
name: 'Bull/BullMQ',
|
|
188
|
+
stopAccepting: () => Promise.all([...queueResources].map((resource) => resource.close(false))).then(() => undefined),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
const scheduler = providers
|
|
192
|
+
.map(([, instance]) => instance)
|
|
193
|
+
.find(GracefulShutdownHelper.isSchedulerRegistry);
|
|
194
|
+
if (scheduler) {
|
|
195
|
+
const cronJobs = [...scheduler.getCronJobs().values()];
|
|
196
|
+
participants.push({
|
|
197
|
+
name: 'scheduler',
|
|
198
|
+
stopAccepting: () => {
|
|
199
|
+
for (const cronJob of cronJobs)
|
|
200
|
+
cronJob.stop();
|
|
201
|
+
for (const interval of scheduler.getIntervals()) {
|
|
202
|
+
scheduler.deleteInterval(interval);
|
|
203
|
+
}
|
|
204
|
+
for (const timeoutName of scheduler.getTimeouts()) {
|
|
205
|
+
scheduler.deleteTimeout(timeoutName);
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
waitForIdle: () => GracefulShutdownHelper.waitUntil(() => cronJobs.every((cronJob) => !cronJob.isCallbackRunning)),
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
logger.log(participants.length === 0
|
|
212
|
+
? 'No background shutdown participants discovered'
|
|
213
|
+
: `Discovered shutdown participants: ${participants
|
|
214
|
+
.map((participant) => participant.name)
|
|
215
|
+
.join(', ')}`);
|
|
216
|
+
return participants;
|
|
217
|
+
}
|
|
218
|
+
static getProviderInstances(app) {
|
|
219
|
+
try {
|
|
220
|
+
const modules = app.get(core_1.ModulesContainer, { strict: false });
|
|
221
|
+
return [...modules.values()].flatMap((moduleRef) => [...moduleRef.providers.entries()].map(([token, wrapper]) => [token, wrapper.instance]));
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return [];
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
static isClosable(value) {
|
|
228
|
+
return (typeof value === 'object' &&
|
|
229
|
+
value !== null &&
|
|
230
|
+
typeof value.close === 'function');
|
|
231
|
+
}
|
|
232
|
+
static isSchedulerRegistry(value) {
|
|
233
|
+
if (typeof value !== 'object' || value === null)
|
|
234
|
+
return false;
|
|
235
|
+
const registry = value;
|
|
236
|
+
return (typeof registry.getCronJobs === 'function' &&
|
|
237
|
+
typeof registry.getIntervals === 'function' &&
|
|
238
|
+
typeof registry.getTimeouts === 'function' &&
|
|
239
|
+
typeof registry.deleteInterval === 'function' &&
|
|
240
|
+
typeof registry.deleteTimeout === 'function');
|
|
241
|
+
}
|
|
242
|
+
static uniqueParticipants(participants) {
|
|
243
|
+
const names = new Set();
|
|
244
|
+
return participants.filter((participant) => {
|
|
245
|
+
if (names.has(participant.name))
|
|
246
|
+
return false;
|
|
247
|
+
names.add(participant.name);
|
|
248
|
+
return true;
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
static async waitUntil(predicate) {
|
|
252
|
+
while (!predicate()) {
|
|
253
|
+
await new Promise((resolve) => setTimeout(resolve, PARTICIPANT_POLL_INTERVAL_MS));
|
|
254
|
+
}
|
|
255
|
+
}
|
|
94
256
|
}
|
|
95
257
|
exports.GracefulShutdownHelper = GracefulShutdownHelper;
|
|
96
258
|
//# sourceMappingURL=graceful-shutdown.helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graceful-shutdown.helper.js","sourceRoot":"","sources":["../../src/helpers/graceful-shutdown.helper.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"graceful-shutdown.helper.js","sourceRoot":"","sources":["../../src/helpers/graceful-shutdown.helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-sanitizer.helper.d.ts","sourceRoot":"","sources":["../../src/helpers/html-sanitizer.helper.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,eAAe,CAAC;AAE5C,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,eAAe,CAAC,QAAQ,GACjC,OAAO,CAsBT"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.sanitizeHtml = sanitizeHtml;
|
|
7
|
+
const sanitize_html_1 = __importDefault(require("sanitize-html"));
|
|
8
|
+
function sanitizeHtml(value, options) {
|
|
9
|
+
if (typeof value !== 'string')
|
|
10
|
+
return value;
|
|
11
|
+
return (0, sanitize_html_1.default)(value, {
|
|
12
|
+
allowedTags: ['p', 'br', 'strong', 'em', 'u', 's', 'ul', 'ol', 'li', 'a'],
|
|
13
|
+
allowedAttributes: {
|
|
14
|
+
a: ['href', 'title', 'target', 'rel'],
|
|
15
|
+
},
|
|
16
|
+
allowedSchemes: ['http', 'https', 'mailto'],
|
|
17
|
+
allowProtocolRelative: false,
|
|
18
|
+
enforceHtmlBoundary: true,
|
|
19
|
+
transformTags: {
|
|
20
|
+
a: (_tagName, attribs) => ({
|
|
21
|
+
tagName: 'a',
|
|
22
|
+
attribs: {
|
|
23
|
+
...attribs,
|
|
24
|
+
rel: 'noopener noreferrer nofollow',
|
|
25
|
+
},
|
|
26
|
+
}),
|
|
27
|
+
},
|
|
28
|
+
...options,
|
|
29
|
+
}).trim();
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=html-sanitizer.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-sanitizer.helper.js","sourceRoot":"","sources":["../../src/helpers/html-sanitizer.helper.ts"],"names":[],"mappings":";;;;;AAEA,oCAyBC;AA3BD,kEAA4C;AAE5C,SAAgB,YAAY,CAC1B,KAAc,EACd,OAAkC;IAElC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5C,OAAO,IAAA,uBAAe,EAAC,KAAK,EAAE;QAC5B,WAAW,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC;QACzE,iBAAiB,EAAE;YACjB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC;SACtC;QACD,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;QAC3C,qBAAqB,EAAE,KAAK;QAC5B,mBAAmB,EAAE,IAAI;QACzB,aAAa,EAAE;YACb,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;gBACzB,OAAO,EAAE,GAAG;gBACZ,OAAO,EAAE;oBACP,GAAG,OAAO;oBACV,GAAG,EAAE,8BAA8B;iBACpC;aACF,CAAC;SACH;QACD,GAAG,OAAO;KACX,CAAC,CAAC,IAAI,EAAE,CAAC;AACZ,CAAC"}
|
package/dist/helpers/index.d.ts
CHANGED
|
@@ -15,4 +15,5 @@ export * from './rxjs-catch-error.helper';
|
|
|
15
15
|
export * from './rxjs-timeout-custom-callback.helper';
|
|
16
16
|
export * from './success-response-translation.helper';
|
|
17
17
|
export * from './yup.helper';
|
|
18
|
+
export * from './html-sanitizer.helper';
|
|
18
19
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC"}
|
package/dist/helpers/index.js
CHANGED
|
@@ -31,4 +31,5 @@ __exportStar(require("./rxjs-catch-error.helper"), exports);
|
|
|
31
31
|
__exportStar(require("./rxjs-timeout-custom-callback.helper"), exports);
|
|
32
32
|
__exportStar(require("./success-response-translation.helper"), exports);
|
|
33
33
|
__exportStar(require("./yup.helper"), exports);
|
|
34
|
+
__exportStar(require("./html-sanitizer.helper"), exports);
|
|
34
35
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,uDAAqC;AACrC,+DAA6C;AAC7C,yDAAuC;AACvC,mDAAiC;AACjC,6DAA2C;AAC3C,gDAA8B;AAC9B,wDAAsC;AACtC,6DAA2C;AAC3C,kDAAgC;AAChC,6DAA2C;AAC3C,iDAA+B;AAC/B,qDAAmC;AACnC,4DAA0C;AAC1C,wEAAsD;AACtD,wEAAsD;AACtD,+CAA6B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,uDAAqC;AACrC,+DAA6C;AAC7C,yDAAuC;AACvC,mDAAiC;AACjC,6DAA2C;AAC3C,gDAA8B;AAC9B,wDAAsC;AACtC,6DAA2C;AAC3C,kDAAgC;AAChC,6DAA2C;AAC3C,iDAA+B;AAC/B,qDAAmC;AACnC,4DAA0C;AAC1C,wEAAsD;AACtD,wEAAsD;AACtD,+CAA6B;AAC7B,0DAAwC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mondart/nestjs-common-module-core",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.9",
|
|
4
4
|
"description": "Core utilities, DTOs, decorators, entities, filters, validators and helpers for NestJS.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Mondart"
|
|
@@ -17,25 +17,29 @@
|
|
|
17
17
|
"build": "tsc -p tsconfig.json"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@nestjs/microservices": "^11.1.10",
|
|
21
|
-
"@nestjs/throttler": "^6.5.0",
|
|
22
|
-
"@sentry/nestjs": "^10.32.1",
|
|
23
|
-
"moment-timezone": "^0.6.0",
|
|
24
20
|
"@nestjs/common": "^11.1.10",
|
|
25
21
|
"@nestjs/core": "^11.1.10",
|
|
22
|
+
"@nestjs/microservices": "^11.1.10",
|
|
26
23
|
"@nestjs/swagger": "^11.0.3",
|
|
24
|
+
"@nestjs/throttler": "^6.5.0",
|
|
27
25
|
"@nestjs/typeorm": "^11.0.0",
|
|
26
|
+
"@sentry/nestjs": "^10.32.1",
|
|
28
27
|
"class-transformer": "^0.5.1",
|
|
29
28
|
"class-validator": "^0.14.3",
|
|
29
|
+
"inquirer": "^13.2.2",
|
|
30
|
+
"moment-timezone": "^0.6.0",
|
|
30
31
|
"nestjs-i18n": "10.6.1",
|
|
31
32
|
"nestjs-paginate": "^12.8.3",
|
|
32
33
|
"reflect-metadata": "^0.2.0",
|
|
33
|
-
"inquirer": "^13.2.2",
|
|
34
|
-
"yup": "^1.7.1",
|
|
35
34
|
"rxjs": "^7.8.2",
|
|
36
|
-
"
|
|
35
|
+
"sanitize-html": "2.17.4",
|
|
36
|
+
"typeorm": "^0.3.28",
|
|
37
|
+
"yup": "^1.7.1"
|
|
37
38
|
},
|
|
38
39
|
"publishConfig": {
|
|
39
40
|
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/sanitize-html": "^2.16.1"
|
|
40
44
|
}
|
|
41
45
|
}
|