From f386befaa7873788585b26c506e27a9123094a61 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 20 Nov 2023 14:03:09 +0100 Subject: [PATCH 1/4] chore: use Readable.from instead to convert the stream Signed-off-by: blam --- packages/backend-common/src/reading/ReadUrlResponseFactory.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend-common/src/reading/ReadUrlResponseFactory.ts b/packages/backend-common/src/reading/ReadUrlResponseFactory.ts index 69b9c6c16a..5eb4b2f5bc 100644 --- a/packages/backend-common/src/reading/ReadUrlResponseFactory.ts +++ b/packages/backend-common/src/reading/ReadUrlResponseFactory.ts @@ -72,7 +72,7 @@ export class ReadUrlResponseFactory { oldStyleStream: NodeJS.ReadableStream, options?: ReadUrlResponseFactoryFromStreamOptions, ): Promise { - const readable = new Readable().wrap(oldStyleStream); + const readable = Readable.from(oldStyleStream); return ReadUrlResponseFactory.fromReadable(readable, options); } } From 1ad8906a9ebde0345e9235ba5ac88ae9184790cc Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 20 Nov 2023 14:06:08 +0100 Subject: [PATCH 2/4] chore: add changeset Signed-off-by: blam --- .changeset/great-rings-type.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/great-rings-type.md diff --git a/.changeset/great-rings-type.md b/.changeset/great-rings-type.md new file mode 100644 index 0000000000..0b10c51651 --- /dev/null +++ b/.changeset/great-rings-type.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Use `Readable.from` to fix some of the stream issues From 50e91dba75c605ad5de10ddb3ef63992a4a4d86f Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 21 Nov 2023 14:24:48 +0100 Subject: [PATCH 3/4] chore: fix tests to actually use a proper readable stream Signed-off-by: blam --- .../reading/ReadUrlResponseFactory.test.ts | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts b/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts index 1eb18f5c1d..95d9099662 100644 --- a/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts +++ b/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts @@ -16,7 +16,7 @@ import { ConflictError } from '@backstage/errors'; import getRawBody from 'raw-body'; -import { Readable, Stream } from 'stream'; +import { Readable } from 'stream'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; describe('ReadUrlResponseFactory', () => { @@ -74,25 +74,10 @@ describe('ReadUrlResponseFactory', () => { describe("fromNodeJSReadable's", () => { const expectedText = 'expected text'; - const timeouts: NodeJS.Timeout[] = []; let readable: NodeJS.ReadableStream; beforeEach(() => { - readable = new Stream({ - encoding: 'utf-8', - }) as unknown as NodeJS.ReadableStream; - readable.readable = true; - - // Write data asynchronously, as soon as possible. - timeouts[0] = setTimeout(() => { - timeouts[1] = setTimeout(readable.emit.bind(readable, 'end'), 0); - readable.emit('data', expectedText); - }, 0); - }); - - afterEach(() => { - // Clear out timeouts so we don't emit data across tests. - timeouts.forEach(clearTimeout); + readable = Readable.from(Buffer.from(expectedText)); }); it('etag is passed through', async () => { From b623c9fc1c16b13cf59329111ff73ec5013cab1b Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 21 Nov 2023 14:43:06 +0100 Subject: [PATCH 4/4] chore: fix gerrit reader Signed-off-by: blam --- packages/backend-common/src/reading/GerritUrlReader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend-common/src/reading/GerritUrlReader.ts b/packages/backend-common/src/reading/GerritUrlReader.ts index f4a5fdb9f5..665770815f 100644 --- a/packages/backend-common/src/reading/GerritUrlReader.ts +++ b/packages/backend-common/src/reading/GerritUrlReader.ts @@ -139,7 +139,7 @@ export class GerritUrlReader implements UrlReader { return Buffer.from(responseBody, 'base64'); }, stream: () => { - const readable = new Readable().wrap(response.body); + const readable = Readable.from(response.body); return readable.pipe(new Base64Decode()); }, };