/*! * invitem.js - inv item object for bcoin * Copyright (c) 2014-2015, Fedor Indutny (MIT License) * Copyright (c) 2014-2016, Christopher Jeffrey (MIT License). * https://github.com/bcoin-org/bcoin */ 'use strict'; module.exports = InvItem; var constants = require('../protocol/constants'); var BufferWriter = require('../utils/writer'); var BufferReader = require('../utils/reader'); /** * Inv Item * @param {Number} type * @param {Hash} hash * @property {InvType} type * @property {Hash} hash */ function InvItem(type, hash) { if (!(this instanceof InvItem)) return new InvItem(type, hash); this.type = type; this.hash = hash; } /** * Serialize inv item. * @returns {Buffer} */ InvItem.prototype.toRaw = function toRaw(writer) { var p = BufferWriter(writer); p.writeU32(this.type); p.writeHash(this.hash); if (!writer) p = p.render(); return p; }; /** * Inject properties from serialized data. * @param {Buffer} data */ InvItem.prototype.fromRaw = function fromRaw(data) { var p = BufferReader(data); this.type = p.readU32(); this.hash = p.readHash('hex'); return this; }; /** * Instantiate inv item from serialized data. * @param {Buffer} data * @param {String?} enc * @returns {InvItem} */ InvItem.fromRaw = function fromRaw(data, enc) { if (typeof data === 'string') data = new Buffer(data, enc); return new InvItem().fromRaw(data); }; /** * Test whether the inv item is a block. * @returns {Boolean} */ InvItem.prototype.isBlock = function isBlock() { switch (this.type) { case constants.inv.BLOCK: case constants.inv.WITNESS_BLOCK: case constants.inv.FILTERED_BLOCK: case constants.inv.WITNESS_FILTERED_BLOCK: case constants.inv.CMPCT_BLOCK: return true; default: return false; } }; /** * Test whether the inv item is a tx. * @returns {Boolean} */ InvItem.prototype.isTX = function isTX() { switch (this.type) { case constants.inv.TX: case constants.inv.WITNESS_TX: return true; default: return false; } }; /** * Test whether the inv item has the witness bit set. * @returns {Boolean} */ InvItem.prototype.hasWitness = function hasWitness() { return (this.type & constants.WITNESS_MASK) !== 0; }; /* * Expose */ module.exports = InvItem;