UNPKG

computes

Version:

computes.io distributed supercomputer

192 lines (147 loc) 4.22 kB
// 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 }