kubernetes-health
Version:
Helper library for implementing Kubernetes heath checks and graceful HTTP shutdown in Node applications
66 lines • 2.34 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.gracefulHttpTerminatorTask = void 0;
const https_1 = __importDefault(require("https"));
const tls_1 = require("tls");
const _utils_1 = require("./_utils");
function gracefulHttpTerminatorTask(server, terminationGracePeriodSeconds = 1) {
const isHTTPS = server instanceof https_1.default.Server;
let isTerminating = false;
const trackedSockets = new Set();
server.on('connection', (socket) => {
if (isTerminating)
return void socket.destroy();
trackedSockets.add(socket);
socket.once('close', () => trackedSockets.delete(socket));
return;
});
server.on('secureConnection', (socket) => {
if (isTerminating)
return void socket.destroy();
trackedSockets.add(socket);
socket.once('close', () => trackedSockets.delete(socket));
return;
});
const destroySocket = (socket) => {
socket.destroy();
trackedSockets.delete(socket);
};
return async () => {
if (isTerminating)
return;
isTerminating = true;
server.on('request', (_, res) => {
if (!res.headersSent) {
res.setHeader('connection', 'close');
}
});
for (const socket of trackedSockets) {
if (isHTTPS && !(socket instanceof tls_1.TLSSocket))
continue;
const res = socket._httpMessage;
if (!res)
destroySocket(socket);
else if (!res.headersSent)
res.setHeader('connection', 'close');
}
if (trackedSockets.size > 0) {
await (0, _utils_1.sleep)(terminationGracePeriodSeconds * 1000);
for (const socket of trackedSockets)
destroySocket(socket);
}
await new Promise((resolve, reject) => {
server.close((err) => {
if (err)
reject(err);
else
resolve();
});
});
};
}
exports.gracefulHttpTerminatorTask = gracefulHttpTerminatorTask;
//# sourceMappingURL=graceful.js.map