Skip to content
14 changes: 8 additions & 6 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -146,12 +146,14 @@ exports.decodePacket = function (data, binaryType, utf8decode) {

// Binary data
if (binaryType === 'arraybuffer') {
var type = data[0];
var intArray = new Uint8Array(data.length - 1);
for (var i = 1; i < data.length; i++) {
intArray[i - 1] = data[i];
}
return { type: packetslist[type], data: intArray.buffer };
//convert Buffer/ArrayBuffer data to Uint8Array
var intArray = new Uint8Array(data);
var type = intArray[0];
return { type: packetslist[type], data: intArray.buffer.slice(1) };
}

if (data instanceof ArrayBuffer) {
data = arrayBufferToBuffer(data);
}
var type = data[0];
return { type: packetslist[type], data: data.slice(1) };
Expand Down
41 changes: 41 additions & 0 deletions test/node/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,47 @@ describe('parser', function() {
});
});

it('should decode an ArrayBuffer/Buffer with undeclared type as binary', function() {
var buffer1 = new ArrayBuffer(4);
var dataview = new DataView(buffer1);
var buffer2 = new Buffer(4);
for (var i = 0; i < buffer1.byteLength ; i++) {
dataview.setInt8(i, 4-i);
buffer2[i] = 4-i;
}

var decoded1 = decode(buffer1, null);
var decoded2 = decode(buffer2, null);
expect(decoded1).to.eql({ type: 'message', data: new Buffer([3,2,1])});
expect(new Uint8Array(decoded1.data)).to.eql(new Uint8Array(buffer1.slice(1)));
expect(decoded2).to.eql({ type: 'message', data: new Buffer(buffer2.slice(1))});
expect(new Uint8Array(decoded2.data)).to.eql(new Uint8Array(buffer2.slice(1)));
});

it('should decode an ArrayBuffer/Buffer as binary of type ArrayBuffer', function() {
var buffer1 = new ArrayBuffer(4);
var dataview = new DataView(buffer1);
var buffer2 = new Buffer(4);
for (var i = 0; i < buffer1.byteLength ; i++) {
dataview.setInt8(i, 4-i);
buffer2[i] = 4-i;
}

var decoded1 = decode(buffer1, 'arraybuffer');
var decoded2 = decode(buffer2, 'arraybuffer');
expect(decoded1).to.eql({ type: 'message', data: buffer1.slice(1)});
expect(new Uint8Array(decoded1.data)).to.eql(new Uint8Array(buffer1.slice(1)));

var testBuffer = new ArrayBuffer(decoded2.data.byteLength);
var decoded2view = new DataView(decoded2.data);
var testBufferview = new DataView(testBuffer);
for (var i = 0; i < decoded2view.byteLength ; i++) {
testBufferview.setInt8(i, decoded2view.getInt8(i));
}
expect(decoded2).to.eql({ type: 'message', data: testBuffer});
expect(new Uint8Array(decoded2.data)).to.eql(new Uint8Array(buffer2.slice(1)));
});

it('should encode/decode a typed array as binary', function(done) {
var buffer = new ArrayBuffer(32);
var typedArray = new Int32Array(buffer, 4, 2);
Expand Down