| 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/kareem/ |
Upload File : |
'use strict';
function Kareem() {
this._pres = {};
this._posts = {};
}
Kareem.prototype.execPre = function(name, context, callback) {
var pres = this._pres[name] || [];
var numPres = pres.length;
var numAsyncPres = pres.numAsync || 0;
var currentPre = 0;
var asyncPresLeft = numAsyncPres;
var done = false;
if (!numPres) {
return process.nextTick(function() {
callback(null);
});
}
var next = function() {
if (currentPre >= numPres) {
return;
}
var pre = pres[currentPre];
if (pre.isAsync) {
pre.fn.call(
context,
function(error) {
if (error) {
if (done) {
return;
}
done = true;
return callback(error);
}
++currentPre;
next.apply(context, arguments);
},
function(error) {
if (error) {
if (done) {
return;
}
done = true;
return callback(error);
}
if (--numAsyncPres === 0) {
return callback(null);
}
});
} else if (pre.fn.length > 0) {
var args = [function(error) {
if (error) {
if (done) {
return;
}
done = true;
return callback(error);
}
if (++currentPre >= numPres) {
if (asyncPresLeft > 0) {
// Leave parallel hooks to run
return;
} else {
return callback(null);
}
}
next.apply(context, arguments);
}];
if (arguments.length >= 2) {
for (var i = 1; i < arguments.length; ++i) {
args.push(arguments[i]);
}
}
pre.fn.apply(context, args);
} else {
pre.fn.call(context);
if (++currentPre >= numPres) {
if (asyncPresLeft > 0) {
// Leave parallel hooks to run
return;
} else {
return process.nextTick(function() {
callback(null);
});
}
}
next();
}
};
next();
};
Kareem.prototype.execPreSync = function(name, context) {
var pres = this._pres[name] || [];
var numPres = pres.length;
for (var i = 0; i < numPres; ++i) {
pres[i].fn.call(context);
}
};
Kareem.prototype.execPost = function(name, context, args, options, callback) {
if (arguments.length < 5) {
callback = options;
options = null;
}
var posts = this._posts[name] || [];
var numPosts = posts.length;
var currentPost = 0;
var firstError = null;
if (options && options.error) {
firstError = options.error;
}
if (!numPosts) {
return process.nextTick(function() {
callback.apply(null, [firstError].concat(args));
});
}
var next = function() {
var post = posts[currentPost];
if (firstError) {
if (post.length === args.length + 2) {
post.apply(context, [firstError].concat(args).concat(function(error) {
if (error) {
firstError = error;
}
if (++currentPost >= numPosts) {
return callback.call(null, firstError);
}
next();
}));
} else {
if (++currentPost >= numPosts) {
return callback.call(null, firstError);
}
next();
}
} else {
if (post.length === args.length + 2) {
// Skip error handlers if no error
if (++currentPost >= numPosts) {
return callback.apply(null, [null].concat(args));
}
return next();
}
if (post.length === args.length + 1) {
post.apply(context, args.concat(function(error) {
if (error) {
firstError = error;
return next();
}
if (++currentPost >= numPosts) {
return callback.apply(null, [null].concat(args));
}
next();
}));
} else {
post.apply(context, args);
if (++currentPost >= numPosts) {
return callback.apply(null, [null].concat(args));
}
next();
}
}
};
next();
};
Kareem.prototype.execPostSync = function(name, context) {
var posts = this._posts[name] || [];
var numPosts = posts.length;
for (var i = 0; i < numPosts; ++i) {
posts[i].call(context);
}
};
function _handleWrapError(instance, error, name, context, args, options, callback) {
if (options.useErrorHandlers) {
var _options = { error: error };
var newArgs = [];
// Filter out trailing undefineds
for (var i = args.length; i >= 0; --i) {
if (newArgs.length > 0 || args[i] !== void 0) {
newArgs.unshift(args[i]);
}
}
return instance.execPost(name, context, newArgs, _options, function(error) {
return typeof callback === 'function' && callback(error);
});
} else {
return typeof callback === 'function' ?
callback(error) :
undefined;
}
}
Kareem.prototype.wrap = function(name, fn, context, args, options) {
var lastArg = (args.length > 0 ? args[args.length - 1] : null);
var argsWithoutCb = typeof lastArg === 'function' ?
args.slice(0, args.length - 1) :
args;
var _this = this;
var useLegacyPost;
if (typeof options === 'object') {
useLegacyPost = options && options.useLegacyPost;
} else {
useLegacyPost = options;
}
options = options || {};
this.execPre(name, context, function(error) {
if (error) {
return _handleWrapError(_this, error, name, context, argsWithoutCb,
options, lastArg)
}
var end = (typeof lastArg === 'function' ? args.length - 1 : args.length);
fn.apply(context, args.slice(0, end).concat(function() {
var args = arguments;
var argsWithoutError = Array.prototype.slice.call(arguments, 1);
if (arguments[0]) {
// Assume error
return _handleWrapError(_this, arguments[0], name, context,
args, options, lastArg);
} else {
if (useLegacyPost && typeof lastArg === 'function') {
lastArg.apply(context, arguments);
}
_this.execPost(name, context, argsWithoutError, function() {
if (arguments[0]) {
return typeof lastArg === 'function' ?
lastArg(arguments[0]) :
undefined;
}
return typeof lastArg === 'function' && !useLegacyPost ?
lastArg.apply(context, arguments) :
undefined;
});
}
}));
});
};
Kareem.prototype.createWrapper = function(name, fn, context, options) {
var _this = this;
return function() {
var args = Array.prototype.slice.call(arguments);
_this.wrap(name, fn, context, args, options);
};
};
Kareem.prototype.pre = function(name, isAsync, fn, error) {
if (typeof arguments[1] !== 'boolean') {
error = fn;
fn = isAsync;
isAsync = false;
}
this._pres[name] = this._pres[name] || [];
var pres = this._pres[name];
if (isAsync) {
pres.numAsync = pres.numAsync || 0;
++pres.numAsync;
}
pres.push({ fn: fn, isAsync: isAsync });
return this;
};
Kareem.prototype.post = function(name, fn) {
(this._posts[name] = this._posts[name] || []).push(fn);
return this;
};
Kareem.prototype.clone = function() {
var n = new Kareem();
for (var key in this._pres) {
n._pres[key] = this._pres[key].slice();
}
for (var key in this._posts) {
n._posts[key] = this._posts[key].slice();
}
return n;
};
module.exports = Kareem;