import { randomBytes } from "node:crypto"; import { NextResponse, type NextRequest } from "next/server"; export function proxy(request: NextRequest) { const nonce = randomBytes(16).toString("base64"); const development = process.env.NODE_ENV === "development"; const csp = [ "default-src 'self'", "base-uri 'none'", "object-src 'none'", `script-src 'self' 'nonce-${nonce}' 'strict-dynamic'${development ? " 'unsafe-eval'" : ""}`, `style-src 'self' 'nonce-${nonce}'`, // Radix positioning and chat layout use React style attributes, not executable scripts. "style-src-attr 'unsafe-inline'", "font-src 'self' data:", "img-src 'self' data: blob:", `connect-src 'self'${development ? " ws: wss:" : ""}`, "form-action 'self'", "frame-ancestors 'none'", ].join("; "); const headers = new Headers(request.headers); headers.set("Content-Security-Policy", csp); const response = NextResponse.next({ request: { headers } }); response.headers.set("Content-Security-Policy", csp); response.headers.set("Cache-Control", "private, no-store"); return response; } export const config = { matcher: ["/((?!api(?:/|$)|_next/|favicon.ico).*)"] };