43 lines
1.5 KiB
JavaScript
43 lines
1.5 KiB
JavaScript
|
// Inspired by https://github.com/tlrobinson/long-stack-traces
|
||
|
var EventEmitter = require('events').EventEmitter;
|
||
|
var util = require('util');
|
||
|
|
||
|
function extendTrace(object, property, pos) {
|
||
|
var old = object[property];
|
||
|
object[property] = function() {
|
||
|
var error = new Error();
|
||
|
var name = object.constructor.name + '#' + property + '(' +
|
||
|
Array.prototype.slice.call(arguments).map(function(el) {
|
||
|
return util.inspect(el, false, 0);
|
||
|
}).join(', ') + ')';
|
||
|
|
||
|
if (typeof pos === 'undefined') pos = -1;
|
||
|
if (pos < 0) pos += arguments.length;
|
||
|
var cb = arguments[pos];
|
||
|
if (typeof arguments[pos] === 'function') {
|
||
|
arguments[pos] = function replacement() {
|
||
|
try {
|
||
|
return cb.apply(this, arguments);
|
||
|
} catch (err) {
|
||
|
if (err && err.stack && !err.__augmented) {
|
||
|
err.stack = filter(err).join('\n');
|
||
|
err.stack += '\n--> in ' + name;
|
||
|
err.stack += '\n' + filter(error).slice(1).join('\n');
|
||
|
err.__augmented = true;
|
||
|
}
|
||
|
throw err;
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
return old.apply(this, arguments);
|
||
|
};
|
||
|
}
|
||
|
exports.extendTrace = extendTrace;
|
||
|
|
||
|
|
||
|
function filter(error) {
|
||
|
return error.stack.split('\n').filter(function(line) {
|
||
|
return line.indexOf(__filename) < 0;
|
||
|
});
|
||
|
}
|