From f6a8878aa2b0aba9bdc8b7b24c8e501cf723e058 Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Mon, 15 Sep 2014 15:05:54 -0700 Subject: [PATCH] Varint class ...will be useful in transactions. Note that we already have a primitive understanding of Varints in the BufferReader and BufferWriter classes. However, the new Varint class is a varint object which actually depends on BufferReader and BufferWriter for reading and writing varints. This class is for keeping track of the raw buffer that is read in from a buffer. --- lib/varint.js | 47 ++++++++++++++++++++++++++++++ test/varint.js | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 lib/varint.js create mode 100644 test/varint.js diff --git a/lib/varint.js b/lib/varint.js new file mode 100644 index 0000000..5d8fc11 --- /dev/null +++ b/lib/varint.js @@ -0,0 +1,47 @@ +var BufferWriter = require('./bufferwriter'); +var BufferReader = require('./bufferreader'); +var BN = require('./bn'); + +var Varint = function Varint(buf) { + if (!(this instanceof Varint)) + return new Varint(buf); + if (Buffer.isBuffer(buf)) { + this.buf = buf; + } else if (typeof buf === 'number') { + var num = buf; + this.fromNumber(num); + } else if (buf) { + var obj = buf; + this.set(obj); + } +}; + +Varint.prototype.set = function(obj) { + this.buf = obj.buf || this.buf; + return this; +}; + +Varint.prototype.fromBuffer = function(buf) { + this.buf = buf; + return this; +}; + +Varint.prototype.fromBufferReader = function(br) { + this.buf = br.readVarintBuf(); + return this; +}; + +Varint.prototype.fromNumber = function(num) { + this.buf = BufferWriter().writeVarintNum(num).concat(); + return this; +}; + +Varint.prototype.toBuffer = function() { + return this.buf; +}; + +Varint.prototype.toNumber = function() { + return BufferReader(this.buf).readVarintNum(); +}; + +module.exports = Varint; diff --git a/test/varint.js b/test/varint.js new file mode 100644 index 0000000..86ad0c9 --- /dev/null +++ b/test/varint.js @@ -0,0 +1,79 @@ +var should = require('chai').should(); +var BufferReader = require('../lib/bufferreader'); +var BufferWriter = require('../lib/bufferwriter'); +var Varint = require('../lib/varint'); + +describe('Varint', function() { + + it('should make a new varint', function() { + var buf = new Buffer('00', 'hex'); + var varint = new Varint(buf); + should.exist(varint); + varint.buf.toString('hex').should.equal('00'); + varint = Varint(buf); + should.exist(varint); + varint.buf.toString('hex').should.equal('00'); + }); + + describe('#set', function() { + + it('should set a buffer', function() { + var buf = new Buffer('00', 'hex'); + var varint = Varint().set({buf: buf}); + varint.buf.toString('hex').should.equal('00'); + varint.set({}); + varint.buf.toString('hex').should.equal('00'); + }); + + }); + + describe('#fromBuffer', function() { + + it('should set a buffer', function() { + var buf = BufferWriter().writeVarintNum(5).concat(); + var varint = Varint().fromBuffer(buf); + varint.toNumber().should.equal(5); + }); + + }); + + describe('#fromBufferReader', function() { + + it('should set a buffer reader', function() { + var buf = BufferWriter().writeVarintNum(5).concat(); + var br = BufferReader(buf); + var varint = Varint().fromBufferReader(br); + varint.toNumber().should.equal(5); + }); + + }); + + describe('#fromNumber', function() { + + it('should set a number', function() { + var varint = Varint().fromNumber(5); + varint.toNumber().should.equal(5); + }); + + }); + + describe('#toBuffer', function() { + + it('should return a buffer', function() { + buf = BufferWriter().writeVarintNum(5).concat(); + var varint = Varint(buf); + varint.toBuffer().toString('hex').should.equal(buf.toString('hex')); + }); + + }); + + describe('#toNumber', function() { + + it('should return a buffer', function() { + var varint = Varint(5); + varint.toNumber().should.equal(5); + }); + + }); + +});