UNPKG

kubernetes-health

Version:

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

98 lines 3.67 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.startProbeServer = exports.createProbeServer = exports.createReadinessProbeListener = exports.createLivenessProbeListener = void 0; const http_1 = __importDefault(require("http")); const url_1 = require("url"); function requestListenerToProbeListener(requestListener) { const probeListener = ((req, res) => { // http.Server, Express, Connect if (res instanceof http_1.default.ServerResponse) { return requestListener({}, res); } // Fastify if ('raw' in res && res.raw instanceof http_1.default.ServerResponse) { return requestListener({}, res.raw); } // Koa if (req && 'res' in req && req.res instanceof http_1.default.ServerResponse) { return requestListener({}, req.res); } }); return probeListener; } /** * Creates a new `ProbeListener` that returns 200 if the specified `Health` instance is live, and 500 otherwise. * * @param health the `Health` instance * @returns an `ProbeListener` */ function createLivenessProbeListener(health) { return requestListenerToProbeListener((_, res) => { if (health.isLive) { res.statusCode = 200; res.end('live'); } else { res.statusCode = 500; res.end('not live'); } }); } exports.createLivenessProbeListener = createLivenessProbeListener; /** * Creates a new `ProbeListener` that returns 200 if the specified `Health` instance is ready, and 500 otherwise. * * @param health the `Health` instance * @returns an `ProbeListener` */ function createReadinessProbeListener(health) { return requestListenerToProbeListener((_, res) => { if (health.isReady) { res.statusCode = 200; res.end('ready'); } else { res.statusCode = 500; res.end('not ready'); } }); } exports.createReadinessProbeListener = createReadinessProbeListener; /** * Creates a new `http.Server` configured to serve the liveness and readiness endpoints for a given Health instance. * * @param health the `Health` instance to serve * @param options options for the health probe server * @returns an `http.Server` ready to serve the health probes */ function createProbeServer(health, options = {}) { const { livenessEndpoint = '/healthz', readinessEndpoint = '/readyz' } = options; const livenessListener = createLivenessProbeListener(health); const readinessListener = createReadinessProbeListener(health); return http_1.default.createServer((req, res) => { const url = new url_1.URL(req.url, `http://${req.headers.host}`); if (url.pathname === livenessEndpoint) return livenessListener(req, res); if (url.pathname === readinessEndpoint) return readinessListener(req, res); res.statusCode = 404; res.end('not found'); }); } exports.createProbeServer = createProbeServer; /** * Create and start a health probe server, listening on on the specified port / hostname. * * @param health the `Health` instance to serve * @param options options for the health probe server */ function startProbeServer(health, options = {}) { const { port = 4000, hostname } = options; const server = createProbeServer(health, options); return server.listen(port, hostname); } exports.startProbeServer = startProbeServer; //# sourceMappingURL=probes.js.map