@mondart/nestjs-common-module-core 3.2.10 → 3.2.11
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
CHANGED
|
@@ -220,28 +220,59 @@ for `{0}`-style `SharedMessages` interpolation, `EnvValidator` for validating
|
|
|
220
220
|
`RxjsCatchErrorHelper` / `RxjsCustomTimeoutHelper` RxJS operators for mapping
|
|
221
221
|
errors/timeouts on outbound calls to Nest exceptions.
|
|
222
222
|
|
|
223
|
-
### Graceful
|
|
223
|
+
### Graceful shutdown
|
|
224
224
|
|
|
225
225
|
Use `GracefulShutdownHelper.enable()` instead of `app.enableShutdownHooks()`
|
|
226
|
-
in
|
|
226
|
+
in a service bootstrap, before connecting microservices:
|
|
227
227
|
|
|
228
228
|
```ts
|
|
229
229
|
import { GracefulShutdownHelper } from '@mondart/nestjs-common-module-core';
|
|
230
230
|
|
|
231
231
|
const app = await NestFactory.create(AppModule);
|
|
232
232
|
GracefulShutdownHelper.enable(app);
|
|
233
|
+
app.connectMicroservice(kafkaOptions, { inheritAppConfig: true });
|
|
234
|
+
await app.startAllMicroservices();
|
|
233
235
|
await app.listen(appPort);
|
|
234
236
|
```
|
|
235
237
|
|
|
236
|
-
On `SIGTERM` or `SIGINT
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
238
|
+
On `SIGTERM` or `SIGINT` the helper stops taking new work, lets everything in
|
|
239
|
+
flight finish, then closes Nest and exits:
|
|
240
|
+
|
|
241
|
+
1. **Not ready** (immediately): `/health-check` requests return `503` so load
|
|
242
|
+
balancers stop routing to the task, while other HTTP and WebSocket traffic
|
|
243
|
+
is still served. `/health-check/live` is excluded and keeps returning `200`:
|
|
244
|
+
a failing liveness probe during termination makes Kubernetes kill the
|
|
245
|
+
container before the drain finishes. Point liveness at `/health-check/live`
|
|
246
|
+
and readiness at `/health-check/ready`. Background intake stops at once: Kafka server consumers
|
|
247
|
+
(`consumer.stop()` finishes fetched messages and leaves the group), Bull
|
|
248
|
+
queues are paused locally (active jobs finish, Redis stays open so running
|
|
249
|
+
handlers can still add jobs), BullMQ workers close, and cron jobs,
|
|
250
|
+
intervals, and timeouts stop.
|
|
251
|
+
2. **Draining** (after `drainDelayMs`, or at once when HTTP is not listening):
|
|
252
|
+
new HTTP requests get `503` with `Connection: close`, the HTTP server
|
|
253
|
+
closes, socket.io clients are disconnected so they reconnect elsewhere, and
|
|
254
|
+
the helper waits for active HTTP requests, transport handlers, pending
|
|
255
|
+
Kafka replies, Bull/BullMQ jobs, and running cron callbacks.
|
|
256
|
+
3. **Closing**: `app.close()` runs so Nest closes Kafka, queues, and database
|
|
257
|
+
connections. If draining exceeded `timeoutMs`, the helper first logs what
|
|
258
|
+
was still busy and closes remaining HTTP connections.
|
|
259
|
+
4. **Exit**: after a signal, the process exits with `process.exitCode`.
|
|
260
|
+
|
|
261
|
+
| Option | Env | Default |
|
|
262
|
+
|---|---|---|
|
|
263
|
+
| `drainDelayMs` | `GRACEFUL_SHUTDOWN_DRAIN_DELAY_MS` | `10000` |
|
|
264
|
+
| `timeoutMs` (from the signal, includes the delay) | `GRACEFUL_SHUTDOWN_TIMEOUT_MS` | `90000` |
|
|
265
|
+
| `closeTimeoutMs` | `GRACEFUL_SHUTDOWN_CLOSE_TIMEOUT_MS` | `15000` |
|
|
266
|
+
|
|
267
|
+
Options passed in code win over env values; `drainDelayMs` must stay below
|
|
268
|
+
`timeoutMs` or the deadline fires before intake closes and nothing drains (the
|
|
269
|
+
helper warns at startup when it does not). Keep the container stop grace
|
|
270
|
+
period above `timeoutMs + closeTimeoutMs` (Swarm uses two minutes); work still
|
|
271
|
+
running at the deadline is abandoned, so Bull retries stalled jobs and Kafka
|
|
272
|
+
redelivers uncommitted messages. Do not register Nest's default shutdown signal
|
|
273
|
+
handlers alongside this helper. During `app.close()`, the helper suppresses
|
|
274
|
+
only ioredis's known `Connection is closed.` rejection; any other unhandled
|
|
275
|
+
shutdown rejection is logged and produces a failed exit.
|
|
245
276
|
|
|
246
277
|
## Kafka-related exports
|
|
247
278
|
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import { INestApplication, Logger } from '@nestjs/common';
|
|
2
|
+
interface HttpRequestLike {
|
|
3
|
+
url?: string;
|
|
4
|
+
originalUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
export type GracefulShutdownPhase = 'running' | 'not-ready' | 'draining' | 'closing';
|
|
2
7
|
export interface GracefulShutdownOptions {
|
|
8
|
+
drainDelayMs?: number;
|
|
3
9
|
timeoutMs?: number;
|
|
10
|
+
closeTimeoutMs?: number;
|
|
4
11
|
signals?: NodeJS.Signals[];
|
|
5
12
|
logger?: Pick<Logger, 'log' | 'warn' | 'error'>;
|
|
6
13
|
autoDiscoverParticipants?: boolean;
|
|
7
14
|
participants?: GracefulShutdownParticipant[];
|
|
15
|
+
isHealthCheckRequest?: (request: HttpRequestLike) => boolean;
|
|
16
|
+
exit?: (code: number) => void;
|
|
8
17
|
}
|
|
9
18
|
export interface GracefulShutdownParticipant {
|
|
10
19
|
readonly name: string;
|
|
@@ -13,6 +22,7 @@ export interface GracefulShutdownParticipant {
|
|
|
13
22
|
}
|
|
14
23
|
export interface GracefulShutdownController {
|
|
15
24
|
readonly isDraining: () => boolean;
|
|
25
|
+
readonly phase: () => GracefulShutdownPhase;
|
|
16
26
|
readonly activeRequests: () => number;
|
|
17
27
|
readonly activeHandlers: () => number;
|
|
18
28
|
shutdown(signal?: NodeJS.Signals): Promise<void>;
|
|
@@ -21,10 +31,17 @@ export declare class GracefulShutdownHelper {
|
|
|
21
31
|
private static isExpectedRedisShutdownError;
|
|
22
32
|
static enable(app: INestApplication, options?: GracefulShutdownOptions): GracefulShutdownController;
|
|
23
33
|
private static discoverParticipants;
|
|
34
|
+
private static discoverSocketServers;
|
|
24
35
|
private static getProviderInstances;
|
|
36
|
+
private static readProperty;
|
|
37
|
+
private static resolveMs;
|
|
25
38
|
private static isClosable;
|
|
39
|
+
private static isBullQueue;
|
|
40
|
+
private static isBullMqWorker;
|
|
26
41
|
private static isSchedulerRegistry;
|
|
27
42
|
private static uniqueParticipants;
|
|
28
43
|
private static waitUntil;
|
|
44
|
+
private static sleep;
|
|
29
45
|
}
|
|
46
|
+
export {};
|
|
30
47
|
//# 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,EAGL,gBAAgB,EAChB,MAAM,EAGP,MAAM,gBAAgB,CAAC;
|
|
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;AAKxB,UAAU,eAAe;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAiBD,MAAM,MAAM,qBAAqB,GAC/B,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAEnD,MAAM,WAAW,uBAAuB;IAOtC,YAAY,CAAC,EAAE,MAAM,CAAC;IAKtB,SAAS,CAAC,EAAE,MAAM,CAAC;IAKnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,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;IAE7C,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC;IAE7D,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;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,KAAK,EAAE,MAAM,qBAAqB,CAAC;IAC5C,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;AAwFD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAS3C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE,uBAA4B,GACpC,0BAA0B;IAwS7B,OAAO,CAAC,MAAM,CAAC,oBAAoB;IA2HnC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAiBpC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAgBnC,OAAO,CAAC,MAAM,CAAC,YAAY;IAS3B,OAAO,CAAC,MAAM,CAAC,SAAS;IAgBxB,OAAO,CAAC,MAAM,CAAC,UAAU;IAQzB,OAAO,CAAC,MAAM,CAAC,WAAW;IAS1B,OAAO,CAAC,MAAM,CAAC,cAAc;IAU7B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAclC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAYjC,OAAO,CAAC,MAAM,CAAC,SAAS;IA2BxB,OAAO,CAAC,MAAM,CAAC,KAAK;CAerB"}
|
|
@@ -4,17 +4,21 @@ exports.GracefulShutdownHelper = void 0;
|
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
5
|
const core_1 = require("@nestjs/core");
|
|
6
6
|
const rxjs_1 = require("rxjs");
|
|
7
|
-
const
|
|
7
|
+
const DEFAULT_DRAIN_DELAY_MS = 10_000;
|
|
8
|
+
const DEFAULT_TIMEOUT_MS = 90_000;
|
|
9
|
+
const DEFAULT_CLOSE_TIMEOUT_MS = 15_000;
|
|
10
|
+
const EXIT_FALLBACK_MS = 1_000;
|
|
8
11
|
const PARTICIPANT_POLL_INTERVAL_MS = 50;
|
|
12
|
+
const HEALTH_CHECK_PATH = /\/health-check(?!\/live\b)(\/|\?|$)/;
|
|
9
13
|
class TransportActivityInterceptor {
|
|
10
|
-
constructor(
|
|
11
|
-
this.
|
|
14
|
+
constructor(isRejectingTransport) {
|
|
15
|
+
this.isRejectingTransport = isRejectingTransport;
|
|
12
16
|
this.active = 0;
|
|
13
17
|
}
|
|
14
18
|
intercept(context, next) {
|
|
15
19
|
if (context.getType() === 'http')
|
|
16
20
|
return next.handle();
|
|
17
|
-
if (
|
|
21
|
+
if (context.getType() !== 'rpc' && this.isRejectingTransport()) {
|
|
18
22
|
return (0, rxjs_1.throwError)(() => new common_1.ServiceUnavailableException('Service is shutting down'));
|
|
19
23
|
}
|
|
20
24
|
this.active += 1;
|
|
@@ -35,16 +39,26 @@ class GracefulShutdownHelper {
|
|
|
35
39
|
}
|
|
36
40
|
static enable(app, options = {}) {
|
|
37
41
|
const server = app.getHttpServer();
|
|
38
|
-
const
|
|
42
|
+
const drainDelayMs = GracefulShutdownHelper.resolveMs(options.drainDelayMs, 'GRACEFUL_SHUTDOWN_DRAIN_DELAY_MS', DEFAULT_DRAIN_DELAY_MS);
|
|
43
|
+
const timeoutMs = GracefulShutdownHelper.resolveMs(options.timeoutMs, 'GRACEFUL_SHUTDOWN_TIMEOUT_MS', DEFAULT_TIMEOUT_MS);
|
|
44
|
+
const closeTimeoutMs = GracefulShutdownHelper.resolveMs(options.closeTimeoutMs, 'GRACEFUL_SHUTDOWN_CLOSE_TIMEOUT_MS', DEFAULT_CLOSE_TIMEOUT_MS);
|
|
39
45
|
const signals = options.signals ?? ['SIGTERM', 'SIGINT'];
|
|
40
46
|
const logger = options.logger ?? new common_1.Logger('GracefulShutdown');
|
|
41
|
-
|
|
47
|
+
if (drainDelayMs >= timeoutMs) {
|
|
48
|
+
logger.warn(`drainDelayMs (${drainDelayMs}ms) is not below timeoutMs (${timeoutMs}ms); the deadline fires before HTTP intake closes, so nothing drains`);
|
|
49
|
+
}
|
|
50
|
+
const isHealthCheckRequest = options.isHealthCheckRequest ??
|
|
51
|
+
((request) => HEALTH_CHECK_PATH.test(request?.originalUrl ?? request?.url ?? ''));
|
|
52
|
+
const exit = options.exit ?? ((code) => process.exit(code));
|
|
53
|
+
let phase = 'running';
|
|
42
54
|
let activeRequests = 0;
|
|
43
55
|
let shutdownPromise;
|
|
44
|
-
const
|
|
56
|
+
const isIntakeClosed = () => phase === 'draining' || phase === 'closing';
|
|
57
|
+
const transportActivity = new TransportActivityInterceptor(isIntakeClosed);
|
|
45
58
|
app.useGlobalInterceptors(transportActivity);
|
|
46
|
-
app.use((
|
|
47
|
-
if (
|
|
59
|
+
app.use((request, response, next) => {
|
|
60
|
+
if (isIntakeClosed() ||
|
|
61
|
+
(phase === 'not-ready' && isHealthCheckRequest(request))) {
|
|
48
62
|
response.statusCode = 503;
|
|
49
63
|
response.setHeader('Connection', 'close');
|
|
50
64
|
response.setHeader('Content-Type', 'application/json');
|
|
@@ -54,6 +68,8 @@ class GracefulShutdownHelper {
|
|
|
54
68
|
}));
|
|
55
69
|
return;
|
|
56
70
|
}
|
|
71
|
+
if (phase === 'not-ready')
|
|
72
|
+
response.setHeader('Connection', 'close');
|
|
57
73
|
activeRequests += 1;
|
|
58
74
|
let completed = false;
|
|
59
75
|
const complete = () => {
|
|
@@ -66,106 +82,195 @@ class GracefulShutdownHelper {
|
|
|
66
82
|
response.once('close', complete);
|
|
67
83
|
next();
|
|
68
84
|
});
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
85
|
+
const closeApp = async () => {
|
|
86
|
+
let unexpectedShutdownRejection = false;
|
|
87
|
+
const handleShutdownRejection = (reason) => {
|
|
88
|
+
if (GracefulShutdownHelper.isExpectedRedisShutdownError(reason)) {
|
|
89
|
+
logger.warn('Ignored an expected ioredis connection-closed rejection during shutdown');
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
unexpectedShutdownRejection = true;
|
|
93
|
+
process.exitCode = 1;
|
|
94
|
+
logger.error('Unhandled rejection occurred during graceful shutdown', reason instanceof Error ? reason.stack : String(reason));
|
|
95
|
+
};
|
|
96
|
+
process.on('unhandledRejection', handleShutdownRejection);
|
|
97
|
+
let closeTimer;
|
|
98
|
+
try {
|
|
99
|
+
const closed = await Promise.race([
|
|
100
|
+
Promise.resolve(app.close()).then(() => true),
|
|
101
|
+
new Promise((resolve) => {
|
|
102
|
+
closeTimer = setTimeout(() => resolve(false), closeTimeoutMs);
|
|
103
|
+
closeTimer.unref?.();
|
|
104
|
+
}),
|
|
105
|
+
]);
|
|
106
|
+
if (!closed) {
|
|
107
|
+
throw new Error(`app.close() did not finish within ${closeTimeoutMs}ms`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
clearTimeout(closeTimer);
|
|
112
|
+
process.off('unhandledRejection', handleShutdownRejection);
|
|
113
|
+
}
|
|
114
|
+
if (unexpectedShutdownRejection) {
|
|
115
|
+
throw new Error('Graceful shutdown encountered an unexpected asynchronous error');
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const run = async (signal) => {
|
|
119
|
+
const startedAt = Date.now();
|
|
120
|
+
const elapsed = () => `${Date.now() - startedAt}ms`;
|
|
121
|
+
phase = 'not-ready';
|
|
122
|
+
logger.log(`${signal ?? 'Shutdown'} received; not ready, draining ${activeRequests} active request(s)`);
|
|
123
|
+
const abort = new AbortController();
|
|
124
|
+
let deadlineTimer;
|
|
125
|
+
let httpClosed = typeof server?.close !== 'function';
|
|
126
|
+
let socketServers = [];
|
|
127
|
+
const stopHttpIntake = () => {
|
|
128
|
+
if (phase !== 'not-ready')
|
|
129
|
+
return;
|
|
130
|
+
phase = 'draining';
|
|
131
|
+
logger.log(`Closing HTTP/WebSocket intake after ${elapsed()}`);
|
|
132
|
+
if (!httpClosed) {
|
|
133
|
+
try {
|
|
134
|
+
server.close(() => {
|
|
135
|
+
httpClosed = true;
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
httpClosed = true;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
server?.closeIdleConnections?.();
|
|
143
|
+
};
|
|
144
|
+
let socketsDisconnected = false;
|
|
145
|
+
const disconnectSockets = () => {
|
|
146
|
+
if (socketsDisconnected)
|
|
147
|
+
return;
|
|
148
|
+
socketsDisconnected = true;
|
|
149
|
+
for (const socketServer of socketServers) {
|
|
150
|
+
try {
|
|
151
|
+
socketServer.disconnectSockets(true);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
logger.warn(`Failed to disconnect WebSocket clients: ${error instanceof Error ? error.message : String(error)}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
try {
|
|
159
|
+
const providers = options.autoDiscoverParticipants === false
|
|
160
|
+
? []
|
|
161
|
+
: GracefulShutdownHelper.getProviderInstances(app);
|
|
162
|
+
socketServers = GracefulShutdownHelper.discoverSocketServers(providers);
|
|
163
|
+
const participants = GracefulShutdownHelper.uniqueParticipants([
|
|
76
164
|
...(options.autoDiscoverParticipants === false
|
|
77
165
|
? []
|
|
78
|
-
: GracefulShutdownHelper.discoverParticipants(app, logger)),
|
|
166
|
+
: GracefulShutdownHelper.discoverParticipants(app, providers, logger, abort.signal)),
|
|
79
167
|
...(options.participants ?? []),
|
|
80
|
-
];
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
closeServer = (error) => {
|
|
85
|
-
if (error)
|
|
86
|
-
reject(error);
|
|
87
|
-
else
|
|
88
|
-
resolve();
|
|
89
|
-
};
|
|
90
|
-
});
|
|
91
|
-
server.close(closeServer);
|
|
92
|
-
server.closeIdleConnections?.();
|
|
93
|
-
let timeout;
|
|
94
|
-
try {
|
|
95
|
-
const participantsDrained = Promise.all(uniqueParticipants.map(async (participant) => {
|
|
168
|
+
]);
|
|
169
|
+
const busyParticipants = new Set(participants.map((p) => p.name));
|
|
170
|
+
const participantsIdle = Promise.all(participants.map(async (participant) => {
|
|
171
|
+
try {
|
|
96
172
|
logger.log(`Stopping ${participant.name} intake`);
|
|
97
173
|
await participant.stopAccepting();
|
|
98
174
|
await participant.waitForIdle?.();
|
|
99
|
-
})).then(() => undefined);
|
|
100
|
-
await Promise.race([
|
|
101
|
-
Promise.all([
|
|
102
|
-
serverClosed,
|
|
103
|
-
GracefulShutdownHelper.waitUntil(() => transportActivity.count() === 0),
|
|
104
|
-
participantsDrained,
|
|
105
|
-
]).then(() => undefined),
|
|
106
|
-
new Promise((resolve) => {
|
|
107
|
-
timeout = setTimeout(() => {
|
|
108
|
-
logger.warn(`Graceful shutdown timed out with ${activeRequests} active HTTP request(s) and ${transportActivity.count()} active transport handler(s)`);
|
|
109
|
-
server.closeAllConnections?.();
|
|
110
|
-
resolve();
|
|
111
|
-
}, timeoutMs);
|
|
112
|
-
timeout.unref();
|
|
113
|
-
}),
|
|
114
|
-
]);
|
|
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
175
|
}
|
|
129
|
-
|
|
130
|
-
|
|
176
|
+
catch (error) {
|
|
177
|
+
logger.error(`Failed to drain ${participant.name}`, error instanceof Error ? error.stack : String(error));
|
|
131
178
|
}
|
|
132
|
-
|
|
133
|
-
|
|
179
|
+
finally {
|
|
180
|
+
busyParticipants.delete(participant.name);
|
|
134
181
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
182
|
+
}));
|
|
183
|
+
const drained = await Promise.race([
|
|
184
|
+
(async () => {
|
|
185
|
+
if (server?.listening) {
|
|
186
|
+
await GracefulShutdownHelper.sleep(drainDelayMs, abort.signal);
|
|
187
|
+
}
|
|
188
|
+
stopHttpIntake();
|
|
189
|
+
await Promise.all([
|
|
190
|
+
participantsIdle,
|
|
191
|
+
GracefulShutdownHelper.waitUntil(() => activeRequests === 0 && transportActivity.count() === 0, abort.signal, () => server?.closeIdleConnections?.()),
|
|
192
|
+
]);
|
|
193
|
+
disconnectSockets();
|
|
194
|
+
await GracefulShutdownHelper.waitUntil(() => httpClosed, abort.signal, () => server?.closeIdleConnections?.());
|
|
195
|
+
return true;
|
|
196
|
+
})(),
|
|
197
|
+
new Promise((resolve) => {
|
|
198
|
+
deadlineTimer = setTimeout(() => resolve(false), timeoutMs);
|
|
199
|
+
deadlineTimer.unref?.();
|
|
200
|
+
}),
|
|
201
|
+
]);
|
|
202
|
+
if (drained) {
|
|
203
|
+
logger.log(`All in-flight work finished after ${elapsed()}`);
|
|
141
204
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
205
|
+
else {
|
|
206
|
+
stopHttpIntake();
|
|
207
|
+
disconnectSockets();
|
|
208
|
+
logger.warn(`Graceful shutdown timed out after ${elapsed()} with ${activeRequests} active HTTP request(s), ${transportActivity.count()} active transport handler(s), busy participants: [${[...busyParticipants].join(', ')}]`);
|
|
209
|
+
server?.closeAllConnections?.();
|
|
145
210
|
}
|
|
146
|
-
}
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
process.exitCode = 1;
|
|
214
|
+
logger.error('Graceful shutdown drain failed', error instanceof Error ? error.stack : String(error));
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
clearTimeout(deadlineTimer);
|
|
218
|
+
abort.abort();
|
|
219
|
+
}
|
|
220
|
+
phase = 'closing';
|
|
221
|
+
try {
|
|
222
|
+
await closeApp();
|
|
223
|
+
logger.log(`Graceful shutdown completed in ${elapsed()}`);
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
process.exitCode = 1;
|
|
227
|
+
logger.error('Graceful shutdown failed', error instanceof Error ? error.stack : String(error));
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
const shutdown = (signal) => {
|
|
232
|
+
shutdownPromise ??= run(signal);
|
|
147
233
|
return shutdownPromise;
|
|
148
234
|
};
|
|
149
235
|
for (const signal of signals) {
|
|
150
236
|
process.once(signal, () => {
|
|
151
|
-
void shutdown(signal)
|
|
237
|
+
void shutdown(signal)
|
|
238
|
+
.catch(() => undefined)
|
|
239
|
+
.finally(() => {
|
|
240
|
+
setTimeout(() => exit(Number(process.exitCode ?? 0)), EXIT_FALLBACK_MS).unref();
|
|
241
|
+
});
|
|
152
242
|
});
|
|
153
243
|
}
|
|
154
244
|
return {
|
|
155
|
-
isDraining: () =>
|
|
245
|
+
isDraining: () => phase !== 'running',
|
|
246
|
+
phase: () => phase,
|
|
156
247
|
activeRequests: () => activeRequests,
|
|
157
248
|
activeHandlers: () => transportActivity.count(),
|
|
158
249
|
shutdown,
|
|
159
250
|
};
|
|
160
251
|
}
|
|
161
|
-
static discoverParticipants(app, logger) {
|
|
162
|
-
const providers = GracefulShutdownHelper.getProviderInstances(app);
|
|
252
|
+
static discoverParticipants(app, providers, logger, signal) {
|
|
163
253
|
const participants = [];
|
|
164
254
|
const microserviceServers = app
|
|
165
255
|
.getMicroservices()
|
|
166
256
|
.map((microservice) => microservice.serverInstance)
|
|
167
257
|
.filter((server) => GracefulShutdownHelper.isClosable(server));
|
|
168
258
|
if (microserviceServers.length > 0) {
|
|
259
|
+
let pendingReplies = 0;
|
|
260
|
+
for (const server of microserviceServers) {
|
|
261
|
+
if (typeof server.sendMessage !== 'function')
|
|
262
|
+
continue;
|
|
263
|
+
const sendMessage = server.sendMessage.bind(server);
|
|
264
|
+
server.sendMessage = async (...args) => {
|
|
265
|
+
pendingReplies += 1;
|
|
266
|
+
try {
|
|
267
|
+
return await sendMessage(...args);
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
pendingReplies -= 1;
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
}
|
|
169
274
|
participants.push({
|
|
170
275
|
name: 'Kafka/microservice',
|
|
171
276
|
stopAccepting: () => Promise.all(microserviceServers.map((server) => {
|
|
@@ -175,23 +280,28 @@ class GracefulShutdownHelper {
|
|
|
175
280
|
}
|
|
176
281
|
return server.close();
|
|
177
282
|
})).then(() => undefined),
|
|
283
|
+
waitForIdle: () => GracefulShutdownHelper.waitUntil(() => pendingReplies === 0, signal),
|
|
178
284
|
});
|
|
179
285
|
}
|
|
180
|
-
const
|
|
286
|
+
const localQueues = new Set();
|
|
287
|
+
const workers = new Set();
|
|
181
288
|
for (const [token, instance] of providers) {
|
|
182
289
|
if (typeof token === 'string' &&
|
|
183
290
|
token.startsWith('BullQueue_') &&
|
|
184
|
-
GracefulShutdownHelper.
|
|
185
|
-
|
|
291
|
+
GracefulShutdownHelper.isBullQueue(instance)) {
|
|
292
|
+
localQueues.add(instance);
|
|
186
293
|
}
|
|
187
|
-
const worker = instance
|
|
188
|
-
if (GracefulShutdownHelper.
|
|
189
|
-
|
|
294
|
+
const worker = GracefulShutdownHelper.readProperty(instance, 'worker');
|
|
295
|
+
if (GracefulShutdownHelper.isBullMqWorker(worker))
|
|
296
|
+
workers.add(worker);
|
|
190
297
|
}
|
|
191
|
-
if (
|
|
298
|
+
if (localQueues.size > 0 || workers.size > 0) {
|
|
192
299
|
participants.push({
|
|
193
300
|
name: 'Bull/BullMQ',
|
|
194
|
-
stopAccepting: () => Promise.all([
|
|
301
|
+
stopAccepting: () => Promise.all([
|
|
302
|
+
...[...localQueues].map((queue) => queue.pause(true, false)),
|
|
303
|
+
...[...workers].map((worker) => worker.close()),
|
|
304
|
+
]).then(() => undefined),
|
|
195
305
|
});
|
|
196
306
|
}
|
|
197
307
|
const scheduler = providers
|
|
@@ -211,7 +321,7 @@ class GracefulShutdownHelper {
|
|
|
211
321
|
scheduler.deleteTimeout(timeoutName);
|
|
212
322
|
}
|
|
213
323
|
},
|
|
214
|
-
waitForIdle: () => GracefulShutdownHelper.waitUntil(() => cronJobs.every((cronJob) => !cronJob.isCallbackRunning)),
|
|
324
|
+
waitForIdle: () => GracefulShutdownHelper.waitUntil(() => cronJobs.every((cronJob) => !cronJob.isCallbackRunning), signal),
|
|
215
325
|
});
|
|
216
326
|
}
|
|
217
327
|
logger.log(participants.length === 0
|
|
@@ -221,6 +331,18 @@ class GracefulShutdownHelper {
|
|
|
221
331
|
.join(', ')}`);
|
|
222
332
|
return participants;
|
|
223
333
|
}
|
|
334
|
+
static discoverSocketServers(providers) {
|
|
335
|
+
const servers = new Set();
|
|
336
|
+
for (const [, instance] of providers) {
|
|
337
|
+
const server = GracefulShutdownHelper.readProperty(instance, 'server');
|
|
338
|
+
if (typeof server === 'object' &&
|
|
339
|
+
server !== null &&
|
|
340
|
+
typeof server.disconnectSockets === 'function') {
|
|
341
|
+
servers.add(server);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return [...servers];
|
|
345
|
+
}
|
|
224
346
|
static getProviderInstances(app) {
|
|
225
347
|
try {
|
|
226
348
|
const modules = app.get(core_1.ModulesContainer, { strict: false });
|
|
@@ -230,11 +352,47 @@ class GracefulShutdownHelper {
|
|
|
230
352
|
return [];
|
|
231
353
|
}
|
|
232
354
|
}
|
|
355
|
+
static readProperty(value, key) {
|
|
356
|
+
if (typeof value !== 'object' || value === null)
|
|
357
|
+
return undefined;
|
|
358
|
+
try {
|
|
359
|
+
return value[key];
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
return undefined;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
static resolveMs(value, envName, fallback) {
|
|
366
|
+
if (value !== undefined)
|
|
367
|
+
return value;
|
|
368
|
+
const raw = process.env[envName];
|
|
369
|
+
const parsed = Number(raw);
|
|
370
|
+
return raw !== undefined &&
|
|
371
|
+
raw !== '' &&
|
|
372
|
+
Number.isFinite(parsed) &&
|
|
373
|
+
parsed >= 0
|
|
374
|
+
? parsed
|
|
375
|
+
: fallback;
|
|
376
|
+
}
|
|
233
377
|
static isClosable(value) {
|
|
234
378
|
return (typeof value === 'object' &&
|
|
235
379
|
value !== null &&
|
|
236
380
|
typeof value.close === 'function');
|
|
237
381
|
}
|
|
382
|
+
static isBullQueue(value) {
|
|
383
|
+
return (typeof value === 'object' &&
|
|
384
|
+
value !== null &&
|
|
385
|
+
typeof value.pause === 'function' &&
|
|
386
|
+
typeof value.whenCurrentJobsFinished === 'function');
|
|
387
|
+
}
|
|
388
|
+
static isBullMqWorker(value) {
|
|
389
|
+
if (typeof value !== 'object' || value === null)
|
|
390
|
+
return false;
|
|
391
|
+
const worker = value;
|
|
392
|
+
return (typeof worker.close === 'function' &&
|
|
393
|
+
typeof worker.run === 'function' &&
|
|
394
|
+
typeof worker.isRunning === 'function');
|
|
395
|
+
}
|
|
238
396
|
static isSchedulerRegistry(value) {
|
|
239
397
|
if (typeof value !== 'object' || value === null)
|
|
240
398
|
return false;
|
|
@@ -254,10 +412,42 @@ class GracefulShutdownHelper {
|
|
|
254
412
|
return true;
|
|
255
413
|
});
|
|
256
414
|
}
|
|
257
|
-
static
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
415
|
+
static waitUntil(predicate, signal, onPoll) {
|
|
416
|
+
return new Promise((resolve) => {
|
|
417
|
+
let timer;
|
|
418
|
+
const done = () => {
|
|
419
|
+
clearTimeout(timer);
|
|
420
|
+
signal?.removeEventListener('abort', done);
|
|
421
|
+
resolve();
|
|
422
|
+
};
|
|
423
|
+
const check = () => {
|
|
424
|
+
if (signal?.aborted || predicate()) {
|
|
425
|
+
done();
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
timer = setTimeout(() => {
|
|
429
|
+
onPoll?.();
|
|
430
|
+
check();
|
|
431
|
+
}, PARTICIPANT_POLL_INTERVAL_MS);
|
|
432
|
+
};
|
|
433
|
+
signal?.addEventListener('abort', done, { once: true });
|
|
434
|
+
check();
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
static sleep(ms, signal) {
|
|
438
|
+
return new Promise((resolve) => {
|
|
439
|
+
if (signal?.aborted) {
|
|
440
|
+
resolve();
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
const done = () => {
|
|
444
|
+
clearTimeout(timer);
|
|
445
|
+
signal?.removeEventListener('abort', done);
|
|
446
|
+
resolve();
|
|
447
|
+
};
|
|
448
|
+
const timer = setTimeout(done, ms);
|
|
449
|
+
signal?.addEventListener('abort', done, { once: true });
|
|
450
|
+
});
|
|
261
451
|
}
|
|
262
452
|
}
|
|
263
453
|
exports.GracefulShutdownHelper = GracefulShutdownHelper;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graceful-shutdown.helper.js","sourceRoot":"","sources":["../../src/helpers/graceful-shutdown.helper.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"graceful-shutdown.helper.js","sourceRoot":"","sources":["../../src/helpers/graceful-shutdown.helper.ts"],"names":[],"mappings":"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"}
|