From 06b0e108d5cd2aaf04e75bae3a9f1c302685e713 Mon Sep 17 00:00:00 2001 From: tenthirtyone Date: Wed, 16 Aug 2017 01:47:30 -0400 Subject: [PATCH] socket reworking to reduce coupling --- server/.eslintrc.json | 3 +- server/index.js | 2 +- server/lib/api/index.js | 8 +--- server/lib/api/socket.js | 74 +++++++++++++++++++++++++++----- server/lib/node/index.js | 30 ++----------- server/lib/parser/address.js | 23 ---------- server/lib/parser/index.js | 4 -- server/lib/parser/transaction.js | 38 ---------------- 8 files changed, 70 insertions(+), 112 deletions(-) delete mode 100644 server/lib/parser/address.js delete mode 100644 server/lib/parser/transaction.js diff --git a/server/.eslintrc.json b/server/.eslintrc.json index e66ade8..e642fb4 100644 --- a/server/.eslintrc.json +++ b/server/.eslintrc.json @@ -8,6 +8,7 @@ "no-multi-spaces": 0, "no-use-before-define": 1, "object-shorthand": 1, - "key-spacing": 0 + "key-spacing": 0, + "no-plusplus": 0 } } \ No newline at end of file diff --git a/server/index.js b/server/index.js index 98f8aab..23d3125 100644 --- a/server/index.js +++ b/server/index.js @@ -1,7 +1,7 @@ const Bcoin = require('./lib/node'); const config = require('./config'); const logger = require('./lib/logger'); -const Api = require('./lib/api').server; +const Api = require('./lib/api'); const db = require('./lib/db'); logger.log('debug', diff --git a/server/lib/api/index.js b/server/lib/api/index.js index 3bc0d98..9de150c 100644 --- a/server/lib/api/index.js +++ b/server/lib/api/index.js @@ -47,11 +47,5 @@ app.use((req, res) => { // Socket server const server = require('http').Server(app); -const io = require('socket.io')(server); -const SocketAPI = require('./socket')(io); - -module.exports = { - server, - io, -}; +module.exports = server; diff --git a/server/lib/api/socket.js b/server/lib/api/socket.js index ad8577c..7882fc7 100644 --- a/server/lib/api/socket.js +++ b/server/lib/api/socket.js @@ -1,16 +1,68 @@ -// Change to have services push blocks/txs -module.exports = function addressrouter(io) { - io.on('connection', (socket) => { - socket.on('subscribe', (data) => { - }); +const server = require('.'); +const io = require('socket.io')(server); - socket.on('message', (data) => { - }); +let refreshBlocks = false; +const txInterval = 200; +let txCounter = 0; - socket.on('unsubscribe', (data) => { - }); +// Not quite debouncing +setInterval(() => { + refreshBlocks = true; +}, 10000); - socket.on('disconnect', (data) => { - }); + +io.on('connection', (socket) => { + socket.on('subscribe', (data) => { }); + + socket.on('message', (data) => { + }); + + socket.on('unsubscribe', (data) => { + }); + + socket.on('disconnect', (data) => { + }); +}); + +// Emit block refresh and txs +function processBlock(entry, block) { + if (refreshBlocks) { + refreshBlocks = false; + emitBlock(entry); + } + block.txs.forEach((tx) => { + txCounter++; + if (txCounter % txInterval === 0) { + txCounter = 0; + emitTx(tx); + } + }); +} + +function emitBlock(block) { + io.sockets.emit('block', { + hash: block.toJSON().hash, + }); +} + +function emitTx(transaction) { + const txJSON = transaction.toJSON(); + io.sockets.emit('tx', { + txid: txJSON.hash, + valueOut: transaction.outputs.reduce((sum, tx) => { + tx = tx.toJSON(); + + const valB = (tx.value || tx.valueOut.value || 0) / 1e8; + + return sum + valB; + }, 0), + }); +} + +module.exports = { + io, + processBlock, + emitBlock, + emitTx, }; diff --git a/server/lib/node/index.js b/server/lib/node/index.js index 2c9cc88..266f5b1 100644 --- a/server/lib/node/index.js +++ b/server/lib/node/index.js @@ -1,22 +1,11 @@ const FullNode = require('bcoin/lib/node/fullnode'); const logger = require('../../lib/logger'); const BlockParser = require('../parser').Block; -const TxParser = require('../parser').Transaction; -const addrParser = require('../parser').Address; const config = require('../../config'); -const io = require('../api').io; - -// Reverse how sockets are working +const socket = require('../../lib/api/socket'); const node = new FullNode(config.bcoin); -// Hacky move this to config -let refreshBlocks = false; -// Super Hacky but better than inline Maths. -setInterval(() => { - refreshBlocks = true; -}, 10000); // Only refresh sockets after 5s passes - function start() { node.open() .then(() => { @@ -27,21 +16,8 @@ function start() { }); node.chain.on('connect', (entry, block) => { - BlockParser.parse(entry, block); - TxParser.parse(entry, block.txs); - addrParser.parse(entry, block.txs); - - if (refreshBlocks) { - refreshBlocks = false; - io.sockets.emit('block', { - hash: block.toJSON().hash, - }); - } - }); - - node.pool.on('peer', (peer) => { - + socket.processBlock(entry, block); }); node.on('error', (err) => { @@ -50,7 +26,7 @@ function start() { }); node.mempool.on('tx', (tx) => { - + socket.emitTx(tx); }); } diff --git a/server/lib/parser/address.js b/server/lib/parser/address.js deleted file mode 100644 index f53c35c..0000000 --- a/server/lib/parser/address.js +++ /dev/null @@ -1,23 +0,0 @@ -const AddressModel = require('../../models/address'); -const InputModel = require('../../models/input'); -const OutputModel = require('../../models/output'); -const config = require('../../config'); -const util = require('../../lib/util'); -const logger = require('../logger'); - -function parse(entry, txs) { - txs.forEach((tx) => { - - tx.outputs.forEach((output) => { - const outputJSON = output.toJSON(); - }); - - tx.inputs.forEach((input) => { - const inputJSON = input.toJSON(); - }); - }); -} - -module.exports = { - parse, -}; diff --git a/server/lib/parser/index.js b/server/lib/parser/index.js index b73118c..13c2d5b 100644 --- a/server/lib/parser/index.js +++ b/server/lib/parser/index.js @@ -1,9 +1,5 @@ const Block = require('./block'); -const Transaction = require('./transaction'); -const Address = require('./address'); module.exports = { Block, - Transaction, - Address, }; diff --git a/server/lib/parser/transaction.js b/server/lib/parser/transaction.js deleted file mode 100644 index 8549ffe..0000000 --- a/server/lib/parser/transaction.js +++ /dev/null @@ -1,38 +0,0 @@ -const TxModel = require('../../models/transaction'); -const InputModel = require('../../models/input'); -const OutputModel = require('../../models/output'); -const config = require('../../config'); -const util = require('../../lib/util'); -const logger = require('../logger'); -const io = require('../api').io; - -const socketThrottle = 250; -let counter = 0; - -function parse(entry, txs) { - txs.forEach((tx) => { - const txJSON = tx.toJSON(); - - counter++; - - if (counter % socketThrottle === 0) { - - counter = 0; - - io.sockets.emit('tx', { - txid: txJSON.hash, - valueOut: tx.outputs.reduce((sum, tx) => { - tx = tx.toJSON(); - - const valB = (tx.value || tx.valueOut.value || 0) / 1e8; - - return sum + valB; - }, 0), - }); - } - }); -} - -module.exports = { - parse, -};