UNPKG

quickapi-sv

Version:

A Quick API for TX Broadcasting.

141 lines (113 loc) 4.15 kB
#!/usr/bin/env node 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") }