UNPKG

web2api-server

Version:

server part of web2api service(1/2)

85 lines (78 loc) 2.4 kB
import { consola } from "consola/basic"; export function createManagedStream() { let streamController: ReadableStreamDefaultController<any> | undefined; // Declare variable in outer scope to capture controller const stream = new ReadableStream({ start(controller) { // Capture controller when stream is constructed streamController = controller; consola.verbose("Stream started."); }, cancel(reason) { // Optional: Called when consumer cancels the stream. // console.log(`Stream cancelled. Reason: ${reason}`) streamController = undefined; // Clean up reference }, }); // Encapsulate control logic to avoid directly exposing the controller const writer = { write: (chunk: any) => { if (!streamController) { consola.warn( "Writer: Stream controller not available or stream closed/errored." ); return; } try { consola.verbose("Writer: Enqueuing chunk:", chunk, typeof chunk); streamController.enqueue(chunk); } catch (error) { consola.error("Writer: Error enqueuing data:", error); } }, close: () => { if (!streamController) { consola.warn( "Writer: Stream controller not available or stream closed/errored." ); return; } try { consola.verbose("Writer: Closing the stream."); streamController.close(); streamController = undefined; } catch (error) { consola.error("Writer: Error closing stream:", error); } }, /** * try to close the stream, ignore the error * @returns */ tryClose: () => { if (!streamController) { return; } try { streamController.close(); streamController = undefined; } catch (error) {} }, error: (err: any) => { if (!streamController) { consola.warn( "Writer: Stream controller not available or stream closed/errored." ); return; } try { // Make the stream error consola.debug("Writer: Erroring the stream:", err); streamController.error(err); streamController = undefined; // Clean up reference } catch (error) { consola.error("Writer: Error while trying to error the stream:", error); } }, }; return { stream, writer }; }