From ca4f42a922ba7078e840b1bc09fe3ad618acc065 Mon Sep 17 00:00:00 2001 From: Kevin Roark Date: Fri, 30 May 2014 18:41:47 -0700 Subject: [PATCH 001/129] added a BINARY_ACK type --- index.js | 17 +++++++++++++---- test/blob.js | 21 ++++++++++++++++++++- test/buffer.js | 11 ++++++++++- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/index.js b/index.js index deea58f..7ec330b 100644 --- a/index.js +++ b/index.js @@ -29,6 +29,7 @@ exports.types = [ 'EVENT', 'BINARY_EVENT', 'ACK', + 'BINARY_ACK', 'ERROR' ]; @@ -80,6 +81,14 @@ exports.ERROR = 4; exports.BINARY_EVENT = 5; +/** + * Packet type `binary ack`. For acks with binary arguments. + * + * @api public + */ + +exports.BINARY_ACK = 6; + exports.Encoder = Encoder /** @@ -102,7 +111,7 @@ function Encoder() {}; Encoder.prototype.encode = function(obj, callback){ debug('encoding packet %j', obj); - if (exports.BINARY_EVENT == obj.type || exports.ACK == obj.type) { + if (exports.BINARY_EVENT == obj.type || exports.BINARY_ACK == obj.type) { encodeAsBinary(obj, callback); } else { @@ -127,7 +136,7 @@ function encodeAsString(obj) { str += obj.type; // attachments if we have them - if (exports.BINARY_EVENT == obj.type || exports.ACK == obj.type) { + if (exports.BINARY_EVENT == obj.type || exports.BINARY_ACK == obj.type) { str += obj.attachments; str += '-'; } @@ -213,7 +222,7 @@ Decoder.prototype.add = function(obj) { var packet; if ('string' == typeof obj) { packet = decodeString(obj); - if (exports.BINARY_EVENT == packet.type || exports.ACK == packet.type) { // binary packet's json + if (exports.BINARY_EVENT == packet.type || exports.BINARY_ACK == packet.type) { // binary packet's json this.reconstructor = new BinaryReconstructor(packet); // no attachments, labeled binary but no binary data to follow @@ -259,7 +268,7 @@ function decodeString(str) { if (null == exports.types[p.type]) return error(); // look up attachments if type binary - if (exports.BINARY_EVENT == p.type || exports.ACK == p.type) { + if (exports.BINARY_EVENT == p.type || exports.BINARY_ACK == p.type) { p.attachments = ''; while (str.charAt(++i) != '-') { p.attachments += str.charAt(i); diff --git a/test/blob.js b/test/blob.js index 848f857..31d4b24 100644 --- a/test/blob.js +++ b/test/blob.js @@ -38,11 +38,30 @@ describe('parser', function() { var packet = { type: parser.BINARY_EVENT, - data: {a: 'hi', b: { why: data }, c:'bye'}, + data: {a: 'hi', b: { why: data }, c: 'bye'}, id: 999, nsp: '/deep' }; helpers.test_bin(packet); }); + it('encodes a binary ack with a blob', function() { + var data; + if (BlobBuilder) { + var bb = new BlobBuilder(); + bb.append(new ArrayBuffer(2)); + data = bb.getBlob(); + } else { + data = new Blob([new ArrayBuffer(2)]); + } + + var packet = { + type: parser.BINARY_ACK, + data: {a: 'hi ack', b: { why: data }, c: 'bye ack'}, + id: 999, + nsp: '/deep' + }; + helpers.test_bin(packet); + }) + }); diff --git a/test/buffer.js b/test/buffer.js index 51c2c51..dd27460 100644 --- a/test/buffer.js +++ b/test/buffer.js @@ -12,5 +12,14 @@ describe('parser', function() { id: 23, nsp: '/cool' }); - }); + }); + + it('encodes a binary ack with Buffer', function() { + helpers.test_bin({ + type: parser.BINARY_ACK, + data: ['a', new Buffer('xxx', 'utf8'), {}], + id: 127, + nsp: '/back' + }) + }); }); From 2997b08ce3679238d548da8a05abe39c27839362 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Fri, 30 May 2014 21:11:00 -0700 Subject: [PATCH 002/129] Release 2.2.0 --- History.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 7c59093..53ed872 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +2.2.0 / 2014-05-30 +================== + + * added a BINARY_ACK type [kevin-roark] + 2.1.5 / 2014-05-24 ================== diff --git a/package.json b/package.json index abbda68..32f139a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "2.1.5", + "version": "2.2.0", "description": "socket.io protocol parser", "repository": { "type": "git", From 4e33d6a6c506c5b4f8ed76236b51119e5e0052c9 Mon Sep 17 00:00:00 2001 From: Kevin Roark Date: Sat, 31 May 2014 22:41:12 -0700 Subject: [PATCH 003/129] Less indentation and a small optimization The optimization is the "else if" instead of "if" for checking array in _removeBlobs. No need to iterate over keys of a blob. --- binary.js | 86 +++++++++++++++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 44 deletions(-) diff --git a/binary.js b/binary.js index 6158d30..69ea489 100644 --- a/binary.js +++ b/binary.js @@ -18,32 +18,32 @@ exports.deconstructPacket = function(packet) { var buffers = []; var packetData = packet.data; - function deconstructBinPackRecursive(data) { - if (!data) return data; - - if ((global.Buffer && Buffer.isBuffer(data)) || - (global.ArrayBuffer && data instanceof ArrayBuffer)) { // replace binary - var placeholder = {_placeholder: true, num: buffers.length}; - buffers.push(data); - return placeholder; - } else if (isArray(data)) { - var newData = new Array(data.length); - for (var i = 0; i < data.length; i++) { - newData[i] = deconstructBinPackRecursive(data[i]); - } - return newData; - } else if ('object' == typeof data && !(data instanceof Date)) { - var newData = {}; - for (var key in data) { - newData[key] = deconstructBinPackRecursive(data[key]); - } - return newData; + function _deconstructPacket(data) { + if (!data) return data; + + if ((global.Buffer && Buffer.isBuffer(data)) || + (global.ArrayBuffer && data instanceof ArrayBuffer)) { // replace binary + var placeholder = {_placeholder: true, num: buffers.length}; + buffers.push(data); + return placeholder; + } else if (isArray(data)) { + var newData = new Array(data.length); + for (var i = 0; i < data.length; i++) { + newData[i] = _deconstructPacket(data[i]); } - return data; + return newData; + } else if ('object' == typeof data && !(data instanceof Date)) { + var newData = {}; + for (var key in data) { + newData[key] = _deconstructPacket(data[key]); + } + return newData; + } + return data; } var pack = packet; - pack.data = deconstructBinPackRecursive(packetData); + pack.data = _deconstructPacket(packetData); pack.attachments = buffers.length; // number of binary 'attachments' return {packet: pack, buffers: buffers}; } @@ -60,25 +60,25 @@ exports.deconstructPacket = function(packet) { exports.reconstructPacket = function(packet, buffers) { var curPlaceHolder = 0; - function reconstructBinPackRecursive(data) { - if (data && data._placeholder) { - var buf = buffers[data.num]; // appropriate buffer (should be natural order anyway) - return buf; - } else if (isArray(data)) { - for (var i = 0; i < data.length; i++) { - data[i] = reconstructBinPackRecursive(data[i]); - } - return data; - } else if (data && 'object' == typeof data) { - for (var key in data) { - data[key] = reconstructBinPackRecursive(data[key]); - } - return data; + function _reconstructPacket(data) { + if (data && data._placeholder) { + var buf = buffers[data.num]; // appropriate buffer (should be natural order anyway) + return buf; + } else if (isArray(data)) { + for (var i = 0; i < data.length; i++) { + data[i] = _reconstructPacket(data[i]); + } + return data; + } else if (data && 'object' == typeof data) { + for (var key in data) { + data[key] = _reconstructPacket(data[key]); } return data; + } + return data; } - packet.data = reconstructBinPackRecursive(packet.data); + packet.data = _reconstructPacket(packet.data); packet.attachments = undefined; // no longer useful return packet; } @@ -95,7 +95,7 @@ exports.deconstructPacket = function(packet) { exports.removeBlobs = function(data, callback) { - function removeBlobsRecursive(obj, curKey, containingObject) { + function _removeBlobs(obj, curKey, containingObject) { if (!obj) return obj; // convert any blob @@ -120,22 +120,20 @@ exports.removeBlobs = function(data, callback) { }; fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer - } - - if (isArray(obj)) { // handle array + } else if (isArray(obj)) { // handle array for (var i = 0; i < obj.length; i++) { - removeBlobsRecursive(obj[i], i, obj); + _removeBlobs(obj[i], i, obj); } } else if (obj && 'object' == typeof obj && !isBuf(obj)) { // and object for (var key in obj) { - removeBlobsRecursive(obj[key], key, obj); + _removeBlobs(obj[key], key, obj); } } } var pendingBlobs = 0; var bloblessData = data; - removeBlobsRecursive(bloblessData); + _removeBlobs(bloblessData); if (!pendingBlobs) { callback(bloblessData); } From 5ca1da1c7e3606b49f4543d0de995c09dcec6f13 Mon Sep 17 00:00:00 2001 From: Kevin Roark Date: Sat, 31 May 2014 23:30:39 -0700 Subject: [PATCH 004/129] bump protocol version here too --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 7ec330b..536d0c0 100644 --- a/index.js +++ b/index.js @@ -15,7 +15,7 @@ var binary = require('./binary'); * @api public */ -exports.protocol = 3; +exports.protocol = 4; /** * Packet types. From dca8afc952843adc16f9b508d60319bdf5d5fe65 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Jun 2014 17:43:40 -0700 Subject: [PATCH 005/129] Update Readme.md --- Readme.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index edada07..22c975f 100644 --- a/Readme.md +++ b/Readme.md @@ -1,7 +1,7 @@ # socket.io-parser -[![Build Status](https://secure.travis-ci.org/LearnBoost/socket.io-parser.png)](http://travis-ci.org/LearnBoost/socket.io-parser) +[![Build Status](https://secure.travis-ci.org/Automattic/socket.io-parser.png)](http://travis-ci.org/Automattic/socket.io-parser) [![NPM version](https://badge.fury.io/js/socket.io-parser.png)](http://badge.fury.io/js/socket.io-parser) A socket.io encoder and decoder written in JavaScript complying with version `3` @@ -66,3 +66,8 @@ encoder.encode(packet, function(encodedPackets) { }); ``` See the test suite for more examples of how socket.io-parser is used. + + +## License + +MIT From baac860d5d9b9ae5bcff105224677a87f4d9715a Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Jun 2014 17:43:53 -0700 Subject: [PATCH 006/129] Update package.json --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 32f139a..6bb52f0 100644 --- a/package.json +++ b/package.json @@ -24,5 +24,6 @@ }, "scripts": { "test": "make test" - } + }, + "license": "MIT" } From 035fa7dded0b9d4d64b8e7d0491d3d2a3570098e Mon Sep 17 00:00:00 2001 From: Reid Burke Date: Wed, 4 Jun 2014 15:03:37 -0700 Subject: [PATCH 007/129] Upgrade component-emitter to 1.1.2 Switch from depending on a tarball URL to the published component-emitter package at its latest version. Change all references to emitter module to the new component-emitter name. --- index.js | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 536d0c0..697b048 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,7 @@ var debug = require('debug')('socket.io-parser'); var json = require('json3'); var isArray = require('isarray'); -var Emitter = require('emitter'); +var Emitter = require('component-emitter'); var binary = require('./binary'); /** diff --git a/package.json b/package.json index 6bb52f0..358c91c 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "dependencies": { "debug": "0.7.4", "json3": "3.2.6", - "emitter": "http://github.com/component/emitter/archive/1.0.1.tar.gz", + "component-emitter": "1.1.2", "isarray": "0.0.1" }, "devDependencies": { From 8a7e0b8b0a2d3e583529f878565ff9764ad3eb69 Mon Sep 17 00:00:00 2001 From: Kevin Roark Date: Sun, 8 Jun 2014 12:23:48 -0700 Subject: [PATCH 008/129] added benchmarking --- bench/bench.js | 10 ++++++++ bench/index.js | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 ++- 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 bench/bench.js create mode 100644 bench/index.js diff --git a/bench/bench.js b/bench/bench.js new file mode 100644 index 0000000..d767d5a --- /dev/null +++ b/bench/bench.js @@ -0,0 +1,10 @@ +var bencher = require('./index'); +bencher(function(benchmark) { + function logMean(test) { + console.log(test.name + ' mean run time: ' + test.stats.mean); + } + + for (var i = 0; i < benchmark.length; i++) { + logMean(benchmark[i]); + } +}); diff --git a/bench/index.js b/bench/index.js new file mode 100644 index 0000000..b6e1b14 --- /dev/null +++ b/bench/index.js @@ -0,0 +1,67 @@ +var Benchmark = require('benchmark'); +var parser = require('../index'); + +function test(packet, deferred) { + var encoder = new parser.Encoder(); + var decoder = new parser.Decoder(); + encoder.encode(packet, function(encodedPackets) { + var decoder = new parser.Decoder(); + decoder.on('decoded', function(packet) { + deferred.resolve(); + }); + + decoder.add(encodedPackets[0]); + }); +} + +var dataObject = { + 'a': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], + 'b': 'xxxyyyzzzalsdfalskdjfalksdjfalksdjfalksdjfjjfjfjfjjfjfjfj', + 'data': { + 'is': 'cool', + 'or': { + 'is': { + 'it': true + } + } + } +}; +var bigArray = []; +for (var i = 0; i < 250; i++) { + bigArray.push(dataObject); +} + + + +module.exports = function(callback) { + var suite = new Benchmark.Suite(); + + suite.add('small json parse', {defer: true, fn: function(deferred) { + var packet = { + type: parser.EVENT, + nsp: '/bench', + data: dataObject + }; + test(packet, deferred); + }}) + .add('big json parse', {defer: true, fn: function(deferred) { + var packet = { + type: parser.EVENT, + nsp: '/bench', + data: bigArray + }; + test(packet, deferred); + }}) + .add('json with buffer parse', {defer: true, fn: function(deferred) { + var packet = { + type: parser.EVENT, + nsp: '/bench', + data: {'a': [1, 2, 3], 'b': 'xxxyyyzzz', 'data': new Buffer(10000)} + }; + test(packet, deferred); + }}) + .on('complete', function() { + callback(this); + }) + .run({'async': true}); +}; diff --git a/package.json b/package.json index 358c91c..b0b95e5 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "debug": "0.7.4", "json3": "3.2.6", "component-emitter": "1.1.2", - "isarray": "0.0.1" + "isarray": "0.0.1", + "benchmark": "1.0.0" }, "devDependencies": { "mocha": "1.16.2", From 17cf621e86ce7e0dc821352dca7213f1f9d3c365 Mon Sep 17 00:00:00 2001 From: Kevin Roark Date: Sun, 8 Jun 2014 14:08:10 -0700 Subject: [PATCH 009/129] big binary bench as well --- bench/index.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/bench/index.js b/bench/index.js index b6e1b14..8c1994e 100644 --- a/bench/index.js +++ b/bench/index.js @@ -52,11 +52,25 @@ module.exports = function(callback) { }; test(packet, deferred); }}) - .add('json with buffer parse', {defer: true, fn: function(deferred) { + .add('json with small binary parse', {defer: true, fn: function(deferred) { var packet = { type: parser.EVENT, nsp: '/bench', - data: {'a': [1, 2, 3], 'b': 'xxxyyyzzz', 'data': new Buffer(10000)} + data: {'a': [1, 2, 3], 'b': 'xxxyyyzzz', 'data': new Buffer(1000)} + }; + test(packet, deferred); + }}) + .add('json with big binary parse', {defer: true, fn: function(deferred) { + var bigBinaryData = { + bin1: new Buffer(10000), + arr: bigArray, + bin2: new Buffer(10000), + bin3: new Buffer(10000) + }; + var packet = { + type: parser.EVENT, + nsp: '/bench', + data: bigBinaryData }; test(packet, deferred); }}) From 5c551f0f527fec41361df6fdc0d60d202e658045 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Fri, 20 Jun 2014 16:56:24 -0700 Subject: [PATCH 010/129] Release 2.2.1 --- History.md | 8 ++++++++ package.json | 9 ++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/History.md b/History.md index 53ed872..a110346 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,12 @@ +2.2.1 / 2014-06-20 +================== + + * added benchmarking [kevin-roark] + * upgrade component-emitter to 1.1.2 [kevin-roark] + * update protocol version [kevin-roark] + * less indentation and a small optimization [kevin-roark] + 2.2.0 / 2014-05-30 ================== diff --git a/package.json b/package.json index b0b95e5..803c903 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "socket.io-parser", - "version": "2.2.0", + "version": "2.2.1", "description": "socket.io protocol parser", "repository": { "type": "git", - "url": "https://github.com/LearnBoost/socket.io-parser.git" + "url": "https://github.com/Automattic/socket.io-parser.git" }, "dependencies": { "debug": "0.7.4", @@ -18,11 +18,6 @@ "expect.js": "0.2.0", "zuul": "1.6.3" }, - "component": { - "scripts": [ - "index.js" - ] - }, "scripts": { "test": "make test" }, From 0c755f93e415f08199d199c7d1b25715c3a52dfc Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sun, 10 Aug 2014 10:43:00 -0700 Subject: [PATCH 011/129] clean up syntax --- binary.js | 107 +++++++++++++++++++++++++++--------------------------- 1 file changed, 54 insertions(+), 53 deletions(-) diff --git a/binary.js b/binary.js index 69ea489..15eb71e 100644 --- a/binary.js +++ b/binary.js @@ -1,5 +1,7 @@ +/*global Blob,File*/ + /** - * Modle requirements + * Module requirements */ var isArray = require('isarray'); @@ -14,39 +16,39 @@ var isArray = require('isarray'); * @api public */ -exports.deconstructPacket = function(packet) { - var buffers = []; - var packetData = packet.data; - - function _deconstructPacket(data) { - if (!data) return data; - - if ((global.Buffer && Buffer.isBuffer(data)) || - (global.ArrayBuffer && data instanceof ArrayBuffer)) { // replace binary - var placeholder = {_placeholder: true, num: buffers.length}; - buffers.push(data); - return placeholder; - } else if (isArray(data)) { - var newData = new Array(data.length); - for (var i = 0; i < data.length; i++) { - newData[i] = _deconstructPacket(data[i]); - } - return newData; - } else if ('object' == typeof data && !(data instanceof Date)) { - var newData = {}; - for (var key in data) { - newData[key] = _deconstructPacket(data[key]); - } - return newData; +exports.deconstructPacket = function(packet){ + var buffers = []; + var packetData = packet.data; + + function _deconstructPacket(data) { + if (!data) return data; + + if ((global.Buffer && Buffer.isBuffer(data)) || + (global.ArrayBuffer && data instanceof ArrayBuffer)) { // replace binary + var placeholder = {_placeholder: true, num: buffers.length}; + buffers.push(data); + return placeholder; + } else if (isArray(data)) { + var newData = new Array(data.length); + for (var i = 0; i < data.length; i++) { + newData[i] = _deconstructPacket(data[i]); } - return data; + return newData; + } else if ('object' == typeof data && !(data instanceof Date)) { + var newData = {}; + for (var key in data) { + newData[key] = _deconstructPacket(data[key]); + } + return newData; } + return data; + } - var pack = packet; - pack.data = _deconstructPacket(packetData); - pack.attachments = buffers.length; // number of binary 'attachments' - return {packet: pack, buffers: buffers}; -} + var pack = packet; + pack.data = _deconstructPacket(packetData); + pack.attachments = buffers.length; // number of binary 'attachments' + return {packet: pack, buffers: buffers}; +}; /** * Reconstructs a binary packet from its placeholder packet and buffers @@ -57,31 +59,31 @@ exports.deconstructPacket = function(packet) { * @api public */ - exports.reconstructPacket = function(packet, buffers) { - var curPlaceHolder = 0; +exports.reconstructPacket = function(packet, buffers) { + var curPlaceHolder = 0; - function _reconstructPacket(data) { - if (data && data._placeholder) { - var buf = buffers[data.num]; // appropriate buffer (should be natural order anyway) - return buf; - } else if (isArray(data)) { - for (var i = 0; i < data.length; i++) { - data[i] = _reconstructPacket(data[i]); - } - return data; - } else if (data && 'object' == typeof data) { - for (var key in data) { - data[key] = _reconstructPacket(data[key]); - } - return data; + function _reconstructPacket(data) { + if (data && data._placeholder) { + var buf = buffers[data.num]; // appropriate buffer (should be natural order anyway) + return buf; + } else if (isArray(data)) { + for (var i = 0; i < data.length; i++) { + data[i] = _reconstructPacket(data[i]); + } + return data; + } else if (data && 'object' == typeof data) { + for (var key in data) { + data[key] = _reconstructPacket(data[key]); } return data; } + return data; + } - packet.data = _reconstructPacket(packet.data); - packet.attachments = undefined; // no longer useful - return packet; - } + packet.data = _reconstructPacket(packet.data); + packet.attachments = undefined; // no longer useful + return packet; +}; /** * Asynchronously removes Blobs or Files from data via @@ -94,7 +96,6 @@ exports.deconstructPacket = function(packet) { */ exports.removeBlobs = function(data, callback) { - function _removeBlobs(obj, curKey, containingObject) { if (!obj) return obj; @@ -137,7 +138,7 @@ exports.removeBlobs = function(data, callback) { if (!pendingBlobs) { callback(bloblessData); } -} +}; /** * Returns true if obj is a buffer or an arraybuffer. From 3cef88bc88ad8a56c102754b690bcf62f1fa5b91 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sun, 10 Aug 2014 10:43:45 -0700 Subject: [PATCH 012/129] binary: reuse `isBuf` helper --- binary.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/binary.js b/binary.js index 15eb71e..7b7bae2 100644 --- a/binary.js +++ b/binary.js @@ -23,9 +23,8 @@ exports.deconstructPacket = function(packet){ function _deconstructPacket(data) { if (!data) return data; - if ((global.Buffer && Buffer.isBuffer(data)) || - (global.ArrayBuffer && data instanceof ArrayBuffer)) { // replace binary - var placeholder = {_placeholder: true, num: buffers.length}; + if (isBuf(data)) { + var placeholder = { _placeholder: true, num: buffers.length }; buffers.push(data); return placeholder; } else if (isArray(data)) { From be4a5868edadd79236561e561bbe4036d311ce97 Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Tue, 12 Aug 2014 10:51:52 +0800 Subject: [PATCH 013/129] make CI build faster --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index be696ff..c1c830a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,8 @@ node_js: - 0.10 notifications: irc: irc.freenode.org##socket.io +git: + depth: 1 env: global: - secure: 28HHk1J0H64KNjzmmlxG/Ro0EPuLnhO0rU+kZjjthDHj/FaugIsqjAVQ1Dl6heWV2/MlVzw6nDCyMNiGwiVk0ruZPQ0SYdAKLplrdMtzAihbU3xx+ULFQPLM3SoW0ZFCEpe8dWPGy4WdgW7aLByeel9TJb3vlhAu7p7AvrcO7Fs= From 97ebfcb8366577abc4ed8f469c4c7ad601314dde Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Tue, 12 Aug 2014 10:54:49 +0800 Subject: [PATCH 014/129] Use svg instead of png to get better image quality --- Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Readme.md b/Readme.md index 22c975f..2fa0f82 100644 --- a/Readme.md +++ b/Readme.md @@ -1,8 +1,8 @@ # socket.io-parser -[![Build Status](https://secure.travis-ci.org/Automattic/socket.io-parser.png)](http://travis-ci.org/Automattic/socket.io-parser) -[![NPM version](https://badge.fury.io/js/socket.io-parser.png)](http://badge.fury.io/js/socket.io-parser) +[![Build Status](https://secure.travis-ci.org/Automattic/socket.io-parser.svg)](http://travis-ci.org/Automattic/socket.io-parser) +[![NPM version](https://badge.fury.io/js/socket.io-parser.svg)](http://badge.fury.io/js/socket.io-parser) A socket.io encoder and decoder written in JavaScript complying with version `3` of [socket.io-protocol](https://github.com/learnboost/socket.io-protocol). From 0ae9a4fba6cedd591df5cfd5f6a73aef7cee7537 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 4 Sep 2014 10:14:23 +0200 Subject: [PATCH 015/129] prevent direct `Buffer` reference that breaks browserify --- binary.js | 11 +---------- index.js | 36 ++++++++++++++++++++++++------------ is-buffer.js | 13 +++++++++++++ 3 files changed, 38 insertions(+), 22 deletions(-) create mode 100644 is-buffer.js diff --git a/binary.js b/binary.js index 7b7bae2..b31f40c 100644 --- a/binary.js +++ b/binary.js @@ -5,6 +5,7 @@ */ var isArray = require('isarray'); +var isBuf = require('./is-buffer'); /** * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder. @@ -138,13 +139,3 @@ exports.removeBlobs = function(data, callback) { callback(bloblessData); } }; - -/** - * Returns true if obj is a buffer or an arraybuffer. - * - * @api private - */ -function isBuf(obj) { - return (global.Buffer && Buffer.isBuffer(obj)) || - (global.ArrayBuffer && obj instanceof ArrayBuffer); -} diff --git a/index.js b/index.js index 697b048..378c4dd 100644 --- a/index.js +++ b/index.js @@ -8,6 +8,7 @@ var json = require('json3'); var isArray = require('isarray'); var Emitter = require('component-emitter'); var binary = require('./binary'); +var isBuf = require('./is-buffer'); /** * Protocol version. @@ -89,14 +90,29 @@ exports.BINARY_EVENT = 5; exports.BINARY_ACK = 6; -exports.Encoder = Encoder +/** + * Encoder constructor. + * + * @api public + */ + +exports.Encoder = Encoder; + +/** + * Decoder constructor. + * + * @api public + */ + +exports.Decoder = Decoder; /** * A socket.io Encoder instance * * @api public */ -function Encoder() {}; + +function Encoder() {} /** * Encode a packet as a single string if non-binary, or as a @@ -191,8 +207,6 @@ function encodeAsBinary(obj, callback) { binary.removeBlobs(obj, writeEncoding); } -exports.Decoder = Decoder - /** * A socket.io Decoder instance * @@ -233,9 +247,7 @@ Decoder.prototype.add = function(obj) { this.emit('decoded', packet); } } - else if ((global.Buffer && Buffer.isBuffer(obj)) || - (global.ArrayBuffer && obj instanceof ArrayBuffer) || - obj.base64) { // raw binary data + else if (isBuf(obj) || obj.base64) { // raw binary data if (!this.reconstructor) { throw new Error('got binary data when not reconstructing a packet'); } else { @@ -249,7 +261,7 @@ Decoder.prototype.add = function(obj) { else { throw new Error('Unknown type: ' + obj); } -} +}; /** * Decode a packet String (JSON data) @@ -316,7 +328,7 @@ function decodeString(str) { debug('decoded %s as %j', str, p); return p; -}; +} /** * Deallocates a parser's resources @@ -328,7 +340,7 @@ Decoder.prototype.destroy = function() { if (this.reconstructor) { this.reconstructor.finishedReconstruction(); } -} +}; /** * A manager of a binary event's 'buffer sequence'. Should @@ -363,7 +375,7 @@ BinaryReconstructor.prototype.takeBinaryData = function(binData) { return packet; } return null; -} +}; /** * Cleans up binary packet reconstruction variables. @@ -374,7 +386,7 @@ BinaryReconstructor.prototype.takeBinaryData = function(binData) { BinaryReconstructor.prototype.finishedReconstruction = function() { this.reconPack = null; this.buffers = []; -} +}; function error(data){ return { diff --git a/is-buffer.js b/is-buffer.js new file mode 100644 index 0000000..977df88 --- /dev/null +++ b/is-buffer.js @@ -0,0 +1,13 @@ + +module.exports = isBuf; + +/** + * Returns true if obj is a buffer or an arraybuffer. + * + * @api private + */ + +function isBuf(obj) { + return (global.Buffer && global.Buffer.isBuffer(obj)) || + (global.ArrayBuffer && obj instanceof ArrayBuffer); +} From 83c68c7a715ac54e95c5dae6445f751b3a4dfe9f Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Thu, 4 Sep 2014 10:14:58 +0200 Subject: [PATCH 016/129] Release 2.2.2 --- History.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index a110346..3563380 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,10 @@ +2.2.2 / 2014-09-04 +================== + + * prevent direct `Buffer` reference that breaks browserify + * binary: reuse `isBuf` helper + 2.2.1 / 2014-06-20 ================== diff --git a/package.json b/package.json index 803c903..83de199 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "2.2.1", + "version": "2.2.2", "description": "socket.io protocol parser", "repository": { "type": "git", From e8f660f77fb5f1ec67fa3bb36b2d0edece7e5afd Mon Sep 17 00:00:00 2001 From: Chylli Date: Tue, 25 Nov 2014 14:44:07 +0800 Subject: [PATCH 017/129] fix the order of events --- index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 378c4dd..61b6276 100644 --- a/index.js +++ b/index.js @@ -28,10 +28,10 @@ exports.types = [ 'CONNECT', 'DISCONNECT', 'EVENT', - 'BINARY_EVENT', 'ACK', - 'BINARY_ACK', - 'ERROR' + 'ERROR', + 'BINARY_EVENT', + 'BINARY_ACK' ]; /** From e77fc4c32bf1142245aa4e871c6ae27ad3bd857c Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Feb 2015 16:26:53 -0800 Subject: [PATCH 018/129] index: fix potential infinite loop with malicious binary packet --- index.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 378c4dd..c1566b5 100644 --- a/index.js +++ b/index.js @@ -240,7 +240,7 @@ Decoder.prototype.add = function(obj) { this.reconstructor = new BinaryReconstructor(packet); // no attachments, labeled binary but no binary data to follow - if (this.reconstructor.reconPack.attachments == 0) { + if (this.reconstructor.reconPack.attachments === 0) { this.emit('decoded', packet); } } else { // non-binary full packet @@ -281,11 +281,15 @@ function decodeString(str) { // look up attachments if type binary if (exports.BINARY_EVENT == p.type || exports.BINARY_ACK == p.type) { - p.attachments = ''; + var buf = ''; while (str.charAt(++i) != '-') { - p.attachments += str.charAt(i); + buf += str.charAt(i); + if (i + 1 == str.length) break; + } + if (buf != Number(buf) || str.charAt(i) != '-') { + throw new Error('Illegal attachments'); } - p.attachments = Number(p.attachments); + p.attachments = Number(buf); } // look up namespace (if any) @@ -303,7 +307,7 @@ function decodeString(str) { // look up id var next = str.charAt(i + 1); - if ('' != next && Number(next) == next) { + if ('' !== next && Number(next) == next) { p.id = ''; while (++i) { var c = str.charAt(i); From c4bfb06a72c767d31c44a976a0b08b44874a2575 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Feb 2015 16:28:11 -0800 Subject: [PATCH 019/129] Release 2.2.3 --- History.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 3563380..5195eae 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +2.2.3 / 2015-02-03 +================== + + * index: fix potential infinite loop with malicious binary packet + 2.2.2 / 2014-09-04 ================== diff --git a/package.json b/package.json index 83de199..bd439b1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "2.2.2", + "version": "2.2.3", "description": "socket.io protocol parser", "repository": { "type": "git", From 64bd486ea5cad4fc2cbead769eb57e6674525fa1 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Wed, 11 Feb 2015 08:24:36 -0800 Subject: [PATCH 020/129] semicolon --- test/arraybuffer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/arraybuffer.js b/test/arraybuffer.js index ff2a700..0ba4c04 100644 --- a/test/arraybuffer.js +++ b/test/arraybuffer.js @@ -30,7 +30,7 @@ describe('parser', function() { data: {a: 'b', c: 4, e: {g: null}, h: new ArrayBuffer(9)}, nsp: '/', id: 600 - } + }; helpers.test_bin(packet); }); From 59d2329731d00b2c87b166cd11c750afc8a51b90 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Mar 2015 10:22:09 -0800 Subject: [PATCH 021/129] index: fix off-by-one bound checks --- index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index c1566b5..4149558 100644 --- a/index.js +++ b/index.js @@ -284,7 +284,7 @@ function decodeString(str) { var buf = ''; while (str.charAt(++i) != '-') { buf += str.charAt(i); - if (i + 1 == str.length) break; + if (i == str.length) break; } if (buf != Number(buf) || str.charAt(i) != '-') { throw new Error('Illegal attachments'); @@ -299,7 +299,7 @@ function decodeString(str) { var c = str.charAt(i); if (',' == c) break; p.nsp += c; - if (i + 1 == str.length) break; + if (i == str.length) break; } } else { p.nsp = '/'; @@ -316,7 +316,7 @@ function decodeString(str) { break; } p.id += str.charAt(i); - if (i + 1 == str.length) break; + if (i == str.length) break; } p.id = Number(p.id); } From 7363746e8a0cfa6974091f6eeb6605c208cf4ae8 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Mar 2015 10:33:51 -0800 Subject: [PATCH 022/129] added test --- test/parser.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/parser.js b/test/parser.js index 88e28c8..346ca3b 100644 --- a/test/parser.js +++ b/test/parser.js @@ -50,4 +50,13 @@ describe('parser', function(){ nsp: '/' }); }); + + it('decodes a bad binary packet', function(){ + try { + var decoder = new parser.Decoder(); + decoder.add('5'); + } catch(e){ + expect(e.message).to.match(/Illegal/); + } + }); }); From 6455fb27613f708d2f66bc186ae323d47f4262c5 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 3 Mar 2015 10:34:16 -0800 Subject: [PATCH 023/129] Release 2.2.4 --- History.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 5195eae..eaad1b9 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +2.2.4 / 2015-03-03 +================== + + * index: fix off-by-one bound checks + 2.2.3 / 2015-02-03 ================== diff --git a/package.json b/package.json index bd439b1..b92c925 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "2.2.3", + "version": "2.2.4", "description": "socket.io protocol parser", "repository": { "type": "git", From 25ebaab56c1e45ad46936ca114ff6923c109d38e Mon Sep 17 00:00:00 2001 From: Ian MacLeod Date: Thu, 2 Apr 2015 14:57:05 -0700 Subject: [PATCH 024/129] Add a LICENSE file To appease the lawyery folk. --- LICENSE | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7e43606 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +(The MIT License) + +Copyright (c) 2014 Guillermo Rauch + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the 'Software'), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From 1ee39a4dd7b926a8a8b64366cdc0bc1400d63ae2 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 14 Jul 2015 17:21:52 -0700 Subject: [PATCH 025/129] fix travis badge --- Readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Readme.md b/Readme.md index 2fa0f82..4f053af 100644 --- a/Readme.md +++ b/Readme.md @@ -1,13 +1,13 @@ # socket.io-parser -[![Build Status](https://secure.travis-ci.org/Automattic/socket.io-parser.svg)](http://travis-ci.org/Automattic/socket.io-parser) +[![Build Status](https://secure.travis-ci.org/socketio/socket.io-parser.svg)](http://travis-ci.org/socketio/socket.io-parser) [![NPM version](https://badge.fury.io/js/socket.io-parser.svg)](http://badge.fury.io/js/socket.io-parser) A socket.io encoder and decoder written in JavaScript complying with version `3` -of [socket.io-protocol](https://github.com/learnboost/socket.io-protocol). -Used by [socket.io](https://github.com/learnboost/socket.io) and -[socket.io-client](https://github.com/learnboost/socket.io-client). +of [socket.io-protocol](https://github.com/socketio/socket.io-protocol). +Used by [socket.io](https://github.com/automattic/socket.io) and +[socket.io-client](https://github.com/automattic/socket.io-client). ## Parser API From 009188fe9832f7e5f1cedfa428da8a2dded576fd Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Thu, 19 Nov 2015 21:37:02 -0500 Subject: [PATCH 026/129] update JSON3 to 3.3.2 Also updates zuul so `npm update` completes. Fixes https://github.com/socketio/socket.io-client/issues/898 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b92c925..f6808d0 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "debug": "0.7.4", - "json3": "3.2.6", + "json3": "3.3.2", "component-emitter": "1.1.2", "isarray": "0.0.1", "benchmark": "1.0.0" @@ -16,7 +16,7 @@ "devDependencies": { "mocha": "1.16.2", "expect.js": "0.2.0", - "zuul": "1.6.3" + "zuul": "3.7.3" }, "scripts": { "test": "make test" From 9e7652ee2dfea453fc8b3a38e8d359e8a9bef989 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 21 Nov 2015 10:42:42 -0800 Subject: [PATCH 027/129] package: bump debug --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f6808d0..489fded 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "url": "https://github.com/Automattic/socket.io-parser.git" }, "dependencies": { - "debug": "0.7.4", + "debug": "2.2.0", "json3": "3.3.2", "component-emitter": "1.1.2", "isarray": "0.0.1", From 913ddb8c6e0524f0aaf2d519ea4a3a9cf9e1e96d Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Sat, 21 Nov 2015 10:45:33 -0800 Subject: [PATCH 028/129] Release 2.2.5 --- History.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index eaad1b9..05e9ac5 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,10 @@ +2.2.5 / 2015-11-21 +================== + + * package: bump debug + * update JSON3 to 3.3.2 + 2.2.4 / 2015-03-03 ================== diff --git a/package.json b/package.json index 489fded..0d8eadd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "2.2.4", + "version": "2.2.5", "description": "socket.io protocol parser", "repository": { "type": "git", From 3b26ac037d20e6a899be8c633cebd5e54521e464 Mon Sep 17 00:00:00 2001 From: nkzawa Date: Wed, 25 Nov 2015 03:20:41 +0900 Subject: [PATCH 029/129] build matrix and ngrok v2 setup --- .travis.yml | 34 ++++++++++++++++++++++++++++++++++ .zuul.yml | 4 ++++ Makefile | 18 +++++++++++++++++- package.json | 3 ++- 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c1c830a..f0d7c3d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,3 +9,37 @@ env: global: - secure: 28HHk1J0H64KNjzmmlxG/Ro0EPuLnhO0rU+kZjjthDHj/FaugIsqjAVQ1Dl6heWV2/MlVzw6nDCyMNiGwiVk0ruZPQ0SYdAKLplrdMtzAihbU3xx+ULFQPLM3SoW0ZFCEpe8dWPGy4WdgW7aLByeel9TJb3vlhAu7p7AvrcO7Fs= - secure: rKEG0Cfw0vkw8thk63RHYG7h8XWYcBlvZ0w1IWpr2dAfnnLMi1palSTrBrFQc77flk7rN00zGIe76FhKydV9r4WWYAUYKPqo4k+9/FkpzjZlNtL49QRoNwC9jmJ8OeUwGowA13gZPyl/5P13wVaKCB0YrKnzz5LHo3Sp7So6J8U= +matrix: + include: + - node_js: '0.12' + env: BROWSER_NAME=chrome BROWSER_VERSION=latest + - node_js: '0.12' + env: BROWSER_NAME=safari BROWSER_VERSION=latest + - node_js: '0.12' + env: BROWSER_NAME=ie BROWSER_VERSION=6 + - node_js: '0.12' + env: BROWSER_NAME=ie BROWSER_VERSION=7 + - node_js: '0.12' + env: BROWSER_NAME=ie BROWSER_VERSION=8 + - node_js: '0.12' + env: BROWSER_NAME=ie BROWSER_VERSION=9 + - node_js: '0.12' + env: BROWSER_NAME=ie BROWSER_VERSION=10 BROWSER_PLATFORM="Windows 2012" + - node_js: '0.12' + env: BROWSER_NAME=ie BROWSER_VERSION=latest BROWSER_PLATFORM="Windows 2012" + - node_js: '0.12' + env: BROWSER_NAME=iphone BROWSER_VERSION=5.1 + - node_js: '0.12' + env: BROWSER_NAME=iphone BROWSER_VERSION=6.1 + - node_js: '0.12' + env: BROWSER_NAME=iphone BROWSER_VERSION=7.1 + - node_js: '0.12' + env: BROWSER_NAME=android BROWSER_VERSION=4.0 + - node_js: '0.12' + env: BROWSER_NAME=android BROWSER_VERSION=4.1 + - node_js: '0.12' + env: BROWSER_NAME=android BROWSER_VERSION=4.2 + - node_js: '0.12' + env: BROWSER_NAME=android BROWSER_VERSION=4.3 + - node_js: '0.12' + env: BROWSER_NAME=android BROWSER_VERSION=4.4 diff --git a/.zuul.yml b/.zuul.yml index 38bc342..d4e53ab 100644 --- a/.zuul.yml +++ b/.zuul.yml @@ -1,4 +1,8 @@ ui: mocha-bdd +tunnel: + type: ngrok + authtoken: 6Aw8vTgcG5EvXdQywVvbh_3fMxvd4Q7dcL2caAHAFjV + proto: tcp browsers: - name: chrome version: 29..latest diff --git a/Makefile b/Makefile index ee0a3b2..80912ed 100644 --- a/Makefile +++ b/Makefile @@ -2,10 +2,26 @@ REPORTER = dot test: + @if [ "x$(BROWSER_NAME)" = "x" ]; then make test-node; else make test-zuul; fi + +test-node: @./node_modules/.bin/mocha \ --reporter $(REPORTER) \ --bail \ test/index.js - @./node_modules/.bin/zuul -- test/index.js + +test-zuul: + @if [ "x$(BROWSER_PLATFORM)" = "x" ]; then \ + ./node_modules/zuul/bin/zuul \ + --browser-name $(BROWSER_NAME) \ + --browser-version $(BROWSER_VERSION) \ + test/index.js; \ + else \ + ./node_modules/zuul/bin/zuul \ + --browser-name $(BROWSER_NAME) \ + --browser-version $(BROWSER_VERSION) \ + --browser-platform "$(BROWSER_PLATFORM)" \ + test/index.js; \ + fi .PHONY: test diff --git a/package.json b/package.json index 0d8eadd..b1842ad 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "devDependencies": { "mocha": "1.16.2", "expect.js": "0.2.0", - "zuul": "3.7.3" + "zuul": "3.7.3", + "zuul-ngrok": "3.2.0" }, "scripts": { "test": "make test" From e1d85d47d5f250d3ffba6588f1215f1be35bcd49 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Tue, 24 Nov 2015 12:57:42 -0800 Subject: [PATCH 030/129] container infra --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index f0d7c3d..3c30212 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: node_js +sudo: false node_js: - 0.10 notifications: From 1a762375ac62b9fb611bc1ac0e0e2b6fd6d668d3 Mon Sep 17 00:00:00 2001 From: nkzawa Date: Thu, 26 Nov 2015 01:08:51 +0900 Subject: [PATCH 031/129] build on Node 4 and 0.12, remove env settings --- .travis.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3c30212..a239df2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,14 +2,12 @@ language: node_js sudo: false node_js: - 0.10 + - 0.12 + - 4 notifications: irc: irc.freenode.org##socket.io git: depth: 1 -env: - global: - - secure: 28HHk1J0H64KNjzmmlxG/Ro0EPuLnhO0rU+kZjjthDHj/FaugIsqjAVQ1Dl6heWV2/MlVzw6nDCyMNiGwiVk0ruZPQ0SYdAKLplrdMtzAihbU3xx+ULFQPLM3SoW0ZFCEpe8dWPGy4WdgW7aLByeel9TJb3vlhAu7p7AvrcO7Fs= - - secure: rKEG0Cfw0vkw8thk63RHYG7h8XWYcBlvZ0w1IWpr2dAfnnLMi1palSTrBrFQc77flk7rN00zGIe76FhKydV9r4WWYAUYKPqo4k+9/FkpzjZlNtL49QRoNwC9jmJ8OeUwGowA13gZPyl/5P13wVaKCB0YrKnzz5LHo3Sp7So6J8U= matrix: include: - node_js: '0.12' From b5f7c7573a4bbe3bff883c4436cdf90628319d24 Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Wed, 25 Nov 2015 10:12:58 -0800 Subject: [PATCH 032/129] Release 2.2.6 --- History.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 05e9ac5..ea14fe9 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +2.2.6 / 2015-11-25 +================== + + * fix the order of exported events [chylli] + 2.2.5 / 2015-11-21 ================== diff --git a/package.json b/package.json index b1842ad..2cef255 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "2.2.5", + "version": "2.2.6", "description": "socket.io protocol parser", "repository": { "type": "git", From 71a1f5f80a4170806d80db89576a48c4df59450a Mon Sep 17 00:00:00 2001 From: nkzawa Date: Wed, 2 Dec 2015 11:03:13 +0900 Subject: [PATCH 033/129] remove browsers setting from .zuul.yml --- .zuul.yml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/.zuul.yml b/.zuul.yml index d4e53ab..2cc4b3c 100644 --- a/.zuul.yml +++ b/.zuul.yml @@ -3,18 +3,3 @@ tunnel: type: ngrok authtoken: 6Aw8vTgcG5EvXdQywVvbh_3fMxvd4Q7dcL2caAHAFjV proto: tcp -browsers: - - name: chrome - version: 29..latest - - name: firefox - version: latest - - name: safari - version: latest - - name: ie - version: 10 - platform: Windows 2012 - - name: ie - version: 9 - version: [6..9, latest] - - name: iphone - version: oldest..latest From b3753c8d5e182d86883127e782976b9b19ca42c0 Mon Sep 17 00:00:00 2001 From: nkzawa Date: Mon, 11 Apr 2016 18:10:40 +0900 Subject: [PATCH 034/129] bump zuul --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2cef255..16f921b 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "devDependencies": { "mocha": "1.16.2", "expect.js": "0.2.0", - "zuul": "3.7.3", + "zuul": "3.10.1", "zuul-ngrok": "3.2.0" }, "scripts": { From aa187cd075d2256b9b905ae5b90c682502e26a0d Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 8 Oct 2016 21:59:36 +0200 Subject: [PATCH 035/129] [chore] Bump zuul to 3.11.0 & zuul-ngrok to 4.0.0 (#41) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 16f921b..e63c03a 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ "devDependencies": { "mocha": "1.16.2", "expect.js": "0.2.0", - "zuul": "3.10.1", - "zuul-ngrok": "3.2.0" + "zuul": "3.11.0", + "zuul-ngrok": "4.0.0" }, "scripts": { "test": "make test" From 85dd3fa1c38926c7922690312e288e5e58128c9e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 8 Oct 2016 22:00:27 +0200 Subject: [PATCH 036/129] [chore] Update zuul browser settings following EOL notices (#42) --- .travis.yml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index a239df2..1849b93 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,19 +26,17 @@ matrix: env: BROWSER_NAME=ie BROWSER_VERSION=10 BROWSER_PLATFORM="Windows 2012" - node_js: '0.12' env: BROWSER_NAME=ie BROWSER_VERSION=latest BROWSER_PLATFORM="Windows 2012" - - node_js: '0.12' - env: BROWSER_NAME=iphone BROWSER_VERSION=5.1 - - node_js: '0.12' - env: BROWSER_NAME=iphone BROWSER_VERSION=6.1 - node_js: '0.12' env: BROWSER_NAME=iphone BROWSER_VERSION=7.1 - node_js: '0.12' - env: BROWSER_NAME=android BROWSER_VERSION=4.0 - - node_js: '0.12' - env: BROWSER_NAME=android BROWSER_VERSION=4.1 + env: BROWSER_NAME=iphone BROWSER_VERSION=8.4 - node_js: '0.12' - env: BROWSER_NAME=android BROWSER_VERSION=4.2 + env: BROWSER_NAME=iphone BROWSER_VERSION=9.2 - node_js: '0.12' env: BROWSER_NAME=android BROWSER_VERSION=4.3 - node_js: '0.12' env: BROWSER_NAME=android BROWSER_VERSION=4.4 + - node_js: '0.12' + env: BROWSER_NAME=android BROWSER_VERSION=5.1 + - node_js: '0.12' + env: BROWSER_NAME=android BROWSER_VERSION=latest From 3fe95b6f67bfba793758c939ef22697193b31eab Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 21 Oct 2016 00:54:52 +0200 Subject: [PATCH 037/129] =?UTF-8?q?[chore]=C2=A0Restrict=20files=20include?= =?UTF-8?q?d=20in=20npm=20package=20(#45)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .npmignore | 5 ----- package.json | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 .npmignore diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 7fbb06f..0000000 --- a/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -build -components - -test diff --git a/package.json b/package.json index e63c03a..0a6197b 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,11 @@ "type": "git", "url": "https://github.com/Automattic/socket.io-parser.git" }, + "files": [ + "binary.js", + "index.js", + "is-buffer.js" + ], "dependencies": { "debug": "2.2.0", "json3": "3.3.2", From 123d30194ae6a3836b3f6a37610a1e57ab3fb405 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 21 Oct 2016 00:55:37 +0200 Subject: [PATCH 038/129] =?UTF-8?q?[chore]=C2=A0Update=20zuul=20browser=20?= =?UTF-8?q?settings=20(#44)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove deprecated iOS 7.1 - Add Firefox and Microsoft Edge browsers - Add latest stable Node.js release --- .travis.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1849b93..0238770 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,10 @@ language: node_js sudo: false node_js: - - 0.10 - - 0.12 - - 4 + - '0.10' + - '0.12' + - '4' + - 'node' notifications: irc: irc.freenode.org##socket.io git: @@ -14,6 +15,8 @@ matrix: env: BROWSER_NAME=chrome BROWSER_VERSION=latest - node_js: '0.12' env: BROWSER_NAME=safari BROWSER_VERSION=latest + - node_js: '0.12' + env: BROWSER_NAME=firefox BROWSER_VERSION=latest BROWSER_PLATFORM="Windows 10" - node_js: '0.12' env: BROWSER_NAME=ie BROWSER_VERSION=6 - node_js: '0.12' @@ -27,7 +30,7 @@ matrix: - node_js: '0.12' env: BROWSER_NAME=ie BROWSER_VERSION=latest BROWSER_PLATFORM="Windows 2012" - node_js: '0.12' - env: BROWSER_NAME=iphone BROWSER_VERSION=7.1 + env: BROWSER_NAME=microsoftedge BROWSER_VERSION=13 BROWSER_PLATFORM="Windows 10" - node_js: '0.12' env: BROWSER_NAME=iphone BROWSER_VERSION=8.4 - node_js: '0.12' From e8f7c32a43039832935d1fb76413a6aad4ef1c73 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 21 Oct 2016 01:03:33 +0200 Subject: [PATCH 039/129] [chore] Remove deprecated isarray dependency (#46) Closes #38 --- binary.js | 7 +++---- index.js | 1 - package.json | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/binary.js b/binary.js index b31f40c..16489f8 100644 --- a/binary.js +++ b/binary.js @@ -4,7 +4,6 @@ * Module requirements */ -var isArray = require('isarray'); var isBuf = require('./is-buffer'); /** @@ -28,7 +27,7 @@ exports.deconstructPacket = function(packet){ var placeholder = { _placeholder: true, num: buffers.length }; buffers.push(data); return placeholder; - } else if (isArray(data)) { + } else if (Array.isArray(data)) { var newData = new Array(data.length); for (var i = 0; i < data.length; i++) { newData[i] = _deconstructPacket(data[i]); @@ -66,7 +65,7 @@ exports.reconstructPacket = function(packet, buffers) { if (data && data._placeholder) { var buf = buffers[data.num]; // appropriate buffer (should be natural order anyway) return buf; - } else if (isArray(data)) { + } else if (Array.isArray(data)) { for (var i = 0; i < data.length; i++) { data[i] = _reconstructPacket(data[i]); } @@ -121,7 +120,7 @@ exports.removeBlobs = function(data, callback) { }; fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer - } else if (isArray(obj)) { // handle array + } else if (Array.isArray(obj)) { // handle array for (var i = 0; i < obj.length; i++) { _removeBlobs(obj[i], i, obj); } diff --git a/index.js b/index.js index 283aaa8..8e63394 100644 --- a/index.js +++ b/index.js @@ -5,7 +5,6 @@ var debug = require('debug')('socket.io-parser'); var json = require('json3'); -var isArray = require('isarray'); var Emitter = require('component-emitter'); var binary = require('./binary'); var isBuf = require('./is-buffer'); diff --git a/package.json b/package.json index 0a6197b..08cf6f2 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,6 @@ "debug": "2.2.0", "json3": "3.3.2", "component-emitter": "1.1.2", - "isarray": "0.0.1", "benchmark": "1.0.0" }, "devDependencies": { From 26699fa968d026be9d1690b88d738392fc65018c Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 21 Oct 2016 01:03:53 +0200 Subject: [PATCH 040/129] [chore] Make the build status badge point towards master (#47) --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 4f053af..2463bc7 100644 --- a/Readme.md +++ b/Readme.md @@ -1,7 +1,7 @@ # socket.io-parser -[![Build Status](https://secure.travis-ci.org/socketio/socket.io-parser.svg)](http://travis-ci.org/socketio/socket.io-parser) +[![Build Status](https://secure.travis-ci.org/socketio/socket.io-parser.svg?branch=master)](http://travis-ci.org/socketio/socket.io-parser) [![NPM version](https://badge.fury.io/js/socket.io-parser.svg)](http://badge.fury.io/js/socket.io-parser) A socket.io encoder and decoder written in JavaScript complying with version `3` From 9b479bcee657f7efe9ec4db617ae1b27d69da1e7 Mon Sep 17 00:00:00 2001 From: Tom Atkinson Date: Fri, 21 Oct 2016 01:07:30 +0200 Subject: [PATCH 041/129] [perf] Split try catch into separate function (#40) --- index.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 8e63394..165a4a6 100644 --- a/index.js +++ b/index.js @@ -322,17 +322,22 @@ function decodeString(str) { // look up json data if (str.charAt(++i)) { - try { - p.data = json.parse(str.substr(i)); - } catch(e){ - return error(); - } + p = tryParse(p, str.substr(i)); } debug('decoded %s as %j', str, p); return p; } +function tryParse(p, str) { + try { + p.data = json.parse(str); + } catch(e){ + return error(); + } + return p; +}; + /** * Deallocates a parser's resources * From 972d0aa93c3ecddd7cbd923ffe785b01bb46ec05 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 21 Oct 2016 01:10:04 +0200 Subject: [PATCH 042/129] [chore] Move benchmark to dev dependencies (#48) --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 08cf6f2..b599f7f 100644 --- a/package.json +++ b/package.json @@ -14,12 +14,12 @@ "dependencies": { "debug": "2.2.0", "json3": "3.3.2", - "component-emitter": "1.1.2", - "benchmark": "1.0.0" + "component-emitter": "1.1.2" }, "devDependencies": { - "mocha": "1.16.2", + "benchmark": "1.0.0", "expect.js": "0.2.0", + "mocha": "1.16.2", "zuul": "3.11.0", "zuul-ngrok": "4.0.0" }, From baf384cd6cbcdf716ec35ed2187cd755c7e5e9d2 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 21 Oct 2016 01:32:51 +0200 Subject: [PATCH 043/129] [chore] Release 2.3.0 (#49) --- History.md | 14 ++++++++++++++ package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index ea14fe9..1bf3dd1 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,18 @@ +2.3.0 / 2016-10-21 +================== + + * [perf] Split try catch into separate function (#40) + * [chore] remove browsers setting from .zuul.yml (#34) + * [chore] bump zuul (#37) + * [chore] Bump zuul to 3.11.0 & zuul-ngrok to 4.0.0 (#41) + * [chore] Update zuul browser settings following EOL notices (#42) + * [chore] Restrict files included in npm package (#45) + * [chore] Update zuul browser settings (#44) + * [chore] Remove deprecated isarray dependency (#46) + * [chore] Make the build status badge point towards master (#47) + * [chore] Move benchmark to dev dependencies (#48) + 2.2.6 / 2015-11-25 ================== diff --git a/package.json b/package.json index b599f7f..287df34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "2.2.6", + "version": "2.3.0", "description": "socket.io protocol parser", "repository": { "type": "git", From 0e2dcb7281306a89088a4b7957c7154504aad996 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 24 Oct 2016 02:29:22 +0200 Subject: [PATCH 044/129] [chore] Revert "Remove deprecated isarray dependency" (#50) The fallback is needed for IE6, IE7 and IE8. --- binary.js | 7 ++++--- package.json | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/binary.js b/binary.js index 16489f8..b31f40c 100644 --- a/binary.js +++ b/binary.js @@ -4,6 +4,7 @@ * Module requirements */ +var isArray = require('isarray'); var isBuf = require('./is-buffer'); /** @@ -27,7 +28,7 @@ exports.deconstructPacket = function(packet){ var placeholder = { _placeholder: true, num: buffers.length }; buffers.push(data); return placeholder; - } else if (Array.isArray(data)) { + } else if (isArray(data)) { var newData = new Array(data.length); for (var i = 0; i < data.length; i++) { newData[i] = _deconstructPacket(data[i]); @@ -65,7 +66,7 @@ exports.reconstructPacket = function(packet, buffers) { if (data && data._placeholder) { var buf = buffers[data.num]; // appropriate buffer (should be natural order anyway) return buf; - } else if (Array.isArray(data)) { + } else if (isArray(data)) { for (var i = 0; i < data.length; i++) { data[i] = _reconstructPacket(data[i]); } @@ -120,7 +121,7 @@ exports.removeBlobs = function(data, callback) { }; fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer - } else if (Array.isArray(obj)) { // handle array + } else if (isArray(obj)) { // handle array for (var i = 0; i < obj.length; i++) { _removeBlobs(obj[i], i, obj); } diff --git a/package.json b/package.json index 287df34..a715ea9 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "dependencies": { "debug": "2.2.0", "json3": "3.3.2", - "component-emitter": "1.1.2" + "component-emitter": "1.1.2", + "isarray": "0.0.1" }, "devDependencies": { "benchmark": "1.0.0", From 64455b432c9af2f9692a0eb845b17129eec0442a Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 24 Oct 2016 02:30:51 +0200 Subject: [PATCH 045/129] [chore] Release 2.3.1 (#51) --- History.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 1bf3dd1..cdceb39 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +2.3.1 / 2016-10-24 +================== + +* [chore] Revert "Remove deprecated isarray dependency" (#50) + 2.3.0 / 2016-10-21 ================== diff --git a/package.json b/package.json index a715ea9..94788e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "2.3.0", + "version": "2.3.1", "description": "socket.io protocol parser", "repository": { "type": "git", From 97721957b9f5927a0c0c6f8914ffd4600243f59a Mon Sep 17 00:00:00 2001 From: Gatsbill Date: Sat, 17 Dec 2016 02:32:21 +0100 Subject: [PATCH 046/129] [refactor] Use strict equality when possible (#52) --- binary.js | 6 +++--- index.js | 26 +++++++++++++------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/binary.js b/binary.js index b31f40c..d2c6d69 100644 --- a/binary.js +++ b/binary.js @@ -34,7 +34,7 @@ exports.deconstructPacket = function(packet){ newData[i] = _deconstructPacket(data[i]); } return newData; - } else if ('object' == typeof data && !(data instanceof Date)) { + } else if (typeof data === 'object' && !(data instanceof Date)) { var newData = {}; for (var key in data) { newData[key] = _deconstructPacket(data[key]); @@ -71,7 +71,7 @@ exports.reconstructPacket = function(packet, buffers) { data[i] = _reconstructPacket(data[i]); } return data; - } else if (data && 'object' == typeof data) { + } else if (data && 'object' === typeof data) { for (var key in data) { data[key] = _reconstructPacket(data[key]); } @@ -125,7 +125,7 @@ exports.removeBlobs = function(data, callback) { for (var i = 0; i < obj.length; i++) { _removeBlobs(obj[i], i, obj); } - } else if (obj && 'object' == typeof obj && !isBuf(obj)) { // and object + } else if (obj && 'object' === typeof obj && !isBuf(obj)) { // and object for (var key in obj) { _removeBlobs(obj[key], key, obj); } diff --git a/index.js b/index.js index 165a4a6..f453c0e 100644 --- a/index.js +++ b/index.js @@ -126,7 +126,7 @@ function Encoder() {} Encoder.prototype.encode = function(obj, callback){ debug('encoding packet %j', obj); - if (exports.BINARY_EVENT == obj.type || exports.BINARY_ACK == obj.type) { + if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) { encodeAsBinary(obj, callback); } else { @@ -151,14 +151,14 @@ function encodeAsString(obj) { str += obj.type; // attachments if we have them - if (exports.BINARY_EVENT == obj.type || exports.BINARY_ACK == obj.type) { + if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) { str += obj.attachments; str += '-'; } // if we have a namespace other than `/` // we append it followed by a comma `,` - if (obj.nsp && '/' != obj.nsp) { + if (obj.nsp && '/' !== obj.nsp) { nsp = true; str += obj.nsp; } @@ -233,9 +233,9 @@ Emitter(Decoder.prototype); Decoder.prototype.add = function(obj) { var packet; - if ('string' == typeof obj) { + if (typeof obj === 'string') { packet = decodeString(obj); - if (exports.BINARY_EVENT == packet.type || exports.BINARY_ACK == packet.type) { // binary packet's json + if (exports.BINARY_EVENT === packet.type || exports.BINARY_ACK === packet.type) { // binary packet's json this.reconstructor = new BinaryReconstructor(packet); // no attachments, labeled binary but no binary data to follow @@ -281,24 +281,24 @@ function decodeString(str) { // look up attachments if type binary if (exports.BINARY_EVENT == p.type || exports.BINARY_ACK == p.type) { var buf = ''; - while (str.charAt(++i) != '-') { + while (str.charAt(++i) !== '-') { buf += str.charAt(i); if (i == str.length) break; } - if (buf != Number(buf) || str.charAt(i) != '-') { + if (buf != Number(buf) || str.charAt(i) !== '-') { throw new Error('Illegal attachments'); } p.attachments = Number(buf); } // look up namespace (if any) - if ('/' == str.charAt(i + 1)) { + if ('/' === str.charAt(i + 1)) { p.nsp = ''; while (++i) { var c = str.charAt(i); - if (',' == c) break; + if (',' === c) break; p.nsp += c; - if (i == str.length) break; + if (i === str.length) break; } } else { p.nsp = '/'; @@ -315,7 +315,7 @@ function decodeString(str) { break; } p.id += str.charAt(i); - if (i == str.length) break; + if (i === str.length) break; } p.id = Number(p.id); } @@ -336,7 +336,7 @@ function tryParse(p, str) { return error(); } return p; -}; +} /** * Deallocates a parser's resources @@ -377,7 +377,7 @@ function BinaryReconstructor(packet) { BinaryReconstructor.prototype.takeBinaryData = function(binData) { this.buffers.push(binData); - if (this.buffers.length == this.reconPack.attachments) { // done with buffer list + if (this.buffers.length === this.reconPack.attachments) { // done with buffer list var packet = binary.reconstructPacket(this.reconPack, this.buffers); this.finishedReconstruction(); return packet; From 9072faa1e12ac71bfc3d3742d2d31800733b688c Mon Sep 17 00:00:00 2001 From: Gatsbill Date: Sat, 17 Dec 2016 02:33:05 +0100 Subject: [PATCH 047/129] =?UTF-8?q?[refactor]=C2=A0Remove=20unused=20var?= =?UTF-8?q?=20(#53)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- binary.js | 1 - 1 file changed, 1 deletion(-) diff --git a/binary.js b/binary.js index d2c6d69..c20c91d 100644 --- a/binary.js +++ b/binary.js @@ -60,7 +60,6 @@ exports.deconstructPacket = function(packet){ */ exports.reconstructPacket = function(packet, buffers) { - var curPlaceHolder = 0; function _reconstructPacket(data) { if (data && data._placeholder) { From aed82572ba4769d852ba3c3d9710f46d1c8f519e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 17 Dec 2016 03:33:44 +0100 Subject: [PATCH 048/129] =?UTF-8?q?[chore]=C2=A0Bump=20dependencies=20(#56?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - bump debug to version 2.3.3 - bump component-emitter to version 1.2.1 - bump benchmark to version 2.1.2 - bump expect.js to version 0.3.1 - bump mocha to version 3.2.0 - bump zuul to version 3.11.1 --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 94788e2..09639ce 100644 --- a/package.json +++ b/package.json @@ -12,16 +12,16 @@ "is-buffer.js" ], "dependencies": { - "debug": "2.2.0", + "debug": "2.3.3", "json3": "3.3.2", - "component-emitter": "1.1.2", + "component-emitter": "1.2.1", "isarray": "0.0.1" }, "devDependencies": { - "benchmark": "1.0.0", - "expect.js": "0.2.0", - "mocha": "1.16.2", - "zuul": "3.11.0", + "benchmark": "2.1.2", + "expect.js": "0.3.1", + "mocha": "3.2.0", + "zuul": "3.11.1", "zuul-ngrok": "4.0.0" }, "scripts": { From c2d0a08d7f8c56567b812e1a05c62c4c593439fc Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 17 Dec 2016 03:34:00 +0100 Subject: [PATCH 049/129] =?UTF-8?q?[refactor]=C2=A0Remove=20useless=20vari?= =?UTF-8?q?able=20(#55)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/index.js b/index.js index f453c0e..81273ee 100644 --- a/index.js +++ b/index.js @@ -145,7 +145,6 @@ Encoder.prototype.encode = function(obj, callback){ function encodeAsString(obj) { var str = ''; - var nsp = false; // first is type str += obj.type; @@ -159,22 +158,17 @@ function encodeAsString(obj) { // if we have a namespace other than `/` // we append it followed by a comma `,` if (obj.nsp && '/' !== obj.nsp) { - nsp = true; str += obj.nsp; + str += ','; } // immediately followed by the id if (null != obj.id) { - if (nsp) { - str += ','; - nsp = false; - } str += obj.id; } // json data if (null != obj.data) { - if (nsp) str += ','; str += json.stringify(obj.data); } From 5ac691e7e4f5c177d03283c14daee18523bd7915 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 30 Dec 2016 17:54:42 +0100 Subject: [PATCH 050/129] [chore] Update zuul config to speed up tests in browser (#58) --- .travis.yml | 34 ++-------------------------------- .zuul.yml | 5 ----- Makefile | 16 +++------------- package.json | 1 + zuul.config.js | 29 +++++++++++++++++++++++++++++ 5 files changed, 35 insertions(+), 50 deletions(-) delete mode 100644 .zuul.yml create mode 100644 zuul.config.js diff --git a/.travis.yml b/.travis.yml index 0238770..f238e60 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,35 +11,5 @@ git: depth: 1 matrix: include: - - node_js: '0.12' - env: BROWSER_NAME=chrome BROWSER_VERSION=latest - - node_js: '0.12' - env: BROWSER_NAME=safari BROWSER_VERSION=latest - - node_js: '0.12' - env: BROWSER_NAME=firefox BROWSER_VERSION=latest BROWSER_PLATFORM="Windows 10" - - node_js: '0.12' - env: BROWSER_NAME=ie BROWSER_VERSION=6 - - node_js: '0.12' - env: BROWSER_NAME=ie BROWSER_VERSION=7 - - node_js: '0.12' - env: BROWSER_NAME=ie BROWSER_VERSION=8 - - node_js: '0.12' - env: BROWSER_NAME=ie BROWSER_VERSION=9 - - node_js: '0.12' - env: BROWSER_NAME=ie BROWSER_VERSION=10 BROWSER_PLATFORM="Windows 2012" - - node_js: '0.12' - env: BROWSER_NAME=ie BROWSER_VERSION=latest BROWSER_PLATFORM="Windows 2012" - - node_js: '0.12' - env: BROWSER_NAME=microsoftedge BROWSER_VERSION=13 BROWSER_PLATFORM="Windows 10" - - node_js: '0.12' - env: BROWSER_NAME=iphone BROWSER_VERSION=8.4 - - node_js: '0.12' - env: BROWSER_NAME=iphone BROWSER_VERSION=9.2 - - node_js: '0.12' - env: BROWSER_NAME=android BROWSER_VERSION=4.3 - - node_js: '0.12' - env: BROWSER_NAME=android BROWSER_VERSION=4.4 - - node_js: '0.12' - env: BROWSER_NAME=android BROWSER_VERSION=5.1 - - node_js: '0.12' - env: BROWSER_NAME=android BROWSER_VERSION=latest + - node_js: 'node' + env: BROWSERS=1 diff --git a/.zuul.yml b/.zuul.yml deleted file mode 100644 index 2cc4b3c..0000000 --- a/.zuul.yml +++ /dev/null @@ -1,5 +0,0 @@ -ui: mocha-bdd -tunnel: - type: ngrok - authtoken: 6Aw8vTgcG5EvXdQywVvbh_3fMxvd4Q7dcL2caAHAFjV - proto: tcp diff --git a/Makefile b/Makefile index 80912ed..2942f60 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ REPORTER = dot test: - @if [ "x$(BROWSER_NAME)" = "x" ]; then make test-node; else make test-zuul; fi + @if [ "x$(BROWSERS)" = "x" ]; then make test-node; else make test-zuul; fi test-node: @./node_modules/.bin/mocha \ @@ -11,17 +11,7 @@ test-node: test/index.js test-zuul: - @if [ "x$(BROWSER_PLATFORM)" = "x" ]; then \ - ./node_modules/zuul/bin/zuul \ - --browser-name $(BROWSER_NAME) \ - --browser-version $(BROWSER_VERSION) \ - test/index.js; \ - else \ - ./node_modules/zuul/bin/zuul \ - --browser-name $(BROWSER_NAME) \ - --browser-version $(BROWSER_VERSION) \ - --browser-platform "$(BROWSER_PLATFORM)" \ - test/index.js; \ - fi + @./node_modules/zuul/bin/zuul \ + test/index.js .PHONY: test diff --git a/package.json b/package.json index 09639ce..0f98c47 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "benchmark": "2.1.2", "expect.js": "0.3.1", "mocha": "3.2.0", + "socket.io-browsers": "^1.0.0", "zuul": "3.11.1", "zuul-ngrok": "4.0.0" }, diff --git a/zuul.config.js b/zuul.config.js new file mode 100644 index 0000000..46d3108 --- /dev/null +++ b/zuul.config.js @@ -0,0 +1,29 @@ +'use strict'; + +var browsers = require('socket.io-browsers'); + +var zuulConfig = module.exports = { + ui: 'mocha-bdd', + + // test on localhost by default + local: true, + + concurrency: 2, // ngrok only accepts two tunnels by default + // if browser does not sends output in 120s since last output: + // stop testing, something is wrong + browser_output_timeout: 120 * 1000, + browser_open_timeout: 60 * 4 * 1000, + // we want to be notified something is wrong asap, so no retry + browser_retries: 1 +}; + +if (process.env.CI === 'true') { + zuulConfig.local = false; + zuulConfig.tunnel = { + type: 'ngrok', + bind_tls: true + }; +} + +var isPullRequest = process.env.TRAVIS_PULL_REQUEST && process.env.TRAVIS_PULL_REQUEST !== 'false'; +zuulConfig.browsers = isPullRequest ? browsers.pullRequest : browsers.all; From 2314c10f4fcb2917f3ae936e06f09c962d951d9b Mon Sep 17 00:00:00 2001 From: Gatsbill Date: Fri, 30 Dec 2016 22:25:49 +0100 Subject: [PATCH 051/129] [perf] Small optimisations (#57) --- binary.js | 90 +++++++++++++++++++++++++++---------------------------- index.js | 20 ++++++------- 2 files changed, 53 insertions(+), 57 deletions(-) diff --git a/binary.js b/binary.js index c20c91d..38a3578 100644 --- a/binary.js +++ b/binary.js @@ -17,39 +17,38 @@ var isBuf = require('./is-buffer'); * @api public */ -exports.deconstructPacket = function(packet){ +exports.deconstructPacket = function(packet) { var buffers = []; var packetData = packet.data; - - function _deconstructPacket(data) { - if (!data) return data; - - if (isBuf(data)) { - var placeholder = { _placeholder: true, num: buffers.length }; - buffers.push(data); - return placeholder; - } else if (isArray(data)) { - var newData = new Array(data.length); - for (var i = 0; i < data.length; i++) { - newData[i] = _deconstructPacket(data[i]); - } - return newData; - } else if (typeof data === 'object' && !(data instanceof Date)) { - var newData = {}; - for (var key in data) { - newData[key] = _deconstructPacket(data[key]); - } - return newData; - } - return data; - } - var pack = packet; - pack.data = _deconstructPacket(packetData); + pack.data = _deconstructPacket(packetData, buffers); pack.attachments = buffers.length; // number of binary 'attachments' return {packet: pack, buffers: buffers}; }; +function _deconstructPacket(data, buffers) { + if (!data) return data; + + if (isBuf(data)) { + var placeholder = { _placeholder: true, num: buffers.length }; + buffers.push(data); + return placeholder; + } else if (isArray(data)) { + var newData = new Array(data.length); + for (var i = 0; i < data.length; i++) { + newData[i] = _deconstructPacket(data[i], buffers); + } + return newData; + } else if (typeof data === 'object' && !(data instanceof Date)) { + var newData = {}; + for (var key in data) { + newData[key] = _deconstructPacket(data[key], buffers); + } + return newData; + } + return data; +} + /** * Reconstructs a binary packet from its placeholder packet and buffers * @@ -60,29 +59,28 @@ exports.deconstructPacket = function(packet){ */ exports.reconstructPacket = function(packet, buffers) { + packet.data = _reconstructPacket(packet.data, buffers); + packet.attachments = undefined; // no longer useful + return packet; +}; - function _reconstructPacket(data) { - if (data && data._placeholder) { - var buf = buffers[data.num]; // appropriate buffer (should be natural order anyway) - return buf; - } else if (isArray(data)) { - for (var i = 0; i < data.length; i++) { - data[i] = _reconstructPacket(data[i]); - } - return data; - } else if (data && 'object' === typeof data) { - for (var key in data) { - data[key] = _reconstructPacket(data[key]); - } - return data; +function _reconstructPacket(data, buffers) { + if (!data) return data; + + if (data && data._placeholder) { + return buffers[data.num]; // appropriate buffer (should be natural order anyway) + } else if (isArray(data)) { + for (var i = 0; i < data.length; i++) { + data[i] = _reconstructPacket(data[i], buffers); + } + } else if (typeof data === 'object') { + for (var key in data) { + data[key] = _reconstructPacket(data[key], buffers); } - return data; } - packet.data = _reconstructPacket(packet.data); - packet.attachments = undefined; // no longer useful - return packet; -}; + return data; +} /** * Asynchronously removes Blobs or Files from data via @@ -124,7 +122,7 @@ exports.removeBlobs = function(data, callback) { for (var i = 0; i < obj.length; i++) { _removeBlobs(obj[i], i, obj); } - } else if (obj && 'object' === typeof obj && !isBuf(obj)) { // and object + } else if (typeof obj === 'object' && !isBuf(obj)) { // and object for (var key in obj) { _removeBlobs(obj[key], key, obj); } diff --git a/index.js b/index.js index 81273ee..902d188 100644 --- a/index.js +++ b/index.js @@ -144,22 +144,19 @@ Encoder.prototype.encode = function(obj, callback){ */ function encodeAsString(obj) { - var str = ''; // first is type - str += obj.type; + var str = '' + obj.type; // attachments if we have them if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) { - str += obj.attachments; - str += '-'; + str += obj.attachments + '-'; } // if we have a namespace other than `/` // we append it followed by a comma `,` if (obj.nsp && '/' !== obj.nsp) { - str += obj.nsp; - str += ','; + str += obj.nsp + ','; } // immediately followed by the id @@ -265,15 +262,16 @@ Decoder.prototype.add = function(obj) { */ function decodeString(str) { - var p = {}; var i = 0; - // look up type - p.type = Number(str.charAt(0)); + var p = { + type: Number(str.charAt(0)) + }; + if (null == exports.types[p.type]) return error(); // look up attachments if type binary - if (exports.BINARY_EVENT == p.type || exports.BINARY_ACK == p.type) { + if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) { var buf = ''; while (str.charAt(++i) !== '-') { buf += str.charAt(i); @@ -390,7 +388,7 @@ BinaryReconstructor.prototype.finishedReconstruction = function() { this.buffers = []; }; -function error(data){ +function error() { return { type: exports.ERROR, data: 'parser error' From 9ce9a98dd0969328e34146d287e82c5500614f27 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 30 Dec 2016 22:43:07 +0100 Subject: [PATCH 052/129] [chore] Release 2.3.2 (#59) --- History.md | 10 ++++++++++ package.json | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index cdceb39..e511179 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,14 @@ +2.3.2 / 2016-12-30 +================== + + * [perf] Small optimisations (#57) + * [chore] Update zuul config to speed up tests in browser (#58) + * [refactor] Remove useless variable (#55) + * [chore] Bump dependencies (#56) + * [refactor] Remove unused var (#53) + * [refactor] Use strict equality when possible (#52) + 2.3.1 / 2016-10-24 ================== diff --git a/package.json b/package.json index 0f98c47..b7b1fff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "2.3.1", + "version": "2.3.2", "description": "socket.io protocol parser", "repository": { "type": "git", From e39f5a8c6a7822447a61dae8d373ab230993f44d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jimmy=20Karl=20Roland=20W=C3=A4rting?= Date: Mon, 3 Apr 2017 23:15:24 +0200 Subject: [PATCH 053/129] [chore] Use native JSON and drop support for older nodejs versions (#64) --- .travis.yml | 2 -- index.js | 5 ++--- package.json | 1 - 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index f238e60..cde1311 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,6 @@ language: node_js sudo: false node_js: - - '0.10' - - '0.12' - '4' - 'node' notifications: diff --git a/index.js b/index.js index 902d188..65ee2ad 100644 --- a/index.js +++ b/index.js @@ -4,7 +4,6 @@ */ var debug = require('debug')('socket.io-parser'); -var json = require('json3'); var Emitter = require('component-emitter'); var binary = require('./binary'); var isBuf = require('./is-buffer'); @@ -166,7 +165,7 @@ function encodeAsString(obj) { // json data if (null != obj.data) { - str += json.stringify(obj.data); + str += JSON.stringify(obj.data); } debug('encoded %j as %s', obj, str); @@ -323,7 +322,7 @@ function decodeString(str) { function tryParse(p, str) { try { - p.data = json.parse(str); + p.data = JSON.parse(str); } catch(e){ return error(); } diff --git a/package.json b/package.json index b7b1fff..de94959 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ ], "dependencies": { "debug": "2.3.3", - "json3": "3.3.2", "component-emitter": "1.2.1", "isarray": "0.0.1" }, From e295b9b1c25180ed942d670a40ede15030a3c77c Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 3 Apr 2017 23:48:59 +0200 Subject: [PATCH 054/129] [chore] Bump isarray to version 2.0.1 (#65) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index de94959..eb3474e 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dependencies": { "debug": "2.3.3", "component-emitter": "1.2.1", - "isarray": "0.0.1" + "isarray": "2.0.1" }, "devDependencies": { "benchmark": "2.1.2", From 817adca41d77d8b717fcfae622e89b6fc6c50a92 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 3 Apr 2017 23:50:16 +0200 Subject: [PATCH 055/129] [chore] Release 3.0.0 --- History.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index e511179..ff19401 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,10 @@ +3.0.0 / 2017-04-04 +================== + + * [chore] Bump isarray to version 2.0.1 (#65) + * [chore] Use native JSON and drop support for older nodejs versions (#64) + 2.3.2 / 2016-12-30 ================== diff --git a/package.json b/package.json index eb3474e..a10abc8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "2.3.2", + "version": "3.0.0", "description": "socket.io protocol parser", "repository": { "type": "git", From f44256c523ac8f0219ffd20d8fd73a0e2b445f28 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 24 Apr 2017 23:20:51 +0200 Subject: [PATCH 056/129] [feat] Move binary detection to the parser (#66) --- index.js | 5 +++++ package.json | 1 + 2 files changed, 6 insertions(+) diff --git a/index.js b/index.js index 65ee2ad..ea206ea 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,7 @@ var debug = require('debug')('socket.io-parser'); var Emitter = require('component-emitter'); +var hasBin = require('has-binary2'); var binary = require('./binary'); var isBuf = require('./is-buffer'); @@ -123,6 +124,10 @@ function Encoder() {} */ Encoder.prototype.encode = function(obj, callback){ + if ((obj.type === exports.EVENT || obj.type === exports.ACK) && hasBin(obj.data)) { + obj.type = obj.type === exports.EVENT ? exports.BINARY_EVENT : exports.BINARY_ACK; + } + debug('encoding packet %j', obj); if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) { diff --git a/package.json b/package.json index a10abc8..74dd27a 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dependencies": { "debug": "2.3.3", "component-emitter": "1.2.1", + "has-binary2": "1.0.1", "isarray": "2.0.1" }, "devDependencies": { From 403b858a8d719c9c69d428a99006475d8d672d1f Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 24 Apr 2017 23:32:13 +0200 Subject: [PATCH 057/129] [chore] Bump debug to version 2.6.4 (#67) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 74dd27a..fdae79a 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "is-buffer.js" ], "dependencies": { - "debug": "2.3.3", + "debug": "~2.6.4", "component-emitter": "1.2.1", "has-binary2": "1.0.1", "isarray": "2.0.1" From 8e5465de2f264f856a3fd063248d2006d650c5e1 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 24 Apr 2017 23:33:46 +0200 Subject: [PATCH 058/129] [chore] Release 3.1.0 --- History.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index ff19401..3c9eb7b 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,10 @@ +3.1.0 / 2017-04-24 +================== + + * [chore] Bump debug to version 2.6.4 (#67) + * [feat] Move binary detection to the parser (#66) + 3.0.0 / 2017-04-04 ================== diff --git a/package.json b/package.json index fdae79a..c658a90 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "3.0.0", + "version": "3.1.0", "description": "socket.io protocol parser", "repository": { "type": "git", From 2f31a4e8f782e4d6ba5b1e0d27af71cabb693209 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 25 Apr 2017 00:21:17 +0200 Subject: [PATCH 059/129] [fix] Ensure globals are functions before running `instanceof` (#68) Following https://github.com/socketio/has-binary/pull/4. --- binary.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/binary.js b/binary.js index 38a3578..89e52cf 100644 --- a/binary.js +++ b/binary.js @@ -97,8 +97,8 @@ exports.removeBlobs = function(data, callback) { if (!obj) return obj; // convert any blob - if ((global.Blob && obj instanceof Blob) || - (global.File && obj instanceof File)) { + if ((typeof global.Blob === 'function' && obj instanceof Blob) || + (typeof global.File === 'function' && obj instanceof File)) { pendingBlobs++; // async filereader From eaee5d58c4fb3e593131502bb389ea28ab8d26f1 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 25 Apr 2017 00:22:17 +0200 Subject: [PATCH 060/129] [chore] Release 3.1.1 --- History.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 3c9eb7b..07fa20a 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +3.1.1 / 2017-04-25 +================== + + * [fix] Ensure globals are functions before running `instanceof` (#68) + 3.1.0 / 2017-04-24 ================== diff --git a/package.json b/package.json index c658a90..e6f07f6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "3.1.0", + "version": "3.1.1", "description": "socket.io protocol parser", "repository": { "type": "git", From b4f849a6feb783be5f52254a2278cdc8121cdc66 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 26 Apr 2017 21:43:22 +0200 Subject: [PATCH 061/129] =?UTF-8?q?[fix]=C2=A0Fix=20Blob=20detection=20for?= =?UTF-8?q?=20iOS=208/9=20(#69)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- binary.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/binary.js b/binary.js index 89e52cf..1a530c7 100644 --- a/binary.js +++ b/binary.js @@ -6,6 +6,9 @@ var isArray = require('isarray'); var isBuf = require('./is-buffer'); +var toString = Object.prototype.toString; +var withNativeBlob = typeof global.Blob === 'function' || toString.call(global.Blob) === '[object BlobConstructor]'; +var withNativeFile = typeof global.File === 'function' || toString.call(global.File) === '[object FileConstructor]'; /** * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder. @@ -97,8 +100,8 @@ exports.removeBlobs = function(data, callback) { if (!obj) return obj; // convert any blob - if ((typeof global.Blob === 'function' && obj instanceof Blob) || - (typeof global.File === 'function' && obj instanceof File)) { + if ((withNativeBlob && obj instanceof Blob) || + (withNativeFile && obj instanceof File)) { pendingBlobs++; // async filereader From 425391ace9cebbbfc3a6f6d25f707eae956fdbbe Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 27 Apr 2017 23:06:57 +0200 Subject: [PATCH 062/129] =?UTF-8?q?[chore]=C2=A0Bump=20has-binary2=20to=20?= =?UTF-8?q?version=201.0.2=20(#70)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e6f07f6..0403c45 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dependencies": { "debug": "~2.6.4", "component-emitter": "1.2.1", - "has-binary2": "1.0.1", + "has-binary2": "~1.0.2", "isarray": "2.0.1" }, "devDependencies": { From f9c3549dd17df095b0806086df3f4834ddc98d45 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 27 Apr 2017 23:46:00 +0200 Subject: [PATCH 063/129] [chore] Release 3.1.2 --- History.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 07fa20a..17e16a9 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,10 @@ +3.1.2 / 2017-04-27 +================== + + * [chore] Bump has-binary2 to version 1.0.2 (#70) + * [fix] Fix Blob detection for iOS 8/9 (#69) + 3.1.1 / 2017-04-25 ================== diff --git a/package.json b/package.json index 0403c45..2d1284f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "3.1.1", + "version": "3.1.2", "description": "socket.io protocol parser", "repository": { "type": "git", From dd164e6a5ff2f6038bdd8e7fc24a19d27c439880 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 18 Feb 2018 11:50:26 +0100 Subject: [PATCH 064/129] [chore] Bump debug to version 3.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2d1284f..d040a09 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "is-buffer.js" ], "dependencies": { - "debug": "~2.6.4", + "debug": "~3.1.0", "component-emitter": "1.2.1", "has-binary2": "~1.0.2", "isarray": "2.0.1" From 88225783f7bcbfd874d9b61449da4a25965a79c8 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 25 Feb 2018 09:04:02 +0100 Subject: [PATCH 065/129] [fix] Use ArrayBuffer.isView to check for typed arrays (#82) --- is-buffer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/is-buffer.js b/is-buffer.js index 977df88..520ed75 100644 --- a/is-buffer.js +++ b/is-buffer.js @@ -9,5 +9,5 @@ module.exports = isBuf; function isBuf(obj) { return (global.Buffer && global.Buffer.isBuffer(obj)) || - (global.ArrayBuffer && obj instanceof ArrayBuffer); + (global.ArrayBuffer && (obj instanceof ArrayBuffer || ArrayBuffer.isView(obj))); } From f0a7df10599d9f6ff392bdfb8352489802220fd3 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 25 Feb 2018 09:05:16 +0100 Subject: [PATCH 066/129] [fix] Ensure packet data is an array (#83) Related: https://github.com/socketio/socket.io/pull/3140 --- index.js | 24 ++++++++++++++++-------- test/arraybuffer.js | 6 +++--- test/buffer.js | 2 +- test/parser.js | 19 +++++++++++++++++++ 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/index.js b/index.js index ea206ea..f71ff27 100644 --- a/index.js +++ b/index.js @@ -7,6 +7,7 @@ var debug = require('debug')('socket.io-parser'); var Emitter = require('component-emitter'); var hasBin = require('has-binary2'); var binary = require('./binary'); +var isArray = require('isarray'); var isBuf = require('./is-buffer'); /** @@ -272,7 +273,9 @@ function decodeString(str) { type: Number(str.charAt(0)) }; - if (null == exports.types[p.type]) return error(); + if (null == exports.types[p.type]) { + return error('unknown packet type ' + p.type); + } // look up attachments if type binary if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) { @@ -318,20 +321,25 @@ function decodeString(str) { // look up json data if (str.charAt(++i)) { - p = tryParse(p, str.substr(i)); + var payload = tryParse(str.substr(i)); + var isPayloadValid = payload !== false && (p.type === exports.ERROR || isArray(payload)); + if (isPayloadValid) { + p.data = payload; + } else { + return error('invalid payload'); + } } debug('decoded %s as %j', str, p); return p; } -function tryParse(p, str) { +function tryParse(str) { try { - p.data = JSON.parse(str); + return JSON.parse(str); } catch(e){ - return error(); + return false; } - return p; } /** @@ -392,9 +400,9 @@ BinaryReconstructor.prototype.finishedReconstruction = function() { this.buffers = []; }; -function error() { +function error(msg) { return { type: exports.ERROR, - data: 'parser error' + data: 'parser error: ' + msg }; } diff --git a/test/arraybuffer.js b/test/arraybuffer.js index 0ba4c04..a15c1e7 100644 --- a/test/arraybuffer.js +++ b/test/arraybuffer.js @@ -7,7 +7,7 @@ describe('parser', function() { it('encodes an ArrayBuffer', function() { var packet = { type: parser.BINARY_EVENT, - data: new ArrayBuffer(2), + data: ['a', new ArrayBuffer(2)], id: 0, nsp: '/' }; @@ -17,7 +17,7 @@ describe('parser', function() { it('encodes ArrayBuffers deep in JSON', function() { var packet = { type: parser.BINARY_EVENT, - data: {a: 'hi', b: {why: new ArrayBuffer(3)}, c: {a: 'bye', b: { a: new ArrayBuffer(6)}}}, + data: ['a', {a: 'hi', b: {why: new ArrayBuffer(3)}, c: {a: 'bye', b: { a: new ArrayBuffer(6)}}}], id: 999, nsp: '/deep' }; @@ -27,7 +27,7 @@ describe('parser', function() { it('encodes deep binary JSON with null values', function() { var packet = { type: parser.BINARY_EVENT, - data: {a: 'b', c: 4, e: {g: null}, h: new ArrayBuffer(9)}, + data: ['a', {a: 'b', c: 4, e: {g: null}, h: new ArrayBuffer(9)}], nsp: '/', id: 600 }; diff --git a/test/buffer.js b/test/buffer.js index dd27460..3aba898 100644 --- a/test/buffer.js +++ b/test/buffer.js @@ -8,7 +8,7 @@ describe('parser', function() { it('encodes a Buffer', function() { helpers.test_bin({ type: parser.BINARY_EVENT, - data: new Buffer('abc', 'utf8'), + data: ['a', new Buffer('abc', 'utf8')], id: 23, nsp: '/cool' }); diff --git a/test/parser.js b/test/parser.js index 346ca3b..42179d2 100644 --- a/test/parser.js +++ b/test/parser.js @@ -12,6 +12,8 @@ describe('parser', function(){ expect(parser.EVENT).to.be.a('number'); expect(parser.ACK).to.be.a('number'); expect(parser.ERROR).to.be.a('number'); + expect(parser.BINARY_EVENT).to.be.a('number'); + expect(parser.BINARY_ACK).to.be.a('number'); }); it('encodes connection', function(){ @@ -51,6 +53,14 @@ describe('parser', function(){ }); }); + it('encodes an error', function(){ + helpers.test({ + type: parser.ERROR, + data: 'Unauthorized', + nsp: '/' + }); + }); + it('decodes a bad binary packet', function(){ try { var decoder = new parser.Decoder(); @@ -59,4 +69,13 @@ describe('parser', function(){ expect(e.message).to.match(/Illegal/); } }); + + it('returns an error packet on parsing error', function(done){ + var decoder = new parser.Decoder(); + decoder.on('decoded', function(packet) { + expect(packet).to.eql({ type: 4, data: 'parser error: invalid payload' }); + done(); + }); + decoder.add('442["some","data"'); + }); }); From f9c06255de817b19e47eb41a6e7d90dc1976cbba Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 25 Feb 2018 09:20:05 +0100 Subject: [PATCH 067/129] [chore] Release 3.1.3 --- History.md | 160 --------------------------------------------------- package.json | 2 +- 2 files changed, 1 insertion(+), 161 deletions(-) delete mode 100644 History.md diff --git a/History.md b/History.md deleted file mode 100644 index 17e16a9..0000000 --- a/History.md +++ /dev/null @@ -1,160 +0,0 @@ - -3.1.2 / 2017-04-27 -================== - - * [chore] Bump has-binary2 to version 1.0.2 (#70) - * [fix] Fix Blob detection for iOS 8/9 (#69) - -3.1.1 / 2017-04-25 -================== - - * [fix] Ensure globals are functions before running `instanceof` (#68) - -3.1.0 / 2017-04-24 -================== - - * [chore] Bump debug to version 2.6.4 (#67) - * [feat] Move binary detection to the parser (#66) - -3.0.0 / 2017-04-04 -================== - - * [chore] Bump isarray to version 2.0.1 (#65) - * [chore] Use native JSON and drop support for older nodejs versions (#64) - -2.3.2 / 2016-12-30 -================== - - * [perf] Small optimisations (#57) - * [chore] Update zuul config to speed up tests in browser (#58) - * [refactor] Remove useless variable (#55) - * [chore] Bump dependencies (#56) - * [refactor] Remove unused var (#53) - * [refactor] Use strict equality when possible (#52) - -2.3.1 / 2016-10-24 -================== - -* [chore] Revert "Remove deprecated isarray dependency" (#50) - -2.3.0 / 2016-10-21 -================== - - * [perf] Split try catch into separate function (#40) - * [chore] remove browsers setting from .zuul.yml (#34) - * [chore] bump zuul (#37) - * [chore] Bump zuul to 3.11.0 & zuul-ngrok to 4.0.0 (#41) - * [chore] Update zuul browser settings following EOL notices (#42) - * [chore] Restrict files included in npm package (#45) - * [chore] Update zuul browser settings (#44) - * [chore] Remove deprecated isarray dependency (#46) - * [chore] Make the build status badge point towards master (#47) - * [chore] Move benchmark to dev dependencies (#48) - -2.2.6 / 2015-11-25 -================== - - * fix the order of exported events [chylli] - -2.2.5 / 2015-11-21 -================== - - * package: bump debug - * update JSON3 to 3.3.2 - -2.2.4 / 2015-03-03 -================== - - * index: fix off-by-one bound checks - -2.2.3 / 2015-02-03 -================== - - * index: fix potential infinite loop with malicious binary packet - -2.2.2 / 2014-09-04 -================== - - * prevent direct `Buffer` reference that breaks browserify - * binary: reuse `isBuf` helper - -2.2.1 / 2014-06-20 -================== - - * added benchmarking [kevin-roark] - * upgrade component-emitter to 1.1.2 [kevin-roark] - * update protocol version [kevin-roark] - * less indentation and a small optimization [kevin-roark] - -2.2.0 / 2014-05-30 -================== - - * added a BINARY_ACK type [kevin-roark] - -2.1.5 / 2014-05-24 -================== - - * don't iterate keys of `Date` objects [Rase-] - -2.1.4 / 2014-05-17 -================== - - * fix null reconstruction bug [kevin-roark] - -2.1.3 / 2014-04-27 -================== - - * bump zuul version - * updated protocol version - -2.1.2 / 2014-03-06 -================== - - * added support for binary in ACK packets - -2.1.1 / 2014-03-04 -================== - - * removed has-binary-data dependency - * fixed the object check in binary.removeBlobs - -2.1.0 / 2014-03-01 -================== - - * faster and smaller binary parser and protocol [kevin-roark] - -2.0.0 / 2014-02-19 -================== - - * binary support [kevin-roark] - -1.1.2 / 2014-02-11 -================== - - * package: bump `json3` to fix IE6-7 - -1.1.1 / 2014-02-10 -================== - - * package: bump debug to fix browserify issues - -1.1.0 / 2013-12-25 -================== - - * index: use `json3` - -1.0.3 / 2012-12-18 -================== - - * index: added instrumentation through `debug` - * index: make sure decoded `id` is a `Number` - -1.0.2 / 2012-12-18 -================== - - * index: allow for falsy values in `id` and `data` - -1.0.1 / 2012-12-10 -================== - - * Revision 1 diff --git a/package.json b/package.json index d040a09..bec32d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "3.1.2", + "version": "3.1.3", "description": "socket.io protocol parser", "repository": { "type": "git", From 6b356eb4f040590c68ace390533a085983ce45e5 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 28 Feb 2018 21:18:16 +0100 Subject: [PATCH 068/129] [fix] Properly detect typed arrays (#85) ArrayBuffer.isView method is not defined in IE10. --- is-buffer.js | 15 +++++++++++++-- test/arraybuffer.js | 13 +++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/is-buffer.js b/is-buffer.js index 520ed75..be23951 100644 --- a/is-buffer.js +++ b/is-buffer.js @@ -1,6 +1,17 @@ module.exports = isBuf; +var withNativeBuffer = typeof global.Buffer === 'function' && typeof global.Buffer.isBuffer === 'function'; +var withNativeArrayBuffer = typeof global.ArrayBuffer === 'function'; + +var isView = (function () { + if (typeof global.ArrayBuffer.isView === 'function') { + return global.ArrayBuffer.isView; + } else { + return function (obj) { return obj.buffer instanceof global.ArrayBuffer; }; + } +})(); + /** * Returns true if obj is a buffer or an arraybuffer. * @@ -8,6 +19,6 @@ module.exports = isBuf; */ function isBuf(obj) { - return (global.Buffer && global.Buffer.isBuffer(obj)) || - (global.ArrayBuffer && (obj instanceof ArrayBuffer || ArrayBuffer.isView(obj))); + return (withNativeBuffer && global.Buffer.isBuffer(obj)) || + (withNativeArrayBuffer && (obj instanceof global.ArrayBuffer || isView(obj))); } diff --git a/test/arraybuffer.js b/test/arraybuffer.js index a15c1e7..c8295f1 100644 --- a/test/arraybuffer.js +++ b/test/arraybuffer.js @@ -14,6 +14,19 @@ describe('parser', function() { helpers.test_bin(packet); }); + it('encodes a TypedArray', function() { + var array = new Uint8Array(5); + for (var i = 0; i < array.length; i++) array[i] = i; + + var packet = { + type: parser.BINARY_EVENT, + data: ['a', array], + id: 0, + nsp: '/' + }; + helpers.test_bin(packet); + }); + it('encodes ArrayBuffers deep in JSON', function() { var packet = { type: parser.BINARY_EVENT, From f115039068f9038df0c7bae897f98f5fef61e18e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 28 Feb 2018 21:19:22 +0100 Subject: [PATCH 069/129] [test] Update travis configuration --- .travis.yml | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index cde1311..ddf8173 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,12 +2,25 @@ language: node_js sudo: false node_js: - '4' - - 'node' + - '6' + - '8' + - node notifications: - irc: irc.freenode.org##socket.io + irc: 'irc.freenode.org##socket.io' git: depth: 1 matrix: include: - - node_js: 'node' - env: BROWSERS=1 + - node_js: node + env: BROWSERS=1 +cache: + directories: + - node_modules +env: + global: + - secure: >- + Ea4P/R9UlWzDlHSP5ynmLiD/YgLjecIvCviOcRTle9mV3P1j2k94Ay1LVu1Jw4whlNmWLq2Z/p8M63L92ODPMlarPsuME8HlP4zGr41whFhRbFdda4k3zrHfUhZBlnhY1MVWXTtVm/l7DOzpBrNh+wKecxZB3yyyEaA+PSG3qcQ= + - secure: >- + JmPf38qx5Rb6K+WYOMwb5YmESkDmVJ6tgggiJIuyRfHsgQVOO7XBwZuspIKGTSFolUIMaqwQe79Kd+Ehs2ZZ/0lUyF2/6xW3FqFnASUusYJcZdfRjypmBFWs6BRdtEORM8HL0dgBx4O4u/e4ZvtygumbPahjQbMDaqN+MvlpjD0= + - secure: >- + c3pnLhy3VDJqMl16ABA+8vt3I623aNa2wkLceLXb2V1Dc6eiZeulDH2ekwmdVo/r2WwGIKP3Y6B0mq/xP4W0hg4uT+xWh0AmFHclVyM/yp/AqfXrDUv17Vm0vB7OIgp332OiAlK6Dr13YDbWW8iZxmID41O2+2qohLGPn5JMncg= From dc4f475a452f28fd6fd2ecfecf869c133bf0978d Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 28 Feb 2018 21:51:03 +0100 Subject: [PATCH 070/129] [revert] Move binary detection to the parser So that we can skip the binary check. --- index.js | 5 ----- is-buffer.js | 2 +- package.json | 1 - 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/index.js b/index.js index f71ff27..90f9d3c 100644 --- a/index.js +++ b/index.js @@ -5,7 +5,6 @@ var debug = require('debug')('socket.io-parser'); var Emitter = require('component-emitter'); -var hasBin = require('has-binary2'); var binary = require('./binary'); var isArray = require('isarray'); var isBuf = require('./is-buffer'); @@ -125,10 +124,6 @@ function Encoder() {} */ Encoder.prototype.encode = function(obj, callback){ - if ((obj.type === exports.EVENT || obj.type === exports.ACK) && hasBin(obj.data)) { - obj.type = obj.type === exports.EVENT ? exports.BINARY_EVENT : exports.BINARY_ACK; - } - debug('encoding packet %j', obj); if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) { diff --git a/is-buffer.js b/is-buffer.js index be23951..9f451a4 100644 --- a/is-buffer.js +++ b/is-buffer.js @@ -5,7 +5,7 @@ var withNativeBuffer = typeof global.Buffer === 'function' && typeof global.Buff var withNativeArrayBuffer = typeof global.ArrayBuffer === 'function'; var isView = (function () { - if (typeof global.ArrayBuffer.isView === 'function') { + if (withNativeArrayBuffer && typeof global.ArrayBuffer.isView === 'function') { return global.ArrayBuffer.isView; } else { return function (obj) { return obj.buffer instanceof global.ArrayBuffer; }; diff --git a/package.json b/package.json index bec32d4..5976fca 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,6 @@ "dependencies": { "debug": "~3.1.0", "component-emitter": "1.2.1", - "has-binary2": "~1.0.2", "isarray": "2.0.1" }, "devDependencies": { From 92c530da47111e59add9b2960fe5c34aee80828e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 28 Feb 2018 13:36:08 +0100 Subject: [PATCH 071/129] [fix] Properly handle JSON.stringify errors (#84) JSON.stringify method throws when passed a circular object. --- index.js | 20 +++++++++++++++++--- test/parser.js | 20 ++++++++++++++++++-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 90f9d3c..daa242c 100644 --- a/index.js +++ b/index.js @@ -113,6 +113,8 @@ exports.Decoder = Decoder; function Encoder() {} +var ERROR_PACKET = exports.ERROR + '"encode error"'; + /** * Encode a packet as a single string if non-binary, or as a * buffer sequence, depending on packet type. @@ -128,8 +130,7 @@ Encoder.prototype.encode = function(obj, callback){ if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) { encodeAsBinary(obj, callback); - } - else { + } else { var encoding = encodeAsString(obj); callback([encoding]); } @@ -166,13 +167,26 @@ function encodeAsString(obj) { // json data if (null != obj.data) { - str += JSON.stringify(obj.data); + var payload = tryStringify(obj.data); + if (payload !== false) { + str += payload; + } else { + return ERROR_PACKET; + } } debug('encoded %j as %s', obj, str); return str; } +function tryStringify(str) { + try { + return JSON.stringify(str); + } catch(e){ + return false; + } +} + /** * Encode packet as 'buffer sequence' by removing blobs, and * deconstructing packet into object with placeholders and diff --git a/test/parser.js b/test/parser.js index 42179d2..652aa7f 100644 --- a/test/parser.js +++ b/test/parser.js @@ -1,8 +1,6 @@ var parser = require('../index.js'); var expect = require('expect.js'); var helpers = require('./helpers.js'); -var encode = parser.encode; -var decode = parser.decode; describe('parser', function(){ @@ -61,6 +59,24 @@ describe('parser', function(){ }); }); + it('properly handles circular objects', function() { + var a = {}; + a.b = a; + + var data = { + type: parser.EVENT, + data: a, + id: 1, + nsp: '/' + } + + var encoder = new parser.Encoder(); + + encoder.encode(data, function(encodedPackets) { + expect(encodedPackets[0]).to.be('4"encode error"'); + }); + }); + it('decodes a bad binary packet', function(){ try { var decoder = new parser.Decoder(); From 6e400188be089990fcb811bb734b7d0215cb74f7 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 28 Feb 2018 22:08:38 +0100 Subject: [PATCH 072/129] [chore] Release 3.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5976fca..ba5067a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "3.1.3", + "version": "3.2.0", "description": "socket.io protocol parser", "repository": { "type": "git", From 48f340ec12e919d70f2d9567c4a46e3c1080b1bc Mon Sep 17 00:00:00 2001 From: JinHyuk Kim Date: Thu, 8 Nov 2018 06:53:25 +0900 Subject: [PATCH 073/129] [refactor] Fix a small typo and code styling (#88) --- Readme.md | 2 +- index.js | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Readme.md b/Readme.md index 2463bc7..ac22117 100644 --- a/Readme.md +++ b/Readme.md @@ -54,7 +54,7 @@ var packet = { encoder.encode(packet, function(encodedPackets) { var decoder = new parser.Decoder(); decoder.on('decoded', function(decodedPacket) { - // decodedPacket.type == parser.BINARY_EVENTEVENT + // decodedPacket.type == parser.BINARY_EVENT // Buffer.isBuffer(decodedPacket.data.i) == true // Buffer.isBuffer(decodedPacket.data.j) == true // decodedPacket.id == 15 diff --git a/index.js b/index.js index daa242c..102615a 100644 --- a/index.js +++ b/index.js @@ -229,7 +229,7 @@ function Decoder() { Emitter(Decoder.prototype); /** - * Decodes an ecoded packet string into packet JSON. + * Decodes an encoded packet string into packet JSON. * * @param {String} obj - encoded packet * @return {Object} packet @@ -250,8 +250,7 @@ Decoder.prototype.add = function(obj) { } else { // non-binary full packet this.emit('decoded', packet); } - } - else if (isBuf(obj) || obj.base64) { // raw binary data + } else if (isBuf(obj) || obj.base64) { // raw binary data if (!this.reconstructor) { throw new Error('got binary data when not reconstructing a packet'); } else { @@ -261,8 +260,7 @@ Decoder.prototype.add = function(obj) { this.emit('decoded', packet); } } - } - else { + } else { throw new Error('Unknown type: ' + obj); } }; From b57e06304e50ee9eed258d39cd4841c6269bca75 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 7 Nov 2018 23:15:29 +0100 Subject: [PATCH 074/129] [test] Update travis configuration --- .travis.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index ddf8173..d01efa3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,8 @@ language: node_js sudo: false node_js: - - '4' - - '6' - '8' - - node -notifications: - irc: 'irc.freenode.org##socket.io' + - '10' git: depth: 1 matrix: From d95e38f6b66341612cc82bdb7f9157d698166c73 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 7 Nov 2018 23:16:54 +0100 Subject: [PATCH 075/129] [chore] Update the Makefile --- Makefile | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 2942f60..5bbd22a 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,14 @@ -REPORTER = dot +help: ## print this message + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' -test: +test: ## run tests either in the browser or in Node.js, based on the `BROWSERS` variable @if [ "x$(BROWSERS)" = "x" ]; then make test-node; else make test-zuul; fi -test-node: - @./node_modules/.bin/mocha \ - --reporter $(REPORTER) \ - --bail \ - test/index.js +test-node: ## run tests in Node.js + @./node_modules/.bin/mocha --reporter dot --bail test/index.js -test-zuul: - @./node_modules/zuul/bin/zuul \ - test/index.js +test-zuul: ## run tests in the browser + @./node_modules/zuul/bin/zuul test/index.js -.PHONY: test +.PHONY: help test test-node test-zuul From b47efb270d959e7456d8d44b4f3c386a884542b8 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 7 Nov 2018 23:14:07 +0100 Subject: [PATCH 076/129] [fix] Remove any reference to the `global` variable Related: https://github.com/socketio/socket.io-client/issues/1166 --- binary.js | 4 ++-- is-buffer.js | 18 +++++++----------- test/blob.js | 8 ++++---- test/index.js | 7 +++++-- test/support/env.js | 2 +- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/binary.js b/binary.js index 1a530c7..3e2347d 100644 --- a/binary.js +++ b/binary.js @@ -7,8 +7,8 @@ var isArray = require('isarray'); var isBuf = require('./is-buffer'); var toString = Object.prototype.toString; -var withNativeBlob = typeof global.Blob === 'function' || toString.call(global.Blob) === '[object BlobConstructor]'; -var withNativeFile = typeof global.File === 'function' || toString.call(global.File) === '[object FileConstructor]'; +var withNativeBlob = typeof Blob === 'function' || (typeof Blob !== 'undefined' && toString.call(Blob) === '[object BlobConstructor]'); +var withNativeFile = typeof File === 'function' || (typeof File !== 'undefined' && toString.call(File) === '[object FileConstructor]'); /** * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder. diff --git a/is-buffer.js b/is-buffer.js index 9f451a4..c833865 100644 --- a/is-buffer.js +++ b/is-buffer.js @@ -1,16 +1,12 @@ module.exports = isBuf; -var withNativeBuffer = typeof global.Buffer === 'function' && typeof global.Buffer.isBuffer === 'function'; -var withNativeArrayBuffer = typeof global.ArrayBuffer === 'function'; +var withNativeBuffer = typeof Buffer === 'function' && typeof Buffer.isBuffer === 'function'; +var withNativeArrayBuffer = typeof ArrayBuffer === 'function'; -var isView = (function () { - if (withNativeArrayBuffer && typeof global.ArrayBuffer.isView === 'function') { - return global.ArrayBuffer.isView; - } else { - return function (obj) { return obj.buffer instanceof global.ArrayBuffer; }; - } -})(); +var isView = function (obj) { + return typeof ArrayBuffer.isView === 'function' ? ArrayBuffer.isView(obj) : (obj.buffer instanceof ArrayBuffer); +}; /** * Returns true if obj is a buffer or an arraybuffer. @@ -19,6 +15,6 @@ var isView = (function () { */ function isBuf(obj) { - return (withNativeBuffer && global.Buffer.isBuffer(obj)) || - (withNativeArrayBuffer && (obj instanceof global.ArrayBuffer || isView(obj))); + return (withNativeBuffer && Buffer.isBuffer(obj)) || + (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))); } diff --git a/test/blob.js b/test/blob.js index 31d4b24..4e101fe 100644 --- a/test/blob.js +++ b/test/blob.js @@ -1,10 +1,10 @@ var parser = require('../index.js'); -var expect = require('expect.js'); var helpers = require('./helpers.js'); -var encode = parser.encode; -var decode = parser.decode; -var BlobBuilder = global.BlobBuilder || global.WebKitBlobBuilder || global.MSBlobBuilder || global.MozBlobBuilder; +var BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : + typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder : + typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : + typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : false; describe('parser', function() { it('encodes a Blob', function() { diff --git a/test/index.js b/test/index.js index ba6ce75..9d4a1cb 100644 --- a/test/index.js +++ b/test/index.js @@ -12,7 +12,10 @@ var blobSupported = (function() { * Create a blob builder even when vendor prefixes exist */ -var BlobBuilder = global.BlobBuilder || global.WebKitBlobBuilder || global.MSBlobBuilder || global.MozBlobBuilder; +var BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : + typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder : + typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : + typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : false; var blobBuilderSupported = !!BlobBuilder && !!BlobBuilder.prototype.append && !!BlobBuilder.prototype.getBlob; require('./parser.js'); @@ -21,7 +24,7 @@ if (!env.browser) { require('./buffer.js'); } -if (global.ArrayBuffer) { +if (typeof ArrayBuffer !== 'undefined') { require('./arraybuffer.js'); } diff --git a/test/support/env.js b/test/support/env.js index c1d494e..0b4873d 100644 --- a/test/support/env.js +++ b/test/support/env.js @@ -2,4 +2,4 @@ // we only do this in our tests because we need to test engine.io-client // support in browsers and in node.js // some tests do not yet work in both -module.exports.browser = !!global.window; +module.exports.browser = typeof window !== 'undefined'; From 0de72b9cc25c0950f09811e1e2a951b80e67e3fb Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 7 Nov 2018 23:58:21 +0100 Subject: [PATCH 077/129] [chore] Release 3.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ba5067a..f95861d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "3.2.0", + "version": "3.3.0", "description": "socket.io protocol parser", "repository": { "type": "git", From de1fd36dc9ecff82e68d8e2e4e5ae536250b0a1e Mon Sep 17 00:00:00 2001 From: JinHyuk Kim Date: Tue, 20 Nov 2018 06:31:13 +0900 Subject: [PATCH 078/129] [docs] Fix incorrect socket.io-protocol version in Readme (#89) Ref: https://github.com/socketio/socket.io-protocol --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index ac22117..2ca7633 100644 --- a/Readme.md +++ b/Readme.md @@ -4,7 +4,7 @@ [![Build Status](https://secure.travis-ci.org/socketio/socket.io-parser.svg?branch=master)](http://travis-ci.org/socketio/socket.io-parser) [![NPM version](https://badge.fury.io/js/socket.io-parser.svg)](http://badge.fury.io/js/socket.io-parser) -A socket.io encoder and decoder written in JavaScript complying with version `3` +A socket.io encoder and decoder written in JavaScript complying with version `4` of [socket.io-protocol](https://github.com/socketio/socket.io-protocol). Used by [socket.io](https://github.com/automattic/socket.io) and [socket.io-client](https://github.com/automattic/socket.io-client). From 9b3572ea23caaed1e32052289b0077b21f775de9 Mon Sep 17 00:00:00 2001 From: Dimitar Nestorov Date: Fri, 20 Sep 2019 11:51:26 +0300 Subject: [PATCH 079/129] [chore] Bump debug to version 4.1.0 (#92) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f95861d..46d2789 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "is-buffer.js" ], "dependencies": { - "debug": "~3.1.0", + "debug": "~4.1.0", "component-emitter": "1.2.1", "isarray": "2.0.1" }, From 652402a8568c2138da3c27c96756b32efca6c4bf Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 20 Sep 2019 10:59:20 +0200 Subject: [PATCH 080/129] [chore] Release 3.4.0 The build failure is due to some ES6 usage in the debug dependency, which will have to be fixed in the future (by using Babel for example). Diff: https://github.com/socketio/socket.io-parser/compare/3.3.0...3.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 46d2789..5e56691 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "3.3.0", + "version": "3.4.0", "description": "socket.io protocol parser", "repository": { "type": "git", From a5d04354e6e98b5318d5276123b0b5a5e698bf8e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 13 May 2020 07:23:37 +0200 Subject: [PATCH 081/129] test: transpile to es5 with babelify --- .travis.yml | 2 +- package-lock.json | 8257 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 + zuul.config.js | 10 + 4 files changed, 8271 insertions(+), 1 deletion(-) create mode 100644 package-lock.json diff --git a/.travis.yml b/.travis.yml index d01efa3..d6cccc0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ git: depth: 1 matrix: include: - - node_js: node + - node_js: 10 env: BROWSERS=1 cache: directories: diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..91d45c8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8257 @@ +{ + "name": "socket.io-parser", + "version": "3.4.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/compat-data": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.6.tgz", + "integrity": "sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g==", + "dev": true, + "requires": { + "browserslist": "^4.11.1", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", + "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.6", + "@babel/parser": "^7.9.6", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "dev": true, + "requires": { + "@babel/types": "^7.9.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz", + "integrity": "sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.9.6", + "browserslist": "^4.11.1", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", + "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz", + "integrity": "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", + "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz", + "integrity": "sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.9.5" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", + "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", + "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.8", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz", + "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz", + "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", + "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz", + "integrity": "sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz", + "integrity": "sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz", + "integrity": "sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", + "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz", + "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", + "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/preset-env": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.6.tgz", + "integrity": "sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.9.6", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.9.5", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.9.5", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.9.0", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.9.6", + "@babel/plugin-transform-modules-commonjs": "^7.9.6", + "@babel/plugin-transform-modules-systemjs": "^7.9.6", + "@babel/plugin-transform-modules-umd": "^7.9.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.9.5", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.9.6", + "browserslist": "^4.11.1", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", + "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", + "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "JSON2": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/JSON2/-/JSON2-0.1.0.tgz", + "integrity": "sha1-jXSTBApj1YNa919H3suDq2yMB5A=", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "accepts": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", + "dev": true, + "requires": { + "mime-types": "~2.1.6", + "negotiator": "0.5.3" + } + }, + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", + "dev": true + }, + "adm-zip": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", + "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", + "dev": true + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "archiver": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.7.1.tgz", + "integrity": "sha1-zxUteU+Gu9k/mFjaYNNqrqutm78=", + "dev": true, + "requires": { + "file-utils": "~0.1.5", + "lazystream": "~0.1.0", + "lodash": "~2.4.1", + "readable-stream": "~1.0.24", + "zip-stream": "~0.2.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } + } + }, + "assert": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.3.0.tgz", + "integrity": "sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "asyncreduce": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/asyncreduce/-/asyncreduce-0.1.4.tgz", + "integrity": "sha1-GCEOAZeL/cugQ5VUl6XNMVwKakE=", + "dev": true, + "requires": { + "runnel": "~0.5.0" + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babelify": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz", + "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "batch": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.0.tgz", + "integrity": "sha1-/S4Fp6XWlrTbkxQBPihdj/NVfsM=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "benchmark": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.2.tgz", + "integrity": "sha1-BnbYLlYNgtLzF/gs8IWEg5Vae/4=", + "dev": true, + "requires": { + "lodash": "^4.16.4", + "platform": "^1.3.1" + } + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", + "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", + "dev": true, + "requires": { + "readable-stream": "~1.0.26" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", + "dev": true + }, + "bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA==", + "dev": true + }, + "body-parser": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.12.4.tgz", + "integrity": "sha1-CQcAxLoohiqFIO83g5X97l9hwik=", + "dev": true, + "requires": { + "bytes": "1.0.0", + "content-type": "~1.0.1", + "debug": "~2.2.0", + "depd": "~1.0.1", + "iconv-lite": "0.4.8", + "on-finished": "~2.2.1", + "qs": "2.4.2", + "raw-body": "~2.0.1", + "type-is": "~1.6.2" + }, + "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "iconv-lite": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.8.tgz", + "integrity": "sha1-xgGadZXyzvynAuq2lKAQvNkpjSA=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "qs": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.4.2.tgz", + "integrity": "sha1-9854jld33wtQENp/fE5zujJHD1o=", + "dev": true + }, + "raw-body": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.0.2.tgz", + "integrity": "sha1-osL5jIUxzumcY9jSOLfel7tln8o=", + "dev": true, + "requires": { + "bytes": "2.1.0", + "iconv-lite": "0.4.8" + }, + "dependencies": { + "bytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", + "integrity": "sha1-rJPEEOL/ycx89LRks4KJBn9eR7Q=", + "dev": true + } + } + } + } + }, + "boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", + "dev": true, + "requires": { + "hoek": "0.9.x" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "browserify": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-13.0.0.tgz", + "integrity": "sha1-jyI7sk/07kM15r6pZx3ilOQ7pqM=", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "assert": "~1.3.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.1.2", + "buffer": "^4.1.0", + "concat-stream": "~1.5.1", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "~1.1.0", + "duplexer2": "~0.1.2", + "events": "~1.1.0", + "glob": "^5.0.15", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "~0.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "isarray": "0.0.1", + "labeled-stream-splicer": "^2.0.0", + "module-deps": "^4.0.2", + "os-browserify": "~0.1.1", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.4.3", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "~0.10.0", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "~0.0.0", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "~0.0.1", + "xtend": "^4.0.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-istanbul": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/browserify-istanbul/-/browserify-istanbul-0.1.5.tgz", + "integrity": "sha1-AcjjHWo1juUVD0Mhw/KJlalkw58=", + "dev": true, + "requires": { + "istanbul": "^0.2.8", + "minimatch": "^0.2.14", + "through": "^2.3.4" + }, + "dependencies": { + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.1.0.tgz", + "integrity": "sha512-VYxo7cDCeYUoBZ0ZCy4UyEUCP3smyBd4DRQM5nrFS1jJjPJjX7rP3oLRpPoWfkhQfyJ0I9ZbHbKafrFD/SGlrg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "~0.2.0" + } + }, + "browserslist": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "buffer-crc32": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", + "integrity": "sha1-vj5TgvwCttYySVasGvmKqYsIU0w=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", + "integrity": "sha1-rJPEEOL/ycx89LRks4KJBn9eR7Q=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001055", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001055.tgz", + "integrity": "sha512-MbwsBmKrBSKIWldfdIagO5OJWZclpJtS4h0Jrk/4HFrXJxTdVdH23Fd+xCiHriVGvYcWyW8mR/CPsYajlH8Iuw==", + "dev": true + }, + "caseless": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz", + "integrity": "sha1-gWfBq4OX+1u5X5bSjlqBxQ8kesQ=", + "dev": true + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-split": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/char-split/-/char-split-0.2.0.tgz", + "integrity": "sha1-h1XtpkHl2yd90PUJtRfIJ+UKjt8=", + "dev": true, + "requires": { + "through": "2.3.4" + }, + "dependencies": { + "through": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.4.tgz", + "integrity": "sha1-SV5A6Nio6uvHwnXqiMK4/BTFZFU=", + "dev": true + } + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "dev": true + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + } + } + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", + "dev": true, + "requires": { + "delayed-stream": "0.0.5" + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "compress-commons": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-0.2.9.tgz", + "integrity": "sha1-Qi2SdDDAGr0GzUVbbfwEy0z4ADw=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.1", + "crc32-stream": "~0.3.1", + "node-int64": "~0.3.0", + "readable-stream": "~1.0.26" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.5.0.tgz", + "integrity": "sha1-zMGlR4jaGzrXcpxJ9qALOsmt9H8=", + "dev": true, + "requires": { + "accepts": "~1.2.9", + "bytes": "2.1.0", + "compressible": "~2.0.3", + "debug": "~2.2.0", + "on-headers": "~1.0.0", + "vary": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", + "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + } + } + }, + "connect": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-2.12.0.tgz", + "integrity": "sha1-Mdj6DcrN8ZCNgivSkjvootKn7Zo=", + "dev": true, + "requires": { + "batch": "0.5.0", + "buffer-crc32": "0.2.1", + "bytes": "0.2.1", + "cookie": "0.1.0", + "cookie-signature": "1.0.1", + "debug": ">= 0.7.3 < 1", + "fresh": "0.2.0", + "methods": "0.1.0", + "multiparty": "2.2.0", + "negotiator": "0.3.0", + "pause": "0.0.1", + "qs": "0.6.6", + "raw-body": "1.1.2", + "send": "0.1.4", + "uid2": "0.0.3" + }, + "dependencies": { + "bytes": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.1.tgz", + "integrity": "sha1-VVsIq8sGP4l1kFMCUj5M1P/f3zE=", + "dev": true + }, + "debug": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=", + "dev": true + }, + "negotiator": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.3.0.tgz", + "integrity": "sha1-cG1pLv7d9XTVfqn7GriaT6fuj2A=", + "dev": true + } + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.0.tgz", + "integrity": "sha1-kOtGndzpBchm3mh+/EMTHYgB+dA=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz", + "integrity": "sha1-ROByFIrwHm6OJK+/EmkNaK5pjss=", + "dev": true + }, + "cookiejar": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-1.3.0.tgz", + "integrity": "sha1-3QCzVnkCHpnL1OhVua0EGRNHR2U=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "crc32-stream": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-0.3.4.tgz", + "integrity": "sha1-c7wltF+sHbZjIjGnv86JJ+nwZVI=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.1", + "readable-stream": "~1.0.24" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", + "dev": true, + "requires": { + "boom": "0.4.x" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", + "dev": true + }, + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-zip": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.2.tgz", + "integrity": "sha512-Ab1QY4LrWMrUuo53lLnmGOby7v8ryqxJ+bKibKSiPisx+25mhut1dScVBXAYx14i/PqSrFZvR2FRRazhLbvL+g==", + "dev": true, + "requires": { + "binary": "^0.3.0", + "graceful-fs": "^4.1.3", + "mkpath": "^0.1.0", + "nopt": "^3.0.1", + "q": "^1.1.2", + "readable-stream": "^1.1.8", + "touch": "0.0.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", + "dev": true + }, + "depd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=", + "dev": true + }, + "deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detective": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "dev": true, + "requires": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + } + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz", + "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.433", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.433.tgz", + "integrity": "sha512-C0gcgwB8RpPAq2Ia6teihNOHOfNzGy4jJXgjIXSmKdt6O2xrJM8CPjA8jTFyo97KozVrZ8oH2FUCixC6Hnuk2g==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } + } + }, + "emitter-component": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.0.0.tgz", + "integrity": "sha1-8E3Rj8PcPpp0y8DzELCIZm5MAW8=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", + "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", + "dev": true, + "requires": { + "esprima": "~1.1.1", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.33" + }, + "dependencies": { + "esprima": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", + "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=", + "dev": true + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "esprima": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", + "integrity": "sha1-CZNQL+r2aBODJXVvMPmlH+7sEek=", + "dev": true + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "expect.js": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", + "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", + "dev": true + }, + "express": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/express/-/express-3.4.8.tgz", + "integrity": "sha1-qnqJht4HBTM39Lxe2aZFPZzI4uE=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.1", + "commander": "1.3.2", + "connect": "2.12.0", + "cookie": "0.1.0", + "cookie-signature": "1.0.1", + "debug": ">= 0.7.3 < 1", + "fresh": "0.2.0", + "merge-descriptors": "0.0.1", + "methods": "0.1.0", + "mkdirp": "0.3.5", + "range-parser": "0.0.4", + "send": "0.1.4" + }, + "dependencies": { + "commander": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-1.3.2.tgz", + "integrity": "sha1-io8w7GcKb91kr1LxkUuQfXnq1bU=", + "dev": true, + "requires": { + "keypress": "0.1.x" + } + }, + "debug": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=", + "dev": true + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", + "dev": true + } + } + }, + "express-state": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/express-state/-/express-state-1.0.3.tgz", + "integrity": "sha1-tvNodDqV2KkbdoOt9ZPQKxV37AI=", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "file-utils": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/file-utils/-/file-utils-0.1.5.tgz", + "integrity": "sha1-3IFTyFU4fLTaywoXJVMfpESmtIw=", + "dev": true, + "requires": { + "findup-sync": "~0.1.2", + "glob": "~3.2.6", + "iconv-lite": "~0.2.11", + "isbinaryfile": "~0.1.9", + "lodash": "~2.1.0", + "minimatch": "~0.2.12", + "rimraf": "~2.2.2" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + }, + "dependencies": { + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "lodash": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz", + "integrity": "sha1-Bjfqqjaooc/IZcOt+5Qhib+wmY0=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.1.8.tgz", + "integrity": "sha1-UGuRqTluqn4y+0KoQHfHoMc2t0E=", + "dev": true, + "requires": { + "glob": "3.x", + "minimatch": "0.x" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + }, + "dependencies": { + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "minimatch": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.4.0.tgz", + "integrity": "sha1-vSx9Bg0sjI/Xzefx8u0tWycP2xs=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + } + } + }, + "find-nearest-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-nearest-file/-/find-nearest-file-1.0.0.tgz", + "integrity": "sha1-v1OdfQ8CmWYx+iGWaA9ndnYrn3A=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "findup-sync": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", + "dev": true, + "requires": { + "glob": "~3.2.9", + "lodash": "~2.4.1" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "firefox-profile": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-0.2.7.tgz", + "integrity": "sha1-/kavwu1qlvYsXDvURvoln2AUqQk=", + "dev": true, + "requires": { + "adm-zip": "~0.4.3", + "archiver": "~0.7.1", + "async": "~0.2.9", + "fs-extra": "~0.8.1", + "lazystream": "~0.1.0", + "node-uuid": "~1.4.1", + "wrench": "~1.5.1", + "xml2js": "~0.4.0" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forEachAsync": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/forEachAsync/-/forEachAsync-2.2.1.tgz", + "integrity": "sha1-43I/AJA5EOHrSx2zrVG1xkoxn+w=", + "dev": true, + "requires": { + "sequence": "2.x" + } + }, + "foreach-shim": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/foreach-shim/-/foreach-shim-0.1.1.tgz", + "integrity": "sha1-vmHXX0artxdvWr0pXjWIV1G3HZQ=", + "dev": true + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", + "dev": true + }, + "form-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", + "dev": true, + "requires": { + "async": "~0.9.0", + "combined-stream": "~0.0.4", + "mime": "~1.2.11" + } + }, + "formidable": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz", + "integrity": "sha1-Kz9MQRy7X91pXESEPiojUUpDIxo=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.0.tgz", + "integrity": "sha1-v9lALPPfEsSkwxDHn5mj3eE9NKc=", + "dev": true + }, + "fs-extra": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.8.1.tgz", + "integrity": "sha1-Dld5/7/t9RG8dVWVx/A8BtS0Po0=", + "dev": true, + "requires": { + "jsonfile": "~1.1.0", + "mkdirp": "0.3.x", + "ncp": "~0.4.2", + "rimraf": "~2.2.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", + "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globs-to-files": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/globs-to-files/-/globs-to-files-1.0.0.tgz", + "integrity": "sha1-VEkPbR9Ln9LenZlEUUb/s3VQOA0=", + "dev": true, + "requires": { + "array-uniq": "~1.0.2", + "asyncreduce": "~0.1.4", + "glob": "^5.0.10", + "xtend": "^4.0.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "handlebars": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-1.3.0.tgz", + "integrity": "sha1-npsTCpPjiUkTItl1zz7BgYw3zjQ=", + "dev": true, + "requires": { + "optimist": "~0.3", + "uglify-js": "~2.3" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hawk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", + "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=", + "dev": true, + "requires": { + "boom": "0.4.x", + "cryptiles": "0.2.x", + "hoek": "0.9.x", + "sntp": "0.2.x" + } + }, + "hbs": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/hbs/-/hbs-2.4.0.tgz", + "integrity": "sha1-9MlWy2YNaXTcYSFLfEmiH2qqP1E=", + "dev": true, + "requires": { + "handlebars": "1.0.12", + "walk": "2.2.1" + }, + "dependencies": { + "handlebars": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-1.0.12.tgz", + "integrity": "sha1-GMbTRAw16RsZs/9YK5FRq0mF1Pw=", + "dev": true, + "requires": { + "optimist": "~0.3", + "uglify-js": "~2.3" + } + } + } + }, + "highlight.js": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-7.5.0.tgz", + "integrity": "sha1-AFJZXu8VhF2ELgKgMxOvrcPr1sw=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", + "dev": true + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.11.2.tgz", + "integrity": "sha1-xQ0vsG7KedQjjmb9lDk9LkHmN0A=", + "dev": true, + "requires": { + "eventemitter3": "1.x.x", + "requires-port": "0.x.x" + } + }, + "http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", + "dev": true, + "requires": { + "asn1": "0.1.11", + "assert-plus": "^0.1.5", + "ctype": "0.5.3" + } + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "humanize-duration": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-2.4.0.tgz", + "integrity": "sha1-BNqJ5nhK8ciBsG68n0lN2gewihc=", + "dev": true + }, + "iconv-lite": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=", + "dev": true + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "requires": { + "source-map": "~0.5.3" + } + }, + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, + "isbinaryfile": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-0.1.9.tgz", + "integrity": "sha1-Fe7ONcSrcI2JJNqZ+4dPK1zAtsQ=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.2.16.tgz", + "integrity": "sha1-hwVFoNT0tM4WEDnp6AWpjCxwC9k=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "0.9.x", + "escodegen": "1.3.x", + "esprima": "1.2.x", + "fileset": "0.1.x", + "handlebars": "1.3.x", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "resolve": "0.7.x", + "which": "1.0.x", + "wordwrap": "0.0.x" + }, + "dependencies": { + "resolve": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", + "integrity": "sha1-OVqe+ehz+/4SvRRAi9kbuTYAPWk=", + "dev": true + } + } + }, + "istanbul-middleware": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/istanbul-middleware/-/istanbul-middleware-0.2.2.tgz", + "integrity": "sha1-g8TBPBKOGg1qFHeSORrzwVqKuOA=", + "dev": true, + "requires": { + "archiver": "0.14.x", + "body-parser": "~1.12.3", + "express": "4.x", + "istanbul": "0.4.x" + }, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "archiver": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.14.4.tgz", + "integrity": "sha1-W53bn17hzu8hy487Ag5iQOy0MVw=", + "dev": true, + "requires": { + "async": "~0.9.0", + "buffer-crc32": "~0.2.1", + "glob": "~4.3.0", + "lazystream": "~0.1.0", + "lodash": "~3.2.0", + "readable-stream": "~1.0.26", + "tar-stream": "~1.1.0", + "zip-stream": "~0.5.0" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + } + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "glob": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz", + "integrity": "sha1-gPuwjKVA8jiszl0R0em8QedRc9M=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + } + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "lodash": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.2.0.tgz", + "integrity": "sha1-S/UKMkP5rrC6xBpV09WZBnWkYvs=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "uglify-js": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.2.tgz", + "integrity": "sha512-zGVwKslUAD/EeqOrD1nQaBmXIHl1Vw371we8cvS8I6mYK9rmgX5tv8AAeJdfsQ3Kk5mGax2SVV/AizxdNGhl7Q==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "zip-stream": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.5.2.tgz", + "integrity": "sha1-Mty8UG0Nq00hNyYlvX66rDwv/1Y=", + "dev": true, + "requires": { + "compress-commons": "~0.2.0", + "lodash": "~3.2.0", + "readable-stream": "~1.0.26" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.1.1.tgz", + "integrity": "sha1-2k/WrXfxolUgPqY8e8Mtwx72RDM=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "keypress": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz", + "integrity": "sha1-SjGI1CkbZrT2XtuZ+AaqmuKTWSo=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "lazystream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", + "integrity": "sha1-GyXWPHcqTCDwpe0KnXf0hLbhaSA=", + "dev": true, + "requires": { + "readable-stream": "~1.0.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-script": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-0.0.5.tgz", + "integrity": "sha1-y9VLJ81zCZArdJZAxw6Zb0xkO2M=", + "dev": true + }, + "localtunnel": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.5.0.tgz", + "integrity": "sha1-W+lJd5Ml6fMnMCGj840ueo3NfE8=", + "dev": true, + "requires": { + "debug": "0.7.4", + "optimist": "0.3.4", + "request": "2.11.4" + }, + "dependencies": { + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "dev": true + }, + "optimist": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.4.tgz", + "integrity": "sha1-TW0L1x/60NpLpPbYdtXusE4HSAs=", + "dev": true, + "requires": { + "wordwrap": "~0.0.2" + } + }, + "request": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/request/-/request-2.11.4.tgz", + "integrity": "sha1-Y0fX1E5S3FiBCMwc5c7pdfyJJt4=", + "dev": true, + "requires": { + "form-data": "~0.0.3", + "mime": "~1.2.7" + }, + "dependencies": { + "form-data": { + "version": "0.0.3", + "bundled": true, + "dev": true, + "requires": { + "async": "~0.1.9", + "combined-stream": "0.0.3", + "mime": "~1.2.2" + }, + "dependencies": { + "async": { + "version": "0.1.9", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "0.0.3", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "0.0.5" + }, + "dependencies": { + "delayed-stream": { + "version": "0.0.5", + "bundled": true, + "dev": true + } + } + } + } + }, + "mime": { + "version": "1.2.7", + "bundled": true, + "dev": true + } + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lock": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/lock/-/lock-0.1.4.tgz", + "integrity": "sha1-/sfervF+fDoKVeHaBCgD4l2RdF0=", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", + "dev": true + }, + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + }, + "lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" + } + }, + "lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1", + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "merge-descriptors": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.1.tgz", + "integrity": "sha1-L/CYDJJM+B0LXR+2ARd8uLtWwNA=", + "dev": true + }, + "methods": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-0.1.0.tgz", + "integrity": "sha1-M11Cnu/SG3us8unJIqjSvRSjDk8=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } + } + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", + "dev": true + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mkpath": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", + "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=", + "dev": true + }, + "mocha": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.2.0.tgz", + "integrity": "sha1-fcT0XlCIB1FxpoiWgU5q6et6heM=", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.5", + "glob": "7.0.5", + "growl": "1.9.2", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "module-deps": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", + "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.5.0", + "defined": "^1.0.0", + "detective": "^4.0.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.3", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "mout": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", + "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multiparty": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-2.2.0.tgz", + "integrity": "sha1-pWfCrwAK0i3I8qZT2Rl4rh9TFvQ=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9", + "stream-counter": "~0.2.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "dev": true + }, + "ncp": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", + "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=", + "dev": true + }, + "negotiator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", + "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "ngrok": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/ngrok/-/ngrok-2.1.8.tgz", + "integrity": "sha1-TKxd981PYPoKokoq1ZpvdE0TDUY=", + "dev": true, + "requires": { + "async": "^0.9.0", + "decompress-zip": "^0.3.0", + "lock": "^0.1.2", + "node-uuid": "^1.4.3", + "request": "^2.55.0", + "tar.gz": "^1.0.3", + "xtend": "^4.0.1" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "node-int64": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.3.3.tgz", + "integrity": "sha1-LW5rLs5d6FiLQ9iNG8QbJs0fqE0=", + "dev": true + }, + "node-releases": { + "version": "1.1.55", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.55.tgz", + "integrity": "sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w==", + "dev": true + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "oauth-sign": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz", + "integrity": "sha1-8ilW8x6nFRqCHl8vsywRPK2Ln2k=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "on-finished": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.2.1.tgz", + "integrity": "sha1-XIXBzDYpn3gCllP2Z/J7a5nrwCk=", + "dev": true, + "requires": { + "ee-first": "1.1.0" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.0.tgz", + "integrity": "sha1-0R+G7usHaINzXJ1Qn1OP6C0QuUE=", + "dev": true + }, + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "dev": true, + "requires": { + "wordwrap": "~0.0.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-browserify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", + "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", + "dev": true + }, + "osenv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz", + "integrity": "sha1-zWrY3bKQkVrZ4idlV2Al1BHynLY=", + "dev": true + }, + "outpipe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", + "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", + "dev": true, + "requires": { + "shell-quote": "^1.4.2" + }, + "dependencies": { + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + } + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dev": true, + "requires": { + "path-platform": "~0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "platform": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", + "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", + "integrity": "sha1-EYcq7t7okmgRCxCnGESP+xARKhQ=", + "dev": true + }, + "qs": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", + "integrity": "sha1-bgFQmP9RlouKPIGQAdXyyJvEsQc=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz", + "integrity": "sha1-wEJ//vUcEKy6B4KkbJYC50T/Ygs=", + "dev": true + }, + "raw-body": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.2.tgz", + "integrity": "sha1-x0swBN6l3v0WlhcRBqx0DsMdYr4=", + "dev": true, + "requires": { + "bytes": "~0.2.1" + }, + "dependencies": { + "bytes": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.1.tgz", + "integrity": "sha1-VVsIq8sGP4l1kFMCUj5M1P/f3zE=", + "dev": true + } + } + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "reduce-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz", + "integrity": "sha1-4Mk1QsV0UhvqE98PlIjtgqt3xdo=", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.46.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.46.0.tgz", + "integrity": "sha1-NZGV1S6vcgvGl0JXnQStbSZagnQ=", + "dev": true, + "requires": { + "aws-sign2": "~0.5.0", + "bl": "~0.9.0", + "caseless": "~0.6.0", + "forever-agent": "~0.5.0", + "form-data": "~0.1.0", + "hawk": "1.1.1", + "http-signature": "~0.10.0", + "json-stringify-safe": "~5.0.0", + "mime-types": "~1.0.1", + "node-uuid": "~1.4.0", + "oauth-sign": "~0.4.0", + "qs": "~1.2.0", + "stringstream": "~0.0.4", + "tough-cookie": ">=0.12.0", + "tunnel-agent": "~0.4.0" + }, + "dependencies": { + "mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=", + "dev": true + }, + "qs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", + "integrity": "sha1-GbV/8k3CqZzh+L32r82ln472H4g=", + "dev": true + } + } + }, + "requires-port": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-0.0.1.tgz", + "integrity": "sha1-S0QUQR2d98hVmV3YmajHiilRwW0=", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "runnel": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/runnel/-/runnel-0.5.3.tgz", + "integrity": "sha1-+TYrFloF/G9eRuRY93offs3A2uw=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "send": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/send/-/send-0.1.4.tgz", + "integrity": "sha1-vnDY0b4B3mGCGvE3gLUDRaT3Gr0=", + "dev": true, + "requires": { + "debug": "*", + "fresh": "0.2.0", + "mime": "~1.2.9", + "range-parser": "0.0.4" + } + }, + "sequence": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/sequence/-/sequence-2.2.1.tgz", + "integrity": "sha1-f1YXiV1ENRwKBH52RGdpBJChawM=", + "dev": true + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + } + } + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", + "dev": true + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dev": true, + "requires": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dev": true, + "requires": { + "fast-safe-stringify": "^2.0.7" + } + }, + "shell-quote": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.4.1.tgz", + "integrity": "sha1-rhhEK1NqCMcgI5sHnS8iisvt7kA=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", + "dev": true, + "requires": { + "hoek": "0.9.x" + } + }, + "socket.io-browsers": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/socket.io-browsers/-/socket.io-browsers-1.0.4.tgz", + "integrity": "sha512-WmY14QFWp7vSTWj7o0BVhshTfAugCTiz3dyiuJXOChfFHDzgynN5MotHxYxUXK0uEGLbh5lQ5MTxUlRAAu5sPg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-cjs": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map-cjs/-/source-map-cjs-0.1.32.tgz", + "integrity": "sha1-sRPwAGW0hPTToRI+8IQEalYijOc=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/split/-/split-0.1.2.tgz", + "integrity": "sha1-8HEHRMRT1VH8cUPq2YPaYBTjNsw=", + "dev": true, + "requires": { + "through": "1" + }, + "dependencies": { + "through": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/through/-/through-1.1.2.tgz", + "integrity": "sha1-NEpUJaN3MxTKfg62US+6+vdsC/4=", + "dev": true + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stack-mapper": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stack-mapper/-/stack-mapper-0.2.2.tgz", + "integrity": "sha1-eJApBUk3t9R8G1tnYSy7Hnz+cHE=", + "dev": true, + "requires": { + "array-map": "0.0.0", + "foreach-shim": "~0.1.1", + "isarray": "0.0.1", + "source-map-cjs": "~0.1.31" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "stacktrace-js": { + "version": "http://github.com/defunctzombie/stacktrace.js/tarball/07e7b9516f1449f5c209e4f67f11a43f738c1712", + "integrity": "sha512-83HwNyHv1Yjt2MfgjTndX7CpGWZ47E6JMN/naowOmjYpu8EmjXDyrpz69OmubqEqA3LYl/Z84cmNs1TVusumWQ==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "stream-counter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz", + "integrity": "sha1-3tJmVWMZyLDiIoErnPOyb6fZR94=", + "dev": true, + "requires": { + "readable-stream": "~1.1.8" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "dev": true + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "^1.1.0" + } + }, + "superagent": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-0.15.7.tgz", + "integrity": "sha1-CVxwuK//vAcvFFjzloTUhU1jM6M=", + "dev": true, + "requires": { + "cookiejar": "1.3.0", + "debug": "~0.7.2", + "emitter-component": "1.0.0", + "formidable": "1.0.14", + "methods": "0.0.1", + "mime": "1.2.5", + "qs": "0.6.5", + "reduce-component": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "dev": true + }, + "methods": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/methods/-/methods-0.0.1.tgz", + "integrity": "sha1-J3yQ+L7zlwlkWoNxxRw7bGSOBow=", + "dev": true + }, + "mime": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.5.tgz", + "integrity": "sha1-nu0HMCKov14WyFZsaGe4gyv7+hM=", + "dev": true + }, + "qs": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz", + "integrity": "sha1-KUsmjksNQlD23eGbO4s0k13/FO8=", + "dev": true + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "requires": { + "acorn-node": "^1.2.0" + } + }, + "tap-finished": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tap-finished/-/tap-finished-0.0.1.tgz", + "integrity": "sha1-CLW1Q/3ASDApDGxWEnlVLnHEvWc=", + "dev": true, + "requires": { + "tap-parser": "~0.2.0", + "through": "~2.3.4" + }, + "dependencies": { + "tap-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-0.2.1.tgz", + "integrity": "sha1-jh6CPyEU7iHQMuLzHk+2QqKW9Qs=", + "dev": true, + "requires": { + "split": "~0.1.2" + } + } + } + }, + "tap-parser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-0.7.0.tgz", + "integrity": "sha1-coph1kaApbSNXb2dvQpNSPXDW8s=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "minimist": "^0.2.0", + "readable-stream": "~1.1.11" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "minimist": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.1.tgz", + "integrity": "sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "tar-stream": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.1.5.tgz", + "integrity": "sha1-vpIYwTDCACnhB7D5Z/sj3gV50Tw=", + "dev": true, + "requires": { + "bl": "^0.9.0", + "end-of-stream": "^1.0.0", + "readable-stream": "~1.0.33", + "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "tar.gz": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", + "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", + "dev": true, + "requires": { + "bluebird": "^2.9.34", + "commander": "^2.8.1", + "fstream": "^1.0.8", + "mout": "^0.11.0", + "tar": "^2.1.1" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dev": true, + "requires": { + "process": "~0.11.0" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "touch": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz", + "integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", + "integrity": "sha1-+gmEdwtCi3qbKoBY9GNV0U/vIRo=", + "dev": true, + "requires": { + "async": "~0.2.6", + "optimist": "~0.3.5", + "source-map": "~0.1.7" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=", + "dev": true + }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true + }, + "undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "vargs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz", + "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=", + "dev": true + }, + "vary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", + "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "walk": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.2.1.tgz", + "integrity": "sha1-WtofjknkfUt0Rdi+ei4eYxq0MBY=", + "dev": true, + "requires": { + "forEachAsync": "~2.2" + } + }, + "watchify": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.7.0.tgz", + "integrity": "sha1-7i8sXIw3MSMD+Zi4GLKzRQ7v5kg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "browserify": "^13.0.0", + "chokidar": "^1.0.0", + "defined": "^1.0.0", + "outpipe": "^1.1.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "wd": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/wd/-/wd-0.3.11.tgz", + "integrity": "sha1-UicWx5p6EOeBrLssbK/liPcB/MA=", + "dev": true, + "requires": { + "archiver": "~0.12.0", + "async": "~0.9.0", + "lodash": "~2.4.1", + "q": "~1.0.1", + "request": "~2.46.0", + "underscore.string": "~2.3.3", + "vargs": "~0.1.0" + }, + "dependencies": { + "archiver": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.12.0.tgz", + "integrity": "sha1-uMzeJQjKuQkrtxBmMBOcDzmigMw=", + "dev": true, + "requires": { + "async": "~0.9.0", + "buffer-crc32": "~0.2.1", + "glob": "~4.0.6", + "lazystream": "~0.1.0", + "lodash": "~2.4.1", + "readable-stream": "~1.0.26", + "tar-stream": "~1.0.0", + "zip-stream": "~0.4.0" + } + }, + "compress-commons": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-0.1.6.tgz", + "integrity": "sha1-DHQIcP3ljLpRbwrAyCLjOguF36M=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.1", + "crc32-stream": "~0.3.1", + "readable-stream": "~1.0.26" + } + }, + "glob": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.0.6.tgz", + "integrity": "sha1-aVxQvdTi+1xdNwsJHziNNwfikac=", + "dev": true, + "requires": { + "graceful-fs": "^3.0.2", + "inherits": "2", + "minimatch": "^1.0.0", + "once": "^1.3.0" + } + }, + "graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "requires": { + "natives": "^1.1.3" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + }, + "minimatch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", + "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "tar-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.0.2.tgz", + "integrity": "sha1-/Rm0oXkA+nBPahM+MEWurQViq5U=", + "dev": true, + "requires": { + "bl": "^0.9.0", + "end-of-stream": "^1.0.0", + "readable-stream": "^1.0.27-1", + "xtend": "^4.0.0" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "zip-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.4.1.tgz", + "integrity": "sha1-TqeVqM4Z6fq0mjHR0IdyFBWfA6M=", + "dev": true, + "requires": { + "compress-commons": "~0.1.0", + "lodash": "~2.4.1", + "readable-stream": "~1.0.26" + } + } + } + }, + "which": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "wrench": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.5.9.tgz", + "integrity": "sha1-QRaRxjqbJTGxcAJnJ5veyiOyFCo=", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + }, + "dependencies": { + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + } + } + }, + "yamljs": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.1.4.tgz", + "integrity": "sha1-ZleJr8KtS5Ar9APwDoW2Q04PMwA=", + "dev": true, + "requires": { + "argparse": "~0.1.4", + "glob": "~3.1.11" + }, + "dependencies": { + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "dev": true, + "requires": { + "underscore": "~1.7.0", + "underscore.string": "~2.4.0" + } + }, + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", + "dev": true + } + } + }, + "zip-stream": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.2.3.tgz", + "integrity": "sha1-rvCVN2z+E4lZqBNBmB0mM4tG2NM=", + "dev": true, + "requires": { + "debug": "~0.7.4", + "lodash.defaults": "~2.4.1", + "readable-stream": "~1.0.24" + }, + "dependencies": { + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "zuul": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/zuul/-/zuul-3.11.1.tgz", + "integrity": "sha1-cIC7vyKm2X9gh5s7jyqCPFqZurI=", + "dev": true, + "requires": { + "JSON2": "0.1.0", + "batch": "0.5.0", + "browserify": "13.0.0", + "browserify-istanbul": "0.1.5", + "char-split": "0.2.0", + "colors": "0.6.2", + "commander": "2.1.0", + "compression": "1.5.0", + "convert-source-map": "1.0.0", + "debug": "2.1.0", + "express": "3.4.8", + "express-state": "1.0.3", + "find-nearest-file": "1.0.0", + "firefox-profile": "0.2.7", + "globs-to-files": "1.0.0", + "hbs": "2.4.0", + "highlight.js": "7.5.0", + "http-proxy": "1.11.2", + "humanize-duration": "2.4.0", + "istanbul-middleware": "0.2.2", + "load-script": "0.0.5", + "lodash": "3.10.1", + "opener": "1.4.0", + "osenv": "0.0.3", + "shallow-copy": "0.0.1", + "shell-quote": "1.4.1", + "stack-mapper": "0.2.2", + "stacktrace-js": "http://github.com/defunctzombie/stacktrace.js/tarball/07e7b9516f1449f5c209e4f67f11a43f738c1712", + "superagent": "0.15.7", + "tap-finished": "0.0.1", + "tap-parser": "0.7.0", + "watchify": "3.7.0", + "wd": "0.3.11", + "xtend": "2.1.2", + "yamljs": "0.1.4", + "zuul-localtunnel": "1.1.0" + }, + "dependencies": { + "commander": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", + "dev": true + }, + "convert-source-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.0.0.tgz", + "integrity": "sha1-29y2lSPTr1gve1yUs8Jezy87c1U=", + "dev": true + }, + "debug": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.0.tgz", + "integrity": "sha1-M6uRVlnYwsyKQUQ9lNbr03aX7SE=", + "dev": true, + "requires": { + "ms": "0.6.2" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", + "dev": true + } + } + }, + "zuul-localtunnel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/zuul-localtunnel/-/zuul-localtunnel-1.1.0.tgz", + "integrity": "sha1-cK0n+wpq+WiiFR/F1eiV2qGu0V0=", + "dev": true, + "requires": { + "localtunnel": "1.5.0" + } + }, + "zuul-ngrok": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/zuul-ngrok/-/zuul-ngrok-4.0.0.tgz", + "integrity": "sha1-+nTR/MNFemYHOnB4IkQ1mRJscaA=", + "dev": true, + "requires": { + "ngrok": "2.1.8", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json index 5e56691..aeb04a9 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,9 @@ "isarray": "2.0.1" }, "devDependencies": { + "@babel/core": "~7.9.6", + "@babel/preset-env": "~7.9.6", + "babelify": "~10.0.0", "benchmark": "2.1.2", "expect.js": "0.3.1", "mocha": "3.2.0", diff --git a/zuul.config.js b/zuul.config.js index 46d3108..cc78487 100644 --- a/zuul.config.js +++ b/zuul.config.js @@ -23,6 +23,16 @@ if (process.env.CI === 'true') { type: 'ngrok', bind_tls: true }; + zuulConfig.browserify = [ + { + transform: { + name: "babelify", + presets: ["@babel/preset-env"], + global: true, + only: [ /\/node_modules\/debug\// ] + } + } + ] } var isPullRequest = process.env.TRAVIS_PULL_REQUEST && process.env.TRAVIS_PULL_REQUEST !== 'false'; From dcb942d24db97162ad16a67c2a0cf30875342d55 Mon Sep 17 00:00:00 2001 From: bcaller Date: Wed, 13 May 2020 06:37:32 +0100 Subject: [PATCH 082/129] fix: prevent DoS (OOM) via massive packets (#95) When maxHttpBufferSize is large (1e8 bytes), a payload of length 100MB can be sent like so: 99999991:422222222222222222222222222222222222222222222... This massive packet can cause OOM via building up many many `ConsOneByteString` objects due to concatenation: 99999989 `ConsOneByteString`s and then converting the massive integer to a `Number`. The performance can be improved to avoid this by using `substring` rather than building the string via concatenation. Below I tried one payload of length 7e7 as the 1e8 payload took so long to process that it timed out before running out of memory. ``` ==== JS stack trace ========================================= 0: ExitFrame [pc: 0x13c5b79] Security context: 0x152fe7b808d1 1: decodeString [0x2dd385fb5d1] [/node_modules/socket.io-parser/index.js:~276] [pc=0xf59746881be](this=0x175d34c42b69 ,0x14eccff10fe1 ) 2: add [0x31fc2693da29] [/node_modules/socket.io-parser/index.js:242] [bytecode=0xa7ed6554889 offset=11](this=0x0a2881be5069 ,0x14eccff10fe1 Date: Wed, 13 May 2020 07:57:04 +0200 Subject: [PATCH 083/129] chore: release 3.4.1 Diff: https://github.com/socketio/socket.io-parser/compare/3.4.0...3.4.1 --- CHANGELOG.md | 6 ++++++ package-lock.json | 2 +- package.json | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4fe8f3a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,6 @@ +## [3.4.1](https://github.com/socketio/socket.io-parser/compare/3.4.0...3.4.1) (2020-05-13) + + +### Bug Fixes + +* prevent DoS (OOM) via massive packets ([#95](https://github.com/socketio/socket.io-parser/issues/95)) ([dcb942d](https://github.com/socketio/socket.io-parser/commit/dcb942d24db97162ad16a67c2a0cf30875342d55)) diff --git a/package-lock.json b/package-lock.json index 91d45c8..307b55c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "3.4.0", + "version": "3.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index aeb04a9..59acfab 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "socket.io-parser", - "version": "3.4.0", + "version": "3.4.1", "description": "socket.io protocol parser", "repository": { "type": "git", - "url": "https://github.com/Automattic/socket.io-parser.git" + "url": "https://github.com/socketio/socket.io-parser.git" }, "files": [ "binary.js", From 6a59237ed03f91e507e954333d63d19f3db534c6 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 17 Sep 2020 15:27:33 +0200 Subject: [PATCH 084/129] test: add Node.js 12 and 14 in the build matrix Node.js 8 is removed, as it is now EOL. Note: the node_modules folder is cached by default --- .travis.yml | 6 ++---- package.json | 5 ++++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index d6cccc0..7d1d119 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,17 +1,15 @@ language: node_js sudo: false node_js: - - '8' - '10' + - '12' + - '14' git: depth: 1 matrix: include: - node_js: 10 env: BROWSERS=1 -cache: - directories: - - node_modules env: global: - secure: >- diff --git a/package.json b/package.json index 59acfab..ae6be5c 100644 --- a/package.json +++ b/package.json @@ -30,5 +30,8 @@ "scripts": { "test": "make test" }, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } } From ea41f225ee9922adb09cdb46bb27260ebbd8e8a4 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 18 Sep 2020 14:09:53 +0200 Subject: [PATCH 085/129] perf: update benchmarks --- bench/bench.js | 10 ------- bench/index.js | 68 +++++++++++++++++++++++------------------------- bench/results.md | 4 +++ 3 files changed, 37 insertions(+), 45 deletions(-) delete mode 100644 bench/bench.js create mode 100644 bench/results.md diff --git a/bench/bench.js b/bench/bench.js deleted file mode 100644 index d767d5a..0000000 --- a/bench/bench.js +++ /dev/null @@ -1,10 +0,0 @@ -var bencher = require('./index'); -bencher(function(benchmark) { - function logMean(test) { - console.log(test.name + ' mean run time: ' + test.stats.mean); - } - - for (var i = 0; i < benchmark.length; i++) { - logMean(benchmark[i]); - } -}); diff --git a/bench/index.js b/bench/index.js index 8c1994e..16c8015 100644 --- a/bench/index.js +++ b/bench/index.js @@ -1,20 +1,21 @@ -var Benchmark = require('benchmark'); -var parser = require('../index'); +const Benchmark = require('benchmark'); +const parser = require('../index'); function test(packet, deferred) { - var encoder = new parser.Encoder(); - var decoder = new parser.Decoder(); - encoder.encode(packet, function(encodedPackets) { - var decoder = new parser.Decoder(); - decoder.on('decoded', function(packet) { + const encoder = new parser.Encoder(); + encoder.encode(packet, encodedPackets => { + const decoder = new parser.Decoder(); + decoder.on('decoded', packet => { deferred.resolve(); }); - decoder.add(encodedPackets[0]); + for (const encodedPacket of encodedPackets) { + decoder.add(encodedPacket); + } }); } -var dataObject = { +const dataObject = [{ 'a': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 'b': 'xxxyyyzzzalsdfalskdjfalksdjfalksdjfalksdjfjjfjfjfjjfjfjfj', 'data': { @@ -25,57 +26,54 @@ var dataObject = { } } } -}; -var bigArray = []; -for (var i = 0; i < 250; i++) { +}]; +const bigArray = []; +for (let i = 0; i < 250; i++) { bigArray.push(dataObject); } +const suite = new Benchmark.Suite(); - -module.exports = function(callback) { - var suite = new Benchmark.Suite(); - - suite.add('small json parse', {defer: true, fn: function(deferred) { - var packet = { +suite + .add('small json parse', {defer: true, fn: deferred => { + const packet = { type: parser.EVENT, nsp: '/bench', data: dataObject }; test(packet, deferred); }}) - .add('big json parse', {defer: true, fn: function(deferred) { - var packet = { + .add('big json parse', {defer: true, fn: deferred => { + const packet = { type: parser.EVENT, nsp: '/bench', data: bigArray }; test(packet, deferred); }}) - .add('json with small binary parse', {defer: true, fn: function(deferred) { - var packet = { - type: parser.EVENT, + .add('json with small binary parse', {defer: true, fn: deferred => { + const packet = { + type: parser.BINARY_EVENT, nsp: '/bench', - data: {'a': [1, 2, 3], 'b': 'xxxyyyzzz', 'data': new Buffer(1000)} + data: [{'a': [1, 2, 3], 'b': 'xxxyyyzzz', 'data': Buffer.allocUnsafe(1000)}] }; test(packet, deferred); }}) - .add('json with big binary parse', {defer: true, fn: function(deferred) { - var bigBinaryData = { - bin1: new Buffer(10000), + .add('json with big binary parse', {defer: true, fn: deferred => { + const bigBinaryData = [{ + bin1: Buffer.allocUnsafe(10000), arr: bigArray, - bin2: new Buffer(10000), - bin3: new Buffer(10000) - }; - var packet = { - type: parser.EVENT, + bin2: Buffer.allocUnsafe(10000), + bin3: Buffer.allocUnsafe(10000) + }]; + const packet = { + type: parser.BINARY_EVENT, nsp: '/bench', data: bigBinaryData }; test(packet, deferred); }}) - .on('complete', function() { - callback(this); + .on('cycle', function(event) { + console.log(String(event.target)); }) .run({'async': true}); -}; diff --git a/bench/results.md b/bench/results.md new file mode 100644 index 0000000..911570b --- /dev/null +++ b/bench/results.md @@ -0,0 +1,4 @@ +small json parse x 67,893 ops/sec ±4.30% (76 runs sampled) +big json parse x 1,507 ops/sec ±1.72% (82 runs sampled) +json with small binary parse x 62,367 ops/sec ±6.03% (74 runs sampled) +json with big binary parse x 572 ops/sec ±1.25% (86 runs sampled) From b23576a73ee1d95ffdf75249f8af5ff969237cd4 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 22 Sep 2020 22:41:56 +0200 Subject: [PATCH 086/129] refactor: migrate to TypeScript --- .gitignore | 3 +- Makefile | 14 -- bench/index.js | 2 +- index.js | 412 ------------------------------------- is-buffer.js | 20 -- binary.js => lib/binary.ts | 112 +++++----- lib/index.ts | 395 +++++++++++++++++++++++++++++++++++ lib/is-buffer.ts | 22 ++ package-lock.json | 41 +++- package.json | 22 +- test/arraybuffer.js | 2 +- test/blob.js | 2 +- test/buffer.js | 6 +- test/helpers.js | 2 +- test/parser.js | 2 +- tsconfig.json | 12 ++ zuul.config.js | 10 +- 17 files changed, 553 insertions(+), 526 deletions(-) delete mode 100644 Makefile delete mode 100644 index.js delete mode 100644 is-buffer.js rename binary.js => lib/binary.ts (51%) create mode 100644 lib/index.ts create mode 100644 lib/is-buffer.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index bb66ab2..44d646d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ node_modules -build -components +dist/ diff --git a/Makefile b/Makefile deleted file mode 100644 index 5bbd22a..0000000 --- a/Makefile +++ /dev/null @@ -1,14 +0,0 @@ - -help: ## print this message - @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' - -test: ## run tests either in the browser or in Node.js, based on the `BROWSERS` variable - @if [ "x$(BROWSERS)" = "x" ]; then make test-node; else make test-zuul; fi - -test-node: ## run tests in Node.js - @./node_modules/.bin/mocha --reporter dot --bail test/index.js - -test-zuul: ## run tests in the browser - @./node_modules/zuul/bin/zuul test/index.js - -.PHONY: help test test-node test-zuul diff --git a/bench/index.js b/bench/index.js index 16c8015..10cb8dc 100644 --- a/bench/index.js +++ b/bench/index.js @@ -1,5 +1,5 @@ const Benchmark = require('benchmark'); -const parser = require('../index'); +const parser = require('..'); function test(packet, deferred) { const encoder = new parser.Encoder(); diff --git a/index.js b/index.js deleted file mode 100644 index ff613cc..0000000 --- a/index.js +++ /dev/null @@ -1,412 +0,0 @@ - -/** - * Module dependencies. - */ - -var debug = require('debug')('socket.io-parser'); -var Emitter = require('component-emitter'); -var binary = require('./binary'); -var isArray = require('isarray'); -var isBuf = require('./is-buffer'); - -/** - * Protocol version. - * - * @api public - */ - -exports.protocol = 4; - -/** - * Packet types. - * - * @api public - */ - -exports.types = [ - 'CONNECT', - 'DISCONNECT', - 'EVENT', - 'ACK', - 'ERROR', - 'BINARY_EVENT', - 'BINARY_ACK' -]; - -/** - * Packet type `connect`. - * - * @api public - */ - -exports.CONNECT = 0; - -/** - * Packet type `disconnect`. - * - * @api public - */ - -exports.DISCONNECT = 1; - -/** - * Packet type `event`. - * - * @api public - */ - -exports.EVENT = 2; - -/** - * Packet type `ack`. - * - * @api public - */ - -exports.ACK = 3; - -/** - * Packet type `error`. - * - * @api public - */ - -exports.ERROR = 4; - -/** - * Packet type 'binary event' - * - * @api public - */ - -exports.BINARY_EVENT = 5; - -/** - * Packet type `binary ack`. For acks with binary arguments. - * - * @api public - */ - -exports.BINARY_ACK = 6; - -/** - * Encoder constructor. - * - * @api public - */ - -exports.Encoder = Encoder; - -/** - * Decoder constructor. - * - * @api public - */ - -exports.Decoder = Decoder; - -/** - * A socket.io Encoder instance - * - * @api public - */ - -function Encoder() {} - -var ERROR_PACKET = exports.ERROR + '"encode error"'; - -/** - * Encode a packet as a single string if non-binary, or as a - * buffer sequence, depending on packet type. - * - * @param {Object} obj - packet object - * @param {Function} callback - function to handle encodings (likely engine.write) - * @return Calls callback with Array of encodings - * @api public - */ - -Encoder.prototype.encode = function(obj, callback){ - debug('encoding packet %j', obj); - - if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) { - encodeAsBinary(obj, callback); - } else { - var encoding = encodeAsString(obj); - callback([encoding]); - } -}; - -/** - * Encode packet as string. - * - * @param {Object} packet - * @return {String} encoded - * @api private - */ - -function encodeAsString(obj) { - - // first is type - var str = '' + obj.type; - - // attachments if we have them - if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) { - str += obj.attachments + '-'; - } - - // if we have a namespace other than `/` - // we append it followed by a comma `,` - if (obj.nsp && '/' !== obj.nsp) { - str += obj.nsp + ','; - } - - // immediately followed by the id - if (null != obj.id) { - str += obj.id; - } - - // json data - if (null != obj.data) { - var payload = tryStringify(obj.data); - if (payload !== false) { - str += payload; - } else { - return ERROR_PACKET; - } - } - - debug('encoded %j as %s', obj, str); - return str; -} - -function tryStringify(str) { - try { - return JSON.stringify(str); - } catch(e){ - return false; - } -} - -/** - * Encode packet as 'buffer sequence' by removing blobs, and - * deconstructing packet into object with placeholders and - * a list of buffers. - * - * @param {Object} packet - * @return {Buffer} encoded - * @api private - */ - -function encodeAsBinary(obj, callback) { - - function writeEncoding(bloblessData) { - var deconstruction = binary.deconstructPacket(bloblessData); - var pack = encodeAsString(deconstruction.packet); - var buffers = deconstruction.buffers; - - buffers.unshift(pack); // add packet info to beginning of data list - callback(buffers); // write all the buffers - } - - binary.removeBlobs(obj, writeEncoding); -} - -/** - * A socket.io Decoder instance - * - * @return {Object} decoder - * @api public - */ - -function Decoder() { - this.reconstructor = null; -} - -/** - * Mix in `Emitter` with Decoder. - */ - -Emitter(Decoder.prototype); - -/** - * Decodes an encoded packet string into packet JSON. - * - * @param {String} obj - encoded packet - * @return {Object} packet - * @api public - */ - -Decoder.prototype.add = function(obj) { - var packet; - if (typeof obj === 'string') { - packet = decodeString(obj); - if (exports.BINARY_EVENT === packet.type || exports.BINARY_ACK === packet.type) { // binary packet's json - this.reconstructor = new BinaryReconstructor(packet); - - // no attachments, labeled binary but no binary data to follow - if (this.reconstructor.reconPack.attachments === 0) { - this.emit('decoded', packet); - } - } else { // non-binary full packet - this.emit('decoded', packet); - } - } else if (isBuf(obj) || obj.base64) { // raw binary data - if (!this.reconstructor) { - throw new Error('got binary data when not reconstructing a packet'); - } else { - packet = this.reconstructor.takeBinaryData(obj); - if (packet) { // received final buffer - this.reconstructor = null; - this.emit('decoded', packet); - } - } - } else { - throw new Error('Unknown type: ' + obj); - } -}; - -/** - * Decode a packet String (JSON data) - * - * @param {String} str - * @return {Object} packet - * @api private - */ - -function decodeString(str) { - var i = 0; - // look up type - var p = { - type: Number(str.charAt(0)) - }; - - if (null == exports.types[p.type]) { - return error('unknown packet type ' + p.type); - } - - // look up attachments if type binary - if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) { - var start = i + 1; - while (str.charAt(++i) !== '-' && i != str.length) {} - var buf = str.substring(start, i); - if (buf != Number(buf) || str.charAt(i) !== '-') { - throw new Error('Illegal attachments'); - } - p.attachments = Number(buf); - } - - // look up namespace (if any) - if ('/' === str.charAt(i + 1)) { - var start = i + 1; - while (++i) { - var c = str.charAt(i); - if (',' === c) break; - if (i === str.length) break; - } - p.nsp = str.substring(start, i); - } else { - p.nsp = '/'; - } - - // look up id - var next = str.charAt(i + 1); - if ('' !== next && Number(next) == next) { - var start = i + 1; - while (++i) { - var c = str.charAt(i); - if (null == c || Number(c) != c) { - --i; - break; - } - if (i === str.length) break; - } - p.id = Number(str.substring(start, i + 1)); - } - - // look up json data - if (str.charAt(++i)) { - var payload = tryParse(str.substr(i)); - var isPayloadValid = payload !== false && (p.type === exports.ERROR || isArray(payload)); - if (isPayloadValid) { - p.data = payload; - } else { - return error('invalid payload'); - } - } - - debug('decoded %s as %j', str, p); - return p; -} - -function tryParse(str) { - try { - return JSON.parse(str); - } catch(e){ - return false; - } -} - -/** - * Deallocates a parser's resources - * - * @api public - */ - -Decoder.prototype.destroy = function() { - if (this.reconstructor) { - this.reconstructor.finishedReconstruction(); - } -}; - -/** - * A manager of a binary event's 'buffer sequence'. Should - * be constructed whenever a packet of type BINARY_EVENT is - * decoded. - * - * @param {Object} packet - * @return {BinaryReconstructor} initialized reconstructor - * @api private - */ - -function BinaryReconstructor(packet) { - this.reconPack = packet; - this.buffers = []; -} - -/** - * Method to be called when binary data received from connection - * after a BINARY_EVENT packet. - * - * @param {Buffer | ArrayBuffer} binData - the raw binary data received - * @return {null | Object} returns null if more binary data is expected or - * a reconstructed packet object if all buffers have been received. - * @api private - */ - -BinaryReconstructor.prototype.takeBinaryData = function(binData) { - this.buffers.push(binData); - if (this.buffers.length === this.reconPack.attachments) { // done with buffer list - var packet = binary.reconstructPacket(this.reconPack, this.buffers); - this.finishedReconstruction(); - return packet; - } - return null; -}; - -/** - * Cleans up binary packet reconstruction variables. - * - * @api private - */ - -BinaryReconstructor.prototype.finishedReconstruction = function() { - this.reconPack = null; - this.buffers = []; -}; - -function error(msg) { - return { - type: exports.ERROR, - data: 'parser error: ' + msg - }; -} diff --git a/is-buffer.js b/is-buffer.js deleted file mode 100644 index c833865..0000000 --- a/is-buffer.js +++ /dev/null @@ -1,20 +0,0 @@ - -module.exports = isBuf; - -var withNativeBuffer = typeof Buffer === 'function' && typeof Buffer.isBuffer === 'function'; -var withNativeArrayBuffer = typeof ArrayBuffer === 'function'; - -var isView = function (obj) { - return typeof ArrayBuffer.isView === 'function' ? ArrayBuffer.isView(obj) : (obj.buffer instanceof ArrayBuffer); -}; - -/** - * Returns true if obj is a buffer or an arraybuffer. - * - * @api private - */ - -function isBuf(obj) { - return (withNativeBuffer && Buffer.isBuffer(obj)) || - (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))); -} diff --git a/binary.js b/lib/binary.ts similarity index 51% rename from binary.js rename to lib/binary.ts index 3e2347d..bcd57c2 100644 --- a/binary.js +++ b/lib/binary.ts @@ -1,14 +1,14 @@ -/*global Blob,File*/ - -/** - * Module requirements - */ - -var isArray = require('isarray'); -var isBuf = require('./is-buffer'); -var toString = Object.prototype.toString; -var withNativeBlob = typeof Blob === 'function' || (typeof Blob !== 'undefined' && toString.call(Blob) === '[object BlobConstructor]'); -var withNativeFile = typeof File === 'function' || (typeof File !== 'undefined' && toString.call(File) === '[object FileConstructor]'); +import isBuf from "./is-buffer"; + +const toString = Object.prototype.toString; +const withNativeBlob = + typeof Blob === "function" || + (typeof Blob !== "undefined" && + toString.call(Blob) === "[object BlobConstructor]"); +const withNativeFile = + typeof File === "function" || + (typeof File !== "undefined" && + toString.call(File) === "[object FileConstructor]"); /** * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder. @@ -17,35 +17,37 @@ var withNativeFile = typeof File === 'function' || (typeof File !== 'undefined' * * @param {Object} packet - socket.io event packet * @return {Object} with deconstructed packet and list of buffers - * @api public + * @public */ -exports.deconstructPacket = function(packet) { - var buffers = []; - var packetData = packet.data; - var pack = packet; +export function deconstructPacket(packet) { + const buffers = []; + const packetData = packet.data; + const pack = packet; pack.data = _deconstructPacket(packetData, buffers); pack.attachments = buffers.length; // number of binary 'attachments' - return {packet: pack, buffers: buffers}; -}; + return { packet: pack, buffers: buffers }; +} function _deconstructPacket(data, buffers) { if (!data) return data; if (isBuf(data)) { - var placeholder = { _placeholder: true, num: buffers.length }; + const placeholder = { _placeholder: true, num: buffers.length }; buffers.push(data); return placeholder; - } else if (isArray(data)) { - var newData = new Array(data.length); - for (var i = 0; i < data.length; i++) { + } else if (Array.isArray(data)) { + const newData = new Array(data.length); + for (let i = 0; i < data.length; i++) { newData[i] = _deconstructPacket(data[i], buffers); } return newData; - } else if (typeof data === 'object' && !(data instanceof Date)) { - var newData = {}; - for (var key in data) { - newData[key] = _deconstructPacket(data[key], buffers); + } else if (typeof data === "object" && !(data instanceof Date)) { + const newData = {}; + for (const key in data) { + if (data.hasOwnProperty(key)) { + newData[key] = _deconstructPacket(data[key], buffers); + } } return newData; } @@ -58,27 +60,29 @@ function _deconstructPacket(data, buffers) { * @param {Object} packet - event packet with placeholders * @param {Array} buffers - binary buffers to put in placeholder positions * @return {Object} reconstructed packet - * @api public + * @public */ -exports.reconstructPacket = function(packet, buffers) { +export function reconstructPacket(packet, buffers) { packet.data = _reconstructPacket(packet.data, buffers); packet.attachments = undefined; // no longer useful return packet; -}; +} function _reconstructPacket(data, buffers) { if (!data) return data; if (data && data._placeholder) { return buffers[data.num]; // appropriate buffer (should be natural order anyway) - } else if (isArray(data)) { - for (var i = 0; i < data.length; i++) { + } else if (Array.isArray(data)) { + for (let i = 0; i < data.length; i++) { data[i] = _reconstructPacket(data[i], buffers); } - } else if (typeof data === 'object') { - for (var key in data) { - data[key] = _reconstructPacket(data[key], buffers); + } else if (typeof data === "object") { + for (const key in data) { + if (data.hasOwnProperty(key)) { + data[key] = _reconstructPacket(data[key], buffers); + } } } @@ -95,47 +99,53 @@ function _reconstructPacket(data, buffers) { * @api private */ -exports.removeBlobs = function(data, callback) { - function _removeBlobs(obj, curKey, containingObject) { +export function removeBlobs(data, callback) { + function _removeBlobs(obj, curKey?, containingObject?) { if (!obj) return obj; // convert any blob - if ((withNativeBlob && obj instanceof Blob) || - (withNativeFile && obj instanceof File)) { + if ( + (withNativeBlob && obj instanceof Blob) || + (withNativeFile && obj instanceof File) + ) { pendingBlobs++; // async filereader - var fileReader = new FileReader(); - fileReader.onload = function() { // this.result == arraybuffer + const fileReader = new FileReader(); + fileReader.onload = function () { + // this.result == arraybuffer if (containingObject) { containingObject[curKey] = this.result; - } - else { + } else { bloblessData = this.result; } // if nothing pending its callback time - if(! --pendingBlobs) { + if (!--pendingBlobs) { callback(bloblessData); } }; fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer - } else if (isArray(obj)) { // handle array - for (var i = 0; i < obj.length; i++) { + } else if (Array.isArray(obj)) { + // handle array + for (let i = 0; i < obj.length; i++) { _removeBlobs(obj[i], i, obj); } - } else if (typeof obj === 'object' && !isBuf(obj)) { // and object - for (var key in obj) { - _removeBlobs(obj[key], key, obj); + } else if (typeof obj === "object" && !isBuf(obj)) { + // and object + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + _removeBlobs(obj[key], key, obj); + } } } } - var pendingBlobs = 0; - var bloblessData = data; + let pendingBlobs = 0; + let bloblessData = data; _removeBlobs(bloblessData); if (!pendingBlobs) { callback(bloblessData); } -}; +} diff --git a/lib/index.ts b/lib/index.ts new file mode 100644 index 0000000..ee87d03 --- /dev/null +++ b/lib/index.ts @@ -0,0 +1,395 @@ +import * as Emitter from "component-emitter"; +import * as binary from "./binary"; +import isBuf from "./is-buffer"; +import debugModule from "debug"; + +const debug = debugModule("socket.io-parser"); + +/** + * Protocol version. + * + * @public + */ + +export const protocol: number = 4; + +/** + * Packet types. + * + * @public + */ + +export const types: Array = [ + "CONNECT", + "DISCONNECT", + "EVENT", + "ACK", + "ERROR", + "BINARY_EVENT", + "BINARY_ACK", +]; + +export enum PacketType { + CONNECT, + DISCONNECT, + EVENT, + ACK, + ERROR, + BINARY_EVENT, + BINARY_ACK, +} + +interface Packet { + type: PacketType; + nsp: string; + data?: any; + id?: number; + attachments?: number; +} + +/** + * Packet type `connect`. + * + * @public + */ + +export const CONNECT: number = 0; + +/** + * Packet type `disconnect`. + * + * @public + */ + +export const DISCONNECT: number = 1; + +/** + * Packet type `event`. + * + * @public + */ + +export const EVENT: number = 2; + +/** + * Packet type `ack`. + * + * @public + */ + +export const ACK: number = 3; + +/** + * Packet type `error`. + * + * @public + */ + +export const ERROR: number = 4; + +/** + * Packet type 'binary event' + * + * @public + */ + +export const BINARY_EVENT: number = 5; + +/** + * Packet type `binary ack`. For acks with binary arguments. + * + * @api public + */ + +export const BINARY_ACK: number = 6; + +/** + * A socket.io Encoder instance + */ + +export class Encoder { + /** + * Encode a packet as a single string if non-binary, or as a + * buffer sequence, depending on packet type. + * + * @param {Object} obj - packet object + * @param {Function} callback - function to handle encodings (likely engine.write) + * @return Calls callback with Array of encodings + */ + public encode(obj: Packet, callback: Function) { + debug("encoding packet %j", obj); + + if ( + obj.type === PacketType.BINARY_EVENT || + obj.type === PacketType.BINARY_ACK + ) { + this.encodeAsBinary(obj, callback); + } else { + const encoding = this.encodeAsString(obj); + callback([encoding]); + } + } + + /** + * Encode packet as string. + */ + + private encodeAsString(obj: Packet) { + // first is type + let str = "" + obj.type; + + // attachments if we have them + if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) { + str += obj.attachments + "-"; + } + + // if we have a namespace other than `/` + // we append it followed by a comma `,` + if (obj.nsp && "/" !== obj.nsp) { + str += obj.nsp + ","; + } + + // immediately followed by the id + if (null != obj.id) { + str += obj.id; + } + + // json data + if (null != obj.data) { + const payload = tryStringify(obj.data); + if (payload !== false) { + str += payload; + } else { + return ERROR_PACKET; + } + } + + debug("encoded %j as %s", obj, str); + return str; + } + + /** + * Encode packet as 'buffer sequence' by removing blobs, and + * deconstructing packet into object with placeholders and + * a list of buffers. + */ + + private encodeAsBinary(obj: Packet, callback: Function) { + binary.removeBlobs(obj, (bloblessData) => { + const deconstruction = binary.deconstructPacket(bloblessData); + const pack = this.encodeAsString(deconstruction.packet); + const buffers = deconstruction.buffers; + + buffers.unshift(pack); // add packet info to beginning of data list + callback(buffers); // write all the buffers + }); + } +} + +const ERROR_PACKET = exports.ERROR + '"encode error"'; + +function tryStringify(str) { + try { + return JSON.stringify(str); + } catch (e) { + return false; + } +} + +/** + * A socket.io Decoder instance + * + * @return {Object} decoder + */ +// @ts-ignore +export class Decoder extends Emitter { + private reconstructor: BinaryReconstructor; + + constructor() { + super(); + } + + /** + * Decodes an encoded packet string into packet JSON. + * + * @param {String} obj - encoded packet + */ + + public add(obj: any) { + let packet; + if (typeof obj === "string") { + packet = this.decodeString(obj); + if ( + exports.BINARY_EVENT === packet.type || + exports.BINARY_ACK === packet.type + ) { + // binary packet's json + this.reconstructor = new BinaryReconstructor(packet); + + // no attachments, labeled binary but no binary data to follow + if (packet.attachments === 0) { + super.emit("decoded", packet); + } + } else { + // non-binary full packet + super.emit("decoded", packet); + } + } else if (isBuf(obj) || obj.base64) { + // raw binary data + if (!this.reconstructor) { + throw new Error("got binary data when not reconstructing a packet"); + } else { + packet = this.reconstructor.takeBinaryData(obj); + if (packet) { + // received final buffer + this.reconstructor = null; + super.emit("decoded", packet); + } + } + } else { + throw new Error("Unknown type: " + obj); + } + } + + /** + * Decode a packet String (JSON data) + * + * @param {String} str + * @return {Object} packet + */ + private decodeString(str) { + let i = 0; + // look up type + const p: any = { + type: Number(str.charAt(0)), + }; + + if (null == exports.types[p.type]) { + return error("unknown packet type " + p.type); + } + + // look up attachments if type binary + if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) { + const start = i + 1; + while (str.charAt(++i) !== "-" && i != str.length) {} + const buf = str.substring(start, i); + if (buf != Number(buf) || str.charAt(i) !== "-") { + throw new Error("Illegal attachments"); + } + p.attachments = Number(buf); + } + + // look up namespace (if any) + if ("/" === str.charAt(i + 1)) { + const start = i + 1; + while (++i) { + const c = str.charAt(i); + if ("," === c) break; + if (i === str.length) break; + } + p.nsp = str.substring(start, i); + } else { + p.nsp = "/"; + } + + // look up id + const next = str.charAt(i + 1); + if ("" !== next && Number(next) == next) { + const start = i + 1; + while (++i) { + const c = str.charAt(i); + if (null == c || Number(c) != c) { + --i; + break; + } + if (i === str.length) break; + } + p.id = Number(str.substring(start, i + 1)); + } + + // look up json data + if (str.charAt(++i)) { + const payload = tryParse(str.substr(i)); + const isPayloadValid = + payload !== false && + (p.type === exports.ERROR || Array.isArray(payload)); + if (isPayloadValid) { + p.data = payload; + } else { + return error("invalid payload"); + } + } + + debug("decoded %s as %j", str, p); + return p; + } + + /** + * Deallocates a parser's resources + */ + public destroy() { + if (this.reconstructor) { + this.reconstructor.finishedReconstruction(); + } + } +} + +function tryParse(str) { + try { + return JSON.parse(str); + } catch (e) { + return false; + } +} + +/** + * A manager of a binary event's 'buffer sequence'. Should + * be constructed whenever a packet of type BINARY_EVENT is + * decoded. + * + * @param {Object} packet + * @return {BinaryReconstructor} initialized reconstructor + */ + +class BinaryReconstructor { + private reconPack; + private buffers: Array = []; + + constructor(readonly packet: Packet) { + this.reconPack = packet; + } + + /** + * Method to be called when binary data received from connection + * after a BINARY_EVENT packet. + * + * @param {Buffer | ArrayBuffer} binData - the raw binary data received + * @return {null | Object} returns null if more binary data is expected or + * a reconstructed packet object if all buffers have been received. + */ + public takeBinaryData(binData) { + this.buffers.push(binData); + if (this.buffers.length === this.reconPack.attachments) { + // done with buffer list + const packet = binary.reconstructPacket(this.reconPack, this.buffers); + this.finishedReconstruction(); + return packet; + } + return null; + } + + /** + * Cleans up binary packet reconstruction variables. + */ + public finishedReconstruction() { + this.reconPack = null; + this.buffers = []; + } +} + +function error(msg) { + return { + type: exports.ERROR, + data: "parser error: " + msg, + }; +} diff --git a/lib/is-buffer.ts b/lib/is-buffer.ts new file mode 100644 index 0000000..36eb72d --- /dev/null +++ b/lib/is-buffer.ts @@ -0,0 +1,22 @@ +const withNativeBuffer: boolean = + typeof Buffer === "function" && typeof Buffer.isBuffer === "function"; +const withNativeArrayBuffer: boolean = typeof ArrayBuffer === "function"; + +const isView = (obj: any) => { + return typeof ArrayBuffer.isView === "function" + ? ArrayBuffer.isView(obj) + : obj.buffer instanceof ArrayBuffer; +}; + +/** + * Returns true if obj is a buffer or an arraybuffer. + * + * @private + */ + +export default function isBuf(obj) { + return ( + (withNativeBuffer && Buffer.isBuffer(obj)) || + (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) + ); +} diff --git a/package-lock.json b/package-lock.json index 307b55c..c9155ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -908,6 +908,24 @@ "to-fast-properties": "^2.0.0" } }, + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", + "dev": true + }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", + "dev": true + }, + "@types/node": { + "version": "14.11.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.1.tgz", + "integrity": "sha512-oTQgnd0hblfLsJ6BvJzzSL+Inogp3lq9fGgqRkMB/ziKMgEUaFl801OncOzUmalfzt14N0oPHMK47ipl+wbTIw==", + "dev": true + }, "JSON2": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/JSON2/-/JSON2-0.1.0.tgz", @@ -2057,9 +2075,9 @@ } }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "compress-commons": { "version": "0.2.9", @@ -3979,11 +3997,6 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - }, "isbinaryfile": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-0.1.9.tgz", @@ -5855,6 +5868,12 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "prettier": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "dev": true + }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -7533,6 +7552,12 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typescript": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", + "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", + "dev": true + }, "uglify-js": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", diff --git a/package.json b/package.json index ae6be5c..a403585 100644 --- a/package.json +++ b/package.json @@ -7,28 +7,36 @@ "url": "https://github.com/socketio/socket.io-parser.git" }, "files": [ - "binary.js", - "index.js", - "is-buffer.js" + "dist/" ], + "main": "./dist/index.js", + "types": "./dist/index.d.ts", "dependencies": { - "debug": "~4.1.0", - "component-emitter": "1.2.1", - "isarray": "2.0.1" + "component-emitter": "~1.3.0", + "debug": "~4.1.0" }, "devDependencies": { "@babel/core": "~7.9.6", "@babel/preset-env": "~7.9.6", + "@types/component-emitter": "^1.2.10", + "@types/debug": "^4.1.5", + "@types/node": "^14.11.1", "babelify": "~10.0.0", "benchmark": "2.1.2", "expect.js": "0.3.1", "mocha": "3.2.0", + "prettier": "^2.1.2", "socket.io-browsers": "^1.0.0", + "typescript": "^4.0.3", "zuul": "3.11.1", "zuul-ngrok": "4.0.0" }, "scripts": { - "test": "make test" + "test": "npm run format:check && tsc && if test \"$BROWSERS\" = \"1\" ; then npm run test:browser; else npm run test:node; fi", + "test:node": "mocha --reporter dot --bail test/index.js", + "test:browser": "zuul test/index.js --no-coverage", + "format:fix": "prettier --write --parser typescript \"lib/**/*.ts\"", + "format:check": "prettier --check --parser typescript \"lib/**/*.ts\"" }, "license": "MIT", "engines": { diff --git a/test/arraybuffer.js b/test/arraybuffer.js index c8295f1..f39d024 100644 --- a/test/arraybuffer.js +++ b/test/arraybuffer.js @@ -1,4 +1,4 @@ -var parser = require('../index.js'); +var parser = require('..'); var expect = require('expect.js'); var helpers = require('./helpers.js'); var encoder = new parser.Encoder(); diff --git a/test/blob.js b/test/blob.js index 4e101fe..7ec926c 100644 --- a/test/blob.js +++ b/test/blob.js @@ -1,4 +1,4 @@ -var parser = require('../index.js'); +var parser = require('..'); var helpers = require('./helpers.js'); var BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : diff --git a/test/buffer.js b/test/buffer.js index 3aba898..4e0512b 100644 --- a/test/buffer.js +++ b/test/buffer.js @@ -1,4 +1,4 @@ -var parser = require('../index.js'); +var parser = require('..'); var expect = require('expect.js'); var helpers = require('./helpers.js'); var encode = parser.encode; @@ -8,7 +8,7 @@ describe('parser', function() { it('encodes a Buffer', function() { helpers.test_bin({ type: parser.BINARY_EVENT, - data: ['a', new Buffer('abc', 'utf8')], + data: ['a', Buffer.from('abc', 'utf8')], id: 23, nsp: '/cool' }); @@ -17,7 +17,7 @@ describe('parser', function() { it('encodes a binary ack with Buffer', function() { helpers.test_bin({ type: parser.BINARY_ACK, - data: ['a', new Buffer('xxx', 'utf8'), {}], + data: ['a', Buffer.from('xxx', 'utf8'), {}], id: 127, nsp: '/back' }) diff --git a/test/helpers.js b/test/helpers.js index e6a754c..822b31a 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -1,4 +1,4 @@ -var parser = require('../index.js'); +var parser = require('..'); var expect = require('expect.js'); var encoder = new parser.Encoder(); diff --git a/test/parser.js b/test/parser.js index 652aa7f..281f188 100644 --- a/test/parser.js +++ b/test/parser.js @@ -1,4 +1,4 @@ -var parser = require('../index.js'); +var parser = require('..'); var expect = require('expect.js'); var helpers = require('./helpers.js'); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..87d51bf --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "allowJs": false, + "target": "es2017", + "module": "commonjs", + "declaration": true + }, + "include": [ + "./lib/**/*" + ] +} diff --git a/zuul.config.js b/zuul.config.js index cc78487..994fb6e 100644 --- a/zuul.config.js +++ b/zuul.config.js @@ -1,12 +1,14 @@ 'use strict'; -var browsers = require('socket.io-browsers'); +const browsers = require('socket.io-browsers'); -var zuulConfig = module.exports = { +const zuulConfig = module.exports = { ui: 'mocha-bdd', // test on localhost by default local: true, + coverage: false, + open: true, concurrency: 2, // ngrok only accepts two tunnels by default // if browser does not sends output in 120s since last output: @@ -29,11 +31,11 @@ if (process.env.CI === 'true') { name: "babelify", presets: ["@babel/preset-env"], global: true, - only: [ /\/node_modules\/debug\// ] + ignore: [/\/node_modules\/(?!debug\/)/] } } ] } -var isPullRequest = process.env.TRAVIS_PULL_REQUEST && process.env.TRAVIS_PULL_REQUEST !== 'false'; +const isPullRequest = process.env.TRAVIS_PULL_REQUEST && process.env.TRAVIS_PULL_REQUEST !== 'false'; zuulConfig.browsers = isPullRequest ? browsers.pullRequest : browsers.all; From c327acbc3c3c2d0b2b439136cbcb56c81db173d6 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 22 Sep 2020 22:55:16 +0200 Subject: [PATCH 087/129] fix: throw upon invalid payload format An invalid packet was previously parsed as an ERROR packet, which was then ignored because it didn't contain any 'nsp' (namespace) field. This behavior was wrong because: - it means the other side is sending invalid payloads, so the connection must be closed right away - ERROR packets are meant for namespace authentication failures Parsing an invalid payload will now throw an error, which must be caught by the caller. Closes https://github.com/socketio/socket.io-parser/issues/86 --- lib/index.ts | 13 +++---------- test/parser.js | 10 +++------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index ee87d03..2795e73 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -257,7 +257,7 @@ export class Decoder extends Emitter { * @param {String} str * @return {Object} packet */ - private decodeString(str) { + private decodeString(str): Packet { let i = 0; // look up type const p: any = { @@ -265,7 +265,7 @@ export class Decoder extends Emitter { }; if (null == exports.types[p.type]) { - return error("unknown packet type " + p.type); + throw new Error("unknown packet type " + p.type); } // look up attachments if type binary @@ -316,7 +316,7 @@ export class Decoder extends Emitter { if (isPayloadValid) { p.data = payload; } else { - return error("invalid payload"); + throw new Error("invalid payload"); } } @@ -386,10 +386,3 @@ class BinaryReconstructor { this.buffers = []; } } - -function error(msg) { - return { - type: exports.ERROR, - data: "parser error: " + msg, - }; -} diff --git a/test/parser.js b/test/parser.js index 281f188..22483be 100644 --- a/test/parser.js +++ b/test/parser.js @@ -86,12 +86,8 @@ describe('parser', function(){ } }); - it('returns an error packet on parsing error', function(done){ - var decoder = new parser.Decoder(); - decoder.on('decoded', function(packet) { - expect(packet).to.eql({ type: 4, data: 'parser error: invalid payload' }); - done(); - }); - decoder.add('442["some","data"'); + it('throw an error upon parsing error', () => { + expect(() => new parser.Decoder().add('442["some","data"')).to.throwException(/^invalid payload$/); + expect(() => new parser.Decoder().add('999')).to.throwException(/^unknown packet type 9$/); }); }); From 567c0ca965e175145a8ecad470c0e171fe7fee98 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 22 Sep 2020 23:27:46 +0200 Subject: [PATCH 088/129] refactor: use PacketType enum wherever applicable --- lib/index.ts | 92 +++++++-------------------------------------- test/arraybuffer.js | 20 +++++----- test/blob.js | 12 +++--- test/buffer.js | 11 ++---- test/parser.js | 42 ++++++++++----------- 5 files changed, 54 insertions(+), 123 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 2795e73..7b62fbd 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -13,22 +13,6 @@ const debug = debugModule("socket.io-parser"); export const protocol: number = 4; -/** - * Packet types. - * - * @public - */ - -export const types: Array = [ - "CONNECT", - "DISCONNECT", - "EVENT", - "ACK", - "ERROR", - "BINARY_EVENT", - "BINARY_ACK", -]; - export enum PacketType { CONNECT, DISCONNECT, @@ -47,62 +31,6 @@ interface Packet { attachments?: number; } -/** - * Packet type `connect`. - * - * @public - */ - -export const CONNECT: number = 0; - -/** - * Packet type `disconnect`. - * - * @public - */ - -export const DISCONNECT: number = 1; - -/** - * Packet type `event`. - * - * @public - */ - -export const EVENT: number = 2; - -/** - * Packet type `ack`. - * - * @public - */ - -export const ACK: number = 3; - -/** - * Packet type `error`. - * - * @public - */ - -export const ERROR: number = 4; - -/** - * Packet type 'binary event' - * - * @public - */ - -export const BINARY_EVENT: number = 5; - -/** - * Packet type `binary ack`. For acks with binary arguments. - * - * @api public - */ - -export const BINARY_ACK: number = 6; - /** * A socket.io Encoder instance */ @@ -139,7 +67,10 @@ export class Encoder { let str = "" + obj.type; // attachments if we have them - if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) { + if ( + obj.type === PacketType.BINARY_EVENT || + obj.type === PacketType.BINARY_ACK + ) { str += obj.attachments + "-"; } @@ -186,7 +117,7 @@ export class Encoder { } } -const ERROR_PACKET = exports.ERROR + '"encode error"'; +const ERROR_PACKET = PacketType.ERROR + '"encode error"'; function tryStringify(str) { try { @@ -220,8 +151,8 @@ export class Decoder extends Emitter { if (typeof obj === "string") { packet = this.decodeString(obj); if ( - exports.BINARY_EVENT === packet.type || - exports.BINARY_ACK === packet.type + packet.type === PacketType.BINARY_EVENT || + packet.type === PacketType.BINARY_ACK ) { // binary packet's json this.reconstructor = new BinaryReconstructor(packet); @@ -264,12 +195,15 @@ export class Decoder extends Emitter { type: Number(str.charAt(0)), }; - if (null == exports.types[p.type]) { + if (PacketType[p.type] === undefined) { throw new Error("unknown packet type " + p.type); } // look up attachments if type binary - if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) { + if ( + p.type === PacketType.BINARY_EVENT || + p.type === PacketType.BINARY_ACK + ) { const start = i + 1; while (str.charAt(++i) !== "-" && i != str.length) {} const buf = str.substring(start, i); @@ -312,7 +246,7 @@ export class Decoder extends Emitter { const payload = tryParse(str.substr(i)); const isPayloadValid = payload !== false && - (p.type === exports.ERROR || Array.isArray(payload)); + (p.type === PacketType.ERROR || Array.isArray(payload)); if (isPayloadValid) { p.data = payload; } else { diff --git a/test/arraybuffer.js b/test/arraybuffer.js index f39d024..4cc2cdb 100644 --- a/test/arraybuffer.js +++ b/test/arraybuffer.js @@ -1,12 +1,12 @@ -var parser = require('..'); -var expect = require('expect.js'); -var helpers = require('./helpers.js'); -var encoder = new parser.Encoder(); +const { PacketType, Decoder, Encoder } = require('..'); +const expect = require('expect.js'); +const helpers = require('./helpers.js'); +const encoder = new Encoder(); describe('parser', function() { it('encodes an ArrayBuffer', function() { var packet = { - type: parser.BINARY_EVENT, + type: PacketType.BINARY_EVENT, data: ['a', new ArrayBuffer(2)], id: 0, nsp: '/' @@ -19,7 +19,7 @@ describe('parser', function() { for (var i = 0; i < array.length; i++) array[i] = i; var packet = { - type: parser.BINARY_EVENT, + type: PacketType.BINARY_EVENT, data: ['a', array], id: 0, nsp: '/' @@ -29,7 +29,7 @@ describe('parser', function() { it('encodes ArrayBuffers deep in JSON', function() { var packet = { - type: parser.BINARY_EVENT, + type: PacketType.BINARY_EVENT, data: ['a', {a: 'hi', b: {why: new ArrayBuffer(3)}, c: {a: 'bye', b: { a: new ArrayBuffer(6)}}}], id: 999, nsp: '/deep' @@ -39,7 +39,7 @@ describe('parser', function() { it('encodes deep binary JSON with null values', function() { var packet = { - type: parser.BINARY_EVENT, + type: PacketType.BINARY_EVENT, data: ['a', {a: 'b', c: 4, e: {g: null}, h: new ArrayBuffer(9)}], nsp: '/', id: 600 @@ -49,14 +49,14 @@ describe('parser', function() { it('cleans itself up on close', function() { var packet = { - type: parser.BINARY_EVENT, + type: PacketType.BINARY_EVENT, data: [new ArrayBuffer(2), new ArrayBuffer(3)], id: 0, nsp: '/' }; encoder.encode(packet, function(encodedPackets) { - var decoder = new parser.Decoder(); + var decoder = new Decoder(); decoder.on('decoded', function(packet) { throw new Error("received a packet when not all binary data was sent."); }); diff --git a/test/blob.js b/test/blob.js index 7ec926c..11b7cb4 100644 --- a/test/blob.js +++ b/test/blob.js @@ -1,7 +1,7 @@ -var parser = require('..'); -var helpers = require('./helpers.js'); +const { PacketType } = require('..'); +const helpers = require('./helpers.js'); -var BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : +const BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : false; @@ -18,7 +18,7 @@ describe('parser', function() { } var packet = { - type: parser.BINARY_EVENT, + type: PacketType.BINARY_EVENT, data: data, id: 0, nsp: '/' @@ -37,7 +37,7 @@ describe('parser', function() { } var packet = { - type: parser.BINARY_EVENT, + type: PacketType.BINARY_EVENT, data: {a: 'hi', b: { why: data }, c: 'bye'}, id: 999, nsp: '/deep' @@ -56,7 +56,7 @@ describe('parser', function() { } var packet = { - type: parser.BINARY_ACK, + type: PacketType.BINARY_ACK, data: {a: 'hi ack', b: { why: data }, c: 'bye ack'}, id: 999, nsp: '/deep' diff --git a/test/buffer.js b/test/buffer.js index 4e0512b..4aa4309 100644 --- a/test/buffer.js +++ b/test/buffer.js @@ -1,13 +1,10 @@ -var parser = require('..'); -var expect = require('expect.js'); -var helpers = require('./helpers.js'); -var encode = parser.encode; -var decode = parser.decode; +const { PacketType } = require('..'); +const helpers = require('./helpers.js'); describe('parser', function() { it('encodes a Buffer', function() { helpers.test_bin({ - type: parser.BINARY_EVENT, + type: PacketType.BINARY_EVENT, data: ['a', Buffer.from('abc', 'utf8')], id: 23, nsp: '/cool' @@ -16,7 +13,7 @@ describe('parser', function() { it('encodes a binary ack with Buffer', function() { helpers.test_bin({ - type: parser.BINARY_ACK, + type: PacketType.BINARY_ACK, data: ['a', Buffer.from('xxx', 'utf8'), {}], id: 127, nsp: '/back' diff --git a/test/parser.js b/test/parser.js index 22483be..d63e08a 100644 --- a/test/parser.js +++ b/test/parser.js @@ -1,41 +1,41 @@ -var parser = require('..'); -var expect = require('expect.js'); -var helpers = require('./helpers.js'); +const { PacketType, Decoder, Encoder } = require('..'); +const expect = require('expect.js'); +const helpers = require('./helpers.js'); describe('parser', function(){ it('exposes types', function(){ - expect(parser.CONNECT).to.be.a('number'); - expect(parser.DISCONNECT).to.be.a('number'); - expect(parser.EVENT).to.be.a('number'); - expect(parser.ACK).to.be.a('number'); - expect(parser.ERROR).to.be.a('number'); - expect(parser.BINARY_EVENT).to.be.a('number'); - expect(parser.BINARY_ACK).to.be.a('number'); + expect(PacketType.CONNECT).to.be.a('number'); + expect(PacketType.DISCONNECT).to.be.a('number'); + expect(PacketType.EVENT).to.be.a('number'); + expect(PacketType.ACK).to.be.a('number'); + expect(PacketType.ERROR).to.be.a('number'); + expect(PacketType.BINARY_EVENT).to.be.a('number'); + expect(PacketType.BINARY_ACK).to.be.a('number'); }); it('encodes connection', function(){ helpers.test({ - type: parser.CONNECT, + type: PacketType.CONNECT, nsp: '/woot' }); }); it('encodes disconnection', function(){ helpers.test({ - type: parser.DISCONNECT, + type: PacketType.DISCONNECT, nsp: '/woot' }); }); it('encodes an event', function(){ helpers.test({ - type: parser.EVENT, + type: PacketType.EVENT, data: ['a', 1, {}], nsp: '/' }); helpers.test({ - type: parser.EVENT, + type: PacketType.EVENT, data: ['a', 1, {}], id: 1, nsp: '/test' @@ -44,7 +44,7 @@ describe('parser', function(){ it('encodes an ack', function(){ helpers.test({ - type: parser.ACK, + type: PacketType.ACK, data: ['a', 1, {}], id: 123, nsp: '/' @@ -53,7 +53,7 @@ describe('parser', function(){ it('encodes an error', function(){ helpers.test({ - type: parser.ERROR, + type: PacketType.ERROR, data: 'Unauthorized', nsp: '/' }); @@ -64,13 +64,13 @@ describe('parser', function(){ a.b = a; var data = { - type: parser.EVENT, + type: PacketType.EVENT, data: a, id: 1, nsp: '/' } - var encoder = new parser.Encoder(); + const encoder = new Encoder(); encoder.encode(data, function(encodedPackets) { expect(encodedPackets[0]).to.be('4"encode error"'); @@ -79,7 +79,7 @@ describe('parser', function(){ it('decodes a bad binary packet', function(){ try { - var decoder = new parser.Decoder(); + const decoder = new Decoder(); decoder.add('5'); } catch(e){ expect(e.message).to.match(/Illegal/); @@ -87,7 +87,7 @@ describe('parser', function(){ }); it('throw an error upon parsing error', () => { - expect(() => new parser.Decoder().add('442["some","data"')).to.throwException(/^invalid payload$/); - expect(() => new parser.Decoder().add('999')).to.throwException(/^unknown packet type 9$/); + expect(() => new Decoder().add('442["some","data"')).to.throwException(/^invalid payload$/); + expect(() => new Decoder().add('999')).to.throwException(/^unknown packet type 9$/); }); }); From aeae87c220287197cb78370dbd86b950a7dd29eb Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 22 Sep 2020 23:54:26 +0200 Subject: [PATCH 089/129] fix: do not catch encoding errors It does not make sense to catch the errors thrown by JSON.stringify() and convert them to an ERROR packet (which are meant for namespace authentication errors), it should be caught higher in the stack. Related: https://github.com/socketio/socket.io-parser/commit/92c530da47111e59add9b2960fe5c34aee80828e --- lib/index.ts | 18 +----------------- test/parser.js | 6 ++---- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 7b62fbd..8a9f71c 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -87,12 +87,7 @@ export class Encoder { // json data if (null != obj.data) { - const payload = tryStringify(obj.data); - if (payload !== false) { - str += payload; - } else { - return ERROR_PACKET; - } + str += JSON.stringify(obj.data); } debug("encoded %j as %s", obj, str); @@ -117,22 +112,11 @@ export class Encoder { } } -const ERROR_PACKET = PacketType.ERROR + '"encode error"'; - -function tryStringify(str) { - try { - return JSON.stringify(str); - } catch (e) { - return false; - } -} - /** * A socket.io Decoder instance * * @return {Object} decoder */ -// @ts-ignore export class Decoder extends Emitter { private reconstructor: BinaryReconstructor; diff --git a/test/parser.js b/test/parser.js index d63e08a..e2f05ea 100644 --- a/test/parser.js +++ b/test/parser.js @@ -59,7 +59,7 @@ describe('parser', function(){ }); }); - it('properly handles circular objects', function() { + it('throws an error when encoding circular objects', function() { var a = {}; a.b = a; @@ -72,9 +72,7 @@ describe('parser', function(){ const encoder = new Encoder(); - encoder.encode(data, function(encodedPackets) { - expect(encodedPackets[0]).to.be('4"encode error"'); - }); + expect(() => encoder.encode(data)).to.throwException(); }); it('decodes a bad binary packet', function(){ From dd7cd60ba241317be7f72d7836f6a79c0b1465e2 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 23 Sep 2020 00:27:07 +0200 Subject: [PATCH 090/129] refactor: convert all tests to ES6 syntax --- test/arraybuffer.js | 16 ++++++++-------- test/blob.js | 8 ++++---- test/buffer.js | 6 +++--- test/helpers.js | 30 +++++++++++++++--------------- test/index.js | 18 +++++++++--------- test/parser.js | 18 +++++++++--------- 6 files changed, 48 insertions(+), 48 deletions(-) diff --git a/test/arraybuffer.js b/test/arraybuffer.js index 4cc2cdb..3f9a297 100644 --- a/test/arraybuffer.js +++ b/test/arraybuffer.js @@ -3,8 +3,8 @@ const expect = require('expect.js'); const helpers = require('./helpers.js'); const encoder = new Encoder(); -describe('parser', function() { - it('encodes an ArrayBuffer', function() { +describe('parser', () => { + it('encodes an ArrayBuffer', () => { var packet = { type: PacketType.BINARY_EVENT, data: ['a', new ArrayBuffer(2)], @@ -14,7 +14,7 @@ describe('parser', function() { helpers.test_bin(packet); }); - it('encodes a TypedArray', function() { + it('encodes a TypedArray', () => { var array = new Uint8Array(5); for (var i = 0; i < array.length; i++) array[i] = i; @@ -27,7 +27,7 @@ describe('parser', function() { helpers.test_bin(packet); }); - it('encodes ArrayBuffers deep in JSON', function() { + it('encodes ArrayBuffers deep in JSON', () => { var packet = { type: PacketType.BINARY_EVENT, data: ['a', {a: 'hi', b: {why: new ArrayBuffer(3)}, c: {a: 'bye', b: { a: new ArrayBuffer(6)}}}], @@ -37,7 +37,7 @@ describe('parser', function() { helpers.test_bin(packet); }); - it('encodes deep binary JSON with null values', function() { + it('encodes deep binary JSON with null values', () => { var packet = { type: PacketType.BINARY_EVENT, data: ['a', {a: 'b', c: 4, e: {g: null}, h: new ArrayBuffer(9)}], @@ -47,7 +47,7 @@ describe('parser', function() { helpers.test_bin(packet); }); - it('cleans itself up on close', function() { + it('cleans itself up on close', () => { var packet = { type: PacketType.BINARY_EVENT, data: [new ArrayBuffer(2), new ArrayBuffer(3)], @@ -55,9 +55,9 @@ describe('parser', function() { nsp: '/' }; - encoder.encode(packet, function(encodedPackets) { + encoder.encode(packet, encodedPackets => { var decoder = new Decoder(); - decoder.on('decoded', function(packet) { + decoder.on('decoded', packet => { throw new Error("received a packet when not all binary data was sent."); }); diff --git a/test/blob.js b/test/blob.js index 11b7cb4..9d5ef7e 100644 --- a/test/blob.js +++ b/test/blob.js @@ -6,8 +6,8 @@ const BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : false; -describe('parser', function() { - it('encodes a Blob', function() { +describe('parser', () => { + it('encodes a Blob', () => { var data; if (BlobBuilder) { var bb = new BlobBuilder(); @@ -26,7 +26,7 @@ describe('parser', function() { helpers.test_bin(packet); }); - it('encodes an Blob deep in JSON', function() { + it('encodes an Blob deep in JSON', () => { var data; if (BlobBuilder) { var bb = new BlobBuilder(); @@ -45,7 +45,7 @@ describe('parser', function() { helpers.test_bin(packet); }); - it('encodes a binary ack with a blob', function() { + it('encodes a binary ack with a blob', () => { var data; if (BlobBuilder) { var bb = new BlobBuilder(); diff --git a/test/buffer.js b/test/buffer.js index 4aa4309..68a0d11 100644 --- a/test/buffer.js +++ b/test/buffer.js @@ -1,8 +1,8 @@ const { PacketType } = require('..'); const helpers = require('./helpers.js'); -describe('parser', function() { - it('encodes a Buffer', function() { +describe('parser', () => { + it('encodes a Buffer', () => { helpers.test_bin({ type: PacketType.BINARY_EVENT, data: ['a', Buffer.from('abc', 'utf8')], @@ -11,7 +11,7 @@ describe('parser', function() { }); }); - it('encodes a binary ack with Buffer', function() { + it('encodes a binary ack with Buffer', () => { helpers.test_bin({ type: PacketType.BINARY_ACK, data: ['a', Buffer.from('xxx', 'utf8'), {}], diff --git a/test/helpers.js b/test/helpers.js index 822b31a..6bde43b 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -1,12 +1,12 @@ -var parser = require('..'); -var expect = require('expect.js'); -var encoder = new parser.Encoder(); +const parser = require('..'); +const expect = require('expect.js'); +const encoder = new parser.Encoder(); // tests encoding and decoding a single packet -module.exports.test = function(obj){ - encoder.encode(obj, function(encodedPackets) { - var decoder = new parser.Decoder(); - decoder.on('decoded', function(packet) { +module.exports.test = obj => { + encoder.encode(obj, encodedPackets => { + const decoder = new parser.Decoder(); + decoder.on('decoded', packet => { expect(packet).to.eql(obj); }); @@ -15,17 +15,17 @@ module.exports.test = function(obj){ } // tests encoding of binary packets -module.exports.test_bin = function test_bin(obj) { - var originalData = obj.data; - encoder.encode(obj, function(encodedPackets) { - var decoder = new parser.Decoder(); - decoder.on('decoded', function(packet) { +module.exports.test_bin = obj => { + const originalData = obj.data; + encoder.encode(obj, encodedPackets => { + const decoder = new parser.Decoder(); + decoder.on('decoded', packet => { obj.data = originalData; obj.attachments = undefined; expect(obj).to.eql(packet); }); - for (var i = 0; i < encodedPackets.length; i++) { + for (let i = 0; i < encodedPackets.length; i++) { decoder.add(encodedPackets[i]); } }); @@ -33,13 +33,13 @@ module.exports.test_bin = function test_bin(obj) { // array buffer's slice is native code that is not transported across // socket.io via msgpack, so regular .eql fails -module.exports.testArrayBuffers = function(buf1, buf2) { +module.exports.testArrayBuffers = (buf1, buf2) => { buf1.slice = undefined; buf2.slice = undefined; expect(buf1).to.eql(buf2); } -module.exports.testPacketMetadata = function(p1, p2) { +module.exports.testPacketMetadata = (p1, p2) => { expect(p1.type).to.eql(p2.type); expect(p1.id).to.eql(p2.id); expect(p1.nsp).to.eql(p2.nsp); diff --git a/test/index.js b/test/index.js index 9d4a1cb..74acc16 100644 --- a/test/index.js +++ b/test/index.js @@ -1,22 +1,22 @@ -var env = require('./support/env.js'); +const env = require('./support/env.js'); -var blobSupported = (function() { +const blobSupported = (function () { try { new Blob(['hi']); return true; - } catch(e) {} + } catch (e) { + } return false; })(); /** * Create a blob builder even when vendor prefixes exist */ - -var BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : - typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder : - typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : - typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : false; -var blobBuilderSupported = !!BlobBuilder && !!BlobBuilder.prototype.append && !!BlobBuilder.prototype.getBlob; +const BlobBuilderRef = typeof BlobBuilder !== 'undefined' ? BlobBuilder : + typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder : + typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : + typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : false; +const blobBuilderSupported = !!BlobBuilderRef && !!BlobBuilderRef.prototype.append && !!BlobBuilderRef.prototype.getBlob; require('./parser.js'); diff --git a/test/parser.js b/test/parser.js index e2f05ea..3b3f3fe 100644 --- a/test/parser.js +++ b/test/parser.js @@ -2,9 +2,9 @@ const { PacketType, Decoder, Encoder } = require('..'); const expect = require('expect.js'); const helpers = require('./helpers.js'); -describe('parser', function(){ +describe('parser', () => { - it('exposes types', function(){ + it('exposes types', () => { expect(PacketType.CONNECT).to.be.a('number'); expect(PacketType.DISCONNECT).to.be.a('number'); expect(PacketType.EVENT).to.be.a('number'); @@ -14,21 +14,21 @@ describe('parser', function(){ expect(PacketType.BINARY_ACK).to.be.a('number'); }); - it('encodes connection', function(){ + it('encodes connection', () => { helpers.test({ type: PacketType.CONNECT, nsp: '/woot' }); }); - it('encodes disconnection', function(){ + it('encodes disconnection', () => { helpers.test({ type: PacketType.DISCONNECT, nsp: '/woot' }); }); - it('encodes an event', function(){ + it('encodes an event', () => { helpers.test({ type: PacketType.EVENT, data: ['a', 1, {}], @@ -42,7 +42,7 @@ describe('parser', function(){ }); }); - it('encodes an ack', function(){ + it('encodes an ack', () => { helpers.test({ type: PacketType.ACK, data: ['a', 1, {}], @@ -51,7 +51,7 @@ describe('parser', function(){ }); }); - it('encodes an error', function(){ + it('encodes an error', () => { helpers.test({ type: PacketType.ERROR, data: 'Unauthorized', @@ -59,7 +59,7 @@ describe('parser', function(){ }); }); - it('throws an error when encoding circular objects', function() { + it('throws an error when encoding circular objects', () => { var a = {}; a.b = a; @@ -75,7 +75,7 @@ describe('parser', function(){ expect(() => encoder.encode(data)).to.throwException(); }); - it('decodes a bad binary packet', function(){ + it('decodes a bad binary packet', () => { try { const decoder = new Decoder(); decoder.add('5'); From 00e73598a04b54dd5e547797271cf65cba621f59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Sep 2020 00:57:41 +0200 Subject: [PATCH 091/129] chore: bump elliptic from 6.5.2 to 6.5.3 (#96) Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.2 to 6.5.3. - [Release notes](https://github.com/indutny/elliptic/releases) - [Commits](https://github.com/indutny/elliptic/compare/v6.5.2...v6.5.3) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index c9155ab..80f8c42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2705,9 +2705,9 @@ "dev": true }, "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -2720,9 +2720,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", "dev": true } } From fe33ff7c878026a51112d657586b805dfb781a0d Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 23 Sep 2020 22:27:55 +0200 Subject: [PATCH 092/129] test: actually test the parser The assertions were not checked, because the functions are asynchronous. Besides, the Blob tests were throwing in the browser: > Uncaught ReferenceError: can't access lexical declaration 'BlobBuilder' before initialization --- test/arraybuffer.js | 16 ++++++++-------- test/blob.js | 44 ++++++++++++++++++++++---------------------- test/buffer.js | 8 ++++---- test/helpers.js | 6 ++++-- test/index.js | 4 ++-- test/parser.js | 25 ++++++++++++++----------- 6 files changed, 54 insertions(+), 49 deletions(-) diff --git a/test/arraybuffer.js b/test/arraybuffer.js index 3f9a297..3d1c194 100644 --- a/test/arraybuffer.js +++ b/test/arraybuffer.js @@ -4,17 +4,17 @@ const helpers = require('./helpers.js'); const encoder = new Encoder(); describe('parser', () => { - it('encodes an ArrayBuffer', () => { + it('encodes an ArrayBuffer', done => { var packet = { type: PacketType.BINARY_EVENT, data: ['a', new ArrayBuffer(2)], id: 0, nsp: '/' }; - helpers.test_bin(packet); + helpers.test_bin(packet, done); }); - it('encodes a TypedArray', () => { + it('encodes a TypedArray', done => { var array = new Uint8Array(5); for (var i = 0; i < array.length; i++) array[i] = i; @@ -24,27 +24,27 @@ describe('parser', () => { id: 0, nsp: '/' }; - helpers.test_bin(packet); + helpers.test_bin(packet, done); }); - it('encodes ArrayBuffers deep in JSON', () => { + it('encodes ArrayBuffers deep in JSON', done => { var packet = { type: PacketType.BINARY_EVENT, data: ['a', {a: 'hi', b: {why: new ArrayBuffer(3)}, c: {a: 'bye', b: { a: new ArrayBuffer(6)}}}], id: 999, nsp: '/deep' }; - helpers.test_bin(packet); + helpers.test_bin(packet, done); }); - it('encodes deep binary JSON with null values', () => { + it('encodes deep binary JSON with null values', done => { var packet = { type: PacketType.BINARY_EVENT, data: ['a', {a: 'b', c: 4, e: {g: null}, h: new ArrayBuffer(9)}], nsp: '/', id: 600 }; - helpers.test_bin(packet); + helpers.test_bin(packet, done); }); it('cleans itself up on close', () => { diff --git a/test/blob.js b/test/blob.js index 9d5ef7e..2e54a7e 100644 --- a/test/blob.js +++ b/test/blob.js @@ -1,67 +1,67 @@ const { PacketType } = require('..'); const helpers = require('./helpers.js'); -const BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : +const BlobBuilderImpl = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : false; describe('parser', () => { - it('encodes a Blob', () => { - var data; - if (BlobBuilder) { - var bb = new BlobBuilder(); + it('encodes a Blob', (done) => { + let data; + if (BlobBuilderImpl) { + const bb = new BlobBuilderImpl(); bb.append(new ArrayBuffer(2)); data = bb.getBlob(); } else { data = new Blob([new ArrayBuffer(2)]); } - var packet = { + const packet = { type: PacketType.BINARY_EVENT, - data: data, + data: [data], id: 0, nsp: '/' }; - helpers.test_bin(packet); + helpers.test_bin(packet, done); }); - it('encodes an Blob deep in JSON', () => { - var data; - if (BlobBuilder) { - var bb = new BlobBuilder(); + it('encodes an Blob deep in JSON', (done) => { + let data; + if (BlobBuilderImpl) { + const bb = new BlobBuilderImpl(); bb.append(new ArrayBuffer(2)); data = bb.getBlob(); } else { data = new Blob([new ArrayBuffer(2)]); } - var packet = { + const packet = { type: PacketType.BINARY_EVENT, - data: {a: 'hi', b: { why: data }, c: 'bye'}, + data: [{a: 'hi', b: {why: data}, c: 'bye'}], id: 999, nsp: '/deep' }; - helpers.test_bin(packet); + helpers.test_bin(packet, done); }); - it('encodes a binary ack with a blob', () => { - var data; - if (BlobBuilder) { - var bb = new BlobBuilder(); + it('encodes a binary ack with a blob', (done) => { + let data; + if (BlobBuilderImpl) { + const bb = new BlobBuilderImpl(); bb.append(new ArrayBuffer(2)); data = bb.getBlob(); } else { data = new Blob([new ArrayBuffer(2)]); } - var packet = { + const packet = { type: PacketType.BINARY_ACK, - data: {a: 'hi ack', b: { why: data }, c: 'bye ack'}, + data: [{a: 'hi ack', b: {why: data}, c: 'bye ack'}], id: 999, nsp: '/deep' }; - helpers.test_bin(packet); + helpers.test_bin(packet, done); }) }); diff --git a/test/buffer.js b/test/buffer.js index 68a0d11..5419c34 100644 --- a/test/buffer.js +++ b/test/buffer.js @@ -2,21 +2,21 @@ const { PacketType } = require('..'); const helpers = require('./helpers.js'); describe('parser', () => { - it('encodes a Buffer', () => { + it('encodes a Buffer', done => { helpers.test_bin({ type: PacketType.BINARY_EVENT, data: ['a', Buffer.from('abc', 'utf8')], id: 23, nsp: '/cool' - }); + }, done); }); - it('encodes a binary ack with Buffer', () => { + it('encodes a binary ack with Buffer', done => { helpers.test_bin({ type: PacketType.BINARY_ACK, data: ['a', Buffer.from('xxx', 'utf8'), {}], id: 127, nsp: '/back' - }) + }, done) }); }); diff --git a/test/helpers.js b/test/helpers.js index 6bde43b..2c8ddf0 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -3,11 +3,12 @@ const expect = require('expect.js'); const encoder = new parser.Encoder(); // tests encoding and decoding a single packet -module.exports.test = obj => { +module.exports.test = (obj, done) => { encoder.encode(obj, encodedPackets => { const decoder = new parser.Decoder(); decoder.on('decoded', packet => { expect(packet).to.eql(obj); + done(); }); decoder.add(encodedPackets[0]); @@ -15,7 +16,7 @@ module.exports.test = obj => { } // tests encoding of binary packets -module.exports.test_bin = obj => { +module.exports.test_bin = (obj, done) => { const originalData = obj.data; encoder.encode(obj, encodedPackets => { const decoder = new parser.Decoder(); @@ -23,6 +24,7 @@ module.exports.test_bin = obj => { obj.data = originalData; obj.attachments = undefined; expect(obj).to.eql(packet); + done(); }); for (let i = 0; i < encodedPackets.length; i++) { diff --git a/test/index.js b/test/index.js index 74acc16..167c3a8 100644 --- a/test/index.js +++ b/test/index.js @@ -12,11 +12,11 @@ const blobSupported = (function () { /** * Create a blob builder even when vendor prefixes exist */ -const BlobBuilderRef = typeof BlobBuilder !== 'undefined' ? BlobBuilder : +const BlobBuilderImpl = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : false; -const blobBuilderSupported = !!BlobBuilderRef && !!BlobBuilderRef.prototype.append && !!BlobBuilderRef.prototype.getBlob; +const blobBuilderSupported = !!BlobBuilderImpl && !!BlobBuilderImpl.prototype.append && !!BlobBuilderImpl.prototype.getBlob; require('./parser.js'); diff --git a/test/parser.js b/test/parser.js index 3b3f3fe..ea50cdd 100644 --- a/test/parser.js +++ b/test/parser.js @@ -14,49 +14,52 @@ describe('parser', () => { expect(PacketType.BINARY_ACK).to.be.a('number'); }); - it('encodes connection', () => { + it('encodes connection', done => { helpers.test({ type: PacketType.CONNECT, nsp: '/woot' - }); + }, done); }); - it('encodes disconnection', () => { + it('encodes disconnection', done => { helpers.test({ type: PacketType.DISCONNECT, nsp: '/woot' - }); + }, done); }); - it('encodes an event', () => { + it('encodes an event', done => { helpers.test({ type: PacketType.EVENT, data: ['a', 1, {}], nsp: '/' - }); + }, done); + }); + + it('encodes an event (with ack)', done => { helpers.test({ type: PacketType.EVENT, data: ['a', 1, {}], id: 1, nsp: '/test' - }); + }, done); }); - it('encodes an ack', () => { + it('encodes an ack', done => { helpers.test({ type: PacketType.ACK, data: ['a', 1, {}], id: 123, nsp: '/' - }); + }, done); }); - it('encodes an error', () => { + it('encodes an error', done => { helpers.test({ type: PacketType.ERROR, data: 'Unauthorized', nsp: '/' - }); + }, done); }); it('throws an error when encoding circular objects', () => { From 28d4f0309bdd9e306b78d1946d3e1760941d6544 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 23 Sep 2020 22:18:31 +0200 Subject: [PATCH 093/129] refactor: do not convert Blobs This was needed in a previous version of the parser, which used msgpack to encode the payload. Blobs (and Files) will now be included in the array of binary attachments without any additional transformation. Breaking change: the encode method is now synchronous See also https://github.com/socketio/socket.io-parser/commit/299849b00294c3bc95817572441f3aca8ffb1f65 --- lib/binary.ts | 79 ++------------------------------------------- lib/index.ts | 26 +++++++-------- lib/is-binary.ts | 34 +++++++++++++++++++ lib/is-buffer.ts | 22 ------------- test/arraybuffer.js | 18 +++++------ test/helpers.js | 40 +++++++++++------------ 6 files changed, 77 insertions(+), 142 deletions(-) create mode 100644 lib/is-binary.ts delete mode 100644 lib/is-buffer.ts diff --git a/lib/binary.ts b/lib/binary.ts index bcd57c2..80a6b96 100644 --- a/lib/binary.ts +++ b/lib/binary.ts @@ -1,19 +1,7 @@ -import isBuf from "./is-buffer"; - -const toString = Object.prototype.toString; -const withNativeBlob = - typeof Blob === "function" || - (typeof Blob !== "undefined" && - toString.call(Blob) === "[object BlobConstructor]"); -const withNativeFile = - typeof File === "function" || - (typeof File !== "undefined" && - toString.call(File) === "[object FileConstructor]"); +import isBinary from "./is-binary"; /** - * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder. - * Anything with blobs or files should be fed through removeBlobs before coming - * here. + * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder. * * @param {Object} packet - socket.io event packet * @return {Object} with deconstructed packet and list of buffers @@ -32,7 +20,7 @@ export function deconstructPacket(packet) { function _deconstructPacket(data, buffers) { if (!data) return data; - if (isBuf(data)) { + if (isBinary(data)) { const placeholder = { _placeholder: true, num: buffers.length }; buffers.push(data); return placeholder; @@ -88,64 +76,3 @@ function _reconstructPacket(data, buffers) { return data; } - -/** - * Asynchronously removes Blobs or Files from data via - * FileReader's readAsArrayBuffer method. Used before encoding - * data as msgpack. Calls callback with the blobless data. - * - * @param {Object} data - * @param {Function} callback - * @api private - */ - -export function removeBlobs(data, callback) { - function _removeBlobs(obj, curKey?, containingObject?) { - if (!obj) return obj; - - // convert any blob - if ( - (withNativeBlob && obj instanceof Blob) || - (withNativeFile && obj instanceof File) - ) { - pendingBlobs++; - - // async filereader - const fileReader = new FileReader(); - fileReader.onload = function () { - // this.result == arraybuffer - if (containingObject) { - containingObject[curKey] = this.result; - } else { - bloblessData = this.result; - } - - // if nothing pending its callback time - if (!--pendingBlobs) { - callback(bloblessData); - } - }; - - fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer - } else if (Array.isArray(obj)) { - // handle array - for (let i = 0; i < obj.length; i++) { - _removeBlobs(obj[i], i, obj); - } - } else if (typeof obj === "object" && !isBuf(obj)) { - // and object - for (const key in obj) { - if (obj.hasOwnProperty(key)) { - _removeBlobs(obj[key], key, obj); - } - } - } - } - - let pendingBlobs = 0; - let bloblessData = data; - _removeBlobs(bloblessData); - if (!pendingBlobs) { - callback(bloblessData); - } -} diff --git a/lib/index.ts b/lib/index.ts index 8a9f71c..d3ba917 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,6 +1,6 @@ import * as Emitter from "component-emitter"; import * as binary from "./binary"; -import isBuf from "./is-buffer"; +import isBinary from "./is-binary"; import debugModule from "debug"; const debug = debugModule("socket.io-parser"); @@ -41,20 +41,18 @@ export class Encoder { * buffer sequence, depending on packet type. * * @param {Object} obj - packet object - * @param {Function} callback - function to handle encodings (likely engine.write) - * @return Calls callback with Array of encodings */ - public encode(obj: Packet, callback: Function) { + public encode(obj: Packet) { debug("encoding packet %j", obj); if ( obj.type === PacketType.BINARY_EVENT || obj.type === PacketType.BINARY_ACK ) { - this.encodeAsBinary(obj, callback); + return this.encodeAsBinary(obj); } else { const encoding = this.encodeAsString(obj); - callback([encoding]); + return [encoding]; } } @@ -100,15 +98,13 @@ export class Encoder { * a list of buffers. */ - private encodeAsBinary(obj: Packet, callback: Function) { - binary.removeBlobs(obj, (bloblessData) => { - const deconstruction = binary.deconstructPacket(bloblessData); - const pack = this.encodeAsString(deconstruction.packet); - const buffers = deconstruction.buffers; + private encodeAsBinary(obj: Packet) { + const deconstruction = binary.deconstructPacket(obj); + const pack = this.encodeAsString(deconstruction.packet); + const buffers = deconstruction.buffers; - buffers.unshift(pack); // add packet info to beginning of data list - callback(buffers); // write all the buffers - }); + buffers.unshift(pack); // add packet info to beginning of data list + return buffers; // write all the buffers } } @@ -149,7 +145,7 @@ export class Decoder extends Emitter { // non-binary full packet super.emit("decoded", packet); } - } else if (isBuf(obj) || obj.base64) { + } else if (isBinary(obj) || obj.base64) { // raw binary data if (!this.reconstructor) { throw new Error("got binary data when not reconstructing a packet"); diff --git a/lib/is-binary.ts b/lib/is-binary.ts new file mode 100644 index 0000000..ed8fdbf --- /dev/null +++ b/lib/is-binary.ts @@ -0,0 +1,34 @@ +const withNativeBuffer: boolean = + typeof Buffer === "function" && typeof Buffer.isBuffer === "function"; +const withNativeArrayBuffer: boolean = typeof ArrayBuffer === "function"; + +const isView = (obj: any) => { + return typeof ArrayBuffer.isView === "function" + ? ArrayBuffer.isView(obj) + : obj.buffer instanceof ArrayBuffer; +}; + +const toString = Object.prototype.toString; +const withNativeBlob = + typeof Blob === "function" || + (typeof Blob !== "undefined" && + toString.call(Blob) === "[object BlobConstructor]"); +const withNativeFile = + typeof File === "function" || + (typeof File !== "undefined" && + toString.call(File) === "[object FileConstructor]"); + +/** + * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File. + * + * @private + */ + +export default function isBinary(obj: any) { + return ( + (withNativeBuffer && Buffer.isBuffer(obj)) || + (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) || + (withNativeBlob && obj instanceof Blob) || + (withNativeFile && obj instanceof File) + ); +} diff --git a/lib/is-buffer.ts b/lib/is-buffer.ts deleted file mode 100644 index 36eb72d..0000000 --- a/lib/is-buffer.ts +++ /dev/null @@ -1,22 +0,0 @@ -const withNativeBuffer: boolean = - typeof Buffer === "function" && typeof Buffer.isBuffer === "function"; -const withNativeArrayBuffer: boolean = typeof ArrayBuffer === "function"; - -const isView = (obj: any) => { - return typeof ArrayBuffer.isView === "function" - ? ArrayBuffer.isView(obj) - : obj.buffer instanceof ArrayBuffer; -}; - -/** - * Returns true if obj is a buffer or an arraybuffer. - * - * @private - */ - -export default function isBuf(obj) { - return ( - (withNativeBuffer && Buffer.isBuffer(obj)) || - (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) - ); -} diff --git a/test/arraybuffer.js b/test/arraybuffer.js index 3d1c194..948c336 100644 --- a/test/arraybuffer.js +++ b/test/arraybuffer.js @@ -55,16 +55,16 @@ describe('parser', () => { nsp: '/' }; - encoder.encode(packet, encodedPackets => { - var decoder = new Decoder(); - decoder.on('decoded', packet => { - throw new Error("received a packet when not all binary data was sent."); - }); + const encodedPackets = encoder.encode(packet); - decoder.add(encodedPackets[0]); // add metadata - decoder.add(encodedPackets[1]); // add first attachment - decoder.destroy(); // destroy before all data added - expect(decoder.reconstructor.buffers.length).to.be(0); // expect that buffer is clean + var decoder = new Decoder(); + decoder.on('decoded', packet => { + throw new Error("received a packet when not all binary data was sent."); }); + + decoder.add(encodedPackets[0]); // add metadata + decoder.add(encodedPackets[1]); // add first attachment + decoder.destroy(); // destroy before all data added + expect(decoder.reconstructor.buffers.length).to.be(0); // expect that buffer is clean }); }); diff --git a/test/helpers.js b/test/helpers.js index 2c8ddf0..cd7023a 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -4,33 +4,33 @@ const encoder = new parser.Encoder(); // tests encoding and decoding a single packet module.exports.test = (obj, done) => { - encoder.encode(obj, encodedPackets => { - const decoder = new parser.Decoder(); - decoder.on('decoded', packet => { - expect(packet).to.eql(obj); - done(); - }); - - decoder.add(encodedPackets[0]); + const encodedPackets = encoder.encode(obj); + + const decoder = new parser.Decoder(); + decoder.on('decoded', packet => { + expect(packet).to.eql(obj); + done(); }); + + decoder.add(encodedPackets[0]); } // tests encoding of binary packets module.exports.test_bin = (obj, done) => { const originalData = obj.data; - encoder.encode(obj, encodedPackets => { - const decoder = new parser.Decoder(); - decoder.on('decoded', packet => { - obj.data = originalData; - obj.attachments = undefined; - expect(obj).to.eql(packet); - done(); - }); - - for (let i = 0; i < encodedPackets.length; i++) { - decoder.add(encodedPackets[i]); - } + const encodedPackets = encoder.encode(obj); + + const decoder = new parser.Decoder(); + decoder.on('decoded', packet => { + obj.data = originalData; + obj.attachments = undefined; + expect(obj).to.eql(packet); + done(); }); + + for (let i = 0; i < encodedPackets.length; i++) { + decoder.add(encodedPackets[i]); + } } // array buffer's slice is native code that is not transported across From cfdc4794f6a32c2ef7e1194a7cd015610ced2450 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 23 Sep 2020 22:51:44 +0200 Subject: [PATCH 094/129] refactor: use prettier to format test code --- package.json | 4 +- test/arraybuffer.js | 63 +++++++++++--------- test/blob.js | 39 ++++++------ test/buffer.js | 36 ++++++----- test/helpers.js | 22 +++---- test/index.js | 36 ++++++----- test/parser.js | 141 +++++++++++++++++++++++++------------------- test/support/env.js | 2 +- 8 files changed, 195 insertions(+), 148 deletions(-) diff --git a/package.json b/package.json index a403585..6c32a8b 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ "test": "npm run format:check && tsc && if test \"$BROWSERS\" = \"1\" ; then npm run test:browser; else npm run test:node; fi", "test:node": "mocha --reporter dot --bail test/index.js", "test:browser": "zuul test/index.js --no-coverage", - "format:fix": "prettier --write --parser typescript \"lib/**/*.ts\"", - "format:check": "prettier --check --parser typescript \"lib/**/*.ts\"" + "format:fix": "prettier --write --parser typescript 'lib/**/*.ts' 'test/**/*.js'", + "format:check": "prettier --check --parser typescript 'lib/**/*.ts' 'test/**/*.js'" }, "license": "MIT", "engines": { diff --git a/test/arraybuffer.js b/test/arraybuffer.js index 948c336..b5df85e 100644 --- a/test/arraybuffer.js +++ b/test/arraybuffer.js @@ -1,64 +1,71 @@ -const { PacketType, Decoder, Encoder } = require('..'); -const expect = require('expect.js'); -const helpers = require('./helpers.js'); +const { PacketType, Decoder, Encoder } = require(".."); +const expect = require("expect.js"); +const helpers = require("./helpers.js"); const encoder = new Encoder(); -describe('parser', () => { - it('encodes an ArrayBuffer', done => { - var packet = { +describe("parser", () => { + it("encodes an ArrayBuffer", (done) => { + const packet = { type: PacketType.BINARY_EVENT, - data: ['a', new ArrayBuffer(2)], + data: ["a", new ArrayBuffer(2)], id: 0, - nsp: '/' + nsp: "/", }; helpers.test_bin(packet, done); }); - it('encodes a TypedArray', done => { - var array = new Uint8Array(5); - for (var i = 0; i < array.length; i++) array[i] = i; + it("encodes a TypedArray", (done) => { + const array = new Uint8Array(5); + for (let i = 0; i < array.length; i++) array[i] = i; - var packet = { + const packet = { type: PacketType.BINARY_EVENT, - data: ['a', array], + data: ["a", array], id: 0, - nsp: '/' + nsp: "/", }; helpers.test_bin(packet, done); }); - it('encodes ArrayBuffers deep in JSON', done => { - var packet = { + it("encodes ArrayBuffers deep in JSON", (done) => { + const packet = { type: PacketType.BINARY_EVENT, - data: ['a', {a: 'hi', b: {why: new ArrayBuffer(3)}, c: {a: 'bye', b: { a: new ArrayBuffer(6)}}}], + data: [ + "a", + { + a: "hi", + b: { why: new ArrayBuffer(3) }, + c: { a: "bye", b: { a: new ArrayBuffer(6) } }, + }, + ], id: 999, - nsp: '/deep' + nsp: "/deep", }; helpers.test_bin(packet, done); }); - it('encodes deep binary JSON with null values', done => { - var packet = { + it("encodes deep binary JSON with null values", (done) => { + const packet = { type: PacketType.BINARY_EVENT, - data: ['a', {a: 'b', c: 4, e: {g: null}, h: new ArrayBuffer(9)}], - nsp: '/', - id: 600 + data: ["a", { a: "b", c: 4, e: { g: null }, h: new ArrayBuffer(9) }], + nsp: "/", + id: 600, }; helpers.test_bin(packet, done); }); - it('cleans itself up on close', () => { - var packet = { + it("cleans itself up on close", () => { + const packet = { type: PacketType.BINARY_EVENT, data: [new ArrayBuffer(2), new ArrayBuffer(3)], id: 0, - nsp: '/' + nsp: "/", }; const encodedPackets = encoder.encode(packet); - var decoder = new Decoder(); - decoder.on('decoded', packet => { + const decoder = new Decoder(); + decoder.on("decoded", (packet) => { throw new Error("received a packet when not all binary data was sent."); }); diff --git a/test/blob.js b/test/blob.js index 2e54a7e..43ef584 100644 --- a/test/blob.js +++ b/test/blob.js @@ -1,13 +1,19 @@ -const { PacketType } = require('..'); -const helpers = require('./helpers.js'); +const { PacketType } = require(".."); +const helpers = require("./helpers.js"); -const BlobBuilderImpl = typeof BlobBuilder !== 'undefined' ? BlobBuilder : - typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder : - typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : - typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : false; +const BlobBuilderImpl = + typeof BlobBuilder !== "undefined" + ? BlobBuilder + : typeof WebKitBlobBuilder !== "undefined" + ? WebKitBlobBuilder + : typeof MSBlobBuilder !== "undefined" + ? MSBlobBuilder + : typeof MozBlobBuilder !== "undefined" + ? MozBlobBuilder + : false; -describe('parser', () => { - it('encodes a Blob', (done) => { +describe("parser", () => { + it("encodes a Blob", (done) => { let data; if (BlobBuilderImpl) { const bb = new BlobBuilderImpl(); @@ -21,12 +27,12 @@ describe('parser', () => { type: PacketType.BINARY_EVENT, data: [data], id: 0, - nsp: '/' + nsp: "/", }; helpers.test_bin(packet, done); }); - it('encodes an Blob deep in JSON', (done) => { + it("encodes an Blob deep in JSON", (done) => { let data; if (BlobBuilderImpl) { const bb = new BlobBuilderImpl(); @@ -38,14 +44,14 @@ describe('parser', () => { const packet = { type: PacketType.BINARY_EVENT, - data: [{a: 'hi', b: {why: data}, c: 'bye'}], + data: [{ a: "hi", b: { why: data }, c: "bye" }], id: 999, - nsp: '/deep' + nsp: "/deep", }; helpers.test_bin(packet, done); }); - it('encodes a binary ack with a blob', (done) => { + it("encodes a binary ack with a blob", (done) => { let data; if (BlobBuilderImpl) { const bb = new BlobBuilderImpl(); @@ -57,11 +63,10 @@ describe('parser', () => { const packet = { type: PacketType.BINARY_ACK, - data: [{a: 'hi ack', b: {why: data}, c: 'bye ack'}], + data: [{ a: "hi ack", b: { why: data }, c: "bye ack" }], id: 999, - nsp: '/deep' + nsp: "/deep", }; helpers.test_bin(packet, done); - }) - + }); }); diff --git a/test/buffer.js b/test/buffer.js index 5419c34..d5ebc23 100644 --- a/test/buffer.js +++ b/test/buffer.js @@ -1,22 +1,28 @@ -const { PacketType } = require('..'); -const helpers = require('./helpers.js'); +const { PacketType } = require(".."); +const helpers = require("./helpers.js"); -describe('parser', () => { - it('encodes a Buffer', done => { - helpers.test_bin({ +describe("parser", () => { + it("encodes a Buffer", (done) => { + helpers.test_bin( + { type: PacketType.BINARY_EVENT, - data: ['a', Buffer.from('abc', 'utf8')], + data: ["a", Buffer.from("abc", "utf8")], id: 23, - nsp: '/cool' - }, done); + nsp: "/cool", + }, + done + ); }); - it('encodes a binary ack with Buffer', done => { - helpers.test_bin({ - type: PacketType.BINARY_ACK, - data: ['a', Buffer.from('xxx', 'utf8'), {}], - id: 127, - nsp: '/back' - }, done) + it("encodes a binary ack with Buffer", (done) => { + helpers.test_bin( + { + type: PacketType.BINARY_ACK, + data: ["a", Buffer.from("xxx", "utf8"), {}], + id: 127, + nsp: "/back", + }, + done + ); }); }); diff --git a/test/helpers.js b/test/helpers.js index cd7023a..2277300 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -1,5 +1,5 @@ -const parser = require('..'); -const expect = require('expect.js'); +const parser = require(".."); +const expect = require("expect.js"); const encoder = new parser.Encoder(); // tests encoding and decoding a single packet @@ -7,13 +7,13 @@ module.exports.test = (obj, done) => { const encodedPackets = encoder.encode(obj); const decoder = new parser.Decoder(); - decoder.on('decoded', packet => { + decoder.on("decoded", (packet) => { expect(packet).to.eql(obj); done(); }); decoder.add(encodedPackets[0]); -} +}; // tests encoding of binary packets module.exports.test_bin = (obj, done) => { @@ -21,7 +21,7 @@ module.exports.test_bin = (obj, done) => { const encodedPackets = encoder.encode(obj); const decoder = new parser.Decoder(); - decoder.on('decoded', packet => { + decoder.on("decoded", (packet) => { obj.data = originalData; obj.attachments = undefined; expect(obj).to.eql(packet); @@ -31,18 +31,18 @@ module.exports.test_bin = (obj, done) => { for (let i = 0; i < encodedPackets.length; i++) { decoder.add(encodedPackets[i]); } -} +}; // array buffer's slice is native code that is not transported across // socket.io via msgpack, so regular .eql fails module.exports.testArrayBuffers = (buf1, buf2) => { - buf1.slice = undefined; - buf2.slice = undefined; - expect(buf1).to.eql(buf2); -} + buf1.slice = undefined; + buf2.slice = undefined; + expect(buf1).to.eql(buf2); +}; module.exports.testPacketMetadata = (p1, p2) => { expect(p1.type).to.eql(p2.type); expect(p1.id).to.eql(p2.id); expect(p1.nsp).to.eql(p2.nsp); -} +}; diff --git a/test/index.js b/test/index.js index 167c3a8..06114c8 100644 --- a/test/index.js +++ b/test/index.js @@ -1,33 +1,41 @@ -const env = require('./support/env.js'); +const env = require("./support/env.js"); const blobSupported = (function () { try { - new Blob(['hi']); + new Blob(["hi"]); return true; - } catch (e) { - } + } catch (e) {} return false; })(); /** * Create a blob builder even when vendor prefixes exist */ -const BlobBuilderImpl = typeof BlobBuilder !== 'undefined' ? BlobBuilder : - typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder : - typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : - typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : false; -const blobBuilderSupported = !!BlobBuilderImpl && !!BlobBuilderImpl.prototype.append && !!BlobBuilderImpl.prototype.getBlob; +const BlobBuilderImpl = + typeof BlobBuilder !== "undefined" + ? BlobBuilder + : typeof WebKitBlobBuilder !== "undefined" + ? WebKitBlobBuilder + : typeof MSBlobBuilder !== "undefined" + ? MSBlobBuilder + : typeof MozBlobBuilder !== "undefined" + ? MozBlobBuilder + : false; +const blobBuilderSupported = + !!BlobBuilderImpl && + !!BlobBuilderImpl.prototype.append && + !!BlobBuilderImpl.prototype.getBlob; -require('./parser.js'); +require("./parser.js"); if (!env.browser) { - require('./buffer.js'); + require("./buffer.js"); } -if (typeof ArrayBuffer !== 'undefined') { - require('./arraybuffer.js'); +if (typeof ArrayBuffer !== "undefined") { + require("./arraybuffer.js"); } if (blobSupported || blobBuilderSupported) { - require('./blob.js'); + require("./blob.js"); } diff --git a/test/parser.js b/test/parser.js index ea50cdd..f2bd2e9 100644 --- a/test/parser.js +++ b/test/parser.js @@ -1,94 +1,115 @@ -const { PacketType, Decoder, Encoder } = require('..'); -const expect = require('expect.js'); -const helpers = require('./helpers.js'); +const { PacketType, Decoder, Encoder } = require(".."); +const expect = require("expect.js"); +const helpers = require("./helpers.js"); -describe('parser', () => { - - it('exposes types', () => { - expect(PacketType.CONNECT).to.be.a('number'); - expect(PacketType.DISCONNECT).to.be.a('number'); - expect(PacketType.EVENT).to.be.a('number'); - expect(PacketType.ACK).to.be.a('number'); - expect(PacketType.ERROR).to.be.a('number'); - expect(PacketType.BINARY_EVENT).to.be.a('number'); - expect(PacketType.BINARY_ACK).to.be.a('number'); +describe("parser", () => { + it("exposes types", () => { + expect(PacketType.CONNECT).to.be.a("number"); + expect(PacketType.DISCONNECT).to.be.a("number"); + expect(PacketType.EVENT).to.be.a("number"); + expect(PacketType.ACK).to.be.a("number"); + expect(PacketType.ERROR).to.be.a("number"); + expect(PacketType.BINARY_EVENT).to.be.a("number"); + expect(PacketType.BINARY_ACK).to.be.a("number"); }); - it('encodes connection', done => { - helpers.test({ - type: PacketType.CONNECT, - nsp: '/woot' - }, done); + it("encodes connection", (done) => { + helpers.test( + { + type: PacketType.CONNECT, + nsp: "/woot", + }, + done + ); }); - it('encodes disconnection', done => { - helpers.test({ - type: PacketType.DISCONNECT, - nsp: '/woot' - }, done); + it("encodes disconnection", (done) => { + helpers.test( + { + type: PacketType.DISCONNECT, + nsp: "/woot", + }, + done + ); }); - it('encodes an event', done => { - helpers.test({ - type: PacketType.EVENT, - data: ['a', 1, {}], - nsp: '/' - }, done); + it("encodes an event", (done) => { + helpers.test( + { + type: PacketType.EVENT, + data: ["a", 1, {}], + nsp: "/", + }, + done + ); }); - it('encodes an event (with ack)', done => { - helpers.test({ - type: PacketType.EVENT, - data: ['a', 1, {}], - id: 1, - nsp: '/test' - }, done); + it("encodes an event (with ack)", (done) => { + helpers.test( + { + type: PacketType.EVENT, + data: ["a", 1, {}], + id: 1, + nsp: "/test", + }, + done + ); }); - it('encodes an ack', done => { - helpers.test({ - type: PacketType.ACK, - data: ['a', 1, {}], - id: 123, - nsp: '/' - }, done); + it("encodes an ack", (done) => { + helpers.test( + { + type: PacketType.ACK, + data: ["a", 1, {}], + id: 123, + nsp: "/", + }, + done + ); }); - it('encodes an error', done => { - helpers.test({ - type: PacketType.ERROR, - data: 'Unauthorized', - nsp: '/' - }, done); + it("encodes an error", (done) => { + helpers.test( + { + type: PacketType.ERROR, + data: "Unauthorized", + nsp: "/", + }, + done + ); }); - it('throws an error when encoding circular objects', () => { - var a = {}; + it("throws an error when encoding circular objects", () => { + const a = {}; a.b = a; - var data = { + const data = { type: PacketType.EVENT, data: a, id: 1, - nsp: '/' - } + nsp: "/", + }; const encoder = new Encoder(); expect(() => encoder.encode(data)).to.throwException(); }); - it('decodes a bad binary packet', () => { + it("decodes a bad binary packet", () => { try { const decoder = new Decoder(); - decoder.add('5'); - } catch(e){ + decoder.add("5"); + } catch (e) { expect(e.message).to.match(/Illegal/); } }); - it('throw an error upon parsing error', () => { - expect(() => new Decoder().add('442["some","data"')).to.throwException(/^invalid payload$/); - expect(() => new Decoder().add('999')).to.throwException(/^unknown packet type 9$/); + it("throw an error upon parsing error", () => { + expect(() => new Decoder().add('442["some","data"')).to.throwException( + /^invalid payload$/ + ); + expect(() => new Decoder().add("999")).to.throwException( + /^unknown packet type 9$/ + ); }); }); diff --git a/test/support/env.js b/test/support/env.js index 0b4873d..cc5d9b9 100644 --- a/test/support/env.js +++ b/test/support/env.js @@ -2,4 +2,4 @@ // we only do this in our tests because we need to test engine.io-client // support in browsers and in node.js // some tests do not yet work in both -module.exports.browser = typeof window !== 'undefined'; +module.exports.browser = typeof window !== "undefined"; From 9e601c69404d0be12ac0e5ccd785c6da6dd5c619 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 28 Sep 2020 14:37:47 +0200 Subject: [PATCH 095/129] refactor: export Packet interface and refactor imports --- lib/index.ts | 10 +++++----- tsconfig.json | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index d3ba917..407bdc7 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,5 +1,5 @@ -import * as Emitter from "component-emitter"; -import * as binary from "./binary"; +import Emitter from "component-emitter"; +import { deconstructPacket, reconstructPacket } from "./binary"; import isBinary from "./is-binary"; import debugModule from "debug"; @@ -23,7 +23,7 @@ export enum PacketType { BINARY_ACK, } -interface Packet { +export interface Packet { type: PacketType; nsp: string; data?: any; @@ -99,7 +99,7 @@ export class Encoder { */ private encodeAsBinary(obj: Packet) { - const deconstruction = binary.deconstructPacket(obj); + const deconstruction = deconstructPacket(obj); const pack = this.encodeAsString(deconstruction.packet); const buffers = deconstruction.buffers; @@ -285,7 +285,7 @@ class BinaryReconstructor { this.buffers.push(binData); if (this.buffers.length === this.reconPack.attachments) { // done with buffer list - const packet = binary.reconstructPacket(this.reconPack, this.buffers); + const packet = reconstructPacket(this.reconPack, this.buffers); this.finishedReconstruction(); return packet; } diff --git a/tsconfig.json b/tsconfig.json index 87d51bf..bcd6128 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,8 @@ "allowJs": false, "target": "es2017", "module": "commonjs", - "declaration": true + "declaration": true, + "esModuleInterop": true }, "include": [ "./lib/**/*" From c04d7f5c47ed712eb0f56cfc1a859f1aaa828f1e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 28 Sep 2020 14:54:14 +0200 Subject: [PATCH 096/129] chore(release): 4.0.0 This release will be included in Socket.IO v3. Diff: https://github.com/socketio/socket.io-parser/compare/3.4.1...4.0.0 --- CHANGELOG.md | 18 ++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fe8f3a..2df0ed3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +# [4.0.0](https://github.com/socketio/socket.io-parser/compare/3.4.1...4.0.0) (2020-09-28) + +This release will be included in Socket.IO v3. + +There is a breaking API change (see below), but the exchange [protocol](https://github.com/socketio/socket.io-protocol) is left untouched and thus stays in version 4. + +### Bug Fixes + +* do not catch encoding errors ([aeae87c](https://github.com/socketio/socket.io-parser/commit/aeae87c220287197cb78370dbd86b950a7dd29eb)) +* throw upon invalid payload format ([c327acb](https://github.com/socketio/socket.io-parser/commit/c327acbc3c3c2d0b2b439136cbcb56c81db173d6)) + + +### BREAKING CHANGES + +* the encode method is now synchronous ([28d4f03](https://github.com/socketio/socket.io-parser/commit/28d4f0309bdd9e306b78d1946d3e1760941d6544)) + + + ## [3.4.1](https://github.com/socketio/socket.io-parser/compare/3.4.0...3.4.1) (2020-05-13) diff --git a/package-lock.json b/package-lock.json index 80f8c42..30ff443 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "3.4.1", + "version": "4.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6c32a8b..aa68554 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "3.4.1", + "version": "4.0.0", "description": "socket.io protocol parser", "repository": { "type": "git", From ccadd5a462a3ac9b278fe67aaf177cad7bbb68a6 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 30 Sep 2020 02:45:53 +0200 Subject: [PATCH 097/129] docs(changelog): include changelog for release 3.3.1 Merged from the 3.3.x branch. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2df0ed3..166ae9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## [3.3.1](https://github.com/socketio/socket.io-parser/compare/3.3.0...3.3.1) (2020-09-30) + + # [4.0.0](https://github.com/socketio/socket.io-parser/compare/3.4.1...4.0.0) (2020-09-28) This release will be included in Socket.IO v3. From 091d25edf12804b231b788d7c8479987f90b5c24 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 6 Oct 2020 01:04:55 +0200 Subject: [PATCH 098/129] chore: add dist --- .gitignore | 1 - dist/binary.d.ts | 20 ++++ dist/binary.js | 83 ++++++++++++++ dist/index.d.ts | 71 ++++++++++++ dist/index.js | 268 ++++++++++++++++++++++++++++++++++++++++++++ dist/is-binary.d.ts | 6 + dist/is-binary.js | 28 +++++ 7 files changed, 476 insertions(+), 1 deletion(-) create mode 100644 dist/binary.d.ts create mode 100644 dist/binary.js create mode 100644 dist/index.d.ts create mode 100644 dist/index.js create mode 100644 dist/is-binary.d.ts create mode 100644 dist/is-binary.js diff --git a/.gitignore b/.gitignore index 44d646d..3c3629e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ node_modules -dist/ diff --git a/dist/binary.d.ts b/dist/binary.d.ts new file mode 100644 index 0000000..835bd62 --- /dev/null +++ b/dist/binary.d.ts @@ -0,0 +1,20 @@ +/** + * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder. + * + * @param {Object} packet - socket.io event packet + * @return {Object} with deconstructed packet and list of buffers + * @public + */ +export declare function deconstructPacket(packet: any): { + packet: any; + buffers: any[]; +}; +/** + * Reconstructs a binary packet from its placeholder packet and buffers + * + * @param {Object} packet - event packet with placeholders + * @param {Array} buffers - binary buffers to put in placeholder positions + * @return {Object} reconstructed packet + * @public + */ +export declare function reconstructPacket(packet: any, buffers: any): any; diff --git a/dist/binary.js b/dist/binary.js new file mode 100644 index 0000000..cbee976 --- /dev/null +++ b/dist/binary.js @@ -0,0 +1,83 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.reconstructPacket = exports.deconstructPacket = void 0; +const is_binary_1 = __importDefault(require("./is-binary")); +/** + * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder. + * + * @param {Object} packet - socket.io event packet + * @return {Object} with deconstructed packet and list of buffers + * @public + */ +function deconstructPacket(packet) { + const buffers = []; + const packetData = packet.data; + const pack = packet; + pack.data = _deconstructPacket(packetData, buffers); + pack.attachments = buffers.length; // number of binary 'attachments' + return { packet: pack, buffers: buffers }; +} +exports.deconstructPacket = deconstructPacket; +function _deconstructPacket(data, buffers) { + if (!data) + return data; + if (is_binary_1.default(data)) { + const placeholder = { _placeholder: true, num: buffers.length }; + buffers.push(data); + return placeholder; + } + else if (Array.isArray(data)) { + const newData = new Array(data.length); + for (let i = 0; i < data.length; i++) { + newData[i] = _deconstructPacket(data[i], buffers); + } + return newData; + } + else if (typeof data === "object" && !(data instanceof Date)) { + const newData = {}; + for (const key in data) { + if (data.hasOwnProperty(key)) { + newData[key] = _deconstructPacket(data[key], buffers); + } + } + return newData; + } + return data; +} +/** + * Reconstructs a binary packet from its placeholder packet and buffers + * + * @param {Object} packet - event packet with placeholders + * @param {Array} buffers - binary buffers to put in placeholder positions + * @return {Object} reconstructed packet + * @public + */ +function reconstructPacket(packet, buffers) { + packet.data = _reconstructPacket(packet.data, buffers); + packet.attachments = undefined; // no longer useful + return packet; +} +exports.reconstructPacket = reconstructPacket; +function _reconstructPacket(data, buffers) { + if (!data) + return data; + if (data && data._placeholder) { + return buffers[data.num]; // appropriate buffer (should be natural order anyway) + } + else if (Array.isArray(data)) { + for (let i = 0; i < data.length; i++) { + data[i] = _reconstructPacket(data[i], buffers); + } + } + else if (typeof data === "object") { + for (const key in data) { + if (data.hasOwnProperty(key)) { + data[key] = _reconstructPacket(data[key], buffers); + } + } + } + return data; +} diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..0b88a8a --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,71 @@ +import Emitter from "component-emitter"; +/** + * Protocol version. + * + * @public + */ +export declare const protocol: number; +export declare enum PacketType { + CONNECT = 0, + DISCONNECT = 1, + EVENT = 2, + ACK = 3, + ERROR = 4, + BINARY_EVENT = 5, + BINARY_ACK = 6 +} +export interface Packet { + type: PacketType; + nsp: string; + data?: any; + id?: number; + attachments?: number; +} +/** + * A socket.io Encoder instance + */ +export declare class Encoder { + /** + * Encode a packet as a single string if non-binary, or as a + * buffer sequence, depending on packet type. + * + * @param {Object} obj - packet object + */ + encode(obj: Packet): any[]; + /** + * Encode packet as string. + */ + private encodeAsString; + /** + * Encode packet as 'buffer sequence' by removing blobs, and + * deconstructing packet into object with placeholders and + * a list of buffers. + */ + private encodeAsBinary; +} +/** + * A socket.io Decoder instance + * + * @return {Object} decoder + */ +export declare class Decoder extends Emitter { + private reconstructor; + constructor(); + /** + * Decodes an encoded packet string into packet JSON. + * + * @param {String} obj - encoded packet + */ + add(obj: any): void; + /** + * Decode a packet String (JSON data) + * + * @param {String} str + * @return {Object} packet + */ + private decodeString; + /** + * Deallocates a parser's resources + */ + destroy(): void; +} diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..732933d --- /dev/null +++ b/dist/index.js @@ -0,0 +1,268 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Decoder = exports.Encoder = exports.PacketType = exports.protocol = void 0; +const component_emitter_1 = __importDefault(require("component-emitter")); +const binary_1 = require("./binary"); +const is_binary_1 = __importDefault(require("./is-binary")); +const debug_1 = __importDefault(require("debug")); +const debug = debug_1.default("socket.io-parser"); +/** + * Protocol version. + * + * @public + */ +exports.protocol = 4; +var PacketType; +(function (PacketType) { + PacketType[PacketType["CONNECT"] = 0] = "CONNECT"; + PacketType[PacketType["DISCONNECT"] = 1] = "DISCONNECT"; + PacketType[PacketType["EVENT"] = 2] = "EVENT"; + PacketType[PacketType["ACK"] = 3] = "ACK"; + PacketType[PacketType["ERROR"] = 4] = "ERROR"; + PacketType[PacketType["BINARY_EVENT"] = 5] = "BINARY_EVENT"; + PacketType[PacketType["BINARY_ACK"] = 6] = "BINARY_ACK"; +})(PacketType = exports.PacketType || (exports.PacketType = {})); +/** + * A socket.io Encoder instance + */ +class Encoder { + /** + * Encode a packet as a single string if non-binary, or as a + * buffer sequence, depending on packet type. + * + * @param {Object} obj - packet object + */ + encode(obj) { + debug("encoding packet %j", obj); + if (obj.type === PacketType.BINARY_EVENT || + obj.type === PacketType.BINARY_ACK) { + return this.encodeAsBinary(obj); + } + else { + const encoding = this.encodeAsString(obj); + return [encoding]; + } + } + /** + * Encode packet as string. + */ + encodeAsString(obj) { + // first is type + let str = "" + obj.type; + // attachments if we have them + if (obj.type === PacketType.BINARY_EVENT || + obj.type === PacketType.BINARY_ACK) { + str += obj.attachments + "-"; + } + // if we have a namespace other than `/` + // we append it followed by a comma `,` + if (obj.nsp && "/" !== obj.nsp) { + str += obj.nsp + ","; + } + // immediately followed by the id + if (null != obj.id) { + str += obj.id; + } + // json data + if (null != obj.data) { + str += JSON.stringify(obj.data); + } + debug("encoded %j as %s", obj, str); + return str; + } + /** + * Encode packet as 'buffer sequence' by removing blobs, and + * deconstructing packet into object with placeholders and + * a list of buffers. + */ + encodeAsBinary(obj) { + const deconstruction = binary_1.deconstructPacket(obj); + const pack = this.encodeAsString(deconstruction.packet); + const buffers = deconstruction.buffers; + buffers.unshift(pack); // add packet info to beginning of data list + return buffers; // write all the buffers + } +} +exports.Encoder = Encoder; +/** + * A socket.io Decoder instance + * + * @return {Object} decoder + */ +class Decoder extends component_emitter_1.default { + constructor() { + super(); + } + /** + * Decodes an encoded packet string into packet JSON. + * + * @param {String} obj - encoded packet + */ + add(obj) { + let packet; + if (typeof obj === "string") { + packet = this.decodeString(obj); + if (packet.type === PacketType.BINARY_EVENT || + packet.type === PacketType.BINARY_ACK) { + // binary packet's json + this.reconstructor = new BinaryReconstructor(packet); + // no attachments, labeled binary but no binary data to follow + if (packet.attachments === 0) { + super.emit("decoded", packet); + } + } + else { + // non-binary full packet + super.emit("decoded", packet); + } + } + else if (is_binary_1.default(obj) || obj.base64) { + // raw binary data + if (!this.reconstructor) { + throw new Error("got binary data when not reconstructing a packet"); + } + else { + packet = this.reconstructor.takeBinaryData(obj); + if (packet) { + // received final buffer + this.reconstructor = null; + super.emit("decoded", packet); + } + } + } + else { + throw new Error("Unknown type: " + obj); + } + } + /** + * Decode a packet String (JSON data) + * + * @param {String} str + * @return {Object} packet + */ + decodeString(str) { + let i = 0; + // look up type + const p = { + type: Number(str.charAt(0)), + }; + if (PacketType[p.type] === undefined) { + throw new Error("unknown packet type " + p.type); + } + // look up attachments if type binary + if (p.type === PacketType.BINARY_EVENT || + p.type === PacketType.BINARY_ACK) { + const start = i + 1; + while (str.charAt(++i) !== "-" && i != str.length) { } + const buf = str.substring(start, i); + if (buf != Number(buf) || str.charAt(i) !== "-") { + throw new Error("Illegal attachments"); + } + p.attachments = Number(buf); + } + // look up namespace (if any) + if ("/" === str.charAt(i + 1)) { + const start = i + 1; + while (++i) { + const c = str.charAt(i); + if ("," === c) + break; + if (i === str.length) + break; + } + p.nsp = str.substring(start, i); + } + else { + p.nsp = "/"; + } + // look up id + const next = str.charAt(i + 1); + if ("" !== next && Number(next) == next) { + const start = i + 1; + while (++i) { + const c = str.charAt(i); + if (null == c || Number(c) != c) { + --i; + break; + } + if (i === str.length) + break; + } + p.id = Number(str.substring(start, i + 1)); + } + // look up json data + if (str.charAt(++i)) { + const payload = tryParse(str.substr(i)); + const isPayloadValid = payload !== false && + (p.type === PacketType.ERROR || Array.isArray(payload)); + if (isPayloadValid) { + p.data = payload; + } + else { + throw new Error("invalid payload"); + } + } + debug("decoded %s as %j", str, p); + return p; + } + /** + * Deallocates a parser's resources + */ + destroy() { + if (this.reconstructor) { + this.reconstructor.finishedReconstruction(); + } + } +} +exports.Decoder = Decoder; +function tryParse(str) { + try { + return JSON.parse(str); + } + catch (e) { + return false; + } +} +/** + * A manager of a binary event's 'buffer sequence'. Should + * be constructed whenever a packet of type BINARY_EVENT is + * decoded. + * + * @param {Object} packet + * @return {BinaryReconstructor} initialized reconstructor + */ +class BinaryReconstructor { + constructor(packet) { + this.packet = packet; + this.buffers = []; + this.reconPack = packet; + } + /** + * Method to be called when binary data received from connection + * after a BINARY_EVENT packet. + * + * @param {Buffer | ArrayBuffer} binData - the raw binary data received + * @return {null | Object} returns null if more binary data is expected or + * a reconstructed packet object if all buffers have been received. + */ + takeBinaryData(binData) { + this.buffers.push(binData); + if (this.buffers.length === this.reconPack.attachments) { + // done with buffer list + const packet = binary_1.reconstructPacket(this.reconPack, this.buffers); + this.finishedReconstruction(); + return packet; + } + return null; + } + /** + * Cleans up binary packet reconstruction variables. + */ + finishedReconstruction() { + this.reconPack = null; + this.buffers = []; + } +} diff --git a/dist/is-binary.d.ts b/dist/is-binary.d.ts new file mode 100644 index 0000000..9b284a8 --- /dev/null +++ b/dist/is-binary.d.ts @@ -0,0 +1,6 @@ +/** + * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File. + * + * @private + */ +export default function isBinary(obj: any): boolean; diff --git a/dist/is-binary.js b/dist/is-binary.js new file mode 100644 index 0000000..41c3f42 --- /dev/null +++ b/dist/is-binary.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const withNativeBuffer = typeof Buffer === "function" && typeof Buffer.isBuffer === "function"; +const withNativeArrayBuffer = typeof ArrayBuffer === "function"; +const isView = (obj) => { + return typeof ArrayBuffer.isView === "function" + ? ArrayBuffer.isView(obj) + : obj.buffer instanceof ArrayBuffer; +}; +const toString = Object.prototype.toString; +const withNativeBlob = typeof Blob === "function" || + (typeof Blob !== "undefined" && + toString.call(Blob) === "[object BlobConstructor]"); +const withNativeFile = typeof File === "function" || + (typeof File !== "undefined" && + toString.call(File) === "[object FileConstructor]"); +/** + * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File. + * + * @private + */ +function isBinary(obj) { + return ((withNativeBuffer && Buffer.isBuffer(obj)) || + (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) || + (withNativeBlob && obj instanceof Blob) || + (withNativeFile && obj instanceof File)); +} +exports.default = isBinary; From 9eb8561cbcc318c09607bcbdd696b73e1501df0b Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 6 Oct 2020 01:15:44 +0200 Subject: [PATCH 099/129] refactor: use require for debug dependency So that the lines can be properly excluded by the webpack-remove-debug loader ([1]). [1] https://github.com/johngodley/webpack-remove-debug --- dist/index.js | 3 +-- lib/index.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/dist/index.js b/dist/index.js index 732933d..b7b716b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -7,8 +7,7 @@ exports.Decoder = exports.Encoder = exports.PacketType = exports.protocol = void const component_emitter_1 = __importDefault(require("component-emitter")); const binary_1 = require("./binary"); const is_binary_1 = __importDefault(require("./is-binary")); -const debug_1 = __importDefault(require("debug")); -const debug = debug_1.default("socket.io-parser"); +const debug = require("debug")("socket.io-parser"); /** * Protocol version. * diff --git a/lib/index.ts b/lib/index.ts index 407bdc7..a9c9043 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,9 +1,8 @@ import Emitter from "component-emitter"; import { deconstructPacket, reconstructPacket } from "./binary"; import isBinary from "./is-binary"; -import debugModule from "debug"; -const debug = debugModule("socket.io-parser"); +const debug = require("debug")("socket.io-parser"); /** * Protocol version. From 78f9fc2999b15804b02f2c22a2b4007734a26af9 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 7 Oct 2020 18:36:33 +0200 Subject: [PATCH 100/129] feat: add support for a payload in a CONNECT packet --- dist/index.d.ts | 1 + dist/index.js | 20 +++++++++++++++++--- lib/index.ts | 22 ++++++++++++++++++---- test/arraybuffer.js | 2 +- test/blob.js | 4 ++-- test/parser.js | 17 ++++++++++++++--- 6 files changed, 53 insertions(+), 13 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index 0b88a8a..c2e4753 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -64,6 +64,7 @@ export declare class Decoder extends Emitter { * @return {Object} packet */ private decodeString; + private static isPayloadValid; /** * Deallocates a parser's resources */ diff --git a/dist/index.js b/dist/index.js index b7b716b..69cf092 100644 --- a/dist/index.js +++ b/dist/index.js @@ -195,9 +195,7 @@ class Decoder extends component_emitter_1.default { // look up json data if (str.charAt(++i)) { const payload = tryParse(str.substr(i)); - const isPayloadValid = payload !== false && - (p.type === PacketType.ERROR || Array.isArray(payload)); - if (isPayloadValid) { + if (Decoder.isPayloadValid(p.type, payload)) { p.data = payload; } else { @@ -207,6 +205,22 @@ class Decoder extends component_emitter_1.default { debug("decoded %s as %j", str, p); return p; } + static isPayloadValid(type, payload) { + switch (type) { + case PacketType.CONNECT: + return typeof payload === "object"; + case PacketType.DISCONNECT: + return payload === undefined; + case PacketType.ERROR: + return typeof payload === "string"; + case PacketType.EVENT: + case PacketType.BINARY_EVENT: + return Array.isArray(payload) && typeof payload[0] === "string"; + case PacketType.ACK: + case PacketType.BINARY_ACK: + return Array.isArray(payload); + } + } /** * Deallocates a parser's resources */ diff --git a/lib/index.ts b/lib/index.ts index a9c9043..ff5671e 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -223,10 +223,7 @@ export class Decoder extends Emitter { // look up json data if (str.charAt(++i)) { const payload = tryParse(str.substr(i)); - const isPayloadValid = - payload !== false && - (p.type === PacketType.ERROR || Array.isArray(payload)); - if (isPayloadValid) { + if (Decoder.isPayloadValid(p.type, payload)) { p.data = payload; } else { throw new Error("invalid payload"); @@ -237,6 +234,23 @@ export class Decoder extends Emitter { return p; } + private static isPayloadValid(type: PacketType, payload: any): boolean { + switch (type) { + case PacketType.CONNECT: + return typeof payload === "object"; + case PacketType.DISCONNECT: + return payload === undefined; + case PacketType.ERROR: + return typeof payload === "string"; + case PacketType.EVENT: + case PacketType.BINARY_EVENT: + return Array.isArray(payload) && typeof payload[0] === "string"; + case PacketType.ACK: + case PacketType.BINARY_ACK: + return Array.isArray(payload); + } + } + /** * Deallocates a parser's resources */ diff --git a/test/arraybuffer.js b/test/arraybuffer.js index b5df85e..14ef58c 100644 --- a/test/arraybuffer.js +++ b/test/arraybuffer.js @@ -57,7 +57,7 @@ describe("parser", () => { it("cleans itself up on close", () => { const packet = { type: PacketType.BINARY_EVENT, - data: [new ArrayBuffer(2), new ArrayBuffer(3)], + data: ["a", new ArrayBuffer(2), new ArrayBuffer(3)], id: 0, nsp: "/", }; diff --git a/test/blob.js b/test/blob.js index 43ef584..559d7ef 100644 --- a/test/blob.js +++ b/test/blob.js @@ -25,7 +25,7 @@ describe("parser", () => { const packet = { type: PacketType.BINARY_EVENT, - data: [data], + data: ["a", data], id: 0, nsp: "/", }; @@ -44,7 +44,7 @@ describe("parser", () => { const packet = { type: PacketType.BINARY_EVENT, - data: [{ a: "hi", b: { why: data }, c: "bye" }], + data: ["a", { a: "hi", b: { why: data }, c: "bye" }], id: 999, nsp: "/deep", }; diff --git a/test/parser.js b/test/parser.js index f2bd2e9..34d5002 100644 --- a/test/parser.js +++ b/test/parser.js @@ -18,6 +18,9 @@ describe("parser", () => { { type: PacketType.CONNECT, nsp: "/woot", + data: { + token: "123", + }, }, done ); @@ -105,9 +108,17 @@ describe("parser", () => { }); it("throw an error upon parsing error", () => { - expect(() => new Decoder().add('442["some","data"')).to.throwException( - /^invalid payload$/ - ); + const isInvalidPayload = (str) => + expect(() => new Decoder().add(str)).to.throwException( + /^invalid payload$/ + ); + + isInvalidPayload('442["some","data"'); + isInvalidPayload('0/admin,"invalid"'); + isInvalidPayload("1/admin,{}"); + isInvalidPayload('2/admin,"invalid'); + isInvalidPayload("2/admin,{}"); + expect(() => new Decoder().add("999")).to.throwException( /^unknown packet type 9$/ ); From 7fc3c422347b6ec33e3c3b3bf3671b825a41f18f Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 12 Oct 2020 15:20:57 +0200 Subject: [PATCH 101/129] chore(release): 4.0.1-rc1 Diff: https://github.com/socketio/socket.io-parser/compare/4.0.0...4.0.1-rc1 --- .gitignore | 1 + CHANGELOG.md | 9 ++ dist/binary.d.ts | 20 ---- dist/binary.js | 83 ------------- dist/index.d.ts | 72 ------------ dist/index.js | 281 -------------------------------------------- dist/is-binary.d.ts | 6 - dist/is-binary.js | 28 ----- package-lock.json | 2 +- package.json | 5 +- 10 files changed, 14 insertions(+), 493 deletions(-) delete mode 100644 dist/binary.d.ts delete mode 100644 dist/binary.js delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/is-binary.d.ts delete mode 100644 dist/is-binary.js diff --git a/.gitignore b/.gitignore index 3c3629e..44d646d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules +dist/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 166ae9f..35cceb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## [4.0.1-rc1](https://github.com/socketio/socket.io-parser/compare/4.0.0...4.0.1-rc1) (2020-10-12) + + +### Features + +* add support for a payload in a CONNECT packet ([78f9fc2](https://github.com/socketio/socket.io-parser/commit/78f9fc2999b15804b02f2c22a2b4007734a26af9)) + + + ## [3.3.1](https://github.com/socketio/socket.io-parser/compare/3.3.0...3.3.1) (2020-09-30) diff --git a/dist/binary.d.ts b/dist/binary.d.ts deleted file mode 100644 index 835bd62..0000000 --- a/dist/binary.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder. - * - * @param {Object} packet - socket.io event packet - * @return {Object} with deconstructed packet and list of buffers - * @public - */ -export declare function deconstructPacket(packet: any): { - packet: any; - buffers: any[]; -}; -/** - * Reconstructs a binary packet from its placeholder packet and buffers - * - * @param {Object} packet - event packet with placeholders - * @param {Array} buffers - binary buffers to put in placeholder positions - * @return {Object} reconstructed packet - * @public - */ -export declare function reconstructPacket(packet: any, buffers: any): any; diff --git a/dist/binary.js b/dist/binary.js deleted file mode 100644 index cbee976..0000000 --- a/dist/binary.js +++ /dev/null @@ -1,83 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.reconstructPacket = exports.deconstructPacket = void 0; -const is_binary_1 = __importDefault(require("./is-binary")); -/** - * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder. - * - * @param {Object} packet - socket.io event packet - * @return {Object} with deconstructed packet and list of buffers - * @public - */ -function deconstructPacket(packet) { - const buffers = []; - const packetData = packet.data; - const pack = packet; - pack.data = _deconstructPacket(packetData, buffers); - pack.attachments = buffers.length; // number of binary 'attachments' - return { packet: pack, buffers: buffers }; -} -exports.deconstructPacket = deconstructPacket; -function _deconstructPacket(data, buffers) { - if (!data) - return data; - if (is_binary_1.default(data)) { - const placeholder = { _placeholder: true, num: buffers.length }; - buffers.push(data); - return placeholder; - } - else if (Array.isArray(data)) { - const newData = new Array(data.length); - for (let i = 0; i < data.length; i++) { - newData[i] = _deconstructPacket(data[i], buffers); - } - return newData; - } - else if (typeof data === "object" && !(data instanceof Date)) { - const newData = {}; - for (const key in data) { - if (data.hasOwnProperty(key)) { - newData[key] = _deconstructPacket(data[key], buffers); - } - } - return newData; - } - return data; -} -/** - * Reconstructs a binary packet from its placeholder packet and buffers - * - * @param {Object} packet - event packet with placeholders - * @param {Array} buffers - binary buffers to put in placeholder positions - * @return {Object} reconstructed packet - * @public - */ -function reconstructPacket(packet, buffers) { - packet.data = _reconstructPacket(packet.data, buffers); - packet.attachments = undefined; // no longer useful - return packet; -} -exports.reconstructPacket = reconstructPacket; -function _reconstructPacket(data, buffers) { - if (!data) - return data; - if (data && data._placeholder) { - return buffers[data.num]; // appropriate buffer (should be natural order anyway) - } - else if (Array.isArray(data)) { - for (let i = 0; i < data.length; i++) { - data[i] = _reconstructPacket(data[i], buffers); - } - } - else if (typeof data === "object") { - for (const key in data) { - if (data.hasOwnProperty(key)) { - data[key] = _reconstructPacket(data[key], buffers); - } - } - } - return data; -} diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index c2e4753..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,72 +0,0 @@ -import Emitter from "component-emitter"; -/** - * Protocol version. - * - * @public - */ -export declare const protocol: number; -export declare enum PacketType { - CONNECT = 0, - DISCONNECT = 1, - EVENT = 2, - ACK = 3, - ERROR = 4, - BINARY_EVENT = 5, - BINARY_ACK = 6 -} -export interface Packet { - type: PacketType; - nsp: string; - data?: any; - id?: number; - attachments?: number; -} -/** - * A socket.io Encoder instance - */ -export declare class Encoder { - /** - * Encode a packet as a single string if non-binary, or as a - * buffer sequence, depending on packet type. - * - * @param {Object} obj - packet object - */ - encode(obj: Packet): any[]; - /** - * Encode packet as string. - */ - private encodeAsString; - /** - * Encode packet as 'buffer sequence' by removing blobs, and - * deconstructing packet into object with placeholders and - * a list of buffers. - */ - private encodeAsBinary; -} -/** - * A socket.io Decoder instance - * - * @return {Object} decoder - */ -export declare class Decoder extends Emitter { - private reconstructor; - constructor(); - /** - * Decodes an encoded packet string into packet JSON. - * - * @param {String} obj - encoded packet - */ - add(obj: any): void; - /** - * Decode a packet String (JSON data) - * - * @param {String} str - * @return {Object} packet - */ - private decodeString; - private static isPayloadValid; - /** - * Deallocates a parser's resources - */ - destroy(): void; -} diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 69cf092..0000000 --- a/dist/index.js +++ /dev/null @@ -1,281 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Decoder = exports.Encoder = exports.PacketType = exports.protocol = void 0; -const component_emitter_1 = __importDefault(require("component-emitter")); -const binary_1 = require("./binary"); -const is_binary_1 = __importDefault(require("./is-binary")); -const debug = require("debug")("socket.io-parser"); -/** - * Protocol version. - * - * @public - */ -exports.protocol = 4; -var PacketType; -(function (PacketType) { - PacketType[PacketType["CONNECT"] = 0] = "CONNECT"; - PacketType[PacketType["DISCONNECT"] = 1] = "DISCONNECT"; - PacketType[PacketType["EVENT"] = 2] = "EVENT"; - PacketType[PacketType["ACK"] = 3] = "ACK"; - PacketType[PacketType["ERROR"] = 4] = "ERROR"; - PacketType[PacketType["BINARY_EVENT"] = 5] = "BINARY_EVENT"; - PacketType[PacketType["BINARY_ACK"] = 6] = "BINARY_ACK"; -})(PacketType = exports.PacketType || (exports.PacketType = {})); -/** - * A socket.io Encoder instance - */ -class Encoder { - /** - * Encode a packet as a single string if non-binary, or as a - * buffer sequence, depending on packet type. - * - * @param {Object} obj - packet object - */ - encode(obj) { - debug("encoding packet %j", obj); - if (obj.type === PacketType.BINARY_EVENT || - obj.type === PacketType.BINARY_ACK) { - return this.encodeAsBinary(obj); - } - else { - const encoding = this.encodeAsString(obj); - return [encoding]; - } - } - /** - * Encode packet as string. - */ - encodeAsString(obj) { - // first is type - let str = "" + obj.type; - // attachments if we have them - if (obj.type === PacketType.BINARY_EVENT || - obj.type === PacketType.BINARY_ACK) { - str += obj.attachments + "-"; - } - // if we have a namespace other than `/` - // we append it followed by a comma `,` - if (obj.nsp && "/" !== obj.nsp) { - str += obj.nsp + ","; - } - // immediately followed by the id - if (null != obj.id) { - str += obj.id; - } - // json data - if (null != obj.data) { - str += JSON.stringify(obj.data); - } - debug("encoded %j as %s", obj, str); - return str; - } - /** - * Encode packet as 'buffer sequence' by removing blobs, and - * deconstructing packet into object with placeholders and - * a list of buffers. - */ - encodeAsBinary(obj) { - const deconstruction = binary_1.deconstructPacket(obj); - const pack = this.encodeAsString(deconstruction.packet); - const buffers = deconstruction.buffers; - buffers.unshift(pack); // add packet info to beginning of data list - return buffers; // write all the buffers - } -} -exports.Encoder = Encoder; -/** - * A socket.io Decoder instance - * - * @return {Object} decoder - */ -class Decoder extends component_emitter_1.default { - constructor() { - super(); - } - /** - * Decodes an encoded packet string into packet JSON. - * - * @param {String} obj - encoded packet - */ - add(obj) { - let packet; - if (typeof obj === "string") { - packet = this.decodeString(obj); - if (packet.type === PacketType.BINARY_EVENT || - packet.type === PacketType.BINARY_ACK) { - // binary packet's json - this.reconstructor = new BinaryReconstructor(packet); - // no attachments, labeled binary but no binary data to follow - if (packet.attachments === 0) { - super.emit("decoded", packet); - } - } - else { - // non-binary full packet - super.emit("decoded", packet); - } - } - else if (is_binary_1.default(obj) || obj.base64) { - // raw binary data - if (!this.reconstructor) { - throw new Error("got binary data when not reconstructing a packet"); - } - else { - packet = this.reconstructor.takeBinaryData(obj); - if (packet) { - // received final buffer - this.reconstructor = null; - super.emit("decoded", packet); - } - } - } - else { - throw new Error("Unknown type: " + obj); - } - } - /** - * Decode a packet String (JSON data) - * - * @param {String} str - * @return {Object} packet - */ - decodeString(str) { - let i = 0; - // look up type - const p = { - type: Number(str.charAt(0)), - }; - if (PacketType[p.type] === undefined) { - throw new Error("unknown packet type " + p.type); - } - // look up attachments if type binary - if (p.type === PacketType.BINARY_EVENT || - p.type === PacketType.BINARY_ACK) { - const start = i + 1; - while (str.charAt(++i) !== "-" && i != str.length) { } - const buf = str.substring(start, i); - if (buf != Number(buf) || str.charAt(i) !== "-") { - throw new Error("Illegal attachments"); - } - p.attachments = Number(buf); - } - // look up namespace (if any) - if ("/" === str.charAt(i + 1)) { - const start = i + 1; - while (++i) { - const c = str.charAt(i); - if ("," === c) - break; - if (i === str.length) - break; - } - p.nsp = str.substring(start, i); - } - else { - p.nsp = "/"; - } - // look up id - const next = str.charAt(i + 1); - if ("" !== next && Number(next) == next) { - const start = i + 1; - while (++i) { - const c = str.charAt(i); - if (null == c || Number(c) != c) { - --i; - break; - } - if (i === str.length) - break; - } - p.id = Number(str.substring(start, i + 1)); - } - // look up json data - if (str.charAt(++i)) { - const payload = tryParse(str.substr(i)); - if (Decoder.isPayloadValid(p.type, payload)) { - p.data = payload; - } - else { - throw new Error("invalid payload"); - } - } - debug("decoded %s as %j", str, p); - return p; - } - static isPayloadValid(type, payload) { - switch (type) { - case PacketType.CONNECT: - return typeof payload === "object"; - case PacketType.DISCONNECT: - return payload === undefined; - case PacketType.ERROR: - return typeof payload === "string"; - case PacketType.EVENT: - case PacketType.BINARY_EVENT: - return Array.isArray(payload) && typeof payload[0] === "string"; - case PacketType.ACK: - case PacketType.BINARY_ACK: - return Array.isArray(payload); - } - } - /** - * Deallocates a parser's resources - */ - destroy() { - if (this.reconstructor) { - this.reconstructor.finishedReconstruction(); - } - } -} -exports.Decoder = Decoder; -function tryParse(str) { - try { - return JSON.parse(str); - } - catch (e) { - return false; - } -} -/** - * A manager of a binary event's 'buffer sequence'. Should - * be constructed whenever a packet of type BINARY_EVENT is - * decoded. - * - * @param {Object} packet - * @return {BinaryReconstructor} initialized reconstructor - */ -class BinaryReconstructor { - constructor(packet) { - this.packet = packet; - this.buffers = []; - this.reconPack = packet; - } - /** - * Method to be called when binary data received from connection - * after a BINARY_EVENT packet. - * - * @param {Buffer | ArrayBuffer} binData - the raw binary data received - * @return {null | Object} returns null if more binary data is expected or - * a reconstructed packet object if all buffers have been received. - */ - takeBinaryData(binData) { - this.buffers.push(binData); - if (this.buffers.length === this.reconPack.attachments) { - // done with buffer list - const packet = binary_1.reconstructPacket(this.reconPack, this.buffers); - this.finishedReconstruction(); - return packet; - } - return null; - } - /** - * Cleans up binary packet reconstruction variables. - */ - finishedReconstruction() { - this.reconPack = null; - this.buffers = []; - } -} diff --git a/dist/is-binary.d.ts b/dist/is-binary.d.ts deleted file mode 100644 index 9b284a8..0000000 --- a/dist/is-binary.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File. - * - * @private - */ -export default function isBinary(obj: any): boolean; diff --git a/dist/is-binary.js b/dist/is-binary.js deleted file mode 100644 index 41c3f42..0000000 --- a/dist/is-binary.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const withNativeBuffer = typeof Buffer === "function" && typeof Buffer.isBuffer === "function"; -const withNativeArrayBuffer = typeof ArrayBuffer === "function"; -const isView = (obj) => { - return typeof ArrayBuffer.isView === "function" - ? ArrayBuffer.isView(obj) - : obj.buffer instanceof ArrayBuffer; -}; -const toString = Object.prototype.toString; -const withNativeBlob = typeof Blob === "function" || - (typeof Blob !== "undefined" && - toString.call(Blob) === "[object BlobConstructor]"); -const withNativeFile = typeof File === "function" || - (typeof File !== "undefined" && - toString.call(File) === "[object FileConstructor]"); -/** - * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File. - * - * @private - */ -function isBinary(obj) { - return ((withNativeBuffer && Buffer.isBuffer(obj)) || - (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) || - (withNativeBlob && obj instanceof Blob) || - (withNativeFile && obj instanceof File)); -} -exports.default = isBinary; diff --git a/package-lock.json b/package-lock.json index 30ff443..34439a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.0", + "version": "4.0.1-rc1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index aa68554..33babcf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.0", + "version": "4.0.1-rc1", "description": "socket.io protocol parser", "repository": { "type": "git", @@ -36,7 +36,8 @@ "test:node": "mocha --reporter dot --bail test/index.js", "test:browser": "zuul test/index.js --no-coverage", "format:fix": "prettier --write --parser typescript 'lib/**/*.ts' 'test/**/*.js'", - "format:check": "prettier --check --parser typescript 'lib/**/*.ts' 'test/**/*.js'" + "format:check": "prettier --check --parser typescript 'lib/**/*.ts' 'test/**/*.js'", + "prepack": "tsc" }, "license": "MIT", "engines": { From 285e7cd0d837adfc911c999e7294788681226ae1 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 15 Oct 2020 01:15:42 +0200 Subject: [PATCH 102/129] feat: move binary detection back to the parser The binary detection was moved from the parser to the client/server in [1], in order to allow the user to skip the binary detection for huge JSON payloads. ```js socket.binary(false).emit(...); ``` The binary detection is needed in the default parser, because the payload is encoded with JSON.stringify(), which does not support binary content (ArrayBuffer, Blob, ...). But other parsers (like [2] or [3]) do not need this check, so we'll move the binary detection back here and remove the socket.binary() method, as this use case is now covered by the ability to provide your own parser. Note: the hasBinary method was copied from [4]. [1]: https://github.com/socketio/socket.io-parser/commit/f44256c523ac8f0219ffd20d8fd73a0e2b445f28 [2]: https://github.com/darrachequesne/socket.io-msgpack-parser [3]: https://github.com/darrachequesne/socket.io-json-parser [4]: https://github.com/darrachequesne/has-binary --- lib/binary.ts | 2 +- lib/index.ts | 21 +++++++++++---------- lib/is-binary.ts | 40 ++++++++++++++++++++++++++++++++++++---- test/arraybuffer.js | 10 +++++----- test/blob.js | 6 +++--- test/buffer.js | 4 ++-- tsconfig.json | 3 +-- 7 files changed, 59 insertions(+), 27 deletions(-) diff --git a/lib/binary.ts b/lib/binary.ts index 80a6b96..89956c2 100644 --- a/lib/binary.ts +++ b/lib/binary.ts @@ -1,4 +1,4 @@ -import isBinary from "./is-binary"; +import { isBinary } from "./is-binary"; /** * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder. diff --git a/lib/index.ts b/lib/index.ts index ff5671e..cc6e69d 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,6 +1,6 @@ -import Emitter from "component-emitter"; +import Emitter = require("component-emitter"); import { deconstructPacket, reconstructPacket } from "./binary"; -import isBinary from "./is-binary"; +import { isBinary, hasBinary } from "./is-binary"; const debug = require("debug")("socket.io-parser"); @@ -44,15 +44,16 @@ export class Encoder { public encode(obj: Packet) { debug("encoding packet %j", obj); - if ( - obj.type === PacketType.BINARY_EVENT || - obj.type === PacketType.BINARY_ACK - ) { - return this.encodeAsBinary(obj); - } else { - const encoding = this.encodeAsString(obj); - return [encoding]; + if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) { + if (hasBinary(obj)) { + obj.type = + obj.type === PacketType.EVENT + ? PacketType.BINARY_EVENT + : PacketType.BINARY_ACK; + return this.encodeAsBinary(obj); + } } + return [this.encodeAsString(obj)]; } /** diff --git a/lib/is-binary.ts b/lib/is-binary.ts index ed8fdbf..0ec6417 100644 --- a/lib/is-binary.ts +++ b/lib/is-binary.ts @@ -1,5 +1,3 @@ -const withNativeBuffer: boolean = - typeof Buffer === "function" && typeof Buffer.isBuffer === "function"; const withNativeArrayBuffer: boolean = typeof ArrayBuffer === "function"; const isView = (obj: any) => { @@ -24,11 +22,45 @@ const withNativeFile = * @private */ -export default function isBinary(obj: any) { +export function isBinary(obj: any) { return ( - (withNativeBuffer && Buffer.isBuffer(obj)) || (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) || (withNativeBlob && obj instanceof Blob) || (withNativeFile && obj instanceof File) ); } + +export function hasBinary(obj: any, toJSON?: boolean) { + if (!obj || typeof obj !== "object") { + return false; + } + + if (Array.isArray(obj)) { + for (let i = 0, l = obj.length; i < l; i++) { + if (hasBinary(obj[i])) { + return true; + } + } + return false; + } + + if (isBinary(obj)) { + return true; + } + + if ( + obj.toJSON && + typeof obj.toJSON === "function" && + arguments.length === 1 + ) { + return hasBinary(obj.toJSON(), true); + } + + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) { + return true; + } + } + + return false; +} diff --git a/test/arraybuffer.js b/test/arraybuffer.js index 14ef58c..6d44057 100644 --- a/test/arraybuffer.js +++ b/test/arraybuffer.js @@ -6,7 +6,7 @@ const encoder = new Encoder(); describe("parser", () => { it("encodes an ArrayBuffer", (done) => { const packet = { - type: PacketType.BINARY_EVENT, + type: PacketType.EVENT, data: ["a", new ArrayBuffer(2)], id: 0, nsp: "/", @@ -19,7 +19,7 @@ describe("parser", () => { for (let i = 0; i < array.length; i++) array[i] = i; const packet = { - type: PacketType.BINARY_EVENT, + type: PacketType.EVENT, data: ["a", array], id: 0, nsp: "/", @@ -29,7 +29,7 @@ describe("parser", () => { it("encodes ArrayBuffers deep in JSON", (done) => { const packet = { - type: PacketType.BINARY_EVENT, + type: PacketType.EVENT, data: [ "a", { @@ -46,7 +46,7 @@ describe("parser", () => { it("encodes deep binary JSON with null values", (done) => { const packet = { - type: PacketType.BINARY_EVENT, + type: PacketType.EVENT, data: ["a", { a: "b", c: 4, e: { g: null }, h: new ArrayBuffer(9) }], nsp: "/", id: 600, @@ -56,7 +56,7 @@ describe("parser", () => { it("cleans itself up on close", () => { const packet = { - type: PacketType.BINARY_EVENT, + type: PacketType.EVENT, data: ["a", new ArrayBuffer(2), new ArrayBuffer(3)], id: 0, nsp: "/", diff --git a/test/blob.js b/test/blob.js index 559d7ef..cf0717a 100644 --- a/test/blob.js +++ b/test/blob.js @@ -24,7 +24,7 @@ describe("parser", () => { } const packet = { - type: PacketType.BINARY_EVENT, + type: PacketType.EVENT, data: ["a", data], id: 0, nsp: "/", @@ -43,7 +43,7 @@ describe("parser", () => { } const packet = { - type: PacketType.BINARY_EVENT, + type: PacketType.EVENT, data: ["a", { a: "hi", b: { why: data }, c: "bye" }], id: 999, nsp: "/deep", @@ -62,7 +62,7 @@ describe("parser", () => { } const packet = { - type: PacketType.BINARY_ACK, + type: PacketType.ACK, data: [{ a: "hi ack", b: { why: data }, c: "bye ack" }], id: 999, nsp: "/deep", diff --git a/test/buffer.js b/test/buffer.js index d5ebc23..af8e1ba 100644 --- a/test/buffer.js +++ b/test/buffer.js @@ -5,7 +5,7 @@ describe("parser", () => { it("encodes a Buffer", (done) => { helpers.test_bin( { - type: PacketType.BINARY_EVENT, + type: PacketType.EVENT, data: ["a", Buffer.from("abc", "utf8")], id: 23, nsp: "/cool", @@ -17,7 +17,7 @@ describe("parser", () => { it("encodes a binary ack with Buffer", (done) => { helpers.test_bin( { - type: PacketType.BINARY_ACK, + type: PacketType.ACK, data: ["a", Buffer.from("xxx", "utf8"), {}], id: 127, nsp: "/back", diff --git a/tsconfig.json b/tsconfig.json index bcd6128..87d51bf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,8 +4,7 @@ "allowJs": false, "target": "es2017", "module": "commonjs", - "declaration": true, - "esModuleInterop": true + "declaration": true }, "include": [ "./lib/**/*" From 58b3d09f1c5ca44e7c028640e3ed08176cf1a813 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 15 Oct 2020 01:48:27 +0200 Subject: [PATCH 103/129] chore: protocol version 5 There are two differences with the 4th version: - a CONNECT packet can now contain a payload (for authentication purposes) - the underlying Engine.IO protocol has been updated Reference: https://github.com/socketio/engine.io-protocol#difference-between-v3-and-v4 --- lib/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/index.ts b/lib/index.ts index cc6e69d..0ab3396 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -10,7 +10,7 @@ const debug = require("debug")("socket.io-parser"); * @public */ -export const protocol: number = 4; +export const protocol: number = 5; export enum PacketType { CONNECT, From 64b66482368e38382ea93409b95b4af299c45a5e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 15 Oct 2020 10:24:47 +0200 Subject: [PATCH 104/129] chore(release): 4.0.1-rc2 Diff: https://github.com/socketio/socket.io-parser/compare/4.0.1-rc1...4.0.1-rc2 --- CHANGELOG.md | 9 ++++ package-lock.json | 105 ++++------------------------------------------ package.json | 2 +- 3 files changed, 17 insertions(+), 99 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35cceb9..f1e159e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## [4.0.1-rc2](https://github.com/socketio/socket.io-parser/compare/4.0.1-rc1...4.0.1-rc2) (2020-10-15) + + +### Features + +* move binary detection back to the parser ([285e7cd](https://github.com/socketio/socket.io-parser/commit/285e7cd0d837adfc911c999e7294788681226ae1)) + + + ## [4.0.1-rc1](https://github.com/socketio/socket.io-parser/compare/4.0.0...4.0.1-rc1) (2020-10-12) diff --git a/package-lock.json b/package-lock.json index 34439a6..ae20a20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.1-rc1", + "version": "4.0.1-rc2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1045,12 +1045,6 @@ "zip-stream": "~0.2.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "lodash": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", @@ -1399,12 +1393,6 @@ "readable-stream": "~1.0.26" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -1651,12 +1639,6 @@ "path-is-absolute": "^1.0.0" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "shell-quote": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", @@ -2091,12 +2073,6 @@ "readable-stream": "~1.0.26" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -2333,12 +2309,6 @@ "readable-stream": "~1.0.24" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -2484,12 +2454,6 @@ "touch": "0.0.3" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -3997,6 +3961,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, "isbinaryfile": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-0.1.9.tgz", @@ -4281,12 +4251,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "istanbul": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", @@ -4668,12 +4632,6 @@ "readable-stream": "~1.0.2" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -4757,7 +4715,6 @@ "dependencies": { "form-data": { "version": "0.0.3", - "bundled": true, "dev": true, "requires": { "async": "~0.1.9", @@ -4767,12 +4724,10 @@ "dependencies": { "async": { "version": "0.1.9", - "bundled": true, "dev": true }, "combined-stream": { "version": "0.0.3", - "bundled": true, "dev": true, "requires": { "delayed-stream": "0.0.5" @@ -4780,7 +4735,6 @@ "dependencies": { "delayed-stream": { "version": "0.0.5", - "bundled": true, "dev": true } } @@ -4789,7 +4743,6 @@ }, "mime": { "version": "1.2.7", - "bundled": true, "dev": true } } @@ -5244,12 +5197,6 @@ "stream-counter": "~0.2.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -7048,14 +6995,6 @@ "foreach-shim": "~0.1.1", "isarray": "0.0.1", "source-map-cjs": "~0.1.31" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } } }, "stacktrace-js": { @@ -7119,12 +7058,6 @@ "readable-stream": "~1.1.8" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -7283,12 +7216,6 @@ "readable-stream": "~1.1.11" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "minimist": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.1.tgz", @@ -7332,12 +7259,6 @@ "xtend": "^4.0.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -7946,12 +7867,6 @@ "natives": "^1.1.3" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "lodash": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", @@ -8152,12 +8067,6 @@ "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", "dev": true }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", diff --git a/package.json b/package.json index 33babcf..31dd3cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.1-rc1", + "version": "4.0.1-rc2", "description": "socket.io protocol parser", "repository": { "type": "git", From e3d272f542e185dd9d0b8090ff714d259636e24c Mon Sep 17 00:00:00 2001 From: Aleksey Druzhinin Date: Thu, 22 Oct 2020 02:28:36 +0500 Subject: [PATCH 105/129] docs: fix small typo (#98) --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 2ca7633..1f6d47d 100644 --- a/Readme.md +++ b/Readme.md @@ -48,7 +48,7 @@ var parser = require('socket.io-parser'); var encoder = new parser.Encoder(); var packet = { type: parser.BINARY_EVENT, - data: {i: new Buffer(1234), j: new Blob([new ArrayBuffer(2)])} + data: {i: new Buffer(1234), j: new Blob([new ArrayBuffer(2)])}, id: 15 }; encoder.encode(packet, function(encodedPackets) { From db1d27432d2e939be24aecba422960e21e7438f4 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 25 Oct 2020 22:57:26 +0100 Subject: [PATCH 106/129] refactor: rename ERROR to CONNECT_ERROR The meaning is not modified: this packet type is still used by the server when the connection to a namespace is refused. But I feel the name makes more sense: ```js socket.on("connect", () => {}); socket.on("connect_error", () => {}); // instead of socket.on("error", () => {}); ``` --- lib/index.ts | 6 +++--- test/parser.js | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 0ab3396..587dd54 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -17,7 +17,7 @@ export enum PacketType { DISCONNECT, EVENT, ACK, - ERROR, + CONNECT_ERROR, BINARY_EVENT, BINARY_ACK, } @@ -241,8 +241,8 @@ export class Decoder extends Emitter { return typeof payload === "object"; case PacketType.DISCONNECT: return payload === undefined; - case PacketType.ERROR: - return typeof payload === "string"; + case PacketType.CONNECT_ERROR: + return typeof payload === "string" || typeof payload === "object"; case PacketType.EVENT: case PacketType.BINARY_EVENT: return Array.isArray(payload) && typeof payload[0] === "string"; diff --git a/test/parser.js b/test/parser.js index 34d5002..0554d93 100644 --- a/test/parser.js +++ b/test/parser.js @@ -8,7 +8,7 @@ describe("parser", () => { expect(PacketType.DISCONNECT).to.be.a("number"); expect(PacketType.EVENT).to.be.a("number"); expect(PacketType.ACK).to.be.a("number"); - expect(PacketType.ERROR).to.be.a("number"); + expect(PacketType.CONNECT_ERROR).to.be.a("number"); expect(PacketType.BINARY_EVENT).to.be.a("number"); expect(PacketType.BINARY_ACK).to.be.a("number"); }); @@ -71,10 +71,10 @@ describe("parser", () => { ); }); - it("encodes an error", (done) => { + it("encodes an connect error", (done) => { helpers.test( { - type: PacketType.ERROR, + type: PacketType.CONNECT_ERROR, data: "Unauthorized", nsp: "/", }, @@ -82,6 +82,19 @@ describe("parser", () => { ); }); + it("encodes an connect error (with object)", (done) => { + helpers.test( + { + type: PacketType.CONNECT_ERROR, + data: { + message: "Unauthorized", + }, + nsp: "/", + }, + done + ); + }); + it("throws an error when encoding circular objects", () => { const a = {}; a.b = a; From 412769fd18bd1a91258d3565701c9274399a3318 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 26 Oct 2020 00:16:09 +0100 Subject: [PATCH 107/129] chore(release): 4.0.1-rc3 Diff: https://github.com/socketio/socket.io-parser/compare/4.0.1-rc2...4.0.1-rc3 --- CHANGELOG.md | 4 ++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1e159e..d5a7008 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [4.0.1-rc3](https://github.com/socketio/socket.io-parser/compare/4.0.1-rc2...4.0.1-rc3) (2020-10-25) + + + ## [4.0.1-rc2](https://github.com/socketio/socket.io-parser/compare/4.0.1-rc1...4.0.1-rc2) (2020-10-15) diff --git a/package-lock.json b/package-lock.json index ae20a20..675bd5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.1-rc2", + "version": "4.0.1-rc3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 31dd3cf..86a679c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.1-rc2", + "version": "4.0.1-rc3", "description": "socket.io protocol parser", "repository": { "type": "git", From e33932365443b8203198ad7cc2af5f856a63600e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 5 Nov 2020 16:07:35 +0100 Subject: [PATCH 108/129] chore(release): 4.0.1 Diff: https://github.com/socketio/socket.io-parser/compare/3.4.1...4.0.1 --- CHANGELOG.md | 18 ++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5a7008..53da4a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +## [4.0.1](https://github.com/socketio/socket.io-parser/compare/3.4.1...4.0.1) (2020-11-05) + +### Features + +* move binary detection back to the parser ([285e7cd](https://github.com/socketio/socket.io-parser/commit/285e7cd0d837adfc911c999e7294788681226ae1)) +* add support for a payload in a CONNECT packet ([78f9fc2](https://github.com/socketio/socket.io-parser/commit/78f9fc2999b15804b02f2c22a2b4007734a26af9)) + +### Bug Fixes + +* do not catch encoding errors ([aeae87c](https://github.com/socketio/socket.io-parser/commit/aeae87c220287197cb78370dbd86b950a7dd29eb)) +* throw upon invalid payload format ([c327acb](https://github.com/socketio/socket.io-parser/commit/c327acbc3c3c2d0b2b439136cbcb56c81db173d6)) + +### BREAKING CHANGES + +* the encode method is now synchronous ([28d4f03](https://github.com/socketio/socket.io-parser/commit/28d4f0309bdd9e306b78d1946d3e1760941d6544)) + + + ## [4.0.1-rc3](https://github.com/socketio/socket.io-parser/compare/4.0.1-rc2...4.0.1-rc3) (2020-10-25) diff --git a/package-lock.json b/package-lock.json index 675bd5c..3ad3b91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.1-rc3", + "version": "4.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 86a679c..d5b73a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.1-rc3", + "version": "4.0.1", "description": "socket.io protocol parser", "repository": { "type": "git", From c04443375f8db9b573585563197b4f6712ebb9a3 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 5 Nov 2020 16:15:25 +0100 Subject: [PATCH 109/129] docs: add compatibility table --- Readme.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 1f6d47d..458a76b 100644 --- a/Readme.md +++ b/Readme.md @@ -4,11 +4,19 @@ [![Build Status](https://secure.travis-ci.org/socketio/socket.io-parser.svg?branch=master)](http://travis-ci.org/socketio/socket.io-parser) [![NPM version](https://badge.fury.io/js/socket.io-parser.svg)](http://badge.fury.io/js/socket.io-parser) -A socket.io encoder and decoder written in JavaScript complying with version `4` +A socket.io encoder and decoder written in JavaScript complying with version `5` of [socket.io-protocol](https://github.com/socketio/socket.io-protocol). Used by [socket.io](https://github.com/automattic/socket.io) and [socket.io-client](https://github.com/automattic/socket.io-client). +Compatibility table: + +| Parser version | Socket.IO server version | Protocol revision | +|----------------| ------------------------ | ----------------- | +| 3.x | 1.x / 2.x | 4 | +| 4.x | 3.x | 5 | + + ## Parser API socket.io-parser is the reference implementation of socket.io-protocol. Read From 4efa005846ae15ecc7fb0a7f27141439113b1179 Mon Sep 17 00:00:00 2001 From: Pascal Sthamer Date: Wed, 25 Nov 2020 10:51:40 +0100 Subject: [PATCH 110/129] fix: move @types/component-emitter to dependencies (#99) Otherwise consumers of socket.io-parser (and socket.io) need to have it listed in their devDependencies. --- package-lock.json | 3 +-- package.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3ad3b91..27d224e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -911,8 +911,7 @@ "@types/component-emitter": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", - "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", - "dev": true + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" }, "@types/debug": { "version": "4.1.5", diff --git a/package.json b/package.json index d5b73a8..b48939d 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,12 @@ "types": "./dist/index.d.ts", "dependencies": { "component-emitter": "~1.3.0", + "@types/component-emitter": "^1.2.10", "debug": "~4.1.0" }, "devDependencies": { "@babel/core": "~7.9.6", "@babel/preset-env": "~7.9.6", - "@types/component-emitter": "^1.2.10", "@types/debug": "^4.1.5", "@types/node": "^14.11.1", "babelify": "~10.0.0", From 66973a340cc44f5cbfc8931dd0df63af27a115f2 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 25 Nov 2020 10:59:02 +0100 Subject: [PATCH 111/129] chore: cleanup dist folder before compilation --- package-lock.json | 78 +++++++++++++++++++++++++++++++++++++++++++---- package.json | 6 ++-- 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 27d224e..88df5a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3003,6 +3003,12 @@ "lru-cache": "2", "sigmund": "~1.0.0" } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true } } }, @@ -3284,6 +3290,12 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", "dev": true + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true } } }, @@ -3314,6 +3326,31 @@ "inherits": "~2.0.0", "mkdirp": ">=0.5 0", "rimraf": "2" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "function-bind": { @@ -4714,19 +4751,25 @@ "dependencies": { "form-data": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.3.tgz", + "integrity": "sha1-buoXtFeQtC13mh1YHRs2AP4MfA0=", "dev": true, "requires": { - "async": "~0.1.9", + "async": "0.1.9", "combined-stream": "0.0.3", - "mime": "~1.2.2" + "mime": "1.2.2" }, "dependencies": { "async": { "version": "0.1.9", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.9.tgz", + "integrity": "sha1-+YTQc5tTgslJzDvqcC0h0NvVIEA=", "dev": true }, "combined-stream": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.3.tgz", + "integrity": "sha1-odYiPEY6AAshyZN8SxXvQboAH3g=", "dev": true, "requires": { "delayed-stream": "0.0.5" @@ -4734,6 +4777,8 @@ "dependencies": { "delayed-stream": { "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", "dev": true } } @@ -4742,6 +4787,8 @@ }, "mime": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.7.tgz", + "integrity": "sha1-x6E/M6cHPZkA8ohDawazoWIAhls=", "dev": true } } @@ -6492,10 +6539,29 @@ "dev": true }, "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } }, "ripemd160": { "version": "2.0.2", diff --git a/package.json b/package.json index b48939d..849a142 100644 --- a/package.json +++ b/package.json @@ -26,18 +26,20 @@ "expect.js": "0.3.1", "mocha": "3.2.0", "prettier": "^2.1.2", + "rimraf": "^3.0.2", "socket.io-browsers": "^1.0.0", "typescript": "^4.0.3", "zuul": "3.11.1", "zuul-ngrok": "4.0.0" }, "scripts": { - "test": "npm run format:check && tsc && if test \"$BROWSERS\" = \"1\" ; then npm run test:browser; else npm run test:node; fi", + "compile": "rimraf ./dist && tsc", + "test": "npm run format:check && npm run compile && if test \"$BROWSERS\" = \"1\" ; then npm run test:browser; else npm run test:node; fi", "test:node": "mocha --reporter dot --bail test/index.js", "test:browser": "zuul test/index.js --no-coverage", "format:fix": "prettier --write --parser typescript 'lib/**/*.ts' 'test/**/*.js'", "format:check": "prettier --check --parser typescript 'lib/**/*.ts' 'test/**/*.js'", - "prepack": "tsc" + "prepack": "npm run compile" }, "license": "MIT", "engines": { From f2098b031d5191f10ec8b66e3c659b702302d577 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 25 Nov 2020 11:00:16 +0100 Subject: [PATCH 112/129] chore(release): 4.0.2 Diff: https://github.com/socketio/socket.io-parser/compare/4.0.1...4.0.2 --- CHANGELOG.md | 8 ++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53da4a4..4033b30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [4.0.2](https://github.com/socketio/socket.io-parser/compare/4.0.1...4.0.2) (2020-11-25) + + +### Bug Fixes + +* move @types/component-emitter to dependencies ([#99](https://github.com/socketio/socket.io-parser/issues/99)) ([4efa005](https://github.com/socketio/socket.io-parser/commit/4efa005846ae15ecc7fb0a7f27141439113b1179)) + + ## [4.0.1](https://github.com/socketio/socket.io-parser/compare/3.4.1...4.0.1) (2020-11-05) ### Features diff --git a/package-lock.json b/package-lock.json index 88df5a3..041af0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.1", + "version": "4.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 849a142..e9109f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.1", + "version": "4.0.2", "description": "socket.io protocol parser", "repository": { "type": "git", From 7c380d38ebdd7fa3984aff34bea3eac94f8c3089 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 5 Jan 2021 11:00:39 +0100 Subject: [PATCH 113/129] chore: bump debug version --- package-lock.json | 14 ++++++++++---- package.json | 4 ++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 041af0c..1af841f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2425,11 +2425,11 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decode-uri-component": { @@ -4782,6 +4782,12 @@ "dev": true } } + }, + "mime": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.2.tgz", + "integrity": "sha1-udY1W/U+jX1WaTEw5FHa/zQBSM8=", + "dev": true } } }, diff --git a/package.json b/package.json index e9109f9..482ae47 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,9 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "component-emitter": "~1.3.0", "@types/component-emitter": "^1.2.10", - "debug": "~4.1.0" + "component-emitter": "~1.3.0", + "debug": "~4.3.1" }, "devDependencies": { "@babel/core": "~7.9.6", From b076dbb72280f38fd1378690d85ef08445277a9f Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 5 Jan 2021 11:03:30 +0100 Subject: [PATCH 114/129] ci: migrate to GitHub Actions Due to the recent changes to the Travis CI platform (see [1]), we will now use GitHub Actions to run the tests. Reference: https://docs.github.com/en/free-pro-team@latest/actions/guides/building-and-testing-nodejs [1]: https://blog.travis-ci.com/2020-11-02-travis-ci-new-billing --- .github/workflows/ci.yml | 45 ++++++++++++++++++++++++++++++++++++++++ .travis.yml | 20 ------------------ Readme.md | 2 +- 3 files changed, 46 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..a3a62a1 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,45 @@ +name: CI + +on: + push: + pull_request: + schedule: + - cron: '0 0 * * 0' + +jobs: + test-node: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [10.x, 12.x, 14.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: npm ci + - run: npm test + env: + CI: true + + test-browser: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js + uses: actions/setup-node@v1 + with: + node-version: '10.x' + - run: npm ci + - run: npm test + env: + CI: true + BROWSERS: 1 + NGROK_AUTH_TOKEN: ${{ secrets.NGROK_AUTH_TOKEN }} + SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }} + SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }} + timeout-minutes: 20 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 7d1d119..0000000 --- a/.travis.yml +++ /dev/null @@ -1,20 +0,0 @@ -language: node_js -sudo: false -node_js: - - '10' - - '12' - - '14' -git: - depth: 1 -matrix: - include: - - node_js: 10 - env: BROWSERS=1 -env: - global: - - secure: >- - Ea4P/R9UlWzDlHSP5ynmLiD/YgLjecIvCviOcRTle9mV3P1j2k94Ay1LVu1Jw4whlNmWLq2Z/p8M63L92ODPMlarPsuME8HlP4zGr41whFhRbFdda4k3zrHfUhZBlnhY1MVWXTtVm/l7DOzpBrNh+wKecxZB3yyyEaA+PSG3qcQ= - - secure: >- - JmPf38qx5Rb6K+WYOMwb5YmESkDmVJ6tgggiJIuyRfHsgQVOO7XBwZuspIKGTSFolUIMaqwQe79Kd+Ehs2ZZ/0lUyF2/6xW3FqFnASUusYJcZdfRjypmBFWs6BRdtEORM8HL0dgBx4O4u/e4ZvtygumbPahjQbMDaqN+MvlpjD0= - - secure: >- - c3pnLhy3VDJqMl16ABA+8vt3I623aNa2wkLceLXb2V1Dc6eiZeulDH2ekwmdVo/r2WwGIKP3Y6B0mq/xP4W0hg4uT+xWh0AmFHclVyM/yp/AqfXrDUv17Vm0vB7OIgp332OiAlK6Dr13YDbWW8iZxmID41O2+2qohLGPn5JMncg= diff --git a/Readme.md b/Readme.md index 458a76b..e4f6a8a 100644 --- a/Readme.md +++ b/Readme.md @@ -1,7 +1,7 @@ # socket.io-parser -[![Build Status](https://secure.travis-ci.org/socketio/socket.io-parser.svg?branch=master)](http://travis-ci.org/socketio/socket.io-parser) +[![Build Status](https://github.com/socketio/socket.io-parser/workflows/CI/badge.svg)](https://github.com/socketio/socket.io-parser/actions) [![NPM version](https://badge.fury.io/js/socket.io-parser.svg)](http://badge.fury.io/js/socket.io-parser) A socket.io encoder and decoder written in JavaScript complying with version `5` From 444520d6cdc78b1abbe3bd684dc3723b5e22d196 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 5 Jan 2021 11:26:13 +0100 Subject: [PATCH 115/129] chore(release): 4.0.3 Diff: https://github.com/socketio/socket.io-parser/compare/4.0.2...4.0.3 --- CHANGELOG.md | 3 +++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4033b30..1dae8dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## [4.0.3](https://github.com/socketio/socket.io-parser/compare/4.0.2...4.0.3) (2021-01-05) + + ## [4.0.2](https://github.com/socketio/socket.io-parser/compare/4.0.1...4.0.2) (2020-11-25) diff --git a/package-lock.json b/package-lock.json index 1af841f..3a2f1ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.2", + "version": "4.0.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 482ae47..646bf45 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.2", + "version": "4.0.3", "description": "socket.io protocol parser", "repository": { "type": "git", From 1c220ddbf45ea4b44bc8dbf6f9ae245f672ba1b9 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 15 Jan 2021 01:38:03 +0100 Subject: [PATCH 116/129] fix: allow integers as event names This commit restores the possibility to use integers as event names, which was possible in Socket.IO v2. --- lib/index.ts | 2 +- test/parser.js | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/index.ts b/lib/index.ts index 587dd54..636df23 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -245,7 +245,7 @@ export class Decoder extends Emitter { return typeof payload === "string" || typeof payload === "object"; case PacketType.EVENT: case PacketType.BINARY_EVENT: - return Array.isArray(payload) && typeof payload[0] === "string"; + return Array.isArray(payload) && payload.length > 0; case PacketType.ACK: case PacketType.BINARY_ACK: return Array.isArray(payload); diff --git a/test/parser.js b/test/parser.js index 0554d93..426e77c 100644 --- a/test/parser.js +++ b/test/parser.js @@ -47,6 +47,17 @@ describe("parser", () => { ); }); + it("encodes an event (with an integer as event name)", (done) => { + helpers.test( + { + type: PacketType.EVENT, + data: [1, "a", {}], + nsp: "/", + }, + done + ); + }); + it("encodes an event (with ack)", (done) => { helpers.test( { From af1b23ca85fb64a0d7a050abd0362c5f632ce429 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 15 Jan 2021 01:45:17 +0100 Subject: [PATCH 117/129] chore(release): 4.0.4 Diff: https://github.com/socketio/socket.io-parser/compare/4.0.3...4.0.4 --- CHANGELOG.md | 8 ++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dae8dd..11984ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [4.0.4](https://github.com/socketio/socket.io-parser/compare/4.0.3...4.0.4) (2021-01-15) + + +### Bug Fixes + +* allow integers as event names ([1c220dd](https://github.com/socketio/socket.io-parser/commit/1c220ddbf45ea4b44bc8dbf6f9ae245f672ba1b9)) + + ## [4.0.3](https://github.com/socketio/socket.io-parser/compare/4.0.2...4.0.3) (2021-01-05) diff --git a/package-lock.json b/package-lock.json index 3a2f1ce..fa41f9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.3", + "version": "4.0.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 646bf45..f15f403 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.3", + "version": "4.0.4", "description": "socket.io protocol parser", "repository": { "type": "git", From 57324f3048346f23c5823cae142ac732fe792cce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jul 2021 10:47:33 +0200 Subject: [PATCH 118/129] chore: bump elliptic from 6.5.3 to 6.5.4 (#102) Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.3 to 6.5.4. - [Release notes](https://github.com/indutny/elliptic/releases) - [Commits](https://github.com/indutny/elliptic/compare/v6.5.3...v6.5.4) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index fa41f9d..93626b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2668,24 +2668,24 @@ "dev": true }, "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } From 75530b4dcdced9138d51a0b7b782c8f89cdf3899 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jul 2021 10:47:42 +0200 Subject: [PATCH 119/129] chore: bump browserslist from 4.12.0 to 4.16.6 (#106) Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.12.0 to 4.16.6. - [Release notes](https://github.com/browserslist/browserslist/releases) - [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) - [Commits](https://github.com/browserslist/browserslist/compare/4.12.0...4.16.6) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 123 +++++++++++++++------------------------------- 1 file changed, 40 insertions(+), 83 deletions(-) diff --git a/package-lock.json b/package-lock.json index 93626b0..1453adf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1784,15 +1784,36 @@ } }, "browserslist": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", - "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001043", - "electron-to-chromium": "^1.3.413", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001230", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", + "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.739", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", + "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", + "dev": true + }, + "node-releases": { + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", + "dev": true + } } }, "buffer": { @@ -1881,12 +1902,6 @@ "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", "dev": true }, - "caniuse-lite": { - "version": "1.0.30001055", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001055.tgz", - "integrity": "sha512-MbwsBmKrBSKIWldfdIagO5OJWZclpJtS4h0Jrk/4HFrXJxTdVdH23Fd+xCiHriVGvYcWyW8mR/CPsYajlH8Iuw==", - "dev": true - }, "caseless": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz", @@ -2011,6 +2026,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, "colors": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", @@ -2661,12 +2682,6 @@ "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=", "dev": true }, - "electron-to-chromium": { - "version": "1.3.433", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.433.tgz", - "integrity": "sha512-C0gcgwB8RpPAq2Ia6teihNOHOfNzGy4jJXgjIXSmKdt6O2xrJM8CPjA8jTFyo97KozVrZ8oH2FUCixC6Hnuk2g==", - "dev": true - }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -2711,6 +2726,12 @@ "once": "^1.4.0" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3128,15 +3149,6 @@ "integrity": "sha1-v1OdfQ8CmWYx+iGWaA9ndnYrn3A=", "dev": true }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, "findup-sync": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", @@ -4801,16 +4813,6 @@ } } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, "lock": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/lock/-/lock-0.1.4.tgz", @@ -5494,12 +5496,6 @@ "integrity": "sha1-LW5rLs5d6FiLQ9iNG8QbJs0fqE0=", "dev": true }, - "node-releases": { - "version": "1.1.55", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.55.tgz", - "integrity": "sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w==", - "dev": true - }, "node-uuid": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", @@ -5696,30 +5692,6 @@ } } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, "pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -5779,12 +5751,6 @@ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -5834,15 +5800,6 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, "platform": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", From 388c616a9221e4341945f8487e729e93a81d2da5 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 11 Oct 2021 11:07:35 +0200 Subject: [PATCH 120/129] feat: provide an ESM build with and without debug See also: https://github.com/socketio/engine.io-client/commit/00d7e7d7ee85b4cfa6f9f547203cc692083ac61c --- .gitignore | 1 + lib/binary.ts | 2 +- lib/index.ts | 9 +++++---- package-lock.json | 11 ++++++----- package.json | 19 +++++++++++++------ postcompile.sh | 8 ++++++++ support/package.cjs.json | 3 +++ support/package.esm.json | 3 +++ tsconfig.esm.json | 12 ++++++++++++ tsconfig.json | 7 +++---- 10 files changed, 55 insertions(+), 20 deletions(-) create mode 100755 postcompile.sh create mode 100644 support/package.cjs.json create mode 100644 support/package.esm.json create mode 100644 tsconfig.esm.json diff --git a/.gitignore b/.gitignore index 44d646d..d872d6a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules dist/ +build/ diff --git a/lib/binary.ts b/lib/binary.ts index 89956c2..18700e6 100644 --- a/lib/binary.ts +++ b/lib/binary.ts @@ -1,4 +1,4 @@ -import { isBinary } from "./is-binary"; +import { isBinary } from "./is-binary.js"; /** * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder. diff --git a/lib/index.ts b/lib/index.ts index 636df23..d1ba02a 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,8 +1,9 @@ -import Emitter = require("component-emitter"); -import { deconstructPacket, reconstructPacket } from "./binary"; -import { isBinary, hasBinary } from "./is-binary"; +import Emitter from "@socket.io/component-emitter"; +import { deconstructPacket, reconstructPacket } from "./binary.js"; +import { isBinary, hasBinary } from "./is-binary.js"; +import debugModule from "debug"; // debug() -const debug = require("debug")("socket.io-parser"); +const debug = debugModule("socket.io-parser"); // debug() /** * Protocol version. diff --git a/package-lock.json b/package-lock.json index 1453adf..58368f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -908,10 +908,10 @@ "to-fast-properties": "^2.0.0" } }, - "@types/component-emitter": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", - "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" + "@socket.io/component-emitter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-2.0.0.tgz", + "integrity": "sha512-tfCc1aFpZQtnVXQhZDlwefCmT03U75O/NNd65X37U20r6vfERhwRBcZYANnFt0/GEU/Acb3Z1ZVeK+qbV32VJw==" }, "@types/debug": { "version": "4.1.5", @@ -2079,7 +2079,8 @@ "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true }, "compress-commons": { "version": "0.2.9", diff --git a/package.json b/package.json index f15f403..223d4e0 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,20 @@ "url": "https://github.com/socketio/socket.io-parser.git" }, "files": [ - "dist/" + "build/" ], - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "main": "./build/cjs/index.js", + "module": "./build/esm/index.js", + "types": "./build/esm/index.d.ts", + "exports": { + "import": { + "node": "./build/esm-debug/index.js", + "default": "./build/esm/index.js" + }, + "require": "./build/cjs/index.js" + }, "dependencies": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", + "@socket.io/component-emitter": "~2.0.0", "debug": "~4.3.1" }, "devDependencies": { @@ -33,7 +40,7 @@ "zuul-ngrok": "4.0.0" }, "scripts": { - "compile": "rimraf ./dist && tsc", + "compile": "rimraf ./build && tsc && tsc -p tsconfig.esm.json && ./postcompile.sh", "test": "npm run format:check && npm run compile && if test \"$BROWSERS\" = \"1\" ; then npm run test:browser; else npm run test:node; fi", "test:node": "mocha --reporter dot --bail test/index.js", "test:browser": "zuul test/index.js --no-coverage", diff --git a/postcompile.sh b/postcompile.sh new file mode 100755 index 0000000..5c3aa39 --- /dev/null +++ b/postcompile.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +cp ./support/package.cjs.json ./build/cjs/package.json +cp ./support/package.esm.json ./build/esm/package.json + +cp -r ./build/esm/ ./build/esm-debug/ + +sed -i '/debug(/d' ./build/esm/*.js diff --git a/support/package.cjs.json b/support/package.cjs.json new file mode 100644 index 0000000..5bbefff --- /dev/null +++ b/support/package.cjs.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/support/package.esm.json b/support/package.esm.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/support/package.esm.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/tsconfig.esm.json b/tsconfig.esm.json new file mode 100644 index 0000000..2805bb3 --- /dev/null +++ b/tsconfig.esm.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "outDir": "build/esm/", + "target": "es2018", + "module": "esnext", + "moduleResolution": "node", + "declaration": true + }, + "include": [ + "./lib/**/*" + ] +} diff --git a/tsconfig.json b/tsconfig.json index 87d51bf..f033355 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,9 @@ { "compilerOptions": { - "outDir": "./dist", - "allowJs": false, - "target": "es2017", + "outDir": "build/cjs/", + "target": "es2018", // Node.js 10 (https://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping) "module": "commonjs", - "declaration": true + "declaration": false }, "include": [ "./lib/**/*" From 5ad3e5cc4b16326e3def2b834bd90c0424bfdd83 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 11 Oct 2021 22:37:46 +0200 Subject: [PATCH 121/129] chore(release): 4.1.0 Diff: https://github.com/socketio/socket.io-parser/compare/4.0.4...4.1.0 --- CHANGELOG.md | 8 ++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11984ac..0e537b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# [4.1.0](https://github.com/socketio/socket.io-parser/compare/4.0.4...4.1.0) (2021-10-11) + + +### Features + +* provide an ESM build with and without debug ([388c616](https://github.com/socketio/socket.io-parser/commit/388c616a9221e4341945f8487e729e93a81d2da5)) + + ## [4.0.4](https://github.com/socketio/socket.io-parser/compare/4.0.3...4.0.4) (2021-01-15) diff --git a/package-lock.json b/package-lock.json index 58368f1..e310ed9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.4", + "version": "4.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 223d4e0..420166f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.0.4", + "version": "4.1.0", "description": "socket.io protocol parser", "repository": { "type": "git", From eb708d1936dbfc180da7b81dfb8606dc7865de35 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 14 Oct 2021 13:11:55 +0200 Subject: [PATCH 122/129] chore: bump @socket.io/component-emitter to version 3.0.0 The typed events have been moved from [1] to [2], in order to remove the intermediary class and reduce the bundle size. Diff: https://github.com/socketio/emitter/compare/2.0.0...3.0.0 [1]: https://github.com/socketio/socket.io-client/ [2]: https://github.com/socketio/emitter/ --- lib/index.ts | 14 +++++++++----- package-lock.json | 6 +++--- package.json | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index d1ba02a..133df63 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,4 +1,4 @@ -import Emitter from "@socket.io/component-emitter"; +import { Emitter } from "@socket.io/component-emitter"; import { deconstructPacket, reconstructPacket } from "./binary.js"; import { isBinary, hasBinary } from "./is-binary.js"; import debugModule from "debug"; // debug() @@ -109,12 +109,16 @@ export class Encoder { } } +interface DecoderReservedEvents { + decoded: (packet: Packet) => void; +} + /** * A socket.io Decoder instance * * @return {Object} decoder */ -export class Decoder extends Emitter { +export class Decoder extends Emitter<{}, {}, DecoderReservedEvents> { private reconstructor: BinaryReconstructor; constructor() { @@ -140,11 +144,11 @@ export class Decoder extends Emitter { // no attachments, labeled binary but no binary data to follow if (packet.attachments === 0) { - super.emit("decoded", packet); + super.emitReserved("decoded", packet); } } else { // non-binary full packet - super.emit("decoded", packet); + super.emitReserved("decoded", packet); } } else if (isBinary(obj) || obj.base64) { // raw binary data @@ -155,7 +159,7 @@ export class Decoder extends Emitter { if (packet) { // received final buffer this.reconstructor = null; - super.emit("decoded", packet); + super.emitReserved("decoded", packet); } } } else { diff --git a/package-lock.json b/package-lock.json index e310ed9..f1df6fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -909,9 +909,9 @@ } }, "@socket.io/component-emitter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-2.0.0.tgz", - "integrity": "sha512-tfCc1aFpZQtnVXQhZDlwefCmT03U75O/NNd65X37U20r6vfERhwRBcZYANnFt0/GEU/Acb3Z1ZVeK+qbV32VJw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", + "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==" }, "@types/debug": { "version": "4.1.5", diff --git a/package.json b/package.json index 420166f..bc69a8c 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "require": "./build/cjs/index.js" }, "dependencies": { - "@socket.io/component-emitter": "~2.0.0", + "@socket.io/component-emitter": "~3.0.0", "debug": "~4.3.1" }, "devDependencies": { From ea86f413ed73d4dd470186a8a67c7a28e39039dc Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 14 Oct 2021 13:52:49 +0200 Subject: [PATCH 123/129] chore(release): 4.1.1 DIff: https://github.com/socketio/socket.io-parser/compare/4.1.0...4.1.1 --- CHANGELOG.md | 3 +++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e537b1..553e701 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## [4.1.1](https://github.com/socketio/socket.io-parser/compare/4.1.0...4.1.1) (2021-10-14) + + # [4.1.0](https://github.com/socketio/socket.io-parser/compare/4.0.4...4.1.0) (2021-10-11) diff --git a/package-lock.json b/package-lock.json index f1df6fc..36cc343 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.1.0", + "version": "4.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index bc69a8c..4642926 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.1.0", + "version": "4.1.1", "description": "socket.io protocol parser", "repository": { "type": "git", From 8e8346b706bdb8d12646de91bb9bca45dfb0984a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Feb 2022 21:57:15 +0100 Subject: [PATCH 124/129] chore: bump ajv from 6.12.2 to 6.12.6 (#115) Bumps [ajv](https://github.com/ajv-validator/ajv) from 6.12.2 to 6.12.6. - [Release notes](https://github.com/ajv-validator/ajv/releases) - [Commits](https://github.com/ajv-validator/ajv/compare/v6.12.2...v6.12.6) --- updated-dependencies: - dependency-name: ajv dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 36cc343..1c62975 100644 --- a/package-lock.json +++ b/package-lock.json @@ -995,9 +995,9 @@ "dev": true }, "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", From 7f6b262ac83bdf43c53a7eb02417e56e0cf491c8 Mon Sep 17 00:00:00 2001 From: Gabba90 <55579499+Gabba90@users.noreply.github.com> Date: Thu, 17 Feb 2022 07:18:11 +0100 Subject: [PATCH 125/129] fix: allow objects with a null prototype in binary packets (#114) --- lib/binary.ts | 4 ++-- test/arraybuffer.js | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/binary.ts b/lib/binary.ts index 18700e6..65d9789 100644 --- a/lib/binary.ts +++ b/lib/binary.ts @@ -33,7 +33,7 @@ function _deconstructPacket(data, buffers) { } else if (typeof data === "object" && !(data instanceof Date)) { const newData = {}; for (const key in data) { - if (data.hasOwnProperty(key)) { + if (Object.prototype.hasOwnProperty.call(data, key)) { newData[key] = _deconstructPacket(data[key], buffers); } } @@ -68,7 +68,7 @@ function _reconstructPacket(data, buffers) { } } else if (typeof data === "object") { for (const key in data) { - if (data.hasOwnProperty(key)) { + if (Object.prototype.hasOwnProperty.call(data, key)) { data[key] = _reconstructPacket(data[key], buffers); } } diff --git a/test/arraybuffer.js b/test/arraybuffer.js index 6d44057..f81a2d0 100644 --- a/test/arraybuffer.js +++ b/test/arraybuffer.js @@ -14,6 +14,21 @@ describe("parser", () => { helpers.test_bin(packet, done); }); + it("encodes an ArrayBuffer into an object with a null prototype", (done) => { + const packet = { + type: PacketType.EVENT, + data: [ + "a", + Object.create(null, { + array: { value: new ArrayBuffer(2), enumerable: true }, + }), + ], + id: 0, + nsp: "/", + }; + helpers.test_bin(packet, done); + }); + it("encodes a TypedArray", (done) => { const array = new Uint8Array(5); for (let i = 0; i < array.length; i++) array[i] = i; From 0a3b556de39c0cb45dfe80c1917e5fc7ad09ea38 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Feb 2022 07:18:40 +0100 Subject: [PATCH 126/129] chore: bump path-parse from 1.0.6 to 1.0.7 (#108) Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1c62975..bf28dd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5759,9 +5759,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-platform": { From 89209fa22adbe92767c912f445398f12de0f2ac2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Feb 2022 07:19:50 +0100 Subject: [PATCH 127/129] chore: bump cached-path-relative from 1.0.2 to 1.1.0 (#113) Bumps [cached-path-relative](https://github.com/ashaffer/cached-path-relative) from 1.0.2 to 1.1.0. - [Release notes](https://github.com/ashaffer/cached-path-relative/releases) - [Commits](https://github.com/ashaffer/cached-path-relative/commits) --- updated-dependencies: - dependency-name: cached-path-relative dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index bf28dd2..128f89c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1897,9 +1897,9 @@ } }, "cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", "dev": true }, "caseless": { From aed252c74260f5cbfbd3f61307905a2277fab7ce Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 17 Feb 2022 07:37:18 +0100 Subject: [PATCH 128/129] chore(release): 4.1.2 Diff: https://github.com/socketio/socket.io-parser/compare/4.1.1...4.1.2 --- CHANGELOG.md | 9 +++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 553e701..a7e41a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## [4.1.2](https://github.com/socketio/socket.io-parser/compare/4.1.1...4.1.2) (2022-02-17) + + +### Bug Fixes + +* allow objects with a null prototype in binary packets ([#114](https://github.com/socketio/socket.io-parser/issues/114)) ([7f6b262](https://github.com/socketio/socket.io-parser/commit/7f6b262ac83bdf43c53a7eb02417e56e0cf491c8)) + + + ## [4.1.1](https://github.com/socketio/socket.io-parser/compare/4.1.0...4.1.1) (2021-10-14) diff --git a/package-lock.json b/package-lock.json index 128f89c..6ec91fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.1.1", + "version": "4.1.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4642926..2eb5ff8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "socket.io-parser", - "version": "4.1.1", + "version": "4.1.2", "description": "socket.io protocol parser", "repository": { "type": "git", From b08bc1a93e8e3194b776c8a0bdedee1e29333680 Mon Sep 17 00:00:00 2001 From: David Pfeffer Date: Sun, 17 Apr 2022 18:19:02 -0400 Subject: [PATCH 129/129] feat: allow the usage of custom replacer and reviver (#112) Co-authored-by: Mocanu Cristian --- lib/index.ts | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 133df63..453425f 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -36,6 +36,12 @@ export interface Packet { */ export class Encoder { + /** + * Encoder constructor + * + * @param {function} replacer - custom replacer to pass down to JSON.parse + */ + constructor(private replacer?: (this: any, key: string, value: any) => any) {} /** * Encode a packet as a single string if non-binary, or as a * buffer sequence, depending on packet type. @@ -86,7 +92,7 @@ export class Encoder { // json data if (null != obj.data) { - str += JSON.stringify(obj.data); + str += JSON.stringify(obj.data, this.replacer); } debug("encoded %j as %s", obj, str); @@ -121,7 +127,12 @@ interface DecoderReservedEvents { export class Decoder extends Emitter<{}, {}, DecoderReservedEvents> { private reconstructor: BinaryReconstructor; - constructor() { + /** + * Decoder constructor + * + * @param {function} reviver - custom reviver to pass down to JSON.stringify + */ + constructor(private reviver?: (this: any, key: string, value: any) => any) { super(); } @@ -228,7 +239,7 @@ export class Decoder extends Emitter<{}, {}, DecoderReservedEvents> { // look up json data if (str.charAt(++i)) { - const payload = tryParse(str.substr(i)); + const payload = this.tryParse(str.substr(i)); if (Decoder.isPayloadValid(p.type, payload)) { p.data = payload; } else { @@ -240,6 +251,14 @@ export class Decoder extends Emitter<{}, {}, DecoderReservedEvents> { return p; } + private tryParse(str) { + try { + return JSON.parse(str, this.reviver); + } catch (e) { + return false; + } + } + private static isPayloadValid(type: PacketType, payload: any): boolean { switch (type) { case PacketType.CONNECT: @@ -267,14 +286,6 @@ export class Decoder extends Emitter<{}, {}, DecoderReservedEvents> { } } -function tryParse(str) { - try { - return JSON.parse(str); - } catch (e) { - return false; - } -} - /** * A manager of a binary event's 'buffer sequence'. Should * be constructed whenever a packet of type BINARY_EVENT is