pockry
11/21/2014 - 5:49 AM

passport.js高阶函数实现

passport.js高阶函数实现

function Authenticator(){
  this._serializers = [];
}
Authenticator.prototype.serializeUser = function(fn, req, done) {
  if (typeof fn === 'function') {
    return this._serializers.push(fn);
}
  var user = fn;
  if (typeof req === 'function') {
    done = req;
    req = undefined;
  }
  var stack = this._serializers;
  (function pass(i, err, obj) {
    if ('pass' === err) {
      err = undefined;
    }
    if (err || obj || obj === 0) { return done(err, obj); }
      var layer = stack[i];
    if (!layer) {
      return done(new Error('Failed to serialize user into session'));
    }
    function serialized(e, o) {
      pass(i + 1, e, o);
    }
    try {
      var arity = layer.length;
      if (arity == 3) {
        layer(req, user, serialized);
      } else {
        layer(user, serialized);
      }
    } catch(e) {
      return done(e);
    }
  })(0);
};