diff --git a/lib/bcoin/protocol/framer.js b/lib/bcoin/protocol/framer.js index b6801302..4db41ef2 100644 --- a/lib/bcoin/protocol/framer.js +++ b/lib/bcoin/protocol/framer.js @@ -2,13 +2,19 @@ var bcoin = require('../../bcoin'); var constants = require('./constants'); var utils = bcoin.utils; var assert = utils.assert; +var version = require('../../../package.json').version; var writeU32 = utils.writeU32; var writeAscii = utils.writeAscii; -function Framer() { +function Framer(options) { if (!(this instanceof Framer)) - return new Framer(); + return new Framer(options); + + options = options || {}; + + this.options = options; + this.agent = utils.toArray(options.agent || '/bcoin:' + version + '/'); } module.exports = Framer; @@ -49,42 +55,52 @@ Framer.prototype._addr = function addr(buf, off) { writeU32(buf, 0, off + 20); buf[off + 24] = 0; buf[off + 25] = 0; + return 26; }; Framer.prototype.version = function version(packet) { var p = new Array(86); + var off = 0; if (!packet) packet = {}; // Version - writeU32(p, constants.version, 0); + off += writeU32(p, constants.version, off); // Services - writeU32(p, constants.services.network, 4); - writeU32(p, 0, 8); + off += writeU32(p, constants.services.network, off); + off += writeU32(p, 0, off); // Timestamp var ts = ((+new Date()) / 1000) | 0; - writeU32(p, ts, 12); - writeU32(p, 0, 16); + off += writeU32(p, ts, off); + off += writeU32(p, 0, off); // Remote and local addresses - this._addr(p, 20); - this._addr(p, 46); + off += this._addr(p, off); + off += this._addr(p, off); // Nonce, very dramatic - writeU32(p, (Math.random() * 0xffffffff) | 0, 72); - writeU32(p, (Math.random() * 0xffffffff) | 0, 76); + off += writeU32(p, (Math.random() * 0xffffffff) | 0, off); + off += writeU32(p, (Math.random() * 0xffffffff) | 0, off); - // No user-agent - p[80] = 0; + // User-agent + assert.equal(off, 80); + if (!this.agent) { + p[off++] = 0; + } else { + off += varint(p, this.agent.length, off); + for (var i = 0; i < this.agent.length; i++) { + p[off++] = this.agent[i]; + } + } // Start height - writeU32(p, packet.height, 81); + off += writeU32(p, packet.height, off); // Relay - p[85] = packet.relay ? 1 : 0; + p[off++] = packet.relay ? 1 : 0; return this.packet('version', p); };