diff --git a/lib/circuit.js b/lib/circuit.js index 1a91c573..8b590eba 100644 --- a/lib/circuit.js +++ b/lib/circuit.js @@ -110,7 +110,7 @@ class CircuitBreaker extends EventEmitter { this.options.capacity = Number.isInteger(options.capacity) ? options.capacity : Number.MAX_SAFE_INTEGER; this.options.errorFilter = options.errorFilter || (_ => false); - + this.semaphore = new Semaphore(this.options.capacity); this[VOLUME_THRESHOLD] = Number.isInteger(options.volumeThreshold) @@ -313,7 +313,7 @@ class CircuitBreaker extends EventEmitter { get stats () { return this[STATUS].stats; } - + /** * Get the hystrixStats. * @type {HystrixStats} @@ -471,7 +471,7 @@ class CircuitBreaker extends EventEmitter { */ const latency = Date.now() - latencyStartTime; this.semaphore.release(); - this.emit('timeout', error, latency); + this.emit('timeout', error, latency, args); resolve(handleError( error, this, timeout, args, latency, resolve, reject)); }, this.options.timeout); @@ -638,7 +638,7 @@ function fail (circuit, err, args, latency) { * @event CircuitBreaker#failure * @type {Error} */ - circuit.emit('failure', err, latency); + circuit.emit('failure', err, latency, args); if (circuit.warmUp) return; // check stats to see if the circuit should be opened diff --git a/test/test.js b/test/test.js index b5912c01..f6b95608 100644 --- a/test/test.js +++ b/test/test.js @@ -795,6 +795,23 @@ test('Circuit Breaker failure event emits latency', t => { breaker.fire(-1).catch(noop); }); +test('Circuit Breaker failure event emits function parameters', t => { + t.plan(6); + const breaker = circuit(passFail); + breaker.on('failure', (result, latencyTime, args) => { + t.ok(args, 'third argument is the function args'); + t.equal(Array.isArray(args), true, 'The args parameter is an array'); + t.equal(args[0], -1, 'this is the first argument'); + t.equal(args[1].arg1, 'arg1', 'this is the second argument object'); + t.equal(args[1].arg2, 'arg2', 'this is the second argument object'); + t.equal(args[2][0], '1', 'this is the third argument'); + breaker.shutdown(); + t.end(); + }); + + breaker.fire(-1, { arg1: 'arg1', arg2: 'arg2' }, ['1', '2']).catch(noop); +}); + test('Circuit Breaker timeout event emits latency', t => { t.plan(1); const breaker = circuit(slowFunction, { timeout: 10 }); @@ -808,6 +825,24 @@ test('Circuit Breaker timeout event emits latency', t => { breaker.fire(-1).catch(noop); }); +test('Circuit Breaker timeout event emits function parameters', t => { + t.plan(6); + const breaker = circuit(slowFunction, { timeout: 10 }); + + breaker.on('timeout', (result, latencyTime, args) => { + t.ok(args, 'third argument is the function args'); + t.equal(Array.isArray(args), true, 'The args parameter is an array'); + t.equal(args[0], -1, 'this is the first argument'); + t.equal(args[1].arg1, 'arg1', 'this is the second argument object'); + t.equal(args[1].arg2, 'arg2', 'this is the second argument object'); + t.equal(args[2][0], '1', 'this is the third argument'); + breaker.shutdown(); + t.end(); + }); + + breaker.fire(-1, {arg1: 'arg1', arg2: 'arg2'}, ['1', '2']).catch(noop); +}); + test('Circuit Breaker timeout with semaphore released', t => { t.plan(1); const breaker = circuit(slowFunction, { timeout: 10, capacity: 2 });