computes
Version:
computes.io distributed supercomputer
192 lines (147 loc) • 4.22 kB
JavaScript
// var computes = require('./lib/computes');
//
// module.exports = {
// compute: function (operation, data){
// return new computes(operation, data);
// }
// }
var config = require('./config.json');
var bigInt = require('big-integer');
var request=require('request');
var util=require('util');
var uuid = require('uuid');
var EventEmitter = require( "events" ).EventEmitter;
var io = require('socket.io-client');
var Firebase = require("firebase");
var redis = require('redis');
var clientRedisToGo = redis.createClient(config.redis.port,
config.redis.host,
{no_ready_check: true});
clientRedisToGo.on("error", function (err) {
// console.log("error encountered", err);
});
clientRedisToGo.on("end", function() {
console.log("> disconnected");
});
var Job = function(){};
util.inherits( Job, EventEmitter );
var jobsReceived = [];
var memory;
var firebase;
var socket;
var domainKey;
// var computestack;
function submitJob(endpoint, payload){
var post={
url: util.format('https://%s:%s/jobs/' + endpoint,config.options.host,config.options.port),
form: payload,
headers:config.auth
};
request.post(post, function(err,httpResponse,body){
return body;
});
}
function connect(domain){
domainKey = domain;
var job = new Job();
// console.log("domain", domainKey);
var firebaseConfig = {
apiKey: "AIzaSyBRCm05S0AzPPLtQWZrgQONWL0Qgg73osk",
authDomain: "cloudram.firebaseapp.com",
databaseURL: "https://cloudram.firebaseio.com",
storageBucket: "firebase-cloudram.appspot.com",
messagingSenderId: "295298580239"
};
try {
firebase = Firebase.initializeApp(firebaseConfig);
memory = firebase.database().ref(domainKey);
} catch(error){
// console.log(error);
}
// memory = new Firebase("https://cloudram.firebaseio.com/" + domainKey);
// computestack = new Firebase("https://computestack.firebaseio.com/" + domainKey);
// Connect to supercomputer via websockets
socket = io.connect('https://'+config.options.host+':'+config.options.port, {reconnect: true});
socket.on('connect', function () {
// connection ready
job.emit("ready");
if (domainKey){
socket.emit('storeClientInfo', { customId: domainKey });
}
socket.on('message', function (msg) {
// console.log('Message received: ', msg);
job.emit("message", msg);
});
memory.on('value', function(ram) {
// console.log(ram.val());
job.emit("memory", ram.val());
});
});
clientRedisToGo.auth(config.redis.password, function() {
// job.emit("ready");
});
clientRedisToGo.on('message', function (jobx, data) {
if (jobsReceived.indexOf(jobx) == -1){
jobsReceived.push(jobx);
try{
clientRedisToGo.unsubscribe(jobx);
} catch(error){
}
result = JSON.parse(data)
var results = {
job: jobx,
result: result.result
}
job.emit( "result", results );
}
});
return job;
}
Job.prototype.cancel = function(){};
Job.prototype.disconnect = function(){
try{
clientRedisToGo.quit();
socket.close();
firebase.database().goOffline();
} catch(error){
}
};
Job.prototype.memory = function(ram){
// memory.set(ram);
firebase.database().ref(domainKey).set(ram);
};
Job.prototype.compute = function compute(operation, data, options){
var jobid = 'computes:' + uuid.v1();
clientRedisToGo.subscribe(jobid);
// console.log('subscribed to', jobid)
var payload={
client: { "name": "job-creator" },
jobid: jobid,
operation: operation,
data: data,
options: options
};
submitJob('compute', payload);
}
Job.prototype.execute = function execute(command, options){
var jobid = 'computes:' + uuid.v1();
clientRedisToGo.subscribe(jobid);
// console.log('subscribed to', jobid)
var payload={
client: { "name": "job-creator" },
jobid: jobid,
command: command,
options: options
};
submitJob('compute', payload);
}
Job.prototype.cancel = function cancel(job){
var payload={
client:{ "name": "job-creator" },
jobs: [job]
};
submitJob('killJobs', payload);
}
module.exports = {
connect: connect
}