computes-ipfs
Version:
computes.io distributed supercomputer
144 lines (109 loc) • 2.76 kB
JavaScript
var util=require('util')
var EventEmitter = require( "events" ).EventEmitter
var Job = function(){}
util.inherits(Job, EventEmitter)
const os = require('os')
const path = require('path')
const IPFS = require('ipfs')
var uuid = require('uuid')
var jobs = []
var node
function connect(domain){
var job = new Job();
node = new IPFS({
repo: path.join(os.tmpdir() + '/' + new Date().toString()),
init: {
emptyRepo: true,
bits: 2048
},
start: true,
EXPERIMENTAL: {
pubsub: true
},
config: { // overload the default config to avoid ports in use
Addresses: {
Swarm: [
'/ip4/127.0.0.1/tcp/1337'
]
}
}
});
node.on('ready', () => {
console.log('Node is now ready and online')
node.id(function(err, data){
console.log("Node info:", data)
nodeData = data
node.pubsub.subscribe(domain, receiveMsg);
node.pubsub.subscribe(nodeData.id, receivePM);
// connection ready
job.emit("ready");
});
});
// core detected available for work
const receiveMsg = (msg) => {
if(jobs.length > 0){
var dataObj = JSON.parse(msg.data.toString());
var fromNode = dataObj.node.id;
var msgObj = {
node: nodeData,
compute: jobs[0].operation,
data: jobs[0].data
}
jobs.splice(0, 1);
var msgSend = new Buffer(JSON.stringify(msgObj).toString());
node.pubsub.publish(fromNode, msgSend, (err) => {
if (err) {throw err}
})
}
}
// core reporting result
const receivePM = (msg) => {
console.log("private:",msg.data.toString());
var dataObj = JSON.parse(msg.data.toString());
var fromNode = dataObj.node.id;
var results = {
result: dataObj.result
}
job.emit( "result", results );
}
return job;
}
Job.prototype.cancel = function(){};
Job.prototype.disconnect = function(){
// stopping a node
node.stop(() => {
// node is now 'offline'
process.exit()
})
};
Job.prototype.compute = function compute(operation, data, options){
var jobid = 'computes:' + uuid.v1();
var payload={
client: { "name": "job-creator" },
jobid: jobid,
operation: operation,
data: data,
options: options
};
jobs.push(payload)
}
Job.prototype.execute = function execute(command, options){
var jobid = 'computes:' + uuid.v1();
var payload={
client: { "name": "job-creator" },
jobid: jobid,
command: command,
options: options
};
jobs.push(payload)
}
Job.prototype.cancel = function cancel(job){
var payload={
client:{ "name": "job-creator" },
jobs: [job]
};
// submitJob('killJobs', payload);
}
module.exports = {
connect: connect
}