Skip to content

Commit

Permalink
add emitting of errors
Browse files Browse the repository at this point in the history
  • Loading branch information
mlrawlings committed Jul 5, 2016
1 parent cbdb722 commit c2f5db9
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 5 deletions.
23 changes: 19 additions & 4 deletions src/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,15 @@ var wrapFn = exports.wrapFn = function(fn, options, instrumitter) {

var args = data.arguments
var before = process.hrtime()
var result = fn.apply(this, args)
var after = process.hrtime()

handleReturnEvent(data, options, instrumitter, result, before, after)
try {
var result = fn.apply(this, args)
var after = process.hrtime()
handleReturnEvent(data, options, instrumitter, result, before, after)
} catch(error) {
var after = process.hrtime()
handleReturnEventError(data, options, instrumitter, error, before, after)
throw error
}
handlePromiseEvent(data, options, instrumitter)

return result
Expand Down Expand Up @@ -46,6 +51,16 @@ var handleReturnEvent = exports.handleReturnEvent = function(data, options, inst
}
}

var handleReturnEventError = exports.handleReturnEventError = function(data, options, instrumitter, error, before, after) {
data.time = hrTimeToMilliSeconds(before)
data.return = { error, time:hrTimeToMilliSeconds(after) }
data.return.elapsed = data.return.time - data.time

if(options.return) {
instrumitter.emit(options.fn+':return', data)
}
}

var handleCallbackEvent = exports.handleCallbackEvent = function(data, options, instrumitter) {
var args = data.arguments
var callback = args[args.length-1]
Expand Down
19 changes: 18 additions & 1 deletion test.js
Original file line number Diff line number Diff line change
Expand Up @@ -146,5 +146,22 @@ describe('instrumitter', () => {
var httpEvents2 = instrumitter('http').watch('request', 'get')
expect(httpEvents2).to.equal(httpEvents)
})
it('should catch errors thrown by a function')
it('should catch errors thrown by a function', done => {
var object = {
test:function() {
throw new Error('test')
}
}

var objectEvents = instrumitter(object).watch('test')
objectEvents.once('test:return', fn => {
expect(fn.arguments).to.eql(['abc'])
expect(fn.return.value).to.not.exist
expect(fn.return.error.message).to.equal('test')
expect(fn.return.elapsed).to.be.above(0)
done()
})

expect(() => object.test('abc')).to.throw(/test/)
})
})

0 comments on commit c2f5db9

Please sign in to comment.