This commit is contained in:
Steven Ettinger 2022-09-19 21:05:52 -03:00
parent 12724c918a
commit 81bc27cf4d
4 changed files with 444 additions and 419 deletions

View File

@ -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

View File

@ -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) => {

View File

@ -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;
}
},
};
};

View File

@ -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);