| 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	}};
 |