diff --git a/lib/encoder.js b/lib/encoder.js index 6c7da0c..7223e95 100644 --- a/lib/encoder.js +++ b/lib/encoder.js @@ -45,7 +45,10 @@ module.exports = function buildEncode (encodingTypes, forceFloat64, compatibilit buf.writeUInt32BE(len, 1) buf.write(obj, 5) } - } else if (obj && obj.readUInt32LE) { + } else if (obj && (obj.readUInt32LE || obj instanceof Uint8Array)) { + if (obj instanceof Uint8Array) { + obj = Buffer.from(obj) + } // weird hack to support Buffer // and Buffer-like objects if (obj.length <= 0xff) { diff --git a/test/1-byte-length-uint8arrays.js b/test/1-byte-length-uint8arrays.js new file mode 100644 index 0000000..e5ea763 --- /dev/null +++ b/test/1-byte-length-uint8arrays.js @@ -0,0 +1,43 @@ +'use strict' + +var Buffer = require('safe-buffer').Buffer +var test = require('tape').test +var msgpack = require('../') + +function build (size) { + var array = [] + var i + + for (i = 0; i < size; i++) { + array.push(42) + } + + return new Uint8Array(array) +} + +test('encode/decode 2^8-1 Uint8Arrays', function (t) { + var encoder = msgpack() + var all = [] + + all.push(build(Math.pow(2, 8) - 1)) + all.push(build(Math.pow(2, 6) + 1)) + all.push(build(1)) + all.push(new Uint8Array(0)) + + all.forEach(function (array) { + t.test('encoding Uint8Array of length ' + array.byteLength + ' bytes', function (t) { + var buf = encoder.encode(array) + t.equal(buf.length, 2 + array.byteLength, 'must have the right length') + t.equal(buf.readUInt8(0), 0xc4, 'must have the proper header') + t.equal(buf.readUInt8(1), array.byteLength, 'must include the buf length') + t.end() + }) + + t.test('mirror test for an Uint8Array of length ' + array.byteLength + ' bytes', function (t) { + t.deepEqual(encoder.decode(encoder.encode(array)), new Buffer(array), 'must stay the same') + t.end() + }) + }) + + t.end() +}) diff --git a/test/2-bytes-length-uint8arrays.js b/test/2-bytes-length-uint8arrays.js new file mode 100644 index 0000000..1a196d5 --- /dev/null +++ b/test/2-bytes-length-uint8arrays.js @@ -0,0 +1,43 @@ +'use strict' + +var Buffer = require('safe-buffer').Buffer +var test = require('tape').test +var msgpack = require('../') + +function build (size) { + var array = [] + var i + + for (i = 0; i < size; i++) { + array.push(42) + } + + return new Uint8Array(array) +} + +test('encode/decode 2^8-1 Uint8Arrays', function (t) { + var encoder = msgpack() + var all = [] + + all.push(build(Math.pow(2, 8))) + all.push(build(Math.pow(2, 8) + 1)) + all.push(build(Math.pow(2, 12) + 1)) + all.push(build(Math.pow(2, 16) - 1)) + + all.forEach(function (array) { + t.test('encoding Uint8Array of length ' + array.byteLength + ' bytes', function (t) { + var buf = encoder.encode(array) + t.equal(buf.length, 3 + array.byteLength, 'must have the right length') + t.equal(buf.readUInt8(0), 0xc5, 'must have the proper header') + t.equal(buf.readUInt16BE(1), array.byteLength, 'must include the buf length') + t.end() + }) + + t.test('mirror test for an Uint8Array of length ' + array.byteLength + ' bytes', function (t) { + t.deepEqual(encoder.decode(encoder.encode(array)), new Buffer(array), 'must stay the same') + t.end() + }) + }) + + t.end() +}) diff --git a/test/4-bytes-length-uint8arrays.js b/test/4-bytes-length-uint8arrays.js new file mode 100644 index 0000000..b91c650 --- /dev/null +++ b/test/4-bytes-length-uint8arrays.js @@ -0,0 +1,42 @@ +'use strict' + +var Buffer = require('safe-buffer').Buffer +var test = require('tape').test +var msgpack = require('../') + +function build (size) { + var array = [] + var i + + for (i = 0; i < size; i++) { + array.push(42) + } + + return new Uint8Array(array) +} + +test('encode/decode 2^8-1 Uint8Arrays', function (t) { + var encoder = msgpack() + var all = [] + + all.push(build(Math.pow(2, 16))) + all.push(build(Math.pow(2, 16) + 1)) + all.push(build(Math.pow(2, 18) + 1)) + + all.forEach(function (array) { + t.test('encoding Uint8Array of length ' + array.byteLength + ' bytes', function (t) { + var buf = encoder.encode(array) + t.equal(buf.length, 5 + array.byteLength, 'must have the right length') + t.equal(buf.readUInt8(0), 0xc6, 'must have the proper header') + t.equal(buf.readUInt32BE(1), array.byteLength, 'must include the buf length') + t.end() + }) + + t.test('mirror test for an Uint8Array of length ' + array.byteLength + ' bytes', function (t) { + t.deepEqual(encoder.decode(encoder.encode(array)), new Buffer(array), 'must stay the same') + t.end() + }) + }) + + t.end() +})