decentralized-internet
Version:
An NPM library of programs to create decentralized web and distributed computing projects
1 lines • 4.89 kB
JavaScript
module.exports=function(e,n){var r=require("node-crontab"),o=require("underscore"),t=require("bluebird"),i=(require("os"),require("linkedlist")),c=require("find-process"),u=new i,s={},d=!1,h=new i,a={},l=!1,f=new i,p=new i,m=require("querystring");e.method({name:"cronprovider.addJobToUpdateQueue",method:function(e){return new t(function(n,r){try{s[e._id]||(u.push(e._id),s[e._id]=e,n(!0)),n(!1)}catch(e){r(e)}})},options:{}});e.method({name:"cronprovider.addJobToSubmitQueue",method:function(e,n){return new t(function(r,o){try{a[e._id]||(h.push(e._id),a[e._id]={_id:e._id,executionserver:e.executionserver,force:n},r(!0)),r(!1)}catch(e){o(e)}})},options:{}});e.method({name:"cronprovider.addJobToDeleteQueue",method:function(e){return new t(function(n,r){try{f.push(e),n(!0)}catch(e){r(e)}})},options:{}});e.method({name:"cronprovider.addJobToKillQueue",method:function(e){return new t(function(n,r){try{p.push(e),n(!0)}catch(e){r(e)}})},options:{}});const v=function(){return new t(function(n,r){if(l||!(h.length>0))return n(!1);l=!0;for(var o=[];h.length;){var i=h.shift();o.push(a[i])}t.map(o,function(n){return e.methods.executionserver.submitJob(n).then(function(e){return delete a[n._id],e}).catch(function(e){return console.error("Error while submitting job",n._id,e),e})},{concurrency:1}).then(function(e){l=!1,n(e)}).catch(function(e){l=!1,console.error(e),r(e)})})};e.method({name:"cronprovider.submitJobs",method:v,options:{}});e.method({name:"cronprovider.updateJobsStatus",method:v,options:{}});e.method({name:"cronprovider.killJobs",method:v,options:{}});e.method({name:"cronprovider.deleteJobs",method:v,options:{}});const b=function(){var n="_design/searchJob/_view/jobstatus?key="+JSON.stringify("RUN");return e.methods.clusterprovider.getView(n).then(function(n){return t.map(o.pluck(n,"value"),e.methods.cronprovider.addJobToUpdateQueue)}).catch(function(e){return console.error(e),e})},g=function(){var n="_design/searchJob/_view/jobstatus?key="+JSON.stringify("UPLOADING");return e.methods.clusterprovider.getView(n).then(function(n){return t.map(o.pluck(n,"value"),e.methods.cronprovider.addJobToUpdateQueue)}).catch(console.error)},w=function(){var n={key:JSON.stringify("KILL")},r="_design/searchJob/_view/jobstatus?"+m.stringify(n);return e.methods.clusterprovider.getView(r).then(function(n){return t.map(o.pluck(n,"value"),e.methods.cronprovider.addJobToKillQueue)}).catch(console.error)},J=function(){var n={key:JSON.stringify("DELETE")},r="_design/searchJob/_view/jobstatus?"+m.stringify(n);return e.methods.clusterprovider.getView(r).then(function(n){return t.map(o.pluck(n,"value"),e.methods.cronprovider.addJobToDeleteQueue)}).catch(console.error)},_=function(){var n;t.all([(n="_design/searchJob/_view/jobstatus?key="+JSON.stringify("QUEUE"),e.methods.clusterprovider.getView(n).then(function(n){return t.map(o.pluck(n,"value"),e.methods.cronprovider.addJobToSubmitQueue)}).catch(console.error)),b(),g(),w(),J()]).catch(console.error)};var y=e.methods.getCluster(),k=1;y&&y.worker&&(k=y.worker.id),crontime="*/"+String(1*k)+" * * * *",r.scheduleJob(crontime,function(){v().then(function(){return new t(function(n,r){if(!d&&u.length>0){var o=[];for(d=!0;u.length;){var i=u.shift();o.push(s[i])}t.map(o,function(n){return e.methods.executionserver.jobStatus(n).then(function(e){return delete s[n._id],e}).catch(function(e){return console.error("Error while updating job status",n._id,e),e})},{concurrency:1}).then(function(e){d=!1,n(e)}).catch(function(e){d=!1,console.error(e),r(e)})}else n(!1)})}).then(function(){return new t(function(n,r){if(p.length>0){for(var o=[];p.length;)o.push(p.shift());t.map(o,function(n){return e.methods.executionserver.jobKill(n).catch(function(e){return console.error("Error while killing job",n._id,e),e})},{concurrency:1}).then(n).catch(function(e){console.error(e),r(e)})}else n(!1)})}).then(function(){return new t(function(n,r){if(f.length>0){for(var o=[];f.length;)o.push(f.shift());t.map(o,function(n){return e.methods.executionserver.jobDelete(n).catch(function(e){console.error("Error while deleting job",n._id,e),console.error("Deleting from the DB now.")}).then(function(){return e.methods.dataprovider.jobDelete(n)}).catch(function(e){return console.error("Error while deleting job",n._id,e),e})},{concurrency:1}).then(n).catch(function(e){console.error(e),r(e)})}else n(!1)})}).catch(console.error)}),crontime="*/"+String(10*k)+" * * * *",r.scheduleJob(crontime,function(){_()}),_();r.scheduleJob("*/10 * * * *",function(){e.app.tunnels&&o.each(e.app.tunnels,function(r,o){r.pid&&c("pid",r.pid).then(function(r){0==r.length&&(console.log("Attempting to restart the tunnel..."),e.methods.executionserver.startTunnel(n.executionservers[o]).then(function(n){e.app.tunnels[o]=n,console.log("Tunnel started:",o)}).catch(function(e){console.error("Starting tunnel failed:",e)}))},function(e){console.error(e)})})})};