From 6e99a5b616f2b30894dd26daaa13fceef5313340 Mon Sep 17 00:00:00 2001 From: Alexis Munsayac Date: Sat, 18 Nov 2023 20:33:10 +0800 Subject: [PATCH] Fix loop guard on streaming --- packages/seroval/src/core/context/parser/stream.ts | 5 ++++- packages/seroval/src/core/utils/iterator-to-sequence.ts | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/seroval/src/core/context/parser/stream.ts b/packages/seroval/src/core/context/parser/stream.ts index 862911b3..0866a0ce 100644 --- a/packages/seroval/src/core/context/parser/stream.ts +++ b/packages/seroval/src/core/context/parser/stream.ts @@ -130,7 +130,10 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont createAsyncIteratorFactoryInstanceNode( this.parseAsyncIteratorFactory(), this.parse( - asyncIteratorToReadableStream(properties as unknown as AsyncIterable), + asyncIteratorToReadableStream( + properties as unknown as AsyncIterable, + this, + ), ), ), ); diff --git a/packages/seroval/src/core/utils/iterator-to-sequence.ts b/packages/seroval/src/core/utils/iterator-to-sequence.ts index 26f7ce94..b22e6472 100644 --- a/packages/seroval/src/core/utils/iterator-to-sequence.ts +++ b/packages/seroval/src/core/utils/iterator-to-sequence.ts @@ -1,3 +1,5 @@ +import type BaseStreamParserContext from '../context/parser/stream'; + /* eslint-disable no-await-in-loop */ export interface Sequence { v: unknown[]; @@ -124,11 +126,12 @@ export function sequenceToAsyncIterator( export function asyncIteratorToReadableStream( source: AsyncIterable, + parser: BaseStreamParserContext, ): ReadableStream { return new ReadableStream({ async start(controller): Promise { const iterator = source[Symbol.asyncIterator](); - while (true) { + while (parser.isAlive()) { try { const result = await iterator.next(); controller.enqueue([result.done ? 2 : 0, result.value]); @@ -140,6 +143,7 @@ export function asyncIteratorToReadableStream( controller.enqueue([1, error]); } } + controller.close(); }, }); }