Description
When dealing with unreliable APIs or failing services, continuously retrying failed operations can make the system unstable.
To prevent this, developers use a Circuit Breaker — a pattern that halts repeated calls after a certain number of failures and resumes automatically after a cooldown period.
In this challenge, you’ll build your own version of a Circuit Breaker that temporarily stops a function from being executed after multiple consecutive errors.
Your Task
Implement a function circuitBreaker(fn, retryLimit, time) that returns a wrapped function which:
- Executes
fn()normally until it fails consecutively more thanretryLimittimes. - After exceeding the retry limit, logs
"service not available"and stops callingfnfortimemilliseconds. - Automatically resets after the cooldown period and resumes normal execution.
Method
Function | Description |
|---|---|
| Returns a protected version of |
Example
Input
const testFunction = () => {
let count = 0;
return function () {
count++;
if (count < 4) {
throw "failed";
} else {
return "hello";
}
};
};
let t = testFunction();
let c = circuitBreaker(t, 3, 200);
c(); // "error"
c(); // "error"
c(); // "error"
// circuit is now open (service temporarily halted)
c(); // "service not available"
c(); // "service not available"
// after 200ms, it should resume
setTimeout(() => {
console.log(c()); // "hello"
}, 250);
Expected Output
error
error
error
service not available
service not available
hello
Expected Behavior
✅ Stops function calls after the retry threshold is reached
✅ Prints "service not available" when the circuit is open
✅ Automatically resets after the cooldown time
✅ Resumes execution normally afterward
Hints
Hint 1
Use a closure to track retryCount and circuit state (isHalted).
Hint 2
Use setTimeout to reset the breaker after cooldown.
Hint 3
Wrap function calls in a try–catch block to catch and count errors.