61 lines
1.1 KiB
JavaScript
61 lines
1.1 KiB
JavaScript
/*!
|
|
* framer.js - packet framer for hsd
|
|
* Copyright (c) 2017-2018, Christopher Jeffrey (MIT License).
|
|
* https://github.com/handshake-org/hsd
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const assert = require('bsert');
|
|
const Network = require('../protocol/network');
|
|
|
|
/**
|
|
* Protocol Message Framer
|
|
* @alias module:net.Framer
|
|
*/
|
|
|
|
class Framer {
|
|
/**
|
|
* Create a framer.
|
|
* @constructor
|
|
* @param {Network} network
|
|
*/
|
|
|
|
constructor(network) {
|
|
this.network = Network.get(network);
|
|
}
|
|
|
|
/**
|
|
* Frame a payload with a header.
|
|
* @param {Number} cmd - Packet type.
|
|
* @param {Buffer} payload
|
|
* @returns {Buffer} Payload with header prepended.
|
|
*/
|
|
|
|
packet(cmd, payload) {
|
|
assert((cmd & 0xff) === cmd);
|
|
assert(Buffer.isBuffer(payload));
|
|
assert(payload.length <= 0xffffffff);
|
|
|
|
const msg = Buffer.allocUnsafe(9 + payload.length);
|
|
|
|
// Magic value
|
|
msg.writeUInt32LE(this.network.magic, 0, true);
|
|
|
|
// Command
|
|
msg[4] = cmd;
|
|
|
|
// Payload length
|
|
msg.writeUInt32LE(payload.length, 5, true);
|
|
|
|
payload.copy(msg, 9);
|
|
|
|
return msg;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Expose
|
|
*/
|
|
|
|
module.exports = Framer;
|