Fix SSE routing: exclude text/event-stream requests from API rewrite

afterFiles ordering was insufficient in Next.js 14 — the catch-all
/api/v1/* rewrite still intercepted SSE requests before route handlers.

Fix: add a `missing` condition on `Accept: text/event-stream` to the
rewrite rule. EventSource always sends this header, so SSE requests now
skip the rewrite entirely and are handled by the existing route handlers
(app/api/v1/ppt/outlines/stream, presentation/stream, jobs/stream).
Normal JSON API requests are unaffected.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Vadym Samoilenko 2026-03-01 21:27:38 +00:00
parent 65da74ab13
commit 6ea431bc75

View file

@ -7,29 +7,29 @@ const nextConfig = {
// Proxy API and static asset requests to FastAPI backend. // Proxy API and static asset requests to FastAPI backend.
// afterFiles: Next.js checks route handlers first; only falls through to //
// these rewrites if no matching app/api/ route handler exists. // The /api/v1/* rewrite uses a `missing` condition on the Accept header so
// This ensures SSE route handlers (outlines/stream, presentation/stream, etc.) // it does NOT match SSE requests (EventSource always sends Accept: text/event-stream).
// are served directly without being intercepted by the catch-all /api/v1/* rewrite. // SSE paths have explicit route handlers in app/api/v1/*/stream/[id]/route.ts
// that stream events properly. Normal JSON requests go through the rewrite as before.
async rewrites() { async rewrites() {
return { return [
beforeFiles: [], {
afterFiles: [ source: '/api/v1/:path*',
{ missing: [
source: '/api/v1/:path*', { type: 'header', key: 'accept', value: 'text/event-stream' },
destination: `${API_URL}/api/v1/:path*`, ],
}, destination: `${API_URL}/api/v1/:path*`,
{ },
source: '/app_data/:path*', {
destination: `${API_URL}/app_data/:path*`, source: '/app_data/:path*',
}, destination: `${API_URL}/app_data/:path*`,
{ },
source: '/static/:path*', {
destination: `${API_URL}/static/:path*`, source: '/static/:path*',
}, destination: `${API_URL}/static/:path*`,
], },
fallback: [], ];
};
}, },
images: { images: {