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 188d25b

Browse files
committed
support whatwg-stream.ReadableStream
1 parent 0972f1a commit 188d25b

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 によって変換されたページ (->オリジナル) /