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 059dbff

Browse files
Add decodeStream
1 parent 0e3f706 commit 059dbff

File tree

3 files changed

+67
-4
lines changed

3 files changed

+67
-4
lines changed

‎src/Decoder.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,25 @@ export class Decoder {
140140
);
141141
}
142142

143+
async *decodeStream(stream: AsyncIterable<ArrayLike<number> | Uint8Array>) {
144+
for await (const buffer of stream) {
145+
this.appendBuffer(buffer);
146+
147+
try {
148+
while (true) {
149+
let result = this.decodeSync();
150+
151+
yield result;
152+
}
153+
} catch (e) {
154+
if (!(e instanceof DataViewIndexOutOfBoundsError)) {
155+
throw e; // rethrow
156+
}
157+
// fallthrough
158+
}
159+
}
160+
}
161+
143162
async *decodeArrayStream(stream: AsyncIterable<ArrayLike<number> | Uint8Array>) {
144163
let headerParsed = false;
145164
let decoded = false;

‎src/decodeAsync.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export async function decodeAsync(
1919
return decoder.decodeOneAsync(stream);
2020
}
2121

22-
export asyncfunction* decodeArrayStream(
22+
export function decodeArrayStream(
2323
stream: AsyncIterable<Uint8Array | ArrayLike<number>>,
2424
options: DecodeAsyncOptions = defaultDecodeOptions,
2525
) {
@@ -32,7 +32,21 @@ export async function* decodeArrayStream(
3232
options.maxExtLength,
3333
);
3434

35-
for await (let item of decoder.decodeArrayStream(stream)) {
36-
yield item;
37-
}
35+
return decoder.decodeArrayStream(stream);
36+
}
37+
38+
export function decodeStream(
39+
stream: AsyncIterable<Uint8Array | ArrayLike<number>>,
40+
options: DecodeAsyncOptions = defaultDecodeOptions,
41+
) {
42+
const decoder = new Decoder(
43+
options.extensionCodec,
44+
options.maxStrLength,
45+
options.maxBinLength,
46+
options.maxArrayLength,
47+
options.maxMapLength,
48+
options.maxExtLength,
49+
);
50+
51+
return decoder.decodeStream(stream);
3852
}

‎test/decodeStream.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import assert from "assert";
2+
import { encode } from "../src";
3+
import { decodeStream } from "../src/decodeAsync";
4+
5+
describe("decodeStream", () => {
6+
it("decodes stream", async () => {
7+
const items = [
8+
"foo",
9+
10,
10+
{
11+
name: "bar",
12+
},
13+
[1, 2, 3],
14+
];
15+
16+
const createStream = async function*() {
17+
for (let item of items) {
18+
yield encode(item);
19+
}
20+
};
21+
22+
const result = [];
23+
24+
for await (let item of decodeStream(createStream())) {
25+
result.push(item);
26+
}
27+
28+
assert.deepStrictEqual(result, items);
29+
});
30+
});

0 commit comments

Comments
(0)

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