| Server IP : 68.183.124.220 / Your IP : 216.73.217.137 Web Server : Apache/2.4.18 (Ubuntu) System : Linux Sandbox-A 4.4.0-210-generic #242-Ubuntu SMP Fri Apr 16 09:57:56 UTC 2021 x86_64 User : gavin ( 1000) PHP Version : 7.0.33-0ubuntu0.16.04.16 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /home/gavin/workspace/happymandarin/node_modules/wrap-fn/ |
Upload File : |
/**
* Module Dependencies
*/
var noop = function(){};
var co = require('co');
/**
* Export `wrap-fn`
*/
module.exports = wrap;
/**
* Wrap a function to support
* sync, async, and gen functions.
*
* @param {Function} fn
* @param {Function} done
* @return {Function}
* @api public
*/
function wrap(fn, done) {
done = once(done || noop);
return function() {
// prevents arguments leakage
// see https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3-managing-arguments
var i = arguments.length;
var args = new Array(i);
while (i--) args[i] = arguments[i];
var ctx = this;
// done
if (!fn) {
return done.apply(ctx, [null].concat(args));
}
// async
if (fn.length > args.length) {
// NOTE: this only handles uncaught synchronous errors
try {
return fn.apply(ctx, args.concat(done));
} catch (e) {
return done(e);
}
}
// generator
if (generator(fn)) {
return co(fn).apply(ctx, args.concat(done));
}
// sync
return sync(fn, done).apply(ctx, args);
}
}
/**
* Wrap a synchronous function execution.
*
* @param {Function} fn
* @param {Function} done
* @return {Function}
* @api private
*/
function sync(fn, done) {
return function () {
var ret;
try {
ret = fn.apply(this, arguments);
} catch (err) {
return done(err);
}
if (promise(ret)) {
ret.then(function (value) { done(null, value); }, done);
} else {
ret instanceof Error ? done(ret) : done(null, ret);
}
}
}
/**
* Is `value` a generator?
*
* @param {Mixed} value
* @return {Boolean}
* @api private
*/
function generator(value) {
return value
&& value.constructor
&& 'GeneratorFunction' == value.constructor.name;
}
/**
* Is `value` a promise?
*
* @param {Mixed} value
* @return {Boolean}
* @api private
*/
function promise(value) {
return value && 'function' == typeof value.then;
}
/**
* Once
*/
function once(fn) {
return function() {
var ret = fn.apply(this, arguments);
fn = noop;
return ret;
};
}