123456789101112131415161718192021222324252627282930313233343536373839404142 |
- // 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;
- });
- }
|