Skip to content

Commit

Permalink
[perf] Micro optimisations (#84)
Browse files Browse the repository at this point in the history
  • Loading branch information
billouboq authored and darrachequesne committed Dec 23, 2016
1 parent d1c2680 commit 89a465a
Showing 1 changed file with 54 additions and 46 deletions.
100 changes: 54 additions & 46 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,11 @@ exports.encodePacket = function (packet, supportsBinary, utf8encode, callback) {
*/

function encodeBuffer(packet, supportsBinary, callback) {
var data = packet.data;
if (!supportsBinary) {
return exports.encodeBase64Packet(packet, callback);
}

var data = packet.data;
var typeBuffer = new Buffer(1);
typeBuffer[0] = packets[packet.type];
return callback(Buffer.concat([typeBuffer, data]));
Expand Down Expand Up @@ -121,14 +121,18 @@ exports.decodePacket = function (data, binaryType, utf8decode) {
if (data === undefined) {
return err;
}

var type;

// String data
if (typeof data === 'string') {
if (data.charAt(0) === 'b') {

type = data.charAt(0);

if (type === 'b') {
return exports.decodeBase64Packet(data.substr(1), binaryType);
}

var type = data.charAt(0);

if (utf8decode) {
data = tryDecode(data);
if (data === false) {
Expand All @@ -151,14 +155,14 @@ exports.decodePacket = function (data, binaryType, utf8decode) {
if (binaryType === 'arraybuffer') {
// wrap Buffer/ArrayBuffer data into an Uint8Array
var intArray = new Uint8Array(data);
var type = intArray[0];
type = intArray[0];
return { type: packetslist[type], data: intArray.buffer.slice(1) };
}

if (data instanceof ArrayBuffer) {
data = arrayBufferToBuffer(data);
}
var type = data[0];
type = data[0];
return { type: packetslist[type], data: data.slice(1) };
};

Expand Down Expand Up @@ -221,10 +225,6 @@ exports.encodePayload = function (packets, supportsBinary, callback) {
return callback('0:');
}

function setLengthHeader(message) {
return message.length + ':' + message;
}

function encodeOne(packet, doneCallback) {
exports.encodePacket(packet, supportsBinary, false, function(message) {
doneCallback(null, setLengthHeader(message));
Expand All @@ -236,6 +236,10 @@ exports.encodePayload = function (packets, supportsBinary, callback) {
});
};

function setLengthHeader(message) {
return message.length + ':' + message;
}

/**
* Async array map using after
*/
Expand All @@ -244,15 +248,11 @@ function map(ary, each, done) {
var result = new Array(ary.length);
var next = after(ary.length, done);

var eachWithIndex = function(i, el, cb) {
each(el, function(error, msg) {
for (var i = 0; i < ary.length; i++) {
each(ary[i], function(error, msg) {
result[i] = msg;
cb(error, result);
next(error, result);
});
};

for (var i = 0; i < ary.length; i++) {
eachWithIndex(i, ary[i], next);
}
}

Expand All @@ -274,13 +274,12 @@ exports.decodePayload = function (data, binaryType, callback) {
binaryType = null;
}

var packet;
if (data === '') {
// parser error - ignoring payload
return callback(err, 0, 1);
}

var length = '', n, msg;
var length = '', n, msg, packet;

for (var i = 0, l = data.length; i < l; i++) {
var chr = data.charAt(i);
Expand Down Expand Up @@ -310,8 +309,8 @@ exports.decodePayload = function (data, binaryType, callback) {
return callback(err, 0, 1);
}

var ret = callback(packet, i + n, l);
if (false === ret) return;
var more = callback(packet, i + n, l);
if (false === more) return;
}

// advance cursor
Expand Down Expand Up @@ -395,35 +394,42 @@ exports.encodePayloadAsBinary = function (packets, callback) {
return callback(new Buffer(0));
}

function encodeOne(p, doneCallback) {
exports.encodePacket(p, true, true, function(packet) {

if (typeof packet === 'string') {
var encodingLength = '' + packet.length;
var sizeBuffer = new Buffer(encodingLength.length + 2);
sizeBuffer[0] = 0; // is a string (not true binary = 0)
for (var i = 0; i < encodingLength.length; i++) {
sizeBuffer[i + 1] = parseInt(encodingLength[i], 10);
}
sizeBuffer[sizeBuffer.length - 1] = 255;
return doneCallback(null, Buffer.concat([sizeBuffer, stringToBuffer(packet)]));
}
map(packets, encodeOneBinaryPacket, function(err, results) {
return callback(Buffer.concat(results));
});
};

var encodingLength = '' + packet.length;
var sizeBuffer = new Buffer(encodingLength.length + 2);
sizeBuffer[0] = 1; // is binary (true binary = 1)
function encodeOneBinaryPacket(p, doneCallback) {

function onBinaryPacketEncode(packet) {

var encodingLength = '' + packet.length;
var sizeBuffer;

if (typeof packet === 'string') {
sizeBuffer = new Buffer(encodingLength.length + 2);
sizeBuffer[0] = 0; // is a string (not true binary = 0)
for (var i = 0; i < encodingLength.length; i++) {
sizeBuffer[i + 1] = parseInt(encodingLength[i], 10);
}
sizeBuffer[sizeBuffer.length - 1] = 255;
doneCallback(null, Buffer.concat([sizeBuffer, packet]));
});
return doneCallback(null, Buffer.concat([sizeBuffer, stringToBuffer(packet)]));
}

sizeBuffer = new Buffer(encodingLength.length + 2);
sizeBuffer[0] = 1; // is binary (true binary = 1)
for (var i = 0; i < encodingLength.length; i++) {
sizeBuffer[i + 1] = parseInt(encodingLength[i], 10);
}
sizeBuffer[sizeBuffer.length - 1] = 255;

doneCallback(null, Buffer.concat([sizeBuffer, packet]));
}

map(packets, encodeOne, function(err, results) {
return callback(Buffer.concat(results));
});
};
exports.encodePacket(p, true, true, onBinaryPacketEncode);

}


/*
* Decodes data when a payload is maybe expected. Strings are decoded by
Expand All @@ -442,11 +448,12 @@ exports.decodePayloadAsBinary = function (data, binaryType, callback) {

var bufferTail = data;
var buffers = [];
var i;

while (bufferTail.length > 0) {
var strLen = '';
var isString = bufferTail[0] === 0;
for (var i = 1; ; i++) {
for (i = 1; ; i++) {
if (bufferTail[i] === 255) break;
// 310 = char length of Number.MAX_VALUE
if (strLen.length > 310) {
Expand All @@ -465,7 +472,8 @@ exports.decodePayloadAsBinary = function (data, binaryType, callback) {
}

var total = buffers.length;
buffers.forEach(function(buffer, i) {
for (i = 0; i < total; i++) {
var buffer = buffers[i];
callback(exports.decodePacket(buffer, binaryType, true), i, total);
});
}
};

0 comments on commit 89a465a

Please sign in to comment.