Skip to content

Commit 2073c8c

Browse files
committed
DRY isReadableStream typeguard
1 parent 6010af3 commit 2073c8c

File tree

5 files changed

+21
-10
lines changed

5 files changed

+21
-10
lines changed

.changeset/metal-snakes-remember.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
"@smithy/util-stream": minor
33
---
44

5-
add stream splitting to sdkStreamMixin
5+
add splitStream and headStream utilities

packages/util-stream/src/headStream.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Readable, Writable } from "stream";
22

33
import { headStream as headWebStream } from "./headStream.browser";
4+
import { isReadableStreamInstance } from "./isReadableStream";
45

56
/**
67
* @internal
@@ -11,7 +12,6 @@ import { headStream as headWebStream } from "./headStream.browser";
1112
*/
1213
export const headStream = (stream: Readable | ReadableStream, bytes: number): Promise<Uint8Array> => {
1314
if (isReadableStreamInstance(stream)) {
14-
// Web stream API in Node.js
1515
return headWebStream(stream, bytes);
1616
}
1717
return new Promise((resolve, reject) => {
@@ -47,6 +47,3 @@ class Collector extends Writable {
4747
callback();
4848
}
4949
}
50-
51-
const isReadableStreamInstance = (stream: unknown): stream is ReadableStream =>
52-
typeof ReadableStream === "function" && stream instanceof ReadableStream;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/**
2+
* @internal
3+
*/
4+
export const isReadableStreamInstance = (stream: unknown): stream is ReadableStream =>
5+
typeof ReadableStream === "function" && stream?.constructor?.name === ReadableStream.name;

packages/util-stream/src/sdk-stream-mixin.browser.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { toBase64 } from "@smithy/util-base64";
44
import { toHex } from "@smithy/util-hex-encoding";
55
import { toUtf8 } from "@smithy/util-utf8";
66

7+
import { isReadableStreamInstance } from "./isReadableStream";
8+
79
const ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED = "The stream has already been transformed.";
810

911
/**
@@ -74,6 +76,3 @@ export const sdkStreamMixin = (stream: unknown): SdkStream<ReadableStream | Blob
7476
};
7577

7678
const isBlobInstance = (stream: unknown): stream is Blob => typeof Blob === "function" && stream instanceof Blob;
77-
78-
const isReadableStreamInstance = (stream: unknown): stream is ReadableStream =>
79-
typeof ReadableStream === "function" && stream instanceof ReadableStream;

packages/util-stream/src/splitStream.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
1-
import type { Readable as IReadable } from "stream";
1+
import type { Readable } from "stream";
22
import { PassThrough } from "stream";
33

4+
import { isReadableStreamInstance } from "./isReadableStream";
5+
import { splitStream as splitWebStream } from "./splitStream.browser";
6+
47
/**
58
* @param stream
69
* @returns stream split into two identical streams.
710
*/
8-
export async function splitStream(stream: IReadable): Promise<[IReadable, IReadable]> {
11+
export async function splitStream(stream: Readable): Promise<[Readable, Readable]>;
12+
export async function splitStream(stream: ReadableStream): Promise<[ReadableStream, ReadableStream]>;
13+
export async function splitStream(
14+
stream: Readable | ReadableStream
15+
): Promise<[Readable | ReadableStream, Readable | ReadableStream]> {
16+
if (isReadableStreamInstance(stream)) {
17+
return splitWebStream(stream);
18+
}
919
const stream1 = new PassThrough();
1020
const stream2 = new PassThrough();
1121
stream.pipe(stream1);

0 commit comments

Comments
 (0)