Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /