import { Buffer } from "node:buffer"; /** Bounded newline frames, including a final frame without a newline. */ export async function* lines(reader: ReadableStreamDefaultReader) { const limit = 16 * 1024 * 1024; let buffered = ""; const decoder = new TextDecoder("utf-8"); while (true) { const { done, value } = await reader.read(); if (done) break; buffered += decoder.decode(value, { stream: true }); let newline: number; while ((newline = buffered.indexOf("\n")) >= 0) { const line = buffered.slice(0, newline); if (Buffer.byteLength(line) > limit) throw new Error("MCP frame exceeds 16 MiB"); buffered = buffered.slice(newline + 1); if (line.trim()) yield line; } if (Buffer.byteLength(buffered) > limit) throw new Error("MCP frame exceeds 16 MiB"); } buffered += decoder.decode(); if (buffered.trim()) yield buffered; }