82 lines
1.6 KiB
JavaScript
82 lines
1.6 KiB
JavaScript
/*!
|
|
* framer.js - packet framer 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';
|
|
|
|
var Network = require('../protocol/network');
|
|
var crypto = require('../crypto/crypto');
|
|
var assert = require('assert');
|
|
|
|
/**
|
|
* Protocol packet framer
|
|
* @exports Framer
|
|
* @constructor
|
|
* @param {Object} options
|
|
*/
|
|
|
|
function Framer(options) {
|
|
if (!(this instanceof Framer))
|
|
return new Framer(options);
|
|
|
|
if (!options)
|
|
options = {};
|
|
|
|
this.options = options;
|
|
|
|
this.network = Network.get(options.network);
|
|
this.bip151 = options.bip151;
|
|
}
|
|
|
|
/**
|
|
* Frame a payload with a header.
|
|
* @param {String} cmd - Packet type.
|
|
* @param {Buffer} payload
|
|
* @returns {Buffer} Payload with header prepended.
|
|
*/
|
|
|
|
Framer.prototype.packet = function packet(cmd, payload, checksum) {
|
|
var i, packet;
|
|
|
|
assert(payload, 'No payload.');
|
|
|
|
if (this.bip151 && this.bip151.handshake)
|
|
return this.bip151.packet(cmd, payload);
|
|
|
|
assert(cmd.length < 12);
|
|
assert(payload.length <= 0xffffffff);
|
|
|
|
packet = new Buffer(24 + payload.length);
|
|
|
|
// Magic value
|
|
packet.writeUInt32LE(this.network.magic, 0, true);
|
|
|
|
// Command
|
|
packet.write(cmd, 4, 'ascii');
|
|
|
|
for (i = 4 + cmd.length; i < 16; i++)
|
|
packet[i] = 0;
|
|
|
|
// Payload length
|
|
packet.writeUInt32LE(payload.length, 16, true);
|
|
|
|
if (!checksum)
|
|
checksum = crypto.hash256(payload);
|
|
|
|
// Checksum
|
|
checksum.copy(packet, 20, 0, 4);
|
|
|
|
payload.copy(packet, 24);
|
|
|
|
return packet;
|
|
};
|
|
|
|
/*
|
|
* Expose
|
|
*/
|
|
|
|
module.exports = Framer;
|