kubernetes-health
Version:
Helper library for implementing Kubernetes heath checks and graceful HTTP shutdown in Node applications
98 lines • 3.67 kB
JavaScript
;
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