Cargando...
Conecta a endpoints Server-Sent Events y monitorea streams de eventos en tiempo real
const eventSource = new EventSource("https://stream.example.com/sse/crypto");
eventSource.onopen = () => {
console.log("SSE stream connection established");
};
eventSource.onmessage = (event) => {
console.log("Received generic event:", event.data);
};
eventSource.addEventListener("custom_event", (event) => {
console.log("Received custom event:", event.data);
});
eventSource.onerror = (error) => {
console.error("SSE connection error:", error);
eventSource.close();
};const response = await fetch("https://stream.example.com/sse/crypto", {
headers: { Accept: "text/event-stream" }
});
const reader = response.body.getReader();
const decoder = new TextDecoder("utf-8");
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value, { stream: true });
console.log("Received chunk:", chunk);
}// src/app/api/sse/route.ts
import { NextResponse } from 'next/server';
export async function GET() {
const encoder = new TextEncoder();
const customReadable = new ReadableStream({
async start(controller) {
controller.enqueue(encoder.encode('event: ping\ndata: {"status":"active"}\n\n'));
const interval = setInterval(() => {
controller.enqueue(
encoder.encode(`event: message\ndata: ${JSON.stringify({ time: Date.now() })}\n\n`)
);
}, 2000);
// Clean up after 30s
setTimeout(() => {
clearInterval(interval);
controller.close();
}, 30000);
}
});
return new NextResponse(customReadable, {
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache, no-transform',
'Connection': 'keep-alive',
},
});
}