Q62: How do you implement Server-Sent Events (SSE) streaming inside App Router Route Handlers?
Server-Sent Events (SSE) maintain an open HTTP connection to stream real-time text/event updates to client browsers. Implemented in Route Handlers using TransformStream or ReadableStream instances with headers: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }.
Real-time SSE Route Handler Stream
// app/api/sse/route.js
export async function GET() {
const encoder = new TextEncoder();
const stream = new ReadableStream({
async start(controller) {
for (let i = 0; i < 5; i++) {
controller.enqueue(encoder.encode(`data: ${JSON.stringify({ time: new Date() })}\n\n`));
await new Promise(r => setTimeout(r, 1000));
}
controller.close();
}
});
return new Response(stream, {
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
}
});
}💡 Enqueuing encoded event lines over an open ReadableStream pushes real-time event updates to client EventSource listeners.
Key Takeaways
- Uses
ReadableStreampipelines inside Route Handlers. - Requires explicit
text/event-streamresponse headers.
Knowledge Check
Which response header is mandatory when returning a ReadableStream from an SSE Route Handler?