From b356790136cf542b8739d837433ba4b78428d457 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Tue, 15 Mar 2016 13:48:36 -0700 Subject: [PATCH] move reader and writer. --- lib/bcoin/protocol/framer.js | 176 ++------------------------- lib/bcoin/protocol/parser.js | 203 +------------------------------- lib/bcoin/reader.js | 222 +++++++++++++++++++++++++++++++++++ lib/bcoin/script.js | 3 +- lib/bcoin/tx.js | 8 +- lib/bcoin/writer.js | 178 ++++++++++++++++++++++++++++ 6 files changed, 416 insertions(+), 374 deletions(-) create mode 100644 lib/bcoin/reader.js create mode 100644 lib/bcoin/writer.js diff --git a/lib/bcoin/protocol/framer.js b/lib/bcoin/protocol/framer.js index 54e16ac6..10375ab9 100644 --- a/lib/bcoin/protocol/framer.js +++ b/lib/bcoin/protocol/framer.js @@ -9,6 +9,7 @@ var network = require('./network'); var constants = require('./constants'); var utils = require('../utils'); var assert = utils.assert; +var BufferWriter = require('../writer'); /** * Framer @@ -233,7 +234,7 @@ Framer._inv = function _inv(items, writer) { assert(items.length <= 50000); - p.writeIntv(items.length); + p.writeUIntv(items.length); for (i = 0; i < items.length; i++) { p.writeU32(constants.inv[items[i].type]); @@ -305,7 +306,7 @@ Framer._getBlocks = function _getBlocks(hashes, stop, writer) { var i; p.writeU32(constants.version); - p.writeIntv(hashes.length); + p.writeUIntv(hashes.length); for (i = 0; i < hashes.length; i++) p.writeHash(hashes[i]); @@ -582,7 +583,7 @@ Framer._block = function _block(block, useWitness, writer) { p.writeU32(block.ts); p.writeU32(block.bits); p.writeU32(block.nonce); - p.writeIntv(block.txs.length); + p.writeUIntv(block.txs.length); for (i = 0; i < block.txs.length; i++) { Framer.renderTX(block.txs[i], useWitness, p); @@ -609,7 +610,7 @@ Framer.merkleBlock = function _merkleBlock(block, writer) { p.writeU32(block.nonce); p.writeU32(block.totalTX); - p.writeIntv(block.hashes.length); + p.writeUIntv(block.hashes.length); for (i = 0; i < block.hashes.length; i++) p.writeHash(block.hashes[i]); @@ -631,7 +632,7 @@ Framer.headers = function _headers(block, writer) { p.writeU32(block.ts); p.writeU32(block.bits); p.writeU32(block.nonce); - p.writeIntv(block.totalTX); + p.writeUIntv(block.totalTX); if (!writer) p = p.render(); @@ -643,7 +644,7 @@ Framer.reject = function reject(details, writer) { var p = new BufferWriter(writer); p.writeVarString(details.message || '', 'ascii'); - p.writeU8(details.ccode || constants.reject.malformed); + p.writeU8(constants.reject[details.ccode] || constants.reject.malformed); p.writeVarString(details.reason || '', 'ascii'); if (details.data) p.writeBytes(details.data); @@ -658,7 +659,7 @@ Framer.addr = function addr(peers, writer) { var p = new BufferWriter(writer); var i, peer; - p.writeIntv(peers.length); + p.writeUIntv(peers.length); for (i = 0; i < peers.length; i++) { peer = peers[i]; @@ -681,169 +682,8 @@ Framer.mempool = function mempool() { return new Buffer([]); }; -function BufferWriter(options) { - if (options instanceof BufferWriter) - return options; - - if (!(this instanceof BufferWriter)) - return new BufferWriter(options); - - this.data = []; - this.written = 0; -} - -BufferWriter.prototype.render = function render() { - var data = new Buffer(this.written); - var off = 0; - var i, item; - - for (i = 0; i < this.data.length; i++) { - item = this.data[i]; - switch (item[0]) { - case 'u8': off += utils.writeU8(data, item[1], off); break; - case 'u16': off += utils.writeU16(data, item[1], off); break; - case 'u16be': off += utils.writeU16BE(data, item[1], off); break; - case 'u32': off += utils.writeU32(data, item[1], off); break; - case 'u32be': off += utils.writeU32BE(data, item[1], off); break; - case 'u64': off += utils.writeU64(data, item[1], off); break; - case 'u64be': off += utils.writeU64BE(data, item[1], off); break; - case '8': off += utils.write8(data, item[1], off); break; - case '16': off += utils.write16(data, item[1], off); break; - case '16be': off += utils.write16BE(data, item[1], off); break; - case '32': off += utils.write32(data, item[1], off); break; - case '32be': off += utils.write32BE(data, item[1], off); break; - case '64': off += utils.write64(data, item[1], off); break; - case '64be': off += utils.write64BE(data, item[1], off); break; - case 'varint': off += utils.writeIntv(data, item[1], off); break; - case 'bytes': off += utils.copy(item[1], data, off); break; - } - } - - return data; -}; - -BufferWriter.prototype.writeU8 = function writeU8(value) { - this.written += 1; - this.data.push(['u8', value]); -}; - -BufferWriter.prototype.writeU16 = function writeU16(value) { - this.written += 2; - this.data.push(['u16', value]); -}; - -BufferWriter.prototype.writeU16BE = function writeU16BE(value) { - this.written += 2; - this.data.push(['u16be', value]); -}; - -BufferWriter.prototype.writeU32 = function writeU32(value) { - this.written += 4; - this.data.push(['u32', value]); -}; - -BufferWriter.prototype.writeU32BE = function writeU32BE(value) { - this.written += 4; - this.data.push(['u32be', value]); -}; - -BufferWriter.prototype.writeU64 = function writeU64(value) { - this.written += 8; - this.data.push(['u64', value]); -}; - -BufferWriter.prototype.writeU64BE = function writeU64BE(value) { - this.written += 8; - this.data.push(['u64be', value]); -}; - -BufferWriter.prototype.write8 = function write8(value) { - this.written += 1; - this.data.push(['8', value]); -}; - -BufferWriter.prototype.write16 = function write16(value) { - this.written += 2; - this.data.push(['16', value]); -}; - -BufferWriter.prototype.write16BE = function write16BE(value) { - this.written += 2; - this.data.push(['16be', value]); -}; - -BufferWriter.prototype.write32 = function write32(value) { - this.written += 4; - this.data.push(['32', value]); -}; - -BufferWriter.prototype.write32BE = function write32BE(value) { - this.written += 4; - this.data.push(['32be', value]); -}; - -BufferWriter.prototype.write64 = function write64(value) { - this.written += 8; - this.data.push(['64', value]); -}; - -BufferWriter.prototype.write64BE = function write64BE(value) { - this.written += 8; - this.data.push(['64be', value]); -}; - -BufferWriter.prototype.writeBytes = function writeBytes(value) { - this.written += value.length; - this.data.push(['bytes', value]); -}; - -BufferWriter.prototype.getSize = function getSize() { - return this.written; -}; - -BufferWriter.prototype.writeString = function writeString(value, enc) { - if (typeof value === 'string') - value = new Buffer(value, enc); - this.writeBytes(value); -}; - -BufferWriter.prototype.writeHash = function writeHash(value) { - if (typeof value === 'string') - value = new Buffer(value, 'hex'); - this.writeBytes(value); -}; - -BufferWriter.prototype.writeVarString = function writeVarString(value, enc) { - if (typeof value === 'string') - value = new Buffer(value, enc); - this.writeVarBytes(value); -}; - -BufferWriter.prototype.writeVarBytes = function writeVarBytes(value) { - this.written += utils.sizeIntv(value.length); - this.written += value.length; - this.data.push(['varint', value.length]); - this.data.push(['bytes', value]); -}; - -BufferWriter.prototype.writeNullString = function writeNullString(value, enc) { - this.writeString(value, enc); - this.writeU8(0); -}; - -BufferWriter.prototype.writeIntv = function writeIntv(value) { - this.written += utils.sizeIntv(value); - this.data.push(['varint', value]); -}; - -BufferWriter.prototype.writeUIntv = function writeUIntv(value) { - this.written += utils.sizeIntv(value); - this.data.push(['varint', value]); -}; - /** * Expose */ -Framer.BufferWriter = BufferWriter; module.exports = Framer; diff --git a/lib/bcoin/protocol/parser.js b/lib/bcoin/protocol/parser.js index 4f72cf95..770d94c7 100644 --- a/lib/bcoin/protocol/parser.js +++ b/lib/bcoin/protocol/parser.js @@ -5,12 +5,12 @@ */ var EventEmitter = require('events').EventEmitter; - var bcoin = require('../../bcoin'); var utils = require('../utils'); var assert = utils.assert; var constants = require('./constants'); var network = require('./network'); +var BufferReader = require('../reader'); /** * Parser @@ -688,209 +688,8 @@ Parser.parseMempool = function parseMempool(p) { return {}; }; -function BufferReader(data, offset) { - if (data instanceof BufferReader) - return data; - this.data = data; - this.offset = offset || 0; - this.stack = []; -} - -BufferReader.prototype.start = function start() { - this.stack.push(this.offset); -}; - -BufferReader.prototype.end = function end() { - assert(this.stack.length > 0); - var start = this.stack.pop(); - var end = this.offset; - if (this.stack.length === 0) { - delete this.offset; - delete this.stack; - delete this.data; - } - return end - start; -}; - -BufferReader.prototype.endData = function endData() { - assert(this.stack.length > 0); - var start = this.stack.pop(); - var end = this.offset; - var size = end - start; - var data = this.data; - - if (this.stack.length === 0) { - delete this.offset; - delete this.stack; - delete this.data; - } - - if (size === data.length) - return data; - - return utils.slice(data, start, end); -}; - -BufferReader.prototype.readU8 = function readU8() { - assert(this.offset + 1 <= this.data.length); - var ret = utils.readU8(this.data, this.offset); - this.offset += 1; - return ret; -}; - -BufferReader.prototype.readU16 = function readU16() { - assert(this.offset + 2 <= this.data.length); - var ret = utils.readU16(this.data, this.offset); - this.offset += 2; - return ret; -}; - -BufferReader.prototype.readU16BE = function readU16BE() { - assert(this.offset + 2 <= this.data.length); - var ret = utils.readU16BE(this.data, this.offset); - this.offset += 2; - return ret; -}; - -BufferReader.prototype.readU32 = function readU32() { - assert(this.offset + 4 <= this.data.length); - var ret = utils.readU32(this.data, this.offset); - this.offset += 4; - return ret; -}; - -BufferReader.prototype.readU32BE = function readU32BE() { - assert(this.offset + 4 <= this.data.length); - var ret = utils.readU32BE(this.data, this.offset); - this.offset += 4; - return ret; -}; - -BufferReader.prototype.readU64 = function readU64() { - assert(this.offset + 8 <= this.data.length); - var ret = utils.readU64(this.data, this.offset); - this.offset += 8; - return ret; -}; - -BufferReader.prototype.readU64BE = function readU64BE() { - assert(this.offset + 8 <= this.data.length); - var ret = utils.readU64BE(this.data, this.offset); - this.offset += 8; - return ret; -}; - -BufferReader.prototype.read8 = function read8() { - assert(this.offset + 1 <= this.data.length); - var ret = utils.read8(this.data, this.offset); - this.offset += 1; - return ret; -}; - -BufferReader.prototype.read16 = function read16() { - assert(this.offset + 2 <= this.data.length); - var ret = utils.read16(this.data, this.offset); - this.offset += 2; - return ret; -}; - -BufferReader.prototype.read16BE = function read16BE() { - assert(this.offset + 2 <= this.data.length); - var ret = utils.read16BE(this.data, this.offset); - this.offset += 2; - return ret; -}; - -BufferReader.prototype.read32 = function read32() { - assert(this.offset + 4 <= this.data.length); - var ret = utils.read32(this.data, this.offset); - this.offset += 4; - return ret; -}; - -BufferReader.prototype.read32BE = function read32BE() { - assert(this.offset + 4 <= this.data.length); - var ret = utils.read32BE(this.data, this.offset); - this.offset += 4; - return ret; -}; - -BufferReader.prototype.read64 = function read64() { - assert(this.offset + 8 <= this.data.length); - var ret = utils.read64(this.data, this.offset); - this.offset += 8; - return ret; -}; - -BufferReader.prototype.read64BE = function read64BE() { - assert(this.offset + 8 <= this.data.length); - var ret = utils.read64BE(this.data, this.offset); - this.offset += 8; - return ret; -}; - -BufferReader.prototype.readBytes = function readBytes(size) { - assert(size >= 0); - assert(this.offset + size <= this.data.length); - var ret = utils.slice(this.data, this.offset, this.offset + size); - this.offset += size; - return ret; -}; - -BufferReader.prototype.readString = function readString(enc, size) { - assert(size >= 0); - assert(this.offset + size <= this.data.length); - var ret = this.data.toString(enc, this.offset, this.offset + size); - this.offset += size; - return ret; -}; - -BufferReader.prototype.readHash = function readHash() { - return this.readBytes(32); -}; - -BufferReader.prototype.readVarString = function readVarString(enc) { - return this.readString(enc, this.readUIntv()); -}; - -BufferReader.prototype.readVarBytes = function readVarBytes() { - return this.readBytes(this.readUIntv()); -}; - -BufferReader.prototype.readNullString = function readNullString(enc) { - assert(this.offset + 1 <= this.data.length); - for (var i = this.offset; i < this.data.length; i++) { - if (this.data[i] === 0) - break; - } - assert(i !== this.data.length); - var ret = this.readString(enc, i - this.offset); - this.offset = i + 1; - return ret; -}; - -BufferReader.prototype.left = function left() { - assert(this.offset <= this.data.length); - return this.data.length - this.offset; -}; - -BufferReader.prototype.readIntv = function readIntv() { - assert(this.offset + 1 <= this.data.length); - var result = utils.readIntv(this.data, this.offset); - assert(result.off <= this.data.length); - this.offset = result.off; - return result.r; -}; - -BufferReader.prototype.readUIntv = function readUIntv() { - var result = this.readIntv(); - assert(result >= 0); - return result; -}; - /** * Expose */ -Parser.BufferReader = BufferReader; module.exports = Parser; diff --git a/lib/bcoin/reader.js b/lib/bcoin/reader.js new file mode 100644 index 00000000..fbccced1 --- /dev/null +++ b/lib/bcoin/reader.js @@ -0,0 +1,222 @@ +/** + * reader.js - buffer reader for bcoin + * Copyright (c) 2014-2015, Fedor Indutny (MIT License) + * https://github.com/indutny/bcoin + */ + +var utils = require('./utils'); +var assert = utils.assert; + +/** + * BufferReader + */ + +function BufferReader(data, offset) { + if (data instanceof BufferReader) + return data; + this.data = data; + this.offset = offset || 0; + this.stack = []; +} + +BufferReader.prototype.start = function start() { + this.stack.push(this.offset); +}; + +BufferReader.prototype.end = function end() { + assert(this.stack.length > 0); + + var start = this.stack.pop(); + var end = this.offset; + + if (this.stack.length === 0) { + delete this.offset; + delete this.stack; + delete this.data; + } + + return end - start; +}; + +BufferReader.prototype.endData = function endData() { + assert(this.stack.length > 0); + + var start = this.stack.pop(); + var end = this.offset; + var size = end - start; + var data = this.data; + + if (this.stack.length === 0) { + delete this.offset; + delete this.stack; + delete this.data; + } + + if (size === data.length) + return data; + + return utils.slice(data, start, end); +}; + +BufferReader.prototype.readU8 = function readU8() { + assert(this.offset + 1 <= this.data.length); + var ret = utils.readU8(this.data, this.offset); + this.offset += 1; + return ret; +}; + +BufferReader.prototype.readU16 = function readU16() { + assert(this.offset + 2 <= this.data.length); + var ret = utils.readU16(this.data, this.offset); + this.offset += 2; + return ret; +}; + +BufferReader.prototype.readU16BE = function readU16BE() { + assert(this.offset + 2 <= this.data.length); + var ret = utils.readU16BE(this.data, this.offset); + this.offset += 2; + return ret; +}; + +BufferReader.prototype.readU32 = function readU32() { + assert(this.offset + 4 <= this.data.length); + var ret = utils.readU32(this.data, this.offset); + this.offset += 4; + return ret; +}; + +BufferReader.prototype.readU32BE = function readU32BE() { + assert(this.offset + 4 <= this.data.length); + var ret = utils.readU32BE(this.data, this.offset); + this.offset += 4; + return ret; +}; + +BufferReader.prototype.readU64 = function readU64() { + assert(this.offset + 8 <= this.data.length); + var ret = utils.readU64(this.data, this.offset); + this.offset += 8; + return ret; +}; + +BufferReader.prototype.readU64BE = function readU64BE() { + assert(this.offset + 8 <= this.data.length); + var ret = utils.readU64BE(this.data, this.offset); + this.offset += 8; + return ret; +}; + +BufferReader.prototype.read8 = function read8() { + assert(this.offset + 1 <= this.data.length); + var ret = utils.read8(this.data, this.offset); + this.offset += 1; + return ret; +}; + +BufferReader.prototype.read16 = function read16() { + assert(this.offset + 2 <= this.data.length); + var ret = utils.read16(this.data, this.offset); + this.offset += 2; + return ret; +}; + +BufferReader.prototype.read16BE = function read16BE() { + assert(this.offset + 2 <= this.data.length); + var ret = utils.read16BE(this.data, this.offset); + this.offset += 2; + return ret; +}; + +BufferReader.prototype.read32 = function read32() { + assert(this.offset + 4 <= this.data.length); + var ret = utils.read32(this.data, this.offset); + this.offset += 4; + return ret; +}; + +BufferReader.prototype.read32BE = function read32BE() { + assert(this.offset + 4 <= this.data.length); + var ret = utils.read32BE(this.data, this.offset); + this.offset += 4; + return ret; +}; + +BufferReader.prototype.read64 = function read64() { + assert(this.offset + 8 <= this.data.length); + var ret = utils.read64(this.data, this.offset); + this.offset += 8; + return ret; +}; + +BufferReader.prototype.read64BE = function read64BE() { + assert(this.offset + 8 <= this.data.length); + var ret = utils.read64BE(this.data, this.offset); + this.offset += 8; + return ret; +}; + +BufferReader.prototype.readBytes = function readBytes(size) { + assert(size >= 0); + assert(this.offset + size <= this.data.length); + var ret = utils.slice(this.data, this.offset, this.offset + size); + this.offset += size; + return ret; +}; + +BufferReader.prototype.readString = function readString(enc, size) { + assert(size >= 0); + assert(this.offset + size <= this.data.length); + var ret = this.data.toString(enc, this.offset, this.offset + size); + this.offset += size; + return ret; +}; + +BufferReader.prototype.readHash = function readHash() { + return this.readBytes(32); +}; + +BufferReader.prototype.readVarString = function readVarString(enc) { + return this.readString(enc, this.readUIntv()); +}; + +BufferReader.prototype.readVarBytes = function readVarBytes() { + return this.readBytes(this.readUIntv()); +}; + +BufferReader.prototype.readNullString = function readNullString(enc) { + assert(this.offset + 1 <= this.data.length); + for (var i = this.offset; i < this.data.length; i++) { + if (this.data[i] === 0) + break; + } + assert(i !== this.data.length); + var ret = this.readString(enc, i - this.offset); + this.offset = i + 1; + return ret; +}; + +BufferReader.prototype.left = function left() { + assert(this.offset <= this.data.length); + return this.data.length - this.offset; +}; + +BufferReader.prototype.readIntv = function readIntv() { + assert(this.offset + 1 <= this.data.length); + var result = utils.readIntv(this.data, this.offset); + assert(result.off <= this.data.length); + this.offset = result.off; + return result.r; +}; + +BufferReader.prototype.readUIntv = function readUIntv() { + var result = this.readIntv(); + assert(result >= 0); + return result; +}; + +/** + * Expose + */ + +module.exports = BufferReader; diff --git a/lib/bcoin/script.js b/lib/bcoin/script.js index 8f4cc690..9b1ac547 100644 --- a/lib/bcoin/script.js +++ b/lib/bcoin/script.js @@ -9,6 +9,7 @@ var bn = require('bn.js'); var constants = bcoin.protocol.constants; var utils = require('./utils'); var assert = utils.assert; +var BufferWriter = require('./writer'); function Witness(items) { if (!(this instanceof Witness)) @@ -2544,7 +2545,7 @@ Script.decode = function decode(buf) { }; Script.encode = function encode(code) { - var p = new bcoin.protocol.framer.BufferWriter(); + var p = new BufferWriter(); var opcodes = constants.opcodes; var i = 0; var op; diff --git a/lib/bcoin/tx.js b/lib/bcoin/tx.js index c38101bd..b419d813 100644 --- a/lib/bcoin/tx.js +++ b/lib/bcoin/tx.js @@ -11,6 +11,8 @@ var utils = require('./utils'); var assert = utils.assert; var constants = bcoin.protocol.constants; var Script = bcoin.script; +var BufferReader = require('./reader'); +var BufferWriter = require('./writer'); /** * TX @@ -1063,7 +1065,7 @@ TX.prototype.toExtended = function toExtended(saveCoins) { var height = this.height; var index = this.index; var changeIndex = this.changeIndex != null ? this.changeIndex : -1; - var p = new bcoin.protocol.framer.BufferWriter(); + var p = new BufferWriter(); if (height === -1) height = 0x7fffffff; @@ -1083,7 +1085,7 @@ TX.prototype.toExtended = function toExtended(saveCoins) { // p.writeU32(changeIndex); if (saveCoins) { - p.writeIntv(this.inputs.length); + p.writeUIntv(this.inputs.length); this.inputs.forEach(function(input) { if (!input.output) { p.writeVarBytes(new Buffer([])); @@ -1098,7 +1100,7 @@ TX.prototype.toExtended = function toExtended(saveCoins) { }; TX._fromExtended = function _fromExtended(buf, saveCoins) { - var p = new bcoin.protocol.parser.BufferReader(buf); + var p = new BufferReader(buf); var tx, coinCount, coin, i; p.start(); diff --git a/lib/bcoin/writer.js b/lib/bcoin/writer.js new file mode 100644 index 00000000..ee812e7c --- /dev/null +++ b/lib/bcoin/writer.js @@ -0,0 +1,178 @@ +/** + * writer.js - buffer writer for bcoin + * Copyright (c) 2014-2015, Fedor Indutny (MIT License) + * https://github.com/indutny/bcoin + */ + +var utils = require('./utils'); +var assert = utils.assert; + +/** + * BufferWriter + */ + +function BufferWriter(options) { + if (options instanceof BufferWriter) + return options; + + if (!(this instanceof BufferWriter)) + return new BufferWriter(options); + + this.data = []; + this.written = 0; +} + +BufferWriter.prototype.render = function render() { + var data = new Buffer(this.written); + var off = 0; + var i, item; + + for (i = 0; i < this.data.length; i++) { + item = this.data[i]; + switch (item[0]) { + case 'u8': off += utils.writeU8(data, item[1], off); break; + case 'u16': off += utils.writeU16(data, item[1], off); break; + case 'u16be': off += utils.writeU16BE(data, item[1], off); break; + case 'u32': off += utils.writeU32(data, item[1], off); break; + case 'u32be': off += utils.writeU32BE(data, item[1], off); break; + case 'u64': off += utils.writeU64(data, item[1], off); break; + case 'u64be': off += utils.writeU64BE(data, item[1], off); break; + case '8': off += utils.write8(data, item[1], off); break; + case '16': off += utils.write16(data, item[1], off); break; + case '16be': off += utils.write16BE(data, item[1], off); break; + case '32': off += utils.write32(data, item[1], off); break; + case '32be': off += utils.write32BE(data, item[1], off); break; + case '64': off += utils.write64(data, item[1], off); break; + case '64be': off += utils.write64BE(data, item[1], off); break; + case 'varint': off += utils.writeIntv(data, item[1], off); break; + case 'bytes': off += utils.copy(item[1], data, off); break; + } + } + + return data; +}; + +BufferWriter.prototype.writeU8 = function writeU8(value) { + this.written += 1; + this.data.push(['u8', value]); +}; + +BufferWriter.prototype.writeU16 = function writeU16(value) { + this.written += 2; + this.data.push(['u16', value]); +}; + +BufferWriter.prototype.writeU16BE = function writeU16BE(value) { + this.written += 2; + this.data.push(['u16be', value]); +}; + +BufferWriter.prototype.writeU32 = function writeU32(value) { + this.written += 4; + this.data.push(['u32', value]); +}; + +BufferWriter.prototype.writeU32BE = function writeU32BE(value) { + this.written += 4; + this.data.push(['u32be', value]); +}; + +BufferWriter.prototype.writeU64 = function writeU64(value) { + this.written += 8; + this.data.push(['u64', value]); +}; + +BufferWriter.prototype.writeU64BE = function writeU64BE(value) { + this.written += 8; + this.data.push(['u64be', value]); +}; + +BufferWriter.prototype.write8 = function write8(value) { + this.written += 1; + this.data.push(['8', value]); +}; + +BufferWriter.prototype.write16 = function write16(value) { + this.written += 2; + this.data.push(['16', value]); +}; + +BufferWriter.prototype.write16BE = function write16BE(value) { + this.written += 2; + this.data.push(['16be', value]); +}; + +BufferWriter.prototype.write32 = function write32(value) { + this.written += 4; + this.data.push(['32', value]); +}; + +BufferWriter.prototype.write32BE = function write32BE(value) { + this.written += 4; + this.data.push(['32be', value]); +}; + +BufferWriter.prototype.write64 = function write64(value) { + this.written += 8; + this.data.push(['64', value]); +}; + +BufferWriter.prototype.write64BE = function write64BE(value) { + this.written += 8; + this.data.push(['64be', value]); +}; + +BufferWriter.prototype.writeBytes = function writeBytes(value) { + this.written += value.length; + this.data.push(['bytes', value]); +}; + +BufferWriter.prototype.getSize = function getSize() { + return this.written; +}; + +BufferWriter.prototype.writeString = function writeString(value, enc) { + if (typeof value === 'string') + value = new Buffer(value, enc); + this.writeBytes(value); +}; + +BufferWriter.prototype.writeHash = function writeHash(value) { + if (typeof value === 'string') + value = new Buffer(value, 'hex'); + this.writeBytes(value); +}; + +BufferWriter.prototype.writeVarString = function writeVarString(value, enc) { + if (typeof value === 'string') + value = new Buffer(value, enc); + this.writeVarBytes(value); +}; + +BufferWriter.prototype.writeVarBytes = function writeVarBytes(value) { + this.written += utils.sizeIntv(value.length); + this.written += value.length; + this.data.push(['varint', value.length]); + this.data.push(['bytes', value]); +}; + +BufferWriter.prototype.writeNullString = function writeNullString(value, enc) { + this.writeString(value, enc); + this.writeU8(0); +}; + +BufferWriter.prototype.writeIntv = function writeIntv(value) { + this.written += utils.sizeIntv(value); + this.data.push(['varint', value]); +}; + +BufferWriter.prototype.writeUIntv = function writeUIntv(value) { + this.written += utils.sizeIntv(value); + this.data.push(['varint', value]); +}; + +/** + * Expose + */ + +module.exports = BufferWriter;