Skip to content

Commit 9e5df78

Browse files
committed
Use bignumber.js to process numbers over js precision range
This returns them as strings instead of numbers
1 parent abafca7 commit 9e5df78

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

lib/protocol/Parser.js

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -164,20 +164,23 @@ Parser.prototype.parseLengthCodedNumber = function() {
164164
throw new Error('parseLengthCodedNumber: Unexpected first byte: ' + byte);
165165
}
166166

167-
var value = 0;
167+
var value = 0, bigint = false, BigNumber = null;
168168
for (var bytesRead = 0; bytesRead < length; bytesRead++) {
169169
var byte = this._buffer[this._offset++];
170-
value += Math.pow(256, bytesRead) * byte;
171-
}
172170

173-
if (value >= IEEE_754_BINARY_64_PRECISION) {
174-
throw new Error(
175-
'parseLengthCodedNumber: JS precision range exceeded, ' +
176-
'number is >= 53 bit: "' + value + '"'
177-
);
171+
// overflow
172+
if (BigNumber) {
173+
value = value.plus((new BigNumber(256)).pow(bytesRead).times(byte));
174+
} else if (bytesRead == 7 && byte == 1) {
175+
BigNumber = require("bignumber.js");
176+
value = new BigNumber(value);
177+
value = value.plus((new BigNumber(256)).pow(bytesRead).times(byte));
178+
} else {
179+
value += Math.pow(256, bytesRead) * byte;
180+
}
178181
}
179182

180-
return value;
183+
return (BigNumber ? value.toString() : value);
181184
};
182185

183186
Parser.prototype.parseFiller = function(length) {

0 commit comments

Comments
 (0)