testcontainers
Version:
Testcontainers is a NodeJS library that supports tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container
44 lines • 2.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.HealthCheckWaitStrategy = void 0;
const wait_strategy_1 = require("./wait-strategy");
const common_1 = require("../common");
const container_runtime_1 = require("../container-runtime");
class HealthCheckWaitStrategy extends wait_strategy_1.AbstractWaitStrategy {
async waitUntilReady(container) {
common_1.log.debug(`Waiting for health check...`, { containerId: container.id });
const client = await (0, container_runtime_1.getContainerRuntimeClient)();
const containerEvents = await client.container.events(container, ["health_status"]);
return new Promise((resolve, reject) => {
const timeout = setTimeout(() => {
const message = `Health check not healthy after ${this.startupTimeout}ms`;
common_1.log.error(message, { containerId: container.id });
containerEvents.destroy();
reject(new Error(message));
}, this.startupTimeout);
const onTerminalState = () => {
clearTimeout(timeout);
containerEvents.destroy();
common_1.log.debug(`Health check wait strategy complete`, { containerId: container.id });
};
containerEvents.on("data", (data) => {
const parsedData = JSON.parse(data);
const status = parsedData.status.split(":").length === 2
? parsedData.status.split(":")[1].trim() // Docker
: parsedData.HealthStatus; // Podman
if (status === "healthy") {
resolve();
onTerminalState();
}
else if (status === "unhealthy") {
const message = `Health check failed: ${status}`;
common_1.log.error(message, { containerId: container.id });
reject(new Error(message));
onTerminalState();
}
});
});
}
}
exports.HealthCheckWaitStrategy = HealthCheckWaitStrategy;
//# sourceMappingURL=health-check-wait-strategy.js.map