From 49813000c331715ec2489f08b1c6972fac5489c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Feb 2026 20:23:02 +0000 Subject: [PATCH 1/2] Bump redis in /files_wcf/acp/be.bastelstu.wcf.nodePush Bumps [redis](https://github.com/redis/node-redis) from 3.1.2 to 5.11.0. - [Release notes](https://github.com/redis/node-redis/releases) - [Changelog](https://github.com/redis/node-redis/blob/master/CHANGELOG.md) - [Commits](https://github.com/redis/node-redis/compare/v3.1.2...redis@5.11.0) --- updated-dependencies: - dependency-name: redis dependency-version: 5.11.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .../package-lock.json | 208 +++++++++++------- .../be.bastelstu.wcf.nodePush/package.json | 2 +- 2 files changed, 134 insertions(+), 76 deletions(-) diff --git a/files_wcf/acp/be.bastelstu.wcf.nodePush/package-lock.json b/files_wcf/acp/be.bastelstu.wcf.nodePush/package-lock.json index a87dbc8..78a2869 100644 --- a/files_wcf/acp/be.bastelstu.wcf.nodePush/package-lock.json +++ b/files_wcf/acp/be.bastelstu.wcf.nodePush/package-lock.json @@ -14,7 +14,7 @@ "escape-string-regexp": "^5.0.0", "express": "^4.22.1", "rc": "^1.2.8", - "redis": "^3.1.2", + "redis": "^5.11.0", "socket.io": "^4.6.1" }, "engines": { @@ -22,6 +22,74 @@ "npm": ">=1.0" } }, + "node_modules/@redis/bloom": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.11.0.tgz", + "integrity": "sha512-KYiVilAhAFN3057afUb/tfYJpsEyTkQB+tQcn5gVVA7DgcNOAj8lLxe4j8ov8BF6I9C1Fe/kwlbuAICcTMX8Lw==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@redis/client": "^5.11.0" + } + }, + "node_modules/@redis/client": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.11.0.tgz", + "integrity": "sha512-GHoprlNQD51Xq2Ztd94HHV94MdFZQ3CVrpA04Fz8MVoHM0B7SlbmPEVIjwTbcv58z8QyjnrOuikS0rWF03k5dQ==", + "license": "MIT", + "dependencies": { + "cluster-key-slot": "1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@node-rs/xxhash": "^1.1.0" + }, + "peerDependenciesMeta": { + "@node-rs/xxhash": { + "optional": true + } + } + }, + "node_modules/@redis/json": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.11.0.tgz", + "integrity": "sha512-1iAy9kAtcD0quB21RbPTbUqqy+T2Uu2JxucwE+B4A+VaDbIRvpZR6DMqV8Iqaws2YxJYB3GC5JVNzPYio2ErUg==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@redis/client": "^5.11.0" + } + }, + "node_modules/@redis/search": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.11.0.tgz", + "integrity": "sha512-g1l7f3Rnyk/xI99oGHIgWHSKFl45Re5YTIcO8j/JE8olz389yUFyz2+A6nqVy/Zi031VgPDWscbbgOk8hlhZ3g==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@redis/client": "^5.11.0" + } + }, + "node_modules/@redis/time-series": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.11.0.tgz", + "integrity": "sha512-TWFeOcU4xkj0DkndnOyhtxvX1KWD+78UHT3XX3x3XRBUGWeQrKo3jqzDsZwxbggUgf9yLJr/akFHXru66X5UQA==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@redis/client": "^5.11.0" + } + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", @@ -147,6 +215,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -217,14 +294,6 @@ "node": ">=4.0.0" } }, - "node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -834,45 +903,19 @@ } }, "node_modules/redis": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "dependencies": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-redis" - } - }, - "node_modules/redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-5.11.0.tgz", + "integrity": "sha512-YwXjATVDT+AuxcyfOwZn046aml9jMlQPvU1VXIlLDVAExe0u93aTfPYSeRgG4p9Q/Jlkj+LXJ1XEoFV+j2JKcQ==", + "license": "MIT", "dependencies": { - "redis-errors": "^1.0.0" + "@redis/bloom": "5.11.0", + "@redis/client": "5.11.0", + "@redis/json": "5.11.0", + "@redis/search": "5.11.0", + "@redis/time-series": "5.11.0" }, "engines": { - "node": ">=4" + "node": ">= 18" } }, "node_modules/safe-buffer": { @@ -1197,6 +1240,38 @@ } }, "dependencies": { + "@redis/bloom": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.11.0.tgz", + "integrity": "sha512-KYiVilAhAFN3057afUb/tfYJpsEyTkQB+tQcn5gVVA7DgcNOAj8lLxe4j8ov8BF6I9C1Fe/kwlbuAICcTMX8Lw==", + "requires": {} + }, + "@redis/client": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.11.0.tgz", + "integrity": "sha512-GHoprlNQD51Xq2Ztd94HHV94MdFZQ3CVrpA04Fz8MVoHM0B7SlbmPEVIjwTbcv58z8QyjnrOuikS0rWF03k5dQ==", + "requires": { + "cluster-key-slot": "1.1.2" + } + }, + "@redis/json": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.11.0.tgz", + "integrity": "sha512-1iAy9kAtcD0quB21RbPTbUqqy+T2Uu2JxucwE+B4A+VaDbIRvpZR6DMqV8Iqaws2YxJYB3GC5JVNzPYio2ErUg==", + "requires": {} + }, + "@redis/search": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.11.0.tgz", + "integrity": "sha512-g1l7f3Rnyk/xI99oGHIgWHSKFl45Re5YTIcO8j/JE8olz389yUFyz2+A6nqVy/Zi031VgPDWscbbgOk8hlhZ3g==", + "requires": {} + }, + "@redis/time-series": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.11.0.tgz", + "integrity": "sha512-TWFeOcU4xkj0DkndnOyhtxvX1KWD+78UHT3XX3x3XRBUGWeQrKo3jqzDsZwxbggUgf9yLJr/akFHXru66X5UQA==", + "requires": {} + }, "@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", @@ -1296,6 +1371,11 @@ "get-intrinsic": "^1.3.0" } }, + "cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==" + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -1341,11 +1421,6 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, - "denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1756,32 +1831,15 @@ } }, "redis": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "requires": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - } - }, - "redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, - "redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" - }, - "redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-5.11.0.tgz", + "integrity": "sha512-YwXjATVDT+AuxcyfOwZn046aml9jMlQPvU1VXIlLDVAExe0u93aTfPYSeRgG4p9Q/Jlkj+LXJ1XEoFV+j2JKcQ==", "requires": { - "redis-errors": "^1.0.0" + "@redis/bloom": "5.11.0", + "@redis/client": "5.11.0", + "@redis/json": "5.11.0", + "@redis/search": "5.11.0", + "@redis/time-series": "5.11.0" } }, "safe-buffer": { diff --git a/files_wcf/acp/be.bastelstu.wcf.nodePush/package.json b/files_wcf/acp/be.bastelstu.wcf.nodePush/package.json index 06bb25f..a0abc81 100644 --- a/files_wcf/acp/be.bastelstu.wcf.nodePush/package.json +++ b/files_wcf/acp/be.bastelstu.wcf.nodePush/package.json @@ -15,7 +15,7 @@ "escape-string-regexp": "^5.0.0", "express": "^4.22.1", "rc": "^1.2.8", - "redis": "^3.1.2", + "redis": "^5.11.0", "socket.io": "^4.6.1" }, "type": "module", From 397ed95e2f001a9abd33f38153df0e54a7efbf44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Fri, 20 Feb 2026 21:31:54 +0100 Subject: [PATCH 2/2] Adjust server.js for redis 5.x --- .../acp/be.bastelstu.wcf.nodePush/server.js | 211 ++++++++++-------- 1 file changed, 112 insertions(+), 99 deletions(-) diff --git a/files_wcf/acp/be.bastelstu.wcf.nodePush/server.js b/files_wcf/acp/be.bastelstu.wcf.nodePush/server.js index de6cf46..0ffe2a7 100644 --- a/files_wcf/acp/be.bastelstu.wcf.nodePush/server.js +++ b/files_wcf/acp/be.bastelstu.wcf.nodePush/server.js @@ -166,122 +166,137 @@ ${sourceFiles.map((item) => `* /source/${item}`).join('\n')}`) }) } -server.listen(config.outbound.port, config.outbound.host, null, function () { - const rsub = redis.createClient(config.redis) - const r = redis.createClient(config.redis) - - io = new socket_io.Server(server, { - cors: { } - }) +const rsub = redis.createClient({ + url: config.redis, +}) +const r = redis.createClient({ + url: config.redis, +}) - io.on('connection', function (socket) { - const id = ++stats.outbound.total - stats.outbound.current++ - - debug(`Client ${id} connected`) - - let channels - let rekeyTimer = undefined - let rekey = function () { - debug(`Client ${id} (${JSON.stringify(channels)}) receiving new keys`) - crypto.randomBytes(32, function (err, buf) { - if (err) { - socket.disconnect() - return - } - r.set(`${config.uuid}:nodePush:token:${buf.toString('hex')}`, JSON.stringify(channels), 'EX', REKEY_INTERVAL * 3) - socket.emit('rekey', buf.toString('hex')) - }) - } - let connected = function () { - rekey() - rekeyTimer = setInterval(rekey, REKEY_INTERVAL * 1e3) - socket.emit('authenticated') - } - - socket.on('disconnect', function () { - debug(`Client ${id} disconnected`) - - stats.outbound.current-- - clearInterval(rekeyTimer) +Promise.all([ + r.connect(), + rsub.connect(), +]).then(function () { + server.listen(config.outbound.port, config.outbound.host, null, function () { + io = new socket_io.Server(server, { + cors: { } }) - socket.on('connectData', function (connectData) { - debug(`Client ${id} sent connectData ${connectData}`) - - let payload + io.on('connection', function (socket) { + const id = ++stats.outbound.total + stats.outbound.current++ - if (!(payload = checkSignature(connectData, config.signerKey))) { - debug(`Client ${id} sent incorrectly signed connectData, disonnecting`) - socket.disconnect() - return - } - debug(`Client ${id} connectData: ${payload.toString('utf8')}`) - payload = JSON.parse(payload.toString('utf8')) - if (!payload.timestamp || (payload.timestamp * 1000) < (Date.now() - 15e3)) { - debug(`Client ${id} sent outdated connectData, disonnecting`) - socket.disconnect() - return + debug(`Client ${id} connected`) + + let channels + let rekeyTimer = undefined + let rekey = function () { + debug(`Client ${id} (${JSON.stringify(channels)}) receiving new keys`) + crypto.randomBytes(32, function (err, buf) { + if (err) { + socket.disconnect() + return + } + r.set(`${config.uuid}:nodePush:token:${buf.toString('hex')}`, JSON.stringify(channels), { EX: REKEY_INTERVAL * 3 }) + .then(function () { + socket.emit('rekey', buf.toString('hex')) + }) + .catch(function (err) { + socket.disconnect() + }) + }) } - payload.userID = parseInt(payload.userID, 10) - if (!(payload.groups instanceof Array)) { - debug(`Client ${id} sent malformed groups in connectData, disonnecting`) - socket.disconnect() - return - } - if (!(payload.channels instanceof Array)) { - debug(`Client ${id} sent malformed channels in connectData, disonnecting`) - socket.disconnect() - return + let connected = function () { + rekey() + rekeyTimer = setInterval(rekey, REKEY_INTERVAL * 1e3) + socket.emit('authenticated') } - channels = [ 'authenticated' ] - channels.push(`user-${payload.userID}`) - if (payload.userID === 0) { - channels.push('guest') - } - else { - channels.push('registered') - } - payload.groups.forEach(groupID => channels.push(`group-${groupID}`)) - payload.channels.forEach(channel => channels.push(`channel-${channel}`)) - - channels.forEach(channel => socket.join(channel)) - connected() - }) - - socket.on('token', function (token) { - debug(`Client ${id} sent reconnect token ${token}`) - r.get(`${config.uuid}:nodePush:token:${token}`, function (err, reply) { - r.del(`${config.uuid}:nodePush:token:${token}`) - if (err) { - debug(`Client ${id} failed to look up reconnect token, disconnecting`) + socket.on('disconnect', function () { + debug(`Client ${id} disconnected`) + + stats.outbound.current-- + clearInterval(rekeyTimer) + }) + + socket.on('connectData', function (connectData) { + debug(`Client ${id} sent connectData ${connectData}`) + + let payload + + if (!(payload = checkSignature(connectData, config.signerKey))) { + debug(`Client ${id} sent incorrectly signed connectData, disonnecting`) socket.disconnect() return } - if (reply === null) { - debug(`Client ${id} reconnect token does not exist, disconnecting`) + debug(`Client ${id} connectData: ${payload.toString('utf8')}`) + payload = JSON.parse(payload.toString('utf8')) + if (!payload.timestamp || (payload.timestamp * 1000) < (Date.now() - 15e3)) { + debug(`Client ${id} sent outdated connectData, disonnecting`) socket.disconnect() return } - - try { - channels = JSON.parse(reply) - channels.forEach(channel => socket.join(channel)) - - connected() + payload.userID = parseInt(payload.userID, 10) + if (!(payload.groups instanceof Array)) { + debug(`Client ${id} sent malformed groups in connectData, disonnecting`) + socket.disconnect() + return } - catch (e) { + if (!(payload.channels instanceof Array)) { + debug(`Client ${id} sent malformed channels in connectData, disonnecting`) socket.disconnect() return } + + channels = [ 'authenticated' ] + channels.push(`user-${payload.userID}`) + if (payload.userID === 0) { + channels.push('guest') + } + else { + channels.push('registered') + } + payload.groups.forEach(groupID => channels.push(`group-${groupID}`)) + payload.channels.forEach(channel => channels.push(`channel-${channel}`)) + + channels.forEach(channel => socket.join(channel)) + connected() + }) + + socket.on('token', function (token) { + debug(`Client ${id} sent reconnect token ${token}`) + r.get(`${config.uuid}:nodePush:token:${token}`) + .then(function (reply) { + return r.del(`${config.uuid}:nodePush:token:${token}`) + .then(() => { + if (reply === null) { + debug(`Client ${id} reconnect token does not exist, disconnecting`) + socket.disconnect() + return + } + + try { + channels = JSON.parse(reply) + channels.forEach(channel => socket.join(channel)) + + connected() + } + catch (e) { + socket.disconnect() + return + } + }) + }) + .catch(function (err) { + debug(`Client ${id} failed to look up reconnect token, disconnecting: ${err}`) + socket.disconnect() + }) }) }) - }) - rsub.on('message', function (channel, _message) { - stats.inbound++ - if (channel === `${config.uuid}:nodePush`) { + rsub.subscribe(`${config.uuid}:nodePush`, (_message) => { + stats.inbound++ + debug(`Push: ${_message}`) try { _message = JSON.parse(_message) @@ -298,8 +313,6 @@ server.listen(config.outbound.port, config.outbound.host, null, function () { const payload = _message.payload sendMessage(message, target, payload) - } + }) }) - - rsub.subscribe(`${config.uuid}:nodePush`) })