hts/packages/isdk/streams/streaming-text-response.ts

52 lines
1.2 KiB
TypeScript

import type { ServerResponse } from 'node:http';
import { StreamData } from './stream-data';
/**
* A utility class for streaming text responses.
*/
export class StreamingTextResponse extends Response {
constructor(res: ReadableStream, init?: ResponseInit, data?: StreamData) {
let processedStream = res;
if (data) {
processedStream = res.pipeThrough(data.stream);
}
super(processedStream as any, {
...init,
status: 200,
headers: {
'Content-Type': 'text/plain; charset=utf-8',
...init?.headers,
},
});
}
}
/**
* A utility function to stream a ReadableStream to a Node.js response-like object.
*/
export function streamToResponse(
res: ReadableStream,
response: ServerResponse,
init?: { headers?: Record<string, string>; status?: number },
) {
response.writeHead(init?.status || 200, {
'Content-Type': 'text/plain; charset=utf-8',
...init?.headers,
});
const reader = res.getReader();
function read() {
reader.read().then(({ done, value }: { done: boolean; value?: any }) => {
if (done) {
response.end();
return;
}
response.write(value);
read();
});
}
read();
}