From 6327cab09b1215c0ea5708fe86e27ad9817182de Mon Sep 17 00:00:00 2001 From: Lance Ball Date: Tue, 17 Nov 2020 08:52:30 -0500 Subject: [PATCH] feat: pass circuit params to error filter When the circuit invocation fails, and there is an error filter in place, this change provides the function invocation parameters as the second parameter to `errorFilter()`. Fixes: https://github.com/nodeshift/opossum/issues/489 Signed-off-by: Lance Ball --- lib/circuit.js | 2 +- test/error-filter-test.js | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/circuit.js b/lib/circuit.js index f535211c..bde9c6db 100644 --- a/lib/circuit.js +++ b/lib/circuit.js @@ -648,7 +648,7 @@ class CircuitBreaker extends EventEmitter { function handleError (error, circuit, timeout, args, latency, resolve, reject) { clearTimeout(timeout); - if (circuit.options.errorFilter(error)) { + if (circuit.options.errorFilter(error, ...args)) { circuit.emit('success', error, latency); } else { fail(circuit, error, args, latency); diff --git a/test/error-filter-test.js b/test/error-filter-test.js index d142459d..62bea45d 100644 --- a/test/error-filter-test.js +++ b/test/error-filter-test.js @@ -9,7 +9,7 @@ const options = { resetTimeout: 10000, // if this function returns true, the error statistics // should not be incremented - errorFilter: err => err.statusCode < 500 + errorFilter: (err) => err.statusCode < 500 }; test('Bypasses failure stats if errorFilter returns true', t => { @@ -54,3 +54,23 @@ test('Increments failure stats if no filter is provided', t => { t.end(); }); }); + +test('Provides invocation parameters to error filter', t => { + t.plan(3); + const errorCode = 504; + const breaker = new CircuitBreaker(failWithCode, + { + errorThresholdPercentage: 1, + errorFilter: (err, param) => { + t.equal(param, errorCode); + t.equal(err.statusCode, errorCode); + } + } + ); + breaker.fire(errorCode) + .then(t.fail) + .catch(err => { + t.equal(err.statusCode, errorCode); + t.end() + }); +});