From 059dbff88fdcd61b494d7c03ae91e0b013610b96 Mon Sep 17 00:00:00 2001 From: Sergey Zenchenko Date: 2019年5月30日 15:54:13 +0300 Subject: [PATCH 1/3] Add decodeStream --- src/Decoder.ts | 19 +++++++++++++++++++ src/decodeAsync.ts | 22 ++++++++++++++++++---- test/decodeStream.test.ts | 30 ++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 test/decodeStream.test.ts diff --git a/src/Decoder.ts b/src/Decoder.ts index 49ce7174..9dd8a2a4 100644 --- a/src/Decoder.ts +++ b/src/Decoder.ts @@ -140,6 +140,25 @@ export class Decoder { ); } + async *decodeStream(stream: AsyncIterable | Uint8Array>) { + for await (const buffer of stream) { + this.appendBuffer(buffer); + + try { + while (true) { + let result = this.decodeSync(); + + yield result; + } + } catch (e) { + if (!(e instanceof DataViewIndexOutOfBoundsError)) { + throw e; // rethrow + } + // fallthrough + } + } + } + async *decodeArrayStream(stream: AsyncIterable | Uint8Array>) { let headerParsed = false; let decoded = false; diff --git a/src/decodeAsync.ts b/src/decodeAsync.ts index d4bea9ef..d72e516a 100644 --- a/src/decodeAsync.ts +++ b/src/decodeAsync.ts @@ -19,7 +19,7 @@ export async function decodeAsync( return decoder.decodeOneAsync(stream); } -export async function* decodeArrayStream( +export function decodeArrayStream( stream: AsyncIterable>, options: DecodeAsyncOptions = defaultDecodeOptions, ) { @@ -32,7 +32,21 @@ export async function* decodeArrayStream( options.maxExtLength, ); - for await (let item of decoder.decodeArrayStream(stream)) { - yield item; - } + return decoder.decodeArrayStream(stream); +} + +export function decodeStream( + stream: AsyncIterable>, + options: DecodeAsyncOptions = defaultDecodeOptions, +) { + const decoder = new Decoder( + options.extensionCodec, + options.maxStrLength, + options.maxBinLength, + options.maxArrayLength, + options.maxMapLength, + options.maxExtLength, + ); + + return decoder.decodeStream(stream); } diff --git a/test/decodeStream.test.ts b/test/decodeStream.test.ts new file mode 100644 index 00000000..79656335 --- /dev/null +++ b/test/decodeStream.test.ts @@ -0,0 +1,30 @@ +import assert from "assert"; +import { encode } from "../src"; +import { decodeStream } from "../src/decodeAsync"; + +describe("decodeStream", () => { + it("decodes stream", async () => { + const items = [ + "foo", + 10, + { + name: "bar", + }, + [1, 2, 3], + ]; + + const createStream = async function*() { + for (let item of items) { + yield encode(item); + } + }; + + const result = []; + + for await (let item of decodeStream(createStream())) { + result.push(item); + } + + assert.deepStrictEqual(result, items); + }); +}); From 5dd763c82621d83108c7c627d74f372e76f5896e Mon Sep 17 00:00:00 2001 From: Sergey Zenchenko Date: 2019年5月30日 16:09:20 +0300 Subject: [PATCH 2/3] Fix code review comments --- src/Decoder.ts | 4 ++-- test/decodeStream.test.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Decoder.ts b/src/Decoder.ts index 9dd8a2a4..d0c539d2 100644 --- a/src/Decoder.ts +++ b/src/Decoder.ts @@ -146,7 +146,7 @@ export class Decoder { try { while (true) { - let result = this.decodeSync(); + const result = this.decodeSync(); yield result; } @@ -179,7 +179,7 @@ export class Decoder { try { while (true) { - let result = this.decodeSync(); + const result = this.decodeSync(); yield result; diff --git a/test/decodeStream.test.ts b/test/decodeStream.test.ts index 79656335..de13f574 100644 --- a/test/decodeStream.test.ts +++ b/test/decodeStream.test.ts @@ -21,7 +21,7 @@ describe("decodeStream", () => { const result = []; - for await (let item of decodeStream(createStream())) { + for await (const item of decodeStream(createStream())) { result.push(item); } From 8af731c67ba935c6d9559f091e1db3be3a5a3319 Mon Sep 17 00:00:00 2001 From: Sergey Zenchenko Date: 2019年5月30日 16:12:43 +0300 Subject: [PATCH 3/3] Fix codereview --- test/decodeStream.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/decodeStream.test.ts b/test/decodeStream.test.ts index de13f574..41d1e4f2 100644 --- a/test/decodeStream.test.ts +++ b/test/decodeStream.test.ts @@ -14,7 +14,7 @@ describe("decodeStream", () => { ]; const createStream = async function*() { - for (let item of items) { + for (const item of items) { yield encode(item); } };

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