import { AnthropicError } from "../../error.js"; import { ReadableStreamToAsyncIterable } from "../stream-utils.js"; import { type Response } from "../../_shims/index.js"; import { LineDecoder, type Bytes } from "./line.js"; export class JSONLDecoder { controller: AbortController; constructor( private iterator: AsyncIterableIterator, controller: AbortController, ) { this.controller = controller; } private async *decoder(): AsyncIterator { const lineDecoder = new LineDecoder(); for await (const chunk of this.iterator) { for (const line of lineDecoder.decode(chunk)) { yield JSON.parse(line); } } for (const line of lineDecoder.flush()) { yield JSON.parse(line); } } [Symbol.asyncIterator](): AsyncIterator { return this.decoder(); } static fromResponse(response: Response, controller: AbortController): JSONLDecoder { if (!response.body) { controller.abort(); throw new AnthropicError(`Attempted to iterate over a response with no body`); } return new JSONLDecoder(ReadableStreamToAsyncIterable(response.body), controller); } }