/*
RFC-1031: Health monitor — tracks consecutive health check failures
and triggers quarantine after a configurable threshold (default: 3).
- Does not perform health checks — receives results from callers.
- Does not quarantine candidates — returns a boolean, caller acts on it.
- RFC-1031: initial implementation — consecutive failure tracking with configurable threshold.
*/
import type { HealthCheckResultV1 } from "./contracts.ts";
export interface HealthMonitor {
recordResult(candidateId: string, result: HealthCheckResultV1): void;
shouldQuarantine(candidateId: string): boolean;
getConsecutiveFailures(candidateId: string): number;
reset(candidateId: string): void;
}
export function createHealthMonitor(quarantineThreshold: number = 3): HealthMonitor {
const consecutiveFailures = new Map();
return {
recordResult(candidateId: string, result: HealthCheckResultV1): void {
const current = consecutiveFailures.get(candidateId) ?? 0;
if (result.status === "unhealthy") {
consecutiveFailures.set(candidateId, current + 1);
} else {
consecutiveFailures.set(candidateId, 0);
}
},
shouldQuarantine(candidateId: string): boolean {
const failures = consecutiveFailures.get(candidateId) ?? 0;
return failures >= quarantineThreshold;
},
getConsecutiveFailures(candidateId: string): number {
return consecutiveFailures.get(candidateId) ?? 0;
},
reset(candidateId: string): void {
consecutiveFailures.delete(candidateId);
},
};
}