From 8f68d4e6624839873f0e055918a662c5466035ce Mon Sep 17 00:00:00 2001 From: Zach Bloomquist Date: Wed, 5 May 2021 16:09:46 -0400 Subject: [PATCH] fix(socket): update serialization for circular binary socket messages (#16311) --- package.json | 2 +- .../cypress/integration/cypress/utils_spec.js | 9 + packages/driver/src/cypress/utils.js | 6 +- packages/extension/app/client.ts | 2 +- packages/socket/package.json | 4 +- .../patches/socket.io-parser+4.0.2.patch | 122 ------------- .../patches/socket.io-parser+4.0.4.patch | 162 ++++++++++++++++++ packages/socket/test/socket_spec.js | 43 ++++- yarn.lock | 81 ++++----- 9 files changed, 262 insertions(+), 169 deletions(-) delete mode 100644 packages/socket/patches/socket.io-parser+4.0.2.patch create mode 100644 packages/socket/patches/socket.io-parser+4.0.4.patch diff --git a/package.json b/package.json index bb36243b60dd..1cc3fa8002a3 100644 --- a/package.json +++ b/package.json @@ -254,7 +254,7 @@ "**/@types/react": "16.9.50", "**/jquery": "3.1.1", "**/pretty-format": "26.4.0", - "**/socket.io-parser": "4.0.2", + "**/socket.io-parser": "4.0.4", "vue-template-compiler": "2.6.12" } } diff --git a/packages/driver/cypress/integration/cypress/utils_spec.js b/packages/driver/cypress/integration/cypress/utils_spec.js index d2e5bb59180c..3a8ae605b7f2 100644 --- a/packages/driver/cypress/integration/cypress/utils_spec.js +++ b/packages/driver/cypress/integration/cypress/utils_spec.js @@ -64,6 +64,15 @@ describe('driver/src/cypress/utils', () => { it('symbol', function () { expect(this.str(Symbol.iterator)).to.eq('Symbol') }) + + it('circular', function () { + const obj = {} + + obj.obj = obj + + // at this point, there is no special formatting for a circular object, we simply fall back to String() on recursion failure + expect(this.str(obj)).to.be.a.string + }) }) context('Arrays', () => { diff --git a/packages/driver/src/cypress/utils.js b/packages/driver/src/cypress/utils.js index 52b2f95e5172..51fecc3d5a71 100644 --- a/packages/driver/src/cypress/utils.js +++ b/packages/driver/src/cypress/utils.js @@ -194,7 +194,11 @@ module.exports = { return `Object{${len}}` } - return this.stringifyActualObj(value) + try { + return this.stringifyActualObj(value) + } catch (err) { + return String(value) + } } if (_.isSymbol(value)) { diff --git a/packages/extension/app/client.ts b/packages/extension/app/client.ts index b2d50e471f61..f55c0ab20900 100644 --- a/packages/extension/app/client.ts +++ b/packages/extension/app/client.ts @@ -1,7 +1,7 @@ import { client } from '@packages/socket/lib/browser' export const connect = (host, path, extraOpts = {}) => { - return client.io(host, { + return client(host, { path, transports: ['websocket'], ...extraOpts, diff --git a/packages/socket/package.json b/packages/socket/package.json index e93bedeebfc2..69e1772ba2a2 100644 --- a/packages/socket/package.json +++ b/packages/socket/package.json @@ -15,8 +15,8 @@ }, "dependencies": { "circular-json": "0.5.9", - "socket.io": "3.0.4", - "socket.io-client": "3.0.4" + "socket.io": "4.0.1", + "socket.io-client": "4.0.1" }, "devDependencies": { "chai": "3.5.0", diff --git a/packages/socket/patches/socket.io-parser+4.0.2.patch b/packages/socket/patches/socket.io-parser+4.0.2.patch deleted file mode 100644 index b51599091167..000000000000 --- a/packages/socket/patches/socket.io-parser+4.0.2.patch +++ /dev/null @@ -1,122 +0,0 @@ -diff --git a/node_modules/socket.io-parser/dist/binary.js b/node_modules/socket.io-parser/dist/binary.js -index a908023..708fd3c 100644 ---- a/node_modules/socket.io-parser/dist/binary.js -+++ b/node_modules/socket.io-parser/dist/binary.js -@@ -36,7 +36,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); - } - } -@@ -71,7 +71,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/node_modules/socket.io-parser/dist/index.js b/node_modules/socket.io-parser/dist/index.js -index cb7af17..1290ca2 100644 ---- a/node_modules/socket.io-parser/dist/index.js -+++ b/node_modules/socket.io-parser/dist/index.js -@@ -1,6 +1,7 @@ - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.Decoder = exports.Encoder = exports.PacketType = exports.protocol = void 0; -+const CircularJSON = require('circular-json') - const Emitter = require("component-emitter"); - const binary_1 = require("./binary"); - const is_binary_1 = require("./is-binary"); -@@ -66,7 +67,7 @@ class Encoder { - } - // json data - if (null != obj.data) { -- str += JSON.stringify(obj.data); -+ str += CircularJSON.stringify(obj.data); - } - debug("encoded %j as %s", obj, str); - return str; -@@ -232,7 +233,7 @@ class Decoder extends Emitter { - exports.Decoder = Decoder; - function tryParse(str) { - try { -- return JSON.parse(str); -+ return CircularJSON.parse(str); - } - catch (e) { - return false; -diff --git a/node_modules/socket.io-parser/dist/is-binary.js b/node_modules/socket.io-parser/dist/is-binary.js -index 4b7c234..88f36f2 100644 ---- a/node_modules/socket.io-parser/dist/is-binary.js -+++ b/node_modules/socket.io-parser/dist/is-binary.js -@@ -1,12 +1,13 @@ - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.hasBinary = exports.isBinary = void 0; --const withNativeArrayBuffer = typeof ArrayBuffer === "function"; --const isView = (obj) => { -- return typeof ArrayBuffer.isView === "function" -- ? ArrayBuffer.isView(obj) -- : obj.buffer instanceof ArrayBuffer; -+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); - }; -+ - const toString = Object.prototype.toString; - const withNativeBlob = typeof Blob === "function" || - (typeof Blob !== "undefined" && -@@ -21,17 +22,25 @@ const withNativeFile = typeof File === "function" || - */ - function isBinary(obj) { - return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) || -- (withNativeBlob && obj instanceof Blob) || -- (withNativeFile && obj instanceof File)); -+ (withNativeBlob && obj instanceof Blob) || -+ (withNativeFile && obj instanceof File)) || -+ (withNativeBuffer && Buffer.isBuffer(obj)) - } - exports.isBinary = isBinary; --function hasBinary(obj, toJSON) { -+function hasBinaryCircular(obj) { -+ return hasBinary(obj, []) -+} -+function hasBinary(obj, known) { - if (!obj || typeof obj !== "object") { - return false; - } -+ if (known.indexOf(obj) >= 0) { -+ return false -+ } -+ known.push(obj) - if (Array.isArray(obj)) { - for (let i = 0, l = obj.length; i < l; i++) { -- if (hasBinary(obj[i])) { -+ if (hasBinary(obj[i], known)) { - return true; - } - } -@@ -43,13 +52,13 @@ function hasBinary(obj, toJSON) { - if (obj.toJSON && - typeof obj.toJSON === "function" && - arguments.length === 1) { -- return hasBinary(obj.toJSON(), true); -+ return hasBinary(obj.toJSON(), known); - } - for (const key in obj) { -- if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) { -+ if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key], known)) { - return true; - } - } - return false; - } --exports.hasBinary = hasBinary; -+exports.hasBinary = hasBinaryCircular; diff --git a/packages/socket/patches/socket.io-parser+4.0.4.patch b/packages/socket/patches/socket.io-parser+4.0.4.patch new file mode 100644 index 000000000000..5089fa3f149f --- /dev/null +++ b/packages/socket/patches/socket.io-parser+4.0.4.patch @@ -0,0 +1,162 @@ +diff --git a/node_modules/socket.io-parser/dist/binary.js b/node_modules/socket.io-parser/dist/binary.js +index a908023..99e0215 100644 +--- a/node_modules/socket.io-parser/dist/binary.js ++++ b/node_modules/socket.io-parser/dist/binary.js +@@ -13,12 +13,12 @@ function deconstructPacket(packet) { + const buffers = []; + const packetData = packet.data; + const pack = packet; +- pack.data = _deconstructPacket(packetData, buffers); ++ pack.data = _deconstructPacket(packetData, buffers, [], new WeakMap()); + pack.attachments = buffers.length; // number of binary 'attachments' + return { packet: pack, buffers: buffers }; + } + exports.deconstructPacket = deconstructPacket; +-function _deconstructPacket(data, buffers) { ++function _deconstructPacket(data, buffers, known, retvals) { + if (!data) + return data; + if (is_binary_1.isBinary(data)) { +@@ -26,18 +26,27 @@ function _deconstructPacket(data, buffers) { + buffers.push(data); + return placeholder; + } +- else if (Array.isArray(data)) { ++ else if (retvals.has(data)) { ++ return retvals.get(data) ++ } ++ else if (known.includes(data)) { ++ return data; ++ } ++ known.push(data) ++ if (Array.isArray(data)) { + const newData = new Array(data.length); ++ retvals.set(data, newData) + for (let i = 0; i < data.length; i++) { +- newData[i] = _deconstructPacket(data[i], buffers); ++ newData[i] = _deconstructPacket(data[i], buffers, known, retvals); + } + return newData; + } + else if (typeof data === "object" && !(data instanceof Date)) { + const newData = {}; ++ retvals.set(data, newData) + for (const key in data) { +- if (data.hasOwnProperty(key)) { +- newData[key] = _deconstructPacket(data[key], buffers); ++ if (Object.prototype.hasOwnProperty.call(data, key)) { ++ newData[key] = _deconstructPacket(data[key], buffers, known, retvals); + } + } + return newData; +@@ -53,26 +62,29 @@ function _deconstructPacket(data, buffers) { + * @public + */ + function reconstructPacket(packet, buffers) { +- packet.data = _reconstructPacket(packet.data, buffers); ++ packet.data = _reconstructPacket(packet.data, buffers, []); + packet.attachments = undefined; // no longer useful + return packet; + } + exports.reconstructPacket = reconstructPacket; +-function _reconstructPacket(data, buffers) { ++function _reconstructPacket(data, buffers, known) { + if (!data) + return data; + if (data && data._placeholder) { + return buffers[data.num]; // appropriate buffer (should be natural order anyway) ++ } else if (known.includes(data)) { ++ return data + } +- else if (Array.isArray(data)) { ++ known.push(data) ++ if (Array.isArray(data)) { + for (let i = 0; i < data.length; i++) { +- data[i] = _reconstructPacket(data[i], buffers); ++ data[i] = _reconstructPacket(data[i], buffers, known); + } + } + else if (typeof data === "object") { + for (const key in data) { + if (data.hasOwnProperty(key)) { +- data[key] = _reconstructPacket(data[key], buffers); ++ data[key] = _reconstructPacket(data[key], buffers, known); + } + } + } +diff --git a/node_modules/socket.io-parser/dist/index.js b/node_modules/socket.io-parser/dist/index.js +index 0ef9f80..4cd787e 100644 +--- a/node_modules/socket.io-parser/dist/index.js ++++ b/node_modules/socket.io-parser/dist/index.js +@@ -5,6 +5,7 @@ const Emitter = require("component-emitter"); + const binary_1 = require("./binary"); + const is_binary_1 = require("./is-binary"); + const debug = require("debug")("socket.io-parser"); ++const CircularJSON = require('circular-json') + /** + * Protocol version. + * +@@ -66,7 +67,7 @@ class Encoder { + } + // json data + if (null != obj.data) { +- str += JSON.stringify(obj.data); ++ str += CircularJSON.stringify(obj.data); + } + debug("encoded %j as %s", obj, str); + return str; +@@ -232,7 +233,7 @@ class Decoder extends Emitter { + exports.Decoder = Decoder; + function tryParse(str) { + try { +- return JSON.parse(str); ++ return CircularJSON.parse(str); + } + catch (e) { + return false; +diff --git a/node_modules/socket.io-parser/dist/is-binary.js b/node_modules/socket.io-parser/dist/is-binary.js +index 4b7c234..95469f7 100644 +--- a/node_modules/socket.io-parser/dist/is-binary.js ++++ b/node_modules/socket.io-parser/dist/is-binary.js +@@ -1,6 +1,7 @@ + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.hasBinary = exports.isBinary = void 0; ++const withNativeBuffer = typeof Buffer === 'function' && typeof Buffer.isBuffer === 'function'; + const withNativeArrayBuffer = typeof ArrayBuffer === "function"; + const isView = (obj) => { + return typeof ArrayBuffer.isView === "function" +@@ -22,13 +23,18 @@ const withNativeFile = typeof File === "function" || + function isBinary(obj) { + return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) || + (withNativeBlob && obj instanceof Blob) || +- (withNativeFile && obj instanceof File)); ++ (withNativeFile && obj instanceof File)) || ++ (withNativeBuffer && Buffer.isBuffer(obj)); + } + exports.isBinary = isBinary; +-function hasBinary(obj, toJSON) { ++function hasBinary(obj, known = []) { + if (!obj || typeof obj !== "object") { + return false; + } ++ if (known.includes(obj)) { ++ return false ++ } ++ known.push(obj) + if (Array.isArray(obj)) { + for (let i = 0, l = obj.length; i < l; i++) { + if (hasBinary(obj[i])) { +@@ -43,10 +49,10 @@ function hasBinary(obj, toJSON) { + if (obj.toJSON && + typeof obj.toJSON === "function" && + arguments.length === 1) { +- return hasBinary(obj.toJSON(), true); ++ return hasBinary(obj.toJSON(), known); + } + for (const key in obj) { +- if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) { ++ if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key], known)) { + return true; + } + } diff --git a/packages/socket/test/socket_spec.js b/packages/socket/test/socket_spec.js index 55dd4a804e62..d903d51775d9 100644 --- a/packages/socket/test/socket_spec.js +++ b/packages/socket/test/socket_spec.js @@ -71,7 +71,7 @@ describe('Socket', function () { decoder.on('decoded', (packet) => { obj.data = originalData obj.attachments = undefined - expect(obj).to.eql(packet) + expect(packet).to.eql(obj) done() }) @@ -104,7 +104,44 @@ describe('Socket', function () { decoder.on('decoded', (packet) => { obj.data = originalData - expect(obj).to.eql(packet) + expect(packet.data[1] === packet.data[1].foo.circularObj).to.be.true + expect(packet).to.eql(obj) + done() + }) + + for (let i = 0; i < encodedPackets.length; i++) { + decoder.add(encodedPackets[i]) + } + }) + + it('correctly encodes and decodes circular data containing binary', (done) => { + const encoder = new parser.Encoder() + + const circularObj = { + foo: {}, + bin: Buffer.from('abc', 'utf8'), + } + + circularObj.foo.circularObj = circularObj + + const obj = { + type: PacketType.EVENT, + data: ['a', circularObj], + id: 23, + nsp: '/cool', + } + + const originalData = obj.data + + const encodedPackets = encoder.encode(obj) + + const decoder = new parser.Decoder() + + decoder.on('decoded', (packet) => { + obj.data = originalData + obj.attachments = undefined + expect(packet.data[1] === packet.data[1].foo.circularObj).to.be.true + expect(packet).to.eql(obj) done() }) @@ -136,7 +173,7 @@ describe('Socket', function () { decoder.on('decoded', (packet) => { obj.data = originalData obj.attachments = undefined - expect(obj).to.eql(packet) + expect(packet).to.eql(obj) done() }) diff --git a/yarn.lock b/yarn.lock index d3b0ce21a535..4bb379e83427 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2811,7 +2811,7 @@ "@jest/types@^26.3.0", "@jest/types@^26.6.2": version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + resolved "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" @@ -7197,7 +7197,12 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@14.14.31", "@types/node@>= 8", "@types/node@^14.0.10", "@types/node@^14.14.31", "@types/node@^14.14.7", "@types/node@^14.6.2": +"@types/node@*", "@types/node@>= 8", "@types/node@>=10.0.0": + version "15.0.1" + resolved "https://registry.npmjs.org/@types/node/-/node-15.0.1.tgz#ef34dea0881028d11398be5bf4e856743e3dc35a" + integrity sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA== + +"@types/node@14.14.31", "@types/node@^14.0.10", "@types/node@^14.14.31", "@types/node@^14.6.2": version "14.14.31" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.31.tgz#72286bd33d137aa0d152d47ec7c1762563d34055" integrity sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g== @@ -10961,7 +10966,7 @@ backbone@1.4.0: dependencies: underscore ">=1.8.3" -backo2@1.0.2: +backo2@1.0.2, backo2@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= @@ -16129,10 +16134,10 @@ engine.io-client@~3.5.0: xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" -engine.io-client@~4.0.0: - version "4.0.6" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-4.0.6.tgz#ba6f97033dc2179dea79b982d516d13b50ab4d3b" - integrity sha512-5lPh8rrhxIruo5ZlgFt31KM626o5OCXrCHBweieWWuVicDtnYdz/iR93k6N9k0Xs61WrYxZKIWXzeSaJF6fpNA== +engine.io-client@~5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.0.1.tgz#9470fc6655c9789c5c0aa1a0e7e7d9ae9753a798" + integrity sha512-CQtGN3YwfvbxVwpPugcsHe5rHT4KgT49CEcQppNtu9N7WxbPN0MAG27lGaem7bvtCFtGNLSL+GEqXsFSz36jTg== dependencies: base64-arraybuffer "0.1.4" component-emitter "~1.3.0" @@ -16142,7 +16147,6 @@ engine.io-client@~4.0.0: parseqs "0.0.6" parseuri "0.0.6" ws "~7.4.2" - xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" engine.io-parser@~2.2.0: @@ -16175,10 +16179,10 @@ engine.io@~3.5.0: engine.io-parser "~2.2.0" ws "~7.4.2" -engine.io@~4.0.0: - version "4.0.6" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-4.0.6.tgz#7268635d64e2154ab5e7f9ef967ad1744a4c41a9" - integrity sha512-rf7HAVZpcRrcKEKddgIzYUnwg0g5HE1RvJaTLwkcfJmce4g+po8aMuE6vxzp6JwlK8FEq/vi0KWN6tA585DjaA== +engine.io@~5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/engine.io/-/engine.io-5.0.0.tgz#470dc94a8a4907fa4d2cd1fa6611426afcee61bf" + integrity sha512-BATIdDV3H1SrE9/u2BAotvsmjJg0t1P4+vGedImSs1lkFAtQdvk4Ev1y4LDiPF7BPWgXWEG+NDY+nLvW3UrMWw== dependencies: accepts "~1.3.4" base64id "2.0.0" @@ -33693,10 +33697,10 @@ socket.io-adapter@~1.1.0: resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== -socket.io-adapter@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.0.3.tgz#372b7cde7a535fc4f4f0d5ac7f73952a3062d438" - integrity sha512-2wo4EXgxOGSFueqvHAdnmi5JLZzWqMArjuP4nqC26AtLh5PoCPsaRbRdah2xhcwTAMooZfjYiNVNkkmmSMaxOQ== +socket.io-adapter@~2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.2.0.tgz#43af9157c4609e74b8addc6867873ac7eb48fda2" + integrity sha512-rG49L+FwaVEwuAdeBRq49M97YI3ElVabJPzvHT9S6a2CWhDKnjSFasvwAwSYPRhQzfn4NtDIbCaGYgOCOU/rlg== socket.io-client@2.4.0, socket.io-client@^2.2.0: version "2.4.0" @@ -33715,43 +33719,42 @@ socket.io-client@2.4.0, socket.io-client@^2.2.0: socket.io-parser "~3.3.0" to-array "0.1.4" -socket.io-client@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-3.0.4.tgz#c0203419a9f71e1360ef92a31301e80260e94bb9" - integrity sha512-qMvBuS+W9JIN2mkfAWDCxuIt+jpIKDf8C0604zEqx1JrPaPSS6cN0F3B2GYWC83TqBeVJXW66GFxWV3KD88n0Q== +socket.io-client@4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.0.1.tgz#8f3bf4ce9282dda1741a4ed0f726b412944e012b" + integrity sha512-6AkaEG5zrVuSVW294cH1chioag9i1OqnCYjKwTc3EBGXbnyb98Lw7yMa40ifLjFj3y6fsFKsd0llbUZUCRf3Qw== dependencies: "@types/component-emitter" "^1.2.10" - backo2 "1.0.2" - component-bind "1.0.0" + backo2 "~1.0.2" component-emitter "~1.3.0" - debug "~4.1.0" - engine.io-client "~4.0.0" + debug "~4.3.1" + engine.io-client "~5.0.0" parseuri "0.0.6" - socket.io-parser "~4.0.1" + socket.io-parser "~4.0.4" -socket.io-parser@4.0.2, socket.io-parser@~3.3.0, socket.io-parser@~3.4.0, socket.io-parser@~4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.2.tgz#3d021a9c86671bb079e7c6c806db6a1d9b1bc780" - integrity sha512-Bs3IYHDivwf+bAAuW/8xwJgIiBNtlvnjYRc4PbXgniLmcP1BrakBoq/QhO24rgtgW7VZ7uAaswRGxutUnlAK7g== +socket.io-parser@4.0.4, socket.io-parser@~3.3.0, socket.io-parser@~3.4.0, socket.io-parser@~4.0.3, socket.io-parser@~4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" + integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== dependencies: "@types/component-emitter" "^1.2.10" component-emitter "~1.3.0" - debug "~4.1.0" + debug "~4.3.1" -socket.io@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-3.0.4.tgz#20130a80b57e48dadb671f22e3776047cc7f9d53" - integrity sha512-Vj1jUoO75WGc9txWd311ZJJqS9Dr8QtNJJ7gk2r7dcM/yGe9sit7qOijQl3GAwhpBOz/W8CwkD7R6yob07nLbA== +socket.io@4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/socket.io/-/socket.io-4.0.1.tgz#d2e01cf3780d810b66182b3fbef08a04a4ccf924" + integrity sha512-g8eZB9lV0f4X4gndG0k7YZAywOg1VxYgCUspS4V+sDqsgI/duqd0AW84pKkbGj/wQwxrqrEq+VZrspRfTbHTAQ== dependencies: "@types/cookie" "^0.4.0" "@types/cors" "^2.8.8" - "@types/node" "^14.14.7" + "@types/node" ">=10.0.0" accepts "~1.3.4" base64id "~2.0.0" - debug "~4.1.0" - engine.io "~4.0.0" - socket.io-adapter "~2.0.3" - socket.io-parser "~4.0.1" + debug "~4.3.1" + engine.io "~5.0.0" + socket.io-adapter "~2.2.0" + socket.io-parser "~4.0.3" socket.io@^2.2.0: version "2.4.1"