quickapi-sv
Version:
A Quick API for TX Broadcasting.
141 lines (113 loc) • 4.15 kB
JavaScript
require("./bsv-p2p.fix.js")
var bsv = require('bsv')
//var Peer = require('bitcore-p2p-cash').Peer;
var Messages = require('bsv-p2p').Messages;
var Peer = require('bsv-p2p').Peer;
var Pool = require('bsv-p2p').Pool;
var express = require('express')
var app = express()
var program = require('commander')
var version = require('./package.json').version
var bodyParser = require('body-parser')
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
program
.version(version)
.option('-p, --peer [ip]', 'IP address of peer, find it on bitsonar, if given, quick-api will be restricted to this address')
program
.parse(process.argv)
var bsvMessages = new Messages()
/*
var peer = new Peer({host: program.peer, messages: bsvMessages})
*/
var Type = [
'Error',
'Transaction',
'Block',
'Filtered Block',
'Cmpct Block'
]
var p2p = null
var listening = false
if(program.peer){
var host = program.peer.split(":")[0]
var port = program.peer.split(":")[1]
// if peer address is provided, restrict to the given address
var peer = new Peer({host: host, port: port})
peer.on('ready', function() {
// peer info
console.log(peer.version, peer.subversion, peer.bestHeight)
console.log('Peer Address: ' + program.peer)
app.listen(8000, function(){console.log('QuickAPI is listening on 8000')})
})
peer.on('inv', function(message) {
console.log('inv message')
message.inventory.forEach(function(item){
console.log('Item type:' + Type[item.type] + ' hash:' + item.hash.reverse().toString('hex'))
})
this.sendMessage(this.messages.GetData(message.inventory))
})
peer.on('reject', function(message) {
console.log('Peer reject')
console.log(message)
});
peer.on('disconnect', function() {
console.log('connection closed')
})
peer.on('error', function(e) {
console.log(e)
console.log('connection lost')
})
peer.connect()
p2p = peer
}else{
var pool = new Pool({relay: true})
pool.on('peerready', function(peer, addr) {
// peer info
console.log(`Peer ready: ${peer.version} ${peer.subversion} ${peer.bestHeight}`)
console.log('Peer Address: ' + JSON.stringify(addr.ip))
console.log(`peer connected:${Object.values(pool._connectedPeers).reduce((count,peer)=>count+((peer.status==Peer.STATUS.READY)?1:0), 0)}`)
if(!listening){
app.listen(8000, function(){console.log('QuickAPI is listening on 8000')})
listening = true
}
})
pool.on('peerinv', function(peer, message) {
//console.log('inv message')
message.inventory.forEach(function(item){
console.log('Item type:' + Type[item.type] + ' hash:' + item.hash.reverse().toString('hex') + ' from ' + peer.host)
})
//peer.sendMessage(bsvMessages.GetData(message.inventory))
})
pool.on('peerreject', function(peer, message) {
console.log('Peer reject')
console.log(message)
});
/*
pool.on('peerdisconnect', function(peer, address) {
console.log(`peer ${JSON.stringify(address.ip)} connection closed`)
console.log(`peer connected:${Object.values(pool._connectedPeers).reduce((count,peer)=>count+((peer.status==Peer.STATUS.READY)?1:0), 0)}`)
})
*/
pool.on('peererror', function(peer, e) {
console.log(e)
console.log(`peer error: ${peer.host}:${peer.port}`)
})
pool.connect()
p2p = pool
}
app.post('/', function(req, res){
handle(req, res)
})
async function handle(req, res){
if(!p2p.status && p2p._connectedPeers == 0){
res.status(500).send(tx.id+ "not broadcasted, reason: no peer connected")
return
}
var tx = bsv.Transaction(req.body.hex)
console.log('Broadcasting ' + tx.id)
var msg = bsvMessages.Transaction(tx)
p2p.sendMessage(msg)
res.send(tx.id+ " broadcasted")
}