diff --git a/server/api/events.ts b/server/api/events.ts index 41a321d..372cb11 100644 --- a/server/api/events.ts +++ b/server/api/events.ts @@ -1,3 +1,4 @@ +import { pipeline } from "node:stream"; import { addStream, deleteStream } from "~/server/streams"; export default defineEventHandler(async (event) => { @@ -19,13 +20,11 @@ export default defineEventHandler(async (event) => { } }) addStream(stream.writable); - return new Response( - stream.readable, - { - headers: { - "Access-Control-Allow-Origin": "*", - "Content-Type": "text/event-stream", - } - } - ); + + // Workaround to properly handle stream errors. See https://github.com/unjs/h3/issues/986 + setHeader(event, "Access-Control-Allow-Origin", "*"); + setHeader(event, "Content-Type", "text/event-stream"); + event.node.res.write("data: connected\n\n"); // Produce a response immediately to avoid the reply waiting for content. + pipeline(stream.readable as unknown as NodeJS.ReadableStream, event.node.res, (err) => { /* ignore */ }); + event._handled = true; });