UNPKG

kubernetes-health

Version:

Helper library for implementing Kubernetes heath checks and graceful HTTP shutdown in Node applications

66 lines 2.34 kB
"use strict"; 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