diff --git a/lib/bufferreader.js b/lib/bufferreader.js index afee08f..35a305c 100644 --- a/lib/bufferreader.js +++ b/lib/bufferreader.js @@ -70,7 +70,7 @@ BufferReader.prototype.readVarInt = function() { case 0xFE: return this.readUInt32LE(); case 0xFF: - return this.readUInt64LEBN().toNumber(); + throw new Error('number too large to retain precision - use readVarIntBN'); default: return first; } diff --git a/lib/bufferwriter.js b/lib/bufferwriter.js index babbfe9..7c410f5 100644 --- a/lib/bufferwriter.js +++ b/lib/bufferwriter.js @@ -56,7 +56,6 @@ BufferWriter.prototype.writeUInt64BEBN = function(bn) { return this; }; -//TODO: What if n is so large that it loses precision? BufferWriter.prototype.writeUInt64LEBN = function(bn) { var buf = bn.toBuffer({size: 8}); var reversebuf = new Buffer(Array.apply(new Array(), buf).reverse()); @@ -76,7 +75,6 @@ BufferWriter.prototype.writeVarIntBN = function(bn) { return this; }; -//TODO: What if n is so large that it loses precision? BufferWriter.varIntBuf = function(n) { var buf = undefined; if (n < 253) { diff --git a/test/test.bufferreader.js b/test/test.bufferreader.js index f305ecd..cf0a25e 100644 --- a/test/test.bufferreader.js +++ b/test/test.bufferreader.js @@ -1,3 +1,4 @@ +var BufferWriter = require('../lib/bufferwriter'); var BufferReader = require('../lib/bufferreader'); var should = require('chai').should(); @@ -156,10 +157,12 @@ describe('BufferReader', function() { br.readVarInt().should.equal(50000); }); - it('should read a 9 byte varint', function() { + it('should throw an error on a 9 byte varint', function() { var buf = Buffer.concat([new Buffer([255]), new Buffer('ffffffffffffffff', 'hex')]); var br = new BufferReader(buf); - br.readVarInt().should.equal(Math.pow(2, 64)); + (function() { + br.readVarInt(); + }).should.throw('number too large to retain precision - use readVarIntBN'); }); }); diff --git a/test/test.bufferwriter.js b/test/test.bufferwriter.js index 70d0305..02a7377 100644 --- a/test/test.bufferwriter.js +++ b/test/test.bufferwriter.js @@ -1,4 +1,5 @@ var BufferWriter = require('../lib/bufferwriter'); +var BufferReader = require('../lib/bufferreader'); var BN = require('../lib/bn'); var should = require('chai').should(); @@ -120,6 +121,15 @@ describe('BufferWriter', function() { bw.concat().length.should.equal(9); }); + it('should read back the same value it wrote for a 9 byte varInt', function() { + var bw = new BufferWriter(); + var n = Math.pow(2, 53); + n.should.equal(n + 1); //javascript number precision limit + bw.writeVarInt(n); + var br = new BufferReader(bw.concat()); + br.readVarIntBN().toNumber().should.equal(n); + }); + }); describe('#writeVarIntBN', function() {