123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- /*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
- }
- };
|