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.

67 lines
1.5 KiB

6 years ago
/*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
}
};