type StreamIterator = AsyncIterator; type IteratorHandler = ( iterator: StreamIterator, value?: unknown, ) => IteratorResult | Promise>; export function createStreamIteratorWrapper(params: { iterator: StreamIterator; next: (iterator: StreamIterator) => Promise>; onReturn?: IteratorHandler; onThrow?: IteratorHandler; }): AsyncIterableIterator { const wrapper: AsyncIterableIterator = { async next() { return params.next(params.iterator); }, async return(value?: unknown) { return ( (await params.onReturn?.(params.iterator, value)) ?? (await params.iterator.return?.(value)) ?? { done: true as const, value: undefined } ); }, async throw(error?: unknown) { return ( (await params.onThrow?.(params.iterator, error)) ?? (await params.iterator.throw?.(error)) ?? { done: true as const, value: undefined } ); }, [Symbol.asyncIterator]() { return this; }, }; return wrapper; }