From 9e705864d2d10e6a25fa641a064f75f70b3167fe Mon Sep 17 00:00:00 2001 From: Jay Date: Mon, 16 Mar 2026 20:38:14 +0200 Subject: [PATCH] chore: migrate get stream to latest (#7516) * build: bump get-stream to v9 * test: migrate helper buffer reads to get-stream v9 API * fix: tests with sessions * chore: update stream handler to better manage sessions * chore: revert some changes * chore: swap to buffer * chore: add port for stream test * chore: swap localhost * chore: change timeout * chore: update to stream type * chore: try again * chore: tests * chore: updat tests/unit/adapters/http.test.js to check ipv4 Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --------- Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- package-lock.json | 37 +++++++++++++++++--- package.json | 4 +-- test/helpers/server.js | 4 +-- test/unit/adapters/http.js | 10 +++--- tests/setup/server.js | 4 +-- tests/unit/adapters/http.test.js | 59 ++++++++++++++++---------------- 6 files changed, 74 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index d4f5f106..cdfdd379 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "formdata-node": "^5.0.1", "formidable": "^2.1.5", "fs-extra": "^10.1.0", - "get-stream": "^3.0.0", + "get-stream": "^9.0.1", "globals": "^17.4.0", "gulp": "^4.0.2", "handlebars": "^4.7.8", @@ -3521,6 +3521,13 @@ "win32" ] }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, "node_modules/@sigstore/bundle": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", @@ -7299,13 +7306,33 @@ } }, "node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-value": { diff --git a/package.json b/package.json index 87a790dc..a3902ccb 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "formdata-node": "^5.0.1", "formidable": "^2.1.5", "fs-extra": "^10.1.0", - "get-stream": "^3.0.0", + "get-stream": "^9.0.1", "globals": "^17.4.0", "gulp": "^4.0.2", "handlebars": "^4.7.8", @@ -184,4 +184,4 @@ "lint-staged": { "*.{js,cjs,mjs,ts,json,md,yml,yaml}": "prettier --write" } -} \ No newline at end of file +} diff --git a/test/helpers/server.js b/test/helpers/server.js index 3ec489fb..f619966e 100644 --- a/test/helpers/server.js +++ b/test/helpers/server.js @@ -1,7 +1,7 @@ import http from 'http'; import http2 from 'http2'; import stream from 'stream'; -import getStream from 'get-stream'; +import getStream, { getStreamAsBuffer } from 'get-stream'; import { Throttle } from 'stream-throttle'; import formidable from 'formidable'; import selfsigned from 'selfsigned'; @@ -196,7 +196,7 @@ export const startTestServer = async (port) => { response.form = fields; response.files = files; } else { - response.body = (await getStream(req, { encoding: 'buffer' })).toString('hex'); + response.body = (await getStreamAsBuffer(req)).toString('hex'); } return { diff --git a/test/unit/adapters/http.js b/test/unit/adapters/http.js index 3de91d59..d3bd20af 100644 --- a/test/unit/adapters/http.js +++ b/test/unit/adapters/http.js @@ -2158,10 +2158,12 @@ describe('supports http with nodejs', function () { app.post('/', function (req, res) { var parserRanBeforeHandler = Boolean(req.body && Object.keys(req.body).length); - res.send(JSON.stringify({ - parserRanBeforeHandler: parserRanBeforeHandler, - body: req.body, - })); + res.send( + JSON.stringify({ + parserRanBeforeHandler: parserRanBeforeHandler, + body: req.body, + }) + ); }); server = app.listen(3001, function () { diff --git a/tests/setup/server.js b/tests/setup/server.js index a07f9cfd..317fbcf9 100644 --- a/tests/setup/server.js +++ b/tests/setup/server.js @@ -1,7 +1,7 @@ import http from 'http'; import http2 from 'http2'; import stream from 'stream'; -import getStream from 'get-stream'; +import getStream, { getStreamAsBuffer } from 'get-stream'; import { Throttle } from 'stream-throttle'; import formidable from 'formidable'; import selfsigned from 'selfsigned'; @@ -211,7 +211,7 @@ export const startTestServer = async (port) => { response.form = fields; response.files = files; } else { - response.body = (await getStream(req, { encoding: 'buffer' })).toString('hex'); + response.body = (await getStreamAsBuffer(req)).toString('hex'); } return { diff --git a/tests/unit/adapters/http.test.js b/tests/unit/adapters/http.test.js index 6cd6a494..c7ff5dcb 100644 --- a/tests/unit/adapters/http.test.js +++ b/tests/unit/adapters/http.test.js @@ -3180,7 +3180,7 @@ describe('supports http with nodejs', () => { }); it('should merge request http2Options with its instance config', async () => { - const http2Axios = createHttp2Axios('https://127.0.0.1:8080'); + const http2Axios = createHttp2Axios('https://localhost:8080'); const { data } = await http2Axios.get('/', { http2Options: { @@ -3211,7 +3211,7 @@ describe('supports http with nodejs', () => { ); try { - const localServerURL = `https://127.0.0.1:${server.address().port}`; + const localServerURL = `https://localhost:${server.address().port}`; const http2Axios = createHttp2Axios(localServerURL); const { data } = await http2Axios.get(localServerURL); assert.deepStrictEqual(data, 'OK'); @@ -3227,7 +3227,7 @@ describe('supports http with nodejs', () => { }); try { - const localServerURL = `https://127.0.0.1:${server.address().port}`; + const localServerURL = `https://localhost:${server.address().port}`; const http2Axios = createHttp2Axios(localServerURL); const payload = 'DATA'; const { data } = await http2Axios.post(localServerURL, payload); @@ -3260,7 +3260,7 @@ describe('supports http with nodejs', () => { ); try { - const localServerURL = `https://127.0.0.1:${server.address().port}`; + const localServerURL = `https://localhost:${server.address().port}`; const http2Axios = createHttp2Axios(localServerURL); const form = new FormData(); form.append('x', 'foo'); @@ -3302,7 +3302,7 @@ describe('supports http with nodejs', () => { ); try { - const localServerURL = `https://127.0.0.1:${server.address().port}`; + const localServerURL = `https://localhost:${server.address().port}`; const http2Axios = createHttp2Axios(localServerURL); const { data } = await http2Axios.get(localServerURL, { responseType, @@ -3333,7 +3333,7 @@ describe('supports http with nodejs', () => { ); try { - const localServerURL = `https://127.0.0.1:${server.address().port}`; + const localServerURL = `https://localhost:${server.address().port}`; const http2Axios = createHttp2Axios(localServerURL); server.on('stream', (http2Stream) => { @@ -3378,7 +3378,7 @@ describe('supports http with nodejs', () => { ); try { - const localServerURL = `https://127.0.0.1:${server.address().port}`; + const localServerURL = `https://localhost:${server.address().port}`; const http2Axios = createHttp2Axios(localServerURL); server.on('stream', (http2Stream) => { @@ -3419,7 +3419,7 @@ describe('supports http with nodejs', () => { ); try { - const localServerURL = `https://127.0.0.1:${server.address().port}`; + const localServerURL = `https://localhost:${server.address().port}`; const http2Axios = createHttp2Axios(localServerURL); server.on('stream', (http2Stream) => { @@ -3470,7 +3470,7 @@ describe('supports http with nodejs', () => { ); try { - const localServerURL = `https://127.0.0.1:${server.address().port}`; + const localServerURL = `https://localhost:${server.address().port}`; const http2Axios = createHttp2Axios(localServerURL); const [response1, response2] = await Promise.all([ @@ -3519,8 +3519,8 @@ describe('supports http with nodejs', () => { ); try { - const localServerURL = `https://127.0.0.1:${server.address().port}`; - const localServerURL2 = `https://127.0.0.1:${server2.address().port}`; + const localServerURL = `https://localhost:${server.address().port}`; + const localServerURL2 = `https://localhost:${server2.address().port}`; const http2Axios = createHttp2Axios(localServerURL); const [response1, response2] = await Promise.all([ @@ -3557,28 +3557,24 @@ describe('supports http with nodejs', () => { ); try { - const localServerURL = `https://127.0.0.1:${server.address().port}`; + const localServerURL = `https://localhost:${server.address().port}`; const http2Axios = createHttp2Axios(localServerURL); const [response1, response2] = await Promise.all([ http2Axios.get(localServerURL, { - responseType: 'stream', - http2Options: {}, + http2Options: { + sessionTimeout: 2000, + }, }), http2Axios.get(localServerURL, { - responseType: 'stream', http2Options: { - foo: 'test', + sessionTimeout: 4000, }, }), ]); - assert.notStrictEqual(response1.data.session, response2.data.session); - - assert.deepStrictEqual( - await Promise.all([getStream(response1.data), getStream(response2.data)]), - ['OK', 'OK'] - ); + assert.notStrictEqual(response1.request.session, response2.request.session); + assert.deepStrictEqual([response1.data, response2.data], ['OK', 'OK']); } finally { await stopHTTPServer(server); } @@ -3596,7 +3592,7 @@ describe('supports http with nodejs', () => { ); try { - const localServerURL = `https://127.0.0.1:${server.address().port}`; + const localServerURL = `https://localhost:${server.address().port}`; const http2Axios = createHttp2Axios(localServerURL); const responses = await Promise.all([ @@ -3638,7 +3634,7 @@ describe('supports http with nodejs', () => { ); try { - const localServerURL = `https://127.0.0.1:${server.address().port}`; + const localServerURL = `https://localhost:${server.address().port}`; const http2Axios = createHttp2Axios(localServerURL); const response1 = await http2Axios.get(localServerURL, { @@ -3648,6 +3644,7 @@ describe('supports http with nodejs', () => { }, }); + const session1 = response1.data.session; const data1 = await getStream(response1.data); await setTimeoutAsync(5000); @@ -3659,9 +3656,10 @@ describe('supports http with nodejs', () => { }, }); + const session2 = response2.data.session; const data2 = await getStream(response2.data); - assert.notStrictEqual(response1.data.session, response2.data.session); + assert.notStrictEqual(session1, session2); assert.strictEqual(data1, 'OK'); assert.strictEqual(data2, 'OK'); } finally { @@ -3672,10 +3670,13 @@ describe('supports http with nodejs', () => { }); it('should not abort stream on settle rejection', async () => { - const server = await startHTTPServer((req, res) => { - res.statusCode = 404; - res.end('OK'); - }); + const server = await startHTTPServer( + (req, res) => { + res.statusCode = 404; + res.end('OK'); + }, + { port: SERVER_PORT } + ); try { let error;