crypto-nodes
Version:
315 lines (206 loc) • 6.64 kB
JavaScript
var io = require('socket.io-client');
var moment = require('moment');
module.exports = function(RED) {
function orderbookConnector(config) {
var ports = [ 'added', 'accept', 'fill', 'cancel', 'replace', 'book_update', 'errors' ];
var events = {
add_error: true,
added: true,
accept: true,
reject: true,
fill: true,
cancel: true,
cancel_reject: true,
cancel_error: true,
replace: true,
replace_reject: true,
replace_error: true,
book_update: true,
trade: true,
}
RED.nodes.createNode(this,config);
var socket = io.connect(config.server, {reconnect: true});
var node = this;
var connected = false;
socket.on('connect', function(){
connected = true;
node.send({ payload:{socketId:node.id, status:'connected'} });
node.status({fill:"green",shape:"dot", text:"connected"});
});
socket.on('disconnect', function(){
connected = false;
node.send({payload:{socketId:node.id, status:'disconnected'}});
node.status({fill:'red',shape:'ring', text:'disconnected'});
});
socket.on('connect_error', function(err) {
connected = false;
if (err) {
node.status({fill:'red',shape:'ring',text:'disconnected'});
node.send({payload:{socketId:node.id, status:'disconnected'}});
}
});
this.on('close', function(done) {
connected = false;
socket.disconnect();
socket.removeAllListeners();
node.status({});
done();
});
socket.on('message', function(data) {
console.log(data);
});
for(key in events) {
function bind(k) {
socket.on(k, function(data) {
//console.log(k);
//console.log(data);
data.event = k;
// Route event to correct output..
switch(k) {
case 'added':
node.send( [ data, null, null, null, null, null, null ] );
break;
case 'accept':
node.send( [ null, data, null, null, null, null, null ] );
break;
case 'fill':
node.send( [ null, null, data, null, null, null, null ] );
break;
case 'cancel':
node.send( [ null, null, null, data, null, null, null ] );
break;
case 'replace':
node.send( [ null, null, null, null, data, null, null ] );
break;
case 'book_update':
node.send( [ null, null, null, null, null, data, null ] );
break;
case 'add_error':
case 'cancel_reject':
case 'cancel_error':
case 'replace_reject':
case 'replace_error':
// Via error port
node.send( [ null, null, null, null, null, null, data ] );
break;
}
});
}
bind(key);
}
node.on('input', function(msg) {
if(connected) {
// console.log('OB CONNECTOR');
// console.log(msg.payload);
switch(msg.payload.type) {
case 'reset':
socket.emit('reset', msg.payload);
node.status({fill:"green",shape:"dot", text: new moment().format('HH:mm:ss') + ' Emitted RESET' });
break;
case 'balances':
socket.emit('balances', msg.payload);
node.status({fill:"green",shape:"dot", text: new moment().format('HH:mm:ss') + ' Emitted BALANCES' });
break;
case 'add':
var order = { s: msg.payload.from + '/' + msg.payload.to , b: (msg.payload.is_buy ? true : false), p: msg.payload.price, q: msg.payload.quantity, a: msg.payload.account_id };
socket.emit('add', order);
node.status({fill:"green",shape:"dot", text: new moment().format('HH:mm:ss') + ' Emitted ADD' });
break;
case 'cancel':
var order = { order_id: msg.payload.order_id, symbol: msg.payload.from + '/' + msg.payload.to };
console.log('Emitting Cancel ::');
console.log(order);
socket.emit('cancel', order);
node.status({fill:"green",shape:"dot", text: new moment().format('HH:mm:ss') + ' Emitted CANCEL' });
break;
case 'replace':
var order = { order_id: msg.payload.order_id, size_delta: msg.payload.size_delta, new_price: msg.payload.new_price, symbol: msg.payload.from + '/' + msg.payload.to };
console.log('Emitting Replace ::');
console.log(order);
socket.emit('replace', order);
node.status({fill:"green",shape:"dot", text: new moment().format('HH:mm:ss') + ' Emitted REPLACE' });
break;
}
}
});
}
RED.nodes.registerType("orderbookConnector", orderbookConnector);
}
/*
var socket = require('socket.io-client')('http://localhost:3000');
var sent = 0;
var rcv = 0;
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
var start;
socket.on('connect', function() {
start = new Date();
console.log('CNX');
console.log('SENDING 100000 Orders via socketIO');
for(x = 0; x < 100000; x++) {
// Format #1
//var order = "BTC/USD~1~100~100~vivjisj9-5454534";
// Format #2
var order = { s: 'BTC/USD' , b: true, p: 100, q: 100, a: '795452f6-2475-4233-8cad-fecb9544d269' };
socket.emit('add', order);
sent++;
}
var end = new Date() - start;
console.info("Execution time #1: %dms", end);
});
socket.on('event', function(data){
console.log('EV');
console.log(data);
});
socket.on('disconnect', function(){
console.log('DC');
});
var events = {
add_error: true,
added: true,
accept: true,
reject: true,
fill: true,
cancel: true,
cancel_reject: true,
cancel_error: true,
replace: true,
replace_reject: true,
replace_error: true,
book_update: true,
trade: true,
}
/*
// BENCHMARK #2
socket.on('book_update', function(data) {
rcv++;
//console.log(data);
if(rcv == 100000) {
console.log('COMPLETE');
var end = new Date() - start;
console.info("Execution time #2: %dms", end);
}
});
//return;
for(key in events) {
function bind(k) {
socket.on(k, function(data){
if(k == 'book_update') {
rcv++;
}
if(rcv == 100000) {
console.log('COMPLETE');
var end = new Date() - start;
console.info("Execution time #2: %dms", end);
}
console.log(k);
console.log(data);
});
}
bind(key);
}
*/