framer: includer user-agent in version packet.
Signed-off-by: Fedor Indutny <fedor@indutny.com>
This commit is contained in:
parent
793fed1974
commit
9981835df4
@ -2,13 +2,19 @@ var bcoin = require('../../bcoin');
|
|||||||
var constants = require('./constants');
|
var constants = require('./constants');
|
||||||
var utils = bcoin.utils;
|
var utils = bcoin.utils;
|
||||||
var assert = utils.assert;
|
var assert = utils.assert;
|
||||||
|
var version = require('../../../package.json').version;
|
||||||
|
|
||||||
var writeU32 = utils.writeU32;
|
var writeU32 = utils.writeU32;
|
||||||
var writeAscii = utils.writeAscii;
|
var writeAscii = utils.writeAscii;
|
||||||
|
|
||||||
function Framer() {
|
function Framer(options) {
|
||||||
if (!(this instanceof Framer))
|
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;
|
module.exports = Framer;
|
||||||
|
|
||||||
@ -49,42 +55,52 @@ Framer.prototype._addr = function addr(buf, off) {
|
|||||||
writeU32(buf, 0, off + 20);
|
writeU32(buf, 0, off + 20);
|
||||||
buf[off + 24] = 0;
|
buf[off + 24] = 0;
|
||||||
buf[off + 25] = 0;
|
buf[off + 25] = 0;
|
||||||
|
return 26;
|
||||||
};
|
};
|
||||||
|
|
||||||
Framer.prototype.version = function version(packet) {
|
Framer.prototype.version = function version(packet) {
|
||||||
var p = new Array(86);
|
var p = new Array(86);
|
||||||
|
var off = 0;
|
||||||
|
|
||||||
if (!packet)
|
if (!packet)
|
||||||
packet = {};
|
packet = {};
|
||||||
|
|
||||||
// Version
|
// Version
|
||||||
writeU32(p, constants.version, 0);
|
off += writeU32(p, constants.version, off);
|
||||||
|
|
||||||
// Services
|
// Services
|
||||||
writeU32(p, constants.services.network, 4);
|
off += writeU32(p, constants.services.network, off);
|
||||||
writeU32(p, 0, 8);
|
off += writeU32(p, 0, off);
|
||||||
|
|
||||||
// Timestamp
|
// Timestamp
|
||||||
var ts = ((+new Date()) / 1000) | 0;
|
var ts = ((+new Date()) / 1000) | 0;
|
||||||
writeU32(p, ts, 12);
|
off += writeU32(p, ts, off);
|
||||||
writeU32(p, 0, 16);
|
off += writeU32(p, 0, off);
|
||||||
|
|
||||||
// Remote and local addresses
|
// Remote and local addresses
|
||||||
this._addr(p, 20);
|
off += this._addr(p, off);
|
||||||
this._addr(p, 46);
|
off += this._addr(p, off);
|
||||||
|
|
||||||
// Nonce, very dramatic
|
// Nonce, very dramatic
|
||||||
writeU32(p, (Math.random() * 0xffffffff) | 0, 72);
|
off += writeU32(p, (Math.random() * 0xffffffff) | 0, off);
|
||||||
writeU32(p, (Math.random() * 0xffffffff) | 0, 76);
|
off += writeU32(p, (Math.random() * 0xffffffff) | 0, off);
|
||||||
|
|
||||||
// No user-agent
|
// User-agent
|
||||||
p[80] = 0;
|
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
|
// Start height
|
||||||
writeU32(p, packet.height, 81);
|
off += writeU32(p, packet.height, off);
|
||||||
|
|
||||||
// Relay
|
// Relay
|
||||||
p[85] = packet.relay ? 1 : 0;
|
p[off++] = packet.relay ? 1 : 0;
|
||||||
|
|
||||||
return this.packet('version', p);
|
return this.packet('version', p);
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user