engine.io-parser
Advanced tools
Comparing version 1.3.2 to 2.0.0
2.0.0 / 2016-12-23 | ||
================== | ||
* [perf] Micro optimisations (#84) | ||
* [fix] Sanitize strings by removing lone surrogates (#82) | ||
* [perf] Use strict equality where possible (#77) | ||
* [style] Minor style changes (#83) | ||
* [fix] Fix double utf8 encoding for payloads (#81) | ||
* [chore] Update zuul config to speed up tests (#76) | ||
1.3.2 / 2016-12-07 | ||
@@ -3,0 +13,0 @@ ================== |
@@ -9,3 +9,3 @@ /** | ||
var after = require('after'); | ||
var utf8 = require('wtf-8'); | ||
var utf8 = require('./utf8'); | ||
@@ -91,3 +91,3 @@ var base64encoder; | ||
exports.encodePacket = function (packet, supportsBinary, utf8encode, callback) { | ||
if ('function' == typeof supportsBinary) { | ||
if (typeof supportsBinary === 'function') { | ||
callback = supportsBinary; | ||
@@ -97,3 +97,3 @@ supportsBinary = false; | ||
if ('function' == typeof utf8encode) { | ||
if (typeof utf8encode === 'function') { | ||
callback = utf8encode; | ||
@@ -123,3 +123,3 @@ utf8encode = null; | ||
if (undefined !== packet.data) { | ||
encoded += utf8encode ? utf8.encode(String(packet.data)) : String(packet.data); | ||
encoded += utf8encode ? utf8.encode(String(packet.data), { strict: false }) : String(packet.data); | ||
} | ||
@@ -233,4 +233,4 @@ | ||
// String data | ||
if (typeof data == 'string') { | ||
if (data.charAt(0) == 'b') { | ||
if (typeof data === 'string') { | ||
if (data.charAt(0) === 'b') { | ||
return exports.decodeBase64Packet(data.substr(1), binaryType); | ||
@@ -269,3 +269,3 @@ } | ||
try { | ||
data = utf8.decode(data); | ||
data = utf8.decode(data, { strict: false }); | ||
} catch (e) { | ||
@@ -316,3 +316,3 @@ return false; | ||
exports.encodePayload = function (packets, supportsBinary, callback) { | ||
if (typeof supportsBinary == 'function') { | ||
if (typeof supportsBinary === 'function') { | ||
callback = supportsBinary; | ||
@@ -341,3 +341,3 @@ supportsBinary = null; | ||
function encodeOne(packet, doneCallback) { | ||
exports.encodePacket(packet, !isBinary ? false : supportsBinary, true, function(message) { | ||
exports.encodePacket(packet, !isBinary ? false : supportsBinary, false, function(message) { | ||
doneCallback(null, setLengthHeader(message)); | ||
@@ -381,3 +381,3 @@ }); | ||
exports.decodePayload = function (data, binaryType, callback) { | ||
if (typeof data != 'string') { | ||
if (typeof data !== 'string') { | ||
return exports.decodePayloadAsBinary(data, binaryType, callback); | ||
@@ -392,3 +392,3 @@ } | ||
var packet; | ||
if (data == '') { | ||
if (data === '') { | ||
// parser error - ignoring payload | ||
@@ -398,4 +398,3 @@ return callback(err, 0, 1); | ||
var length = '' | ||
, n, msg; | ||
var length = '', n, msg; | ||
@@ -405,36 +404,37 @@ for (var i = 0, l = data.length; i < l; i++) { | ||
if (':' != chr) { | ||
if (chr !== ':') { | ||
length += chr; | ||
} else { | ||
if ('' == length || (length != (n = Number(length)))) { | ||
// parser error - ignoring payload | ||
return callback(err, 0, 1); | ||
} | ||
continue; | ||
} | ||
msg = data.substr(i + 1, n); | ||
if (length === '' || (length != (n = Number(length)))) { | ||
// parser error - ignoring payload | ||
return callback(err, 0, 1); | ||
} | ||
if (length != msg.length) { | ||
// parser error - ignoring payload | ||
return callback(err, 0, 1); | ||
} | ||
msg = data.substr(i + 1, n); | ||
if (msg.length) { | ||
packet = exports.decodePacket(msg, binaryType, true); | ||
if (length != msg.length) { | ||
// parser error - ignoring payload | ||
return callback(err, 0, 1); | ||
} | ||
if (err.type == packet.type && err.data == packet.data) { | ||
// parser error in individual packet - ignoring payload | ||
return callback(err, 0, 1); | ||
} | ||
if (msg.length) { | ||
packet = exports.decodePacket(msg, binaryType, false); | ||
var ret = callback(packet, i + n, l); | ||
if (false === ret) return; | ||
if (err.type === packet.type && err.data === packet.data) { | ||
// parser error in individual packet - ignoring payload | ||
return callback(err, 0, 1); | ||
} | ||
// advance cursor | ||
i += n; | ||
length = ''; | ||
var ret = callback(packet, i + n, l); | ||
if (false === ret) return; | ||
} | ||
// advance cursor | ||
i += n; | ||
length = ''; | ||
} | ||
if (length != '') { | ||
if (length !== '') { | ||
// parser error - ignoring payload | ||
@@ -577,3 +577,2 @@ return callback(err, 0, 1); | ||
var numberTooLong = false; | ||
while (bufferTail.byteLength > 0) { | ||
@@ -585,7 +584,7 @@ var tailArray = new Uint8Array(bufferTail); | ||
for (var i = 1; ; i++) { | ||
if (tailArray[i] == 255) break; | ||
if (tailArray[i] === 255) break; | ||
// 310 = char length of Number.MAX_VALUE | ||
if (msgLength.length > 310) { | ||
numberTooLong = true; | ||
break; | ||
return callback(err, 0, 1); | ||
} | ||
@@ -596,4 +595,2 @@ | ||
if(numberTooLong) return callback(err, 0, 1); | ||
bufferTail = sliceBuffer(bufferTail, 2 + msgLength.length); | ||
@@ -600,0 +597,0 @@ msgLength = parseInt(msgLength); |
173
lib/index.js
@@ -5,3 +5,3 @@ /** | ||
var utf8 = require('wtf-8'); | ||
var utf8 = require('./utf8'); | ||
var after = require('after'); | ||
@@ -54,3 +54,3 @@ var keys = require('./keys'); | ||
exports.encodePacket = function (packet, supportsBinary, utf8encode, callback) { | ||
if ('function' == typeof supportsBinary) { | ||
if (typeof supportsBinary === 'function') { | ||
callback = supportsBinary; | ||
@@ -60,3 +60,3 @@ supportsBinary = null; | ||
if ('function' == typeof utf8encode ) { | ||
if (typeof utf8encode === 'function') { | ||
callback = utf8encode; | ||
@@ -78,3 +78,3 @@ utf8encode = null; | ||
if (undefined !== packet.data) { | ||
encoded += utf8encode ? utf8.encode(String(packet.data)) : String(packet.data); | ||
encoded += utf8encode ? utf8.encode(String(packet.data), { strict: false }) : String(packet.data); | ||
} | ||
@@ -90,3 +90,2 @@ | ||
function encodeBuffer(packet, supportsBinary, callback) { | ||
var data = packet.data; | ||
if (!supportsBinary) { | ||
@@ -96,2 +95,3 @@ return exports.encodeBase64Packet(packet, callback); | ||
var data = packet.data; | ||
var typeBuffer = new Buffer(1); | ||
@@ -130,10 +130,14 @@ typeBuffer[0] = packets[packet.type]; | ||
} | ||
var type; | ||
// String data | ||
if (typeof data == 'string') { | ||
if (data.charAt(0) == 'b') { | ||
if (typeof data === 'string') { | ||
type = data.charAt(0); | ||
if (type === 'b') { | ||
return exports.decodeBase64Packet(data.substr(1), binaryType); | ||
} | ||
var type = data.charAt(0); | ||
if (utf8decode) { | ||
@@ -161,3 +165,3 @@ data = tryDecode(data); | ||
var intArray = new Uint8Array(data); | ||
var type = intArray[0]; | ||
type = intArray[0]; | ||
return { type: packetslist[type], data: intArray.buffer.slice(1) }; | ||
@@ -169,3 +173,3 @@ } | ||
} | ||
var type = data[0]; | ||
type = data[0]; | ||
return { type: packetslist[type], data: data.slice(1) }; | ||
@@ -176,3 +180,3 @@ }; | ||
try { | ||
data = utf8.decode(data); | ||
data = utf8.decode(data, { strict: false }); | ||
} catch (e) { | ||
@@ -221,3 +225,3 @@ return false; | ||
exports.encodePayload = function (packets, supportsBinary, callback) { | ||
if (typeof supportsBinary == 'function') { | ||
if (typeof supportsBinary === 'function') { | ||
callback = supportsBinary; | ||
@@ -235,8 +239,4 @@ supportsBinary = null; | ||
function setLengthHeader(message) { | ||
return message.length + ':' + message; | ||
} | ||
function encodeOne(packet, doneCallback) { | ||
exports.encodePacket(packet, supportsBinary, true, function(message) { | ||
exports.encodePacket(packet, supportsBinary, false, function(message) { | ||
doneCallback(null, setLengthHeader(message)); | ||
@@ -251,2 +251,6 @@ }); | ||
function setLengthHeader(message) { | ||
return message.length + ':' + message; | ||
} | ||
/** | ||
@@ -260,11 +264,7 @@ * Async array map using after | ||
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); | ||
} | ||
@@ -282,3 +282,3 @@ } | ||
exports.decodePayload = function (data, binaryType, callback) { | ||
if ('string' != typeof data) { | ||
if (typeof data !== 'string') { | ||
return exports.decodePayloadAsBinary(data, binaryType, callback); | ||
@@ -292,4 +292,3 @@ } | ||
var packet; | ||
if (data == '') { | ||
if (data === '') { | ||
// parser error - ignoring payload | ||
@@ -299,4 +298,3 @@ return callback(err, 0, 1); | ||
var length = '' | ||
, n, msg; | ||
var length = '', n, msg, packet; | ||
@@ -306,36 +304,37 @@ for (var i = 0, l = data.length; i < l; i++) { | ||
if (':' != chr) { | ||
if (chr !== ':') { | ||
length += chr; | ||
} else { | ||
if ('' == length || (length != (n = Number(length)))) { | ||
// parser error - ignoring payload | ||
return callback(err, 0, 1); | ||
} | ||
continue; | ||
} | ||
msg = data.substr(i + 1, n); | ||
if (length === '' || (length != (n = Number(length)))) { | ||
// parser error - ignoring payload | ||
return callback(err, 0, 1); | ||
} | ||
if (length != msg.length) { | ||
// parser error - ignoring payload | ||
return callback(err, 0, 1); | ||
} | ||
msg = data.substr(i + 1, n); | ||
if (msg.length) { | ||
packet = exports.decodePacket(msg, binaryType, true); | ||
if (length != msg.length) { | ||
// parser error - ignoring payload | ||
return callback(err, 0, 1); | ||
} | ||
if (err.type == packet.type && err.data == packet.data) { | ||
// parser error in individual packet - ignoring payload | ||
return callback(err, 0, 1); | ||
} | ||
if (msg.length) { | ||
packet = exports.decodePacket(msg, binaryType, false); | ||
var ret = callback(packet, i + n, l); | ||
if (false === ret) return; | ||
if (err.type === packet.type && err.data === packet.data) { | ||
// parser error in individual packet - ignoring payload | ||
return callback(err, 0, 1); | ||
} | ||
// advance cursor | ||
i += n; | ||
length = ''; | ||
var more = callback(packet, i + n, l); | ||
if (false === more) return; | ||
} | ||
// advance cursor | ||
i += n; | ||
length = ''; | ||
} | ||
if (length != '') { | ||
if (length !== '') { | ||
// parser error - ignoring payload | ||
@@ -356,3 +355,3 @@ return callback(err, 0, 1); | ||
var str = ''; | ||
for (var i = 0; i < buffer.length; i++) { | ||
for (var i = 0, l = buffer.length; i < l; i++) { | ||
str += String.fromCharCode(buffer[i]); | ||
@@ -372,3 +371,3 @@ } | ||
var buf = new Buffer(string.length); | ||
for (var i = 0; i < string.length; i++) { | ||
for (var i = 0, l = string.length; i < l; i++) { | ||
buf.writeUInt8(string.charCodeAt(i), i); | ||
@@ -418,19 +417,17 @@ } | ||
function encodeOne(p, doneCallback) { | ||
exports.encodePacket(p, true, true, function(packet) { | ||
map(packets, encodeOneBinaryPacket, function(err, results) { | ||
return callback(Buffer.concat(results)); | ||
}); | ||
}; | ||
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)])); | ||
} | ||
function encodeOneBinaryPacket(p, doneCallback) { | ||
var encodingLength = '' + packet.length; | ||
var sizeBuffer = new Buffer(encodingLength.length + 2); | ||
sizeBuffer[0] = 1; // is binary (true binary = 1) | ||
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++) { | ||
@@ -440,11 +437,20 @@ 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); | ||
} | ||
/* | ||
@@ -467,2 +473,3 @@ * Decodes data when a payload is maybe expected. Strings are decoded by | ||
var buffers = []; | ||
var i; | ||
@@ -472,13 +479,10 @@ while (bufferTail.length > 0) { | ||
var isString = bufferTail[0] === 0; | ||
var numberTooLong = false; | ||
for (var i = 1; ; i++) { | ||
if (bufferTail[i] == 255) break; | ||
for (i = 1; ; i++) { | ||
if (bufferTail[i] === 255) break; | ||
// 310 = char length of Number.MAX_VALUE | ||
if (strLen.length > 310) { | ||
numberTooLong = true; | ||
break; | ||
return callback(err, 0, 1); | ||
} | ||
strLen += '' + bufferTail[i]; | ||
} | ||
if(numberTooLong) return callback(err, 0, 1); | ||
bufferTail = bufferTail.slice(strLen.length + 1); | ||
@@ -495,5 +499,6 @@ | ||
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); | ||
}); | ||
} | ||
}; |
@@ -5,3 +5,3 @@ { | ||
"license": "MIT", | ||
"version": "1.3.2", | ||
"version": "2.0.0", | ||
"homepage": "https://github.com/socketio/engine.io-parser", | ||
@@ -11,2 +11,3 @@ "devDependencies": { | ||
"mocha": "3.2.0", | ||
"socket.io-browsers": "^1.0.0", | ||
"zuul": "3.11.1", | ||
@@ -20,4 +21,3 @@ "zuul-ngrok": "4.0.0" | ||
"blob": "0.0.4", | ||
"has-binary": "0.1.7", | ||
"wtf-8": "1.0.0" | ||
"has-binary": "0.1.7" | ||
}, | ||
@@ -24,0 +24,0 @@ "scripts": { |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
44186
5
9
1130
5
- Removedwtf-8@1.0.0
- Removedwtf-8@1.0.0(transitive)