Handle event streams being cancelled

h3 doesn't correctly handle unexpected stream closures, bypass h3 and
operate directly on the Node.js ServerResponse object to handle them.
This commit is contained in:
Hornwitser 2025-03-05 16:02:26 +01:00
parent 250ca9a1ac
commit d8a31db44d

View file

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