diff --git a/integration/bitcoind.js b/integration/bitcoind.js index e1a1448..d3e5f9f 100644 --- a/integration/bitcoind.js +++ b/integration/bitcoind.js @@ -122,7 +122,7 @@ describe('Integration with ' + network.name + ' bitcoind', function() { hash: new Buffer(Random.getRandomBuffer(32)) // needs to be random for repeatability }]; peer.once('getdata', function(message) { - message.inventory.should.deep.equal(inv); + message.inventory[0].should.deep.equal(inv[0]); cb(); }); var message = messages.Inventory(inv); @@ -145,7 +145,7 @@ describe('Integration with ' + network.name + ' bitcoind', function() { connect(function(peer) { var expected = messages.NotFound.forTransaction(fakeHash); peer.once('notfound', function(message) { - (message instanceof messages.NotFound).should.equal(true); + message.command.should.equal('notfound'); message.inventory[0].type.should.equal(Inventory.TYPE.TX); var expectedHash = expected.inventory[0].hash.toString('hex'); message.inventory[0].hash.toString('hex').should.equal(expectedHash); @@ -160,7 +160,7 @@ describe('Integration with ' + network.name + ' bitcoind', function() { it('gets headers', function(cb) { connect(function(peer) { peer.once('headers', function(message) { - (message instanceof messages.Headers).should.equal(true); + message.command.should.equal('headers'); message.headers.length.should.equal(3); cb(); }); diff --git a/lib/messages/builder.js b/lib/messages/builder.js index 985775a..3b58903 100644 --- a/lib/messages/builder.js +++ b/lib/messages/builder.js @@ -63,9 +63,33 @@ function builder(options) { commands: {} }; - for (var key in exported.commandsMap) { - exported.commands[key] = require('./commands/' + key)(options); - } + Object.keys(exported.commandsMap).forEach(function(key) { + + var Command = require('./commands/' + key); + + exported.commands[key] = function(obj) { + if (!obj) { + obj = {}; + } + // pass factory options + obj.Block = options.Block; + obj.BlockHeader = options.BlockHeader; + obj.Transaction = options.Transaction; + obj.MerkleBlock = options.MerkleBlock; + obj.magicNumber = options.magicNumber; + obj.version = options.protocolVersion; + return new Command(obj); + }; + + exported.commands[key]._constructor = Command; + + exported.commands[key].fromBuffer = function(buffer) { + var message = exported.commands[key](); + message.setPayload(buffer); + return message; + }; + + }); exported.inventoryCommands.forEach(function(command) { diff --git a/lib/messages/commands/addr.js b/lib/messages/commands/addr.js index 884b5d0..3d1bdcc 100644 --- a/lib/messages/commands/addr.js +++ b/lib/messages/commands/addr.js @@ -7,46 +7,37 @@ var utils = require('../utils'); var BufferReader = bitcore.encoding.BufferReader; var BufferWriter = bitcore.encoding.BufferWriter; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * @param {Object=} options * @param {Array=} options.addresses - An array of addrs + * @param {Number} options.magicNumber * @extends Message * @constructor */ function AddrMessage(options) { - if (!(this instanceof AddrMessage)) { - return new AddrMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); this.command = 'addr'; - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; this.addresses = options.addresses; } inherits(AddrMessage, Message); -AddrMessage.fromBuffer = function(payload) { +AddrMessage.prototype.setPayload = function(payload) { var parser = new BufferReader(payload); var addrCount = parser.readVarintNum(); - var obj = {}; - obj.addresses = []; + this.addresses = []; for (var i = 0; i < addrCount; i++) { // todo: time only available on versions >=31402 var time = new Date(parser.readUInt32LE() * 1000); var addr = utils.parseAddr(parser); addr.time = time; - obj.addresses.push(addr); + this.addresses.push(addr); } utils.checkFinished(parser); - return new AddrMessage(obj); }; AddrMessage.prototype.getPayload = function() { @@ -62,7 +53,4 @@ AddrMessage.prototype.getPayload = function() { return bw.concat(); }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return AddrMessage; -}; +module.exports = AddrMessage; diff --git a/lib/messages/commands/alert.js b/lib/messages/commands/alert.js index b4e60ea..064e815 100644 --- a/lib/messages/commands/alert.js +++ b/lib/messages/commands/alert.js @@ -7,24 +7,17 @@ var utils = require('../utils'); var BufferReader = bitcore.encoding.BufferReader; var BufferWriter = bitcore.encoding.BufferWriter; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * @param {Object=} options * @param {Buffer=} options.payload * @param {Buffer=} options.signature + * @param {Number} options.magicNumber * @extends Message * @constructor */ function AlertMessage(options) { - if (!(this instanceof AlertMessage)) { - return new AlertMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; this.command = 'alert'; this.payload = options.payload || new Buffer(32); @@ -32,13 +25,11 @@ function AlertMessage(options) { } inherits(AlertMessage, Message); -AlertMessage.fromBuffer = function(payload) { - var obj = {}; +AlertMessage.prototype.setPayload = function(payload) { var parser = new BufferReader(payload); - obj.payload = parser.readVarLengthBuffer(); - obj.signature = parser.readVarLengthBuffer(); + this.payload = parser.readVarLengthBuffer(); + this.signature = parser.readVarLengthBuffer(); utils.checkFinished(parser); - return new AlertMessage(obj); }; AlertMessage.prototype.getPayload = function() { @@ -52,7 +43,4 @@ AlertMessage.prototype.getPayload = function() { return bw.concat(); }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return AlertMessage; -}; +module.exports = AlertMessage; diff --git a/lib/messages/commands/block.js b/lib/messages/commands/block.js index f50538d..534d347 100644 --- a/lib/messages/commands/block.js +++ b/lib/messages/commands/block.js @@ -2,30 +2,23 @@ var Message = require('../message'); var inherits = require('util').inherits; -var bitcore = require('bitcore'); - -var Block = bitcore.Block; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); /** * @param {Object|Block=} options - If is an instance of Block will use as options.block * @param {Block=} options.block - An instance of a Block + * @param {Number} options.magicNumber + * @param {Function} options.Block - A block constructor * @extends Message * @constructor */ function BlockMessage(options) { - if (!(this instanceof BlockMessage)) { - return new BlockMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); + this.Block = options.Block; this.command = 'block'; - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; var block; - if (options instanceof Block) { + if (options instanceof this.Block) { block = options; } else { block = options.block; @@ -35,17 +28,12 @@ function BlockMessage(options) { } inherits(BlockMessage, Message); -BlockMessage.fromBuffer = function(payload) { - var block = Block.fromBuffer(payload); - return new BlockMessage({block: block}); +BlockMessage.prototype.setPayload = function(payload) { + this.block = this.Block.fromBuffer(payload); }; BlockMessage.prototype.getPayload = function() { return this.block.toBuffer(); }; -module.exports = function(options) { - Block = options.Block || Block; - magicNumber = options.magicNumber || magicNumber; - return BlockMessage; -}; +module.exports = BlockMessage; diff --git a/lib/messages/commands/filteradd.js b/lib/messages/commands/filteradd.js index 592dd9a..235cd0f 100644 --- a/lib/messages/commands/filteradd.js +++ b/lib/messages/commands/filteradd.js @@ -9,36 +9,27 @@ var BufferWriter = bitcore.encoding.BufferWriter; var BufferReader = bitcore.encoding.BufferReader; var $ = bitcore.util.preconditions; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * Request peer to add data to a bloom filter already set by 'filterload' * @param {Object=} options * @param {Buffer=} options.data - Array of bytes representing bloom filter data + * @param {Number} options.magicNumber * @extends Message * @constructor */ function FilteraddMessage(options) { - if (!(this instanceof FilteraddMessage)) { - return new FilteraddMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; this.command = 'filteradd'; this.data = options.data || BufferUtil.EMPTY_BUFFER; } inherits(FilteraddMessage, Message); -FilteraddMessage.fromBuffer = function(payload) { - var obj = {}; +FilteraddMessage.prototype.setPayload = function(payload) { $.checkArgument(payload); var parser = new BufferReader(payload); - obj.data = parser.readVarLengthBuffer(); + this.data = parser.readVarLengthBuffer(); utils.checkFinished(parser); - return new FilteraddMessage(obj); }; FilteraddMessage.prototype.getPayload = function() { @@ -48,7 +39,4 @@ FilteraddMessage.prototype.getPayload = function() { return bw.concat(); }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return FilteraddMessage; -}; +module.exports = FilteraddMessage; diff --git a/lib/messages/commands/filterclear.js b/lib/messages/commands/filterclear.js index 0682e06..50dce6b 100644 --- a/lib/messages/commands/filterclear.js +++ b/lib/messages/commands/filterclear.js @@ -5,35 +5,23 @@ var inherits = require('util').inherits; var bitcore = require('bitcore'); var BufferUtil = bitcore.util.buffer; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * Request peer to clear data for a bloom filter * @extends Message + * @param {Number} options.magicNumber * @constructor */ function FilterclearMessage(options) { - if (!(this instanceof FilterclearMessage)) { - return new FilterclearMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; this.command = 'filterclear'; } inherits(FilterclearMessage, Message); -FilterclearMessage.fromBuffer = function(payload) { - return new FilterclearMessage({}); -}; +FilterclearMessage.prototype.setPayload = function() {}; FilterclearMessage.prototype.getPayload = function() { return BufferUtil.EMPTY_BUFFER; }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return FilterclearMessage; -}; +module.exports = FilterclearMessage; diff --git a/lib/messages/commands/filterload.js b/lib/messages/commands/filterload.js index 05a53bf..6804347 100644 --- a/lib/messages/commands/filterload.js +++ b/lib/messages/commands/filterload.js @@ -8,34 +8,27 @@ var BloomFilter = require('../../bloomfilter'); var $ = bitcore.util.preconditions; var _ = bitcore.deps._; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * Request peer to send inv messages based on a bloom filter * @param {BloomFilter=} options.filter - An instance of BloomFilter + * @param {Number} options.magicNumber * @extends Message * @constructor */ function FilterloadMessage(options) { - if (!(this instanceof FilterloadMessage)) { - return new FilterloadMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; this.command = 'filterload'; - $.checkArgument(_.isUndefined(options.filter) || options.filter instanceof BloomFilter, - 'BloomFilter object or undefined required for FilterLoad'); + $.checkArgument( + _.isUndefined(options.filter) || options.filter instanceof BloomFilter, + 'An instance of BloomFilter or undefined is expected' + ); this.filter = options.filter; } inherits(FilterloadMessage, Message); -FilterloadMessage.fromBuffer = function(payload) { - var obj = {}; - obj.filter = BloomFilter.fromBuffer(payload); - return new FilterloadMessage(obj); +FilterloadMessage.prototype.setPayload = function(payload) { + this.filter = BloomFilter.fromBuffer(payload); }; FilterloadMessage.prototype.getPayload = function() { @@ -46,7 +39,4 @@ FilterloadMessage.prototype.getPayload = function() { } }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return FilterloadMessage; -}; +module.exports = FilterloadMessage; diff --git a/lib/messages/commands/getaddr.js b/lib/messages/commands/getaddr.js index e139d76..9739075 100644 --- a/lib/messages/commands/getaddr.js +++ b/lib/messages/commands/getaddr.js @@ -5,35 +5,23 @@ var inherits = require('util').inherits; var bitcore = require('bitcore'); var BufferUtil = bitcore.util.buffer; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * Request information about active peers * @extends Message + * @param {Number} options.magicNumber * @constructor */ function GetaddrMessage(options) { - if (!(this instanceof GetaddrMessage)) { - return new GetaddrMessage(options); - } - if (!options) { - options = {}; - } Message.call(this, options); - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; this.command = 'getaddr'; } inherits(GetaddrMessage, Message); -GetaddrMessage.fromBuffer = function() { - return new GetaddrMessage({}); -}; +GetaddrMessage.prototype.setPayload = function() {}; GetaddrMessage.prototype.getPayload = function() { return BufferUtil.EMPTY_BUFFER; }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return GetaddrMessage; -}; +module.exports = GetaddrMessage; diff --git a/lib/messages/commands/getblocks.js b/lib/messages/commands/getblocks.js index 09ea48c..e674710 100644 --- a/lib/messages/commands/getblocks.js +++ b/lib/messages/commands/getblocks.js @@ -8,9 +8,6 @@ var BufferReader = bitcore.encoding.BufferReader; var BufferWriter = bitcore.encoding.BufferWriter; var $ = bitcore.util.preconditions; -var protocolVersion = 70000; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * Query another peer about blocks. It can query for multiple block hashes, * and the response will contain all the chains of blocks starting from those @@ -18,18 +15,15 @@ var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); * @param {Object=} options * @param {Array=} options.starts - Array of buffers or strings with the starting block hashes * @param {Buffer=} options.stop - Hash of the last block + * @param {Number} options.magicNumber + * @extends Message + * @constructor */ function GetblocksMessage(options) { - if (!(this instanceof GetblocksMessage)) { - return new GetblocksMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); this.command = 'getblocks'; - this.version = protocolVersion; - this.magicNumber = magicNumber; + this.version = options.version; + this.magicNumber = options.magicNumber; options = utils.sanitizeStartStop(options); this.starts = options.starts; @@ -37,21 +31,19 @@ function GetblocksMessage(options) { } inherits(GetblocksMessage, Message); -GetblocksMessage.fromBuffer = function(payload) { - var obj = {}; +GetblocksMessage.prototype.setPayload = function(payload) { var parser = new BufferReader(payload); $.checkArgument(!parser.finished(), 'No data received in payload'); - obj.version = parser.readUInt32LE(); + this.version = parser.readUInt32LE(); var startCount = parser.readVarintNum(); - obj.starts = []; + this.starts = []; for (var i = 0; i < startCount; i++) { - obj.starts.push(parser.read(32)); + this.starts.push(parser.read(32)); } - obj.stop = parser.read(32); + this.stop = parser.read(32); utils.checkFinished(parser); - return new GetblocksMessage(obj); }; GetblocksMessage.prototype.getPayload = function() { @@ -68,8 +60,4 @@ GetblocksMessage.prototype.getPayload = function() { return bw.concat(); }; -module.exports = function(options) { - protocolVersion = options.protocolVersion || protocolVersion; - magicNumber = options.magicNumber || magicNumber; - return GetblocksMessage; -}; +module.exports = GetblocksMessage; diff --git a/lib/messages/commands/getdata.js b/lib/messages/commands/getdata.js index 49092f5..04ef7d2 100644 --- a/lib/messages/commands/getdata.js +++ b/lib/messages/commands/getdata.js @@ -8,24 +8,17 @@ var BufferReader = bitcore.encoding.BufferReader; var BufferWriter = bitcore.encoding.BufferWriter; var _ = bitcore.deps._; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * @param {Object|Array=} - options - If options is an array will use as "inventory" * @param {Array=} options.inventory - An array of inventory items + * @param {Number} options.magicNumber * @extends Message * @constructor */ function GetdataMessage(options) { - if (!(this instanceof GetdataMessage)) { - return new GetdataMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); this.command = 'getdata'; - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; var inventory; if (_.isArray(options)) { @@ -39,21 +32,18 @@ function GetdataMessage(options) { } inherits(GetdataMessage, Message); -GetdataMessage.fromBuffer = function(payload) { - var obj = { - inventory: [] - }; +GetdataMessage.prototype.setPayload = function(payload) { + this.inventory = []; var parser = new BufferReader(payload); var count = parser.readVarintNum(); for (var i = 0; i < count; i++) { var type = parser.readUInt32LE(); var hash = parser.read(32); - obj.inventory.push({type: type, hash: hash}); + this.inventory.push({type: type, hash: hash}); } utils.checkFinished(parser); - return new GetdataMessage(obj); }; GetdataMessage.prototype.getPayload = function() { @@ -62,7 +52,4 @@ GetdataMessage.prototype.getPayload = function() { return bw.concat(); }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return GetdataMessage; -}; +module.exports = GetdataMessage; diff --git a/lib/messages/commands/getheaders.js b/lib/messages/commands/getheaders.js index de4652c..f0af1e5 100644 --- a/lib/messages/commands/getheaders.js +++ b/lib/messages/commands/getheaders.js @@ -8,9 +8,6 @@ var BufferReader = bitcore.encoding.BufferReader; var BufferWriter = bitcore.encoding.BufferWriter; var $ = bitcore.util.preconditions; -var protocolVersion = 70000; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * Query another peer about block headers. It can query for multiple block hashes, * and the response will contain all the chains of blocks starting from those @@ -18,18 +15,15 @@ var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); * @param {Object=} options * @param {Array=} options.starts - Array of buffers or strings with the starting block hashes * @param {Buffer=} options.stop - Hash of the last block + * @param {Number} options.magicNumber + * @extends Message + * @constructor */ function GetheadersMessage(options) { - if (!(this instanceof GetheadersMessage)) { - return new GetheadersMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); this.command = 'getheaders'; - this.version = protocolVersion; - this.magicNumber = magicNumber; + this.version = options.version; + this.magicNumber = options.magicNumber; options = utils.sanitizeStartStop(options); this.starts = options.starts; @@ -37,21 +31,19 @@ function GetheadersMessage(options) { } inherits(GetheadersMessage, Message); -GetheadersMessage.fromBuffer = function(payload) { - var obj = {}; +GetheadersMessage.prototype.setPayload = function(payload) { var parser = new BufferReader(payload); $.checkArgument(!parser.finished(), 'No data received in payload'); - obj.version = parser.readUInt32LE(); + this.version = parser.readUInt32LE(); var startCount = Math.min(parser.readVarintNum(), 500); - obj.starts = []; + this.starts = []; for (var i = 0; i < startCount; i++) { - obj.starts.push(parser.read(32)); - } - obj.stop = parser.read(32); + this.starts.push(parser.read(32)); + } + this.stop = parser.read(32); utils.checkFinished(parser); - return new GetheadersMessage(obj); }; GetheadersMessage.prototype.getPayload = function() { @@ -68,8 +60,4 @@ GetheadersMessage.prototype.getPayload = function() { return bw.concat(); }; -module.exports = function(options) { - protocolVersion = options.protocolVersion || protocolVersion; - magicNumber = options.magicNumber || magicNumber; - return GetheadersMessage; -}; +module.exports = GetheadersMessage; diff --git a/lib/messages/commands/headers.js b/lib/messages/commands/headers.js index 062d8f2..d937609 100644 --- a/lib/messages/commands/headers.js +++ b/lib/messages/commands/headers.js @@ -8,46 +8,38 @@ var BufferReader = bitcore.encoding.BufferReader; var BufferWriter = bitcore.encoding.BufferWriter; var $ = bitcore.util.preconditions; -var BlockHeader = bitcore.BlockHeader; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * Sent in response to a `getheaders` message. It contains information about * block headers. * @param {Object=} options * @param {Array=} options.headers - array of block headers + * @param {Number} options.magicNumber + * @param {Function} options.BlockHeader - a BlockHeader constructor + * @extends Message + * @constructor */ function HeadersMessage(options) { - if (!(this instanceof HeadersMessage)) { - return new HeadersMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); - this.magicNumber = magicNumber; + this.BlockHeader = options.BlockHeader; + this.magicNumber = options.magicNumber; this.command = 'headers'; this.headers = options.headers; } inherits(HeadersMessage, Message); -HeadersMessage.fromBuffer = function(payload) { - var obj = {}; - +HeadersMessage.prototype.setPayload = function(payload) { $.checkArgument(payload && payload.length > 0, 'No data found to create Headers message'); var parser = new BufferReader(payload); var count = parser.readVarintNum(); - obj.headers = []; + this.headers = []; for (var i = 0; i < count; i++) { - var header = BlockHeader.fromBufferReader(parser); - obj.headers.push(header); + var header = this.BlockHeader.fromBufferReader(parser); + this.headers.push(header); var txn_count = parser.readUInt8(); $.checkState(txn_count === 0, 'txn_count should always be 0'); } utils.checkFinished(parser); - - return new HeadersMessage(obj); }; HeadersMessage.prototype.getPayload = function() { @@ -61,7 +53,4 @@ HeadersMessage.prototype.getPayload = function() { return bw.concat(); }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return HeadersMessage; -}; +module.exports = HeadersMessage; diff --git a/lib/messages/commands/inv.js b/lib/messages/commands/inv.js index 4a0a5f8..370c0a9 100644 --- a/lib/messages/commands/inv.js +++ b/lib/messages/commands/inv.js @@ -6,27 +6,19 @@ var bitcore = require('bitcore'); var utils = require('../utils'); var BufferReader = bitcore.encoding.BufferReader; var BufferWriter = bitcore.encoding.BufferWriter; -var Inventory = require('../../inventory'); var _ = bitcore.deps._; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * @param {Object|Array=} - options - If options is an array will use as "inventory" * @param {Array=} options.inventory - An array of inventory items + * @param {Number} options.magicNumber * @extends Message * @constructor */ function InvMessage(options) { - if (!(this instanceof InvMessage)) { - return new InvMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); this.command = 'inv'; - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; var inventory; if (_.isArray(options)) { @@ -39,30 +31,24 @@ function InvMessage(options) { } inherits(InvMessage, Message); -InvMessage.prototype.getPayload = function() { - var bw = new BufferWriter(); - utils.writeInventory(this.inventory, bw); - return bw.concat(); -}; - -InvMessage.fromBuffer = function(payload) { - var obj = { - inventory: [] - }; +InvMessage.prototype.setPayload = function(payload) { + this.inventory = []; var parser = new BufferReader(payload); var count = parser.readVarintNum(); for (var i = 0; i < count; i++) { var type = parser.readUInt32LE(); var hash = parser.read(32); - obj.inventory.push({type: type, hash: hash}); + this.inventory.push({type: type, hash: hash}); } utils.checkFinished(parser); - return new InvMessage(obj); }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return InvMessage; +InvMessage.prototype.getPayload = function() { + var bw = new BufferWriter(); + utils.writeInventory(this.inventory, bw); + return bw.concat(); }; + +module.exports = InvMessage; diff --git a/lib/messages/commands/mempool.js b/lib/messages/commands/mempool.js index e18c28b..2b3788f 100644 --- a/lib/messages/commands/mempool.js +++ b/lib/messages/commands/mempool.js @@ -5,37 +5,25 @@ var inherits = require('util').inherits; var bitcore = require('bitcore'); var BufferUtil = bitcore.util.buffer; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * The mempool message sends a request to a node asking for information about * transactions it has verified but which have not yet confirmed. * @see https://en.bitcoin.it/wiki/Protocol_documentation#mempool + * @param {Number} options.magicNumber * @extends Message * @constructor */ function MempoolMessage(options) { - if (!(this instanceof MempoolMessage)) { - return new MempoolMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; this.command = 'mempool'; } inherits(MempoolMessage, Message); -MempoolMessage.fromBuffer = function(payload) { - return new MempoolMessage({}); -}; +MempoolMessage.prototype.setPayload = function() {}; MempoolMessage.prototype.getPayload = function() { return BufferUtil.EMPTY_BUFFER; }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return MempoolMessage; -}; +module.exports = MempoolMessage; diff --git a/lib/messages/commands/merkleblock.js b/lib/messages/commands/merkleblock.js index 8b23aa3..3285048 100644 --- a/lib/messages/commands/merkleblock.js +++ b/lib/messages/commands/merkleblock.js @@ -7,46 +7,36 @@ var BufferUtil = bitcore.util.buffer; var $ = bitcore.util.preconditions; var _ = bitcore.deps._; -var MerkleBlock = bitcore.MerkleBlock; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * Contains information about a MerkleBlock * @see https://en.bitcoin.it/wiki/Protocol_documentation * @param {Object=} options * @param {MerkleBlock=} options.merkleBlock + * @param {Number} options.magicNumber + * @param {Function} options.MerkleBlock - a MerkleBlock constructor + * @extends Message + * @constructor */ function MerkleblockMessage(options) { - if (!(this instanceof MerkleblockMessage)) { - return new MerkleblockMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); - this.magicNumber = magicNumber; + this.MerkleBlock = options.MerkleBlock; // constructor + this.magicNumber = options.magicNumber; this.command = 'merkleblock'; $.checkArgument( - _.isUndefined(options.merkleBlock) || - options.merkleBlock instanceof MerkleBlock + _.isUndefined(options.merkleBlock) || options.merkleBlock instanceof this.MerkleBlock, + 'An instance of MerkleBlock or undefined is expected' ); this.merkleBlock = options.merkleBlock; } inherits(MerkleblockMessage, Message); -MerkleblockMessage.fromBuffer = function(payload) { - var obj = {}; +MerkleblockMessage.prototype.setPayload = function(payload) { $.checkArgument(BufferUtil.isBuffer(payload)); - obj.merkleBlock = MerkleBlock.fromBuffer(payload); - return new MerkleblockMessage(obj); + this.merkleBlock = this.MerkleBlock.fromBuffer(payload); }; MerkleblockMessage.prototype.getPayload = function() { return this.merkleBlock ? this.merkleBlock.toBuffer() : BufferUtil.EMPTY_BUFFER; }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - MerkleBlock = options.MerkleBlock || MerkleBlock; - return MerkleblockMessage; -}; +module.exports = MerkleblockMessage; diff --git a/lib/messages/commands/notfound.js b/lib/messages/commands/notfound.js index 2c638da..00a99ad 100644 --- a/lib/messages/commands/notfound.js +++ b/lib/messages/commands/notfound.js @@ -6,27 +6,19 @@ var bitcore = require('bitcore'); var utils = require('../utils'); var BufferReader = bitcore.encoding.BufferReader; var BufferWriter = bitcore.encoding.BufferWriter; -var Inventory = require('../../inventory'); var _ = bitcore.deps._; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * @param {Object|Array=} options - If options is an array will use as "inventory" * @param {Array=} options.inventory - An array of inventory items + * @param {Number} options.magicNumber * @extends Message * @constructor */ function NotfoundMessage(options) { - if (!(this instanceof NotfoundMessage)) { - return new NotfoundMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); this.command = 'notfound'; - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; var inventory; if (_.isArray(options)) { @@ -39,21 +31,18 @@ function NotfoundMessage(options) { } inherits(NotfoundMessage, Message); -NotfoundMessage.fromBuffer = function(payload) { - var obj = { - inventory: [] - }; +NotfoundMessage.prototype.setPayload = function(payload) { + this.inventory = []; var parser = new BufferReader(payload); var count = parser.readVarintNum(); for (var i = 0; i < count; i++) { var type = parser.readUInt32LE(); var hash = parser.read(32); - obj.inventory.push({type: type, hash: hash}); + this.inventory.push({type: type, hash: hash}); } utils.checkFinished(parser); - return new NotfoundMessage(obj); }; NotfoundMessage.prototype.getPayload = function() { @@ -62,7 +51,4 @@ NotfoundMessage.prototype.getPayload = function() { return bw.concat(); }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return NotfoundMessage; -}; +module.exports = NotfoundMessage; diff --git a/lib/messages/commands/ping.js b/lib/messages/commands/ping.js index e1c5721..3f356c5 100644 --- a/lib/messages/commands/ping.js +++ b/lib/messages/commands/ping.js @@ -6,43 +6,31 @@ var bitcore = require('bitcore'); var utils = require('../utils'); var BufferReader = bitcore.encoding.BufferReader; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * A message to confirm that a connection is still valid. * @param {Object=} options * @param {Buffer=} options.nonce + * @param {Number} options.magicNumber * @extends Message * @constructor */ function PingMessage(options) { - if (!(this instanceof PingMessage)) { - return new PingMessage(options); - } - if (!options) { - options = {}; - } Message.call(this, options); this.command = 'ping'; - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; this.nonce = options.nonce || utils.getNonce(); } inherits(PingMessage, Message); +PingMessage.prototype.setPayload = function(payload) { + var parser = new BufferReader(payload); + this.nonce = parser.read(8); + + utils.checkFinished(parser); +}; + PingMessage.prototype.getPayload = function() { return this.nonce; }; -PingMessage.fromBuffer = function(payload) { - var obj = {}; - var parser = new BufferReader(payload); - obj.nonce = parser.read(8); - - utils.checkFinished(parser); - return new PingMessage(obj); -}; - -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return PingMessage; -}; +module.exports = PingMessage; diff --git a/lib/messages/commands/pong.js b/lib/messages/commands/pong.js index 2280624..40c7329 100644 --- a/lib/messages/commands/pong.js +++ b/lib/messages/commands/pong.js @@ -6,43 +6,31 @@ var bitcore = require('bitcore'); var utils = require('../utils'); var BufferReader = bitcore.encoding.BufferReader; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * A message in response to a ping message. * @param {Object=} options * @param {Buffer=} options.nonce + * @param {Number} options.magicNumber * @extends Message * @constructor */ function PongMessage(options) { - if (!(this instanceof PongMessage)) { - return new PongMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); this.command = 'pong'; - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; this.nonce = options.nonce; } inherits(PongMessage, Message); -PongMessage.fromBuffer = function(payload) { - var obj = {}; +PongMessage.prototype.setPayload = function(payload) { var parser = new BufferReader(payload); - obj.nonce = parser.read(8); + this.nonce = parser.read(8); utils.checkFinished(parser); - return new PongMessage(obj); }; PongMessage.prototype.getPayload = function() { return this.nonce; }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return PongMessage; -}; +module.exports = PongMessage; diff --git a/lib/messages/commands/reject.js b/lib/messages/commands/reject.js index 0a47038..0fcfc43 100644 --- a/lib/messages/commands/reject.js +++ b/lib/messages/commands/reject.js @@ -5,32 +5,18 @@ var inherits = require('util').inherits; var bitcore = require('bitcore'); var BufferUtil = bitcore.util.buffer; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - // todo: add payload: https://en.bitcoin.it/wiki/Protocol_documentation#reject function RejectMessage(options) { - if (!(this instanceof RejectMessage)) { - return new RejectMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; this.command = 'reject'; } inherits(RejectMessage, Message); -RejectMessage.fromBuffer = function(payload) { - var obj = {}; - return new RejectMessage(obj); -}; +RejectMessage.prototype.setPayload = function() {}; RejectMessage.prototype.getPayload = function() { return BufferUtil.EMPTY_BUFFER; }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return RejectMessage; -}; +module.exports = RejectMessage; diff --git a/lib/messages/commands/tx.js b/lib/messages/commands/tx.js index 7062fad..883e69b 100644 --- a/lib/messages/commands/tx.js +++ b/lib/messages/commands/tx.js @@ -2,30 +2,22 @@ var Message = require('../message'); var inherits = require('util').inherits; -var bitcore = require('bitcore'); - -var Transaction = bitcore.Transaction; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); /** * @param {Object|Transaction=} options - If is an instance of Transaction will use as options.transaction * @param {Transaction=} options.transaction - An instance of a Transaction + * @param {Number} options.magicNumber * @extends Message * @constructor */ function TransactionMessage(options) { - if (!(this instanceof TransactionMessage)) { - return new TransactionMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); this.command = 'tx'; - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; + this.Transaction = options.Transaction; var transaction; - if(options instanceof Transaction) { + if(options instanceof this.Transaction) { transaction = options; } else { transaction = options.transaction; @@ -35,22 +27,16 @@ function TransactionMessage(options) { } inherits(TransactionMessage, Message); -TransactionMessage.fromBuffer = function(payload) { - var transaction; - if (Transaction.prototype.fromBuffer) { - transaction = new Transaction().fromBuffer(payload); +TransactionMessage.prototype.setPayload = function(payload) { + if (this.Transaction.prototype.fromBuffer) { + this.transaction = new this.Transaction().fromBuffer(payload); } else { - transaction = Transaction.fromBuffer(payload); + this.transaction = this.Transaction.fromBuffer(payload); } - return new TransactionMessage({transaction: transaction}); }; TransactionMessage.prototype.getPayload = function() { return this.transaction.toBuffer(); }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - Transaction = options.Transaction || Transaction; - return TransactionMessage; -}; +module.exports = TransactionMessage; diff --git a/lib/messages/commands/verack.js b/lib/messages/commands/verack.js index 6eef05b..55c847a 100644 --- a/lib/messages/commands/verack.js +++ b/lib/messages/commands/verack.js @@ -5,35 +5,23 @@ var inherits = require('util').inherits; var bitcore = require('bitcore'); var BufferUtil = bitcore.util.buffer; -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - /** * A message in response to a version message. + * @param {Number} options.magicNumber * @extends Message * @constructor */ function VerackMessage(options) { - if (!(this instanceof VerackMessage)) { - return new VerackMessage(options); - } - if(!options) { - options = {}; - } Message.call(this, options); - this.magicNumber = magicNumber; + this.magicNumber = options.magicNumber; this.command = 'verack'; } inherits(VerackMessage, Message); -VerackMessage.fromBuffer = function(payload) { - return new VerackMessage({}); -}; +VerackMessage.prototype.setPayload = function() {}; VerackMessage.prototype.getPayload = function() { return BufferUtil.EMPTY_BUFFER; }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - return VerackMessage; -}; +module.exports = VerackMessage; diff --git a/lib/messages/commands/version.js b/lib/messages/commands/version.js index 6986060..46083f0 100644 --- a/lib/messages/commands/version.js +++ b/lib/messages/commands/version.js @@ -9,8 +9,6 @@ var _ = bitcore.deps._; var BN = bitcore.crypto.BN; var utils = require('../utils'); -var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); -var protocolVersion = 70000; var packageInfo = require('../../../package.json'); /** @@ -25,56 +23,51 @@ var packageInfo = require('../../../package.json'); * @param {BN=} obj.services * @param {Date=} obj.timestamp * @param {Number=} obj.startHeight + * @param {Number} obj.magicNumber * @extends Message * @constructor */ function VersionMessage(obj) { - if (!(this instanceof VersionMessage)) { - return new VersionMessage(obj); - } /* jshint maxcomplexity: 10 */ Message.call(this, obj); this.command = 'version'; _.assign(this, obj); - this.magicNumber = magicNumber; + this.magicNumber = obj.magicNumber; + this.version = obj.version; this.nonce = this.nonce || utils.getNonce(); this.services = this.services || new BN(1, 10); this.timestamp = this.timestamp || new Date(); - this.version = this.version || protocolVersion; this.subversion = this.subversion || '/bitcore:' + packageInfo.version + '/'; this.startHeight = this.startHeight || 0; } inherits(VersionMessage, Message); -VersionMessage.fromBuffer = function(payload) { +VersionMessage.prototype.setPayload = function(payload) { var parser = new BufferReader(payload); - var obj = {}; - obj.version = parser.readUInt32LE(); - obj.services = parser.readUInt64LEBN(); - obj.timestamp = new Date(parser.readUInt64LEBN().toNumber() * 1000); + this.version = parser.readUInt32LE(); + this.services = parser.readUInt64LEBN(); + this.timestamp = new Date(parser.readUInt64LEBN().toNumber() * 1000); - obj.addrMe = { + this.addrMe = { services: parser.readUInt64LEBN(), ip: utils.parseIP(parser), port: parser.readUInt16BE() }; - obj.addrYou = { + this.addrYou = { services: parser.readUInt64LEBN(), ip: utils.parseIP(parser), port: parser.readUInt16BE() }; - obj.nonce = parser.read(8); - obj.subversion = parser.readVarLengthBuffer().toString(); - obj.startHeight = parser.readUInt32LE(); + this.nonce = parser.read(8); + this.subversion = parser.readVarLengthBuffer().toString(); + this.startHeight = parser.readUInt32LE(); if(parser.finished()) { - obj.relay = true; + this.relay = true; } else { - obj.relay = !!parser.readUInt8(); + this.relay = !!parser.readUInt8(); } utils.checkFinished(parser); - - return new VersionMessage(obj); }; VersionMessage.prototype.getPayload = function() { @@ -97,8 +90,4 @@ VersionMessage.prototype.getPayload = function() { return bw.concat(); }; -module.exports = function(options) { - magicNumber = options.magicNumber || magicNumber; - protocolVersion = options.protocolVersion || protocolVersion; - return VersionMessage; -}; +module.exports = VersionMessage; diff --git a/lib/messages/message.js b/lib/messages/message.js index 60cb656..4165914 100644 --- a/lib/messages/message.js +++ b/lib/messages/message.js @@ -13,9 +13,6 @@ var Hash = bitcore.crypto.Hash; * @constructor */ function Message(options) { - if(!options) { - options = {}; - } this.command = options.command; this.magicNumber = options.magicNumber; } diff --git a/test/messages/builder.js b/test/messages/builder.js index 89761c1..a95fb79 100644 --- a/test/messages/builder.js +++ b/test/messages/builder.js @@ -3,14 +3,8 @@ var should = require('chai').should(); var P2P = require('../../'); var builder = P2P.Messages.builder; -var commandData = require('../data/messages.json'); -var Data = require('../data/messages');//todo merge with commandData var bitcore = require('bitcore'); -function getPayloadBuffer(messageBuffer) { - return new Buffer(messageBuffer.slice(48), 'hex'); -} - describe('Messages Builder', function() { describe('@constructor', function() { @@ -33,82 +27,4 @@ describe('Messages Builder', function() { }); - describe('Commands', function() { - - var b = builder(); - - describe('#fromBuffer/#toBuffer round trip for all commands', function() { - Object.keys(b.commands).forEach(function(command) { - - it(command, function(done) { - var payloadBuffer = getPayloadBuffer(commandData[command].message); - should.exist(b.commands[command]); - var message = b.commands[command].fromBuffer(payloadBuffer); - var outputBuffer = message.getPayload(); - outputBuffer.toString('hex').should.equal(payloadBuffer.toString('hex')); - outputBuffer.should.deep.equal(payloadBuffer); - var expectedBuffer = new Buffer(commandData[command].message, 'hex'); - message.toBuffer().should.deep.equal(expectedBuffer); - done(); - }); - }); - }); - - describe('version', function() { - it('#fromBuffer works w/o fRelay arg', function() { - var payloadBuffer = getPayloadBuffer(Data.version.messagenofrelay); - var message = b.commands.version.fromBuffer(payloadBuffer); - message.relay.should.equal(true); - }); - - it('#relay setting works', function() { - [true,false].forEach(function(relay) { - var message = new b.commands.version({relay: relay}); - message.relay.should.equal(relay); - var messageBuf = message.getPayload(); - var newMessage = b.commands.version.fromBuffer(messageBuf); - newMessage.relay.should.equal(relay); - }); - }); - - }); - - describe('Inventory helpers for: ' + b.inventoryCommands.join(', '), function() { - - var constructors = b.inventoryCommands; - var fakeHash = 'e2dfb8afe1575bfacae1a0b4afc49af7ddda69285857267bae0e22be15f74a3a'; - - describe('#forTransaction', function() { - constructors.forEach(function(name) { - it(name, function() { - should.exist(b.commands[name].forTransaction); - var message = b.commands[name].forTransaction(fakeHash); - should.exist(message); - message.should.be.instanceof(b.commands[name]); - }); - }); - }); - - describe('#forBlock', function() { - constructors.forEach(function(name) { - it(name, function() { - var message = b.commands[name].forBlock(fakeHash); - should.exist(message); - message.should.be.instanceof(b.commands[name]); - }); - }); - }); - - describe('#forFilteredBlock', function() { - constructors.forEach(function(name) { - it(name, function() { - var message = b.commands[name].forFilteredBlock(fakeHash); - should.exist(message); - message.should.be.instanceof(b.commands[name]); - }); - }); - }); - - }); - }); }); diff --git a/test/messages/commands/index.js b/test/messages/commands/index.js index 53bdebd..d2f72a3 100644 --- a/test/messages/commands/index.js +++ b/test/messages/commands/index.js @@ -9,29 +9,6 @@ var bitcore = require('bitcore'); describe('Command Messages', function() { var messages = new Messages(); - var commandsMap = { - version: 'Version', - verack: 'VerAck', - ping: 'Ping', - pong: 'Pong', - block: 'Block', - tx: 'Transaction', - getdata: 'GetData', - headers: 'Headers', - notfound: 'NotFound', - inv: 'Inventory', - addr: 'Address', - alert: 'Alert', - reject: 'Reject', - merkleblock: 'MerkleBlock', - filterload: 'FilterLoad', - filteradd: 'FilterAdd', - filterclear: 'FilterClear', - getblocks: 'GetBlocks', - getheaders: 'GetHeaders', - mempool: 'MemPool', - getaddr: 'GetAddr' - }; describe('Transaction', function() { @@ -65,6 +42,12 @@ describe('Command Messages', function() { payload.should.be.instanceof(Buffer); }); + it('should error if filter is not a bloom filter', function() { + (function() { + var message = messages.FilterLoad({filter: 'not a bloom filter'}); + }).should.throw('An instance of BloomFilter'); + }); + }); describe('Transaction', function() { @@ -141,18 +124,10 @@ describe('Command Messages', function() { payload.length.should.equal(0); }); - }); - - - describe('Default Magic Number', function() { - - Object.keys(commandsMap).forEach(function(command) { - it(command, function() { - var messageConstructor = require('../../../lib/messages/commands/' + command)({}); - var message = new messageConstructor(); - var defaultMagic = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); - message.magicNumber.should.equal(defaultMagic); - }); + it('should error if merkleBlock is not a MerkleBlock', function() { + (function() { + var message = messages.MerkleBlock({merkleBlock: 'not a merkle block'}); + }).should.throw('An instance of MerkleBlock'); }); }); diff --git a/test/messages/index.js b/test/messages/index.js index 14bb033..b073946 100644 --- a/test/messages/index.js +++ b/test/messages/index.js @@ -8,6 +8,12 @@ var P2P = require('../../'); var Messages = P2P.Messages; var messages = new Messages(); var bitcore = require('bitcore'); +var Data = require('../data/messages');//todo merge with commandData +var commandData = require('../data/messages.json'); + +function getPayloadBuffer(messageBuffer) { + return new Buffer(messageBuffer.slice(48), 'hex'); +} describe('Messages', function() { @@ -49,15 +55,107 @@ describe('Messages', function() { var name = messages.builder.commandsMap[command]; it('message.' + name, function(done) { should.exist(messages[name]); - messages[name].super_.should.equal(Messages.Message); var message = messages[name](); should.exist(message); - message.should.be.instanceof(messages[name]); + message.should.be.instanceof(messages[name]._constructor); done(); }); }); }); + describe('#fromBuffer/#toBuffer round trip for all commands', function() { + var messages = new Messages(); + Object.keys(messages.builder.commandsMap).forEach(function(command) { + var name = messages.builder.commandsMap[command]; + it(name, function(done) { + var payloadBuffer = getPayloadBuffer(commandData[command].message); + should.exist(messages[name]); + var message = messages[name].fromBuffer(payloadBuffer); + var outputBuffer = message.getPayload(); + outputBuffer.toString('hex').should.equal(payloadBuffer.toString('hex')); + outputBuffer.should.deep.equal(payloadBuffer); + var expectedBuffer = new Buffer(commandData[command].message, 'hex'); + message.toBuffer().should.deep.equal(expectedBuffer); + done(); + }); + }); + }); + + describe('Default Magic Number', function() { + var messages = new Messages(); + Object.keys(messages.builder.commandsMap).forEach(function(command) { + var name = messages.builder.commandsMap[command]; + it(name, function() { + var message = messages[name](); + var defaultMagic = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); + message.magicNumber.should.equal(defaultMagic); + }); + }); + + }); + + describe('messages.Version', function() { + var messages = new Messages(); + it('#fromBuffer works w/o fRelay arg', function() { + var payloadBuffer = getPayloadBuffer(Data.version.messagenofrelay); + var message = messages.Version.fromBuffer(payloadBuffer); + message.relay.should.equal(true); + }); + + it('#relay setting works', function() { + [true,false].forEach(function(relay) { + var message = messages.Version({relay: relay}); + message.relay.should.equal(relay); + var messageBuf = message.getPayload(); + var newMessage = messages.Version.fromBuffer(messageBuf); + newMessage.relay.should.equal(relay); + }); + }); + }); + + describe('Inventory Helpers', function() { + + var messages = new Messages(); + + var constructors = messages.builder.inventoryCommands; + var fakeHash = 'e2dfb8afe1575bfacae1a0b4afc49af7ddda69285857267bae0e22be15f74a3a'; + + describe('#forTransaction', function() { + constructors.forEach(function(command) { + var name = messages.builder.commandsMap[command]; + it(name, function() { + should.exist(messages[name].forTransaction); + var message = messages[name].forTransaction(fakeHash); + should.exist(message); + message.should.be.instanceof(messages[name]._constructor); + }); + }); + }); + + describe('#forBlock', function() { + constructors.forEach(function(command) { + var name = messages.builder.commandsMap[command]; + it(name, function() { + var message = messages[name].forBlock(fakeHash); + should.exist(message); + message.should.be.instanceof(messages[name]._constructor); + }); + }); + }); + + describe('#forFilteredBlock', function() { + constructors.forEach(function(command) { + var name = messages.builder.commandsMap[command]; + it(name, function() { + var message = messages[name].forFilteredBlock(fakeHash); + should.exist(message); + message.should.be.instanceof(messages[name]._constructor); + }); + }); + }); + + }); + describe('#parseBuffer', function() { it('fails with invalid command', function() { var invalidCommand = 'f9beb4d96d616c6963696f757300000025000000bd5e830c' + diff --git a/test/messages/util.js b/test/messages/util.js index ce745d8..8a12064 100644 --- a/test/messages/util.js +++ b/test/messages/util.js @@ -28,6 +28,12 @@ describe('Message Utils', function() { utils.sanitizeStartStop({starts: ['0000'], stop: stop}); }).should.throw('Invalid hash'); }); + it('should keep buffers as buffers', function() { + /*jshint immed: false */ + var starts = [new Buffer(Array(32))]; + var obj = utils.sanitizeStartStop({starts: starts}); + obj.starts[0].should.deep.equal(starts[0]); + }); }); });