diff --git a/README.md b/README.md index 8565d46..984d36d 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Here is a Cassandra example: ## Int64 -Since JavaScript represents all numbers as doubles, int64 values cannot be accurately represented naturally. To solve this, int64 values in responses will be wrapped with Thirft.Int64 objects. This Int64 implementation is based on [broofa/node-int64](https://github.com/broofa/node-int64) +Since JavaScript represents all numbers as doubles, int64 values cannot be accurately represented naturally. To solve this, int64 values in responses will be wrapped with Thirft.Int64 objects. The Int64 implementation used is [broofa/node-int64](https://github.com/broofa/node-int64). ## Custom client and server example diff --git a/lib/thrift/Int64.js b/lib/thrift/Int64.js deleted file mode 100644 index 496f72a..0000000 --- a/lib/thrift/Int64.js +++ /dev/null @@ -1,177 +0,0 @@ -/** -* node-int64 -* From https://github.com/broofa/node-int64 -* -* Support for handling 64-bit int numbers in Javascript (node.js) -* -* JS Numbers are IEEE-754 double-precision floats, which limits the range of -* integer values that can be accurately represented to +/- 2^^53. -* -* Int64 objects wrap a node Buffer that holds the 8-bytes of int64 data. These -* objects operate directly on the buffer, which means that if they are created -* using an existing buffer, setting the value will modify the Buffer and -* vice-versa. -*/ - -// Useful masks and values for doing bit twiddling -var MASK31 = 0x7fffffff, VAL31 = 0x80000000; -var MASK32 = 0xffffffff, VAL32 = 0x100000000; - -// Map for converting hex octets to strings -var _HEX = []; -for (var i = 0; i < 256; i++) _HEX[i] = (i > 0xF ? '' : '0') + i.toString(16); - -// -// Int64 -// - -/** -* Constructor accepts the following arguments: -* -* new Int64(buffer[, offset=0]) - Existing Buffer with byte offset -* new Int64(string) - Hex string (throws if n is outside int64 range) -* new Int64(number) - Number (throws if n is outside int64 range) -* new Int64(hi, lo) - Raw bits as two 32-bit values -*/ -var Int64 = module.exports = function Int64(a1, a2) { - if (!(this instanceof Int64)) { - if (arguments.length == 1) { - return new Int64(a1) - } - return new Int64(a1, a2) - } - - if (a1 instanceof Buffer) { - this.buffer = a1; - this.offset = a2 || 0; - } else { - this.buffer = this.buffer || new Buffer(8); - this.offset = 0; - this.setValue.apply(this, arguments); - } -}; - - -// Max integer value that JS can accurately represent -Int64.MAX_INT = Math.pow(2, 53); - -// Min integer value that JS can accurately represent -Int64.MIN_INT = -Math.pow(2, 53); - -Int64.prototype = { - /** - * Do in-place 2's compliment. See - * http://en.wikipedia.org/wiki/Two's_complement - */ - _2scomp: function() { - var b = this.buffer, o = this.offset, carry = 1; - for (var i = o + 7; i >= o; i--) { - var v = (b[i] ^ 0xff) + carry; - b[i] = v & 0xff; - carry = v >> 8; - } - }, - - /** - * Set the value: - * setValue(string) - A hexidecimal string - * setValue(number) - Number (throws if n is outside int64 range) - * setValue(hi, lo) - Raw bits as two 32-bit values - */ - setValue: function(hi, lo) { - var negate = false; - if (arguments.length == 1) { - if (typeof(hi) == 'number') { - // Simplify bitfield retrieval by using abs() value. We restore sign - // later - negate = hi < 0; - hi = Math.abs(hi); - lo = hi % VAL32; - hi = hi / VAL32; - if (hi > VAL32) throw RangeError(hi + ' is outside Int64 range'); - hi = hi | 0; - } else if (typeof(hi) == 'string') { - hi = (hi + '').replace(/^0x/, ''); - lo = hi.substr(-8); - hi = hi.length > 8 ? hi.substr(0, hi.length - 8) : ''; - hi = parseInt(hi, 16); - lo = parseInt(lo, 16); - } else { - throw Error(hi + ' must be a Number or String'); - } - } - - // TODO: Do we want to throw if hi/lo is outside int32 range here? - - // Copy bytes to buffer - b = this.buffer; - var o = this.offset; - for (var i = 7; i >= 0; i--) { - b[o+i] = lo & 0xff; - lo = i == 4 ? hi : lo >>> 8; - } - - // Restore sign of passed argument - if (negate) this._2scomp(); - }, - - /** - * Return the approximate error involved in converting the current value to a - * native JS number. If > 0, the value is outside the range JS can represent - * to integer precision. - */ - error: function() { - return Math.ceil(Math.abs(this.valueOf()) / Int64.MAX_INT) - 1; - }, - - /** - * Convert to a JS Number. - * - * Be aware that if the returned value is outside the range ... - * - * Int64.MIN_INT <= x <= Int64.MAX_INT - * - * ... it is unlikely to exactly represent the underlying 64-bit value. - */ - valueOf: function() { - var b = this.buffer, o = this.offset; - var negate = b[0] & 0x80, x = 0, xx = 1; - if (negate) this._2scomp(); - for (var i = o + 7; i >= o; i--) { - var v = b[i] & (i == 0 ? 0x7f : 0xff); - x += v*xx; - xx *= 0x100; - } - if (negate) { - x = -x; - this._2scomp(); - } - return x; - }, - - /** - * Get value as a string of hex octets - * - * @param sep (String) string to join() with. Default='' - */ - toString: function(sep) { - var b = this.buffer, o = this.offset, s = ['0x']; - for (var i = 0; i < 8; i++) { - s.push(_HEX[this.buffer[o+i]]); - } - return s.join(''); - }, - - /** - * Used by console.log and util.inspect. - */ - inspect: function() { - var value = this.valueOf() - if (value < Int64.MAX_INT && value > Int64.MIN_INT) { - return ""; - } else { - return ""; - } - } -}; - diff --git a/lib/thrift/index.js b/lib/thrift/index.js index f09f91b..9380ba6 100644 --- a/lib/thrift/index.js +++ b/lib/thrift/index.js @@ -7,4 +7,4 @@ exports.createConnection = connection.createConnection; exports.createServer = require('./server').createServer; -exports.Int64 = require('./Int64') +exports.Int64 = require('node-int64') diff --git a/lib/thrift/protocol.js b/lib/thrift/protocol.js index 7dfb015..4640774 100644 --- a/lib/thrift/protocol.js +++ b/lib/thrift/protocol.js @@ -3,7 +3,7 @@ var sys = require('sys'), Type = Thrift.Type; var binary = require('./binary'), - Int64 = require('./Int64'); + Int64 = Thrift.Int64; var UNKNOWN = 0, INVALID_DATA = 1, diff --git a/package.json b/package.json index 6a7b674..0612e9a 100644 --- a/package.json +++ b/package.json @@ -5,5 +5,8 @@ "author": "Wade Simmons ", "directories" : { "lib" : "./lib/thrift" }, "main": "./lib/thrift", - "engines": { "node": ">= 0.2.4" } + "engines": { "node": ">= 0.2.4" }, + "dependencies": { + "node-int64": "0.2.x" + } }