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";
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;
});