You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.5 KiB
66 lines
1.5 KiB
/*jshint node:true */ |
|
|
|
"use strict"; |
|
|
|
var eos = require('end-of-stream'); |
|
var consume = require('stream-consume'); |
|
|
|
module.exports = function (task, done) { |
|
var that = this, finish, cb, isDone = false, start, r; |
|
|
|
finish = function (err, runMethod) { |
|
var hrDuration = process.hrtime(start); |
|
|
|
if (isDone && !err) { |
|
err = new Error('task completion callback called too many times'); |
|
} |
|
isDone = true; |
|
|
|
var duration = hrDuration[0] + (hrDuration[1] / 1e9); // seconds |
|
|
|
done.call(that, err, { |
|
duration: duration, // seconds |
|
hrDuration: hrDuration, // [seconds,nanoseconds] |
|
runMethod: runMethod |
|
}); |
|
}; |
|
|
|
cb = function (err) { |
|
finish(err, 'callback'); |
|
}; |
|
|
|
try { |
|
start = process.hrtime(); |
|
r = task(cb); |
|
} catch (err) { |
|
return finish(err, 'catch'); |
|
} |
|
|
|
if (r && typeof r.then === 'function') { |
|
// wait for promise to resolve |
|
// FRAGILE: ASSUME: Promises/A+, see http://promises-aplus.github.io/promises-spec/ |
|
r.then(function () { |
|
finish(null, 'promise'); |
|
}, function(err) { |
|
finish(err, 'promise'); |
|
}); |
|
|
|
} else if (r && typeof r.pipe === 'function') { |
|
// wait for stream to end |
|
|
|
eos(r, { error: true, readable: r.readable, writable: r.writable && !r.readable }, function(err){ |
|
finish(err, 'stream'); |
|
}); |
|
|
|
// Ensure that the stream completes |
|
consume(r); |
|
|
|
} else if (task.length === 0) { |
|
// synchronous, function took in args.length parameters, and the callback was extra |
|
finish(null, 'sync'); |
|
|
|
//} else { |
|
// FRAGILE: ASSUME: callback |
|
|
|
} |
|
};
|
|
|