aboutsummaryrefslogtreecommitdiffstats
path: root/vnfmarket/src/main/webapp/vnfmarket/node_modules/pend/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'vnfmarket/src/main/webapp/vnfmarket/node_modules/pend/index.js')
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/pend/index.js55
1 files changed, 55 insertions, 0 deletions
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/pend/index.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/pend/index.js
new file mode 100644
index 00000000..3bf485ed
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/pend/index.js
@@ -0,0 +1,55 @@
+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));
+}