UNPKG

jobq

Version:

Async and parallel execution of jobs, tasks and processes with a queue manager

1 lines 6.27 kB
var JobQ=function(t){function e(i){if(s[i])return s[i].exports;var n=s[i]={exports:{},id:i,loaded:!1};return t[i].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var s={};return e.m=t,e.c=s,e.p="",e(0)}([function(t,e){"use strict";function s(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n=function(){function t(t,e){for(var s=0;s<e.length;s++){var i=e[s];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,s,i){return s&&t(e.prototype,s),i&&t(e,i),e}}(),r="Configuration Object Required",o="required paramenter [process] must be a function",u="Source is required to be an array, function, promise or stream",a="parameter stopOnError must be a boolean",c="Only Function source can be used with pooling",h=function(){function t(e){if(s(this,t),!e)throw new Error(r);if(!e.process||"function"!=typeof e.process)throw new Error(o);if(!e.source||"invalid"===this.getType(e.source))throw new Error(u);if(e.stopOnError&&"boolean"!=typeof e.stopOnError)throw new Error(a);if(this.events={},this.debug=e.debug,this.maxProceses=e.maxProceses>=0?e.maxProceses:1,this.process=e.process,this.stopOnError=e.stopOnError||!1,this.sourceType=this.getType(e.source),"array"===this.sourceType?this.source=e.source.slice(0):this.source=e.source,this.running=0,this.jobsFinished=0,this.jobErrors=0,this.fillingJobs=!1,this.autoincrementId=0,this.status="stoped",this.paused=!1,this.poolingInterval=e.pooling>=0&&e.pooling,"function"!==this.sourceType&&"promise"!==this.sourceType&&this.poolingInterval!==!1)throw new Error(c)}return n(t,[{key:"data",value:function(t){var e={startTime:this.startTime,processed:this.jobsFinished,errors:this.jobErrors,maxProceses:this.maxProceses,stopOnError:this.stopOnError,sourceType:this.sourceType,status:this.status};if(t)for(var s in t)t.hasOwnProperty(s)&&(e[s]=t[s]);return e}},{key:"start",value:function(){this.status="running",this.startTime=new Date,this.emit("start",this.data()),this.init()}},{key:"pause",value:function(){"running"!==this.status&&"pooling"!==this.status||(this.paused=!0,this.status="paused",this.emit("pause",this.data()))}},{key:"resume",value:function(){"running"!==this.status&&(this.paused=!1,this.status="running",this.emit("resume",this.data()),this.fillJobs())}},{key:"getType",value:function(t){return t?Array.isArray(t)?"array":t.then?"promise":"object"===i(t._readableState)&&"function"==typeof t.on?"stream":"function"==typeof t?"function":"invalid":"invalid"}},{key:"init",value:function(){var t=this;"promise"===this.sourceType?(this.log("Got promise source. Resolving"),this.source.then(function(e){if(t.sourceType=t.getType(e),"invalid"===t.sourceType)throw new Error(u);if("function"!==t.sourceType&&"promise"!==t.sourceType){if(t.poolingInterval!==!1)throw new Error(c);t.source=e.slice(0)}else t.source=e;t.init()}).catch(function(e){t.processFinish(e)})):"stream"===this.sourceType?(this.log("Got stream source. Initializing"),this.initializeStream()):(this.log("Got "+this.sourceType+" source. Starting"),this.fillJobs())}},{key:"processFinish",value:function(t){var e=this;t?(this.emit("error",t),this.status="error"):this.status="finished",this.poolingInterval===!1?this.emit("processFinish",this.data({endTime:new Date})):(this.status="pooling",this.empty=!1,this.emit("pooling",this.data()),setTimeout(function(){e.status="running",e.fillJobs()},this.poolingInterval))}},{key:"on",value:function(t,e){return this.events[t]=e,this}},{key:"emit",value:function(t,e){"error"===t&&this.stopOnError&&(this.status="error"),this.log(t,e),this.events[t]&&this.events[t](e)}},{key:"log",value:function(t,e){this.debug&&console&&console.log("["+new Date+"]["+t+"]",e)}},{key:"runningJobsCount",value:function(){return this.running}},{key:"runJob",value:function(t){var e=this;this.running++;var s=++this.autoincrementId;this.emit("jobRun",s);var i=function(){var t=--e.running;return!t&&"empty"===e.status||"error"===e.status?(e.status="finished",e.processFinish()):void e.fillJobs()},n=new Date;t(function(t,r){if(t)e.emit("error",t),e.jobErrors++;else if(r){var o=new Date;e.emit("jobFinish",{jobId:s,jobStartTime:n,jobEndTime:o,result:r,jobsRunning:e.running}),e.jobsFinished++}i()})}},{key:"fillJobs",value:function(){var t=this;if(!this.fillingJobs){this.fillingJobs=!0;for(var e=function(e,s){try{var i=!1;if(null!==e){var n=t.process(e,function(t,e){i||s(t,e)});if(n){if(i=!0,"function"==typeof n.then)return n.then(function(t){s(null,t)}).catch(s);s(null,n)}}else t.status="empty",s()}catch(t){s(t)}};!this.paused&&(0===this.maxProceses||this.running<this.maxProceses)&&"running"===this.status&&("array"===this.sourceType&&this.source.length||"array"!==this.sourceType);){this.emit("jobFetch",{jobsRunning:this.running});var s=function(s){var i=void 0,n=!1;"array"===t.sourceType?(i=t.source.splice(0,1)[0],t.source.length||(t.status="empty")):"stream"===t.sourceType?t.waitForStreamData(function(t,i){e(i,s)}):i=t.source(function(t,i){if(!n){if(t)return s(t);e(i,s)}}),void 0!==i&&(i&&i.then&&"function"==typeof i.then?i.then(function(t){e(t,s)}).catch(s):null!==i?(n=!0,e(i,s)):(t.status="empty",n=!0,s()))};this.runJob(s)}this.fillingJobs=!1}}},{key:"initializeStream",value:function(){var t=this;this.source.on("readable",function(){t.log("Stream ready. Starting"),t.streamEnded=!1,t.fillJobs()}),this.source.on("end",function(){t.streamEnded=!0})}},{key:"waitForStreamData",value:function(t){var e=this;this.streamEnded?t(null,null):setTimeout(function(){var s=e.source.read();s?t(null,s):e.waitForStreamData(t)},0)}}]),t}(),l=function(){function t(e){s(this,t),this.instance=new h(e)}return n(t,[{key:"on",value:function(t,e){return this.instance.on(t,e),this}},{key:"start",value:function(){return this.instance.start(),this}},{key:"pause",value:function(){return this.instance.pause(),this}},{key:"resume",value:function(){return this.instance.resume(),this}},{key:"runningJobsCount",value:function(){return this.instance.runningJobsCount()}}]),t}();t.exports=l}]);