diff --git a/ee/assist/package-lock.json b/ee/assist/package-lock.json index a94f1d5bb..d3dcc8c5b 100644 --- a/ee/assist/package-lock.json +++ b/ee/assist/package-lock.json @@ -13,10 +13,10 @@ "@socket.io/redis-adapter": "^8.1.0", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "redis": "^4.6.4", - "socket.io": "^4.6.0", - "ua-parser-js": "^1.0.33", - "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.19.0" + "redis": "^4.6.5", + "socket.io": "^4.6.1", + "ua-parser-js": "^1.0.35", + "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.20.0" } }, "node_modules/@maxmind/geoip2-node": { @@ -117,9 +117,9 @@ } }, "node_modules/@types/node": { - "version": "18.15.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.1.tgz", - "integrity": "sha512-U2TWca8AeHSmbpi314QBESRk7oPjSZjDsR+c+H4ECC1l+kFgpZf8Ydhv3SJpPy51VyZHHqxlb6mTTqYNNRVAIw==" + "version": "18.15.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" }, "node_modules/accepts": { "version": "1.3.8", @@ -688,12 +688,12 @@ } }, "node_modules/maxmind": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.8.tgz", - "integrity": "sha512-HrfxEu5yPBPtTy/OT+W5bPQwEfLUX0EHqe2EbJiB47xQMumHqXvSP7PAwzV8Z++NRCmQwy4moQrTSt0+dH+Jmg==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.10.tgz", + "integrity": "sha512-H83pPwi4OqpjPmvAVtuimVWFe6JwHdFK+UIzq4KdvQrKUMLieIrsvU/A9N8jbmOqC2JJPA+jtlFwodyqmzl/3w==", "dependencies": { "mmdb-lib": "2.0.2", - "tiny-lru": "9.0.3" + "tiny-lru": "10.4.1" }, "engines": { "node": ">=12", @@ -1046,11 +1046,11 @@ } }, "node_modules/tiny-lru": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-9.0.3.tgz", - "integrity": "sha512-/i9GruRjXsnDgehxvy6iZ4AFNVxngEFbwzirhdulomMNPGPVV3ECMZOWSw0w4sRMZ9Al9m4jy08GPvRxRUGYlw==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.4.1.tgz", + "integrity": "sha512-buLIzw7ppqymuO3pt10jHk/6QMeZLbidihMQU+N6sogF6EnBzG0qtDWIHuhw1x3dyNgVL/KTGIZsTK81+yCzLg==", "engines": { - "node": ">=6" + "node": ">=12" } }, "node_modules/toidentifier": { @@ -1085,9 +1085,9 @@ } }, "node_modules/ua-parser-js": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.34.tgz", - "integrity": "sha512-K9mwJm/DaB6mRLZfw6q8IMXipcrmuT6yfhYmwhAkuh+81sChuYstYA+znlgaflUPaYUa3odxKPKGw6Vw/lANew==", + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", "funding": [ { "type": "opencollective", @@ -1127,8 +1127,8 @@ } }, "node_modules/uWebSockets.js": { - "version": "20.19.0", - "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#42c9c0d5d31f46ca4115dc75672b0037ec970f28" + "version": "20.20.0", + "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#70291680f6052af5306191b6ed88bceb58e49aa2" }, "node_modules/vary": { "version": "1.1.2", diff --git a/ee/assist/package.json b/ee/assist/package.json index 4ef88774a..f632c47e8 100644 --- a/ee/assist/package.json +++ b/ee/assist/package.json @@ -22,9 +22,9 @@ "@socket.io/redis-adapter": "^8.1.0", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "redis": "^4.6.4", - "socket.io": "^4.6.0", - "ua-parser-js": "^1.0.33", - "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.19.0" + "redis": "^4.6.5", + "socket.io": "^4.6.1", + "ua-parser-js": "^1.0.35", + "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.20.0" } } diff --git a/ee/assist/servers/websocket-cluster.js b/ee/assist/servers/websocket-cluster.js index a1f389685..78db35b20 100644 --- a/ee/assist/servers/websocket-cluster.js +++ b/ee/assist/servers/websocket-cluster.js @@ -19,7 +19,8 @@ const { const { extractProjectKeyFromRequest, extractSessionIdFromRequest, - extractPayloadFromRequest + extractPayloadFromRequest, + getCompressionConfig } = require('../utils/helper-ee'); const {createAdapter} = require("@socket.io/redis-adapter"); const {createClient} = require("redis"); @@ -39,7 +40,8 @@ const createSocketIOServer = function (server, prefix) { origin: "*", methods: ["GET", "POST", "PUT"] }, - path: (prefix ? prefix : '') + '/socket' + path: (prefix ? prefix : '') + '/socket', + perMessageDeflate: getCompressionConfig() }); } else { io = new _io.Server({ @@ -48,9 +50,8 @@ const createSocketIOServer = function (server, prefix) { origin: "*", methods: ["GET", "POST", "PUT"] }, - path: (prefix ? prefix : '') + '/socket' - // transports: ['websocket'], - // upgrade: false + path: (prefix ? prefix : '') + '/socket', + perMessageDeflate: getCompressionConfig() }); io.attachApp(server); } diff --git a/ee/assist/servers/websocket.js b/ee/assist/servers/websocket.js index 330361df3..e55dcb278 100644 --- a/ee/assist/servers/websocket.js +++ b/ee/assist/servers/websocket.js @@ -20,6 +20,7 @@ const { extractProjectKeyFromRequest, extractSessionIdFromRequest, extractPayloadFromRequest, + getCompressionConfig } = require('../utils/helper-ee'); const wsRouter = express.Router(); @@ -34,7 +35,8 @@ const createSocketIOServer = function (server, prefix) { origin: "*", methods: ["GET", "POST", "PUT"] }, - path: (prefix ? prefix : '') + '/socket' + path: (prefix ? prefix : '') + '/socket', + perMessageDeflate: getCompressionConfig() }); } else { io = new _io.Server({ @@ -43,9 +45,8 @@ const createSocketIOServer = function (server, prefix) { origin: "*", methods: ["GET", "POST", "PUT"] }, - path: (prefix ? prefix : '') + '/socket' - // transports: ['websocket'], - // upgrade: false + path: (prefix ? prefix : '') + '/socket', + perMessageDeflate: getCompressionConfig() }); io.attachApp(server); } diff --git a/ee/assist/utils/helper-ee.js b/ee/assist/utils/helper-ee.js index e189135f0..84ce5fdc7 100644 --- a/ee/assist/utils/helper-ee.js +++ b/ee/assist/utils/helper-ee.js @@ -95,8 +95,44 @@ const extractPayloadFromRequest = async function (req, res) { debug && console.log("payload/filters:" + JSON.stringify(filters)) return Object.keys(filters).length > 0 ? filters : undefined; } +const getCompressionConfig = function () { + let perMessageDeflate = false; + if (process.env.COMPRESSION_LEVEL && process.env.COMPRESSION_LEVEL > 0) { + if (process.env.COMPRESSION_LEVEL > 3) { + console.log(`WS compression level: ${process.env.COMPRESSION_LEVEL} not found, ignoring`); + } else { + let windowBits; + switch (parseInt(process.env.COMPRESSION_LEVEL)) { + case 1: + windowBits = 8; + break; + case 2: + windowBits = 10; + break; + case 3: + windowBits = 11; + break; + } + console.log(`WS compression level: ${process.env.COMPRESSION_LEVEL} => windowBits: ${windowBits}`); + perMessageDeflate = { + zlibDeflateOptions: { + windowBits: windowBits, + memLevel: 1 + }, + + zlibInflateOptions: { + windowBits: windowBits + } + } + } + } else { + console.log(`WS compression level: disabled`); + } + return perMessageDeflate; +} module.exports = { extractProjectKeyFromRequest, extractSessionIdFromRequest, - extractPayloadFromRequest + extractPayloadFromRequest, + getCompressionConfig }; \ No newline at end of file