insight-api
Advanced tools
Comparing version 5.0.0-beta.39 to 5.0.0-beta.40
@@ -79,3 +79,3 @@ 'use strict'; | ||
if (!block) { | ||
return self.common.handleErrors(null, res); | ||
return self.common.handleErrors(new Error('block not in index'), res); | ||
} | ||
@@ -82,0 +82,0 @@ |
@@ -103,7 +103,7 @@ 'use strict'; | ||
this._bus.on('p2p/transaction', this.transactionEventHandler.bind(this)); | ||
this._bus.subscribe('p2p/transaction'); | ||
this._bus.on('mempool/transaction', this.transactionEventHandler.bind(this)); | ||
this._bus.subscribe('mempool/transaction'); | ||
this._bus.on('p2p/block', this.blockEventHandler.bind(this)); | ||
this._bus.subscribe('p2p/block'); | ||
this._bus.on('block/block', this.blockEventHandler.bind(this)); | ||
this._bus.subscribe('block/block'); | ||
@@ -110,0 +110,0 @@ callback(); |
{ | ||
"name": "insight-api", | ||
"description": "A Bitcoin blockchain REST and web socket API service for Bitcore Node.", | ||
"version": "5.0.0-beta.39", | ||
"version": "5.0.0-beta.40", | ||
"repository": "git://github.com/bitpay/insight-api.git", | ||
@@ -6,0 +6,0 @@ "bugs": { |
@@ -11,8 +11,8 @@ 'use strict'; | ||
var http = require('http'); | ||
var bitcore = require('bitcore-lib'); | ||
var exec = require('child_process').exec; | ||
var bitcore = require('bitcore-lib'); | ||
var Block = bitcore.Block; | ||
var rpc1Address; | ||
var rpc2Address; | ||
var tx1; | ||
var tx2; | ||
var block; | ||
var blocksGenerated = 0; | ||
@@ -28,8 +28,8 @@ var rpcConfig = { | ||
var rpc1 = new RPC(rpcConfig); | ||
rpcConfig.port++; | ||
var rpc2 = new RPC(rpcConfig); | ||
var rpc = new RPC(rpcConfig); | ||
var debug = true; | ||
var bitcoreDataDir = '/tmp/bitcore'; | ||
var bitcoinDataDirs = ['/tmp/bitcoin1', '/tmp/bitcoin2']; | ||
var bitcoinDir = '/tmp/bitcoin'; | ||
var bitcoinDataDirs = [ bitcoinDir ]; | ||
var blocks= []; | ||
@@ -44,3 +44,3 @@ var bitcoin = { | ||
rpcpassword: 'localtest', | ||
//printtoconsole: 1 | ||
//printtoconsole: 1, | ||
rpcport: 58332, | ||
@@ -81,2 +81,5 @@ }, | ||
'routePrefix': 'api' | ||
}, | ||
'block': { | ||
'readAheadBlockCount': 1 | ||
} | ||
@@ -93,3 +96,3 @@ } | ||
datadir: bitcoreDataDir, | ||
exec: 'bitcored', //if this isn't on your PATH, then provide the absolute path, e.g. /usr/local/bin/bitcored | ||
exec: 'bitcored', //if this isn't on your PATH, then provide the absolute path, e.g. /usr/local/bin/bitcored | ||
args: ['start'], | ||
@@ -99,20 +102,78 @@ process: null | ||
var startBitcoind = function(count, callback) { | ||
var request = function(httpOpts, callback) { | ||
var listenCount = 0; | ||
async.timesSeries(count, function(n, next) { | ||
var request = http.request(httpOpts, function(res) { | ||
var datadir = bitcoinDataDirs.shift(); | ||
if (res.statusCode !== 200 && res.statusCode !== 201) { | ||
return callback('Error from bitcore-node webserver: ' + res.statusCode); | ||
} | ||
bitcoin.datadir = datadir; | ||
bitcoin.args.datadir = datadir; | ||
var resError; | ||
var resData = ''; | ||
if (listenCount++ > 0) { | ||
bitcoin.args.listen = 0; | ||
bitcoin.args.rpcport++; | ||
bitcoin.args.connect = '127.0.0.1'; | ||
res.on('error', function(e) { | ||
resError = e; | ||
}); | ||
res.on('data', function(data) { | ||
resData += data; | ||
}); | ||
res.on('end', function() { | ||
if (resError) { | ||
return callback(resError); | ||
} | ||
var data = JSON.parse(resData); | ||
callback(null, data); | ||
}); | ||
}); | ||
request.on('error', function(err) { | ||
callback(err); | ||
}); | ||
if (httpOpts.body) { | ||
request.write(httpOpts.body); | ||
} else { | ||
request.write(''); | ||
} | ||
request.end(); | ||
}; | ||
var waitForBlocksGenerated = function(callback) { | ||
var httpOpts = { | ||
hostname: 'localhost', | ||
port: 53001, | ||
path: '/api/status', | ||
method: 'GET', | ||
headers: { | ||
'Content-Type': 'application/json' | ||
} | ||
}; | ||
rimraf(datadir, function(err) { | ||
async.retry({ interval: 1000, times: 100 }, function(next) { | ||
request(httpOpts, function(err, data) { | ||
if (err) { | ||
return next(err); | ||
} | ||
if (data.info.blocks !== blocksGenerated) { | ||
return next(data); | ||
} | ||
next(); | ||
}); | ||
}, callback); | ||
}; | ||
var resetDirs = function(dirs, callback) { | ||
async.each(dirs, function(dir, next) { | ||
rimraf(dir, function(err) { | ||
if(err) { | ||
@@ -122,57 +183,97 @@ return next(err); | ||
mkdirp(datadir, function(err) { | ||
mkdirp(dir, next); | ||
if(err) { | ||
return next(err); | ||
} | ||
}); | ||
var args = bitcoin.args; | ||
var argList = Object.keys(args).map(function(key) { | ||
return '-' + key + '=' + args[key]; | ||
}); | ||
}, callback); | ||
var bitcoinProcess = spawn(bitcoin.exec, argList, bitcoin.opts); | ||
bitcoin.processes.push(bitcoinProcess); | ||
}; | ||
bitcoinProcess.stdout.on('data', function(data) { | ||
var startBitcoind = function(callback) { | ||
if (debug) { | ||
process.stdout.write(data.toString()); | ||
} | ||
var args = bitcoin.args; | ||
var argList = Object.keys(args).map(function(key) { | ||
return '-' + key + '=' + args[key]; | ||
}); | ||
}); | ||
var bitcoinProcess = spawn(bitcoin.exec, argList, bitcoin.opts); | ||
bitcoin.processes.push(bitcoinProcess); | ||
bitcoinProcess.stderr.on('data', function(data) { | ||
bitcoinProcess.stdout.on('data', function(data) { | ||
if (debug) { | ||
process.stderr.write(data.toString()); | ||
} | ||
if (debug) { | ||
process.stdout.write(data.toString()); | ||
} | ||
}); | ||
}); | ||
next(); | ||
bitcoinProcess.stderr.on('data', function(data) { | ||
}); | ||
if (debug) { | ||
process.stderr.write(data.toString()); | ||
} | ||
}); | ||
}); | ||
callback(); | ||
}; | ||
var reportBitcoindsStarted = function() { | ||
var pids = bitcoin.processes.map(function(process) { | ||
return process.pid; | ||
}); | ||
console.log(pids.length + ' bitcoind\'s started at pid(s): ' + pids); | ||
}; | ||
var startBitcoinds = function(datadirs, callback) { | ||
var listenCount = 0; | ||
async.eachSeries(datadirs, function(datadir, next) { | ||
bitcoin.datadir = datadir; | ||
bitcoin.args.datadir = datadir; | ||
if (listenCount++ > 0) { | ||
bitcoin.args.listen = 0; | ||
bitcoin.args.rpcport = bitcoin.args.rpcport + 1; | ||
bitcoin.args.connect = '127.0.0.1'; | ||
} | ||
startBitcoind(next); | ||
}, function(err) { | ||
if (err) { | ||
return callback(err); | ||
} | ||
reportBitcoindsStarted(); | ||
callback(); | ||
}); | ||
}; | ||
var waitForBitcoinReady = function(rpc, callback) { | ||
async.retry({ interval: 1000, times: 1000 }, function(next) { | ||
rpc.getInfo(function(err) { | ||
if (err) { | ||
return callback(err); | ||
return next(err); | ||
} | ||
var pids = bitcoin.processes.map(function(process) { | ||
return process.pid; | ||
}); | ||
console.log(count + ' bitcoind\'s started at pid(s): ' + pids); | ||
callback(); | ||
next(); | ||
}); | ||
}, function(err) { | ||
if (err) { | ||
return callback(err); | ||
} | ||
setTimeout(callback, 2000); | ||
}); | ||
}; | ||
var shutdownBitcoind = function(callback) { | ||
bitcoin.processes.forEach(function(process) { | ||
process.kill(); | ||
}); | ||
var process; | ||
do { | ||
process = bitcoin.processes.shift(); | ||
if (process) { | ||
process.kill(); | ||
} | ||
} while(process); | ||
setTimeout(callback, 3000); | ||
@@ -188,42 +289,17 @@ }; | ||
var writeBitcoreConf = function() { | ||
fs.writeFileSync(bitcore.configFile.file, JSON.stringify(bitcore.configFile.conf)); | ||
}; | ||
var buildInitialChain = function(callback) { | ||
async.waterfall([ | ||
var startBitcore = function(callback) { | ||
var args = bitcore.args; | ||
console.log('Using bitcored from: '); | ||
async.series([ | ||
function(next) { | ||
console.log('checking to see if bitcoind\'s are connected to each other.'); | ||
rpc1.getinfo(function(err, res) { | ||
if (err || res.result.connections !== 1) { | ||
next(err || new Error('bitcoind\'s not connected to each other.')); | ||
} | ||
next(); | ||
}); | ||
}, | ||
function(next) { | ||
console.log('generating 101 blocks'); | ||
rpc1.generate(101, next); | ||
}, | ||
function(res, next) { | ||
console.log('getting new address from rpc2'); | ||
rpc2.getNewAddress(function(err, res) { | ||
if (err) { | ||
exec('which bitcored', function(err, stdout, stderr) { | ||
if(err) { | ||
return next(err); | ||
} | ||
rpc2Address = res.result; | ||
console.log(rpc2Address); | ||
next(null, rpc2Address); | ||
}); | ||
}, | ||
function(addr, next) { | ||
rpc1.sendToAddress(rpc2Address, 25, next); | ||
}, | ||
function(res, next) { | ||
tx1 = res.result; | ||
console.log('TXID: ' + res.result); | ||
console.log('generating 7 blocks'); | ||
rpc1.generate(7, next); | ||
}, | ||
function(res, next) { | ||
block = res.result[res.result.length - 1]; | ||
rpc2.getBalance(function(err, res) { | ||
console.log(res); | ||
console.log(stdout.toString('hex'), stderr.toString('hex')); | ||
next(); | ||
@@ -233,50 +309,2 @@ }); | ||
function(next) { | ||
console.log('getting new address from rpc1'); | ||
rpc1.getNewAddress(function(err, res) { | ||
if (err) { | ||
return next(err); | ||
} | ||
rpc1Address = res.result; | ||
next(null, rpc1Address); | ||
}); | ||
}, | ||
function(addr, next) { | ||
rpc2.sendToAddress(rpc1Address, 20, next); | ||
}, | ||
function(res, next) { | ||
tx2 = res.result; | ||
console.log('sending from rpc2Address TXID: ', res); | ||
console.log('generating 6 blocks'); | ||
rpc2.generate(6, next); | ||
} | ||
], function(err) { | ||
if (err) { | ||
return callback(err); | ||
} | ||
rpc1.getInfo(function(err, res) { | ||
console.log(res); | ||
callback(); | ||
}); | ||
}); | ||
}; | ||
var startBitcore = function(callback) { | ||
rimraf(bitcoreDataDir, function(err) { | ||
if(err) { | ||
return callback(err); | ||
} | ||
mkdirp(bitcoreDataDir, function(err) { | ||
if(err) { | ||
return callback(err); | ||
} | ||
fs.writeFileSync(bitcore.configFile.file, JSON.stringify(bitcore.configFile.conf)); | ||
var args = bitcore.args; | ||
bitcore.process = spawn(bitcore.exec, args, bitcore.opts); | ||
@@ -299,8 +327,6 @@ | ||
callback(); | ||
}); | ||
waitForBlocksGenerated(next); | ||
} | ||
], callback); | ||
}); | ||
}; | ||
@@ -316,20 +342,36 @@ | ||
function(next) { | ||
startBitcoind(2, next); | ||
console.log('step 0: setting up directories.'); | ||
var dirs = bitcoinDataDirs.concat([bitcoreDataDir]); | ||
resetDirs(dirs, function(err) { | ||
if (err) { | ||
return next(err); | ||
} | ||
writeBitcoreConf(); | ||
next(); | ||
}); | ||
}, | ||
function(next) { | ||
setTimeout(function() { | ||
buildInitialChain(next); | ||
}, 8000); | ||
startBitcoinds(bitcoinDataDirs, function(err) { | ||
if (err) { | ||
return next(err); | ||
} | ||
waitForBitcoinReady(rpc, function(err) { | ||
if (err) { | ||
return next(err); | ||
} | ||
blocksGenerated += 10; | ||
rpc.generate(10, function(err, res) { | ||
if (err) { | ||
return next(err); | ||
} | ||
blocks = res.result; | ||
next(); | ||
}); | ||
}); | ||
}); | ||
}, | ||
function(next) { | ||
setTimeout(function() { | ||
startBitcore(next); | ||
}, 6000); | ||
startBitcore(next); | ||
} | ||
], function(err) { | ||
if (err) { | ||
return done(err); | ||
} | ||
setTimeout(done, 2000); | ||
}); | ||
], done); | ||
@@ -346,38 +388,23 @@ }); | ||
var request = http.request('http://localhost:53001/api/blocks', function(res) { | ||
var httpOpts = { | ||
hostname: 'localhost', | ||
port: 53001, | ||
path: 'http://localhost:53001/api/blocks', | ||
method: 'GET', | ||
headers: { | ||
'Content-Type': 'application/json' | ||
} | ||
}; | ||
var error; | ||
if (res.statusCode !== 200 && res.statusCode !== 201) { | ||
request(httpOpts, function(err, data) { | ||
if (error) { | ||
return; | ||
} | ||
return done('Error from bitcore-node webserver: ' + res.statusCode); | ||
if(err) { | ||
return done(err); | ||
} | ||
var resError; | ||
var resData = ''; | ||
expect(data.length).to.equal(10); | ||
expect(data.blocks.length).to.equal(10); | ||
done(); | ||
}); | ||
res.on('error', function(e) { | ||
resError = e; | ||
}); | ||
res.on('data', function(data) { | ||
resData += data; | ||
}); | ||
res.on('end', function() { | ||
if (error) { | ||
return; | ||
} | ||
var data = JSON.parse(resData); | ||
expect(data.length).to.equal(114); | ||
done(); | ||
}); | ||
}); | ||
request.write(''); | ||
request.end(); | ||
}); | ||
@@ -387,38 +414,22 @@ | ||
var request = http.request('http://localhost:53001/api/block/' + block, function(res) { | ||
var httpOpts = { | ||
hostname: 'localhost', | ||
port: 53001, | ||
path: 'http://localhost:53001/api/block/' + blocks[0], | ||
method: 'GET', | ||
headers: { | ||
'Content-Type': 'application/json' | ||
} | ||
}; | ||
var error; | ||
if (res.statusCode !== 200 && res.statusCode !== 201) { | ||
request(httpOpts, function(err, data) { | ||
if (error) { | ||
return; | ||
} | ||
return done('Error from bitcore-node webserver: ' + res.statusCode); | ||
if(err) { | ||
return done(err); | ||
} | ||
var resError; | ||
var resData = ''; | ||
res.on('error', function(e) { | ||
resError = e; | ||
}); | ||
res.on('data', function(data) { | ||
resData += data; | ||
}); | ||
res.on('end', function() { | ||
if (error) { | ||
return; | ||
} | ||
var data = JSON.parse(resData); | ||
expect(data.hash).to.equal(block); | ||
done(); | ||
}); | ||
expect(data.hash).to.equal(blocks[0]); | ||
expect(data.height).to.equal(1); | ||
done(); | ||
}); | ||
request.write(''); | ||
request.end(); | ||
}); | ||
@@ -428,40 +439,22 @@ | ||
var request = http.request('http://localhost:53001/api/block-index/' + '108', function(res) { | ||
var httpOpts = { | ||
hostname: 'localhost', | ||
port: 53001, | ||
path: 'http://localhost:53001/api/block-index/7', | ||
method: 'GET', | ||
headers: { | ||
'Content-Type': 'application/json' | ||
} | ||
}; | ||
var error; | ||
if (res.statusCode !== 200 && res.statusCode !== 201) { | ||
request(httpOpts, function(err, data) { | ||
if (error) { | ||
return; | ||
} | ||
return done('Error from bitcore-node webserver: ' + res.statusCode); | ||
if(err) { | ||
return done(err); | ||
} | ||
var resError; | ||
var resData = ''; | ||
res.on('error', function(e) { | ||
resError = e; | ||
}); | ||
res.on('data', function(data) { | ||
resData += data; | ||
}); | ||
res.on('end', function() { | ||
if (error) { | ||
return; | ||
} | ||
var data = JSON.parse(resData); | ||
console.log(resData); | ||
expect(data.blockHash).to.equal(block); | ||
done(); | ||
}); | ||
expect(data.blockHash).to.equal(blocks[6]); | ||
done(); | ||
}); | ||
request.write(''); | ||
request.end(); | ||
}); | ||
@@ -471,45 +464,24 @@ | ||
var request = http.request('http://localhost:53001/api/rawblock/' + block, function(res) { | ||
var httpOpts = { | ||
hostname: 'localhost', | ||
port: 53001, | ||
path: 'http://localhost:53001/api/rawblock/' + blocks[4], | ||
method: 'GET', | ||
headers: { | ||
'Content-Type': 'application/json' | ||
} | ||
}; | ||
var error; | ||
if (res.statusCode !== 200 && res.statusCode !== 201) { | ||
request(httpOpts, function(err, data) { | ||
if (error) { | ||
return; | ||
} | ||
return done('Error from bitcore-node webserver: ' + res.statusCode); | ||
if(err) { | ||
return done(err); | ||
} | ||
var resError; | ||
var resData = ''; | ||
res.on('error', function(e) { | ||
resError = e; | ||
}); | ||
res.on('data', function(data) { | ||
resData += data; | ||
}); | ||
res.on('end', function() { | ||
if (error) { | ||
return; | ||
} | ||
var data = JSON.parse(resData); | ||
console.log(resData); | ||
expect(data.rawblock).to.not.be.null; | ||
done(); | ||
}); | ||
var block = new Block(new Buffer(data.rawblock, 'hex')); | ||
expect(block.hash).to.equal(blocks[4]); | ||
done(); | ||
}); | ||
}); | ||
request.write(''); | ||
request.end(); | ||
}); | ||
}); | ||
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
736920
9111
8
20