From 0e0e3093121b50f6a2445cfeee16f943d5c90230 Mon Sep 17 00:00:00 2001 From: George Fu Date: Wed, 23 Oct 2024 16:34:10 +0000 Subject: [PATCH 1/2] fix: allow blobs in Node.js splitStream fn --- .changeset/rotten-fans-rest.md | 5 +++++ packages/util-stream/src/splitStream.spec.ts | 15 +++++++++++++++ packages/util-stream/src/splitStream.ts | 4 ++-- packages/util-stream/src/stream-type-check.ts | 7 +++++++ 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 .changeset/rotten-fans-rest.md diff --git a/.changeset/rotten-fans-rest.md b/.changeset/rotten-fans-rest.md new file mode 100644 index 00000000000..bf127d801b9 --- /dev/null +++ b/.changeset/rotten-fans-rest.md @@ -0,0 +1,5 @@ +--- +"@smithy/util-stream": patch +--- + +allow Blob in node.js splitStream diff --git a/packages/util-stream/src/splitStream.spec.ts b/packages/util-stream/src/splitStream.spec.ts index 2c1ecf90d0f..bcb45ae19cc 100644 --- a/packages/util-stream/src/splitStream.spec.ts +++ b/packages/util-stream/src/splitStream.spec.ts @@ -36,6 +36,21 @@ describe(splitStream.name, () => { const bytes1 = await webStreamCollector(a); const bytes2 = await webStreamCollector(b); + expect(bytes1).toEqual(new Uint8Array([97, 98, 99, 100])); + expect(bytes1).toEqual(bytes2); + } + }); + it("should split a web:Blob", async () => { + if (typeof Blob !== "undefined") { + const inputChunks = [97, 98, 99, 100]; + + const myBlob = new Blob([new Uint8Array(inputChunks)]) + + const [a, b] = await splitWebStream(myBlob); + + const bytes1 = await webStreamCollector(a); + const bytes2 = await webStreamCollector(b); + expect(bytes1).toEqual(new Uint8Array([97, 98, 99, 100])); expect(bytes1).toEqual(bytes2); } diff --git a/packages/util-stream/src/splitStream.ts b/packages/util-stream/src/splitStream.ts index c9ff165181e..a20ae285e20 100644 --- a/packages/util-stream/src/splitStream.ts +++ b/packages/util-stream/src/splitStream.ts @@ -2,7 +2,7 @@ import type { Readable } from "stream"; import { PassThrough } from "stream"; import { splitStream as splitWebStream } from "./splitStream.browser"; -import { isReadableStream } from "./stream-type-check"; +import { isBlob, isReadableStream } from "./stream-type-check"; /** * @param stream @@ -13,7 +13,7 @@ export async function splitStream(stream: ReadableStream): Promise<[ReadableStre export async function splitStream( stream: Readable | ReadableStream ): Promise<[Readable | ReadableStream, Readable | ReadableStream]> { - if (isReadableStream(stream)) { + if (isReadableStream(stream) || isBlob(stream)) { return splitWebStream(stream); } const stream1 = new PassThrough(); diff --git a/packages/util-stream/src/stream-type-check.ts b/packages/util-stream/src/stream-type-check.ts index 4bc26837c33..57c2b14ec50 100644 --- a/packages/util-stream/src/stream-type-check.ts +++ b/packages/util-stream/src/stream-type-check.ts @@ -12,3 +12,10 @@ type ReadableStreamType = ReadableStream; export const isReadableStream = (stream: unknown): stream is ReadableStreamType => typeof ReadableStream === "function" && (stream?.constructor?.name === ReadableStream.name || stream instanceof ReadableStream); + +/** + * @internal + */ +export const isBlob = (blob: unknown): blob is Blob => { + return typeof Blob === "function" && (blob?.constructor?.name === Blob.name || blob instanceof Blob); +}; From 1dfa660101d775c032682b8aff4bc4247ef01830 Mon Sep 17 00:00:00 2001 From: George Fu Date: Wed, 23 Oct 2024 18:05:35 +0000 Subject: [PATCH 2/2] linting --- packages/util-stream/src/splitStream.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/util-stream/src/splitStream.spec.ts b/packages/util-stream/src/splitStream.spec.ts index bcb45ae19cc..d5e3d7b7e8e 100644 --- a/packages/util-stream/src/splitStream.spec.ts +++ b/packages/util-stream/src/splitStream.spec.ts @@ -44,7 +44,7 @@ describe(splitStream.name, () => { if (typeof Blob !== "undefined") { const inputChunks = [97, 98, 99, 100]; - const myBlob = new Blob([new Uint8Array(inputChunks)]) + const myBlob = new Blob([new Uint8Array(inputChunks)]); const [a, b] = await splitWebStream(myBlob);