From 81bc27cf4ddf64c17f7f846ffa7c6651ee3a6753 Mon Sep 17 00:00:00 2001 From: Steven Ettinger Date: Mon, 19 Sep 2022 21:05:52 -0300 Subject: [PATCH] 1.1.4 --- config.js | 27 +- index.js | 35 +-- processor.js | 799 ++++++++++++++++++++++++++------------------------ routes/api.js | 2 +- 4 files changed, 444 insertions(+), 419 deletions(-) diff --git a/config.js b/config.js index 292b1eb..5eca078 100644 --- a/config.js +++ b/config.js @@ -33,10 +33,17 @@ const engineCrank = const rta = ENV.rta || '' //rtrades account : IPFS pinning interface const rtp = ENV.rtp || '' //rtrades password : IPFS pinning interface -const ipfshost = ENV.ipfshost || 'ipfs.infura.io' //IPFS upload/download provider provider +const ipfshost = ENV.ipfshost || "infura-ipfs.io"; //IPFS upload/download provider provider const ipfsport = ENV.ipfsport || '5001' //IPFS upload/download provider provider -const ipfsLinks = ENV.ipfsLinks ? ENV.ipfsLinks.split(' ') : [ "https://ipfs:8080/ipfs/", "http://localhost:8080/ipfs/", "https://ipfs.io/ipfs/","https://ipfs.infura.io/ipfs/",] +const ipfsLinks = ENV.ipfsLinks + ? ENV.ipfsLinks.split(" ") + : [ + "https://ipfs:8080/ipfs/", + "http://localhost:8080/ipfs/", + "https://ipfs.io/ipfs/", + "https://infura-ipfs.io/ipfs/", + ]; const ipfsprotocol = ENV.ipfsprotocol || 'https' //IPFS upload/download protocol //node market config > 2500 is 25% inflation to node operators, this is currently not used @@ -45,14 +52,14 @@ const bidRate = ENV.BIDRATE || 500 // your vote for the dex fee 500 = 0.500% Max //HIVE CONFIGS var startURL = ENV.STARTURL || "https://rpc.ecency.com/" var clientURL = ENV.APIURL || "https://api.deathwing.me/" -const clients = ENV.clients || [ - "https://api.deathwing.me/", - //"https://api.c0ff33a.uk/", - "https://rpc.ecency.com/", - "https://hived.emre.sh/", - //"https://rpc.ausbit.dev/", - "https://api.hive.blog/" -] +const clients = ENV.clients ? ENV.clients.split(" ") : [ + "https://api.deathwing.me/", + //"https://api.c0ff33a.uk/", + "https://rpc.ecency.com/", + "https://hived.emre.sh/", + //"https://rpc.ausbit.dev/", + "https://api.hive.blog/", +]; //!!!!!!! -- THESE ARE COMMUNITY CONSTANTS -- !!!!!!!!!// //TOKEN CONFIGS -- ALL COMMUNITY RUNNERS NEED THESE SAME VALUES diff --git a/index.js b/index.js index 4713422..66070e9 100755 --- a/index.js +++ b/index.js @@ -1,10 +1,10 @@ const config = require("./config"); -const VERSION = "v1.1.3"; //Did you change the package version? +const VERSION = "v1.1.4"; //Did you change the package version? exports.VERSION = VERSION; exports.exit = exit; exports.processor = processor; const hive = require("@hiveio/dhive"); -var client = new hive.Client(config.clientURL); +var client = new hive.Client(config.clients); exports.client = client; var block = { ops: [], @@ -253,15 +253,7 @@ function startApp() { } if (res) plasma.id = res.id; }); - processor = hiveState( - client, - hive, - startingBlock, - 10, - config.prefix, - streamMode, - cycleAPI - ); + processor = hiveState(client, startingBlock, 10, config.prefix); processor.on("send", HR.send); processor.on("spk_send", HR.spk_send); processor.on("claim", HR.drop_claim); @@ -647,7 +639,7 @@ function startApp() { "with", result.head_block_number - num, `left until real-time. DAO in ${ - 30240 - ((num - 20000) % 30240) + 30240 - ((num - 20000) % 28800) } blocks` ); }); @@ -828,24 +820,6 @@ function waitfor(promises_array) { } exports.waitfor = waitfor; -//hopefully handling the HIVE garbage APIs -function cycleAPI(restart) { - var c = 0; - for (i of config.clients) { - if (config.clientURL == config.clients[i]) { - c = i; - break; - } - } - if (c == config.clients.length - 1) { - c = -1; - } - config.clientURL = config.clients[c + 1]; - console.log("Using APIURL: ", config.clientURL); - client = new hive.Client(config.clientURL); - if (restart) exit(plasma.hashLastIBlock, "API Changed"); -} - //pulls the latest activity of an account to find the last state put in by an account to dynamically start the node. //this will include other accounts that are in the node network and the consensus state will be found if this is the wrong chain function dynStart(account) { @@ -901,6 +875,7 @@ function startWith(hash, second) { console.log(`Attempting to start from IPFS save state ${hash}`); ipfspromise(hash) .then((blockInfo) => { + if(blockInfo[0] == 'D')console.log(blockInfo) var blockinfo = JSON.parse(blockInfo); ipfspromise(blockinfo[1].root ? blockinfo[1].root : hash).then( (file) => { diff --git a/processor.js b/processor.js index 3ad6e00..da25397 100644 --- a/processor.js +++ b/processor.js @@ -1,405 +1,448 @@ -const { config } = require('./config'); const fetch = require('node-fetch'); -const { TXID } = require('./index'); -module.exports = function(client, hive, currentBlockNumber = 1, blockComputeSpeed = 1000, prefix = '', mode = 'latest') { - var onCustomJsonOperation = {}; // Stores the function to be run for each operation id. - var onOperation = {}; +const { TXID, block } = require('./index'); +module.exports = function ( + client, + currentBlockNumber = 1, + blockComputeSpeed = 1000, + prefix = "" +) { + var onCustomJsonOperation = {}; // Stores the function to be run for each operation id. + var onOperation = {}; - var onNewBlock = function() {}; - var onStreamingStart = function() {}; - - var isStreaming; - var block_header = {}; - var stream; - - var stopping = false; - var stopCallback; - - - // Returns the block number of the last block on the chain or the last irreversible block depending on mode. - function getHeadOrIrreversibleBlockNumber(callback) { - client.database.getDynamicGlobalProperties().then(function(result) { - if (mode === 'latest') { - callback(result.head_block_number); - } else { - callback(result.last_irreversible_block_num); - } - }) + var onNewBlock = function () {}; + var onStreamingStart = function () {}; + var behind = 0 + var isStreaming; + var stream; + var blocks = { + processing: 0, + time: 0, + completed: 0, + v: {}, + manage: function (block_num){ + if ( + block_num == currentBlockNumber && + !blocks.processing + ) { + blocks.processing = currentBlockNumber; + processBlock(blocks[block_num], block_num).then(() => { + currentBlockNumber = block_num + 1; + blocks.processing = 0 + delete blocks[block_num]; + }); + } else if (block_num > currentBlockNumber) { + if ( + blocks[currentBlockNumber] && + !blocks.processing + ) processBlock(blocks[block_num], currentBlockNumber).then(() => { + delete blocks[currentBlockNumber]; + currentBlockNumber = currentBlockNumber + 1; + blocks.processing = 0; + }); + else if (!blocks[currentBlockNumber]) getBlockNumber(currentBlockNumber); + } else if (block_num < currentBlockNumber) { + var blockNums = Object.keys(blocks); + for (var i = 0; i < blockNums.length; i++) { + if (parseInt(blockNums[i]) && parseInt(blockNums[i]) < currentBlockNumber) { + delete blocks[blockNums[i]]; + } + } + } } + } + var stopping = false; - function getVops (bn){ - return new Promise((resolve, reject) => { - fetch(client.currentAddress, { - body: `{"jsonrpc":"2.0", "method":"condenser_api.get_ops_in_block", "params":[${bn},true], "id":1}`, - headers: { - "Content-Type": "application/x-www-form-urlencoded" - }, - method: "POST" - }) - .then(res => res.json()) - .then(json => { - if (!json.result) { - resolve([]) - } else { - resolve(json.result) + // Returns the block number of the last block on the chain or the last irreversible block depending on mode. + function getHeadOrIrreversibleBlockNumber(callback) { + client.database.getDynamicGlobalProperties().then(function (result) { + callback(result.last_irreversible_block_num); + }); + } + + // function getVops(bn) { + // return new Promise((resolve, reject) => { + // fetch(client.currentAddress, { + // body: `{"jsonrpc":"2.0", "method":"condenser_api.get_ops_in_block", "params":[${bn},true], "id":1}`, + // headers: { + // "Content-Type": "application/x-www-form-urlencoded", + // }, + // method: "POST", + // }) + // .then((res) => res.json()) + // .then((json) => { + // if (!json.result) { + // resolve([]); + // } else { + // resolve(json.result); + // } + // }) + // .catch((err) => { + // reject(err); + // }); + // }); + // } + + function isAtRealTime(computeBlock) { + getHeadOrIrreversibleBlockNumber(function (result) { + if (currentBlockNumber >= result) { + beginBlockStreaming(); + } else { + behind = result - currentBlockNumber; + computeBlock(); + } + }); + } + +function getBlockNumber(bn){ + client.database + .getBlock(bln) + .then((result) => { + blocks[parseInt(result.block_id.slice(0, 8), 16)] = result; + blocks.manage() + }) + +} + +function getBlock(bn) { + return new Promise((resolve, reject) => { + if (behind && !stopping) gbr(bn, behind > 100 ? 100 : behind, 0); + else if (!stopping) gb(bn, 0); + function gb(bln, at) { + if (bln < TXID.saveNumber + 50) { + client.database + .getBlock(bln) + .then((result) => { + resolve([result]); + }) + .catch((err) => { + if (at < 3) { + gb(bn, at + 1); + } else { + reject(err); + } + }); + } else { + setTimeout(() => { + gb(bln, at); + }, 1000); + } + } + function gbr(bln, count, at) { + if (bln > TXID.saveNumber + 150) + setTimeout(() => { + gbr(bln, count, at); + }, 1000); + else + fetch(client.currentAddress, { + body: `{"jsonrpc":"2.0", "method":"block_api.get_block_range", "params":{"starting_block_num": ${bln}, "count": ${count}}, "id":1}`, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + method: "POST", + }) + .then((res) => res.json()) + .then((result) => { + var blocks = result.result.blocks; + for (var i = 0; i < blocks.length; i++) { + const bkn = parseInt(blocks[i].block_id.slice(0, 8), 16); + for (var j = 0; j < blocks[i].transactions.length; j++) { + blocks[i].transactions[j].block_num = bkn; + blocks[i].transactions[j].transaction_id = + blocks[i].transaction_ids[j]; + blocks[i].transactions[j].transaction_num = j; + var ops = []; + for ( + var k = 0; + k < blocks[i].transactions[j].operations.length; + k++ + ) { + ops.push([ + blocks[i].transactions[j].operations[k].type.replace( + "_operation", + "" + ), + blocks[i].transactions[j].operations[k].value, + ]); } - }) - .catch(err => {reject(err)}) + blocks[i].transactions[j].operations = ops; + } + } + resolve(blocks); + }) + .catch((err) => { + if (at < 3) { + gb(bn, at); + } else { + reject(err); + } + }); + } + }); +} + + function beginBlockComputing() { + function computeBlock() { + var blockNum = currentBlockNumber; // Helper variable to prevent race condition + // in getBlock() + //var vops = getVops(blockNum); + getBlock(blockNum) + .then((result) => { + pl(result); + function pl(range) { + pb(range.shift(), range.length).then((res) => { + if (res == "NEXT") { + blockNum++; + pl(range); + } + }); + } + function pb(bl, remaining) { + if (parseInt(bl.block_id.slice(0, 8), 16) != blockNum)return + else + return new Promise((resolve, reject) => { + processBlock(bl, blockNum) + .then((r) => { + currentBlockNumber++; + if (!stopping && !remaining) { + isAtRealTime(computeBlock); + } else if (remaining) { + resolve("NEXT"); + } else { + console.log("failed at stopping"); + stream = undefined; + beginBlockComputing(); + } + }) + .catch((e) => { + console.log("failed at catch:", e); + }); + }); + } + }) + .catch((err) => { + console.log("get block catch:" + err); }); } - function isAtRealTime(callback) { - getHeadOrIrreversibleBlockNumber(function(result) { - if (currentBlockNumber >= result) { - callback(true); - } else { - callback(result - currentBlockNumber); - } - }) - } + computeBlock(); + } - function beginBlockComputing() { - function computeBlock(behind) { - var blockNum = currentBlockNumber; // Helper variable to prevent race condition - // in getBlock() - var vops = getVops(blockNum) - function getBlock(bn){ - return new Promise ((resolve, reject)=>{ - if(behind && !stopping)gbr(bn, behind > 100 ? 100 : behind, 0) - else if (!stopping)gb(bn, 0) - function gb (bln, at){ - if(bln < TXID.saveNumber + 50){ - client.database.getBlock(bln) - .then((result) => { - resolve([result]) - }) - .catch((err) => { - if (at < 3){ - gb(bn, at+1) - } else { - reject(err) - } - }) - } else { - setTimeout(()=>{gb (bln, at)}, 1000) - } - } - function gbr (bln, count, at){ - if(bln > TXID.saveNumber + 150)setTimeout(()=>{gbr (bln, count, at)}, 1000) - else fetch(client.currentAddress, { - body: `{"jsonrpc":"2.0", "method":"block_api.get_block_range", "params":{"starting_block_num": ${bln}, "count": ${count}}, "id":1}`, - headers: { - "Content-Type": "application/x-www-form-urlencoded" - }, - method: "POST" - }) - .then(res => res.json()) - .then((result) => { - var blocks =result.result.blocks - for (var i = 0; i < blocks.length; i++){ - const bkn = parseInt(blocks[i].block_id.slice(0, 8), 16); - for (var j = 0; j < blocks[i].transactions.length; j++){ - blocks[i].transactions[j].block_num = bkn - blocks[i].transactions[j].transaction_id = blocks[i].transaction_ids[j] - blocks[i].transactions[j].transaction_num = j - var ops = [] - for(var k = 0; k < blocks[i].transactions[j].operations.length; k++){ - ops.push([blocks[i].transactions[j].operations[k].type.replace('_operation', ''), blocks[i].transactions[j].operations[k].value]) - } - blocks[i].transactions[j].operations = ops - } - } - resolve(blocks) - }) - .catch((err) => { - if (at < 3){ - gb(bn,at) - } else { - reject(err) - } - }) - } - }) - } - getBlock(blockNum) - .then((result) => { - pl(result) - function pl (range){ - pb(range.shift(), range.length) - .then(res =>{ - if(res == 'NEXT'){ - blockNum++ - pl(range) - } - }) - } - function pb(bl, remaining) { - return new Promise((resolve, reject) => { - processBlock(bl, blockNum, vops) - .then(r => { - currentBlockNumber++; - if (!stopping && !remaining) { - isAtRealTime(function(result) { - if (result === true) { - beginBlockStreaming(); - //setTimeout(computeBlock, blockComputeSpeed); - } else { - //computeBlock() - computeBlock(result) - resolve('DONE') - } - }) - } else if (remaining){ - resolve('NEXT') - } else { - console.log('failed at stopping') - cycleapi(); - beginBlockComputing(); - } - }) - .catch(e => { console.log('failed at catch:', e) }) - }) - } - }) - .catch((err) => { - console.log('get block catch:' + err) - }) - } + function beginBlockStreaming() { + isStreaming = true; + onStreamingStart(); + stream = client.blockchain.getBlockStream(); + stream.on("data", function (Block) { + var blockNum = parseInt(Block.block_id.slice(0, 8), 16) + blocks[blockNum] = Block + blocks.manage(blockNum, stream); + }); + stream.on("end", function () { + console.error( + "Block stream ended unexpectedly. Restarting block computing." + ); + beginBlockComputing(); + stream = undefined; + }); + stream.on("error", function (err) { + beginBlockComputing(); + stream = undefined; + console.log("This place:", err); + //throw err; + }); + } - computeBlock(); - } - - function beginBlockStreaming() { - isStreaming = true; - onStreamingStart(); - if (mode === 'latest') { - stream = client.blockchain.getBlockStream({ mode: hive.BlockchainMode.Latest }); - } else { - stream = client.blockchain.getBlockStream(); - } - stream.on('data', function(block) { - var blockNum = parseInt(block.block_id.slice(0, 8), 16); - if (blockNum == currentBlockNumber) { - processBlock(block, blockNum).then(() => { - currentBlockNumber = blockNum + 1 + function transactional(ops, i, pc, num, block, vops) { + if (ops.length) { + doOp(ops[i], [ops, i, pc, num, block, vops]) + .then((v) => { + if (ops.length > i + 1) { + transactional(v[0], v[1] + 1, v[2], v[3], v[4], v[5]); + } else { + // if (vops) { + // var Vops = []; + // vops + // .then((vo) => { + // for (var j = 0; j < vo.length; j++) { + // if (onOperation[vo[j].op[0]] !== undefined) { + // var json = vo[j].op[1]; + // json.block_num = vo[j].block; + // //json.timestamp = vo[j].timestamp + // json.txid = vo[j].trx_id; + // Vops.push([vo[j].op[0], json]); + // } + // } + // if (Vops.length) { + // transactional(Vops, 0, v[2], v[3], v[4]); + // } else { + // onNewBlock(num, v, v[4].witness_signature, { + // timestamp: v[4].timestamp, + // block_id: v[4].block_id, + // block_number: num, + // }) + // .then((r) => { + // pc[0](pc[2]); + // }) + // .catch((e) => { + // console.log(e); + // }); + // } + // }) + // .catch((e) => { + // console.log(e); + // }); + // } else { + onNewBlock(num, v, v[4].witness_signature, { + timestamp: v[4].timestamp, + block_id: v[4].block_id, + block_number: num, + }) + .then((r) => { + pc[0](pc[2]); + }) + .catch((e) => { + console.log(e); }); - } else if (blockNum > currentBlockNumber) { - beginBlockComputing(); - stream = undefined - }else { - streamWait() - function streamWait(){ - setTimeout(function() { - if (blockNum == currentBlockNumber) { - processBlock(block, blockNum).then(() => { - currentBlockNumber = blockNum + 1; - }); - } else { - streamWait(); - } - },500) + // } + } + }) + .catch((e) => { + console.log(e); + pc[1](e); + }); + } else if (parseInt(block.block_id.slice(0, 8), 16) != num) { + pc[0](); + console.log("double") + } else { + onNewBlock(num, pc, block.witness_signature, { + timestamp: block.timestamp, + block_id: block.block_id, + block_number: num, + }) + .then((r) => { + r[0](); + }) + .catch((e) => { + pc[1](e); + }); + } + + function doOp(op, pc) { + return new Promise((resolve, reject) => { + if (op.length == 4) { + onCustomJsonOperation[op[0]](op[1], op[2], op[3], [ + resolve, + reject, + pc, + ]); + //console.log(op[0]) + } else if (op.length == 2) { + onOperation[op[0]](op[1], [resolve, reject, pc]); + //console.log(op[0]) + } + }); + } + + function doVop(op, pc) { + return new Promise((resolve, reject) => { + console.log(op, pc); + onVOperation[op[0]](op[1], [resolve, reject, pc]); + }); + } + } + + function processBlock(block, num, Pvops) { + return new Promise((resolve, reject) => { + var transactions = block.transactions; + let ops = []; + if (parseInt(block.block_id.slice(0, 8), 16) === num){ + for (var i = 0; i < transactions.length; i++) { + for (var j = 0; j < transactions[i].operations.length; j++) { + var op = transactions[i].operations[j]; + if (op[0] === "custom_json") { + //console.log('check') + if (typeof onCustomJsonOperation[op[1].id] === "function") { + var ip = JSON.parse(op[1].json), + from = op[1].required_posting_auths[0], + active = false; + if ( + typeof ip === "string" || + typeof ip === "number" || + Array.isArray(ip) + ) + ip = {}; + ip.transaction_id = transactions[i].transaction_id; + ip.block_num = transactions[i].block_num; + ip.timestamp = block.timestamp; + ip.prand = block.witness_signature; + if (!from) { + from = op[1].required_auths[0]; + active = true; } + ops.push([op[1].id, ip, from, active]); //onCustomJsonOperation[op[1].id](ip, from, active); + } + } else if (onOperation[op[0]] !== undefined) { + op[1].transaction_id = transactions[i].transaction_id; + op[1].block_num = transactions[i].block_num; + op[1].timestamp = block.timestamp; + op[1].prand = block.witness_signature; + ops.push([op[0], op[1]]); //onOperation[op[0]](op[1]); } - }) - stream.on('end', function() { - console.error("Block stream ended unexpectedly. Restarting block computing.") - cycleapi();beginBlockComputing(); - }) - stream.on('error', function(err) { - cycleapi(); - beginBlockComputing(); - console.log('This place:', err) - //throw err; - }) - } - - function cycleapi() { - const newClientURL = config.clients.search( - config.clientURL - ) > 0 ? config.clients.search( - config.clientURL - ) - 1 : config.clients.length - 1 - config.startURL = newClientURL; - config.clientURL = newClientURL; - client.api.setOptions({ url: config.startURL }) - } - - function transactional(ops, i, pc, num, block, vops) { - if (ops.length) { - doOp(ops[i], [ops, i, pc, num, block, vops]) - .then(v => { - if (ops.length > i + 1) { - transactional(v[0], v[1] + 1, v[2], v[3], v[4], v[5]) - } else { - if(vops){ - var Vops = [] - vops.then(vo=>{ - for(var j = 0; j < vo.length; j++){ - if(onOperation[vo[j].op[0]] !== undefined){ - var json = vo[j].op[1] - json.block_num = vo[j].block - //json.timestamp = vo[j].timestamp - json.txid = vo[j].trx_id - Vops.push([vo[j].op[0],json]) - } - } - if(Vops.length){ - transactional(Vops, 0, v[2], v[3], v[4]) - } else { - onNewBlock(num, v, v[4].witness_signature, { - timestamp: v[4].timestamp, - block_id: v[4].block_id, - block_number: num - }) - .then(r => { - pc[0](pc[2]) - }) - .catch(e => { console.log(e) }) - } - }) - .catch(e=>{console.log(e)}) - } else { - onNewBlock(num, v, v[4].witness_signature, { - timestamp: v[4].timestamp, - block_id: v[4].block_id, - block_number: num - }) - .then(r => { - pc[0](pc[2]) - }) - .catch(e => { console.log(e) }) - } - } - }) - .catch(e => { - console.log(e); - pc[1](e) - }) - } else { - onNewBlock(num, pc, block.witness_signature, { - timestamp: block.timestamp, - block_id: block.block_id, - block_number: num - }) - .then(r => { - r[0]() - }) - .catch(e => { pc[1](e) }) + } } + transactional(ops, 0, [resolve, reject], num, block, Pvops); + } + }); + } - - function doOp(op, pc) { - return new Promise((resolve, reject) => { - if (op.length == 4) { - onCustomJsonOperation[op[0]](op[1], op[2], op[3], [resolve, reject, pc]) - //console.log(op[0]) - } else if (op.length == 2) { - onOperation[op[0]](op[1], [resolve, reject, pc]); - //console.log(op[0]) - } - }) - } - - function doVop(op, pc) { - return new Promise((resolve, reject) => { - console.log(op, pc) - onVOperation[op[0]](op[1], [resolve, reject, pc]); - }) - } - } - - function processBlock(block, num, Pvops) { - return new Promise((resolve, reject) => { - var transactions = block.transactions; - //console.log(transactions[0]) - let ops = [] - for (var i = 0; i < transactions.length; i++) { - for (var j = 0; j < transactions[i].operations.length; j++) { - var op = transactions[i].operations[j]; - if (op[0] === 'custom_json') { - //console.log('check') - if (typeof onCustomJsonOperation[op[1].id] === 'function') { - var ip = JSON.parse(op[1].json), - from = op[1].required_posting_auths[0], - active = false - if ( - typeof ip === "string" || - typeof ip === "number" || - Array.isArray(ip) - ) - ip = {}; - ip.transaction_id = transactions[i].transaction_id - ip.block_num = transactions[i].block_num - ip.timestamp = block.timestamp - ip.prand = block.witness_signature - if (!from) { - from = op[1].required_auths[0]; - active = true - } - ops.push([op[1].id, ip, from, active]) //onCustomJsonOperation[op[1].id](ip, from, active); - } - } else if (onOperation[op[0]] !== undefined) { - op[1].transaction_id = transactions[i].transaction_id - op[1].block_num = transactions[i].block_num - op[1].timestamp = block.timestamp - op[1].prand = block.witness_signature - ops.push([op[0], op[1]]) //onOperation[op[0]](op[1]); - } - } - } - transactional(ops, 0, [resolve, reject], num, block, Pvops) - }) - } - - return { - /* + return { + /* Determines a state update to be called when a new operation of the id operationId (with added prefix) is computed. */ - on: function(operationId, callback) { - onCustomJsonOperation[prefix + operationId] = callback; - }, + on: function (operationId, callback) { + onCustomJsonOperation[prefix + operationId] = callback; + }, - onOperation: function(type, callback) { - onOperation[type] = callback; - }, + onOperation: function (type, callback) { + onOperation[type] = callback; + }, - onNoPrefix: function(operationId, callback) { - onCustomJsonOperation[operationId] = callback; - }, + onNoPrefix: function (operationId, callback) { + onCustomJsonOperation[operationId] = callback; + }, - /* + /* Determines a state update to be called when a new block is computed. */ - onBlock: function(callback) { - onNewBlock = callback; - }, + onBlock: function (callback) { + onNewBlock = callback; + }, - start: function() { - beginBlockComputing(); - isStreaming = false; - }, + start: function () { + beginBlockComputing(); + isStreaming = false; + }, - getCurrentBlockNumber: function() { - return currentBlockNumber; - }, + getCurrentBlockNumber: function () { + return currentBlockNumber; + }, - isStreaming: function() { - return isStreaming; - }, - onStreamingStart: function(callback) { - onStreamingStart = callback; - }, + isStreaming: function () { + return isStreaming; + }, + onStreamingStart: function (callback) { + onStreamingStart = callback; + }, - stop: function(callback) { - if (isStreaming) { - stopping = true; - stream.pause(); - setTimeout(callback, 1000); - } else { - stopping = true; - stopCallback = callback; - } - } - } -} + stop: function (callback) { + if (isStreaming) { + stopping = true; + stream.pause(); + setTimeout(callback, 1000); + } else { + stopping = true; + stopCallback = callback; + } + }, + }; +}; diff --git a/routes/api.js b/routes/api.js index 6d8c41d..9642838 100644 --- a/routes/api.js +++ b/routes/api.js @@ -617,7 +617,7 @@ function fetchHive(){ RAM.head = res.result.head_block_number RAM.behind = res.result.head_block_number - (TXID.getBlockNum() || 0) //console.log({behind: RAM.behind, isStreaming: TXID.streaming}) - if (RAM.behind > 100 && TXID.streaming){exit(null, 'Stream lag')} + if (RAM.behind > 100 && TXID.streaming){exit(8, 'Stream lag')} setTimeout(function(){ fetchHive(); }, 60000);