UNPKG

@copilotkit/runtime

Version:

<div align="center"> <a href="https://copilotkit.ai" target="_blank"> <img src="https://github.com/copilotkit/copilotkit/raw/main/assets/banner.png" alt="CopilotKit Logo"> </a>

60 lines (49 loc) 1.26 kB
import { ReplaySubject } from "rxjs"; export async function writeJsonLineResponseToEventStream<T>( response: ReadableStream<Uint8Array>, eventStream$: ReplaySubject<T>, ) { const reader = response.getReader(); const decoder = new TextDecoder(); let buffer = []; function flushBuffer() { const currentBuffer = buffer.join(""); if (currentBuffer.trim().length === 0) { return; } const parts = currentBuffer.split("\n"); if (parts.length === 0) { return; } const lastPartIsComplete = currentBuffer.endsWith("\n"); // truncate buffer buffer = []; if (!lastPartIsComplete) { // put back the last part buffer.push(parts.pop()); } parts .map((part) => part.trim()) .filter((part) => part != "") .forEach((part) => { eventStream$.next(JSON.parse(part)); }); } try { while (true) { const { done, value } = await reader.read(); if (!done) { buffer.push(decoder.decode(value, { stream: true })); } flushBuffer(); if (done) { break; } } } catch (error) { console.error("Error in stream", error); eventStream$.error(error); return; } eventStream$.complete(); }