From b743b956884a974b7f8112d063db76bec1cb4f18 Mon Sep 17 00:00:00 2001 From: Andrei Kovrov Date: Thu, 31 Jul 2025 00:37:41 +0200 Subject: [PATCH 1/4] fix: memory leak by upgrading readable-stream up to 4.7.0 --- package-lock.json | 121 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 162c91f5a..c9a63ee38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2261,6 +2261,18 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/abstract-winston-transport": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/abstract-winston-transport/-/abstract-winston-transport-0.5.1.tgz", @@ -2492,6 +2504,26 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2561,6 +2593,30 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -3468,6 +3524,24 @@ "node": ">=0.10.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3841,6 +3915,26 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", @@ -5314,6 +5408,15 @@ "node": ">= 0.8.0" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -6342,13 +6445,29 @@ "license": "MIT", "dependencies": { "logform": "^2.7.0", - "readable-stream": "^3.6.2", + "readable-stream": "^4.7.0", "triple-beam": "^1.3.0" }, "engines": { "node": ">= 12.0.0" } }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/workerpool": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", From aa2d2ff1fb6bc4bde74247db388b05edbd8f357d Mon Sep 17 00:00:00 2001 From: Andrei Kovrov Date: Thu, 31 Jul 2025 03:04:56 +0200 Subject: [PATCH 2/4] fix: make the test behavior more determined --- lib/winston/transports/console.js | 2 +- test/unit/winston/transports/error.test.js | 73 +++++++++++++++------- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/lib/winston/transports/console.js b/lib/winston/transports/console.js index 25ab78469..dbb10c19a 100644 --- a/lib/winston/transports/console.js +++ b/lib/winston/transports/console.js @@ -50,7 +50,7 @@ module.exports = class Console extends TransportStream { * @returns {undefined} */ log(info, callback) { - setImmediate(() => this.emit('logged', info)); + this.emit('logged', info); // Remark: what if there is no raw...? if (this.stderrLevels[info[LEVEL]]) { diff --git a/test/unit/winston/transports/error.test.js b/test/unit/winston/transports/error.test.js index 05468a3bf..df96b6a94 100644 --- a/test/unit/winston/transports/error.test.js +++ b/test/unit/winston/transports/error.test.js @@ -60,59 +60,84 @@ describe('transports issue 1364', () => { }); describe('log twice', () => { - beforeEach(() => { + + it('should check transport after error occurs', (done) => { + errorMessage = mainError; + counter = 0; + maxCounter = 1; + logError = null; + transport = newTransport(); + logger = winston.createLogger({ + level: 'info', + transports: [transport] + }); + logger.on('error', error => { + assume(counter).equals(1); // count calls to `log` + assume(error).is.a('error'); + assume(error).property('message', mainError); + done(); // should be called only once + }); logger.info('log twice 1'); logger.info('log twice 2'); // this raises the `mainError` for the transport - }); - - it('logger transport has single correct transport', () => { const transports = logger.transports; assume(transports).is.an('array'); assume(transports).length(1); assume(transports).contains(transport); }); - - it('error occurred', () => { - assume(logError).property('message', mainError); - }); }); describe('log thrice', () => { - beforeEach(() => { + + it('logger transport has single correct transport', (done) => { + errorMessage = mainError; + counter = 0; + maxCounter = 1; + logError = null; + transport = newTransport(); + logger = winston.createLogger({ + level: 'info', + transports: [transport] + }); + logger.on('error', error => { + assume(error).is.a('error'); + assume(error).property('message', mainError); + done(); + }); logger.info('log thrice 1'); logger.info('log thrice 2'); // this raises the `mainError` for the transport logger.info('log thrice 3'); - }); - - it('logger transport has single correct transport', () => { const transports = logger.transports; assume(transports).is.an('array'); assume(transports).length(1); assume(transports).contains(transport); }); - - it('error occurred', () => { - assume(logError).property('message', mainError); - }); }); describe('log four times', () => { - beforeEach(() => { + + it('logger transport has single correct transport', (done) => { + errorMessage = mainError; + counter = 0; + maxCounter = 1; + logError = null; + transport = newTransport(); + logger = winston.createLogger({ + level: 'info', + transports: [transport] + }); + logger.on('error', error => { + assume(error).is.a('error'); + assume(error).property('message', counter === 1 ? mainError : otherError); + done(); + }); logger.info('log four times 1'); logger.info('log four times 2'); // this raises the `mainError` for the transport logger.info('log four times 3'); logger.info('log four times 4'); // this raises the `otherError` for the transport - }); - - it('logger transport has single correct transport', () => { const transports = logger.transports; assume(transports).is.an('array'); assume(transports).length(1); assume(transports).contains(transport); }); - - it('other error occurred', () => { - assume(logError).property('message', otherError); - }); }); }); From bfffc06464544b61d2b243a6230dc2029b0c7c8b Mon Sep 17 00:00:00 2001 From: Andrei Kovrov Date: Mon, 18 Aug 2025 03:01:25 +0200 Subject: [PATCH 3/4] fix: use proper @types/node version for running tsc --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 896a355db..1c281a6be 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,5 +44,5 @@ jobs: uses: coverallsapp/github-action@master with: github-token: ${{ secrets.GITHUB_TOKEN }} - - name: TypeScript Test - run: npx --package typescript tsc --project test + - name: Install proper types and run TypeScript Test + run: npm -D @types/node@${{ matrix.node }} && npx --package typescript tsc --project test From 8117f97124294dda677ec1fb7250e02a230f88a6 Mon Sep 17 00:00:00 2001 From: Andrei Kovrov Date: Mon, 18 Aug 2025 22:50:53 +0200 Subject: [PATCH 4/4] fix: missing install command --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1c281a6be..25b2aecaf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,4 +45,4 @@ jobs: with: github-token: ${{ secrets.GITHUB_TOKEN }} - name: Install proper types and run TypeScript Test - run: npm -D @types/node@${{ matrix.node }} && npx --package typescript tsc --project test + run: npm install -D @types/node@${{ matrix.node }} && npx --package typescript tsc --project test