This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.2 KiB
67 lines
1.2 KiB
'use strict'; |
|
|
|
function Queue(options) { |
|
if (!(this instanceof Queue)) { |
|
return new Queue(options); |
|
} |
|
|
|
options = options || {}; |
|
this.concurrency = options.concurrency || Infinity; |
|
this.pending = 0; |
|
this.jobs = []; |
|
this.cbs = []; |
|
this._done = done.bind(this); |
|
} |
|
|
|
var arrayAddMethods = [ |
|
'push', |
|
'unshift', |
|
'splice' |
|
]; |
|
|
|
arrayAddMethods.forEach(function(method) { |
|
Queue.prototype[method] = function() { |
|
var methodResult = Array.prototype[method].apply(this.jobs, arguments); |
|
this._run(); |
|
return methodResult; |
|
}; |
|
}); |
|
|
|
Object.defineProperty(Queue.prototype, 'length', { |
|
get: function() { |
|
return this.pending + this.jobs.length; |
|
} |
|
}); |
|
|
|
Queue.prototype._run = function() { |
|
if (this.pending === this.concurrency) { |
|
return; |
|
} |
|
if (this.jobs.length) { |
|
var job = this.jobs.shift(); |
|
this.pending++; |
|
job(this._done); |
|
this._run(); |
|
} |
|
|
|
if (this.pending === 0) { |
|
while (this.cbs.length !== 0) { |
|
var cb = this.cbs.pop(); |
|
process.nextTick(cb); |
|
} |
|
} |
|
}; |
|
|
|
Queue.prototype.onDone = function(cb) { |
|
if (typeof cb === 'function') { |
|
this.cbs.push(cb); |
|
this._run(); |
|
} |
|
}; |
|
|
|
function done() { |
|
this.pending--; |
|
this._run(); |
|
} |
|
|
|
module.exports = Queue;
|
|
|