From b5fd7ac4308bec917d041bec3b75bab8b56dfa25 Mon Sep 17 00:00:00 2001 From: Leonardo Venturini Date: Sat, 9 Nov 2024 22:13:13 -0400 Subject: [PATCH] adjust compression parameters and use permessage-deflate2 with threshold (only messages larger than 1kb (512 chars) are compressed by default) --- package-lock.json | 17 +++++++++++++++++ package.json | 2 ++ packages/ddp-server/package.js | 2 +- packages/ddp-server/stream_server.js | 17 ++++++++++++----- packages/socket-stream-client/node.js | 4 ++-- packages/socket-stream-client/package.js | 2 +- 6 files changed, 35 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index c9d647ebc55..2f50dcb896a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,8 @@ "@babel/preset-react": "^7.18.6", "@types/lodash.isempty": "^4.4.9", "@types/node": "^18.16.18", + "@types/sockjs": "^0.3.36", + "@types/sockjs-client": "^1.5.4", "@typescript-eslint/eslint-plugin": "^5.56.0", "@typescript-eslint/parser": "^5.56.0", "eslint": "^8.36.0", @@ -1127,6 +1129,21 @@ "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/sockjs-client": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/sockjs-client/-/sockjs-client-1.5.4.tgz", + "integrity": "sha512-zk+uFZeWyvJ5ZFkLIwoGA/DfJ+pYzcZ8eH4H/EILCm2OBZyHH6Hkdna1/UWL/CFruh5wj6ES7g75SvUB0VsH5w==", + "dev": true + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", diff --git a/package.json b/package.json index 5b0390a9b6c..a21df794cdd 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,8 @@ "@babel/preset-react": "^7.18.6", "@types/lodash.isempty": "^4.4.9", "@types/node": "^18.16.18", + "@types/sockjs": "^0.3.36", + "@types/sockjs-client": "^1.5.4", "@typescript-eslint/eslint-plugin": "^5.56.0", "@typescript-eslint/parser": "^5.56.0", "eslint": "^8.36.0", diff --git a/packages/ddp-server/package.js b/packages/ddp-server/package.js index a6ceaa8c902..8f72e3b8e2b 100644 --- a/packages/ddp-server/package.js +++ b/packages/ddp-server/package.js @@ -5,7 +5,7 @@ Package.describe({ }); Npm.depends({ - "permessage-deflate": "0.1.7", + "permessage-deflate2": "0.1.8-alpha.1", sockjs: "0.3.24", "lodash.once": "4.1.1", "lodash.isempty": "4.4.0", diff --git a/packages/ddp-server/stream_server.js b/packages/ddp-server/stream_server.js index d57b81456cc..6b3fad8de11 100644 --- a/packages/ddp-server/stream_server.js +++ b/packages/ddp-server/stream_server.js @@ -1,4 +1,5 @@ import once from 'lodash.once'; +import zlib from 'node:zlib'; // By default, we use the permessage-deflate extension with default // configuration. If $SERVER_WEBSOCKET_COMPRESSION is set, then it must be valid @@ -14,12 +15,18 @@ import once from 'lodash.once'; var websocketExtensions = once(function () { var extensions = []; - var websocketCompressionConfig = process.env.SERVER_WEBSOCKET_COMPRESSION - ? JSON.parse(process.env.SERVER_WEBSOCKET_COMPRESSION) : {}; + var websocketCompressionConfig = process.env.SERVER_WEBSOCKET_COMPRESSION ? + JSON.parse(process.env.SERVER_WEBSOCKET_COMPRESSION) : {}; + if (websocketCompressionConfig) { - extensions.push(Npm.require('permessage-deflate').configure( - websocketCompressionConfig - )); + extensions.push(Npm.require('permessage-deflate2').configure({ + threshold: 512, + level: zlib.constants.Z_BEST_SPEED, + memLevel: zlib.constants.Z_MIN_MEMLEVEL, + noContextTakeover: true, + maxWindowBits: zlib.constants.Z_MIN_WINDOWBITS, + ...(websocketCompressionConfig || {}) + })); } return extensions; diff --git a/packages/socket-stream-client/node.js b/packages/socket-stream-client/node.js index 708c8a1711a..26bae21b501 100644 --- a/packages/socket-stream-client/node.js +++ b/packages/socket-stream-client/node.js @@ -1,6 +1,6 @@ import { Meteor } from "meteor/meteor"; -import { toWebsocketUrl } from "./urls.js"; import { StreamClientCommon } from "./common.js"; +import { toWebsocketUrl } from "./urls.js"; // @param endpoint {String} URL to Meteor app // "http://subdomain.meteor.com/" or "/" or @@ -132,7 +132,7 @@ export class ClientStream extends StreamClientCommon { // require the module if we actually create a server-to-server // connection. var FayeWebSocket = Npm.require('faye-websocket'); - var deflate = Npm.require('permessage-deflate'); + var deflate = Npm.require('permessage-deflate2'); var targetUrl = toWebsocketUrl(this.endpoint); var fayeOptions = { diff --git a/packages/socket-stream-client/package.js b/packages/socket-stream-client/package.js index a49c533e6d4..ab4c7781f37 100644 --- a/packages/socket-stream-client/package.js +++ b/packages/socket-stream-client/package.js @@ -7,7 +7,7 @@ Package.describe({ Npm.depends({ "faye-websocket": "0.11.4", - "permessage-deflate": "0.1.7", + "permessage-deflate2": "0.1.8-alpha.1", "lodash.isequal": "4.5.0", "lodash.once": "4.1.1" });