Skip to content

Commit ec1a37a

Browse files
committed
support whatwg-stream.ReadableStream
1 parent 0e3f706 commit ec1a37a

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

src/utils/stream.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// utility for whatwg streams
2+
3+
export function isReadableStream<T>(object: unknown): object is ReadableStream<T> {
4+
return typeof ReadableStream !== "object" && object instanceof ReadableStream;
5+
}
6+
7+
export async function* asyncIterableFromStream<T>(stream: ReadableStream<T>): AsyncIterable<T> {
8+
const reader = stream.getReader();
9+
10+
try {
11+
while (true) {
12+
const { done, value } = await reader.read();
13+
if (done) {
14+
return;
15+
}
16+
yield value;
17+
}
18+
} finally {
19+
reader.releaseLock();
20+
}
21+
}

test/readme.test.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { deepStrictEqual } from "assert";
2-
import { encode, decode } from "../src";
2+
import { encode, decode, decodeAsync } from "@msgpack/msgpack";
3+
import { asyncIterableFromStream } from "../src/utils/stream";
34

45
describe("README", () => {
5-
context("#synopsis", () => {
6+
context("## Synopsis", () => {
67
it("runs", () => {
78
const object = {
89
nil: null,
@@ -21,4 +22,27 @@ describe("README", () => {
2122
deepStrictEqual(decode(encoded), object);
2223
});
2324
});
25+
26+
context("## ReadableStream", () => {
27+
before(function() {
28+
if (typeof ReadableStream === "undefined") {
29+
this.skip();
30+
}
31+
});
32+
33+
it("reads from stream", async () => {
34+
const data = [1, 2, 3];
35+
const encoded = encode(data);
36+
const stream = new ReadableStream({
37+
start(controller) {
38+
for (const byte of encoded) {
39+
controller.enqueue([byte]);
40+
}
41+
controller.close();
42+
},
43+
});
44+
45+
deepStrictEqual(await decodeAsync(asyncIterableFromStream(stream)), data);
46+
});
47+
});
2448
});

0 commit comments

Comments
 (0)