67 lines
1.5 KiB
JavaScript
67 lines
1.5 KiB
JavaScript
|
/*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
|
||
|
|
||
|
}
|
||
|
};
|