Sha256: 4b991290680d9027dd786493c6e816900355956d88afb6ae4d97b5ac5a3ee0f5

Contents?: true

Size: 1.08 KB

Versions: 8

Compression:

Stored size: 1.08 KB

Contents

module.exports = Pend;

function Pend() {
  this.pending = 0;
  this.max = Infinity;
  this.listeners = [];
  this.waiting = [];
  this.error = null;
}

Pend.prototype.go = function(fn) {
  if (this.pending < this.max) {
    pendGo(this, fn);
  } else {
    this.waiting.push(fn);
  }
};

Pend.prototype.wait = function(cb) {
  if (this.pending === 0) {
    cb(this.error);
  } else {
    this.listeners.push(cb);
  }
};

Pend.prototype.hold = function() {
  return pendHold(this);
};

function pendHold(self) {
  self.pending += 1;
  var called = false;
  return onCb;
  function onCb(err) {
    if (called) throw new Error("callback called twice");
    called = true;
    self.error = self.error || err;
    self.pending -= 1;
    if (self.waiting.length > 0 && self.pending < self.max) {
      pendGo(self, self.waiting.shift());
    } else if (self.pending === 0) {
      var listeners = self.listeners;
      self.listeners = [];
      listeners.forEach(cbListener);
    }
  }
  function cbListener(listener) {
    listener(self.error);
  }
}

function pendGo(self, fn) {
  fn(pendHold(self));
}

Version data entries

8 entries across 8 versions & 3 rubygems

Version Path
isomorfeus-puppetmaster-0.5.5 node_modules/pend/index.js
isomorfeus-puppetmaster-0.5.4 node_modules/pend/index.js
isomorfeus-puppetmaster-0.5.3 node_modules/pend/index.js
isomorfeus-puppetmaster-0.5.2 node_modules/pend/index.js
isomorfeus-puppetmaster-0.5.1 node_modules/pend/index.js
isomorfeus-puppetmaster-0.5.0 node_modules/pend/index.js
postdoc-0.2.0.beta4 node_modules/pend/index.js
dragonfly_puppeteer-0.1.0 node_modules/pend/index.js