feat(assist): WS message compression support

This commit is contained in:
Taha Yassine Kraiem 2023-04-05 13:42:33 +01:00
parent b10390c509
commit 802be323df
5 changed files with 72 additions and 34 deletions

View file

@ -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",

View file

@ -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"
}
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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
};