UNPKG

crypto-nodes

Version:

315 lines (206 loc) 6.64 kB
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); } */